xref: /arm-trusted-firmware/plat/imx/common/sci/svc/misc/misc_rpc_clnt.c (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu /*
2*91f16700Schasinglulu  * Copyright (C) 2016 Freescale Semiconductor, Inc.
3*91f16700Schasinglulu  * Copyright 2017-2018 NXP
4*91f16700Schasinglulu  *
5*91f16700Schasinglulu  * SPDX-License-Identifier: BSD-3-Clause
6*91f16700Schasinglulu  */
7*91f16700Schasinglulu 
8*91f16700Schasinglulu /*!
9*91f16700Schasinglulu  * File containing client-side RPC functions for the MISC service. These
10*91f16700Schasinglulu  * functions are ported to clients that communicate to the SC.
11*91f16700Schasinglulu  *
12*91f16700Schasinglulu  * @addtogroup MISC_SVC
13*91f16700Schasinglulu  * @{
14*91f16700Schasinglulu  */
15*91f16700Schasinglulu 
16*91f16700Schasinglulu /* Includes */
17*91f16700Schasinglulu 
18*91f16700Schasinglulu #include <sci/sci_types.h>
19*91f16700Schasinglulu #include <sci/svc/rm/sci_rm_api.h>
20*91f16700Schasinglulu #include <sci/svc/misc/sci_misc_api.h>
21*91f16700Schasinglulu #include <sci/sci_rpc.h>
22*91f16700Schasinglulu #include <stdlib.h>
23*91f16700Schasinglulu #include "sci_misc_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_misc_set_control(sc_ipc_t ipc, sc_rsrc_t resource,
32*91f16700Schasinglulu 			     sc_ctrl_t ctrl, uint32_t val)
33*91f16700Schasinglulu {
34*91f16700Schasinglulu 	sc_rpc_msg_t msg;
35*91f16700Schasinglulu 	uint8_t result;
36*91f16700Schasinglulu 
37*91f16700Schasinglulu 	RPC_VER(&msg) = SC_RPC_VERSION;
38*91f16700Schasinglulu 	RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_MISC;
39*91f16700Schasinglulu 	RPC_FUNC(&msg) = (uint8_t)MISC_FUNC_SET_CONTROL;
40*91f16700Schasinglulu 	RPC_U32(&msg, 0U) = (uint32_t)ctrl;
41*91f16700Schasinglulu 	RPC_U32(&msg, 4U) = (uint32_t)val;
42*91f16700Schasinglulu 	RPC_U16(&msg, 8U) = (uint16_t)resource;
43*91f16700Schasinglulu 	RPC_SIZE(&msg) = 4U;
44*91f16700Schasinglulu 
45*91f16700Schasinglulu 	sc_call_rpc(ipc, &msg, SC_FALSE);
46*91f16700Schasinglulu 
47*91f16700Schasinglulu 	result = RPC_R8(&msg);
48*91f16700Schasinglulu 	return (sc_err_t)result;
49*91f16700Schasinglulu }
50*91f16700Schasinglulu 
51*91f16700Schasinglulu sc_err_t sc_misc_get_control(sc_ipc_t ipc, sc_rsrc_t resource,
52*91f16700Schasinglulu 			     sc_ctrl_t ctrl, uint32_t *val)
53*91f16700Schasinglulu {
54*91f16700Schasinglulu 	sc_rpc_msg_t msg;
55*91f16700Schasinglulu 	uint8_t result;
56*91f16700Schasinglulu 
57*91f16700Schasinglulu 	RPC_VER(&msg) = SC_RPC_VERSION;
58*91f16700Schasinglulu 	RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_MISC;
59*91f16700Schasinglulu 	RPC_FUNC(&msg) = (uint8_t)MISC_FUNC_GET_CONTROL;
60*91f16700Schasinglulu 	RPC_U32(&msg, 0U) = (uint32_t)ctrl;
61*91f16700Schasinglulu 	RPC_U16(&msg, 4U) = (uint16_t)resource;
62*91f16700Schasinglulu 	RPC_SIZE(&msg) = 3U;
63*91f16700Schasinglulu 
64*91f16700Schasinglulu 	sc_call_rpc(ipc, &msg, SC_FALSE);
65*91f16700Schasinglulu 
66*91f16700Schasinglulu 	if (val != NULL)
67*91f16700Schasinglulu 		*val = RPC_U32(&msg, 0U);
68*91f16700Schasinglulu 
69*91f16700Schasinglulu 	result = RPC_R8(&msg);
70*91f16700Schasinglulu 	return (sc_err_t)result;
71*91f16700Schasinglulu }
72*91f16700Schasinglulu 
73*91f16700Schasinglulu sc_err_t sc_misc_set_max_dma_group(sc_ipc_t ipc, sc_rm_pt_t pt,
74*91f16700Schasinglulu 				   sc_misc_dma_group_t max)
75*91f16700Schasinglulu {
76*91f16700Schasinglulu 	sc_rpc_msg_t msg;
77*91f16700Schasinglulu 	uint8_t result;
78*91f16700Schasinglulu 
79*91f16700Schasinglulu 	RPC_VER(&msg) = SC_RPC_VERSION;
80*91f16700Schasinglulu 	RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_MISC;
81*91f16700Schasinglulu 	RPC_FUNC(&msg) = (uint8_t)MISC_FUNC_SET_MAX_DMA_GROUP;
82*91f16700Schasinglulu 	RPC_U8(&msg, 0U) = (uint8_t)pt;
83*91f16700Schasinglulu 	RPC_U8(&msg, 1U) = (uint8_t)max;
84*91f16700Schasinglulu 	RPC_SIZE(&msg) = 2U;
85*91f16700Schasinglulu 
86*91f16700Schasinglulu 	sc_call_rpc(ipc, &msg, SC_FALSE);
87*91f16700Schasinglulu 
88*91f16700Schasinglulu 	result = RPC_R8(&msg);
89*91f16700Schasinglulu 	return (sc_err_t)result;
90*91f16700Schasinglulu }
91*91f16700Schasinglulu 
92*91f16700Schasinglulu sc_err_t sc_misc_set_dma_group(sc_ipc_t ipc, sc_rsrc_t resource,
93*91f16700Schasinglulu 			       sc_misc_dma_group_t group)
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_MISC;
100*91f16700Schasinglulu 	RPC_FUNC(&msg) = (uint8_t)MISC_FUNC_SET_DMA_GROUP;
101*91f16700Schasinglulu 	RPC_U16(&msg, 0U) = (uint16_t)resource;
102*91f16700Schasinglulu 	RPC_U8(&msg, 2U) = (uint8_t)group;
103*91f16700Schasinglulu 	RPC_SIZE(&msg) = 2U;
104*91f16700Schasinglulu 
105*91f16700Schasinglulu 	sc_call_rpc(ipc, &msg, SC_FALSE);
106*91f16700Schasinglulu 
107*91f16700Schasinglulu 	result = RPC_R8(&msg);
108*91f16700Schasinglulu 	return (sc_err_t)result;
109*91f16700Schasinglulu }
110*91f16700Schasinglulu 
111*91f16700Schasinglulu sc_err_t sc_misc_seco_image_load(sc_ipc_t ipc, sc_faddr_t addr_src,
112*91f16700Schasinglulu 				 sc_faddr_t addr_dst, uint32_t len,
113*91f16700Schasinglulu 				 sc_bool_t fw)
114*91f16700Schasinglulu {
115*91f16700Schasinglulu 	sc_rpc_msg_t msg;
116*91f16700Schasinglulu 	uint8_t result;
117*91f16700Schasinglulu 
118*91f16700Schasinglulu 	RPC_VER(&msg) = SC_RPC_VERSION;
119*91f16700Schasinglulu 	RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_MISC;
120*91f16700Schasinglulu 	RPC_FUNC(&msg) = (uint8_t)MISC_FUNC_SECO_IMAGE_LOAD;
121*91f16700Schasinglulu 	RPC_U32(&msg, 0U) = (uint32_t)(addr_src >> 32U);
122*91f16700Schasinglulu 	RPC_U32(&msg, 4U) = (uint32_t)addr_src;
123*91f16700Schasinglulu 	RPC_U32(&msg, 8U) = (uint32_t)(addr_dst >> 32U);
124*91f16700Schasinglulu 	RPC_U32(&msg, 12U) = (uint32_t)addr_dst;
125*91f16700Schasinglulu 	RPC_U32(&msg, 16U) = (uint32_t)len;
126*91f16700Schasinglulu 	RPC_U8(&msg, 20U) = (uint8_t)fw;
127*91f16700Schasinglulu 	RPC_SIZE(&msg) = 7U;
128*91f16700Schasinglulu 
129*91f16700Schasinglulu 	sc_call_rpc(ipc, &msg, SC_FALSE);
130*91f16700Schasinglulu 
131*91f16700Schasinglulu 	result = RPC_R8(&msg);
132*91f16700Schasinglulu 	return (sc_err_t)result;
133*91f16700Schasinglulu }
134*91f16700Schasinglulu 
135*91f16700Schasinglulu sc_err_t sc_misc_seco_authenticate(sc_ipc_t ipc,
136*91f16700Schasinglulu 				   sc_misc_seco_auth_cmd_t cmd, sc_faddr_t addr)
137*91f16700Schasinglulu {
138*91f16700Schasinglulu 	sc_rpc_msg_t msg;
139*91f16700Schasinglulu 	uint8_t result;
140*91f16700Schasinglulu 
141*91f16700Schasinglulu 	RPC_VER(&msg) = SC_RPC_VERSION;
142*91f16700Schasinglulu 	RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_MISC;
143*91f16700Schasinglulu 	RPC_FUNC(&msg) = (uint8_t)MISC_FUNC_SECO_AUTHENTICATE;
144*91f16700Schasinglulu 	RPC_U32(&msg, 0U) = (uint32_t)(addr >> 32U);
145*91f16700Schasinglulu 	RPC_U32(&msg, 4U) = (uint32_t)addr;
146*91f16700Schasinglulu 	RPC_U8(&msg, 8U) = (uint8_t)cmd;
147*91f16700Schasinglulu 	RPC_SIZE(&msg) = 4U;
148*91f16700Schasinglulu 
149*91f16700Schasinglulu 	sc_call_rpc(ipc, &msg, SC_FALSE);
150*91f16700Schasinglulu 
151*91f16700Schasinglulu 	result = RPC_R8(&msg);
152*91f16700Schasinglulu 	return (sc_err_t)result;
153*91f16700Schasinglulu }
154*91f16700Schasinglulu 
155*91f16700Schasinglulu sc_err_t sc_misc_seco_fuse_write(sc_ipc_t ipc, sc_faddr_t addr)
156*91f16700Schasinglulu {
157*91f16700Schasinglulu 	sc_rpc_msg_t msg;
158*91f16700Schasinglulu 	uint8_t result;
159*91f16700Schasinglulu 
160*91f16700Schasinglulu 	RPC_VER(&msg) = SC_RPC_VERSION;
161*91f16700Schasinglulu 	RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_MISC;
162*91f16700Schasinglulu 	RPC_FUNC(&msg) = (uint8_t)MISC_FUNC_SECO_FUSE_WRITE;
163*91f16700Schasinglulu 	RPC_U32(&msg, 0U) = (uint32_t)(addr >> 32U);
164*91f16700Schasinglulu 	RPC_U32(&msg, 4U) = (uint32_t)addr;
165*91f16700Schasinglulu 	RPC_SIZE(&msg) = 3U;
166*91f16700Schasinglulu 
167*91f16700Schasinglulu 	sc_call_rpc(ipc, &msg, SC_FALSE);
168*91f16700Schasinglulu 
169*91f16700Schasinglulu 	result = RPC_R8(&msg);
170*91f16700Schasinglulu 	return (sc_err_t)result;
171*91f16700Schasinglulu }
172*91f16700Schasinglulu 
173*91f16700Schasinglulu sc_err_t sc_misc_seco_enable_debug(sc_ipc_t ipc, sc_faddr_t addr)
174*91f16700Schasinglulu {
175*91f16700Schasinglulu 	sc_rpc_msg_t msg;
176*91f16700Schasinglulu 	uint8_t result;
177*91f16700Schasinglulu 
178*91f16700Schasinglulu 	RPC_VER(&msg) = SC_RPC_VERSION;
179*91f16700Schasinglulu 	RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_MISC;
180*91f16700Schasinglulu 	RPC_FUNC(&msg) = (uint8_t)MISC_FUNC_SECO_ENABLE_DEBUG;
181*91f16700Schasinglulu 	RPC_U32(&msg, 0U) = (uint32_t)(addr >> 32U);
182*91f16700Schasinglulu 	RPC_U32(&msg, 4U) = (uint32_t)addr;
183*91f16700Schasinglulu 	RPC_SIZE(&msg) = 3U;
184*91f16700Schasinglulu 
185*91f16700Schasinglulu 	sc_call_rpc(ipc, &msg, SC_FALSE);
186*91f16700Schasinglulu 
187*91f16700Schasinglulu 	result = RPC_R8(&msg);
188*91f16700Schasinglulu 	return (sc_err_t)result;
189*91f16700Schasinglulu }
190*91f16700Schasinglulu 
191*91f16700Schasinglulu sc_err_t sc_misc_seco_forward_lifecycle(sc_ipc_t ipc, uint32_t lifecycle)
192*91f16700Schasinglulu {
193*91f16700Schasinglulu 	sc_rpc_msg_t msg;
194*91f16700Schasinglulu 	uint8_t result;
195*91f16700Schasinglulu 
196*91f16700Schasinglulu 	RPC_VER(&msg) = SC_RPC_VERSION;
197*91f16700Schasinglulu 	RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_MISC;
198*91f16700Schasinglulu 	RPC_FUNC(&msg) = (uint8_t)MISC_FUNC_SECO_FORWARD_LIFECYCLE;
199*91f16700Schasinglulu 	RPC_U32(&msg, 0U) = (uint32_t)lifecycle;
200*91f16700Schasinglulu 	RPC_SIZE(&msg) = 2U;
201*91f16700Schasinglulu 
202*91f16700Schasinglulu 	sc_call_rpc(ipc, &msg, SC_FALSE);
203*91f16700Schasinglulu 
204*91f16700Schasinglulu 	result = RPC_R8(&msg);
205*91f16700Schasinglulu 	return (sc_err_t)result;
206*91f16700Schasinglulu }
207*91f16700Schasinglulu 
208*91f16700Schasinglulu sc_err_t sc_misc_seco_return_lifecycle(sc_ipc_t ipc, sc_faddr_t addr)
209*91f16700Schasinglulu {
210*91f16700Schasinglulu 	sc_rpc_msg_t msg;
211*91f16700Schasinglulu 	uint8_t result;
212*91f16700Schasinglulu 
213*91f16700Schasinglulu 	RPC_VER(&msg) = SC_RPC_VERSION;
214*91f16700Schasinglulu 	RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_MISC;
215*91f16700Schasinglulu 	RPC_FUNC(&msg) = (uint8_t)MISC_FUNC_SECO_RETURN_LIFECYCLE;
216*91f16700Schasinglulu 	RPC_U32(&msg, 0U) = (uint32_t)(addr >> 32U);
217*91f16700Schasinglulu 	RPC_U32(&msg, 4U) = (uint32_t)addr;
218*91f16700Schasinglulu 	RPC_SIZE(&msg) = 3U;
219*91f16700Schasinglulu 
220*91f16700Schasinglulu 	sc_call_rpc(ipc, &msg, SC_FALSE);
221*91f16700Schasinglulu 
222*91f16700Schasinglulu 	result = RPC_R8(&msg);
223*91f16700Schasinglulu 	return (sc_err_t)result;
224*91f16700Schasinglulu }
225*91f16700Schasinglulu 
226*91f16700Schasinglulu void sc_misc_seco_build_info(sc_ipc_t ipc, uint32_t *version, uint32_t *commit)
227*91f16700Schasinglulu {
228*91f16700Schasinglulu 	sc_rpc_msg_t msg;
229*91f16700Schasinglulu 
230*91f16700Schasinglulu 	RPC_VER(&msg) = SC_RPC_VERSION;
231*91f16700Schasinglulu 	RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_MISC;
232*91f16700Schasinglulu 	RPC_FUNC(&msg) = (uint8_t)MISC_FUNC_SECO_BUILD_INFO;
233*91f16700Schasinglulu 	RPC_SIZE(&msg) = 1U;
234*91f16700Schasinglulu 
235*91f16700Schasinglulu 	sc_call_rpc(ipc, &msg, SC_FALSE);
236*91f16700Schasinglulu 
237*91f16700Schasinglulu 	if (version != NULL)
238*91f16700Schasinglulu 		*version = RPC_U32(&msg, 0U);
239*91f16700Schasinglulu 
240*91f16700Schasinglulu 	if (commit != NULL)
241*91f16700Schasinglulu 		*commit = RPC_U32(&msg, 4U);
242*91f16700Schasinglulu }
243*91f16700Schasinglulu 
244*91f16700Schasinglulu sc_err_t sc_misc_seco_chip_info(sc_ipc_t ipc, uint16_t *lc,
245*91f16700Schasinglulu 				uint16_t *monotonic, uint32_t *uid_l,
246*91f16700Schasinglulu 				uint32_t *uid_h)
247*91f16700Schasinglulu {
248*91f16700Schasinglulu 	sc_rpc_msg_t msg;
249*91f16700Schasinglulu 	uint8_t result;
250*91f16700Schasinglulu 
251*91f16700Schasinglulu 	RPC_VER(&msg) = SC_RPC_VERSION;
252*91f16700Schasinglulu 	RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_MISC;
253*91f16700Schasinglulu 	RPC_FUNC(&msg) = (uint8_t)MISC_FUNC_SECO_CHIP_INFO;
254*91f16700Schasinglulu 	RPC_SIZE(&msg) = 1U;
255*91f16700Schasinglulu 
256*91f16700Schasinglulu 	sc_call_rpc(ipc, &msg, SC_FALSE);
257*91f16700Schasinglulu 
258*91f16700Schasinglulu 	if (uid_l != NULL)
259*91f16700Schasinglulu 		*uid_l = RPC_U32(&msg, 0U);
260*91f16700Schasinglulu 
261*91f16700Schasinglulu 	if (uid_h != NULL)
262*91f16700Schasinglulu 		*uid_h = RPC_U32(&msg, 4U);
263*91f16700Schasinglulu 
264*91f16700Schasinglulu 	if (lc != NULL)
265*91f16700Schasinglulu 		*lc = RPC_U16(&msg, 8U);
266*91f16700Schasinglulu 
267*91f16700Schasinglulu 	if (monotonic != NULL)
268*91f16700Schasinglulu 		*monotonic = RPC_U16(&msg, 10U);
269*91f16700Schasinglulu 
270*91f16700Schasinglulu 	result = RPC_R8(&msg);
271*91f16700Schasinglulu 	return (sc_err_t)result;
272*91f16700Schasinglulu }
273*91f16700Schasinglulu 
274*91f16700Schasinglulu void sc_misc_debug_out(sc_ipc_t ipc, uint8_t ch)
275*91f16700Schasinglulu {
276*91f16700Schasinglulu 	sc_rpc_msg_t msg;
277*91f16700Schasinglulu 
278*91f16700Schasinglulu 	RPC_VER(&msg) = SC_RPC_VERSION;
279*91f16700Schasinglulu 	RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_MISC;
280*91f16700Schasinglulu 	RPC_FUNC(&msg) = (uint8_t)MISC_FUNC_DEBUG_OUT;
281*91f16700Schasinglulu 	RPC_U8(&msg, 0U) = (uint8_t)ch;
282*91f16700Schasinglulu 	RPC_SIZE(&msg) = 2U;
283*91f16700Schasinglulu 
284*91f16700Schasinglulu 	sc_call_rpc(ipc, &msg, SC_FALSE);
285*91f16700Schasinglulu }
286*91f16700Schasinglulu 
287*91f16700Schasinglulu sc_err_t sc_misc_waveform_capture(sc_ipc_t ipc, sc_bool_t enable)
288*91f16700Schasinglulu {
289*91f16700Schasinglulu 	sc_rpc_msg_t msg;
290*91f16700Schasinglulu 	uint8_t result;
291*91f16700Schasinglulu 
292*91f16700Schasinglulu 	RPC_VER(&msg) = SC_RPC_VERSION;
293*91f16700Schasinglulu 	RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_MISC;
294*91f16700Schasinglulu 	RPC_FUNC(&msg) = (uint8_t)MISC_FUNC_WAVEFORM_CAPTURE;
295*91f16700Schasinglulu 	RPC_U8(&msg, 0U) = (uint8_t)enable;
296*91f16700Schasinglulu 	RPC_SIZE(&msg) = 2U;
297*91f16700Schasinglulu 
298*91f16700Schasinglulu 	sc_call_rpc(ipc, &msg, SC_FALSE);
299*91f16700Schasinglulu 
300*91f16700Schasinglulu 	result = RPC_R8(&msg);
301*91f16700Schasinglulu 	return (sc_err_t)result;
302*91f16700Schasinglulu }
303*91f16700Schasinglulu 
304*91f16700Schasinglulu void sc_misc_build_info(sc_ipc_t ipc, uint32_t *build, uint32_t *commit)
305*91f16700Schasinglulu {
306*91f16700Schasinglulu 	sc_rpc_msg_t msg;
307*91f16700Schasinglulu 
308*91f16700Schasinglulu 	RPC_VER(&msg) = SC_RPC_VERSION;
309*91f16700Schasinglulu 	RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_MISC;
310*91f16700Schasinglulu 	RPC_FUNC(&msg) = (uint8_t)MISC_FUNC_BUILD_INFO;
311*91f16700Schasinglulu 	RPC_SIZE(&msg) = 1U;
312*91f16700Schasinglulu 
313*91f16700Schasinglulu 	sc_call_rpc(ipc, &msg, SC_FALSE);
314*91f16700Schasinglulu 
315*91f16700Schasinglulu 	if (build != NULL)
316*91f16700Schasinglulu 		*build = RPC_U32(&msg, 0U);
317*91f16700Schasinglulu 
318*91f16700Schasinglulu 	if (commit != NULL)
319*91f16700Schasinglulu 		*commit = RPC_U32(&msg, 4U);
320*91f16700Schasinglulu }
321*91f16700Schasinglulu 
322*91f16700Schasinglulu void sc_misc_unique_id(sc_ipc_t ipc, uint32_t *id_l, uint32_t *id_h)
323*91f16700Schasinglulu {
324*91f16700Schasinglulu 	sc_rpc_msg_t msg;
325*91f16700Schasinglulu 
326*91f16700Schasinglulu 	RPC_VER(&msg) = SC_RPC_VERSION;
327*91f16700Schasinglulu 	RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_MISC;
328*91f16700Schasinglulu 	RPC_FUNC(&msg) = (uint8_t)MISC_FUNC_UNIQUE_ID;
329*91f16700Schasinglulu 	RPC_SIZE(&msg) = 1U;
330*91f16700Schasinglulu 
331*91f16700Schasinglulu 	sc_call_rpc(ipc, &msg, SC_FALSE);
332*91f16700Schasinglulu 
333*91f16700Schasinglulu 	if (id_l != NULL)
334*91f16700Schasinglulu 		*id_l = RPC_U32(&msg, 0U);
335*91f16700Schasinglulu 
336*91f16700Schasinglulu 	if (id_h != NULL)
337*91f16700Schasinglulu 		*id_h = RPC_U32(&msg, 4U);
338*91f16700Schasinglulu }
339*91f16700Schasinglulu 
340*91f16700Schasinglulu sc_err_t sc_misc_set_ari(sc_ipc_t ipc, sc_rsrc_t resource,
341*91f16700Schasinglulu 			 sc_rsrc_t resource_mst, uint16_t ari, sc_bool_t enable)
342*91f16700Schasinglulu {
343*91f16700Schasinglulu 	sc_rpc_msg_t msg;
344*91f16700Schasinglulu 	uint8_t result;
345*91f16700Schasinglulu 
346*91f16700Schasinglulu 	RPC_VER(&msg) = SC_RPC_VERSION;
347*91f16700Schasinglulu 	RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_MISC;
348*91f16700Schasinglulu 	RPC_FUNC(&msg) = (uint8_t)MISC_FUNC_SET_ARI;
349*91f16700Schasinglulu 	RPC_U16(&msg, 0U) = (uint16_t)resource;
350*91f16700Schasinglulu 	RPC_U16(&msg, 2U) = (uint16_t)resource_mst;
351*91f16700Schasinglulu 	RPC_U16(&msg, 4U) = (uint16_t)ari;
352*91f16700Schasinglulu 	RPC_U8(&msg, 6U) = (uint8_t)enable;
353*91f16700Schasinglulu 	RPC_SIZE(&msg) = 3U;
354*91f16700Schasinglulu 
355*91f16700Schasinglulu 	sc_call_rpc(ipc, &msg, SC_FALSE);
356*91f16700Schasinglulu 
357*91f16700Schasinglulu 	result = RPC_R8(&msg);
358*91f16700Schasinglulu 	return (sc_err_t)result;
359*91f16700Schasinglulu }
360*91f16700Schasinglulu 
361*91f16700Schasinglulu void sc_misc_boot_status(sc_ipc_t ipc, sc_misc_boot_status_t status)
362*91f16700Schasinglulu {
363*91f16700Schasinglulu 	sc_rpc_msg_t msg;
364*91f16700Schasinglulu 
365*91f16700Schasinglulu 	RPC_VER(&msg) = SC_RPC_VERSION;
366*91f16700Schasinglulu 	RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_MISC;
367*91f16700Schasinglulu 	RPC_FUNC(&msg) = (uint8_t)MISC_FUNC_BOOT_STATUS;
368*91f16700Schasinglulu 	RPC_U8(&msg, 0U) = (uint8_t)status;
369*91f16700Schasinglulu 	RPC_SIZE(&msg) = 2U;
370*91f16700Schasinglulu 
371*91f16700Schasinglulu 	sc_call_rpc(ipc, &msg, SC_TRUE);
372*91f16700Schasinglulu }
373*91f16700Schasinglulu 
374*91f16700Schasinglulu sc_err_t sc_misc_boot_done(sc_ipc_t ipc, sc_rsrc_t cpu)
375*91f16700Schasinglulu {
376*91f16700Schasinglulu 	sc_rpc_msg_t msg;
377*91f16700Schasinglulu 	uint8_t result;
378*91f16700Schasinglulu 
379*91f16700Schasinglulu 	RPC_VER(&msg) = SC_RPC_VERSION;
380*91f16700Schasinglulu 	RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_MISC;
381*91f16700Schasinglulu 	RPC_FUNC(&msg) = (uint8_t)MISC_FUNC_BOOT_DONE;
382*91f16700Schasinglulu 	RPC_U16(&msg, 0U) = (uint16_t)cpu;
383*91f16700Schasinglulu 	RPC_SIZE(&msg) = 2U;
384*91f16700Schasinglulu 
385*91f16700Schasinglulu 	sc_call_rpc(ipc, &msg, SC_FALSE);
386*91f16700Schasinglulu 
387*91f16700Schasinglulu 	result = RPC_R8(&msg);
388*91f16700Schasinglulu 	return (sc_err_t)result;
389*91f16700Schasinglulu }
390*91f16700Schasinglulu 
391*91f16700Schasinglulu sc_err_t sc_misc_otp_fuse_read(sc_ipc_t ipc, uint32_t word, uint32_t *val)
392*91f16700Schasinglulu {
393*91f16700Schasinglulu 	sc_rpc_msg_t msg;
394*91f16700Schasinglulu 	uint8_t result;
395*91f16700Schasinglulu 
396*91f16700Schasinglulu 	RPC_VER(&msg) = SC_RPC_VERSION;
397*91f16700Schasinglulu 	RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_MISC;
398*91f16700Schasinglulu 	RPC_FUNC(&msg) = (uint8_t)MISC_FUNC_OTP_FUSE_READ;
399*91f16700Schasinglulu 	RPC_U32(&msg, 0U) = (uint32_t)word;
400*91f16700Schasinglulu 	RPC_SIZE(&msg) = 2U;
401*91f16700Schasinglulu 
402*91f16700Schasinglulu 	sc_call_rpc(ipc, &msg, SC_FALSE);
403*91f16700Schasinglulu 
404*91f16700Schasinglulu 	if (val != NULL)
405*91f16700Schasinglulu 		*val = RPC_U32(&msg, 0U);
406*91f16700Schasinglulu 
407*91f16700Schasinglulu 	result = RPC_R8(&msg);
408*91f16700Schasinglulu 	return (sc_err_t)result;
409*91f16700Schasinglulu }
410*91f16700Schasinglulu 
411*91f16700Schasinglulu sc_err_t sc_misc_otp_fuse_write(sc_ipc_t ipc, uint32_t word, uint32_t val)
412*91f16700Schasinglulu {
413*91f16700Schasinglulu 	sc_rpc_msg_t msg;
414*91f16700Schasinglulu 	uint8_t result;
415*91f16700Schasinglulu 
416*91f16700Schasinglulu 	RPC_VER(&msg) = SC_RPC_VERSION;
417*91f16700Schasinglulu 	RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_MISC;
418*91f16700Schasinglulu 	RPC_FUNC(&msg) = (uint8_t)MISC_FUNC_OTP_FUSE_WRITE;
419*91f16700Schasinglulu 	RPC_U32(&msg, 0U) = (uint32_t)word;
420*91f16700Schasinglulu 	RPC_U32(&msg, 4U) = (uint32_t)val;
421*91f16700Schasinglulu 	RPC_SIZE(&msg) = 3U;
422*91f16700Schasinglulu 
423*91f16700Schasinglulu 	sc_call_rpc(ipc, &msg, SC_FALSE);
424*91f16700Schasinglulu 
425*91f16700Schasinglulu 	result = RPC_R8(&msg);
426*91f16700Schasinglulu 	return (sc_err_t)result;
427*91f16700Schasinglulu }
428*91f16700Schasinglulu 
429*91f16700Schasinglulu sc_err_t sc_misc_set_temp(sc_ipc_t ipc, sc_rsrc_t resource,
430*91f16700Schasinglulu 			  sc_misc_temp_t temp, int16_t celsius, int8_t tenths)
431*91f16700Schasinglulu {
432*91f16700Schasinglulu 	sc_rpc_msg_t msg;
433*91f16700Schasinglulu 	uint8_t result;
434*91f16700Schasinglulu 
435*91f16700Schasinglulu 	RPC_VER(&msg) = SC_RPC_VERSION;
436*91f16700Schasinglulu 	RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_MISC;
437*91f16700Schasinglulu 	RPC_FUNC(&msg) = (uint8_t)MISC_FUNC_SET_TEMP;
438*91f16700Schasinglulu 	RPC_U16(&msg, 0U) = (uint16_t)resource;
439*91f16700Schasinglulu 	RPC_I16(&msg, 2U) = (int16_t) celsius;
440*91f16700Schasinglulu 	RPC_U8(&msg, 4U) = (uint8_t)temp;
441*91f16700Schasinglulu 	RPC_I8(&msg, 5U) = (int8_t) tenths;
442*91f16700Schasinglulu 	RPC_SIZE(&msg) = 3U;
443*91f16700Schasinglulu 
444*91f16700Schasinglulu 	sc_call_rpc(ipc, &msg, SC_FALSE);
445*91f16700Schasinglulu 
446*91f16700Schasinglulu 	result = RPC_R8(&msg);
447*91f16700Schasinglulu 	return (sc_err_t)result;
448*91f16700Schasinglulu }
449*91f16700Schasinglulu 
450*91f16700Schasinglulu sc_err_t sc_misc_get_temp(sc_ipc_t ipc, sc_rsrc_t resource,
451*91f16700Schasinglulu 			  sc_misc_temp_t temp, int16_t *celsius,
452*91f16700Schasinglulu 			  int8_t *tenths)
453*91f16700Schasinglulu {
454*91f16700Schasinglulu 	sc_rpc_msg_t msg;
455*91f16700Schasinglulu 	uint8_t result;
456*91f16700Schasinglulu 
457*91f16700Schasinglulu 	RPC_VER(&msg) = SC_RPC_VERSION;
458*91f16700Schasinglulu 	RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_MISC;
459*91f16700Schasinglulu 	RPC_FUNC(&msg) = (uint8_t)MISC_FUNC_GET_TEMP;
460*91f16700Schasinglulu 	RPC_U16(&msg, 0U) = (uint16_t)resource;
461*91f16700Schasinglulu 	RPC_U8(&msg, 2U) = (uint8_t)temp;
462*91f16700Schasinglulu 	RPC_SIZE(&msg) = 2U;
463*91f16700Schasinglulu 
464*91f16700Schasinglulu 	sc_call_rpc(ipc, &msg, SC_FALSE);
465*91f16700Schasinglulu 
466*91f16700Schasinglulu 	if (celsius != NULL)
467*91f16700Schasinglulu 		*celsius = RPC_I16(&msg, 0U);
468*91f16700Schasinglulu 
469*91f16700Schasinglulu 	result = RPC_R8(&msg);
470*91f16700Schasinglulu 	if (tenths != NULL)
471*91f16700Schasinglulu 		*tenths = RPC_I8(&msg, 2U);
472*91f16700Schasinglulu 
473*91f16700Schasinglulu 	return (sc_err_t)result;
474*91f16700Schasinglulu }
475*91f16700Schasinglulu 
476*91f16700Schasinglulu void sc_misc_get_boot_dev(sc_ipc_t ipc, sc_rsrc_t *dev)
477*91f16700Schasinglulu {
478*91f16700Schasinglulu 	sc_rpc_msg_t msg;
479*91f16700Schasinglulu 
480*91f16700Schasinglulu 	RPC_VER(&msg) = SC_RPC_VERSION;
481*91f16700Schasinglulu 	RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_MISC;
482*91f16700Schasinglulu 	RPC_FUNC(&msg) = (uint8_t)MISC_FUNC_GET_BOOT_DEV;
483*91f16700Schasinglulu 	RPC_SIZE(&msg) = 1U;
484*91f16700Schasinglulu 
485*91f16700Schasinglulu 	sc_call_rpc(ipc, &msg, SC_FALSE);
486*91f16700Schasinglulu 
487*91f16700Schasinglulu 	if (dev != NULL)
488*91f16700Schasinglulu 		*dev = RPC_U16(&msg, 0U);
489*91f16700Schasinglulu }
490*91f16700Schasinglulu 
491*91f16700Schasinglulu void sc_misc_get_button_status(sc_ipc_t ipc, sc_bool_t *status)
492*91f16700Schasinglulu {
493*91f16700Schasinglulu 	sc_rpc_msg_t msg;
494*91f16700Schasinglulu 
495*91f16700Schasinglulu 	RPC_VER(&msg) = SC_RPC_VERSION;
496*91f16700Schasinglulu 	RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_MISC;
497*91f16700Schasinglulu 	RPC_FUNC(&msg) = (uint8_t)MISC_FUNC_GET_BUTTON_STATUS;
498*91f16700Schasinglulu 	RPC_SIZE(&msg) = 1U;
499*91f16700Schasinglulu 
500*91f16700Schasinglulu 	sc_call_rpc(ipc, &msg, SC_FALSE);
501*91f16700Schasinglulu 
502*91f16700Schasinglulu 	if (status != NULL)
503*91f16700Schasinglulu 		*status = RPC_U8(&msg, 0U);
504*91f16700Schasinglulu }
505*91f16700Schasinglulu 
506*91f16700Schasinglulu /**@}*/
507