blob: 588f36711038797216dc6eccf4eb1c796395d17c [file] [log] [blame]
Peng Fan0c830d32018-10-18 14:28:07 +02001/* SPDX-License-Identifier: GPL-2.0+ */
2/*
3 * Copyright 2018 NXP
4 */
5
6#ifndef _SC_SCI_H
7#define _SC_SCI_H
8
Simon Glass0f2af882020-05-10 11:40:05 -06009#include <log.h>
Peng Fan2e0644a2023-04-28 12:08:09 +080010#include <firmware/imx/sci/types.h>
11#include <firmware/imx/sci/svc/misc/api.h>
12#include <firmware/imx/sci/svc/pad/api.h>
13#include <firmware/imx/sci/svc/pm/api.h>
14#include <firmware/imx/sci/svc/rm/api.h>
15#include <firmware/imx/sci/svc/seco/api.h>
Peng Fane89a3912023-06-15 18:09:04 +080016#include <firmware/imx/sci/svc/timer/api.h>
Peng Fan2e0644a2023-04-28 12:08:09 +080017#include <firmware/imx/sci/rpc.h>
Peng Fan0c830d32018-10-18 14:28:07 +020018#include <dt-bindings/soc/imx_rsrc.h>
19#include <linux/errno.h>
20
21static inline int sc_err_to_linux(sc_err_t err)
22{
23 int ret;
24
25 switch (err) {
26 case SC_ERR_NONE:
27 return 0;
28 case SC_ERR_VERSION:
29 case SC_ERR_CONFIG:
30 case SC_ERR_PARM:
31 ret = -EINVAL;
32 break;
33 case SC_ERR_NOACCESS:
34 case SC_ERR_LOCKED:
35 case SC_ERR_UNAVAILABLE:
36 ret = -EACCES;
37 break;
38 case SC_ERR_NOTFOUND:
39 case SC_ERR_NOPOWER:
40 ret = -ENODEV;
41 break;
42 case SC_ERR_IPC:
43 ret = -EIO;
44 break;
45 case SC_ERR_BUSY:
46 ret = -EBUSY;
47 break;
48 case SC_ERR_FAIL:
49 ret = -EIO;
50 break;
51 default:
52 ret = 0;
53 break;
54 }
55
56 debug("%s %d %d\n", __func__, err, ret);
57
58 return ret;
59}
60
Peng Fan9c621932023-04-28 12:08:10 +080061#if IS_ENABLED(CONFIG_IMX8)
Peng Fan55486382018-10-18 14:28:12 +020062/* PM API*/
63int sc_pm_set_resource_power_mode(sc_ipc_t ipc, sc_rsrc_t resource,
64 sc_pm_power_mode_t mode);
Peng Fand4191db2019-09-23 10:12:31 +000065int sc_pm_get_resource_power_mode(sc_ipc_t ipc, sc_rsrc_t resource,
66 sc_pm_power_mode_t *mode);
Peng Fan55486382018-10-18 14:28:12 +020067int sc_pm_set_clock_rate(sc_ipc_t ipc, sc_rsrc_t resource, sc_pm_clk_t clk,
68 sc_pm_clock_rate_t *rate);
69int sc_pm_get_clock_rate(sc_ipc_t ipc, sc_rsrc_t resource, sc_pm_clk_t clk,
70 sc_pm_clock_rate_t *rate);
Peng Fan55486382018-10-18 14:28:12 +020071int sc_pm_clock_enable(sc_ipc_t ipc, sc_rsrc_t resource, sc_pm_clk_t clk,
72 sc_bool_t enable, sc_bool_t autog);
Peng Fand4191db2019-09-23 10:12:31 +000073int sc_pm_set_clock_parent(sc_ipc_t ipc, sc_rsrc_t resource, sc_pm_clk_t clk,
74 sc_pm_clk_parent_t parent);
75int sc_pm_cpu_start(sc_ipc_t ipc, sc_rsrc_t resource, sc_bool_t enable,
76 sc_faddr_t address);
Peng Fane89a3912023-06-15 18:09:04 +080077void sc_pm_reboot(sc_ipc_t ipc, sc_pm_reset_type_t type);
Igor Opaniuk1dd420e2024-01-31 13:49:25 +010078int sc_pm_reset_reason(sc_ipc_t ipc, sc_pm_reset_reason_t *reason);
Peng Fand4191db2019-09-23 10:12:31 +000079sc_bool_t sc_pm_is_partition_started(sc_ipc_t ipc, sc_rm_pt_t pt);
Ye Li24b5dae2019-11-13 21:20:43 -080080int sc_pm_resource_reset(sc_ipc_t ipc, sc_rsrc_t resource);
Peng Fan55486382018-10-18 14:28:12 +020081
82/* MISC API */
Peng Fand4191db2019-09-23 10:12:31 +000083int sc_misc_set_control(sc_ipc_t ipc, sc_rsrc_t resource,
84 sc_ctrl_t ctrl, u32 val);
Peng Fan55486382018-10-18 14:28:12 +020085int sc_misc_get_control(sc_ipc_t ipc, sc_rsrc_t resource, sc_ctrl_t ctrl,
86 u32 *val);
87void sc_misc_get_boot_dev(sc_ipc_t ipc, sc_rsrc_t *boot_dev);
88void sc_misc_boot_status(sc_ipc_t ipc, sc_misc_boot_status_t status);
Ye Lic9c35a42020-06-09 03:34:42 -070089int sc_misc_get_boot_container(sc_ipc_t ipc, u8 *idx);
Peng Fan55486382018-10-18 14:28:12 +020090void sc_misc_build_info(sc_ipc_t ipc, u32 *build, u32 *commit);
91int sc_misc_otp_fuse_read(sc_ipc_t ipc, u32 word, u32 *val);
Peng Fanba44e012019-05-05 13:23:51 +000092int sc_misc_get_temp(sc_ipc_t ipc, sc_rsrc_t resource, sc_misc_temp_t temp,
93 s16 *celsius, s8 *tenths);
Peng Fane89a3912023-06-15 18:09:04 +080094void sc_misc_get_button_status(sc_ipc_t ipc, sc_bool_t *status);
Peng Fan55486382018-10-18 14:28:12 +020095
96/* RM API */
97sc_bool_t sc_rm_is_memreg_owned(sc_ipc_t ipc, sc_rm_mr_t mr);
Peng Fand4191db2019-09-23 10:12:31 +000098int sc_rm_find_memreg(sc_ipc_t ipc, sc_rm_mr_t *mr, sc_faddr_t addr_start,
99 sc_faddr_t addr_end);
100int sc_rm_set_memreg_permissions(sc_ipc_t ipc, sc_rm_mr_t mr,
101 sc_rm_pt_t pt, sc_rm_perm_t perm);
Peng Fan55486382018-10-18 14:28:12 +0200102int sc_rm_get_memreg_info(sc_ipc_t ipc, sc_rm_mr_t mr, sc_faddr_t *addr_start,
103 sc_faddr_t *addr_end);
104sc_bool_t sc_rm_is_resource_owned(sc_ipc_t ipc, sc_rsrc_t resource);
Peng Fand4191db2019-09-23 10:12:31 +0000105int sc_rm_partition_alloc(sc_ipc_t ipc, sc_rm_pt_t *pt, sc_bool_t secure,
106 sc_bool_t isolated, sc_bool_t restricted,
107 sc_bool_t grant, sc_bool_t coherent);
108int sc_rm_partition_free(sc_ipc_t ipc, sc_rm_pt_t pt);
109int sc_rm_get_partition(sc_ipc_t ipc, sc_rm_pt_t *pt);
110int sc_rm_set_parent(sc_ipc_t ipc, sc_rm_pt_t pt, sc_rm_pt_t pt_parent);
111int sc_rm_assign_resource(sc_ipc_t ipc, sc_rm_pt_t pt, sc_rsrc_t resource);
112int sc_rm_assign_pad(sc_ipc_t ipc, sc_rm_pt_t pt, sc_pad_t pad);
113sc_bool_t sc_rm_is_pad_owned(sc_ipc_t ipc, sc_pad_t pad);
114int sc_rm_get_resource_owner(sc_ipc_t ipc, sc_rsrc_t resource,
115 sc_rm_pt_t *pt);
Peng Fan55486382018-10-18 14:28:12 +0200116
117/* PAD API */
118int sc_pad_set(sc_ipc_t ipc, sc_pad_t pad, u32 val);
Franck LENORMANDd3b70ea2019-10-09 10:27:43 +0200119int sc_pad_get(sc_ipc_t ipc, sc_pad_t pad, uint32_t *val);
Peng Fand4191db2019-09-23 10:12:31 +0000120
121/* SMMU API */
122int sc_rm_set_master_sid(sc_ipc_t ipc, sc_rsrc_t resource, sc_rm_sid_t sid);
123
Peng Fane89a3912023-06-15 18:09:04 +0800124/* Timer API */
125int sc_timer_set_wdog_window(sc_ipc_t ipc, sc_timer_wdog_time_t window);
Heiko Schocher2480b152024-11-23 17:52:45 +0100126int sc_timer_control_siemens_pmic_wdog(sc_ipc_t ipc, u8 cmd);
Peng Fane89a3912023-06-15 18:09:04 +0800127
Peng Fand4191db2019-09-23 10:12:31 +0000128/* SECO API */
129int sc_seco_authenticate(sc_ipc_t ipc, sc_seco_auth_cmd_t cmd,
130 sc_faddr_t addr);
131int sc_seco_forward_lifecycle(sc_ipc_t ipc, u32 change);
132int sc_seco_chip_info(sc_ipc_t ipc, u16 *lc, u16 *monotonic, u32 *uid_l,
133 u32 *uid_h);
134void sc_seco_build_info(sc_ipc_t ipc, u32 *version, u32 *commit);
Peng Fane89a3912023-06-15 18:09:04 +0800135int sc_seco_v2x_build_info(sc_ipc_t ipc, u32 *version, u32 *commit);
Peng Fand4191db2019-09-23 10:12:31 +0000136int sc_seco_get_event(sc_ipc_t ipc, u8 idx, u32 *event);
137int sc_seco_gen_key_blob(sc_ipc_t ipc, u32 id, sc_faddr_t load_addr,
138 sc_faddr_t export_addr, u16 max_size);
Breno Lima184c7e22019-10-16 18:10:54 -0300139int sc_seco_get_mp_key(sc_ipc_t ipc, sc_faddr_t dst_addr, u16 dst_size);
140int sc_seco_update_mpmr(sc_ipc_t ipc, sc_faddr_t addr, u8 size, u8 lock);
141int sc_seco_get_mp_sign(sc_ipc_t ipc, sc_faddr_t msg_addr,
142 u16 msg_size, sc_faddr_t dst_addr, u16 dst_size);
Ye Li24b5dae2019-11-13 21:20:43 -0800143int sc_seco_secvio_dgo_config(sc_ipc_t ipc, u8 id, u8 access, u32 *data);
Franck LENORMANDd3b70ea2019-10-09 10:27:43 +0200144int sc_seco_secvio_config(sc_ipc_t ipc, u8 id, u8 access,
145 u32 *data0, u32 *data1, u32 *data2, u32 *data3,
146 u32 *data4, u8 size);
Peng Fan9c621932023-04-28 12:08:10 +0800147#else
148/* PM API*/
149static inline int sc_pm_set_resource_power_mode(sc_ipc_t ipc, sc_rsrc_t resource,
150 sc_pm_power_mode_t mode)
151{
152 return -EOPNOTSUPP;
153}
154
155static inline int sc_pm_get_resource_power_mode(sc_ipc_t ipc, sc_rsrc_t resource,
156 sc_pm_power_mode_t *mode)
157{
158 return -EOPNOTSUPP;
159}
160
161static inline int sc_pm_set_clock_rate(sc_ipc_t ipc, sc_rsrc_t resource, sc_pm_clk_t clk,
162 sc_pm_clock_rate_t *rate)
163{
164 return -EOPNOTSUPP;
165}
166
167static inline int sc_pm_get_clock_rate(sc_ipc_t ipc, sc_rsrc_t resource, sc_pm_clk_t clk,
168 sc_pm_clock_rate_t *rate)
169{
170 return -EOPNOTSUPP;
171}
172
173static inline int sc_pm_clock_enable(sc_ipc_t ipc, sc_rsrc_t resource, sc_pm_clk_t clk,
174 sc_bool_t enable, sc_bool_t autog)
175{
176 return -EOPNOTSUPP;
177}
178
179static inline int sc_pm_set_clock_parent(sc_ipc_t ipc, sc_rsrc_t resource, sc_pm_clk_t clk,
180 sc_pm_clk_parent_t parent)
181{
182 return -EOPNOTSUPP;
183}
184
185static inline int sc_pm_cpu_start(sc_ipc_t ipc, sc_rsrc_t resource, sc_bool_t enable,
186 sc_faddr_t address)
187{
188 return -EOPNOTSUPP;
189}
190
191static inline sc_bool_t sc_pm_is_partition_started(sc_ipc_t ipc, sc_rm_pt_t pt)
192{
193 return false;
194}
195
196static inline int sc_pm_resource_reset(sc_ipc_t ipc, sc_rsrc_t resource)
197{
198 return -EOPNOTSUPP;
199}
200
201/* MISC API */
202static inline int sc_misc_set_control(sc_ipc_t ipc, sc_rsrc_t resource, sc_ctrl_t ctrl, u32 val)
203{
204 return -EOPNOTSUPP;
205}
206
207static inline int sc_misc_get_control(sc_ipc_t ipc, sc_rsrc_t resource, sc_ctrl_t ctrl, u32 *val)
208{
209 return -EOPNOTSUPP;
210}
211
212static inline void sc_misc_get_boot_dev(sc_ipc_t ipc, sc_rsrc_t *boot_dev)
213{
214}
215
216static inline void sc_misc_boot_status(sc_ipc_t ipc, sc_misc_boot_status_t status)
217{
218}
219
220static inline int sc_misc_get_boot_container(sc_ipc_t ipc, u8 *idx)
221{
222 return -EOPNOTSUPP;
223}
224
225static inline void sc_misc_build_info(sc_ipc_t ipc, u32 *build, u32 *commit)
226{
227}
228
229static inline int sc_misc_otp_fuse_read(sc_ipc_t ipc, u32 word, u32 *val)
230{
231 return -EOPNOTSUPP;
232}
233
234static inline int sc_misc_get_temp(sc_ipc_t ipc, sc_rsrc_t resource, sc_misc_temp_t temp,
235 s16 *celsius, s8 *tenths)
236{
237 return -EOPNOTSUPP;
238}
239
240/* RM API */
241static inline sc_bool_t sc_rm_is_memreg_owned(sc_ipc_t ipc, sc_rm_mr_t mr)
242{
243 return true;
244}
245
246static inline int sc_rm_find_memreg(sc_ipc_t ipc, sc_rm_mr_t *mr, sc_faddr_t addr_start,
247 sc_faddr_t addr_end)
248{
249 return -EOPNOTSUPP;
250}
251
252static inline int sc_rm_set_memreg_permissions(sc_ipc_t ipc, sc_rm_mr_t mr, sc_rm_pt_t pt,
253 sc_rm_perm_t perm)
254{
255 return -EOPNOTSUPP;
256}
257
258static inline int sc_rm_get_memreg_info(sc_ipc_t ipc, sc_rm_mr_t mr, sc_faddr_t *addr_start,
259 sc_faddr_t *addr_end)
260{
261 return -EOPNOTSUPP;
262}
263
264static inline sc_bool_t sc_rm_is_resource_owned(sc_ipc_t ipc, sc_rsrc_t resource)
265{
266 return true;
267}
268
269static inline int sc_rm_partition_alloc(sc_ipc_t ipc, sc_rm_pt_t *pt, sc_bool_t secure,
270 sc_bool_t isolated, sc_bool_t restricted,
271 sc_bool_t grant, sc_bool_t coherent)
272{
273 return -EOPNOTSUPP;
274}
275
276static inline int sc_rm_partition_free(sc_ipc_t ipc, sc_rm_pt_t pt)
277{
278 return -EOPNOTSUPP;
279}
280
281static inline int sc_rm_get_partition(sc_ipc_t ipc, sc_rm_pt_t *pt)
282{
283 return -EOPNOTSUPP;
284}
285
286static inline int sc_rm_set_parent(sc_ipc_t ipc, sc_rm_pt_t pt, sc_rm_pt_t pt_parent)
287{
288 return -EOPNOTSUPP;
289}
290
291static inline int sc_rm_assign_resource(sc_ipc_t ipc, sc_rm_pt_t pt, sc_rsrc_t resource)
292{
293 return -EOPNOTSUPP;
294}
295
296static inline int sc_rm_assign_pad(sc_ipc_t ipc, sc_rm_pt_t pt, sc_pad_t pad)
297{
298 return -EOPNOTSUPP;
299}
300
301static inline sc_bool_t sc_rm_is_pad_owned(sc_ipc_t ipc, sc_pad_t pad)
302{
303 return true;
304}
305
306static inline int sc_rm_get_resource_owner(sc_ipc_t ipc, sc_rsrc_t resource, sc_rm_pt_t *pt)
307{
308 return -EOPNOTSUPP;
309}
310
311/* PAD API */
312static inline int sc_pad_set(sc_ipc_t ipc, sc_pad_t pad, u32 val)
313{
314 return -EOPNOTSUPP;
315}
316
317static inline int sc_pad_get(sc_ipc_t ipc, sc_pad_t pad, uint32_t *val)
318{
319 return -EOPNOTSUPP;
320}
321
322/* SMMU API */
323static inline int sc_rm_set_master_sid(sc_ipc_t ipc, sc_rsrc_t resource, sc_rm_sid_t sid)
324{
325 return -EOPNOTSUPP;
326}
327
328/* SECO API */
329static inline int sc_seco_authenticate(sc_ipc_t ipc, sc_seco_auth_cmd_t cmd, sc_faddr_t addr)
330{
331 return -EOPNOTSUPP;
332}
333
334static inline int sc_seco_forward_lifecycle(sc_ipc_t ipc, u32 change)
335{
336 return -EOPNOTSUPP;
337}
338
339static inline int sc_seco_chip_info(sc_ipc_t ipc, u16 *lc, u16 *monotonic, u32 *uid_l, u32 *uid_h)
340{
341 return -EOPNOTSUPP;
342}
343
344void sc_seco_build_info(sc_ipc_t ipc, u32 *version, u32 *commit)
345{
346}
347
348static inline int sc_seco_get_event(sc_ipc_t ipc, u8 idx, u32 *event)
349{
350 return -EOPNOTSUPP;
351}
352
353static inline int sc_seco_gen_key_blob(sc_ipc_t ipc, u32 id, sc_faddr_t load_addr,
354 sc_faddr_t export_addr, u16 max_size)
355{
356 return -EOPNOTSUPP;
357}
358
359static inline int sc_seco_get_mp_key(sc_ipc_t ipc, sc_faddr_t dst_addr, u16 dst_size)
360{
361 return -EOPNOTSUPP;
362}
363
364static inline int sc_seco_update_mpmr(sc_ipc_t ipc, sc_faddr_t addr, u8 size, u8 lock)
365{
366 return -EOPNOTSUPP;
367}
368
369static inline int sc_seco_get_mp_sign(sc_ipc_t ipc, sc_faddr_t msg_addr, u16 msg_size,
370 sc_faddr_t dst_addr, u16 dst_size)
371{
372 return -EOPNOTSUPP;
373}
374
375static inline int sc_seco_secvio_dgo_config(sc_ipc_t ipc, u8 id, u8 access, u32 *data)
376{
377 return -EOPNOTSUPP;
378}
379
380static inline int sc_seco_secvio_config(sc_ipc_t ipc, u8 id, u8 access, u32 *data0, u32 *data1,
381 u32 *data2, u32 *data3, u32 *data4, u8 size)
382{
383 return -EOPNOTSUPP;
384}
385
Peng Fane89a3912023-06-15 18:09:04 +0800386static inline void sc_pm_reboot(sc_ipc_t ipc, sc_pm_reset_type_t type)
387{
388}
389
Igor Opaniuk1dd420e2024-01-31 13:49:25 +0100390static inline int sc_pm_reset_reason(sc_ipc_t ipc, sc_pm_reset_reason_t *reason)
391{
392 return -EOPNOTSUPP;
393}
394
Peng Fane89a3912023-06-15 18:09:04 +0800395static inline int sc_seco_v2x_build_info(sc_ipc_t ipc, u32 *version, u32 *commit)
396{
397 return -EOPNOTSUPP;
398}
399
400static inline void sc_misc_get_button_status(sc_ipc_t ipc, sc_bool_t *status)
401{
402}
403
404static inline int sc_timer_set_wdog_window(sc_ipc_t ipc, sc_timer_wdog_time_t window)
405{
406 return -EOPNOTSUPP;
407}
Peng Fan9c621932023-04-28 12:08:10 +0800408#endif
Peng Fand4191db2019-09-23 10:12:31 +0000409
Peng Fan0c830d32018-10-18 14:28:07 +0200410#endif