Simplify __xe_pin_fb_vma_dpt() by moving dpt allocation into helper.
This also fixes bug where dpt could have been allocated from system
memory when on dgfx.

Signed-off-by: Juha-Pekka Heikkila <[email protected]>
---
 drivers/gpu/drm/xe/display/xe_fb_pin.c | 67 +++++++++++++++++---------
 1 file changed, 43 insertions(+), 24 deletions(-)

diff --git a/drivers/gpu/drm/xe/display/xe_fb_pin.c 
b/drivers/gpu/drm/xe/display/xe_fb_pin.c
index 9cc7bd97d4a4..cddfda1743f4 100644
--- a/drivers/gpu/drm/xe/display/xe_fb_pin.c
+++ b/drivers/gpu/drm/xe/display/xe_fb_pin.c
@@ -62,6 +62,47 @@ static void write_dpt(struct xe_bo *bo, struct iosys_map 
*map, u32 *dpt_ofs,
        *dpt_ofs = ALIGN(*dpt_ofs, 4096);
 }
 
+static struct xe_bo *xe_alloc_dpt_bo(struct xe_device *xe,
+                                    struct xe_tile *tile0, u64 size,
+                                    u64 physical_alignment)
+{
+       struct xe_bo *dpt;
+
+       /*
+        * If DGFX: try VRAM0 only
+        */
+       if (IS_DGFX(xe)) {
+               dpt = xe_bo_create_pin_map_at_aligned(xe, tile0, NULL,
+                                                     size, ~0ull,
+                                                     ttm_bo_type_kernel,
+                                                     XE_BO_FLAG_VRAM0 |
+                                                     XE_BO_FLAG_GGTT |
+                                                     XE_BO_FLAG_PAGETABLE,
+                                                     physical_alignment);
+       } else {
+               /*
+                * For IGFX: first try STOLEN. on fail try SYSTEM.
+                */
+               dpt = xe_bo_create_pin_map_at_aligned(xe, tile0, NULL,
+                                                     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_at_aligned(xe, tile0, NULL,
+                                                             size, ~0ull,
+                                                             
ttm_bo_type_kernel,
+                                                             XE_BO_FLAG_SYSTEM 
|
+                                                             XE_BO_FLAG_GGTT |
+                                                             
XE_BO_FLAG_PAGETABLE,
+                                                             
physical_alignment);
+               }
+       }
+       return dpt;
+}
+
 static int __xe_pin_fb_vma_dpt(const struct intel_framebuffer *fb,
                               const struct i915_gtt_view *view,
                               struct i915_vma *vma,
@@ -98,30 +139,8 @@ static int __xe_pin_fb_vma_dpt(const struct 
intel_framebuffer *fb,
                plane_count = ARRAY_SIZE(view->rotated.plane);
        }
 
-       if (IS_DGFX(xe))
-               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_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_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);
+       dpt = xe_alloc_dpt_bo(xe, tile0, dpt_size, physical_alignment);
+
        if (IS_ERR(dpt))
                return PTR_ERR(dpt);
 
-- 
2.45.2

Reply via email to