2 * Copyright (C) 2010-2014, 2016 ARM Limited. All rights reserved.
4 * This program is free software and is provided to you under the terms of the GNU General Public License version 2
5 * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
7 * A copy of the licence is included with the program, and can also be obtained from Free Software
8 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
12 * @file ump_ukk_wrappers.c
13 * Defines the wrapper functions which turn Linux IOCTL calls into _ukk_ calls
16 #include <asm/uaccess.h> /* user space access */
19 #include "ump_uk_types.h"
21 #include "ump_kernel_common.h"
24 * IOCTL operation; Negotiate version of IOCTL API
26 int ump_get_api_version_wrapper(u32 __user *argument, struct ump_session_data *session_data)
28 _ump_uk_api_version_s version_info;
29 _mali_osk_errcode_t err;
31 /* Sanity check input parameters */
32 if (NULL == argument || NULL == session_data) {
33 MSG_ERR(("NULL parameter in ump_ioctl_get_api_version()\n"));
37 /* Copy the user space memory to kernel space (so we safely can read it) */
38 if (0 != copy_from_user(&version_info, argument, sizeof(version_info))) {
39 MSG_ERR(("copy_from_user() in ump_ioctl_get_api_version()\n"));
43 version_info.ctx = (void *) session_data;
44 err = _ump_uku_get_api_version(&version_info);
45 if (_MALI_OSK_ERR_OK != err) {
46 MSG_ERR(("_ump_uku_get_api_version() failed in ump_ioctl_get_api_version()\n"));
47 return ump_map_errcode(err);
50 version_info.ctx = NULL;
52 /* Copy ouput data back to user space */
53 if (0 != copy_to_user(argument, &version_info, sizeof(version_info))) {
54 MSG_ERR(("copy_to_user() failed in ump_ioctl_get_api_version()\n"));
58 return 0; /* success */
63 * IOCTL operation; Release reference to specified UMP memory.
65 int ump_release_wrapper(u32 __user *argument, struct ump_session_data *session_data)
67 _ump_uk_release_s release_args;
68 _mali_osk_errcode_t err;
70 /* Sanity check input parameters */
71 if (NULL == session_data) {
72 MSG_ERR(("NULL parameter in ump_ioctl_release()\n"));
76 /* Copy the user space memory to kernel space (so we safely can read it) */
77 if (0 != copy_from_user(&release_args, argument, sizeof(release_args))) {
78 MSG_ERR(("copy_from_user() in ump_ioctl_get_api_version()\n"));
82 release_args.ctx = (void *) session_data;
83 err = _ump_ukk_release(&release_args);
84 if (_MALI_OSK_ERR_OK != err) {
85 MSG_ERR(("_ump_ukk_release() failed in ump_ioctl_release()\n"));
86 return ump_map_errcode(err);
90 return 0; /* success */
94 * IOCTL operation; Return size for specified UMP memory.
96 int ump_size_get_wrapper(u32 __user *argument, struct ump_session_data *session_data)
98 _ump_uk_size_get_s user_interaction;
99 _mali_osk_errcode_t err;
101 /* Sanity check input parameters */
102 if (NULL == argument || NULL == session_data) {
103 MSG_ERR(("NULL parameter in ump_ioctl_size_get()\n"));
107 if (0 != copy_from_user(&user_interaction, argument, sizeof(user_interaction))) {
108 MSG_ERR(("copy_from_user() in ump_ioctl_size_get()\n"));
112 user_interaction.ctx = (void *) session_data;
113 err = _ump_ukk_size_get(&user_interaction);
114 if (_MALI_OSK_ERR_OK != err) {
115 MSG_ERR(("_ump_ukk_size_get() failed in ump_ioctl_size_get()\n"));
116 return ump_map_errcode(err);
119 user_interaction.ctx = NULL;
121 if (0 != copy_to_user(argument, &user_interaction, sizeof(user_interaction))) {
122 MSG_ERR(("copy_to_user() failed in ump_ioctl_size_get()\n"));
126 return 0; /* success */
130 * IOCTL operation; Do cache maintenance on specified UMP memory.
132 int ump_msync_wrapper(u32 __user *argument, struct ump_session_data *session_data)
134 _ump_uk_msync_s user_interaction;
136 /* Sanity check input parameters */
137 if (NULL == argument || NULL == session_data) {
138 MSG_ERR(("NULL parameter in ump_ioctl_size_get()\n"));
142 if (0 != copy_from_user(&user_interaction, argument, sizeof(user_interaction))) {
143 MSG_ERR(("copy_from_user() in ump_ioctl_msync()\n"));
147 user_interaction.ctx = (void *) session_data;
149 _ump_ukk_msync(&user_interaction);
151 user_interaction.ctx = NULL;
153 if (0 != copy_to_user(argument, &user_interaction, sizeof(user_interaction))) {
154 MSG_ERR(("copy_to_user() failed in ump_ioctl_msync()\n"));
158 return 0; /* success */
160 int ump_cache_operations_control_wrapper(u32 __user *argument, struct ump_session_data *session_data)
162 _ump_uk_cache_operations_control_s user_interaction;
164 /* Sanity check input parameters */
165 if (NULL == argument || NULL == session_data) {
166 MSG_ERR(("NULL parameter in ump_ioctl_size_get()\n"));
170 if (0 != copy_from_user(&user_interaction, argument, sizeof(user_interaction))) {
171 MSG_ERR(("copy_from_user() in ump_ioctl_cache_operations_control()\n"));
175 user_interaction.ctx = (void *) session_data;
177 _ump_ukk_cache_operations_control((_ump_uk_cache_operations_control_s *) &user_interaction);
179 user_interaction.ctx = NULL;
181 #if 0 /* No data to copy back */
182 if (0 != copy_to_user(argument, &user_interaction, sizeof(user_interaction))) {
183 MSG_ERR(("copy_to_user() failed in ump_ioctl_cache_operations_control()\n"));
187 return 0; /* success */
190 int ump_switch_hw_usage_wrapper(u32 __user *argument, struct ump_session_data *session_data)
192 _ump_uk_switch_hw_usage_s user_interaction;
194 /* Sanity check input parameters */
195 if (NULL == argument || NULL == session_data) {
196 MSG_ERR(("NULL parameter in ump_ioctl_size_get()\n"));
200 if (0 != copy_from_user(&user_interaction, argument, sizeof(user_interaction))) {
201 MSG_ERR(("copy_from_user() in ump_ioctl_switch_hw_usage()\n"));
205 user_interaction.ctx = (void *) session_data;
207 _ump_ukk_switch_hw_usage(&user_interaction);
209 user_interaction.ctx = NULL;
211 #if 0 /* No data to copy back */
212 if (0 != copy_to_user(argument, &user_interaction, sizeof(user_interaction))) {
213 MSG_ERR(("copy_to_user() failed in ump_ioctl_switch_hw_usage()\n"));
217 return 0; /* success */
220 int ump_lock_wrapper(u32 __user *argument, struct ump_session_data *session_data)
222 _ump_uk_lock_s user_interaction;
224 /* Sanity check input parameters */
225 if (NULL == argument || NULL == session_data) {
226 MSG_ERR(("NULL parameter in ump_ioctl_size_get()\n"));
230 if (0 != copy_from_user(&user_interaction, argument, sizeof(user_interaction))) {
231 MSG_ERR(("copy_from_user() in ump_ioctl_switch_hw_usage()\n"));
235 user_interaction.ctx = (void *) session_data;
237 _ump_ukk_lock(&user_interaction);
239 user_interaction.ctx = NULL;
241 #if 0 /* No data to copy back */
242 if (0 != copy_to_user(argument, &user_interaction, sizeof(user_interaction))) {
243 MSG_ERR(("copy_to_user() failed in ump_ioctl_switch_hw_usage()\n"));
248 return 0; /* success */
251 int ump_unlock_wrapper(u32 __user *argument, struct ump_session_data *session_data)
253 _ump_uk_unlock_s user_interaction;
255 /* Sanity check input parameters */
256 if (NULL == argument || NULL == session_data) {
257 MSG_ERR(("NULL parameter in ump_ioctl_size_get()\n"));
261 if (0 != copy_from_user(&user_interaction, argument, sizeof(user_interaction))) {
262 MSG_ERR(("copy_from_user() in ump_ioctl_switch_hw_usage()\n"));
266 user_interaction.ctx = (void *) session_data;
268 _ump_ukk_unlock(&user_interaction);
270 user_interaction.ctx = NULL;
272 #if 0 /* No data to copy back */
273 if (0 != copy_to_user(argument, &user_interaction, sizeof(user_interaction))) {
274 MSG_ERR(("copy_to_user() failed in ump_ioctl_switch_hw_usage()\n"));
279 return 0; /* success */