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.
Showing the changes to include/uapi (1 of 3 files). Show all
Unified · Split
| @@ -86,6 +86,22 @@ struct usb_ext_prop_desc { · 85 unmodified lines | |||
| 86 | __le16 wPropertyNameLength; | 86 | __le16 wPropertyNameLength; |
| 87 | } __attribute__((packed)); | 87 | } __attribute__((packed)); |
| 88 | 88 | ||
| 89 | /* Flags for usb_ffs_dmabuf_transfer_req->flags (none for now) */ | ||
| 90 | #define USB_FFS_DMABUF_TRANSFER_MASK 0x0 | ||
| 91 | |||
| 92 | /** | ||
| 93 | * struct usb_ffs_dmabuf_transfer_req - Transfer request for a DMABUF object | ||
| 94 | * @fd: file descriptor of the DMABUF object | ||
| 95 | * @flags: one or more USB_FFS_DMABUF_TRANSFER_* flags | ||
| 96 | * @length: number of bytes used in this DMABUF for the data transfer. | ||
| 97 | * Should generally be set to the DMABUF's size. | ||
| 98 | */ | ||
| 99 | struct usb_ffs_dmabuf_transfer_req { | ||
| 100 | int fd; | ||
| 101 | __u32 flags; | ||
| 102 | __u64 length; | ||
| 103 | } __attribute__((packed)); | ||
| 104 | |||
| 89 | #ifndef __KERNEL__ | 105 | #ifndef __KERNEL__ |
| 90 | 106 | ||
| 91 | /* | 107 | /* |
| @@ -290,6 +306,31 @@ struct usb_functionfs_event { · 198 unmodified lines | |||
| 290 | #define FUNCTIONFS_ENDPOINT_DESC _IOR('g', 130, \ | 306 | #define FUNCTIONFS_ENDPOINT_DESC _IOR('g', 130, \ |
| 291 | struct usb_endpoint_descriptor) | 307 | struct usb_endpoint_descriptor) |
| 292 | 308 | ||
| 309 | /* | ||
| 310 | * Attach the DMABUF object, identified by its file descriptor, to the | ||
| 311 | * data endpoint. Returns zero on success, and a negative errno value | ||
| 312 | * on error. | ||
| 313 | */ | ||
| 314 | #define FUNCTIONFS_DMABUF_ATTACH _IOW('g', 131, int) | ||
| 315 | |||
| 293 | 316 | ||
| 317 | /* | ||
| 318 | * Detach the given DMABUF object, identified by its file descriptor, | ||
| 319 | * from the data endpoint. Returns zero on success, and a negative | ||
| 320 | * errno value on error. Note that closing the endpoint's file | ||
| 321 | * descriptor will automatically detach all attached DMABUFs. | ||
| 322 | */ | ||
| 323 | #define FUNCTIONFS_DMABUF_DETACH _IOW('g', 132, int) | ||
| 324 | |||
| 325 | /* | ||
| 326 | * Enqueue the previously attached DMABUF to the transfer queue. | ||
| 327 | * The argument is a structure that packs the DMABUF's file descriptor, | ||
| 328 | * the size in bytes to transfer (which should generally correspond to | ||
| 329 | * the size of the DMABUF), and a 'flags' field which is unused | ||
| 330 | * for now. Returns zero on success, and a negative errno value on | ||
| 331 | * error. | ||
| 332 | */ | ||
| 333 | #define FUNCTIONFS_DMABUF_TRANSFER _IOW('g', 133, \ | ||
| 334 | struct usb_ffs_dmabuf_transfer_req) | ||
| 294 | 335 | ||
| 295 | #endif /* _UAPI__LINUX_FUNCTIONFS_H__ */ | 336 | #endif /* _UAPI__LINUX_FUNCTIONFS_H__ */ |