Commit | Line | Data |
---|---|---|
6fa3eb70 S |
1 | /* |
2 | * This confidential and proprietary software may be used only as | |
3 | * authorised by a licensing agreement from ARM Limited | |
bdc132d7 | 4 | * (C) COPYRIGHT 2008-2015 ARM Limited |
6fa3eb70 S |
5 | * ALL RIGHTS RESERVED |
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. | |
9 | */ | |
10 | #include <linux/fs.h> /* file system operations */ | |
11 | #include <linux/slab.h> /* memort allocation functions */ | |
12 | #include <asm/uaccess.h> /* user space access */ | |
13 | ||
14 | #include "mali_ukk.h" | |
15 | #include "mali_osk.h" | |
16 | #include "mali_kernel_common.h" | |
17 | #include "mali_session.h" | |
18 | #include "mali_ukk_wrappers.h" | |
19 | ||
20 | int get_api_version_wrapper(struct mali_session_data *session_data, _mali_uk_get_api_version_s __user *uargs) | |
21 | { | |
22 | _mali_uk_get_api_version_s kargs; | |
23 | _mali_osk_errcode_t err; | |
24 | ||
25 | MALI_CHECK_NON_NULL(uargs, -EINVAL); | |
26 | ||
27 | if (0 != get_user(kargs.version, &uargs->version)) return -EFAULT; | |
28 | ||
bdc132d7 | 29 | kargs.ctx = (uintptr_t)session_data; |
6fa3eb70 S |
30 | err = _mali_ukk_get_api_version(&kargs); |
31 | if (_MALI_OSK_ERR_OK != err) return map_errcode(err); | |
32 | ||
33 | if (0 != put_user(kargs.version, &uargs->version)) return -EFAULT; | |
34 | if (0 != put_user(kargs.compatible, &uargs->compatible)) return -EFAULT; | |
35 | ||
36 | return 0; | |
37 | } | |
38 | ||
bdc132d7 S |
39 | int get_api_version_v2_wrapper(struct mali_session_data *session_data, _mali_uk_get_api_version_v2_s __user *uargs) |
40 | { | |
41 | _mali_uk_get_api_version_v2_s kargs; | |
42 | _mali_osk_errcode_t err; | |
43 | ||
44 | MALI_CHECK_NON_NULL(uargs, -EINVAL); | |
45 | ||
46 | if (0 != get_user(kargs.version, &uargs->version)) return -EFAULT; | |
47 | ||
48 | kargs.ctx = (uintptr_t)session_data; | |
49 | err = _mali_ukk_get_api_version_v2(&kargs); | |
50 | if (_MALI_OSK_ERR_OK != err) return map_errcode(err); | |
51 | ||
52 | if (0 != put_user(kargs.version, &uargs->version)) return -EFAULT; | |
53 | if (0 != put_user(kargs.compatible, &uargs->compatible)) return -EFAULT; | |
54 | ||
55 | return 0; | |
56 | } | |
57 | ||
6fa3eb70 S |
58 | int wait_for_notification_wrapper(struct mali_session_data *session_data, _mali_uk_wait_for_notification_s __user *uargs) |
59 | { | |
60 | _mali_uk_wait_for_notification_s kargs; | |
61 | _mali_osk_errcode_t err; | |
62 | ||
63 | MALI_CHECK_NON_NULL(uargs, -EINVAL); | |
64 | ||
bdc132d7 | 65 | kargs.ctx = (uintptr_t)session_data; |
6fa3eb70 S |
66 | err = _mali_ukk_wait_for_notification(&kargs); |
67 | if (_MALI_OSK_ERR_OK != err) return map_errcode(err); | |
68 | ||
bdc132d7 S |
69 | if (_MALI_NOTIFICATION_CORE_SHUTDOWN_IN_PROGRESS != kargs.type) { |
70 | kargs.ctx = (uintptr_t)NULL; /* prevent kernel address to be returned to user space */ | |
6fa3eb70 S |
71 | if (0 != copy_to_user(uargs, &kargs, sizeof(_mali_uk_wait_for_notification_s))) return -EFAULT; |
72 | } else { | |
73 | if (0 != put_user(kargs.type, &uargs->type)) return -EFAULT; | |
74 | } | |
75 | ||
76 | return 0; | |
77 | } | |
78 | ||
79 | int post_notification_wrapper(struct mali_session_data *session_data, _mali_uk_post_notification_s __user *uargs) | |
80 | { | |
81 | _mali_uk_post_notification_s kargs; | |
82 | _mali_osk_errcode_t err; | |
83 | ||
84 | MALI_CHECK_NON_NULL(uargs, -EINVAL); | |
85 | ||
bdc132d7 | 86 | kargs.ctx = (uintptr_t)session_data; |
6fa3eb70 S |
87 | |
88 | if (0 != get_user(kargs.type, &uargs->type)) { | |
89 | return -EFAULT; | |
90 | } | |
91 | ||
92 | err = _mali_ukk_post_notification(&kargs); | |
93 | if (_MALI_OSK_ERR_OK != err) { | |
94 | return map_errcode(err); | |
95 | } | |
96 | ||
97 | return 0; | |
98 | } | |
99 | ||
100 | int get_user_settings_wrapper(struct mali_session_data *session_data, _mali_uk_get_user_settings_s __user *uargs) | |
101 | { | |
102 | _mali_uk_get_user_settings_s kargs; | |
103 | _mali_osk_errcode_t err; | |
104 | ||
105 | MALI_CHECK_NON_NULL(uargs, -EINVAL); | |
106 | ||
bdc132d7 | 107 | kargs.ctx = (uintptr_t)session_data; |
6fa3eb70 S |
108 | err = _mali_ukk_get_user_settings(&kargs); |
109 | if (_MALI_OSK_ERR_OK != err) { | |
110 | return map_errcode(err); | |
111 | } | |
112 | ||
bdc132d7 | 113 | kargs.ctx = 0; /* prevent kernel address to be returned to user space */ |
6fa3eb70 S |
114 | if (0 != copy_to_user(uargs, &kargs, sizeof(_mali_uk_get_user_settings_s))) return -EFAULT; |
115 | ||
116 | return 0; | |
117 | } | |
118 | ||
119 | int request_high_priority_wrapper(struct mali_session_data *session_data, _mali_uk_request_high_priority_s __user *uargs) | |
120 | { | |
121 | _mali_uk_request_high_priority_s kargs; | |
122 | _mali_osk_errcode_t err; | |
123 | ||
124 | MALI_CHECK_NON_NULL(uargs, -EINVAL); | |
125 | ||
bdc132d7 | 126 | kargs.ctx = (uintptr_t)session_data; |
6fa3eb70 S |
127 | err = _mali_ukk_request_high_priority(&kargs); |
128 | ||
bdc132d7 | 129 | kargs.ctx = 0; |
6fa3eb70 S |
130 | |
131 | return map_errcode(err); | |
132 | } |