summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/xe/xe_ggtt.c25
-rw-r--r--drivers/gpu/drm/xe/xe_ggtt_types.h3
2 files changed, 24 insertions, 4 deletions
diff --git a/drivers/gpu/drm/xe/xe_ggtt.c b/drivers/gpu/drm/xe/xe_ggtt.c
index b1b9fc57a5db..e9273b5d2a9f 100644
--- a/drivers/gpu/drm/xe/xe_ggtt.c
+++ b/drivers/gpu/drm/xe/xe_ggtt.c
@@ -108,6 +108,9 @@ int xe_ggtt_init_noalloc(struct xe_gt *gt, struct xe_ggtt *ggtt)
ggtt->gsm = gt->mmio.regs + SZ_8M;
ggtt->size = (gsm_size / 8) * (u64)GEN8_PAGE_SIZE;
+ if (IS_DGFX(xe) && xe->info.vram_flags & XE_VRAM_FLAGS_NEED64K)
+ ggtt->flags |= XE_GGTT_FLAGS_64K;
+
/*
* 8B per entry, each points to a 4KB page.
*
@@ -256,7 +259,8 @@ void xe_ggtt_map_bo(struct xe_ggtt *ggtt, struct xe_bo *bo)
xe_ggtt_invalidate(ggtt->gt);
}
-static int __xe_ggtt_insert_bo_at(struct xe_ggtt *ggtt, struct xe_bo *bo, u64 start, u64 end)
+static int __xe_ggtt_insert_bo_at(struct xe_ggtt *ggtt, struct xe_bo *bo,
+ u64 start, u64 end, u64 alignment)
{
int err;
@@ -271,7 +275,8 @@ static int __xe_ggtt_insert_bo_at(struct xe_ggtt *ggtt, struct xe_bo *bo, u64 st
return err;
mutex_lock(&ggtt->lock);
- err = drm_mm_insert_node_in_range(&ggtt->mm, &bo->ggtt_node, bo->size, 0, 0, start, end, 0);
+ err = drm_mm_insert_node_in_range(&ggtt->mm, &bo->ggtt_node, bo->size,
+ alignment, 0, start, end, 0);
if (!err)
xe_ggtt_map_bo(ggtt, bo);
mutex_unlock(&ggtt->lock);
@@ -281,12 +286,24 @@ static int __xe_ggtt_insert_bo_at(struct xe_ggtt *ggtt, struct xe_bo *bo, u64 st
int xe_ggtt_insert_bo_at(struct xe_ggtt *ggtt, struct xe_bo *bo, u64 ofs)
{
- return __xe_ggtt_insert_bo_at(ggtt, bo, ofs, ofs + bo->size);
+ if (xe_bo_is_vram(bo) && ggtt->flags & XE_GGTT_FLAGS_64K) {
+ if (XE_WARN_ON(!IS_ALIGNED(ofs, SZ_64K)) ||
+ XE_WARN_ON(!IS_ALIGNED(bo->size, SZ_64K)))
+ return -EINVAL;
+ }
+
+ return __xe_ggtt_insert_bo_at(ggtt, bo, ofs, ofs + bo->size, 0);
}
int xe_ggtt_insert_bo(struct xe_ggtt *ggtt, struct xe_bo *bo)
{
- return __xe_ggtt_insert_bo_at(ggtt, bo, 0, U64_MAX);
+ u64 alignment;
+
+ alignment = GEN8_PAGE_SIZE;
+ if (xe_bo_is_vram(bo) && ggtt->flags & XE_GGTT_FLAGS_64K)
+ alignment = SZ_64K;
+
+ return __xe_ggtt_insert_bo_at(ggtt, bo, 0, U64_MAX, alignment);
}
void xe_ggtt_remove_node(struct xe_ggtt *ggtt, struct drm_mm_node *node)
diff --git a/drivers/gpu/drm/xe/xe_ggtt_types.h b/drivers/gpu/drm/xe/xe_ggtt_types.h
index e04193001763..ea70aaef4b31 100644
--- a/drivers/gpu/drm/xe/xe_ggtt_types.h
+++ b/drivers/gpu/drm/xe/xe_ggtt_types.h
@@ -16,6 +16,9 @@ struct xe_ggtt {
u64 size;
+#define XE_GGTT_FLAGS_64K BIT(0)
+ unsigned int flags;
+
struct xe_bo *scratch;
struct mutex lock;