Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

drm: Enable PRIME import/export for all drivers

Call drm_gem_prime_handle_to_fd() and drm_gem_prime_fd_to_handle() by
default if no PRIME import/export helpers have been set. Both functions
are the default for almost all drivers.

DRM drivers implement struct drm_driver.gem_prime_import_sg_table
to import dma-buf objects from other drivers. Having the function
drm_gem_prime_fd_to_handle() functions set by default allows each
driver to import dma-buf objects to itself, even without support for
other drivers.

For drm_gem_prime_handle_to_fd() it is similar: using it by default
allows each driver to export to itself, even without support for other
drivers.

This functionality enables userspace to share per-driver buffers
across process boundaries via PRIME (e.g., wlroots requires this
functionality). The patch generalizes a pattern that has previously
been implemented by GEM VRAM helpers [1] to work with any driver.
For example, gma500 can now run the wlroots-based sway compositor.

v2:
* clean up docs and TODO comments (Simon, Zack)
* clean up style in drm_getcap()

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Link: https://lore.kernel.org/dri-devel/20230302143502.500661-1-contact@emersion.fr/ # 1
Reviewed-by: Simon Ser <contact@emersion.fr>
Acked-by: Alex Deucher <alexander.deucher@amd.com>
Reviewed-by: Jeffrey Hugo <quic_jhugo@quicinc.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20230620080252.16368-2-tzimmermann@suse.de

+15 -21
+1 -2
drivers/gpu/drm/drm_ioctl.c
··· 245 245 req->value = 1; 246 246 return 0; 247 247 case DRM_CAP_PRIME: 248 - req->value |= dev->driver->prime_fd_to_handle ? DRM_PRIME_CAP_IMPORT : 0; 249 - req->value |= dev->driver->prime_handle_to_fd ? DRM_PRIME_CAP_EXPORT : 0; 248 + req->value = DRM_PRIME_CAP_IMPORT | DRM_PRIME_CAP_EXPORT; 250 249 return 0; 251 250 case DRM_CAP_SYNCOBJ: 252 251 req->value = drm_core_check_feature(dev, DRIVER_SYNCOBJ);
+12 -9
drivers/gpu/drm/drm_prime.c
··· 372 372 { 373 373 struct drm_prime_handle *args = data; 374 374 375 - if (!dev->driver->prime_fd_to_handle) 376 - return -ENOSYS; 375 + if (dev->driver->prime_fd_to_handle) { 376 + return dev->driver->prime_fd_to_handle(dev, file_priv, args->fd, 377 + &args->handle); 378 + } 377 379 378 - return dev->driver->prime_fd_to_handle(dev, file_priv, 379 - args->fd, &args->handle); 380 + return drm_gem_prime_fd_to_handle(dev, file_priv, args->fd, &args->handle); 380 381 } 381 382 382 383 static struct dma_buf *export_and_register_object(struct drm_device *dev, ··· 519 518 { 520 519 struct drm_prime_handle *args = data; 521 520 522 - if (!dev->driver->prime_handle_to_fd) 523 - return -ENOSYS; 524 - 525 521 /* check flags are valid */ 526 522 if (args->flags & ~(DRM_CLOEXEC | DRM_RDWR)) 527 523 return -EINVAL; 528 524 529 - return dev->driver->prime_handle_to_fd(dev, file_priv, 530 - args->handle, args->flags, &args->fd); 525 + if (dev->driver->prime_handle_to_fd) { 526 + return dev->driver->prime_handle_to_fd(dev, file_priv, 527 + args->handle, args->flags, 528 + &args->fd); 529 + } 530 + return drm_gem_prime_handle_to_fd(dev, file_priv, args->handle, 531 + args->flags, &args->fd); 531 532 } 532 533 533 534 /**
+2 -10
include/drm/drm_drv.h
··· 304 304 /** 305 305 * @prime_handle_to_fd: 306 306 * 307 - * Main PRIME export function. Should be implemented with 308 - * drm_gem_prime_handle_to_fd() for GEM based drivers. 309 - * 310 - * For an in-depth discussion see :ref:`PRIME buffer sharing 311 - * documentation <prime_buffer_sharing>`. 307 + * PRIME export function. Only used by vmwgfx. 312 308 */ 313 309 int (*prime_handle_to_fd)(struct drm_device *dev, struct drm_file *file_priv, 314 310 uint32_t handle, uint32_t flags, int *prime_fd); 315 311 /** 316 312 * @prime_fd_to_handle: 317 313 * 318 - * Main PRIME import function. Should be implemented with 319 - * drm_gem_prime_fd_to_handle() for GEM based drivers. 320 - * 321 - * For an in-depth discussion see :ref:`PRIME buffer sharing 322 - * documentation <prime_buffer_sharing>`. 314 + * PRIME import function. Only used by vmwgfx. 323 315 */ 324 316 int (*prime_fd_to_handle)(struct drm_device *dev, struct drm_file *file_priv, 325 317 int prime_fd, uint32_t *handle);