diff --git a/src/intel/vulkan/anv_kmd_backend.h b/src/intel/vulkan/anv_kmd_backend.h index 372dc31d8e2..a8a205e1d63 100644 --- a/src/intel/vulkan/anv_kmd_backend.h +++ b/src/intel/vulkan/anv_kmd_backend.h @@ -42,8 +42,12 @@ struct anv_sparse_submission; struct anv_trtt_batch_bo; enum anv_vm_bind_op { + /* bind vma specified in anv_vm_bind */ ANV_VM_BIND, + /* unbind vma specified in anv_vm_bind */ ANV_VM_UNBIND, + /* unbind all vmas of anv_vm_bind::bo, address and size fields must be set to 0 */ + ANV_VM_UNBIND_ALL, }; struct anv_vm_bind { diff --git a/src/intel/vulkan/xe/anv_kmd_backend.c b/src/intel/vulkan/xe/anv_kmd_backend.c index 8fcb1c72669..d96d6bc653b 100644 --- a/src/intel/vulkan/xe/anv_kmd_backend.c +++ b/src/intel/vulkan/xe/anv_kmd_backend.c @@ -171,6 +171,13 @@ xe_vm_bind_op(struct anv_device *device, xe_bind->op = DRM_XE_VM_BIND_OP_MAP; xe_bind->obj = bo->gem_handle; } + } else if (bind->op == ANV_VM_UNBIND_ALL) { + xe_bind->op = DRM_XE_VM_BIND_OP_UNMAP_ALL; + xe_bind->obj = bo->gem_handle; + assert(bind->address == 0); + assert(bind->size == 0); + } else { + assert(bind->op == ANV_VM_UNBIND); } /* userptr and bo_offset are an union! */ @@ -223,10 +230,10 @@ static int xe_vm_unbind_bo(struct anv_device *device, struct anv_bo *bo) { struct anv_vm_bind bind = { .bo = bo, - .address = bo->offset, + .address = 0, .bo_offset = 0, - .size = bo->actual_size, - .op = ANV_VM_UNBIND, + .size = 0, + .op = ANV_VM_UNBIND_ALL, }; struct anv_sparse_submission submit = { .queue = NULL,