xen/gntdev: Add initial support for dma-buf UAPI
Add UAPI and IOCTLs for dma-buf grant device driver extension: the extension allows userspace processes and kernel modules to use Xen backed dma-buf implementation. With this extension grant references to the pages of an imported dma-buf can be exported for other domain use and grant references coming from a foreign domain can be converted into a local dma-buf for local export. Implement basic initialization and stubs for Xen DMA buffers' support. Signed-off-by: Oleksandr Andrushchenko <oleksandr_andrushchenko@epam.com> Reviewed-by: Boris Ostrovsky <boris.ostrovsky@oracle.com> Signed-off-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
This commit is contained in:

committed by
Boris Ostrovsky

parent
1d31456755
commit
932d656217
@@ -5,6 +5,7 @@
|
||||
* Interface to /dev/xen/gntdev.
|
||||
*
|
||||
* Copyright (c) 2007, D G Murray
|
||||
* Copyright (c) 2018, Oleksandr Andrushchenko, EPAM Systems Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License version 2
|
||||
@@ -215,4 +216,94 @@ struct ioctl_gntdev_grant_copy {
|
||||
*/
|
||||
#define GNTDEV_DMA_FLAG_COHERENT (1 << 1)
|
||||
|
||||
/*
|
||||
* Create a dma-buf [1] from grant references @refs of count @count provided
|
||||
* by the foreign domain @domid with flags @flags.
|
||||
*
|
||||
* By default dma-buf is backed by system memory pages, but by providing
|
||||
* one of the GNTDEV_DMA_FLAG_XXX flags it can also be created as
|
||||
* a DMA write-combine or coherent buffer, e.g. allocated with dma_alloc_wc/
|
||||
* dma_alloc_coherent.
|
||||
*
|
||||
* Returns 0 if dma-buf was successfully created and the corresponding
|
||||
* dma-buf's file descriptor is returned in @fd.
|
||||
*
|
||||
* [1] Documentation/driver-api/dma-buf.rst
|
||||
*/
|
||||
|
||||
#define IOCTL_GNTDEV_DMABUF_EXP_FROM_REFS \
|
||||
_IOC(_IOC_NONE, 'G', 9, \
|
||||
sizeof(struct ioctl_gntdev_dmabuf_exp_from_refs))
|
||||
struct ioctl_gntdev_dmabuf_exp_from_refs {
|
||||
/* IN parameters. */
|
||||
/* Specific options for this dma-buf: see GNTDEV_DMA_FLAG_XXX. */
|
||||
__u32 flags;
|
||||
/* Number of grant references in @refs array. */
|
||||
__u32 count;
|
||||
/* OUT parameters. */
|
||||
/* File descriptor of the dma-buf. */
|
||||
__u32 fd;
|
||||
/* The domain ID of the grant references to be mapped. */
|
||||
__u32 domid;
|
||||
/* Variable IN parameter. */
|
||||
/* Array of grant references of size @count. */
|
||||
__u32 refs[1];
|
||||
};
|
||||
|
||||
/*
|
||||
* This will block until the dma-buf with the file descriptor @fd is
|
||||
* released. This is only valid for buffers created with
|
||||
* IOCTL_GNTDEV_DMABUF_EXP_FROM_REFS.
|
||||
*
|
||||
* If within @wait_to_ms milliseconds the buffer is not released
|
||||
* then -ETIMEDOUT error is returned.
|
||||
* If the buffer with the file descriptor @fd does not exist or has already
|
||||
* been released, then -ENOENT is returned. For valid file descriptors
|
||||
* this must not be treated as error.
|
||||
*/
|
||||
#define IOCTL_GNTDEV_DMABUF_EXP_WAIT_RELEASED \
|
||||
_IOC(_IOC_NONE, 'G', 10, \
|
||||
sizeof(struct ioctl_gntdev_dmabuf_exp_wait_released))
|
||||
struct ioctl_gntdev_dmabuf_exp_wait_released {
|
||||
/* IN parameters */
|
||||
__u32 fd;
|
||||
__u32 wait_to_ms;
|
||||
};
|
||||
|
||||
/*
|
||||
* Import a dma-buf with file descriptor @fd and export granted references
|
||||
* to the pages of that dma-buf into array @refs of size @count.
|
||||
*/
|
||||
#define IOCTL_GNTDEV_DMABUF_IMP_TO_REFS \
|
||||
_IOC(_IOC_NONE, 'G', 11, \
|
||||
sizeof(struct ioctl_gntdev_dmabuf_imp_to_refs))
|
||||
struct ioctl_gntdev_dmabuf_imp_to_refs {
|
||||
/* IN parameters. */
|
||||
/* File descriptor of the dma-buf. */
|
||||
__u32 fd;
|
||||
/* Number of grant references in @refs array. */
|
||||
__u32 count;
|
||||
/* The domain ID for which references to be granted. */
|
||||
__u32 domid;
|
||||
/* Reserved - must be zero. */
|
||||
__u32 reserved;
|
||||
/* OUT parameters. */
|
||||
/* Array of grant references of size @count. */
|
||||
__u32 refs[1];
|
||||
};
|
||||
|
||||
/*
|
||||
* This will close all references to the imported buffer with file descriptor
|
||||
* @fd, so it can be released by the owner. This is only valid for buffers
|
||||
* created with IOCTL_GNTDEV_DMABUF_IMP_TO_REFS.
|
||||
*/
|
||||
#define IOCTL_GNTDEV_DMABUF_IMP_RELEASE \
|
||||
_IOC(_IOC_NONE, 'G', 12, \
|
||||
sizeof(struct ioctl_gntdev_dmabuf_imp_release))
|
||||
struct ioctl_gntdev_dmabuf_imp_release {
|
||||
/* IN parameters */
|
||||
__u32 fd;
|
||||
__u32 reserved;
|
||||
};
|
||||
|
||||
#endif /* __LINUX_PUBLIC_GNTDEV_H__ */
|
||||
|
Reference in New Issue
Block a user