2 * Copyright (C) 2013 Google, Inc.
4 * This software is licensed under the terms of the GNU General Public
5 * License version 2, as published by the Free Software Foundation, and
6 * may be copied, distributed, and modified under those terms.
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
15 #include <linux/uaccess.h>
16 #include <video/adf.h>
19 #include "adf_fops32.h"
21 long adf_compat_post_config(struct file *file,
22 struct adf_post_config32 __user *arg)
24 struct adf_post_config32 cfg32;
25 struct adf_post_config __user *cfg;
28 if (copy_from_user(&cfg32, arg, sizeof(cfg32)))
31 cfg = compat_alloc_user_space(sizeof(*cfg));
32 if (!access_ok(VERIFY_WRITE, cfg, sizeof(*cfg)))
35 if (put_user(cfg32.n_interfaces, &cfg->n_interfaces) ||
36 put_user(compat_ptr(cfg32.interfaces),
38 put_user(cfg32.n_bufs, &cfg->n_bufs) ||
39 put_user(compat_ptr(cfg32.bufs), &cfg->bufs) ||
40 put_user(cfg32.custom_data_size,
41 &cfg->custom_data_size) ||
42 put_user(compat_ptr(cfg32.custom_data),
46 ret = adf_file_ioctl(file, ADF_POST_CONFIG, (unsigned long)cfg);
50 if (copy_in_user(&arg->complete_fence, &cfg->complete_fence,
51 sizeof(cfg->complete_fence)))
57 long adf_compat_get_device_data(struct file *file,
58 struct adf_device_data32 __user *arg)
60 struct adf_device_data32 data32;
61 struct adf_device_data __user *data;
64 if (copy_from_user(&data32, arg, sizeof(data32)))
67 data = compat_alloc_user_space(sizeof(*data));
68 if (!access_ok(VERIFY_WRITE, data, sizeof(*data)))
71 if (put_user(data32.n_attachments, &data->n_attachments) ||
72 put_user(compat_ptr(data32.attachments),
73 &data->attachments) ||
74 put_user(data32.n_allowed_attachments,
75 &data->n_allowed_attachments) ||
76 put_user(compat_ptr(data32.allowed_attachments),
77 &data->allowed_attachments) ||
78 put_user(data32.custom_data_size,
79 &data->custom_data_size) ||
80 put_user(compat_ptr(data32.custom_data),
84 ret = adf_file_ioctl(file, ADF_GET_DEVICE_DATA, (unsigned long)data);
88 if (copy_in_user(arg->name, data->name, sizeof(arg->name)) ||
89 copy_in_user(&arg->n_attachments, &data->n_attachments,
90 sizeof(arg->n_attachments)) ||
91 copy_in_user(&arg->n_allowed_attachments,
92 &data->n_allowed_attachments,
93 sizeof(arg->n_allowed_attachments)) ||
94 copy_in_user(&arg->custom_data_size,
95 &data->custom_data_size,
96 sizeof(arg->custom_data_size)))
102 long adf_compat_get_interface_data(struct file *file,
103 struct adf_interface_data32 __user *arg)
105 struct adf_interface_data32 data32;
106 struct adf_interface_data __user *data;
109 if (copy_from_user(&data32, arg, sizeof(data32)))
112 data = compat_alloc_user_space(sizeof(*data));
113 if (!access_ok(VERIFY_WRITE, data, sizeof(*data)))
116 if (put_user(data32.n_available_modes, &data->n_available_modes) ||
117 put_user(compat_ptr(data32.available_modes),
118 &data->available_modes) ||
119 put_user(data32.custom_data_size,
120 &data->custom_data_size) ||
121 put_user(compat_ptr(data32.custom_data),
125 ret = adf_file_ioctl(file, ADF_GET_INTERFACE_DATA, (unsigned long)data);
129 if (copy_in_user(arg->name, data->name, sizeof(arg->name)) ||
130 copy_in_user(&arg->type, &data->type,
131 sizeof(arg->type)) ||
132 copy_in_user(&arg->id, &data->id, sizeof(arg->id)) ||
133 copy_in_user(&arg->flags, &data->flags,
134 sizeof(arg->flags)) ||
135 copy_in_user(&arg->dpms_state, &data->dpms_state,
136 sizeof(arg->dpms_state)) ||
137 copy_in_user(&arg->hotplug_detect,
138 &data->hotplug_detect,
139 sizeof(arg->hotplug_detect)) ||
140 copy_in_user(&arg->width_mm, &data->width_mm,
141 sizeof(arg->width_mm)) ||
142 copy_in_user(&arg->height_mm, &data->height_mm,
143 sizeof(arg->height_mm)) ||
144 copy_in_user(&arg->current_mode, &data->current_mode,
145 sizeof(arg->current_mode)) ||
146 copy_in_user(&arg->n_available_modes,
147 &data->n_available_modes,
148 sizeof(arg->n_available_modes)) ||
149 copy_in_user(&arg->custom_data_size,
150 &data->custom_data_size,
151 sizeof(arg->custom_data_size)))
157 long adf_compat_get_overlay_engine_data(struct file *file,
158 struct adf_overlay_engine_data32 __user *arg)
160 struct adf_overlay_engine_data32 data32;
161 struct adf_overlay_engine_data __user *data;
164 if (copy_from_user(&data32, arg, sizeof(data32)))
167 data = compat_alloc_user_space(sizeof(*data));
168 if (!access_ok(VERIFY_WRITE, data, sizeof(*data)))
171 if (put_user(data32.n_supported_formats, &data->n_supported_formats) ||
172 put_user(compat_ptr(data32.supported_formats),
173 &data->supported_formats) ||
174 put_user(data32.custom_data_size,
175 &data->custom_data_size) ||
176 put_user(compat_ptr(data32.custom_data),
180 ret = adf_file_ioctl(file, ADF_GET_OVERLAY_ENGINE_DATA,
181 (unsigned long)data);
185 if (copy_in_user(arg->name, data->name, sizeof(arg->name)) ||
186 copy_in_user(&arg->n_supported_formats,
187 &data->n_supported_formats,
188 sizeof(arg->n_supported_formats)) ||
189 copy_in_user(&arg->custom_data_size,
190 &data->custom_data_size,
191 sizeof(arg->custom_data_size)))
197 long adf_file_compat_ioctl(struct file *file, unsigned int cmd,
201 case ADF_POST_CONFIG32:
202 return adf_compat_post_config(file, compat_ptr(arg));
204 case ADF_GET_DEVICE_DATA32:
205 return adf_compat_get_device_data(file, compat_ptr(arg));
207 case ADF_GET_INTERFACE_DATA32:
208 return adf_compat_get_interface_data(file, compat_ptr(arg));
210 case ADF_GET_OVERLAY_ENGINE_DATA32:
211 return adf_compat_get_overlay_engine_data(file,
215 return adf_file_ioctl(file, cmd, arg);