]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/xe/migrate: Refactor xe_migrate_prepare_vm()
authorRaag Jadav <raag.jadav@intel.com>
Tue, 3 Mar 2026 10:19:13 +0000 (15:49 +0530)
committerMatt Roper <matthew.d.roper@intel.com>
Fri, 6 Mar 2026 23:13:38 +0000 (15:13 -0800)
Currently xe_migrate_prepare_vm() does three things.

1. Allocates pt_bo for migrate context.
2. Initializes pt_bo with actual pte details.
3. Initializes sa_manager for migrate context.

Split these implementations in their own functions for better
maintainability.

Signed-off-by: Raag Jadav <raag.jadav@intel.com>
Reviewed-by: Matthew Brost <matthew.brost@intel.com>
Link: https://patch.msgid.link/20260303101913.3576481-1-raag.jadav@intel.com
Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
drivers/gpu/drm/xe/xe_migrate.c

index 333af7b57ae9724086ac3dc65da7e2bf9169afb5..283d55fef6b849eb0dac6b57937092a1bd845ebc 100644 (file)
@@ -184,19 +184,11 @@ static void xe_migrate_program_identity(struct xe_device *xe, struct xe_vm *vm,
        xe_assert(xe, pos == vram_limit);
 }
 
-static int xe_migrate_prepare_vm(struct xe_tile *tile, struct xe_migrate *m,
-                                struct xe_vm *vm, struct drm_exec *exec)
+static int xe_migrate_pt_bo_alloc(struct xe_tile *tile, struct xe_migrate *m,
+                                 struct xe_vm *vm, struct drm_exec *exec)
 {
-       struct xe_device *xe = tile_to_xe(tile);
-       u16 pat_index = xe->pat.idx[XE_CACHE_WB];
-       u8 id = tile->id;
-       u32 num_entries = NUM_PT_SLOTS, num_level = vm->pt_root[id]->level;
-#define VRAM_IDENTITY_MAP_COUNT        2
-       u32 num_setup = num_level + VRAM_IDENTITY_MAP_COUNT;
-#undef VRAM_IDENTITY_MAP_COUNT
-       u32 map_ofs, level, i;
        struct xe_bo *bo, *batch = tile->mem.kernel_bb_pool->bo;
-       u64 entry, pt29_ofs;
+       u32 num_entries = NUM_PT_SLOTS;
 
        /* Can't bump NUM_PT_SLOTS too high */
        BUILD_BUG_ON(NUM_PT_SLOTS > SZ_2M/XE_PAGE_SIZE);
@@ -216,6 +208,24 @@ static int xe_migrate_prepare_vm(struct xe_tile *tile, struct xe_migrate *m,
        if (IS_ERR(bo))
                return PTR_ERR(bo);
 
+       m->pt_bo = bo;
+       return 0;
+}
+
+static void xe_migrate_prepare_vm(struct xe_tile *tile, struct xe_migrate *m,
+                                 struct xe_vm *vm, u32 *ofs)
+{
+       struct xe_device *xe = tile_to_xe(tile);
+       u16 pat_index = xe->pat.idx[XE_CACHE_WB];
+       u8 id = tile->id;
+       u32 num_entries = NUM_PT_SLOTS, num_level = vm->pt_root[id]->level;
+#define VRAM_IDENTITY_MAP_COUNT        2
+       u32 num_setup = num_level + VRAM_IDENTITY_MAP_COUNT;
+#undef VRAM_IDENTITY_MAP_COUNT
+       u32 map_ofs, level, i;
+       struct xe_bo *bo = m->pt_bo, *batch = tile->mem.kernel_bb_pool->bo;
+       u64 entry, pt29_ofs;
+
        /* PT30 & PT31 reserved for 2M identity map */
        pt29_ofs = xe_bo_size(bo) - 3 * XE_PAGE_SIZE;
        entry = vm->pt_ops->pde_encode_bo(bo, pt29_ofs);
@@ -338,6 +348,12 @@ static int xe_migrate_prepare_vm(struct xe_tile *tile, struct xe_migrate *m,
                }
        }
 
+       if (ofs)
+               *ofs = map_ofs;
+}
+
+static void xe_migrate_suballoc_manager_init(struct xe_migrate *m, u32 map_ofs)
+{
        /*
         * Example layout created above, with root level = 3:
         * [PT0...PT7]: kernel PT's for copy/clear; 64 or 4KiB PTE's
@@ -363,9 +379,6 @@ static int xe_migrate_prepare_vm(struct xe_tile *tile, struct xe_migrate *m,
        drm_suballoc_manager_init(&m->vm_update_sa,
                                  (size_t)(map_ofs / XE_PAGE_SIZE - NUM_KERNEL_PDE) *
                                  NUM_VMUSA_UNIT_PER_PAGE, 0);
-
-       m->pt_bo = bo;
-       return 0;
 }
 
 /*
@@ -416,12 +429,22 @@ static int xe_migrate_lock_prepare_vm(struct xe_tile *tile, struct xe_migrate *m
        struct xe_device *xe = tile_to_xe(tile);
        struct xe_validation_ctx ctx;
        struct drm_exec exec;
+       u32 map_ofs;
        int err = 0;
 
        xe_validation_guard(&ctx, &xe->val, &exec, (struct xe_val_flags) {}, err) {
                err = xe_vm_drm_exec_lock(vm, &exec);
+               if (err)
+                       return err;
+
                drm_exec_retry_on_contention(&exec);
-               err = xe_migrate_prepare_vm(tile, m, vm, &exec);
+
+               err = xe_migrate_pt_bo_alloc(tile, m, vm, &exec);
+               if (err)
+                       return err;
+
+               xe_migrate_prepare_vm(tile, m, vm, &map_ofs);
+               xe_migrate_suballoc_manager_init(m, map_ofs);
                drm_exec_retry_on_contention(&exec);
                xe_validation_retry_on_oom(&ctx, &err);
        }