diff options
author | Maarten Lankhorst <maarten.lankhorst@linux.intel.com> | 2023-01-24 18:28:03 +0100 |
---|---|---|
committer | Rodrigo Vivi <rodrigo.vivi@intel.com> | 2023-12-19 18:27:44 -0500 |
commit | 9b6483af3709386fe0e544bfa8cc01f8a92e0d57 (patch) | |
tree | 0a81c24565301650753253c9d0ff6babe7bc1349 /drivers | |
parent | 09a68b4a76e3d870d2fad34099d27cc7e2c9939b (diff) |
drm/xe: Map initial FB at the same place in GGTT too
I saw a flicker when booting xe, and it's very likely that the original
FB was not mapped at the same place when inheriting, fix it.
Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Reviewed-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/gpu/drm/xe/xe_bo.c | 7 | ||||
-rw-r--r-- | drivers/gpu/drm/xe/xe_ggtt.c | 16 | ||||
-rw-r--r-- | drivers/gpu/drm/xe/xe_ggtt.h | 1 |
3 files changed, 20 insertions, 4 deletions
diff --git a/drivers/gpu/drm/xe/xe_bo.c b/drivers/gpu/drm/xe/xe_bo.c index f07d1cd63fdd..1fcde1e93301 100644 --- a/drivers/gpu/drm/xe/xe_bo.c +++ b/drivers/gpu/drm/xe/xe_bo.c @@ -1110,7 +1110,12 @@ xe_bo_create_locked_range(struct xe_device *xe, XE_BUG_ON(!gt); - err = xe_ggtt_insert_bo(gt->mem.ggtt, bo); + if (flags & XE_BO_CREATE_STOLEN_BIT && + flags & XE_BO_FIXED_PLACEMENT_BIT) { + err = xe_ggtt_insert_bo_at(gt->mem.ggtt, bo, start); + } else { + err = xe_ggtt_insert_bo(gt->mem.ggtt, bo); + } if (err) goto err_unlock_put_bo; } diff --git a/drivers/gpu/drm/xe/xe_ggtt.c b/drivers/gpu/drm/xe/xe_ggtt.c index 0018c8441747..b1b9fc57a5db 100644 --- a/drivers/gpu/drm/xe/xe_ggtt.c +++ b/drivers/gpu/drm/xe/xe_ggtt.c @@ -256,7 +256,7 @@ void xe_ggtt_map_bo(struct xe_ggtt *ggtt, struct xe_bo *bo) xe_ggtt_invalidate(ggtt->gt); } -int xe_ggtt_insert_bo(struct xe_ggtt *ggtt, struct xe_bo *bo) +static int __xe_ggtt_insert_bo_at(struct xe_ggtt *ggtt, struct xe_bo *bo, u64 start, u64 end) { int err; @@ -271,12 +271,22 @@ int xe_ggtt_insert_bo(struct xe_ggtt *ggtt, struct xe_bo *bo) return err; mutex_lock(&ggtt->lock); - err = drm_mm_insert_node(&ggtt->mm, &bo->ggtt_node, bo->size); + err = drm_mm_insert_node_in_range(&ggtt->mm, &bo->ggtt_node, bo->size, 0, 0, start, end, 0); if (!err) xe_ggtt_map_bo(ggtt, bo); mutex_unlock(&ggtt->lock); - return 0; + return err; +} + +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); +} + +int xe_ggtt_insert_bo(struct xe_ggtt *ggtt, struct xe_bo *bo) +{ + return __xe_ggtt_insert_bo_at(ggtt, bo, 0, U64_MAX); } void xe_ggtt_remove_node(struct xe_ggtt *ggtt, struct drm_mm_node *node) diff --git a/drivers/gpu/drm/xe/xe_ggtt.h b/drivers/gpu/drm/xe/xe_ggtt.h index 289c6852ad1a..ab9cfdab5cca 100644 --- a/drivers/gpu/drm/xe/xe_ggtt.h +++ b/drivers/gpu/drm/xe/xe_ggtt.h @@ -23,6 +23,7 @@ int xe_ggtt_insert_special_node_locked(struct xe_ggtt *ggtt, void xe_ggtt_remove_node(struct xe_ggtt *ggtt, struct drm_mm_node *node); void xe_ggtt_map_bo(struct xe_ggtt *ggtt, struct xe_bo *bo); int xe_ggtt_insert_bo(struct xe_ggtt *ggtt, struct xe_bo *bo); +int xe_ggtt_insert_bo_at(struct xe_ggtt *ggtt, struct xe_bo *bo, u64 ofs); void xe_ggtt_remove_bo(struct xe_ggtt *ggtt, struct xe_bo *bo); #endif |