xref: /arm-trusted-firmware/plat/imx/common/sci/svc/pm/pm_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 PM service. These
9*91f16700Schasinglulu  * functions are ported to clients that communicate to the SC.
10*91f16700Schasinglulu  *
11*91f16700Schasinglulu  * @addtogroup PM_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/svc/pm/sci_pm_api.h>
22*91f16700Schasinglulu #include <sci/sci_rpc.h>
23*91f16700Schasinglulu 
24*91f16700Schasinglulu #include "sci_pm_rpc.h"
25*91f16700Schasinglulu 
26*91f16700Schasinglulu /* Local Defines */
27*91f16700Schasinglulu 
28*91f16700Schasinglulu /* Local Types */
29*91f16700Schasinglulu 
30*91f16700Schasinglulu /* Local Functions */
31*91f16700Schasinglulu 
32*91f16700Schasinglulu sc_err_t sc_pm_set_sys_power_mode(sc_ipc_t ipc, sc_pm_power_mode_t mode)
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_PM;
39*91f16700Schasinglulu 	RPC_FUNC(&msg) = (uint8_t)PM_FUNC_SET_SYS_POWER_MODE;
40*91f16700Schasinglulu 	RPC_U8(&msg, 0U) = (uint8_t)mode;
41*91f16700Schasinglulu 	RPC_SIZE(&msg) = 2U;
42*91f16700Schasinglulu 
43*91f16700Schasinglulu 	sc_call_rpc(ipc, &msg, SC_FALSE);
44*91f16700Schasinglulu 
45*91f16700Schasinglulu 	result = RPC_R8(&msg);
46*91f16700Schasinglulu 	return (sc_err_t)result;
47*91f16700Schasinglulu }
48*91f16700Schasinglulu 
49*91f16700Schasinglulu sc_err_t sc_pm_set_partition_power_mode(sc_ipc_t ipc, sc_rm_pt_t pt,
50*91f16700Schasinglulu 					sc_pm_power_mode_t mode)
51*91f16700Schasinglulu {
52*91f16700Schasinglulu 	sc_rpc_msg_t msg;
53*91f16700Schasinglulu 	uint8_t result;
54*91f16700Schasinglulu 
55*91f16700Schasinglulu 	RPC_VER(&msg) = SC_RPC_VERSION;
56*91f16700Schasinglulu 	RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_PM;
57*91f16700Schasinglulu 	RPC_FUNC(&msg) = (uint8_t)PM_FUNC_SET_PARTITION_POWER_MODE;
58*91f16700Schasinglulu 	RPC_U8(&msg, 0U) = (uint8_t)pt;
59*91f16700Schasinglulu 	RPC_U8(&msg, 1U) = (uint8_t)mode;
60*91f16700Schasinglulu 	RPC_SIZE(&msg) = 2U;
61*91f16700Schasinglulu 
62*91f16700Schasinglulu 	sc_call_rpc(ipc, &msg, SC_FALSE);
63*91f16700Schasinglulu 
64*91f16700Schasinglulu 	result = RPC_R8(&msg);
65*91f16700Schasinglulu 	return (sc_err_t)result;
66*91f16700Schasinglulu }
67*91f16700Schasinglulu 
68*91f16700Schasinglulu sc_err_t sc_pm_get_sys_power_mode(sc_ipc_t ipc, sc_rm_pt_t pt,
69*91f16700Schasinglulu 				  sc_pm_power_mode_t *mode)
70*91f16700Schasinglulu {
71*91f16700Schasinglulu 	sc_rpc_msg_t msg;
72*91f16700Schasinglulu 	uint8_t result;
73*91f16700Schasinglulu 
74*91f16700Schasinglulu 	RPC_VER(&msg) = SC_RPC_VERSION;
75*91f16700Schasinglulu 	RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_PM;
76*91f16700Schasinglulu 	RPC_FUNC(&msg) = (uint8_t)PM_FUNC_GET_SYS_POWER_MODE;
77*91f16700Schasinglulu 	RPC_U8(&msg, 0U) = (uint8_t)pt;
78*91f16700Schasinglulu 	RPC_SIZE(&msg) = 2U;
79*91f16700Schasinglulu 
80*91f16700Schasinglulu 	sc_call_rpc(ipc, &msg, SC_FALSE);
81*91f16700Schasinglulu 
82*91f16700Schasinglulu 	result = RPC_R8(&msg);
83*91f16700Schasinglulu 	if (mode != NULL) {
84*91f16700Schasinglulu 		*mode = RPC_U8(&msg, 0U);
85*91f16700Schasinglulu 	}
86*91f16700Schasinglulu 
87*91f16700Schasinglulu 	return (sc_err_t)result;
88*91f16700Schasinglulu }
89*91f16700Schasinglulu 
90*91f16700Schasinglulu sc_err_t sc_pm_set_resource_power_mode(sc_ipc_t ipc, sc_rsrc_t resource,
91*91f16700Schasinglulu 				       sc_pm_power_mode_t mode)
92*91f16700Schasinglulu {
93*91f16700Schasinglulu 	sc_rpc_msg_t msg;
94*91f16700Schasinglulu 	uint8_t result;
95*91f16700Schasinglulu 
96*91f16700Schasinglulu 	RPC_VER(&msg) = SC_RPC_VERSION;
97*91f16700Schasinglulu 	RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_PM;
98*91f16700Schasinglulu 	RPC_FUNC(&msg) = (uint8_t)PM_FUNC_SET_RESOURCE_POWER_MODE;
99*91f16700Schasinglulu 	RPC_U16(&msg, 0U) = (uint16_t)resource;
100*91f16700Schasinglulu 	RPC_U8(&msg, 2U) = (uint8_t)mode;
101*91f16700Schasinglulu 	RPC_SIZE(&msg) = 2U;
102*91f16700Schasinglulu 
103*91f16700Schasinglulu 	sc_call_rpc(ipc, &msg, SC_FALSE);
104*91f16700Schasinglulu 
105*91f16700Schasinglulu 	result = RPC_R8(&msg);
106*91f16700Schasinglulu 	return (sc_err_t)result;
107*91f16700Schasinglulu }
108*91f16700Schasinglulu 
109*91f16700Schasinglulu sc_err_t sc_pm_get_resource_power_mode(sc_ipc_t ipc, sc_rsrc_t resource,
110*91f16700Schasinglulu 				       sc_pm_power_mode_t *mode)
111*91f16700Schasinglulu {
112*91f16700Schasinglulu 	sc_rpc_msg_t msg;
113*91f16700Schasinglulu 	uint8_t result;
114*91f16700Schasinglulu 
115*91f16700Schasinglulu 	RPC_VER(&msg) = SC_RPC_VERSION;
116*91f16700Schasinglulu 	RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_PM;
117*91f16700Schasinglulu 	RPC_FUNC(&msg) = (uint8_t)PM_FUNC_GET_RESOURCE_POWER_MODE;
118*91f16700Schasinglulu 	RPC_U16(&msg, 0U) = (uint16_t)resource;
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 	if (mode != NULL) {
125*91f16700Schasinglulu 		*mode = RPC_U8(&msg, 0U);
126*91f16700Schasinglulu 	}
127*91f16700Schasinglulu 
128*91f16700Schasinglulu 	return (sc_err_t)result;
129*91f16700Schasinglulu }
130*91f16700Schasinglulu 
131*91f16700Schasinglulu sc_err_t sc_pm_req_low_power_mode(sc_ipc_t ipc, sc_rsrc_t resource,
132*91f16700Schasinglulu 				  sc_pm_power_mode_t mode)
133*91f16700Schasinglulu {
134*91f16700Schasinglulu 	sc_rpc_msg_t msg;
135*91f16700Schasinglulu 	uint8_t result;
136*91f16700Schasinglulu 
137*91f16700Schasinglulu 	RPC_VER(&msg) = SC_RPC_VERSION;
138*91f16700Schasinglulu 	RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_PM;
139*91f16700Schasinglulu 	RPC_FUNC(&msg) = (uint8_t)PM_FUNC_REQ_LOW_POWER_MODE;
140*91f16700Schasinglulu 	RPC_U16(&msg, 0U) = (uint16_t)resource;
141*91f16700Schasinglulu 	RPC_U8(&msg, 2U) = (uint8_t)mode;
142*91f16700Schasinglulu 	RPC_SIZE(&msg) = 2U;
143*91f16700Schasinglulu 
144*91f16700Schasinglulu 	sc_call_rpc(ipc, &msg, SC_FALSE);
145*91f16700Schasinglulu 
146*91f16700Schasinglulu 	result = RPC_R8(&msg);
147*91f16700Schasinglulu 	return (sc_err_t)result;
148*91f16700Schasinglulu }
149*91f16700Schasinglulu 
150*91f16700Schasinglulu sc_err_t sc_pm_req_cpu_low_power_mode(sc_ipc_t ipc, sc_rsrc_t resource,
151*91f16700Schasinglulu 				      sc_pm_power_mode_t mode,
152*91f16700Schasinglulu 				      sc_pm_wake_src_t wake_src)
153*91f16700Schasinglulu {
154*91f16700Schasinglulu 	sc_rpc_msg_t msg;
155*91f16700Schasinglulu 	uint8_t result;
156*91f16700Schasinglulu 
157*91f16700Schasinglulu 	RPC_VER(&msg) = SC_RPC_VERSION;
158*91f16700Schasinglulu 	RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_PM;
159*91f16700Schasinglulu 	RPC_FUNC(&msg) = (uint8_t)PM_FUNC_REQ_CPU_LOW_POWER_MODE;
160*91f16700Schasinglulu 	RPC_U16(&msg, 0U) = (uint16_t)resource;
161*91f16700Schasinglulu 	RPC_U8(&msg, 2U) = (uint8_t)mode;
162*91f16700Schasinglulu 	RPC_U8(&msg, 3U) = (uint8_t)wake_src;
163*91f16700Schasinglulu 	RPC_SIZE(&msg) = 2U;
164*91f16700Schasinglulu 
165*91f16700Schasinglulu 	sc_call_rpc(ipc, &msg, SC_FALSE);
166*91f16700Schasinglulu 
167*91f16700Schasinglulu 	result = RPC_R8(&msg);
168*91f16700Schasinglulu 	return (sc_err_t)result;
169*91f16700Schasinglulu }
170*91f16700Schasinglulu 
171*91f16700Schasinglulu sc_err_t sc_pm_set_cpu_resume_addr(sc_ipc_t ipc, sc_rsrc_t resource,
172*91f16700Schasinglulu 				   sc_faddr_t address)
173*91f16700Schasinglulu {
174*91f16700Schasinglulu 	sc_rpc_msg_t msg;
175*91f16700Schasinglulu 	uint8_t result;
176*91f16700Schasinglulu 
177*91f16700Schasinglulu 	RPC_VER(&msg) = SC_RPC_VERSION;
178*91f16700Schasinglulu 	RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_PM;
179*91f16700Schasinglulu 	RPC_FUNC(&msg) = (uint8_t)PM_FUNC_SET_CPU_RESUME_ADDR;
180*91f16700Schasinglulu 	RPC_U32(&msg, 0U) = (uint32_t)(address >> 32U);
181*91f16700Schasinglulu 	RPC_U32(&msg, 4U) = (uint32_t)address;
182*91f16700Schasinglulu 	RPC_U16(&msg, 8U) = (uint16_t)resource;
183*91f16700Schasinglulu 	RPC_SIZE(&msg) = 4U;
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_pm_set_cpu_resume(sc_ipc_t ipc, sc_rsrc_t resource,
192*91f16700Schasinglulu 			      sc_bool_t isPrimary, sc_faddr_t address)
193*91f16700Schasinglulu {
194*91f16700Schasinglulu 	sc_rpc_msg_t msg;
195*91f16700Schasinglulu 	uint8_t result;
196*91f16700Schasinglulu 
197*91f16700Schasinglulu 	RPC_VER(&msg) = SC_RPC_VERSION;
198*91f16700Schasinglulu 	RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_PM;
199*91f16700Schasinglulu 	RPC_FUNC(&msg) = (uint8_t)PM_FUNC_SET_CPU_RESUME;
200*91f16700Schasinglulu 	RPC_U32(&msg, 0U) = (uint32_t)(address >> 32U);
201*91f16700Schasinglulu 	RPC_U32(&msg, 4U) = (uint32_t)address;
202*91f16700Schasinglulu 	RPC_U16(&msg, 8U) = (uint16_t)resource;
203*91f16700Schasinglulu 	RPC_U8(&msg, 10U) = (uint8_t)isPrimary;
204*91f16700Schasinglulu 	RPC_SIZE(&msg) = 4U;
205*91f16700Schasinglulu 
206*91f16700Schasinglulu 	sc_call_rpc(ipc, &msg, SC_FALSE);
207*91f16700Schasinglulu 
208*91f16700Schasinglulu 	result = RPC_R8(&msg);
209*91f16700Schasinglulu 	return (sc_err_t)result;
210*91f16700Schasinglulu }
211*91f16700Schasinglulu 
212*91f16700Schasinglulu sc_err_t sc_pm_req_sys_if_power_mode(sc_ipc_t ipc, sc_rsrc_t resource,
213*91f16700Schasinglulu 				     sc_pm_sys_if_t sys_if,
214*91f16700Schasinglulu 				     sc_pm_power_mode_t hpm,
215*91f16700Schasinglulu 				     sc_pm_power_mode_t lpm)
216*91f16700Schasinglulu {
217*91f16700Schasinglulu 	sc_rpc_msg_t msg;
218*91f16700Schasinglulu 	uint8_t result;
219*91f16700Schasinglulu 
220*91f16700Schasinglulu 	RPC_VER(&msg) = SC_RPC_VERSION;
221*91f16700Schasinglulu 	RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_PM;
222*91f16700Schasinglulu 	RPC_FUNC(&msg) = (uint8_t)PM_FUNC_REQ_SYS_IF_POWER_MODE;
223*91f16700Schasinglulu 	RPC_U16(&msg, 0U) = (uint16_t)resource;
224*91f16700Schasinglulu 	RPC_U8(&msg, 2U) = (uint8_t)sys_if;
225*91f16700Schasinglulu 	RPC_U8(&msg, 3U) = (uint8_t)hpm;
226*91f16700Schasinglulu 	RPC_U8(&msg, 4U) = (uint8_t)lpm;
227*91f16700Schasinglulu 	RPC_SIZE(&msg) = 3U;
228*91f16700Schasinglulu 
229*91f16700Schasinglulu 	sc_call_rpc(ipc, &msg, SC_FALSE);
230*91f16700Schasinglulu 
231*91f16700Schasinglulu 	result = RPC_R8(&msg);
232*91f16700Schasinglulu 	return (sc_err_t)result;
233*91f16700Schasinglulu }
234*91f16700Schasinglulu 
235*91f16700Schasinglulu sc_err_t sc_pm_set_clock_rate(sc_ipc_t ipc, sc_rsrc_t resource,
236*91f16700Schasinglulu 			      sc_pm_clk_t clk, sc_pm_clock_rate_t *rate)
237*91f16700Schasinglulu {
238*91f16700Schasinglulu 	sc_rpc_msg_t msg;
239*91f16700Schasinglulu 	uint8_t result;
240*91f16700Schasinglulu 
241*91f16700Schasinglulu 	RPC_VER(&msg) = SC_RPC_VERSION;
242*91f16700Schasinglulu 	RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_PM;
243*91f16700Schasinglulu 	RPC_FUNC(&msg) = (uint8_t)PM_FUNC_SET_CLOCK_RATE;
244*91f16700Schasinglulu 	RPC_U32(&msg, 0U) = *(uint32_t *)rate;
245*91f16700Schasinglulu 	RPC_U16(&msg, 4U) = (uint16_t)resource;
246*91f16700Schasinglulu 	RPC_U8(&msg, 6U) = (uint8_t)clk;
247*91f16700Schasinglulu 	RPC_SIZE(&msg) = 3U;
248*91f16700Schasinglulu 
249*91f16700Schasinglulu 	sc_call_rpc(ipc, &msg, SC_FALSE);
250*91f16700Schasinglulu 
251*91f16700Schasinglulu 	*rate = RPC_U32(&msg, 0U);
252*91f16700Schasinglulu 	result = RPC_R8(&msg);
253*91f16700Schasinglulu 	return (sc_err_t)result;
254*91f16700Schasinglulu }
255*91f16700Schasinglulu 
256*91f16700Schasinglulu sc_err_t sc_pm_get_clock_rate(sc_ipc_t ipc, sc_rsrc_t resource,
257*91f16700Schasinglulu 			      sc_pm_clk_t clk, sc_pm_clock_rate_t *rate)
258*91f16700Schasinglulu {
259*91f16700Schasinglulu 	sc_rpc_msg_t msg;
260*91f16700Schasinglulu 	uint8_t result;
261*91f16700Schasinglulu 
262*91f16700Schasinglulu 	RPC_VER(&msg) = SC_RPC_VERSION;
263*91f16700Schasinglulu 	RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_PM;
264*91f16700Schasinglulu 	RPC_FUNC(&msg) = (uint8_t)PM_FUNC_GET_CLOCK_RATE;
265*91f16700Schasinglulu 	RPC_U16(&msg, 0U) = (uint16_t)resource;
266*91f16700Schasinglulu 	RPC_U8(&msg, 2U) = (uint8_t)clk;
267*91f16700Schasinglulu 	RPC_SIZE(&msg) = 2U;
268*91f16700Schasinglulu 
269*91f16700Schasinglulu 	sc_call_rpc(ipc, &msg, SC_FALSE);
270*91f16700Schasinglulu 
271*91f16700Schasinglulu 	if (rate != NULL) {
272*91f16700Schasinglulu 		*rate = RPC_U32(&msg, 0U);
273*91f16700Schasinglulu 	}
274*91f16700Schasinglulu 
275*91f16700Schasinglulu 	result = RPC_R8(&msg);
276*91f16700Schasinglulu 	return (sc_err_t)result;
277*91f16700Schasinglulu }
278*91f16700Schasinglulu 
279*91f16700Schasinglulu sc_err_t sc_pm_clock_enable(sc_ipc_t ipc, sc_rsrc_t resource,
280*91f16700Schasinglulu 			    sc_pm_clk_t clk, sc_bool_t enable, sc_bool_t autog)
281*91f16700Schasinglulu {
282*91f16700Schasinglulu 	sc_rpc_msg_t msg;
283*91f16700Schasinglulu 	uint8_t result;
284*91f16700Schasinglulu 
285*91f16700Schasinglulu 	RPC_VER(&msg) = SC_RPC_VERSION;
286*91f16700Schasinglulu 	RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_PM;
287*91f16700Schasinglulu 	RPC_FUNC(&msg) = (uint8_t)PM_FUNC_CLOCK_ENABLE;
288*91f16700Schasinglulu 	RPC_U16(&msg, 0U) = (uint16_t)resource;
289*91f16700Schasinglulu 	RPC_U8(&msg, 2U) = (uint8_t)clk;
290*91f16700Schasinglulu 	RPC_U8(&msg, 3U) = (uint8_t)enable;
291*91f16700Schasinglulu 	RPC_U8(&msg, 4U) = (uint8_t)autog;
292*91f16700Schasinglulu 	RPC_SIZE(&msg) = 3U;
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_pm_set_clock_parent(sc_ipc_t ipc, sc_rsrc_t resource,
301*91f16700Schasinglulu 				sc_pm_clk_t clk, sc_pm_clk_parent_t parent)
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_PM;
308*91f16700Schasinglulu 	RPC_FUNC(&msg) = (uint8_t)PM_FUNC_SET_CLOCK_PARENT;
309*91f16700Schasinglulu 	RPC_U16(&msg, 0U) = (uint16_t)resource;
310*91f16700Schasinglulu 	RPC_U8(&msg, 2U) = (uint8_t)clk;
311*91f16700Schasinglulu 	RPC_U8(&msg, 3U) = (uint8_t)parent;
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_err_t sc_pm_get_clock_parent(sc_ipc_t ipc, sc_rsrc_t resource,
321*91f16700Schasinglulu 				sc_pm_clk_t clk, sc_pm_clk_parent_t *parent)
322*91f16700Schasinglulu {
323*91f16700Schasinglulu 	sc_rpc_msg_t msg;
324*91f16700Schasinglulu 	uint8_t result;
325*91f16700Schasinglulu 
326*91f16700Schasinglulu 	RPC_VER(&msg) = SC_RPC_VERSION;
327*91f16700Schasinglulu 	RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_PM;
328*91f16700Schasinglulu 	RPC_FUNC(&msg) = (uint8_t)PM_FUNC_GET_CLOCK_PARENT;
329*91f16700Schasinglulu 	RPC_U16(&msg, 0U) = (uint16_t)resource;
330*91f16700Schasinglulu 	RPC_U8(&msg, 2U) = (uint8_t)clk;
331*91f16700Schasinglulu 	RPC_SIZE(&msg) = 2U;
332*91f16700Schasinglulu 
333*91f16700Schasinglulu 	sc_call_rpc(ipc, &msg, SC_FALSE);
334*91f16700Schasinglulu 
335*91f16700Schasinglulu 	result = RPC_R8(&msg);
336*91f16700Schasinglulu 	if (parent != NULL) {
337*91f16700Schasinglulu 		*parent = RPC_U8(&msg, 0U);
338*91f16700Schasinglulu 	}
339*91f16700Schasinglulu 
340*91f16700Schasinglulu 	return (sc_err_t)result;
341*91f16700Schasinglulu }
342*91f16700Schasinglulu 
343*91f16700Schasinglulu sc_err_t sc_pm_reset(sc_ipc_t ipc, sc_pm_reset_type_t type)
344*91f16700Schasinglulu {
345*91f16700Schasinglulu 	sc_rpc_msg_t msg;
346*91f16700Schasinglulu 	uint8_t result;
347*91f16700Schasinglulu 
348*91f16700Schasinglulu 	RPC_VER(&msg) = SC_RPC_VERSION;
349*91f16700Schasinglulu 	RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_PM;
350*91f16700Schasinglulu 	RPC_FUNC(&msg) = (uint8_t)PM_FUNC_RESET;
351*91f16700Schasinglulu 	RPC_U8(&msg, 0U) = (uint8_t)type;
352*91f16700Schasinglulu 	RPC_SIZE(&msg) = 2U;
353*91f16700Schasinglulu 
354*91f16700Schasinglulu 	sc_call_rpc(ipc, &msg, SC_FALSE);
355*91f16700Schasinglulu 
356*91f16700Schasinglulu 	result = RPC_R8(&msg);
357*91f16700Schasinglulu 	return (sc_err_t)result;
358*91f16700Schasinglulu }
359*91f16700Schasinglulu 
360*91f16700Schasinglulu sc_err_t sc_pm_reset_reason(sc_ipc_t ipc, sc_pm_reset_reason_t *reason)
361*91f16700Schasinglulu {
362*91f16700Schasinglulu 	sc_rpc_msg_t msg;
363*91f16700Schasinglulu 	uint8_t result;
364*91f16700Schasinglulu 
365*91f16700Schasinglulu 	RPC_VER(&msg) = SC_RPC_VERSION;
366*91f16700Schasinglulu 	RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_PM;
367*91f16700Schasinglulu 	RPC_FUNC(&msg) = (uint8_t)PM_FUNC_RESET_REASON;
368*91f16700Schasinglulu 	RPC_SIZE(&msg) = 1U;
369*91f16700Schasinglulu 
370*91f16700Schasinglulu 	sc_call_rpc(ipc, &msg, SC_FALSE);
371*91f16700Schasinglulu 
372*91f16700Schasinglulu 	result = RPC_R8(&msg);
373*91f16700Schasinglulu 	if (reason != NULL) {
374*91f16700Schasinglulu 		*reason = RPC_U8(&msg, 0U);
375*91f16700Schasinglulu 	}
376*91f16700Schasinglulu 
377*91f16700Schasinglulu 	return (sc_err_t)result;
378*91f16700Schasinglulu }
379*91f16700Schasinglulu 
380*91f16700Schasinglulu sc_err_t sc_pm_boot(sc_ipc_t ipc, sc_rm_pt_t pt,
381*91f16700Schasinglulu 		    sc_rsrc_t resource_cpu, sc_faddr_t boot_addr,
382*91f16700Schasinglulu 		    sc_rsrc_t resource_mu, sc_rsrc_t resource_dev)
383*91f16700Schasinglulu {
384*91f16700Schasinglulu 	sc_rpc_msg_t msg;
385*91f16700Schasinglulu 	uint8_t result;
386*91f16700Schasinglulu 
387*91f16700Schasinglulu 	RPC_VER(&msg) = SC_RPC_VERSION;
388*91f16700Schasinglulu 	RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_PM;
389*91f16700Schasinglulu 	RPC_FUNC(&msg) = (uint8_t)PM_FUNC_BOOT;
390*91f16700Schasinglulu 	RPC_U32(&msg, 0U) = (uint32_t)(boot_addr >> 32U);
391*91f16700Schasinglulu 	RPC_U32(&msg, 4U) = (uint32_t)boot_addr;
392*91f16700Schasinglulu 	RPC_U16(&msg, 8U) = (uint16_t)resource_cpu;
393*91f16700Schasinglulu 	RPC_U16(&msg, 10U) = (uint16_t)resource_mu;
394*91f16700Schasinglulu 	RPC_U16(&msg, 12U) = (uint16_t)resource_dev;
395*91f16700Schasinglulu 	RPC_U8(&msg, 14U) = (uint8_t)pt;
396*91f16700Schasinglulu 	RPC_SIZE(&msg) = 5U;
397*91f16700Schasinglulu 
398*91f16700Schasinglulu 	sc_call_rpc(ipc, &msg, SC_FALSE);
399*91f16700Schasinglulu 
400*91f16700Schasinglulu 	result = RPC_R8(&msg);
401*91f16700Schasinglulu 	return (sc_err_t)result;
402*91f16700Schasinglulu }
403*91f16700Schasinglulu 
404*91f16700Schasinglulu void sc_pm_reboot(sc_ipc_t ipc, sc_pm_reset_type_t type)
405*91f16700Schasinglulu {
406*91f16700Schasinglulu 	sc_rpc_msg_t msg;
407*91f16700Schasinglulu 
408*91f16700Schasinglulu 	RPC_VER(&msg) = SC_RPC_VERSION;
409*91f16700Schasinglulu 	RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_PM;
410*91f16700Schasinglulu 	RPC_FUNC(&msg) = (uint8_t)PM_FUNC_REBOOT;
411*91f16700Schasinglulu 	RPC_U8(&msg, 0U) = (uint8_t)type;
412*91f16700Schasinglulu 	RPC_SIZE(&msg) = 2U;
413*91f16700Schasinglulu 
414*91f16700Schasinglulu 	sc_call_rpc(ipc, &msg, SC_TRUE);
415*91f16700Schasinglulu }
416*91f16700Schasinglulu 
417*91f16700Schasinglulu sc_err_t sc_pm_reboot_partition(sc_ipc_t ipc, sc_rm_pt_t pt,
418*91f16700Schasinglulu 				sc_pm_reset_type_t type)
419*91f16700Schasinglulu {
420*91f16700Schasinglulu 	sc_rpc_msg_t msg;
421*91f16700Schasinglulu 	uint8_t result;
422*91f16700Schasinglulu 
423*91f16700Schasinglulu 	RPC_VER(&msg) = SC_RPC_VERSION;
424*91f16700Schasinglulu 	RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_PM;
425*91f16700Schasinglulu 	RPC_FUNC(&msg) = (uint8_t)PM_FUNC_REBOOT_PARTITION;
426*91f16700Schasinglulu 	RPC_U8(&msg, 0U) = (uint8_t)pt;
427*91f16700Schasinglulu 	RPC_U8(&msg, 1U) = (uint8_t)type;
428*91f16700Schasinglulu 	RPC_SIZE(&msg) = 2U;
429*91f16700Schasinglulu 
430*91f16700Schasinglulu 	sc_call_rpc(ipc, &msg, SC_FALSE);
431*91f16700Schasinglulu 
432*91f16700Schasinglulu 	result = RPC_R8(&msg);
433*91f16700Schasinglulu 	return (sc_err_t)result;
434*91f16700Schasinglulu }
435*91f16700Schasinglulu 
436*91f16700Schasinglulu sc_err_t sc_pm_cpu_start(sc_ipc_t ipc, sc_rsrc_t resource, sc_bool_t enable,
437*91f16700Schasinglulu 			 sc_faddr_t address)
438*91f16700Schasinglulu {
439*91f16700Schasinglulu 	sc_rpc_msg_t msg;
440*91f16700Schasinglulu 	uint8_t result;
441*91f16700Schasinglulu 
442*91f16700Schasinglulu 	RPC_VER(&msg) = SC_RPC_VERSION;
443*91f16700Schasinglulu 	RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_PM;
444*91f16700Schasinglulu 	RPC_FUNC(&msg) = (uint8_t)PM_FUNC_CPU_START;
445*91f16700Schasinglulu 	RPC_U32(&msg, 0U) = (uint32_t)(address >> 32U);
446*91f16700Schasinglulu 	RPC_U32(&msg, 4U) = (uint32_t)address;
447*91f16700Schasinglulu 	RPC_U16(&msg, 8U) = (uint16_t)resource;
448*91f16700Schasinglulu 	RPC_U8(&msg, 10U) = (uint8_t)enable;
449*91f16700Schasinglulu 	RPC_SIZE(&msg) = 4U;
450*91f16700Schasinglulu 
451*91f16700Schasinglulu 	sc_call_rpc(ipc, &msg, SC_FALSE);
452*91f16700Schasinglulu 
453*91f16700Schasinglulu 	result = RPC_R8(&msg);
454*91f16700Schasinglulu 	return (sc_err_t)result;
455*91f16700Schasinglulu }
456*91f16700Schasinglulu 
457*91f16700Schasinglulu /**@}*/
458