mirror of
https://github.com/torvalds/linux.git
synced 2026-05-27 08:33:17 +02:00
drm/xe/migrate: Refactor xe_migrate_prepare_vm()
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>
This commit is contained in:
parent
b458597544
commit
e8a6e92285
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user