1 /*
2  * Copyright (c) 2015-2018, ARM Limited and Contributors. All rights reserved.
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
7 /*!
8  * File containing client-side RPC functions for the RM service. These
9  * functions are ported to clients that communicate to the SC.
10  *
11  * @addtogroup RM_SVC
12  * @{
13  */
14 
15 /* Includes */
16 
17 #include <stdlib.h>
18 
19 #include <sci/sci_types.h>
20 #include <sci/svc/rm/sci_rm_api.h>
21 #include <sci/sci_rpc.h>
22 
23 #include "sci_rm_rpc.h"
24 
25 /* Local Defines */
26 
27 /* Local Types */
28 
29 /* Local Functions */
30 
sc_rm_partition_alloc(sc_ipc_t ipc,sc_rm_pt_t * pt,sc_bool_t secure,sc_bool_t isolated,sc_bool_t restricted,sc_bool_t grant,sc_bool_t coherent)31 sc_err_t sc_rm_partition_alloc(sc_ipc_t ipc, sc_rm_pt_t *pt, sc_bool_t secure,
32 			       sc_bool_t isolated, sc_bool_t restricted,
33 			       sc_bool_t grant, sc_bool_t coherent)
34 {
35 	sc_rpc_msg_t msg;
36 	uint8_t result;
37 
38 	RPC_VER(&msg) = SC_RPC_VERSION;
39 	RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_RM;
40 	RPC_FUNC(&msg) = (uint8_t)RM_FUNC_PARTITION_ALLOC;
41 	RPC_U8(&msg, 0U) = (uint8_t)secure;
42 	RPC_U8(&msg, 1U) = (uint8_t)isolated;
43 	RPC_U8(&msg, 2U) = (uint8_t)restricted;
44 	RPC_U8(&msg, 3U) = (uint8_t)grant;
45 	RPC_U8(&msg, 4U) = (uint8_t)coherent;
46 	RPC_SIZE(&msg) = 3U;
47 
48 	sc_call_rpc(ipc, &msg, SC_FALSE);
49 
50 	result = RPC_R8(&msg);
51 	if (pt != NULL) {
52 		*pt = RPC_U8(&msg, 0U);
53 	}
54 
55 	return (sc_err_t)result;
56 }
57 
sc_rm_set_confidential(sc_ipc_t ipc,sc_rm_pt_t pt,sc_bool_t retro)58 sc_err_t sc_rm_set_confidential(sc_ipc_t ipc, sc_rm_pt_t pt, sc_bool_t retro)
59 {
60 	sc_rpc_msg_t msg;
61 	uint8_t result;
62 
63 	RPC_VER(&msg) = SC_RPC_VERSION;
64 	RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_RM;
65 	RPC_FUNC(&msg) = (uint8_t)RM_FUNC_SET_CONFIDENTIAL;
66 	RPC_U8(&msg, 0U) = (uint8_t)pt;
67 	RPC_U8(&msg, 1U) = (uint8_t)retro;
68 	RPC_SIZE(&msg) = 2U;
69 
70 	sc_call_rpc(ipc, &msg, SC_FALSE);
71 
72 	result = RPC_R8(&msg);
73 	return (sc_err_t)result;
74 }
75 
sc_rm_partition_free(sc_ipc_t ipc,sc_rm_pt_t pt)76 sc_err_t sc_rm_partition_free(sc_ipc_t ipc, sc_rm_pt_t pt)
77 {
78 	sc_rpc_msg_t msg;
79 	uint8_t result;
80 
81 	RPC_VER(&msg) = SC_RPC_VERSION;
82 	RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_RM;
83 	RPC_FUNC(&msg) = (uint8_t)RM_FUNC_PARTITION_FREE;
84 	RPC_U8(&msg, 0U) = (uint8_t)pt;
85 	RPC_SIZE(&msg) = 2U;
86 
87 	sc_call_rpc(ipc, &msg, SC_FALSE);
88 
89 	result = RPC_R8(&msg);
90 	return (sc_err_t)result;
91 }
92 
sc_rm_get_did(sc_ipc_t ipc)93 sc_rm_did_t sc_rm_get_did(sc_ipc_t ipc)
94 {
95 	sc_rpc_msg_t msg;
96 	uint8_t result;
97 
98 	RPC_VER(&msg) = SC_RPC_VERSION;
99 	RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_RM;
100 	RPC_FUNC(&msg) = (uint8_t)RM_FUNC_GET_DID;
101 	RPC_SIZE(&msg) = 1U;
102 
103 	sc_call_rpc(ipc, &msg, SC_FALSE);
104 
105 	result = RPC_R8(&msg);
106 	return (sc_rm_did_t) result;
107 }
108 
sc_rm_partition_static(sc_ipc_t ipc,sc_rm_pt_t pt,sc_rm_did_t did)109 sc_err_t sc_rm_partition_static(sc_ipc_t ipc, sc_rm_pt_t pt, sc_rm_did_t did)
110 {
111 	sc_rpc_msg_t msg;
112 	uint8_t result;
113 
114 	RPC_VER(&msg) = SC_RPC_VERSION;
115 	RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_RM;
116 	RPC_FUNC(&msg) = (uint8_t)RM_FUNC_PARTITION_STATIC;
117 	RPC_U8(&msg, 0U) = (uint8_t)pt;
118 	RPC_U8(&msg, 1U) = (uint8_t)did;
119 	RPC_SIZE(&msg) = 2U;
120 
121 	sc_call_rpc(ipc, &msg, SC_FALSE);
122 
123 	result = RPC_R8(&msg);
124 	return (sc_err_t)result;
125 }
126 
sc_rm_partition_lock(sc_ipc_t ipc,sc_rm_pt_t pt)127 sc_err_t sc_rm_partition_lock(sc_ipc_t ipc, sc_rm_pt_t pt)
128 {
129 	sc_rpc_msg_t msg;
130 	uint8_t result;
131 
132 	RPC_VER(&msg) = SC_RPC_VERSION;
133 	RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_RM;
134 	RPC_FUNC(&msg) = (uint8_t)RM_FUNC_PARTITION_LOCK;
135 	RPC_U8(&msg, 0U) = (uint8_t)pt;
136 	RPC_SIZE(&msg) = 2U;
137 
138 	sc_call_rpc(ipc, &msg, SC_FALSE);
139 
140 	result = RPC_R8(&msg);
141 	return (sc_err_t)result;
142 }
143 
sc_rm_get_partition(sc_ipc_t ipc,sc_rm_pt_t * pt)144 sc_err_t sc_rm_get_partition(sc_ipc_t ipc, sc_rm_pt_t *pt)
145 {
146 	sc_rpc_msg_t msg;
147 	uint8_t result;
148 
149 	RPC_VER(&msg) = SC_RPC_VERSION;
150 	RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_RM;
151 	RPC_FUNC(&msg) = (uint8_t)RM_FUNC_GET_PARTITION;
152 	RPC_SIZE(&msg) = 1U;
153 
154 	sc_call_rpc(ipc, &msg, SC_FALSE);
155 
156 	result = RPC_R8(&msg);
157 	if (pt != NULL) {
158 		*pt = RPC_U8(&msg, 0U);
159 	}
160 
161 	return (sc_err_t)result;
162 }
163 
sc_rm_set_parent(sc_ipc_t ipc,sc_rm_pt_t pt,sc_rm_pt_t pt_parent)164 sc_err_t sc_rm_set_parent(sc_ipc_t ipc, sc_rm_pt_t pt, sc_rm_pt_t pt_parent)
165 {
166 	sc_rpc_msg_t msg;
167 	uint8_t result;
168 
169 	RPC_VER(&msg) = SC_RPC_VERSION;
170 	RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_RM;
171 	RPC_FUNC(&msg) = (uint8_t)RM_FUNC_SET_PARENT;
172 	RPC_U8(&msg, 0U) = (uint8_t)pt;
173 	RPC_U8(&msg, 1U) = (uint8_t)pt_parent;
174 	RPC_SIZE(&msg) = 2U;
175 
176 	sc_call_rpc(ipc, &msg, SC_FALSE);
177 
178 	result = RPC_R8(&msg);
179 	return (sc_err_t)result;
180 }
181 
sc_rm_move_all(sc_ipc_t ipc,sc_rm_pt_t pt_src,sc_rm_pt_t pt_dst,sc_bool_t move_rsrc,sc_bool_t move_pads)182 sc_err_t sc_rm_move_all(sc_ipc_t ipc, sc_rm_pt_t pt_src, sc_rm_pt_t pt_dst,
183 			sc_bool_t move_rsrc, sc_bool_t move_pads)
184 {
185 	sc_rpc_msg_t msg;
186 	uint8_t result;
187 
188 	RPC_VER(&msg) = SC_RPC_VERSION;
189 	RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_RM;
190 	RPC_FUNC(&msg) = (uint8_t)RM_FUNC_MOVE_ALL;
191 	RPC_U8(&msg, 0U) = (uint8_t)pt_src;
192 	RPC_U8(&msg, 1U) = (uint8_t)pt_dst;
193 	RPC_U8(&msg, 2U) = (uint8_t)move_rsrc;
194 	RPC_U8(&msg, 3U) = (uint8_t)move_pads;
195 	RPC_SIZE(&msg) = 2U;
196 
197 	sc_call_rpc(ipc, &msg, SC_FALSE);
198 
199 	result = RPC_R8(&msg);
200 	return (sc_err_t)result;
201 }
202 
sc_rm_assign_resource(sc_ipc_t ipc,sc_rm_pt_t pt,sc_rsrc_t resource)203 sc_err_t sc_rm_assign_resource(sc_ipc_t ipc, sc_rm_pt_t pt, sc_rsrc_t resource)
204 {
205 	sc_rpc_msg_t msg;
206 	uint8_t result;
207 
208 	RPC_VER(&msg) = SC_RPC_VERSION;
209 	RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_RM;
210 	RPC_FUNC(&msg) = (uint8_t)RM_FUNC_ASSIGN_RESOURCE;
211 	RPC_U16(&msg, 0U) = (uint16_t)resource;
212 	RPC_U8(&msg, 2U) = (uint8_t)pt;
213 	RPC_SIZE(&msg) = 2U;
214 
215 	sc_call_rpc(ipc, &msg, SC_FALSE);
216 
217 	result = RPC_R8(&msg);
218 	return (sc_err_t)result;
219 }
220 
sc_rm_set_resource_movable(sc_ipc_t ipc,sc_rsrc_t resource_fst,sc_rsrc_t resource_lst,sc_bool_t movable)221 sc_err_t sc_rm_set_resource_movable(sc_ipc_t ipc, sc_rsrc_t resource_fst,
222 				    sc_rsrc_t resource_lst, sc_bool_t movable)
223 {
224 	sc_rpc_msg_t msg;
225 	uint8_t result;
226 
227 	RPC_VER(&msg) = SC_RPC_VERSION;
228 	RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_RM;
229 	RPC_FUNC(&msg) = (uint8_t)RM_FUNC_SET_RESOURCE_MOVABLE;
230 	RPC_U16(&msg, 0U) = (uint16_t)resource_fst;
231 	RPC_U16(&msg, 2U) = (uint16_t)resource_lst;
232 	RPC_U8(&msg, 4U) = (uint8_t)movable;
233 	RPC_SIZE(&msg) = 3U;
234 
235 	sc_call_rpc(ipc, &msg, SC_FALSE);
236 
237 	result = RPC_R8(&msg);
238 	return (sc_err_t)result;
239 }
240 
sc_rm_set_subsys_rsrc_movable(sc_ipc_t ipc,sc_rsrc_t resource,sc_bool_t movable)241 sc_err_t sc_rm_set_subsys_rsrc_movable(sc_ipc_t ipc, sc_rsrc_t resource,
242 				       sc_bool_t movable)
243 {
244 	sc_rpc_msg_t msg;
245 	uint8_t result;
246 
247 	RPC_VER(&msg) = SC_RPC_VERSION;
248 	RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_RM;
249 	RPC_FUNC(&msg) = (uint8_t)RM_FUNC_SET_SUBSYS_RSRC_MOVABLE;
250 	RPC_U16(&msg, 0U) = (uint16_t)resource;
251 	RPC_U8(&msg, 2U) = (uint8_t)movable;
252 	RPC_SIZE(&msg) = 2U;
253 
254 	sc_call_rpc(ipc, &msg, SC_FALSE);
255 
256 	result = RPC_R8(&msg);
257 	return (sc_err_t)result;
258 }
259 
sc_rm_set_master_attributes(sc_ipc_t ipc,sc_rsrc_t resource,sc_rm_spa_t sa,sc_rm_spa_t pa,sc_bool_t smmu_bypass)260 sc_err_t sc_rm_set_master_attributes(sc_ipc_t ipc, sc_rsrc_t resource,
261 				     sc_rm_spa_t sa, sc_rm_spa_t pa,
262 				     sc_bool_t smmu_bypass)
263 {
264 	sc_rpc_msg_t msg;
265 	uint8_t result;
266 
267 	RPC_VER(&msg) = SC_RPC_VERSION;
268 	RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_RM;
269 	RPC_FUNC(&msg) = (uint8_t)RM_FUNC_SET_MASTER_ATTRIBUTES;
270 	RPC_U16(&msg, 0U) = (uint16_t)resource;
271 	RPC_U8(&msg, 2U) = (uint8_t)sa;
272 	RPC_U8(&msg, 3U) = (uint8_t)pa;
273 	RPC_U8(&msg, 4U) = (uint8_t)smmu_bypass;
274 	RPC_SIZE(&msg) = 3U;
275 
276 	sc_call_rpc(ipc, &msg, SC_FALSE);
277 
278 	result = RPC_R8(&msg);
279 	return (sc_err_t)result;
280 }
281 
sc_rm_set_master_sid(sc_ipc_t ipc,sc_rsrc_t resource,sc_rm_sid_t sid)282 sc_err_t sc_rm_set_master_sid(sc_ipc_t ipc, sc_rsrc_t resource, sc_rm_sid_t sid)
283 {
284 	sc_rpc_msg_t msg;
285 	uint8_t result;
286 
287 	RPC_VER(&msg) = SC_RPC_VERSION;
288 	RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_RM;
289 	RPC_FUNC(&msg) = (uint8_t)RM_FUNC_SET_MASTER_SID;
290 	RPC_U16(&msg, 0U) = (uint16_t)resource;
291 	RPC_U16(&msg, 2U) = (uint16_t)sid;
292 	RPC_SIZE(&msg) = 2U;
293 
294 	sc_call_rpc(ipc, &msg, SC_FALSE);
295 
296 	result = RPC_R8(&msg);
297 	return (sc_err_t)result;
298 }
299 
sc_rm_set_peripheral_permissions(sc_ipc_t ipc,sc_rsrc_t resource,sc_rm_pt_t pt,sc_rm_perm_t perm)300 sc_err_t sc_rm_set_peripheral_permissions(sc_ipc_t ipc, sc_rsrc_t resource,
301 					  sc_rm_pt_t pt, sc_rm_perm_t perm)
302 {
303 	sc_rpc_msg_t msg;
304 	uint8_t result;
305 
306 	RPC_VER(&msg) = SC_RPC_VERSION;
307 	RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_RM;
308 	RPC_FUNC(&msg) = (uint8_t)RM_FUNC_SET_PERIPHERAL_PERMISSIONS;
309 	RPC_U16(&msg, 0U) = (uint16_t)resource;
310 	RPC_U8(&msg, 2U) = (uint8_t)pt;
311 	RPC_U8(&msg, 3U) = (uint8_t)perm;
312 	RPC_SIZE(&msg) = 2U;
313 
314 	sc_call_rpc(ipc, &msg, SC_FALSE);
315 
316 	result = RPC_R8(&msg);
317 	return (sc_err_t)result;
318 }
319 
sc_rm_is_resource_owned(sc_ipc_t ipc,sc_rsrc_t resource)320 sc_bool_t sc_rm_is_resource_owned(sc_ipc_t ipc, sc_rsrc_t resource)
321 {
322 	sc_rpc_msg_t msg;
323 	uint8_t result;
324 
325 	RPC_VER(&msg) = SC_RPC_VERSION;
326 	RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_RM;
327 	RPC_FUNC(&msg) = (uint8_t)RM_FUNC_IS_RESOURCE_OWNED;
328 	RPC_U16(&msg, 0U) = (uint16_t)resource;
329 	RPC_SIZE(&msg) = 2U;
330 
331 	sc_call_rpc(ipc, &msg, SC_FALSE);
332 
333 	result = RPC_R8(&msg);
334 	return (sc_bool_t)result;
335 }
336 
sc_rm_is_resource_master(sc_ipc_t ipc,sc_rsrc_t resource)337 sc_bool_t sc_rm_is_resource_master(sc_ipc_t ipc, sc_rsrc_t resource)
338 {
339 	sc_rpc_msg_t msg;
340 	uint8_t result;
341 
342 	RPC_VER(&msg) = SC_RPC_VERSION;
343 	RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_RM;
344 	RPC_FUNC(&msg) = (uint8_t)RM_FUNC_IS_RESOURCE_MASTER;
345 	RPC_U16(&msg, 0U) = (uint16_t)resource;
346 	RPC_SIZE(&msg) = 2U;
347 
348 	sc_call_rpc(ipc, &msg, SC_FALSE);
349 
350 	result = RPC_R8(&msg);
351 	return (sc_bool_t)result;
352 }
353 
sc_rm_is_resource_peripheral(sc_ipc_t ipc,sc_rsrc_t resource)354 sc_bool_t sc_rm_is_resource_peripheral(sc_ipc_t ipc, sc_rsrc_t resource)
355 {
356 	sc_rpc_msg_t msg;
357 	uint8_t result;
358 
359 	RPC_VER(&msg) = SC_RPC_VERSION;
360 	RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_RM;
361 	RPC_FUNC(&msg) = (uint8_t)RM_FUNC_IS_RESOURCE_PERIPHERAL;
362 	RPC_U16(&msg, 0U) = (uint16_t)resource;
363 	RPC_SIZE(&msg) = 2U;
364 
365 	sc_call_rpc(ipc, &msg, SC_FALSE);
366 
367 	result = RPC_R8(&msg);
368 	return (sc_bool_t)result;
369 }
370 
sc_rm_get_resource_info(sc_ipc_t ipc,sc_rsrc_t resource,sc_rm_sid_t * sid)371 sc_err_t sc_rm_get_resource_info(sc_ipc_t ipc, sc_rsrc_t resource,
372 				 sc_rm_sid_t *sid)
373 {
374 	sc_rpc_msg_t msg;
375 	uint8_t result;
376 
377 	RPC_VER(&msg) = SC_RPC_VERSION;
378 	RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_RM;
379 	RPC_FUNC(&msg) = (uint8_t)RM_FUNC_GET_RESOURCE_INFO;
380 	RPC_U16(&msg, 0U) = (uint16_t)resource;
381 	RPC_SIZE(&msg) = 2U;
382 
383 	sc_call_rpc(ipc, &msg, SC_FALSE);
384 
385 	if (sid != NULL) {
386 		*sid = RPC_U16(&msg, 0U);
387 	}
388 
389 	result = RPC_R8(&msg);
390 	return (sc_err_t)result;
391 }
392 
sc_rm_memreg_alloc(sc_ipc_t ipc,sc_rm_mr_t * mr,sc_faddr_t addr_start,sc_faddr_t addr_end)393 sc_err_t sc_rm_memreg_alloc(sc_ipc_t ipc, sc_rm_mr_t *mr,
394 			    sc_faddr_t addr_start, sc_faddr_t addr_end)
395 {
396 	sc_rpc_msg_t msg;
397 	uint8_t result;
398 
399 	RPC_VER(&msg) = SC_RPC_VERSION;
400 	RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_RM;
401 	RPC_FUNC(&msg) = (uint8_t)RM_FUNC_MEMREG_ALLOC;
402 	RPC_U32(&msg, 0U) = (uint32_t)(addr_start >> 32U);
403 	RPC_U32(&msg, 4U) = (uint32_t)addr_start;
404 	RPC_U32(&msg, 8U) = (uint32_t)(addr_end >> 32U);
405 	RPC_U32(&msg, 12U) = (uint32_t)addr_end;
406 	RPC_SIZE(&msg) = 5U;
407 
408 	sc_call_rpc(ipc, &msg, SC_FALSE);
409 
410 	result = RPC_R8(&msg);
411 	if (mr != NULL) {
412 		*mr = RPC_U8(&msg, 0U);
413 	}
414 
415 	return (sc_err_t)result;
416 }
417 
sc_rm_memreg_split(sc_ipc_t ipc,sc_rm_mr_t mr,sc_rm_mr_t * mr_ret,sc_faddr_t addr_start,sc_faddr_t addr_end)418 sc_err_t sc_rm_memreg_split(sc_ipc_t ipc, sc_rm_mr_t mr,
419 			    sc_rm_mr_t *mr_ret, sc_faddr_t addr_start,
420 			    sc_faddr_t addr_end)
421 {
422 	sc_rpc_msg_t msg;
423 	uint8_t result;
424 
425 	RPC_VER(&msg) = SC_RPC_VERSION;
426 	RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_RM;
427 	RPC_FUNC(&msg) = (uint8_t)RM_FUNC_MEMREG_SPLIT;
428 	RPC_U32(&msg, 0U) = (uint32_t)(addr_start >> 32U);
429 	RPC_U32(&msg, 4U) = (uint32_t)addr_start;
430 	RPC_U32(&msg, 8U) = (uint32_t)(addr_end >> 32U);
431 	RPC_U32(&msg, 12U) = (uint32_t)addr_end;
432 	RPC_U8(&msg, 16U) = (uint8_t)mr;
433 	RPC_SIZE(&msg) = 6U;
434 
435 	sc_call_rpc(ipc, &msg, SC_FALSE);
436 
437 	result = RPC_R8(&msg);
438 	if (mr_ret != NULL) {
439 		*mr_ret = RPC_U8(&msg, 0U);
440 	}
441 
442 	return (sc_err_t)result;
443 }
444 
sc_rm_memreg_free(sc_ipc_t ipc,sc_rm_mr_t mr)445 sc_err_t sc_rm_memreg_free(sc_ipc_t ipc, sc_rm_mr_t mr)
446 {
447 	sc_rpc_msg_t msg;
448 	uint8_t result;
449 
450 	RPC_VER(&msg) = SC_RPC_VERSION;
451 	RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_RM;
452 	RPC_FUNC(&msg) = (uint8_t)RM_FUNC_MEMREG_FREE;
453 	RPC_U8(&msg, 0U) = (uint8_t)mr;
454 	RPC_SIZE(&msg) = 2U;
455 
456 	sc_call_rpc(ipc, &msg, SC_FALSE);
457 
458 	result = RPC_R8(&msg);
459 	return (sc_err_t)result;
460 }
461 
sc_rm_find_memreg(sc_ipc_t ipc,sc_rm_mr_t * mr,sc_faddr_t addr_start,sc_faddr_t addr_end)462 sc_err_t sc_rm_find_memreg(sc_ipc_t ipc, sc_rm_mr_t *mr,
463 			   sc_faddr_t addr_start, sc_faddr_t addr_end)
464 {
465 	sc_rpc_msg_t msg;
466 	uint8_t result;
467 
468 	RPC_VER(&msg) = SC_RPC_VERSION;
469 	RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_RM;
470 	RPC_FUNC(&msg) = (uint8_t)RM_FUNC_FIND_MEMREG;
471 	RPC_U32(&msg, 0U) = (uint32_t)(addr_start >> 32U);
472 	RPC_U32(&msg, 4U) = (uint32_t)addr_start;
473 	RPC_U32(&msg, 8U) = (uint32_t)(addr_end >> 32U);
474 	RPC_U32(&msg, 12U) = (uint32_t)addr_end;
475 	RPC_SIZE(&msg) = 5U;
476 
477 	sc_call_rpc(ipc, &msg, SC_FALSE);
478 
479 	result = RPC_R8(&msg);
480 	if (mr != NULL) {
481 		*mr = RPC_U8(&msg, 0U);
482 	}
483 
484 	return (sc_err_t)result;
485 }
486 
sc_rm_assign_memreg(sc_ipc_t ipc,sc_rm_pt_t pt,sc_rm_mr_t mr)487 sc_err_t sc_rm_assign_memreg(sc_ipc_t ipc, sc_rm_pt_t pt, sc_rm_mr_t mr)
488 {
489 	sc_rpc_msg_t msg;
490 	uint8_t result;
491 
492 	RPC_VER(&msg) = SC_RPC_VERSION;
493 	RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_RM;
494 	RPC_FUNC(&msg) = (uint8_t)RM_FUNC_ASSIGN_MEMREG;
495 	RPC_U8(&msg, 0U) = (uint8_t)pt;
496 	RPC_U8(&msg, 1U) = (uint8_t)mr;
497 	RPC_SIZE(&msg) = 2U;
498 
499 	sc_call_rpc(ipc, &msg, SC_FALSE);
500 
501 	result = RPC_R8(&msg);
502 	return (sc_err_t)result;
503 }
504 
sc_rm_set_memreg_permissions(sc_ipc_t ipc,sc_rm_mr_t mr,sc_rm_pt_t pt,sc_rm_perm_t perm)505 sc_err_t sc_rm_set_memreg_permissions(sc_ipc_t ipc, sc_rm_mr_t mr,
506 				      sc_rm_pt_t pt, sc_rm_perm_t perm)
507 {
508 	sc_rpc_msg_t msg;
509 	uint8_t result;
510 
511 	RPC_VER(&msg) = SC_RPC_VERSION;
512 	RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_RM;
513 	RPC_FUNC(&msg) = (uint8_t)RM_FUNC_SET_MEMREG_PERMISSIONS;
514 	RPC_U8(&msg, 0U) = (uint8_t)mr;
515 	RPC_U8(&msg, 1U) = (uint8_t)pt;
516 	RPC_U8(&msg, 2U) = (uint8_t)perm;
517 	RPC_SIZE(&msg) = 2U;
518 
519 	sc_call_rpc(ipc, &msg, SC_FALSE);
520 
521 	result = RPC_R8(&msg);
522 	return (sc_err_t)result;
523 }
524 
sc_rm_is_memreg_owned(sc_ipc_t ipc,sc_rm_mr_t mr)525 sc_bool_t sc_rm_is_memreg_owned(sc_ipc_t ipc, sc_rm_mr_t mr)
526 {
527 	sc_rpc_msg_t msg;
528 	uint8_t result;
529 
530 	RPC_VER(&msg) = SC_RPC_VERSION;
531 	RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_RM;
532 	RPC_FUNC(&msg) = (uint8_t)RM_FUNC_IS_MEMREG_OWNED;
533 	RPC_U8(&msg, 0U) = (uint8_t)mr;
534 	RPC_SIZE(&msg) = 2U;
535 
536 	sc_call_rpc(ipc, &msg, SC_FALSE);
537 
538 	result = RPC_R8(&msg);
539 	return (sc_bool_t)result;
540 }
541 
sc_rm_get_memreg_info(sc_ipc_t ipc,sc_rm_mr_t mr,sc_faddr_t * addr_start,sc_faddr_t * addr_end)542 sc_err_t sc_rm_get_memreg_info(sc_ipc_t ipc, sc_rm_mr_t mr,
543 			       sc_faddr_t *addr_start, sc_faddr_t *addr_end)
544 {
545 	sc_rpc_msg_t msg;
546 	uint8_t result;
547 
548 	RPC_VER(&msg) = SC_RPC_VERSION;
549 	RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_RM;
550 	RPC_FUNC(&msg) = (uint8_t)RM_FUNC_GET_MEMREG_INFO;
551 	RPC_U8(&msg, 0U) = (uint8_t)mr;
552 	RPC_SIZE(&msg) = 2U;
553 
554 	sc_call_rpc(ipc, &msg, SC_FALSE);
555 
556 	if (addr_start != NULL) {
557 		*addr_start =
558 		    ((uint64_t) RPC_U32(&msg, 0U) << 32U) | RPC_U32(&msg, 4U);
559 	}
560 
561 	if (addr_end != NULL) {
562 		*addr_end =
563 		    ((uint64_t) RPC_U32(&msg, 8U) << 32U) | RPC_U32(&msg, 12U);
564 	}
565 
566 	result = RPC_R8(&msg);
567 	return (sc_err_t)result;
568 }
569 
sc_rm_assign_pad(sc_ipc_t ipc,sc_rm_pt_t pt,sc_pad_t pad)570 sc_err_t sc_rm_assign_pad(sc_ipc_t ipc, sc_rm_pt_t pt, sc_pad_t pad)
571 {
572 	sc_rpc_msg_t msg;
573 	uint8_t result;
574 
575 	RPC_VER(&msg) = SC_RPC_VERSION;
576 	RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_RM;
577 	RPC_FUNC(&msg) = (uint8_t)RM_FUNC_ASSIGN_PAD;
578 	RPC_U16(&msg, 0U) = (uint16_t)pad;
579 	RPC_U8(&msg, 2U) = (uint8_t)pt;
580 	RPC_SIZE(&msg) = 2U;
581 
582 	sc_call_rpc(ipc, &msg, SC_FALSE);
583 
584 	result = RPC_R8(&msg);
585 	return (sc_err_t)result;
586 }
587 
sc_rm_set_pad_movable(sc_ipc_t ipc,sc_pad_t pad_fst,sc_pad_t pad_lst,sc_bool_t movable)588 sc_err_t sc_rm_set_pad_movable(sc_ipc_t ipc, sc_pad_t pad_fst,
589 			       sc_pad_t pad_lst, sc_bool_t movable)
590 {
591 	sc_rpc_msg_t msg;
592 	uint8_t result;
593 
594 	RPC_VER(&msg) = SC_RPC_VERSION;
595 	RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_RM;
596 	RPC_FUNC(&msg) = (uint8_t)RM_FUNC_SET_PAD_MOVABLE;
597 	RPC_U16(&msg, 0U) = (uint16_t)pad_fst;
598 	RPC_U16(&msg, 2U) = (uint16_t)pad_lst;
599 	RPC_U8(&msg, 4U) = (uint8_t)movable;
600 	RPC_SIZE(&msg) = 3U;
601 
602 	sc_call_rpc(ipc, &msg, SC_FALSE);
603 
604 	result = RPC_R8(&msg);
605 	return (sc_err_t)result;
606 }
607 
sc_rm_is_pad_owned(sc_ipc_t ipc,sc_pad_t pad)608 sc_bool_t sc_rm_is_pad_owned(sc_ipc_t ipc, sc_pad_t pad)
609 {
610 	sc_rpc_msg_t msg;
611 	uint8_t result;
612 
613 	RPC_VER(&msg) = SC_RPC_VERSION;
614 	RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_RM;
615 	RPC_FUNC(&msg) = (uint8_t)RM_FUNC_IS_PAD_OWNED;
616 	RPC_U8(&msg, 0U) = (uint8_t)pad;
617 	RPC_SIZE(&msg) = 2U;
618 
619 	sc_call_rpc(ipc, &msg, SC_FALSE);
620 
621 	result = RPC_R8(&msg);
622 	return (sc_bool_t)result;
623 }
624 
sc_rm_dump(sc_ipc_t ipc)625 void sc_rm_dump(sc_ipc_t ipc)
626 {
627 	sc_rpc_msg_t msg;
628 
629 	RPC_VER(&msg) = SC_RPC_VERSION;
630 	RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_RM;
631 	RPC_FUNC(&msg) = (uint8_t)RM_FUNC_DUMP;
632 	RPC_SIZE(&msg) = 1U;
633 
634 	sc_call_rpc(ipc, &msg, SC_FALSE);
635 
636 	return;
637 }
638 
639 /**@}*/
640