From d7416ebc1966a28b81b250d61d1894a9ef29ea7e Mon Sep 17 00:00:00 2001 From: Faith Ekstrand Date: Thu, 14 Aug 2025 16:18:26 -0400 Subject: [PATCH] intel/gem: Add an intel_gem_supports_dma_buf_sync_file() helper Acked-by: Daniel Stone Reviewed-by: Lionel Landwerlin Part-of: --- src/intel/common/i915/intel_gem.c | 55 +++++++++++++++++++++++++++++++ src/intel/common/i915/intel_gem.h | 1 + 2 files changed, 56 insertions(+) diff --git a/src/intel/common/i915/intel_gem.c b/src/intel/common/i915/intel_gem.c index 75c3cd5c6e4..5ea2cacd754 100644 --- a/src/intel/common/i915/intel_gem.c +++ b/src/intel/common/i915/intel_gem.c @@ -27,6 +27,9 @@ #include "i915/intel_engine.h" #include "drm-uapi/i915_drm.h" +#include "drm-uapi/dma-buf.h" + +#include bool i915_gem_create_context(int fd, uint32_t *context_id) @@ -309,3 +312,55 @@ i915_gem_can_render_on_fd(int fd) int val; return intel_gem_get_param(fd, I915_PARAM_CHIPSET_ID, &val) && val > 0; } + +bool +i915_gem_supports_dma_buf_sync_file(int fd) +{ + uint32_t handle = 0; + int err = 0, dma_buf_fd = -1; + + struct drm_i915_gem_create gem_create = { + .size = 64 << 10, + }; + if (intel_ioctl(fd, DRM_IOCTL_I915_GEM_CREATE, &gem_create)) + return false; + + handle = gem_create.handle; + + struct drm_prime_handle handle_to_fd = { + .handle = handle, + .flags = DRM_CLOEXEC | DRM_RDWR, + }; + err = intel_ioctl(fd, DRM_IOCTL_PRIME_HANDLE_TO_FD, &handle_to_fd); + if (err) + goto fail; + + dma_buf_fd = handle_to_fd.fd; + + struct dma_buf_export_sync_file export = { + .flags = DMA_BUF_SYNC_RW, + .fd = -1, + }; + err = intel_ioctl(dma_buf_fd, DMA_BUF_IOCTL_EXPORT_SYNC_FILE, &export); + if (err) + goto fail; + + struct dma_buf_import_sync_file import = { + .flags = DMA_BUF_SYNC_RW, + .fd = export.fd, + }; + err = intel_ioctl(dma_buf_fd, DMA_BUF_IOCTL_IMPORT_SYNC_FILE, &import); + close(export.fd); + +fail: + if (dma_buf_fd >= 0) + close(dma_buf_fd); + + if (handle != 0) { + struct drm_gem_close gem_close = { .handle = handle }; + err = intel_ioctl(fd, DRM_IOCTL_GEM_CLOSE, &gem_close); + assert(err == 0); + } + + return !err; +} diff --git a/src/intel/common/i915/intel_gem.h b/src/intel/common/i915/intel_gem.h index cb82e38c17a..a2af62bb21d 100644 --- a/src/intel/common/i915/intel_gem.h +++ b/src/intel/common/i915/intel_gem.h @@ -50,6 +50,7 @@ i915_gem_create_context_ext(int fd, bool i915_gem_supports_protected_context(int fd); bool i915_gem_get_param(int fd, uint32_t param, int *value); bool i915_gem_can_render_on_fd(int fd); +bool i915_gem_supports_dma_buf_sync_file(int fd); /** * A wrapper around DRM_IOCTL_I915_QUERY