Module: Mesa Branch: main Commit: 7e7ab394249a55acc2cd094c5f36206b40542c7b URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=7e7ab394249a55acc2cd094c5f36206b40542c7b
Author: José Roberto de Souza <[email protected]> Date: Wed Jun 21 16:30:39 2023 -0700 anv: Add gem_create_userptr() to KMD backend Xe support of userptr will be implemented in the next patch, this is just moving the i915 and stub functions to KMD backend. Signed-off-by: José Roberto de Souza <[email protected]> Reviewed-by: Lionel Landwerlin <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/23787> --- src/intel/vulkan/anv_allocator.c | 2 +- src/intel/vulkan/anv_gem.c | 19 ------------------- src/intel/vulkan/anv_gem_stubs.c | 5 +++-- src/intel/vulkan/anv_kmd_backend.h | 1 + src/intel/vulkan/anv_private.h | 1 - src/intel/vulkan/i915/anv_kmd_backend.c | 20 ++++++++++++++++++++ src/intel/vulkan/xe/anv_kmd_backend.c | 7 +++++++ 7 files changed, 32 insertions(+), 23 deletions(-) diff --git a/src/intel/vulkan/anv_allocator.c b/src/intel/vulkan/anv_allocator.c index db0704c0c10..9ac81a87d6d 100644 --- a/src/intel/vulkan/anv_allocator.c +++ b/src/intel/vulkan/anv_allocator.c @@ -1634,7 +1634,7 @@ anv_device_import_bo_from_host_ptr(struct anv_device *device, anv_bo_alloc_flags_to_bo_flags(device, alloc_flags); assert(bo_flags == (bo_flags & ANV_BO_CACHE_SUPPORTED_FLAGS)); - uint32_t gem_handle = anv_gem_userptr(device, host_ptr, size); + uint32_t gem_handle = device->kmd_backend->gem_create_userptr(device, host_ptr, size); if (!gem_handle) return vk_error(device, VK_ERROR_INVALID_EXTERNAL_HANDLE); diff --git a/src/intel/vulkan/anv_gem.c b/src/intel/vulkan/anv_gem.c index 451e2729b15..ec4932b0c52 100644 --- a/src/intel/vulkan/anv_gem.c +++ b/src/intel/vulkan/anv_gem.c @@ -55,25 +55,6 @@ anv_gem_munmap(struct anv_device *device, void *p, uint64_t size) munmap(p, size); } -uint32_t -anv_gem_userptr(struct anv_device *device, void *mem, size_t size) -{ - struct drm_i915_gem_userptr userptr = { - .user_ptr = (__u64)((unsigned long) mem), - .user_size = size, - .flags = 0, - }; - - if (device->physical->info.has_userptr_probe) - userptr.flags |= I915_USERPTR_PROBE; - - int ret = intel_ioctl(device->fd, DRM_IOCTL_I915_GEM_USERPTR, &userptr); - if (ret == -1) - return 0; - - return userptr.handle; -} - int anv_gem_set_caching(struct anv_device *device, uint32_t gem_handle, uint32_t caching) diff --git a/src/intel/vulkan/anv_gem_stubs.c b/src/intel/vulkan/anv_gem_stubs.c index 0cf2bc3ce5e..ec399a7d7f6 100644 --- a/src/intel/vulkan/anv_gem_stubs.c +++ b/src/intel/vulkan/anv_gem_stubs.c @@ -102,8 +102,8 @@ anv_gem_munmap(struct anv_device *device, void *p, uint64_t size) munmap(p, size); } -uint32_t -anv_gem_userptr(struct anv_device *device, void *mem, size_t size) +static uint32_t +stub_gem_create_userptr(struct anv_device *device, void *mem, uint64_t size) { int fd = os_create_anonymous_file(size, "fake bo"); if (fd == -1) @@ -168,6 +168,7 @@ const struct anv_kmd_backend *anv_stub_kmd_backend_get(void) { static const struct anv_kmd_backend stub_backend = { .gem_create = stub_gem_create, + .gem_create_userptr = stub_gem_create_userptr, .gem_close = stub_gem_close, .gem_mmap = stub_gem_mmap, .gem_vm_bind = stub_gem_vm_bind, diff --git a/src/intel/vulkan/anv_kmd_backend.h b/src/intel/vulkan/anv_kmd_backend.h index 76c5f2f27e1..6497d7f3017 100644 --- a/src/intel/vulkan/anv_kmd_backend.h +++ b/src/intel/vulkan/anv_kmd_backend.h @@ -49,6 +49,7 @@ struct anv_kmd_backend { uint16_t num_regions, uint64_t size, enum anv_bo_alloc_flags alloc_flags, uint64_t *actual_size); + uint32_t (*gem_create_userptr)(struct anv_device *device, void *mem, uint64_t size); void (*gem_close)(struct anv_device *device, uint32_t handle); /* Returns MAP_FAILED on error */ void *(*gem_mmap)(struct anv_device *device, struct anv_bo *bo, diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h index f029c4ee7c8..388107db82c 100644 --- a/src/intel/vulkan/anv_private.h +++ b/src/intel/vulkan/anv_private.h @@ -1403,7 +1403,6 @@ void * anv_gem_mmap(struct anv_device *device, struct anv_bo *bo, uint64_t offset, uint64_t size, VkMemoryPropertyFlags property_flags); void anv_gem_munmap(struct anv_device *device, void *p, uint64_t size); -uint32_t anv_gem_userptr(struct anv_device *device, void *mem, size_t size); int anv_gem_wait(struct anv_device *device, uint32_t gem_handle, int64_t *timeout_ns); int anv_gem_set_tiling(struct anv_device *device, uint32_t gem_handle, uint32_t stride, uint32_t tiling); diff --git a/src/intel/vulkan/i915/anv_kmd_backend.c b/src/intel/vulkan/i915/anv_kmd_backend.c index 231844b4da0..d8f0a83a7ef 100644 --- a/src/intel/vulkan/i915/anv_kmd_backend.c +++ b/src/intel/vulkan/i915/anv_kmd_backend.c @@ -179,11 +179,31 @@ i915_gem_vm_unbind(struct anv_device *device, struct anv_bo *bo) return 0; } +static uint32_t +i915_gem_create_userptr(struct anv_device *device, void *mem, uint64_t size) +{ + struct drm_i915_gem_userptr userptr = { + .user_ptr = (__u64)((unsigned long) mem), + .user_size = size, + .flags = 0, + }; + + if (device->physical->info.has_userptr_probe) + userptr.flags |= I915_USERPTR_PROBE; + + int ret = intel_ioctl(device->fd, DRM_IOCTL_I915_GEM_USERPTR, &userptr); + if (ret == -1) + return 0; + + return userptr.handle; +} + const struct anv_kmd_backend * anv_i915_kmd_backend_get(void) { static const struct anv_kmd_backend i915_backend = { .gem_create = i915_gem_create, + .gem_create_userptr = i915_gem_create_userptr, .gem_close = i915_gem_close, .gem_mmap = i915_gem_mmap, .gem_vm_bind = i915_gem_vm_bind, diff --git a/src/intel/vulkan/xe/anv_kmd_backend.c b/src/intel/vulkan/xe/anv_kmd_backend.c index 5140254b2de..cff22f56cc7 100644 --- a/src/intel/vulkan/xe/anv_kmd_backend.c +++ b/src/intel/vulkan/xe/anv_kmd_backend.c @@ -135,11 +135,18 @@ static int xe_gem_vm_unbind(struct anv_device *device, struct anv_bo *bo) return xe_gem_vm_bind_op(device, bo, XE_VM_BIND_OP_UNMAP); } +static uint32_t +xe_gem_create_userptr(struct anv_device *device, void *mem, uint64_t size) +{ + return 0; +} + const struct anv_kmd_backend * anv_xe_kmd_backend_get(void) { static const struct anv_kmd_backend xe_backend = { .gem_create = xe_gem_create, + .gem_create_userptr = xe_gem_create_userptr, .gem_close = xe_gem_close, .gem_mmap = xe_gem_mmap, .gem_vm_bind = xe_gem_vm_bind,
