2 * This confidential and proprietary software may be used only as
3 * authorised by a licensing agreement from ARM Limited
4 * (C) COPYRIGHT 2009-2013 ARM Limited
6 * The entire notice above must be reproduced on all authorised
7 * copies and copies may only be made to the extent permitted
8 * by a licensing agreement from ARM Limited.
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 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 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 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 */