drm/xe: Add XE_VMA_PTE_64K VMA flag
authorMatthew Brost <matthew.brost@intel.com>
Mon, 19 Feb 2024 21:19:41 +0000 (13:19 -0800)
committerMatthew Brost <matthew.brost@intel.com>
Tue, 20 Feb 2024 16:39:34 +0000 (08:39 -0800)
Add XE_VMA_PTE_64K VMA flag to ensure skipping rebinds does not cross
64k page boundaries.

Fixes: 8f33b4f054fc ("drm/xe: Avoid doing rebinds")
Fixes: c47794bdd63d ("drm/xe: Set max pte size when skipping rebinds")
Signed-off-by: Matthew Brost <matthew.brost@intel.com>
Reviewed-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240219211942.3633795-3-matthew.brost@intel.com
drivers/gpu/drm/xe/xe_pt.c
drivers/gpu/drm/xe/xe_vm.c
drivers/gpu/drm/xe/xe_vm_types.h

index 1e35c752544790be8331c0022710be885dec1ea9..46cea37bdac5144a0f5db23b5a36e64b8a2fd0ce 100644 (file)
@@ -499,10 +499,12 @@ xe_pt_stage_bind_entry(struct xe_ptw *parent, pgoff_t offset,
                 * this device *requires* 64K PTE size for VRAM, fail.
                 */
                if (level == 0 && !xe_parent->is_compact) {
-                       if (xe_pt_is_pte_ps64K(addr, next, xe_walk))
+                       if (xe_pt_is_pte_ps64K(addr, next, xe_walk)) {
+                               xe_walk->vma->gpuva.flags |= XE_VMA_PTE_64K;
                                pte |= XE_PTE_PS64;
-                       else if (XE_WARN_ON(xe_walk->needs_64K))
+                       } else if (XE_WARN_ON(xe_walk->needs_64K)) {
                                return -EINVAL;
+                       }
                }
 
                ret = xe_pt_insert_entry(xe_walk, xe_parent, offset, NULL, pte);
index 2b0c76c663e57914790e5e875fbe6cc14085e9ef..7781290d2b99b13cc63c0564a96cdabacde1af5d 100644 (file)
@@ -2192,6 +2192,8 @@ static u64 xe_vma_max_pte_size(struct xe_vma *vma)
                return SZ_1G;
        else if (vma->gpuva.flags & XE_VMA_PTE_2M)
                return SZ_2M;
+       else if (vma->gpuva.flags & XE_VMA_PTE_64K)
+               return SZ_64K;
        else if (vma->gpuva.flags & XE_VMA_PTE_4K)
                return SZ_4K;
 
@@ -2207,6 +2209,9 @@ static void xe_vma_set_pte_size(struct xe_vma *vma, u64 size)
        case SZ_2M:
                vma->gpuva.flags |= XE_VMA_PTE_2M;
                break;
+       case SZ_64K:
+               vma->gpuva.flags |= XE_VMA_PTE_64K;
+               break;
        case SZ_4K:
                vma->gpuva.flags |= XE_VMA_PTE_4K;
                break;
index 5ac9c5bebabc3cf3ecf528f51f8aa92cebc410ef..91800ce7084500f2cf9c96ef3b2bb1371698b57e 100644 (file)
@@ -29,6 +29,7 @@ struct xe_vm;
 #define XE_VMA_PTE_4K          (DRM_GPUVA_USERBITS << 5)
 #define XE_VMA_PTE_2M          (DRM_GPUVA_USERBITS << 6)
 #define XE_VMA_PTE_1G          (DRM_GPUVA_USERBITS << 7)
+#define XE_VMA_PTE_64K         (DRM_GPUVA_USERBITS << 8)
 
 /** struct xe_userptr - User pointer */
 struct xe_userptr {