]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/xe/migrate: fix chunk handling for 2M page emit
authorMatthew Auld <matthew.auld@intel.com>
Wed, 22 Oct 2025 16:38:32 +0000 (17:38 +0100)
committerMatthew Auld <matthew.auld@intel.com>
Thu, 23 Oct 2025 09:48:36 +0000 (10:48 +0100)
On systems with PAGE_SIZE > 4K the chunk will likely be rounded down to
zero, if say we have single 2M page, so one huge pte, since we also try
to align the chunk to PAGE_SIZE / XE_PAGE_SIZE, which will be 16 on 64K
systems. Make the ALIGN_DOWN conditional for 4K PTEs where we can
encounter gpu_page_size < PAGE_SIZE.

Signed-off-by: Matthew Auld <matthew.auld@intel.com>
Cc: Matthew Brost <matthew.brost@intel.com>
Reviewed-by: Matthew Brost <matthew.brost@intel.com>
Link: https://lore.kernel.org/r/20251022163836.191405-4-matthew.auld@intel.com
drivers/gpu/drm/xe/xe_migrate.c

index 451fae0106e5a0400767ea3e9198d669a2c3722a..ce5543fa7a5212c9b5489477783b4037e9ac132d 100644 (file)
@@ -1804,7 +1804,9 @@ static void build_pt_update_batch_sram(struct xe_migrate *m,
        while (ptes) {
                u32 chunk = min(MAX_PTE_PER_SDI, ptes);
 
-               chunk = ALIGN_DOWN(chunk, PAGE_SIZE / XE_PAGE_SIZE);
+               if (!level)
+                       chunk = ALIGN_DOWN(chunk, PAGE_SIZE / XE_PAGE_SIZE);
+
                bb->cs[bb->len++] = MI_STORE_DATA_IMM | MI_SDI_NUM_QW(chunk);
                bb->cs[bb->len++] = pt_offset;
                bb->cs[bb->len++] = 0;