Commit 7b07a2a7 authored by Paul Cercueil's avatar Paul Cercueil Committed by Greg Kroah-Hartman

usb: gadget: functionfs: Add DMABUF import interface

This patch introduces three new ioctls. They all should be called on a
data endpoint (ie. not ep0). They are:

- FUNCTIONFS_DMABUF_ATTACH, which takes the file descriptor of a DMABUF
  object to attach to the endpoint.

- FUNCTIONFS_DMABUF_DETACH, which takes the file descriptor of the
  DMABUF to detach from the endpoint. Note that closing the endpoint's
  file descriptor will automatically detach all attached DMABUFs.

- FUNCTIONFS_DMABUF_TRANSFER, which requests a data transfer from / to
  the given DMABUF. Its argument is a structure that packs the DMABUF's
  file descriptor, the size in bytes to transfer (which should generally
  be set to the size of the DMABUF), and a 'flags' field which is unused
  for now.
  Before this ioctl can be used, the related DMABUF must be attached
  with FUNCTIONFS_DMABUF_ATTACH.

These three ioctls enable the FunctionFS code to transfer data between
the USB stack and a DMABUF object, which can be provided by a driver
from a completely different subsystem, in a zero-copy fashion.
Signed-off-by: default avatarPaul Cercueil <paul@crapouillou.net>
Acked-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
Acked-by: default avatarChristian König <christian.koenig@amd.com>
Link: https://lore.kernel.org/r/20240130122340.54813-4-paul@crapouillou.netSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 799970a5
...@@ -190,6 +190,7 @@ config USB_F_MASS_STORAGE ...@@ -190,6 +190,7 @@ config USB_F_MASS_STORAGE
tristate tristate
config USB_F_FS config USB_F_FS
select DMA_SHARED_BUFFER
tristate tristate
config USB_F_UAC1 config USB_F_UAC1
......
This diff is collapsed.
...@@ -86,6 +86,22 @@ struct usb_ext_prop_desc { ...@@ -86,6 +86,22 @@ struct usb_ext_prop_desc {
__le16 wPropertyNameLength; __le16 wPropertyNameLength;
} __attribute__((packed)); } __attribute__((packed));
/* Flags for usb_ffs_dmabuf_transfer_req->flags (none for now) */
#define USB_FFS_DMABUF_TRANSFER_MASK 0x0
/**
* struct usb_ffs_dmabuf_transfer_req - Transfer request for a DMABUF object
* @fd: file descriptor of the DMABUF object
* @flags: one or more USB_FFS_DMABUF_TRANSFER_* flags
* @length: number of bytes used in this DMABUF for the data transfer.
* Should generally be set to the DMABUF's size.
*/
struct usb_ffs_dmabuf_transfer_req {
int fd;
__u32 flags;
__u64 length;
} __attribute__((packed));
#ifndef __KERNEL__ #ifndef __KERNEL__
/* /*
...@@ -290,6 +306,31 @@ struct usb_functionfs_event { ...@@ -290,6 +306,31 @@ struct usb_functionfs_event {
#define FUNCTIONFS_ENDPOINT_DESC _IOR('g', 130, \ #define FUNCTIONFS_ENDPOINT_DESC _IOR('g', 130, \
struct usb_endpoint_descriptor) struct usb_endpoint_descriptor)
/*
* Attach the DMABUF object, identified by its file descriptor, to the
* data endpoint. Returns zero on success, and a negative errno value
* on error.
*/
#define FUNCTIONFS_DMABUF_ATTACH _IOW('g', 131, int)
/*
* Detach the given DMABUF object, identified by its file descriptor,
* from the data endpoint. Returns zero on success, and a negative
* errno value on error. Note that closing the endpoint's file
* descriptor will automatically detach all attached DMABUFs.
*/
#define FUNCTIONFS_DMABUF_DETACH _IOW('g', 132, int)
/*
* Enqueue the previously attached DMABUF to the transfer queue.
* The argument is a structure that packs the DMABUF's file descriptor,
* the size in bytes to transfer (which should generally correspond to
* the size of the DMABUF), and a 'flags' field which is unused
* for now. Returns zero on success, and a negative errno value on
* error.
*/
#define FUNCTIONFS_DMABUF_TRANSFER _IOW('g', 133, \
struct usb_ffs_dmabuf_transfer_req)
#endif /* _UAPI__LINUX_FUNCTIONFS_H__ */ #endif /* _UAPI__LINUX_FUNCTIONFS_H__ */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment