From b38f7834f507ae61ba11ade276bd4ec27b136ae3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Roberto=20de=20Souza?= Date: Thu, 22 Jun 2023 14:04:19 -0700 Subject: [PATCH] iris: Add gem_create_userptr() to KMD backend MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Xe support of userptr will be implemented in the next patch, this is just moving the i915 function to KMD backend. Signed-off-by: José Roberto de Souza Reviewed-by: Marcin Ślusarz Reviewed-by: Lionel Landwerlin Part-of: --- .../drivers/iris/i915/iris_kmd_backend.c | 27 ++++++++++++++++++ src/gallium/drivers/iris/iris_bufmgr.c | 28 ++----------------- src/gallium/drivers/iris/iris_kmd_backend.h | 2 ++ .../drivers/iris/xe/iris_kmd_backend.c | 8 ++++++ 4 files changed, 39 insertions(+), 26 deletions(-) diff --git a/src/gallium/drivers/iris/i915/iris_kmd_backend.c b/src/gallium/drivers/iris/i915/iris_kmd_backend.c index 131c6a97b4d..18277ad5de7 100644 --- a/src/gallium/drivers/iris/i915/iris_kmd_backend.c +++ b/src/gallium/drivers/iris/i915/iris_kmd_backend.c @@ -421,10 +421,37 @@ i915_gem_close(struct iris_bufmgr *bufmgr, struct iris_bo *bo) return intel_ioctl(iris_bufmgr_get_fd(bufmgr), DRM_IOCTL_GEM_CLOSE, &close); } +static uint32_t +i915_gem_create_userptr(struct iris_bufmgr *bufmgr, void *ptr, uint64_t size) +{ + const struct intel_device_info *devinfo = iris_bufmgr_get_device_info(bufmgr); + struct drm_i915_gem_userptr arg = { + .user_ptr = (uintptr_t)ptr, + .user_size = size, + .flags = devinfo->has_userptr_probe ? I915_USERPTR_PROBE : 0, + }; + if (intel_ioctl(iris_bufmgr_get_fd(bufmgr), DRM_IOCTL_I915_GEM_USERPTR, &arg)) + return 0; + + if (!devinfo->has_userptr_probe) { + /* Check the buffer for validity before we try and use it in a batch */ + if (i915_gem_set_domain(bufmgr, arg.handle, I915_GEM_DOMAIN_CPU, 0)) { + struct drm_gem_close close = { + .handle = arg.handle, + }; + intel_ioctl(iris_bufmgr_get_fd(bufmgr), DRM_IOCTL_GEM_CLOSE, &close); + return 0; + } + } + + return arg.handle; +} + const struct iris_kmd_backend *i915_get_backend(void) { static const struct iris_kmd_backend i915_backend = { .gem_create = i915_gem_create, + .gem_create_userptr = i915_gem_create_userptr, .gem_close = i915_gem_close, .bo_madvise = i915_bo_madvise, .bo_set_caching = i915_bo_set_caching, diff --git a/src/gallium/drivers/iris/iris_bufmgr.c b/src/gallium/drivers/iris/iris_bufmgr.c index 4c2f78c70c8..d713c8d198b 100644 --- a/src/gallium/drivers/iris/iris_bufmgr.c +++ b/src/gallium/drivers/iris/iris_bufmgr.c @@ -1067,19 +1067,6 @@ alloc_bo_from_cache(struct iris_bufmgr *bufmgr, return bo; } -static int -i915_gem_set_domain(struct iris_bufmgr *bufmgr, uint32_t handle, - uint32_t read_domains, uint32_t write_domains) -{ - struct drm_i915_gem_set_domain sd = { - .handle = handle, - .read_domains = read_domains, - .write_domain = write_domains, - }; - return intel_ioctl(iris_bufmgr_get_fd(bufmgr), - DRM_IOCTL_I915_GEM_SET_DOMAIN, &sd); -} - static struct iris_bo * alloc_fresh_bo(struct iris_bufmgr *bufmgr, uint64_t bo_size, unsigned flags) { @@ -1296,20 +1283,9 @@ iris_bo_create_userptr(struct iris_bufmgr *bufmgr, const char *name, if (!bo) return NULL; - struct drm_i915_gem_userptr arg = { - .user_ptr = (uintptr_t)ptr, - .user_size = size, - .flags = bufmgr->devinfo.has_userptr_probe ? I915_USERPTR_PROBE : 0, - }; - if (intel_ioctl(bufmgr->fd, DRM_IOCTL_I915_GEM_USERPTR, &arg)) + bo->gem_handle = bufmgr->kmd_backend->gem_create_userptr(bufmgr, ptr, size); + if (bo->gem_handle == 0) goto err_free; - bo->gem_handle = arg.handle; - - if (!bufmgr->devinfo.has_userptr_probe) { - /* Check the buffer for validity before we try and use it in a batch */ - if (i915_gem_set_domain(bufmgr, bo->gem_handle, I915_GEM_DOMAIN_CPU, 0)) - goto err_close; - } bo->name = name; bo->size = size; diff --git a/src/gallium/drivers/iris/iris_kmd_backend.h b/src/gallium/drivers/iris/iris_kmd_backend.h index b3095f4eb2b..2f5d628a13a 100644 --- a/src/gallium/drivers/iris/iris_kmd_backend.h +++ b/src/gallium/drivers/iris/iris_kmd_backend.h @@ -39,6 +39,8 @@ struct iris_kmd_backend { const struct intel_memory_class_instance **regions, uint16_t regions_count, uint64_t size, enum iris_heap heap_flags, unsigned alloc_flags); + uint32_t (*gem_create_userptr)(struct iris_bufmgr *bufmgr, void *ptr, + uint64_t size); int (*gem_close)(struct iris_bufmgr *bufmgr, struct iris_bo *bo); bool (*bo_madvise)(struct iris_bo *bo, enum iris_madvice state); int (*bo_set_caching)(struct iris_bo *bo, bool cached); diff --git a/src/gallium/drivers/iris/xe/iris_kmd_backend.c b/src/gallium/drivers/iris/xe/iris_kmd_backend.c index 356acab885d..031f6966892 100644 --- a/src/gallium/drivers/iris/xe/iris_kmd_backend.c +++ b/src/gallium/drivers/iris/xe/iris_kmd_backend.c @@ -436,10 +436,18 @@ xe_gem_close(struct iris_bufmgr *bufmgr, struct iris_bo *bo) return intel_ioctl(iris_bufmgr_get_fd(bufmgr), DRM_IOCTL_GEM_CLOSE, &close); } +static uint32_t +xe_gem_create_userptr(struct iris_bufmgr *bufmgr, void *ptr, uint64_t size) +{ + /* We return 0, because Xe doesn't create handles for userptrs. */ + return 0; +} + const struct iris_kmd_backend *xe_get_backend(void) { static const struct iris_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,