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 <veeras@codeaurora.org>
This commit is contained in:
Veera Sundaram Sankaran 2014-09-04 17:11:41 -07:00 committed by David Keitel
parent 0d64d690b7
commit fca1e87999
2 changed files with 99 additions and 2 deletions

View file

@ -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);

View file

@ -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 {
};