diff options
author | Thomas Hellström <thomas.hellstrom@linux.intel.com> | 2023-09-08 12:17:15 +0300 |
---|---|---|
committer | Rodrigo Vivi <rodrigo.vivi@intel.com> | 2023-12-21 19:41:07 +0300 |
commit | 2714d50936200a65ae52f431b0c004b31655239f (patch) | |
tree | bedc13f19ee549a679fd54cde6f372bbe3d7c473 /drivers/gpu/drm/xe/xe_vm.c | |
parent | d490ecf577903ce5a9e6a3bb3bd08b5a550719c7 (diff) | |
download | linux-2714d50936200a65ae52f431b0c004b31655239f.tar.xz |
drm/xe: Convert pagefaulting code to use drm_exec
Replace the calls into ttm_eu_reserve_buffers with the drm_exec helpers.
Also reuse some code.
v4:
- Kerneldoc xe_vm_prepare_vma().
Signed-off-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
Reviewed-by: Matthew Brost <matthew.brost@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20230908091716.36984-6-thomas.hellstrom@linux.intel.com
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
Diffstat (limited to 'drivers/gpu/drm/xe/xe_vm.c')
-rw-r--r-- | drivers/gpu/drm/xe/xe_vm.c | 36 |
1 files changed, 34 insertions, 2 deletions
diff --git a/drivers/gpu/drm/xe/xe_vm.c b/drivers/gpu/drm/xe/xe_vm.c index 80b374b9cdd1..52c5235677c5 100644 --- a/drivers/gpu/drm/xe/xe_vm.c +++ b/drivers/gpu/drm/xe/xe_vm.c @@ -35,6 +35,11 @@ #define TEST_VM_ASYNC_OPS_ERROR +static struct drm_gem_object *xe_vm_obj(struct xe_vm *vm) +{ + return vm->gpuvm.r_obj; +} + /** * xe_vma_userptr_check_repin() - Advisory check for repin needed * @vma: The userptr vma @@ -422,7 +427,7 @@ int xe_vm_lock_dma_resv(struct xe_vm *vm, struct drm_exec *exec, lockdep_assert_held(&vm->lock); if (lock_vm) { - err = drm_exec_prepare_obj(exec, &xe_vm_ttm_bo(vm)->base, num_shared); + err = drm_exec_prepare_obj(exec, xe_vm_obj(vm), num_shared); if (err) return err; } @@ -514,7 +519,7 @@ static int xe_preempt_work_begin(struct drm_exec *exec, struct xe_vm *vm, struct xe_vma *vma; int err; - err = drm_exec_prepare_obj(exec, &xe_vm_ttm_bo(vm)->base, + err = drm_exec_prepare_obj(exec, xe_vm_obj(vm), vm->preempt.num_exec_queues); if (err) return err; @@ -1095,6 +1100,33 @@ static void xe_vma_destroy(struct xe_vma *vma, struct dma_fence *fence) } } +/** + * xe_vm_prepare_vma() - drm_exec utility to lock a vma + * @exec: The drm_exec object we're currently locking for. + * @vma: The vma for witch we want to lock the vm resv and any attached + * object's resv. + * @num_shared: The number of dma-fence slots to pre-allocate in the + * objects' reservation objects. + * + * Return: 0 on success, negative error code on error. In particular + * may return -EDEADLK on WW transaction contention and -EINTR if + * an interruptible wait is terminated by a signal. + */ +int xe_vm_prepare_vma(struct drm_exec *exec, struct xe_vma *vma, + unsigned int num_shared) +{ + struct xe_vm *vm = xe_vma_vm(vma); + struct xe_bo *bo = xe_vma_bo(vma); + int err; + + XE_WARN_ON(!vm); + err = drm_exec_prepare_obj(exec, xe_vm_obj(vm), num_shared); + if (!err && bo && !bo->vm) + err = drm_exec_prepare_obj(exec, &bo->ttm.base, num_shared); + + return err; +} + static void xe_vma_destroy_unlocked(struct xe_vma *vma) { struct ttm_validate_buffer tv[2]; |