diff options
| author | Rom Lemarchand <romlem@google.com> | 2013-10-24 05:39:34 -0700 | 
|---|---|---|
| committer | Rom Lemarchand <romlem@google.com> | 2013-10-24 15:13:42 -0700 | 
| commit | a402f70ff3c94edb73b9f5670b5a55a27b1f1f00 (patch) | |
| tree | 52464ec3b65519cec95ce3efe71a804700a56d16 /drivers/gpu | |
| parent | dcd2da8015c7ac2da6f57fc0d8c15b80e44c4aed (diff) | |
| download | olio-linux-3.10-a402f70ff3c94edb73b9f5670b5a55a27b1f1f00.tar.xz olio-linux-3.10-a402f70ff3c94edb73b9f5670b5a55a27b1f1f00.zip | |
ion: add compat_ioctl
Add a compat_ioctl to the ion driver
Change-Id: I43da387e22ff9c4a29f0159dfe9e898efc500553
Signed-off-by: Rom Lemarchand <romlem@google.com>
Diffstat (limited to 'drivers/gpu')
| -rw-r--r-- | drivers/gpu/ion/Makefile | 3 | ||||
| -rw-r--r-- | drivers/gpu/ion/compat_ion.c | 172 | ||||
| -rw-r--r-- | drivers/gpu/ion/compat_ion.h | 30 | ||||
| -rw-r--r-- | drivers/gpu/ion/ion.c | 2 | 
4 files changed, 207 insertions, 0 deletions
| diff --git a/drivers/gpu/ion/Makefile b/drivers/gpu/ion/Makefile index ce0f1ef1c23..9c956659124 100644 --- a/drivers/gpu/ion/Makefile +++ b/drivers/gpu/ion/Makefile @@ -1,3 +1,6 @@  obj-$(CONFIG_ION) +=	ion.o ion_heap.o ion_page_pool.o ion_system_heap.o \  			ion_carveout_heap.o ion_chunk_heap.o ion_cma_heap.o +ifdef CONFIG_COMPAT +obj-$(CONFIG_ION) += compat_ion.o +endif  obj-$(CONFIG_ION_TEGRA) += tegra/ diff --git a/drivers/gpu/ion/compat_ion.c b/drivers/gpu/ion/compat_ion.c new file mode 100644 index 00000000000..e0d2839952a --- /dev/null +++ b/drivers/gpu/ion/compat_ion.c @@ -0,0 +1,172 @@ +/* + * drivers/gpu/ion/compat_ion.c + * + * Copyright (C) 2013 Google, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + */ + +#include <linux/ion.h> +#include <linux/compat.h> +#include <linux/fs.h> +#include <linux/uaccess.h> + +#include "compat_ion.h" + +/* See include/linux/ion.h for the definition of these structs */ +struct compat_ion_allocation_data { +	compat_size_t len; +	compat_size_t align; +	compat_uint_t heap_id_mask; +	compat_uint_t flags; +	compat_int_t handle; +}; + +struct compat_ion_custom_data { +	compat_uint_t cmd; +	compat_ulong_t arg; +}; + +static int compat_get_ion_allocation_data( +			struct compat_ion_allocation_data __user *data32, +			struct ion_allocation_data __user *data) +{ +	compat_size_t s; +	compat_uint_t u; +	compat_int_t i; +	int err; + +	err = get_user(s, &data32->len); +	err |= put_user(s, &data->len); +	err |= get_user(s, &data32->align); +	err |= put_user(s, &data->align); +	err |= get_user(u, &data32->heap_id_mask); +	err |= put_user(u, &data->heap_id_mask); +	err |= get_user(u, &data32->flags); +	err |= put_user(u, &data->flags); +	err |= get_user(i, &data32->handle); +	err |= put_user(i, &data->handle); + +	return err; +} + +static int compat_put_ion_allocation_data( +			struct compat_ion_allocation_data __user *data32, +			struct ion_allocation_data __user *data) +{ +	compat_size_t s; +	compat_uint_t u; +	compat_int_t i; +	int err; + +	err = get_user(s, &data->len); +	err |= put_user(s, &data32->len); +	err |= get_user(s, &data->align); +	err |= put_user(s, &data32->align); +	err |= get_user(u, &data->heap_id_mask); +	err |= put_user(u, &data32->heap_id_mask); +	err |= get_user(u, &data->flags); +	err |= put_user(u, &data32->flags); +	err |= get_user(i, &data->handle); +	err |= put_user(i, &data32->handle); + +	return err; +} + +static int compat_get_ion_custom_data( +			struct compat_ion_custom_data __user *data32, +			struct ion_custom_data __user *data) +{ +        compat_uint_t cmd; +        compat_ulong_t arg; +	int err; + +	err = get_user(cmd, &data32->cmd); +	err |= put_user(cmd, &data->cmd); +	err |= get_user(arg, &data32->arg); +	err |= put_user(arg, &data->arg); + +	return err; +}; + +long compat_ion_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) +{ +	long ret; + +	if (!filp->f_op || !filp->f_op->unlocked_ioctl) +		return -ENOTTY; + +	switch (cmd) { +	case ION_IOC_ALLOC: +	{ +		struct compat_ion_allocation_data __user *data32; +		struct ion_allocation_data __user *data; +		int err; + +		data32 = compat_ptr(arg); +		data = compat_alloc_user_space(sizeof(*data)); +		if (data == NULL) +			return -EFAULT; + +		err = compat_get_ion_allocation_data(data32, data); +		if (err) +			return err; + +		ret = filp->f_op->unlocked_ioctl(filp, cmd, +							(unsigned long)data); +		err = compat_put_ion_allocation_data(data32, data); +		return ret ? ret : err; +	} +	case ION_IOC_FREE: +	{ +		struct compat_ion_allocation_data __user *data32; +		struct ion_allocation_data __user *data; +		int err; + +		data32 = compat_ptr(arg); +		data = compat_alloc_user_space(sizeof(*data)); +		if (data == NULL) +			return -EFAULT; + +		err = compat_get_ion_allocation_data(data32, data); +		if (err) +			return err; + +		return filp->f_op->unlocked_ioctl(filp, cmd, +							(unsigned long)data); +	} +	case ION_IOC_CUSTOM: { +		struct compat_ion_custom_data __user *data32; +		struct ion_custom_data __user *data; +		int err; + +		data32 = compat_ptr(arg); +		data = compat_alloc_user_space(sizeof(*data)); +		if (data == NULL) +			return -EFAULT; + +		err = compat_get_ion_custom_data(data32, data); +		if (err) +			return err; + +		return filp->f_op->unlocked_ioctl(filp, cmd, +							(unsigned long)data); +	} +	case ION_IOC_SHARE: +	case ION_IOC_MAP: +	case ION_IOC_IMPORT: +	case ION_IOC_SYNC: +		return filp->f_op->unlocked_ioctl(filp, cmd, +						(unsigned long)compat_ptr(arg)); +	default: +		return -ENOIOCTLCMD; +	} +} diff --git a/drivers/gpu/ion/compat_ion.h b/drivers/gpu/ion/compat_ion.h new file mode 100644 index 00000000000..3a9c8c08c24 --- /dev/null +++ b/drivers/gpu/ion/compat_ion.h @@ -0,0 +1,30 @@ +/* + + * drivers/gpu/ion/compat_ion.h + * + * Copyright (C) 2013 Google, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + */ + +#ifndef _LINUX_COMPAT_ION_H +#define _LINUX_COMPAT_ION_H + +#if IS_ENABLED(CONFIG_COMPAT) + +long compat_ion_ioctl(struct file *filp, unsigned int cmd, unsigned long arg); + +#else + +#define compat_ion_ioctl  NULL + +#endif /* CONFIG_COMPAT */ +#endif /* _LINUX_COMPAT_ION_H */ diff --git a/drivers/gpu/ion/ion.c b/drivers/gpu/ion/ion.c index c4d0a487823..e4ffc9d5b94 100644 --- a/drivers/gpu/ion/ion.c +++ b/drivers/gpu/ion/ion.c @@ -38,6 +38,7 @@  #include <linux/idr.h>  #include "ion_priv.h" +#include "compat_ion.h"  /**   * struct ion_device - the metadata of the ion device node @@ -1256,6 +1257,7 @@ static const struct file_operations ion_fops = {  	.open           = ion_open,  	.release        = ion_release,  	.unlocked_ioctl = ion_ioctl, +	.compat_ioctl   = compat_ion_ioctl,  };  static size_t ion_debug_heap_total(struct ion_client *client, |