]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
drm/xe/display: align framebuffers according to hw requirements
authorJuha-Pekka Heikkila <juhapekka.heikkila@gmail.com>
Wed, 9 Oct 2024 15:19:47 +0000 (18:19 +0300)
committerMika Kahola <mika.kahola@intel.com>
Mon, 14 Oct 2024 14:33:40 +0000 (17:33 +0300)
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
drivers/gpu/drm/xe/display/xe_fb_pin.c

index b58fc4ba2aacb584979b6c44c7dd080e142c4f49..9194993910e39d9b2250693012d3b89089ffc873 100644 (file)
@@ -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);