aboutsummaryrefslogtreecommitdiff
path: root/drivers/video
diff options
context:
space:
mode:
authorGreg Hackmann <ghackmann@google.com>2013-06-11 12:59:41 -0700
committerColin Cross <ccross@android.com>2014-03-19 13:10:31 -0700
commite50df0bf0d9d0d3c181b518857da13f53e85f730 (patch)
tree812a836cf9d3ebb7dedf30dd1226596be9e8d7fb /drivers/video
parent764ad522ac9fa99f7a74257cd79ec46c8f23f087 (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.c6
-rw-r--r--drivers/video/adf/adf_fops.c36
-rw-r--r--drivers/video/adf/adf_fops32.c9
-rw-r--r--drivers/video/adf/adf_fops32.h3
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;
};