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: Juha-Pekka Heikkila <juhapekka.heikkila@gmail.com> Reviewed-by: Jonathan Cavitt <jonathan.cavitt@intel.com> Signed-off-by: Mika Kahola <mika.kahola@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20241009151947.2240099-3-juhapekka.heikkila@gmail.com
This commit is contained in:
committed by
Mika Kahola
parent
3ad86ae1da
commit
b0228a337d
@@ -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,
|
||||
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_tile *tile0 = xe_device_get_root_tile(xe);
|
||||
@@ -98,23 +99,29 @@ static int __xe_pin_fb_vma_dpt(const struct intel_framebuffer *fb,
|
||||
XE_PAGE_SIZE);
|
||||
|
||||
if (IS_DGFX(xe))
|
||||
dpt = xe_bo_create_pin_map(xe, tile0, NULL, dpt_size,
|
||||
ttm_bo_type_kernel,
|
||||
XE_BO_FLAG_VRAM0 |
|
||||
XE_BO_FLAG_GGTT |
|
||||
XE_BO_FLAG_PAGETABLE);
|
||||
dpt = xe_bo_create_pin_map_at_aligned(xe, tile0, NULL,
|
||||
dpt_size, ~0ull,
|
||||
ttm_bo_type_kernel,
|
||||
XE_BO_FLAG_VRAM0 |
|
||||
XE_BO_FLAG_GGTT |
|
||||
XE_BO_FLAG_PAGETABLE,
|
||||
physical_alignment);
|
||||
else
|
||||
dpt = xe_bo_create_pin_map(xe, tile0, NULL, dpt_size,
|
||||
ttm_bo_type_kernel,
|
||||
XE_BO_FLAG_STOLEN |
|
||||
XE_BO_FLAG_GGTT |
|
||||
XE_BO_FLAG_PAGETABLE);
|
||||
dpt = xe_bo_create_pin_map_at_aligned(xe, tile0, NULL,
|
||||
dpt_size, ~0ull,
|
||||
ttm_bo_type_kernel,
|
||||
XE_BO_FLAG_STOLEN |
|
||||
XE_BO_FLAG_GGTT |
|
||||
XE_BO_FLAG_PAGETABLE,
|
||||
physical_alignment);
|
||||
if (IS_ERR(dpt))
|
||||
dpt = xe_bo_create_pin_map(xe, tile0, NULL, dpt_size,
|
||||
ttm_bo_type_kernel,
|
||||
XE_BO_FLAG_SYSTEM |
|
||||
XE_BO_FLAG_GGTT |
|
||||
XE_BO_FLAG_PAGETABLE);
|
||||
dpt = xe_bo_create_pin_map_at_aligned(xe, tile0, NULL,
|
||||
dpt_size, ~0ull,
|
||||
ttm_bo_type_kernel,
|
||||
XE_BO_FLAG_SYSTEM |
|
||||
XE_BO_FLAG_GGTT |
|
||||
XE_BO_FLAG_PAGETABLE,
|
||||
physical_alignment);
|
||||
if (IS_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
|
||||
|
||||
static int __xe_pin_fb_vma_ggtt(const struct intel_framebuffer *fb,
|
||||
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_device *xe = to_xe_device(fb->base.dev);
|
||||
@@ -264,7 +272,8 @@ out:
|
||||
}
|
||||
|
||||
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 xe_device *xe = to_xe_device(dev);
|
||||
@@ -312,9 +321,9 @@ static struct i915_vma *__xe_pin_fb_vma(const struct intel_framebuffer *fb,
|
||||
|
||||
vma->bo = bo;
|
||||
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
|
||||
ret = __xe_pin_fb_vma_ggtt(fb, view, vma);
|
||||
ret = __xe_pin_fb_vma_ggtt(fb, view, vma, physical_alignment);
|
||||
if (ret)
|
||||
goto err_unpin;
|
||||
|
||||
@@ -355,7 +364,7 @@ intel_fb_pin_to_ggtt(const struct drm_framebuffer *fb,
|
||||
{
|
||||
*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)
|
||||
@@ -368,11 +377,15 @@ int intel_plane_pin_fb(struct intel_plane_state *plane_state)
|
||||
struct drm_framebuffer *fb = plane_state->hw.fb;
|
||||
struct xe_bo *bo = intel_fb_obj(fb);
|
||||
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.. */
|
||||
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))
|
||||
return PTR_ERR(vma);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user