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