]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
drm/xe: Align all VRAM scanout buffers to 64k physical pages when needed.
authorMaarten Lankhorst <maarten.lankhorst@linux.intel.com>
Mon, 26 Aug 2024 17:01:16 +0000 (19:01 +0200)
committerRodrigo Vivi <rodrigo.vivi@intel.com>
Tue, 27 Aug 2024 22:15:20 +0000 (18:15 -0400)
For CCS formats on affected platforms, CCS can be used freely, but
display engine requires a multiple of 64k physical pages. No other
changes are needed.

At the BO creation time we don't know if the BO will be used for CCS
or not. If the scanout flag is set, and the BO is a multiple of 64k,
we take the safe route and force the physical alignment of 64k pages.

If the BO is not a multiple of 64k, or the scanout flag was not set
at BO creation, we reject it for usage as CCS in display. The physical
pages are likely not aligned correctly, and this will cause corruption
when used as FB.

The scanout flag and size being a multiple of 64k are used together
to enforce 64k physical placement.

VM_BIND is completely unaffected, mappings to a VM can still be aligned
to 4k, just like for normal buffers.

Signed-off-by: Zbigniew Kempczyński <zbigniew.kempczynski@intel.com>
Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Cc: Matthew Auld <matthew.auld@intel.com>
Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
Cc: Thomas Hellström <thomas.hellstrom@linux.intel.com>
Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Cc: Juha-Pekka Heikkilä <juha-pekka.heikkila@intel.com>
Reviewed-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240826170117.327709-3-maarten.lankhorst@linux.intel.com
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
drivers/gpu/drm/xe/display/intel_fb_bo.c
drivers/gpu/drm/xe/xe_bo.c
drivers/gpu/drm/xe/xe_vm.c

index f835492f73fb42d8e816ba3a6b20f3b30b1dbc0a..63ce97cc4cfef7616eb3c8ca069aa735d5dbd055 100644 (file)
@@ -7,6 +7,7 @@
 #include <drm/ttm/ttm_bo.h>
 
 #include "intel_display_types.h"
+#include "intel_fb.h"
 #include "intel_fb_bo.h"
 #include "xe_bo.h"
 
@@ -28,6 +29,14 @@ int intel_fb_bo_framebuffer_init(struct intel_framebuffer *intel_fb,
        struct xe_device *xe = to_xe_device(bo->ttm.base.dev);
        int ret;
 
+       /*
+        * Some modifiers require physical alignment of 64KiB VRAM pages;
+        * require that the BO in those cases is created correctly.
+        */
+       if (XE_IOCTL_DBG(xe, intel_fb_needs_64k_phys(mode_cmd->modifier[0]) &&
+                            !(bo->flags & XE_BO_FLAG_NEEDS_64K)))
+               return -EINVAL;
+
        xe_bo_get(bo);
 
        ret = ttm_bo_reserve(&bo->ttm, true, false, NULL);
index 45652d7e6fa64ff45ba1a5b9d334161dd5bdf7fb..4b68346538103c863e8485916d1041e5a2c9eeb8 100644 (file)
@@ -1990,6 +1990,13 @@ int xe_gem_create_ioctl(struct drm_device *dev, void *data,
 
        bo_flags |= args->placement << (ffs(XE_BO_FLAG_SYSTEM) - 1);
 
+       /* CCS formats need physical placement at a 64K alignment in VRAM. */
+       if ((bo_flags & XE_BO_FLAG_VRAM_MASK) &&
+           (bo_flags & XE_BO_FLAG_SCANOUT) &&
+           !(xe->info.vram_flags & XE_VRAM_FLAGS_NEED64K) &&
+           IS_ALIGNED(args->size, SZ_64K))
+               bo_flags |= XE_BO_FLAG_NEEDS_64K;
+
        if (args->flags & DRM_XE_GEM_CREATE_FLAG_NEEDS_VISIBLE_VRAM) {
                if (XE_IOCTL_DBG(xe, !(bo_flags & XE_BO_FLAG_VRAM_MASK)))
                        return -EINVAL;
index dab2a3b2e17f129bf6cf8aab2d264aca77bc9821..1ff94a9ae7c9a3367259367b4d243a15293bb5ea 100644 (file)
@@ -2905,7 +2905,16 @@ static int xe_vm_bind_ioctl_validate_bo(struct xe_device *xe, struct xe_bo *bo,
                return -EINVAL;
        }
 
-       if (bo->flags & XE_BO_FLAG_INTERNAL_64K) {
+       /*
+        * Some platforms require 64k VM_BIND alignment,
+        * specifically those with XE_VRAM_FLAGS_NEED64K.
+        *
+        * Other platforms may have BO's set to 64k physical placement,
+        * but can be mapped at 4k offsets anyway. This check is only
+        * there for the former case.
+        */
+       if ((bo->flags & XE_BO_FLAG_INTERNAL_64K) &&
+           (xe->info.vram_flags & XE_VRAM_FLAGS_NEED64K)) {
                if (XE_IOCTL_DBG(xe, obj_offset &
                                 XE_64K_PAGE_MASK) ||
                    XE_IOCTL_DBG(xe, addr & XE_64K_PAGE_MASK) ||