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

Signed-off-by: Juha-Pekka Heikkila <juhapekka.heikk...@gmail.com>
---
 drivers/gpu/drm/xe/display/xe_fb_pin.c | 57 ++++++++++++++++----------
 1 file changed, 35 insertions(+), 22 deletions(-)

diff --git a/drivers/gpu/drm/xe/display/xe_fb_pin.c 
b/drivers/gpu/drm/xe/display/xe_fb_pin.c
index 79dbbbe03c7f..761510ae0690 100644
--- a/drivers/gpu/drm/xe/display/xe_fb_pin.c
+++ b/drivers/gpu/drm/xe/display/xe_fb_pin.c
@@ -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);
@@ -99,23 +100,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);
 
@@ -184,7 +191,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 drm_gem_object *obj = intel_fb_bo(&fb->base);
        struct xe_bo *bo = gem_to_xe_bo(obj);
@@ -266,7 +274,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);
@@ -315,9 +324,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;
 
@@ -358,7 +367,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)
@@ -372,11 +381,15 @@ int intel_plane_pin_fb(struct intel_plane_state 
*plane_state)
        struct drm_gem_object *obj = intel_fb_bo(fb);
        struct xe_bo *bo = gem_to_xe_bo(obj);
        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);
 
-- 
2.45.2

Reply via email to