Commit 9f90381b authored by Rohit kumar's avatar Rohit kumar Committed by Greg Kroah-Hartman

staging/ion: Add support to get ion handle from dma buf

Currently we can only import dma buf fd's to get ion_handle.
Adding support to import dma buf handles to support kernel
specific use cases.

An example use case is in linux platforms such as Tizen, in which
DRM-GEM is used for buffer management for graphics. It has gem_handle
corresponding to a buffer and uses gem_name for sharing the buffer
with other processes. However,it also uses dma_buf fd for 3d operations.
For wayland, there are multiple calls for gem_handle to dma_buf fd
conversion. So, we store dma_buf associated with buffer. But, there is
no api for getting ion_handle from dma_buf. This patch exposes api to
retrieve the ion handle from dma_buf for similar use cases. With this
patch, we can integrate ION within DRM-GEM for buffer management and
dma_buf sharing.
Signed-off-by: default avatarRohit kumar <rohit.kr@samsung.com>
Reviewed-by: default avatarLaura Abbott <labbott@redhat.com>
Reviewed-by: default avatarSumit Semwal <sumit.semwal@linaro.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 323de43f
...@@ -1153,22 +1153,18 @@ int ion_share_dma_buf_fd(struct ion_client *client, struct ion_handle *handle) ...@@ -1153,22 +1153,18 @@ int ion_share_dma_buf_fd(struct ion_client *client, struct ion_handle *handle)
} }
EXPORT_SYMBOL(ion_share_dma_buf_fd); EXPORT_SYMBOL(ion_share_dma_buf_fd);
struct ion_handle *ion_import_dma_buf(struct ion_client *client, int fd) struct ion_handle *ion_import_dma_buf(struct ion_client *client,
struct dma_buf *dmabuf)
{ {
struct dma_buf *dmabuf;
struct ion_buffer *buffer; struct ion_buffer *buffer;
struct ion_handle *handle; struct ion_handle *handle;
int ret; int ret;
dmabuf = dma_buf_get(fd);
if (IS_ERR(dmabuf))
return ERR_CAST(dmabuf);
/* if this memory came from ion */ /* if this memory came from ion */
if (dmabuf->ops != &dma_buf_ops) { if (dmabuf->ops != &dma_buf_ops) {
pr_err("%s: can not import dmabuf from another exporter\n", pr_err("%s: can not import dmabuf from another exporter\n",
__func__); __func__);
dma_buf_put(dmabuf);
return ERR_PTR(-EINVAL); return ERR_PTR(-EINVAL);
} }
buffer = dmabuf->priv; buffer = dmabuf->priv;
...@@ -1196,11 +1192,25 @@ struct ion_handle *ion_import_dma_buf(struct ion_client *client, int fd) ...@@ -1196,11 +1192,25 @@ struct ion_handle *ion_import_dma_buf(struct ion_client *client, int fd)
} }
end: end:
dma_buf_put(dmabuf);
return handle; return handle;
} }
EXPORT_SYMBOL(ion_import_dma_buf); EXPORT_SYMBOL(ion_import_dma_buf);
struct ion_handle *ion_import_dma_buf_fd(struct ion_client *client, int fd)
{
struct dma_buf *dmabuf;
struct ion_handle *handle;
dmabuf = dma_buf_get(fd);
if (IS_ERR(dmabuf))
return ERR_CAST(dmabuf);
handle = ion_import_dma_buf(client, dmabuf);
dma_buf_put(dmabuf);
return handle;
}
EXPORT_SYMBOL(ion_import_dma_buf_fd);
static int ion_sync_for_device(struct ion_client *client, int fd) static int ion_sync_for_device(struct ion_client *client, int fd)
{ {
struct dma_buf *dmabuf; struct dma_buf *dmabuf;
...@@ -1308,7 +1318,7 @@ static long ion_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) ...@@ -1308,7 +1318,7 @@ static long ion_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
{ {
struct ion_handle *handle; struct ion_handle *handle;
handle = ion_import_dma_buf(client, data.fd.fd); handle = ion_import_dma_buf_fd(client, data.fd.fd);
if (IS_ERR(handle)) if (IS_ERR(handle))
ret = PTR_ERR(handle); ret = PTR_ERR(handle);
else else
......
...@@ -192,14 +192,26 @@ struct dma_buf *ion_share_dma_buf(struct ion_client *client, ...@@ -192,14 +192,26 @@ struct dma_buf *ion_share_dma_buf(struct ion_client *client,
int ion_share_dma_buf_fd(struct ion_client *client, struct ion_handle *handle); int ion_share_dma_buf_fd(struct ion_client *client, struct ion_handle *handle);
/** /**
* ion_import_dma_buf() - given an dma-buf fd from the ion exporter get handle * ion_import_dma_buf() - get ion_handle from dma-buf
* @client: the client
* @dmabuf: the dma-buf
*
* Get the ion_buffer associated with the dma-buf and return the ion_handle.
* If no ion_handle exists for this buffer, return newly created ion_handle.
* If dma-buf from another exporter is passed, return ERR_PTR(-EINVAL)
*/
struct ion_handle *ion_import_dma_buf(struct ion_client *client,
struct dma_buf *dmabuf);
/**
* ion_import_dma_buf_fd() - given a dma-buf fd from the ion exporter get handle
* @client: the client * @client: the client
* @fd: the dma-buf fd * @fd: the dma-buf fd
* *
* Given an dma-buf fd that was allocated through ion via ion_share_dma_buf, * Given an dma-buf fd that was allocated through ion via ion_share_dma_buf_fd,
* import that fd and return a handle representing it. If a dma-buf from * import that fd and return a handle representing it. If a dma-buf from
* another exporter is passed in this function will return ERR_PTR(-EINVAL) * another exporter is passed in this function will return ERR_PTR(-EINVAL)
*/ */
struct ion_handle *ion_import_dma_buf(struct ion_client *client, int fd); struct ion_handle *ion_import_dma_buf_fd(struct ion_client *client, int fd);
#endif /* _LINUX_ION_H */ #endif /* _LINUX_ION_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