Skip to content
Snippets Groups Projects
Commit b0228a33 authored by Juha-Pekka Heikkilä's avatar Juha-Pekka Heikkilä Committed by Mika Kahola
Browse files

drm/xe/display: align framebuffers according to hw requirements


Align framebuffers in memory according to hw requirements instead of
default page size alignment.

Signed-off-by: default avatarJuha-Pekka Heikkila <juhapekka.heikkila@gmail.com>
Reviewed-by: default avatarJonathan Cavitt <jonathan.cavitt@intel.com>
Signed-off-by: default avatarMika Kahola <mika.kahola@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20241009151947.2240099-3-juhapekka.heikkila@gmail.com
parent 3ad86ae1
No related branches found
No related tags found
No related merge requests found
...@@ -79,7 +79,8 @@ write_dpt_remapped(struct xe_bo *bo, struct iosys_map *map, u32 *dpt_ofs, ...@@ -79,7 +79,8 @@ write_dpt_remapped(struct xe_bo *bo, struct iosys_map *map, u32 *dpt_ofs,
static int __xe_pin_fb_vma_dpt(const struct intel_framebuffer *fb, static int __xe_pin_fb_vma_dpt(const struct intel_framebuffer *fb,
const struct i915_gtt_view *view, const struct i915_gtt_view *view,
struct i915_vma *vma) struct i915_vma *vma,
u64 physical_alignment)
{ {
struct xe_device *xe = to_xe_device(fb->base.dev); struct xe_device *xe = to_xe_device(fb->base.dev);
struct xe_tile *tile0 = xe_device_get_root_tile(xe); struct xe_tile *tile0 = xe_device_get_root_tile(xe);
...@@ -98,23 +99,29 @@ static int __xe_pin_fb_vma_dpt(const struct intel_framebuffer *fb, ...@@ -98,23 +99,29 @@ static int __xe_pin_fb_vma_dpt(const struct intel_framebuffer *fb,
XE_PAGE_SIZE); XE_PAGE_SIZE);
if (IS_DGFX(xe)) if (IS_DGFX(xe))
dpt = xe_bo_create_pin_map(xe, tile0, NULL, dpt_size, dpt = xe_bo_create_pin_map_at_aligned(xe, tile0, NULL,
ttm_bo_type_kernel, dpt_size, ~0ull,
XE_BO_FLAG_VRAM0 | ttm_bo_type_kernel,
XE_BO_FLAG_GGTT | XE_BO_FLAG_VRAM0 |
XE_BO_FLAG_PAGETABLE); XE_BO_FLAG_GGTT |
XE_BO_FLAG_PAGETABLE,
physical_alignment);
else else
dpt = xe_bo_create_pin_map(xe, tile0, NULL, dpt_size, dpt = xe_bo_create_pin_map_at_aligned(xe, tile0, NULL,
ttm_bo_type_kernel, dpt_size, ~0ull,
XE_BO_FLAG_STOLEN | ttm_bo_type_kernel,
XE_BO_FLAG_GGTT | XE_BO_FLAG_STOLEN |
XE_BO_FLAG_PAGETABLE); XE_BO_FLAG_GGTT |
XE_BO_FLAG_PAGETABLE,
physical_alignment);
if (IS_ERR(dpt)) if (IS_ERR(dpt))
dpt = xe_bo_create_pin_map(xe, tile0, NULL, dpt_size, dpt = xe_bo_create_pin_map_at_aligned(xe, tile0, NULL,
ttm_bo_type_kernel, dpt_size, ~0ull,
XE_BO_FLAG_SYSTEM | ttm_bo_type_kernel,
XE_BO_FLAG_GGTT | XE_BO_FLAG_SYSTEM |
XE_BO_FLAG_PAGETABLE); XE_BO_FLAG_GGTT |
XE_BO_FLAG_PAGETABLE,
physical_alignment);
if (IS_ERR(dpt)) if (IS_ERR(dpt))
return PTR_ERR(dpt); return PTR_ERR(dpt);
...@@ -183,7 +190,8 @@ write_ggtt_rotated(struct xe_bo *bo, struct xe_ggtt *ggtt, u32 *ggtt_ofs, u32 bo ...@@ -183,7 +190,8 @@ write_ggtt_rotated(struct xe_bo *bo, struct xe_ggtt *ggtt, u32 *ggtt_ofs, u32 bo
static int __xe_pin_fb_vma_ggtt(const struct intel_framebuffer *fb, static int __xe_pin_fb_vma_ggtt(const struct intel_framebuffer *fb,
const struct i915_gtt_view *view, const struct i915_gtt_view *view,
struct i915_vma *vma) struct i915_vma *vma,
u64 physical_alignment)
{ {
struct xe_bo *bo = intel_fb_obj(&fb->base); struct xe_bo *bo = intel_fb_obj(&fb->base);
struct xe_device *xe = to_xe_device(fb->base.dev); struct xe_device *xe = to_xe_device(fb->base.dev);
...@@ -264,7 +272,8 @@ out: ...@@ -264,7 +272,8 @@ out:
} }
static struct i915_vma *__xe_pin_fb_vma(const struct intel_framebuffer *fb, static struct i915_vma *__xe_pin_fb_vma(const struct intel_framebuffer *fb,
const struct i915_gtt_view *view) const struct i915_gtt_view *view,
u64 physical_alignment)
{ {
struct drm_device *dev = fb->base.dev; struct drm_device *dev = fb->base.dev;
struct xe_device *xe = to_xe_device(dev); struct xe_device *xe = to_xe_device(dev);
...@@ -312,9 +321,9 @@ static struct i915_vma *__xe_pin_fb_vma(const struct intel_framebuffer *fb, ...@@ -312,9 +321,9 @@ static struct i915_vma *__xe_pin_fb_vma(const struct intel_framebuffer *fb,
vma->bo = bo; vma->bo = bo;
if (intel_fb_uses_dpt(&fb->base)) if (intel_fb_uses_dpt(&fb->base))
ret = __xe_pin_fb_vma_dpt(fb, view, vma); ret = __xe_pin_fb_vma_dpt(fb, view, vma, physical_alignment);
else else
ret = __xe_pin_fb_vma_ggtt(fb, view, vma); ret = __xe_pin_fb_vma_ggtt(fb, view, vma, physical_alignment);
if (ret) if (ret)
goto err_unpin; goto err_unpin;
...@@ -355,7 +364,7 @@ intel_fb_pin_to_ggtt(const struct drm_framebuffer *fb, ...@@ -355,7 +364,7 @@ intel_fb_pin_to_ggtt(const struct drm_framebuffer *fb,
{ {
*out_flags = 0; *out_flags = 0;
return __xe_pin_fb_vma(to_intel_framebuffer(fb), view); return __xe_pin_fb_vma(to_intel_framebuffer(fb), view, phys_alignment);
} }
void intel_fb_unpin_vma(struct i915_vma *vma, unsigned long flags) void intel_fb_unpin_vma(struct i915_vma *vma, unsigned long flags)
...@@ -368,11 +377,15 @@ int intel_plane_pin_fb(struct intel_plane_state *plane_state) ...@@ -368,11 +377,15 @@ int intel_plane_pin_fb(struct intel_plane_state *plane_state)
struct drm_framebuffer *fb = plane_state->hw.fb; struct drm_framebuffer *fb = plane_state->hw.fb;
struct xe_bo *bo = intel_fb_obj(fb); struct xe_bo *bo = intel_fb_obj(fb);
struct i915_vma *vma; struct i915_vma *vma;
struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb);
struct intel_plane *plane = to_intel_plane(plane_state->uapi.plane);
u64 phys_alignment = plane->min_alignment(plane, fb, 0);
/* We reject creating !SCANOUT fb's, so this is weird.. */ /* We reject creating !SCANOUT fb's, so this is weird.. */
drm_WARN_ON(bo->ttm.base.dev, !(bo->flags & XE_BO_FLAG_SCANOUT)); drm_WARN_ON(bo->ttm.base.dev, !(bo->flags & XE_BO_FLAG_SCANOUT));
vma = __xe_pin_fb_vma(to_intel_framebuffer(fb), &plane_state->view.gtt); vma = __xe_pin_fb_vma(intel_fb, &plane_state->view.gtt, phys_alignment);
if (IS_ERR(vma)) if (IS_ERR(vma))
return PTR_ERR(vma); return PTR_ERR(vma);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment