From fca1e879992a8fe9392f7ac9ea5ff418f893346e Mon Sep 17 00:00:00 2001 From: Veera Sundaram Sankaran Date: Thu, 4 Sep 2014 17:11:41 -0700 Subject: [PATCH] msm: mdss: Added compat utils support for cursor ioctl For programming the hwcursor through the cursor ioctl in msm8994 needs the compat utils support to make the data compatible Change-Id: If4c05e103f90f04a6ac7475b4d3bc584290934ac Signed-off-by: Veera Sundaram Sankaran --- drivers/video/fbdev/msm/mdss_compat_utils.c | 80 ++++++++++++++++++++- drivers/video/fbdev/msm/mdss_compat_utils.h | 21 ++++++ 2 files changed, 99 insertions(+), 2 deletions(-) diff --git a/drivers/video/fbdev/msm/mdss_compat_utils.c b/drivers/video/fbdev/msm/mdss_compat_utils.c index 4aee04b948dc..48d0f11e8671 100644 --- a/drivers/video/fbdev/msm/mdss_compat_utils.c +++ b/drivers/video/fbdev/msm/mdss_compat_utils.c @@ -25,6 +25,7 @@ #include "mdss_mdp_hwio.h" #include "mdss_mdp.h" +#define MSMFB_CURSOR32 _IOW(MSMFB_IOCTL_MAGIC, 130, struct fb_cursor32) #define MSMFB_SET_LUT32 _IOW(MSMFB_IOCTL_MAGIC, 131, struct fb_cmap32) #define MSMFB_HISTOGRAM32 _IOWR(MSMFB_IOCTL_MAGIC, 132,\ struct mdp_histogram_data32) @@ -55,6 +56,9 @@ static unsigned int __do_compat_ioctl_nr(unsigned int cmd32) unsigned int cmd; switch (cmd32) { + case MSMFB_CURSOR32: + cmd = MSMFB_CURSOR; + break; case MSMFB_SET_LUT32: cmd = MSMFB_SET_LUT; break; @@ -150,6 +154,79 @@ static int mdss_fb_compat_buf_sync(struct fb_info *info, unsigned int cmd, return ret; } +static int __from_user_fb_cmap(struct fb_cmap __user *cmap, + struct fb_cmap32 __user *cmap32) +{ + __u32 data; + + if (copy_in_user(&cmap->start, &cmap32->start, 2 * sizeof(__u32))) + return -EFAULT; + + if (get_user(data, &cmap32->red) || + put_user(compat_ptr(data), &cmap->red) || + get_user(data, &cmap32->green) || + put_user(compat_ptr(data), &cmap->green) || + get_user(data, &cmap32->blue) || + put_user(compat_ptr(data), &cmap->blue) || + get_user(data, &cmap32->transp) || + put_user(compat_ptr(data), &cmap->transp)) + return -EFAULT; + + return 0; +} + +static int __from_user_fb_image(struct fb_image __user *image, + struct fb_image32 __user *image32) +{ + __u32 data; + + if (copy_in_user(&image->dx, &image32->dx, 6 * sizeof(u32)) || + copy_in_user(&image->depth, &image32->depth, sizeof(u8))) + return -EFAULT; + + if (get_user(data, &image32->data) || + put_user(compat_ptr(data), &image->data)) + return -EFAULT; + + if (__from_user_fb_cmap(&image->cmap, &image32->cmap)) + return -EFAULT; + + return 0; +} + +static int mdss_fb_compat_cursor(struct fb_info *info, unsigned int cmd, + unsigned long arg) +{ + struct fb_cursor32 __user *cursor32; + struct fb_cursor __user *cursor; + __u32 data; + int ret; + + cursor = compat_alloc_user_space(sizeof(*cursor)); + if (!cursor) { + pr_err("%s:%u: compat alloc error [%zu] bytes\n", + __func__, __LINE__, sizeof(*cursor)); + return -EINVAL; + } + cursor32 = compat_ptr(arg); + + if (copy_in_user(&cursor->set, &cursor32->set, 3 * sizeof(u16))) + return -EFAULT; + + if (get_user(data, &cursor32->mask) || + put_user(compat_ptr(data), &cursor->mask)) + return -EFAULT; + + if (copy_in_user(&cursor->hot, &cursor32->hot, sizeof(struct fbcurpos))) + return -EFAULT; + + if (__from_user_fb_image(&cursor->image, &cursor32->image)) + return -EFAULT; + + ret = mdss_fb_do_ioctl(info, cmd, (unsigned long) cursor); + return ret; +} + static int mdss_fb_compat_set_lut(struct fb_info *info, unsigned long arg) { struct fb_cmap_user __user *cmap; @@ -2618,8 +2695,7 @@ int mdss_fb_compat_ioctl(struct fb_info *info, unsigned int cmd, cmd = __do_compat_ioctl_nr(cmd); switch (cmd) { case MSMFB_CURSOR: - pr_debug("%s: MSMFB_CURSOR not supported\n", __func__); - ret = -ENOSYS; + ret = mdss_fb_compat_cursor(info, cmd, arg); break; case MSMFB_SET_LUT: ret = mdss_fb_compat_set_lut(info, arg); diff --git a/drivers/video/fbdev/msm/mdss_compat_utils.h b/drivers/video/fbdev/msm/mdss_compat_utils.h index b244ae7918ab..c7ce95a29cd9 100644 --- a/drivers/video/fbdev/msm/mdss_compat_utils.h +++ b/drivers/video/fbdev/msm/mdss_compat_utils.h @@ -33,6 +33,27 @@ struct fb_cmap32 { compat_caddr_t transp; }; +struct fb_image32 { + u32 dx; + u32 dy; + u32 width; + u32 height; + u32 fg_color; + u32 bg_color; + u8 depth; + compat_caddr_t data; + struct fb_cmap32 cmap; +}; + +struct fb_cursor32 { + u16 set; + u16 enable; + u16 rop; + compat_caddr_t mask; + struct fbcurpos hot; + struct fb_image32 image; +}; + struct mdp_ccs32 { };