diff options
author | Greg Hackmann <ghackmann@google.com> | 2013-06-11 12:59:41 -0700 |
---|---|---|
committer | Colin Cross <ccross@android.com> | 2014-03-19 13:10:31 -0700 |
commit | e50df0bf0d9d0d3c181b518857da13f53e85f730 (patch) | |
tree | 812a836cf9d3ebb7dedf30dd1226596be9e8d7fb /drivers/video | |
parent | 764ad522ac9fa99f7a74257cd79ec46c8f23f087 (diff) |
video: adf: add supported formats to adf_overlay_engine_data
Change-Id: If2aa783b9ece60160f465bf697508fc58682e1bc
Signed-off-by: Greg Hackmann <ghackmann@google.com>
Diffstat (limited to 'drivers/video')
-rw-r--r-- | drivers/video/adf/adf.c | 6 | ||||
-rw-r--r-- | drivers/video/adf/adf_fops.c | 36 | ||||
-rw-r--r-- | drivers/video/adf/adf_fops32.c | 9 | ||||
-rw-r--r-- | drivers/video/adf/adf_fops32.h | 3 |
4 files changed, 49 insertions, 5 deletions
diff --git a/drivers/video/adf/adf.c b/drivers/video/adf/adf.c index 4e359602748f..15fbc4a0d53b 100644 --- a/drivers/video/adf/adf.c +++ b/drivers/video/adf/adf.c @@ -756,6 +756,12 @@ int adf_overlay_engine_init(struct adf_overlay_engine *eng, return -EINVAL; } + if (ops->n_supported_formats > ADF_MAX_SUPPORTED_FORMATS) { + pr_err("%s: overlay engine supports too many formats\n", + __func__); + return -EINVAL; + } + if (adf_overlay_engine_has_custom_formats(ops) && !dev->ops->validate_custom_format) { pr_err("%s: overlay engine has custom formats but parent device %s does not implement validate_custom_format\n", diff --git a/drivers/video/adf/adf_fops.c b/drivers/video/adf/adf_fops.c index d2e30c9cddcf..343bdcc77443 100644 --- a/drivers/video/adf/adf_fops.c +++ b/drivers/video/adf/adf_fops.c @@ -105,6 +105,8 @@ static int adf_eng_get_data(struct adf_overlay_engine *eng, { struct adf_device *dev = adf_overlay_engine_parent(eng); struct adf_overlay_engine_data data; + size_t n_supported_formats; + u32 *supported_formats = NULL; int ret = 0; if (copy_from_user(&data, arg, sizeof(data))) @@ -112,18 +114,44 @@ static int adf_eng_get_data(struct adf_overlay_engine *eng, strlcpy(data.name, eng->base.name, sizeof(data.name)); + if (data.n_supported_formats > ADF_MAX_SUPPORTED_FORMATS) + return -EINVAL; + + n_supported_formats = data.n_supported_formats; + data.n_supported_formats = eng->ops->n_supported_formats; + + if (n_supported_formats) { + supported_formats = kzalloc(n_supported_formats * + sizeof(supported_formats[0]), GFP_KERNEL); + if (!supported_formats) + return -ENOMEM; + } + + memcpy(supported_formats, eng->ops->supported_formats, + sizeof(u32) * min(n_supported_formats, + eng->ops->n_supported_formats)); + mutex_lock(&dev->client_lock); ret = adf_obj_copy_custom_data_to_user(&eng->base, arg->custom_data, &data.custom_data_size); mutex_unlock(&dev->client_lock); if (ret < 0) - return ret; + goto done; - if (copy_to_user(arg, &data, sizeof(data))) - return -EFAULT; + if (copy_to_user(arg, &data, sizeof(data))) { + ret = -EFAULT; + goto done; + } - return 0; + if (supported_formats && copy_to_user(arg->supported_formats, + supported_formats, + n_supported_formats * sizeof(supported_formats[0]))) + ret = -EFAULT; + +done: + kfree(supported_formats); + return ret; } static int adf_buffer_import(struct adf_device *dev, diff --git a/drivers/video/adf/adf_fops32.c b/drivers/video/adf/adf_fops32.c index a7d5381295e9..2ecf8c8001f3 100644 --- a/drivers/video/adf/adf_fops32.c +++ b/drivers/video/adf/adf_fops32.c @@ -166,7 +166,11 @@ long adf_compat_get_overlay_engine_data(struct file *file, if (!access_ok(VERIFY_WRITE, data, sizeof(*data))) return -EFAULT; - if (put_user(data32.custom_data_size, &data->custom_data_size) || + if (put_user(data32.n_supported_formats, &data->n_supported_formats) || + put_user(compat_ptr(data32.supported_formats), + &data->supported_formats) || + put_user(data32.custom_data_size, + &data->custom_data_size) || put_user(compat_ptr(data32.custom_data), &data->custom_data)) return -EFAULT; @@ -177,6 +181,9 @@ long adf_compat_get_overlay_engine_data(struct file *file, return ret; if (copy_in_user(arg->name, data->name, sizeof(arg->name)) || + copy_in_user(&arg->n_supported_formats, + &data->n_supported_formats, + sizeof(arg->n_supported_formats)) || copy_in_user(&arg->custom_data_size, &data->custom_data_size, sizeof(arg->custom_data_size))) diff --git a/drivers/video/adf/adf_fops32.h b/drivers/video/adf/adf_fops32.h index c3e9c2282100..8d0413274bcd 100644 --- a/drivers/video/adf/adf_fops32.h +++ b/drivers/video/adf/adf_fops32.h @@ -64,6 +64,9 @@ struct adf_interface_data32 { struct adf_overlay_engine_data32 { char name[ADF_NAME_LEN]; + compat_size_t n_supported_formats; + compat_uptr_t supported_formats; + compat_size_t custom_data_size; compat_uptr_t custom_data; }; |