gpu: ion: Add ion_share_dma_buf_kernel

Message ID 1355157897-24290-1-git-send-email-johan.mossberg@stericsson.com
State New
Headers show

Commit Message

Johan Mossberg Dec. 10, 2012, 4:44 p.m.
ion_share_dma_buf_kernel enables you to share ion buffers via dma buf
for kernel only use cases. Useful for example when a GPU driver using
ion wants to share its output buffers with a 3d party display
controller driver supporting dma buf.

Signed-off-by: Johan Mossberg <johan.mossberg@stericsson.com>
---
 drivers/gpu/ion/ion.c | 18 ++++++++++++++++--
 include/linux/ion.h   |  8 ++++++++
 2 files changed, 24 insertions(+), 2 deletions(-)

Comments

Rebecca Schultz Zavin Dec. 11, 2012, 11:14 p.m. | #1
On Mon, Dec 10, 2012 at 8:44 AM, Johan Mossberg
<johan.mossberg@stericsson.com> wrote:
> ion_share_dma_buf_kernel enables you to share ion buffers via dma buf
> for kernel only use cases. Useful for example when a GPU driver using
> ion wants to share its output buffers with a 3d party display
> controller driver supporting dma buf.
>
> Signed-off-by: Johan Mossberg <johan.mossberg@stericsson.com>
> ---
>  drivers/gpu/ion/ion.c | 18 ++++++++++++++++--
>  include/linux/ion.h   |  8 ++++++++
>  2 files changed, 24 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/gpu/ion/ion.c b/drivers/gpu/ion/ion.c
> index 748ff7d..31bb5e1 100644
> --- a/drivers/gpu/ion/ion.c
> +++ b/drivers/gpu/ion/ion.c
> @@ -991,12 +991,12 @@ struct dma_buf_ops dma_buf_ops = {
>         .kunmap = ion_dma_buf_kunmap,
>  };
>
> -int ion_share_dma_buf(struct ion_client *client, struct ion_handle *handle)
> +struct dma_buf *ion_share_dma_buf_kernel(struct ion_client *client,
> +                                               struct ion_handle *handle)
>  {
>         struct ion_buffer *buffer;
>         struct dma_buf *dmabuf;
>         bool valid_handle;
> -       int fd;
>
>         mutex_lock(&client->lock);
>         valid_handle = ion_handle_validate(client, handle);
> @@ -1013,6 +1013,20 @@ int ion_share_dma_buf(struct ion_client *client, struct ion_handle *handle)
>                 ion_buffer_put(buffer);
>                 return PTR_ERR(dmabuf);

Now that this function returns a ptr instead of an int you need to
just return dmabuf and to fix the error case above to return ERR_PTR
or you'll get compiler warnings here.

>         }
> +
> +       return dmabuf;
> +}
> +EXPORT_SYMBOL(ion_share_dma_buf_kernel);
> +
> +int ion_share_dma_buf(struct ion_client *client, struct ion_handle *handle)
> +{
> +       struct dma_buf *dmabuf;
> +       int fd;
> +
> +       dmabuf = ion_share_dma_buf_kernel(client, handle);
> +       if (IS_ERR(dmabuf))
> +               return PTR_ERR(dmabuf);
> +
>         fd = dma_buf_fd(dmabuf, O_CLOEXEC);
>         if (fd < 0)
>                 dma_buf_put(dmabuf);
> diff --git a/include/linux/ion.h b/include/linux/ion.h
> index 3ccc75a..cfb831d 100644
> --- a/include/linux/ion.h
> +++ b/include/linux/ion.h
> @@ -210,6 +210,14 @@ void *ion_map_kernel(struct ion_client *client, struct ion_handle *handle);
>  void ion_unmap_kernel(struct ion_client *client, struct ion_handle *handle);
>
>  /**
> + * ion_share_dma_buf_kernel() - share buffer as dma-buf
> + * @client:    the client
> + * @handle:    the handle
> + */
> +struct dma_buf *ion_share_dma_buf_kernel(struct ion_client *client,
> +                                                       struct ion_handle *buf);
> +
> +/**
>   * ion_share_dma_buf() - given an ion client, create a dma-buf fd
>   * @client:    the client
>   * @handle:    the handle
> --
> 1.8.0
>
>
> _______________________________________________
> Linaro-mm-sig mailing list
> Linaro-mm-sig@lists.linaro.org
> http://lists.linaro.org/mailman/listinfo/linaro-mm-sig

Patch hide | download patch | download mbox

diff --git a/drivers/gpu/ion/ion.c b/drivers/gpu/ion/ion.c
index 748ff7d..31bb5e1 100644
--- a/drivers/gpu/ion/ion.c
+++ b/drivers/gpu/ion/ion.c
@@ -991,12 +991,12 @@  struct dma_buf_ops dma_buf_ops = {
 	.kunmap = ion_dma_buf_kunmap,
 };
 
-int ion_share_dma_buf(struct ion_client *client, struct ion_handle *handle)
+struct dma_buf *ion_share_dma_buf_kernel(struct ion_client *client,
+						struct ion_handle *handle)
 {
 	struct ion_buffer *buffer;
 	struct dma_buf *dmabuf;
 	bool valid_handle;
-	int fd;
 
 	mutex_lock(&client->lock);
 	valid_handle = ion_handle_validate(client, handle);
@@ -1013,6 +1013,20 @@  int ion_share_dma_buf(struct ion_client *client, struct ion_handle *handle)
 		ion_buffer_put(buffer);
 		return PTR_ERR(dmabuf);
 	}
+
+	return dmabuf;
+}
+EXPORT_SYMBOL(ion_share_dma_buf_kernel);
+
+int ion_share_dma_buf(struct ion_client *client, struct ion_handle *handle)
+{
+	struct dma_buf *dmabuf;
+	int fd;
+
+	dmabuf = ion_share_dma_buf_kernel(client, handle);
+	if (IS_ERR(dmabuf))
+		return PTR_ERR(dmabuf);
+
 	fd = dma_buf_fd(dmabuf, O_CLOEXEC);
 	if (fd < 0)
 		dma_buf_put(dmabuf);
diff --git a/include/linux/ion.h b/include/linux/ion.h
index 3ccc75a..cfb831d 100644
--- a/include/linux/ion.h
+++ b/include/linux/ion.h
@@ -210,6 +210,14 @@  void *ion_map_kernel(struct ion_client *client, struct ion_handle *handle);
 void ion_unmap_kernel(struct ion_client *client, struct ion_handle *handle);
 
 /**
+ * ion_share_dma_buf_kernel() - share buffer as dma-buf
+ * @client:	the client
+ * @handle:	the handle
+ */
+struct dma_buf *ion_share_dma_buf_kernel(struct ion_client *client,
+							struct ion_handle *buf);
+
+/**
  * ion_share_dma_buf() - given an ion client, create a dma-buf fd
  * @client:	the client
  * @handle:	the handle