From d19a051714981a2315c132d237c7f68d165d3cff Mon Sep 17 00:00:00 2001 From: Paulo Zanoni Date: Fri, 26 Sep 2025 16:41:03 -0700 Subject: [PATCH] intel/i915: add i915_gem_execbuf_ioctl() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Unify the common code for i915.ko execbuf submission between Iris and Anv. I plan to add more code to this function in the next patches. Reviewed-by: José Roberto de Souza Signed-off-by: Paulo Zanoni Part-of: --- .../drivers/iris/i915/iris_kmd_backend.c | 17 ++++++----------- src/intel/common/i915/intel_gem.h | 18 ++++++++++++++++++ src/intel/vulkan/i915/anv_batch_chain.c | 12 ++---------- 3 files changed, 26 insertions(+), 21 deletions(-) diff --git a/src/gallium/drivers/iris/i915/iris_kmd_backend.c b/src/gallium/drivers/iris/i915/iris_kmd_backend.c index fe94464c314..745bee79ed3 100644 --- a/src/gallium/drivers/iris/i915/iris_kmd_backend.c +++ b/src/gallium/drivers/iris/i915/iris_kmd_backend.c @@ -293,7 +293,8 @@ i915_batch_check_for_reset(struct iris_batch *batch) static int i915_batch_submit(struct iris_batch *batch) { - struct iris_bufmgr *bufmgr = batch->screen->bufmgr; + struct iris_screen *screen = batch->screen; + struct iris_bufmgr *bufmgr = screen->bufmgr; simple_mtx_t *bo_deps_lock = iris_bufmgr_get_bo_deps_lock(bufmgr); iris_bo_unmap(batch->bo); @@ -318,7 +319,7 @@ i915_batch_submit(struct iris_batch *batch) } else { uint32_t flags = EXEC_OBJECT_SUPPORTS_48B_ADDRESS | EXEC_OBJECT_PINNED; flags |= bo->real.capture ? EXEC_OBJECT_CAPTURE : 0; - flags |= bo == batch->screen->workaround_bo ? EXEC_OBJECT_ASYNC : 0; + flags |= bo == screen->workaround_bo ? EXEC_OBJECT_ASYNC : 0; flags |= iris_bo_is_external(bo) ? 0 : EXEC_OBJECT_ASYNC; flags |= written ? EXEC_OBJECT_WRITE : 0; @@ -386,15 +387,9 @@ i915_batch_submit(struct iris_batch *batch) (uintptr_t)util_dynarray_begin(&batch->exec_fences); } - int ret = 0; - if (likely(!batch->screen->devinfo->no_hw)) { - do { - ret = intel_ioctl(batch->screen->fd, DRM_IOCTL_I915_GEM_EXECBUFFER2, &execbuf); - } while (ret && errno == ENOMEM); - - if (ret) - ret = -errno; - } + int ret = i915_gem_execbuf_ioctl(screen->fd, screen->devinfo, &execbuf); + if (ret) + ret = -errno; simple_mtx_unlock(bo_deps_lock); diff --git a/src/intel/common/i915/intel_gem.h b/src/intel/common/i915/intel_gem.h index a2af62bb21d..a8fb4b66bdb 100644 --- a/src/intel/common/i915/intel_gem.h +++ b/src/intel/common/i915/intel_gem.h @@ -140,3 +140,21 @@ intel_i915_gem_add_ext(__u64 *ptr, uint32_t ext_name, *iter = (uintptr_t) ext; } + +static inline int +i915_gem_execbuf_ioctl(int fd, const struct intel_device_info *info, + struct drm_i915_gem_execbuffer2 *execbuf) +{ + int ret; + + assert((execbuf->flags & I915_EXEC_FENCE_OUT) == 0); + + if (unlikely(info->no_hw)) + return 0; + + do { + ret = intel_ioctl(fd, DRM_IOCTL_I915_GEM_EXECBUFFER2, execbuf); + } while (ret && errno == ENOMEM); + + return ret; +} diff --git a/src/intel/vulkan/i915/anv_batch_chain.c b/src/intel/vulkan/i915/anv_batch_chain.c index 94ad5a5e50a..1aa5b0eac22 100644 --- a/src/intel/vulkan/i915/anv_batch_chain.c +++ b/src/intel/vulkan/i915/anv_batch_chain.c @@ -21,6 +21,7 @@ * IN THE SOFTWARE. */ +#include "common/i915/intel_gem.h" #include "i915/anv_batch_chain.h" #include "anv_private.h" #include "anv_measure.h" @@ -677,17 +678,8 @@ anv_gem_execbuffer_impl(struct anv_queue *queue, const char *func, int line) { struct anv_device *device = queue->device; - int ret; - - assert((execbuf->flags & I915_EXEC_FENCE_OUT) == 0); - - if (unlikely(device->info->no_hw)) - return VK_SUCCESS; - - do { - ret = intel_ioctl(device->fd, DRM_IOCTL_I915_GEM_EXECBUFFER2, execbuf); - } while (ret && errno == ENOMEM); + int ret = i915_gem_execbuf_ioctl(device->fd, device->info, execbuf); if (ret) return vk_queue_set_lost(&queue->vk, "%s(%d) failed: %m", func, line);