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