summaryrefslogtreecommitdiff
path: root/drivers/video
diff options
context:
space:
mode:
authorRandy Li <randy.li@rock-chips.com>2017-10-31 17:09:00 +0800
committerTao Huang <huangtao@rock-chips.com>2018-08-20 11:46:40 +0800
commit9def402f5086582a8048d45fff634ab365f45030 (patch)
tree1a38caf3990362f2aa74280930e23a9f24318235 /drivers/video
parent057b63a64f4ca3fbf31e7537676093ce92d4d2bf (diff)
rockchip/mpp_service: use the same ioctl as vpu_service
It make all kernel version use the same ioctl defines. The compat ioctl doesn't support the customer ioctl of the mpp device. Change-Id: I018ec2eb48cd2ca4e211da7137781771b33bda15 Signed-off-by: Randy Li <randy.li@rock-chips.com>
Diffstat (limited to 'drivers/video')
-rw-r--r--drivers/video/rockchip/vpu/mpp_dev_common.c235
-rw-r--r--drivers/video/rockchip/vpu/mpp_dev_common.h16
-rw-r--r--drivers/video/rockchip/vpu/mpp_dev_h265e.h6
-rw-r--r--drivers/video/rockchip/vpu/mpp_dev_rkvenc.h2
4 files changed, 119 insertions, 140 deletions
diff --git a/drivers/video/rockchip/vpu/mpp_dev_common.c b/drivers/video/rockchip/vpu/mpp_dev_common.c
index 2dfdb1a17aec..1cf78ec1984d 100644
--- a/drivers/video/rockchip/vpu/mpp_dev_common.c
+++ b/drivers/video/rockchip/vpu/mpp_dev_common.c
@@ -171,11 +171,6 @@ int mpp_dev_common_ctx_init(struct rockchip_mpp_dev *mpp, struct mpp_ctx *cfg)
return 0;
}
-struct mpp_request {
- u32 *req;
- u32 size;
-};
-
#ifdef CONFIG_COMPAT
struct compat_mpp_request {
compat_uptr_t req;
@@ -482,151 +477,147 @@ static long mpp_dev_ioctl(struct file *filp, unsigned int cmd,
return -EINVAL;
switch (cmd) {
- case MPP_IOC_SET_CLIENT_TYPE:
+ case VPU_IOC_SET_CLIENT_TYPE:
break;
- case MPP_IOC_SET_REG:
- {
- struct mpp_request req;
- struct mpp_ctx *ctx;
-
- mpp_debug(DEBUG_IOCTL, "pid %d set reg\n",
- session->pid);
- if (copy_from_user(&req, (void __user *)arg,
- sizeof(struct mpp_request))) {
- mpp_err("error: set reg copy_from_user failed\n");
- return -EFAULT;
- }
- ctx = ctx_init(mpp, session, (void __user *)req.req,
- req.size);
- if (!ctx)
- return -EFAULT;
-
- mpp_srv_lock(mpp->srv);
- rockchip_mpp_try_run(mpp);
- mpp_srv_unlock(mpp->srv);
+ case VPU_IOC_SET_REG: {
+ struct vpu_request req;
+ struct mpp_ctx *ctx;
+
+ mpp_debug(DEBUG_IOCTL, "pid %d set reg\n",
+ session->pid);
+ if (copy_from_user(&req, (void __user *)arg,
+ sizeof(struct vpu_request))) {
+ mpp_err("error: set reg copy_from_user failed\n");
+ return -EFAULT;
}
- break;
- case MPP_IOC_GET_REG:
- {
- struct mpp_request req;
-
- mpp_debug(DEBUG_IOCTL, "pid %d get reg\n",
- session->pid);
- if (copy_from_user(&req, (void __user *)arg,
- sizeof(struct mpp_request))) {
- mpp_err("error: get reg copy_from_user failed\n");
- return -EFAULT;
- }
+ ctx = ctx_init(mpp, session, (void __user *)req.req,
+ req.size);
+ if (!ctx)
+ return -EFAULT;
- return mpp_dev_wait_result(session, mpp, req.req);
+ mpp_srv_lock(mpp->srv);
+ rockchip_mpp_try_run(mpp);
+ mpp_srv_unlock(mpp->srv);
+ } break;
+ case VPU_IOC_GET_REG: {
+ struct vpu_request req;
+
+ mpp_debug(DEBUG_IOCTL, "pid %d get reg\n",
+ session->pid);
+ if (copy_from_user(&req, (void __user *)arg,
+ sizeof(struct vpu_request))) {
+ mpp_err("error: get reg copy_from_user failed\n");
+ return -EFAULT;
}
- break;
- case MPP_IOC_PROBE_IOMMU_STATUS:
- {
- int iommu_enable = 1;
- mpp_debug(DEBUG_IOCTL, "VPU_IOC_PROBE_IOMMU_STATUS\n");
+ return mpp_dev_wait_result(session, mpp, req.req);
+ } break;
+ case VPU_IOC_PROBE_IOMMU_STATUS: {
+ int iommu_enable = 1;
- if (copy_to_user((void __user *)arg,
- &iommu_enable, sizeof(int))) {
- mpp_err("error: iommu status copy_to_user failed\n");
- return -EFAULT;
- }
- }
- break;
- default:
- {
- if (mpp->ops->ioctl)
- return mpp->ops->ioctl(session, cmd, arg);
+ mpp_debug(DEBUG_IOCTL, "VPU_IOC_PROBE_IOMMU_STATUS\n");
- mpp_err("unknown mpp ioctl cmd %x\n", cmd);
+ if (copy_to_user((void __user *)arg,
+ &iommu_enable, sizeof(int))) {
+ mpp_err("error: iommu status copy_to_user failed\n");
+ return -EFAULT;
}
break;
}
+ default: {
+ if (mpp->ops->ioctl)
+ return mpp->ops->ioctl(session, cmd, arg);
+
+ mpp_err("unknown mpp ioctl cmd %x\n", cmd);
+ return -ENOIOCTLCMD;
+ } break;
+ }
mpp_debug_leave();
return 0;
}
#ifdef CONFIG_COMPAT
-static long compat_mpp_dev_ioctl(struct file *filp, unsigned int cmd,
- unsigned long arg)
+#define VPU_IOC_SET_CLIENT_TYPE32 _IOW(VPU_IOC_MAGIC, 1, u32)
+#define VPU_IOC_GET_HW_FUSE_STATUS32 _IOW(VPU_IOC_MAGIC, 2, \
+ compat_ulong_t)
+#define VPU_IOC_SET_REG32 _IOW(VPU_IOC_MAGIC, 3, \
+ compat_ulong_t)
+#define VPU_IOC_GET_REG32 _IOW(VPU_IOC_MAGIC, 4, \
+ compat_ulong_t)
+#define VPU_IOC_PROBE_IOMMU_STATUS32 _IOR(VPU_IOC_MAGIC, 5, u32)
+
+static long native_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
- struct rockchip_mpp_dev *mpp =
- container_of(filp->f_path.dentry->d_inode->i_cdev,
- struct rockchip_mpp_dev, cdev);
- struct mpp_session *session = (struct mpp_session *)filp->private_data;
+ long ret = -ENOIOCTLCMD;
- mpp_debug_enter();
+ if (file->f_op->unlocked_ioctl)
+ ret = file->f_op->unlocked_ioctl(file, cmd, arg);
- if (!session)
- return -EINVAL;
+ return ret;
+}
+static long compat_mpp_dev_ioctl(struct file *file, unsigned int cmd,
+ unsigned long arg)
+{
+ struct vpu_request req;
+ void __user *up = compat_ptr(arg);
+ int compatible_arg = 1;
+ long err = 0;
+
+ mpp_debug_enter();
+ mpp_debug(DEBUG_IOCTL, "cmd %x, VPU_IOC_SET_CLIENT_TYPE32 %x\n", cmd,
+ (u32)VPU_IOC_SET_CLIENT_TYPE32);
+ /* First, convert the command. */
switch (cmd) {
- case MPP_IOC_SET_CLIENT_TYPE:
+ case VPU_IOC_SET_CLIENT_TYPE32:
+ cmd = VPU_IOC_SET_CLIENT_TYPE;
break;
- case MPP_IOC_SET_REG:
- {
- struct compat_mpp_request req;
- struct mpp_ctx *ctx;
-
- mpp_debug(DEBUG_IOCTL, "compat set reg\n");
- if (copy_from_user(&req, compat_ptr((compat_uptr_t)arg),
- sizeof(struct compat_mpp_request))) {
- mpp_err("compat set_reg copy_from_user failed\n");
- return -EFAULT;
- }
- ctx = ctx_init(mpp, session,
- compat_ptr((compat_uptr_t)req.req),
- req.size);
- if (!ctx)
- return -EFAULT;
-
- mpp_srv_lock(mpp->srv);
- rockchip_mpp_try_run(mpp);
- mpp_srv_unlock(mpp->srv);
- }
+ case VPU_IOC_GET_HW_FUSE_STATUS32:
+ cmd = VPU_IOC_GET_HW_FUSE_STATUS;
break;
- case MPP_IOC_GET_REG:
- {
- struct compat_mpp_request req;
-
- mpp_debug(DEBUG_IOCTL, "compat get reg\n");
- if (copy_from_user(&req, compat_ptr((compat_uptr_t)arg),
- sizeof(struct compat_mpp_request))) {
- mpp_err("compat get reg copy_from_user failed\n");
- return -EFAULT;
- }
-
- return mpp_dev_wait_result(session,
- mpp,
- compat_ptr((compat_uptr_t)req.req));
- }
+ case VPU_IOC_SET_REG32:
+ cmd = VPU_IOC_SET_REG;
break;
- case MPP_IOC_PROBE_IOMMU_STATUS:
- {
- int iommu_enable = 1;
-
- mpp_debug(DEBUG_IOCTL, "COMPAT_VPU_IOC_PROBE_IOMMU_STATUS\n");
-
- if (copy_to_user(compat_ptr((compat_uptr_t)arg),
- &iommu_enable, sizeof(int))) {
- mpp_err("error: VPU_IOC_PROBE_IOMMU_STATUS failed\n");
- return -EFAULT;
- }
- }
+ case VPU_IOC_GET_REG32:
+ cmd = VPU_IOC_GET_REG;
break;
- default:
- {
- if (mpp->ops->ioctl)
- return mpp->ops->ioctl(session, cmd, arg);
-
- mpp_err("unknown mpp ioctl cmd %x\n", cmd);
- }
+ case VPU_IOC_PROBE_IOMMU_STATUS32:
+ cmd = VPU_IOC_PROBE_IOMMU_STATUS;
break;
}
+ switch (cmd) {
+ case VPU_IOC_SET_REG:
+ case VPU_IOC_GET_REG:
+ case VPU_IOC_GET_HW_FUSE_STATUS: {
+ compat_uptr_t req_ptr;
+ struct compat_mpp_request __user *req32 = NULL;
+
+ req32 = (struct compat_mpp_request __user *)up;
+ memset(&req, 0, sizeof(req));
+
+ if (get_user(req_ptr, &req32->req) ||
+ get_user(req.size, &req32->size)) {
+ mpp_err("error: compat get hw status copy_from_user failed\n");
+ return -EFAULT;
+ }
+ req.req = compat_ptr(req_ptr);
+ compatible_arg = 0;
+ } break;
+ }
+
+ if (compatible_arg) {
+ err = native_ioctl(file, cmd, (unsigned long)up);
+ } else {
+ mm_segment_t old_fs = get_fs();
+
+ set_fs(KERNEL_DS);
+ err = native_ioctl(file, cmd, (unsigned long)&req);
+ set_fs(old_fs);
+ }
+
mpp_debug_leave();
- return 0;
+ return err;
}
#endif
diff --git a/drivers/video/rockchip/vpu/mpp_dev_common.h b/drivers/video/rockchip/vpu/mpp_dev_common.h
index d4d1897b7ac3..9142f5e76ea0 100644
--- a/drivers/video/rockchip/vpu/mpp_dev_common.h
+++ b/drivers/video/rockchip/vpu/mpp_dev_common.h
@@ -25,22 +25,10 @@
#include <linux/workqueue.h>
#include <linux/wakelock.h>
-extern int mpp_dev_debug;
-
-/*
- * Ioctl definitions
- */
+#include <video/rk_vpu_service.h>
-/* Use 'l' as magic number */
-#define MPP_IOC_MAGIC 'l'
-
-#define MPP_IOC_SET_CLIENT_TYPE _IOW(MPP_IOC_MAGIC, 1, u32)
-#define MPP_IOC_GET_HW_FUSE_STATUS _IOW(MPP_IOC_MAGIC, 2, u32)
-
-#define MPP_IOC_SET_REG _IOW(MPP_IOC_MAGIC, 3, u32)
-#define MPP_IOC_GET_REG _IOW(MPP_IOC_MAGIC, 4, u32)
+extern int mpp_dev_debug;
-#define MPP_IOC_PROBE_IOMMU_STATUS _IOR(MPP_IOC_MAGIC, 5, u32)
#define MPP_IOC_CUSTOM_BASE 0x1000
/*
diff --git a/drivers/video/rockchip/vpu/mpp_dev_h265e.h b/drivers/video/rockchip/vpu/mpp_dev_h265e.h
index a4a40c686b9e..39c3d73d2411 100644
--- a/drivers/video/rockchip/vpu/mpp_dev_h265e.h
+++ b/drivers/video/rockchip/vpu/mpp_dev_h265e.h
@@ -22,14 +22,14 @@
#include <linux/wakelock.h>
#define MPP_DEV_H265E_SET_COLOR_PALETTE \
- _IOW(MPP_IOC_MAGIC, MPP_IOC_CUSTOM_BASE + 1, u32)
+ _IOW(VPU_IOC_MAGIC, MPP_IOC_CUSTOM_BASE + 1, u32)
#define MPP_DEV_H265E_SET_PARAMETER \
- _IOW(MPP_IOC_MAGIC, \
+ _IOW(VPU_IOC_MAGIC, \
MPP_IOC_CUSTOM_BASE + 6, struct mpp_h265e_cfg)
#define MPP_DEV_H265E_GET_HEAD_PARAMETER \
- _IOW(MPP_IOC_MAGIC, \
+ _IOW(VPU_IOC_MAGIC, \
MPP_IOC_CUSTOM_BASE + 7, struct hal_h265e_header)
#define H265E_INSTANCE_NUM 4
diff --git a/drivers/video/rockchip/vpu/mpp_dev_rkvenc.h b/drivers/video/rockchip/vpu/mpp_dev_rkvenc.h
index a9fad2c86600..78edc6075aa9 100644
--- a/drivers/video/rockchip/vpu/mpp_dev_rkvenc.h
+++ b/drivers/video/rockchip/vpu/mpp_dev_rkvenc.h
@@ -33,7 +33,7 @@ struct rkvenc_osd_palette {
};
#define MPP_DEV_RKVENC_SET_COLOR_PALETTE \
- _IOW(MPP_IOC_MAGIC, MPP_IOC_CUSTOM_BASE + 1, \
+ _IOW(VPU_IOC_MAGIC, MPP_IOC_CUSTOM_BASE + 1, \
struct rkvenc_osd_palette)
struct rkvenc_config_elem {