Commit b0228a33 authored by Juha-Pekka Heikkila's avatar Juha-Pekka Heikkila 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
Loading
Loading
Loading
Loading
+35 −22
Original line number Diff line number Diff line
@@ -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,
		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);
						      XE_BO_FLAG_PAGETABLE,
						      physical_alignment);
	else
		dpt = xe_bo_create_pin_map(xe, tile0, NULL, dpt_size,
		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);
						      XE_BO_FLAG_PAGETABLE,
						      physical_alignment);
	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,
						      dpt_size,  ~0ull,
						      ttm_bo_type_kernel,
						      XE_BO_FLAG_SYSTEM |
						      XE_BO_FLAG_GGTT |
					   XE_BO_FLAG_PAGETABLE);
						      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 @@ static int __xe_pin_fb_vma_ggtt(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 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);