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,

Reply via email to