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: Paul Cercueil <paul@crapouillou.net> Acked-by: Daniel Vetter <daniel.vetter@ffwll.ch> Acked-by: Christian König <christian.koenig@amd.com> Link: https://lore.kernel.org/r/20240130122340.54813-4-paul@crapouillou.net Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
799970a5b1
commit
7b07a2a7ca
@@ -86,6 +86,22 @@ struct usb_ext_prop_desc {
|
||||
__le16 wPropertyNameLength;
|
||||
} __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__
|
||||
|
||||
/*
|
||||
@@ -290,6 +306,31 @@ struct usb_functionfs_event {
|
||||
#define FUNCTIONFS_ENDPOINT_DESC _IOR('g', 130, \
|
||||
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__ */
|
||||
|
||||
Reference in New Issue
Block a user