From 4255b3e268bce86dc31548c43a1104801a6db597 Mon Sep 17 00:00:00 2001 From: CMY Date: Tue, 25 Feb 2014 15:31:10 +0800 Subject: [PATCH] rk: ion: support shared buffer between processes without Binder --- .../android/ion/rockchip/rockchip_ion.c | 42 +++++++++++++++++++ include/linux/rockchip_ion.h | 17 ++++++++ 2 files changed, 59 insertions(+) diff --git a/drivers/staging/android/ion/rockchip/rockchip_ion.c b/drivers/staging/android/ion/rockchip/rockchip_ion.c index 553134b83a9c..c3b6148ab178 100755 --- a/drivers/staging/android/ion/rockchip/rockchip_ion.c +++ b/drivers/staging/android/ion/rockchip/rockchip_ion.c @@ -20,6 +20,7 @@ #include #include #include "../ion_priv.h" +#include #ifdef CONFIG_OF #include @@ -194,6 +195,47 @@ static long rockchip_custom_ioctl (struct ion_client *client, unsigned int cmd, return -EFAULT; break; } + case ION_IOC_GET_SHARE: + { + struct ion_share_obj_data data; + struct dma_buf *dmabuf = NULL; + + if (copy_from_user(&data, (void __user *)arg, + sizeof(struct ion_share_obj_data))) + return -EFAULT; + + dmabuf = dma_buf_get(data.fd); + if (IS_ERR(dmabuf)) + return PTR_ERR(dmabuf); + + data.obj = (void*)dmabuf; + dma_buf_put(dmabuf); + + if (copy_to_user((void __user *)arg, &data, sizeof(struct ion_share_obj_data))) + return -EFAULT; + + break; + } + case ION_IOC_SET_SHARE: + { + struct ion_share_obj_data data; + int fd = 0; + + if (copy_from_user(&data, (void __user *)arg, + sizeof(struct ion_share_obj_data))) + return -EFAULT; + + fd = dma_buf_fd((struct dma_buf*)data.obj, O_CLOEXEC); + if (fd < 0) + return fd; + + data.fd = fd; + + if (copy_to_user((void __user *)arg, &data, sizeof(struct ion_share_obj_data))) + return -EFAULT; + + break; + } default: return -ENOTTY; } diff --git a/include/linux/rockchip_ion.h b/include/linux/rockchip_ion.h index e9341a5a65d2..4e78235cba31 100644 --- a/include/linux/rockchip_ion.h +++ b/include/linux/rockchip_ion.h @@ -70,6 +70,11 @@ struct ion_phys_data { unsigned long size; }; +struct ion_share_obj_data { + int fd; + void *obj; +}; + #define ION_IOC_ROCKCHIP_MAGIC 'R' /** @@ -94,4 +99,16 @@ struct ion_phys_data { #define ION_IOC_GET_PHYS _IOWR(ION_IOC_ROCKCHIP_MAGIC, 3, \ struct ion_phys_data) +/** + * Get share object of the fd specified. + */ +#define ION_IOC_GET_SHARE _IOWR(ION_IOC_ROCKCHIP_MAGIC, 4, \ + struct ion_share_obj_data) + +/** + * Set share object and associate new fd. + */ +#define ION_IOC_SET_SHARE _IOWR(ION_IOC_ROCKCHIP_MAGIC, 5, \ + struct ion_share_obj_data) + #endif -- 2.34.1