xref: /rk3399_ARM-atf/drivers/nxp/scmi/vendor/scmi_imx9.h (revision dbfe9df89a21daa63e2d4cb3f7eb34e57b8ebbc0)
1*dbfe9df8SPeng Fan /*
2*dbfe9df8SPeng Fan  * Copyright 2023-2025 NXP
3*dbfe9df8SPeng Fan  *
4*dbfe9df8SPeng Fan  * SPDX-License-Identifier: BSD-3-Clause
5*dbfe9df8SPeng Fan  */
6*dbfe9df8SPeng Fan 
7*dbfe9df8SPeng Fan #ifndef SCMI_IMX9_H
8*dbfe9df8SPeng Fan #define SCMI_IMX9_H
9*dbfe9df8SPeng Fan 
10*dbfe9df8SPeng Fan #include <stddef.h>
11*dbfe9df8SPeng Fan #include <stdint.h>
12*dbfe9df8SPeng Fan 
13*dbfe9df8SPeng Fan #define SCMI_CPU_SLEEP_RUN			0
14*dbfe9df8SPeng Fan #define SCMI_CPU_SLEEP_WAIT			1
15*dbfe9df8SPeng Fan #define SCMI_CPU_SLEEP_STOP			2
16*dbfe9df8SPeng Fan #define SCMI_CPU_SLEEP_SUSPEND			3
17*dbfe9df8SPeng Fan 
18*dbfe9df8SPeng Fan #define SCMI_CPU_PD_LPM_ON_NEVER		0U
19*dbfe9df8SPeng Fan #define SCMI_CPU_PD_LPM_ON_RUN			1U
20*dbfe9df8SPeng Fan #define SCMI_CPU_PD_LPM_ON_RUN_WAIT		2U
21*dbfe9df8SPeng Fan #define SCMI_CPU_PD_LPM_ON_RUN_WAIT_STOP	3U
22*dbfe9df8SPeng Fan #define SCMI_CPU_PD_LPM_ON_ALWAYS		4U
23*dbfe9df8SPeng Fan 
24*dbfe9df8SPeng Fan #define MAX_PER_LPI_CONFIGS_PER_CMD		9
25*dbfe9df8SPeng Fan 
26*dbfe9df8SPeng Fan #define IMX9_SCMI_PERF_PROTO_ID			0x13
27*dbfe9df8SPeng Fan 
28*dbfe9df8SPeng Fan #define IMX9_SCMI_CORE_PERFLEVELSET_MSG		0x7
29*dbfe9df8SPeng Fan #define IMX9_SCMI_CORE_PERFLEVELSET_MSG_LEN	12
30*dbfe9df8SPeng Fan #define IMX9_SCMI_CORE_PERFLEVELSET_RESP_LEN	8
31*dbfe9df8SPeng Fan 
32*dbfe9df8SPeng Fan #define IMX9_SCMI_CORE_PROTO_ID			0x82
33*dbfe9df8SPeng Fan 
34*dbfe9df8SPeng Fan #define IMX9_SCMI_CORE_START_MSG		0x4
35*dbfe9df8SPeng Fan #define IMX9_SCMI_CORE_START_MSG_LEN		8
36*dbfe9df8SPeng Fan #define IMX9_SCMI_CORE_START_RESP_LEN		8
37*dbfe9df8SPeng Fan 
38*dbfe9df8SPeng Fan #define IMX9_SCMI_CORE_STOP_MSG			0x4
39*dbfe9df8SPeng Fan #define IMX9_SCMI_CORE_STOP_MSG_LEN		8
40*dbfe9df8SPeng Fan #define IMX9_SCMI_CORE_STOP_RESP_LEN		8
41*dbfe9df8SPeng Fan 
42*dbfe9df8SPeng Fan #define IMX9_SCMI_CORE_RESET_ADDR_SET_MSG	0x6
43*dbfe9df8SPeng Fan #define IMX9_SCMI_CORE_RESET_ADDR_SET_MSG_LEN	20
44*dbfe9df8SPeng Fan #define IMX9_SCMI_CORE_RESET_ADDR_SET_RESP_LEN	8
45*dbfe9df8SPeng Fan 
46*dbfe9df8SPeng Fan #define IMX9_SCMI_CORE_SETSLEEPMODE_MSG		0x7
47*dbfe9df8SPeng Fan #define IMX9_SCMI_CORE_SETSLEEPMODE_MSG_LEN	16
48*dbfe9df8SPeng Fan #define IMX9_SCMI_CORE_SETSLEEPMODE_RESP_LEN	8
49*dbfe9df8SPeng Fan 
50*dbfe9df8SPeng Fan #define IMX9_SCMI_CORE_SETIRQWAKESET_MSG	0x8
51*dbfe9df8SPeng Fan #define IMX9_SCMI_CORE_SETIRQWAKESET_MSG_LEN	76
52*dbfe9df8SPeng Fan #define IMX9_SCMI_CORE_SETIRQWAKESET_RESP_LEN	8
53*dbfe9df8SPeng Fan 
54*dbfe9df8SPeng Fan #define IMX9_SCMI_CORE_NONIRQWAKESET_MSG       0x9
55*dbfe9df8SPeng Fan #define IMX9_SCMI_CORE_NONIRQWAKESET_MSG_LEN   64
56*dbfe9df8SPeng Fan #define IMX9_SCMI_CORE_NONIRQWAKESET_RESP_LEN  8
57*dbfe9df8SPeng Fan 
58*dbfe9df8SPeng Fan #define IMX9_SCMI_CORE_LPMMODESET_MSG		0xA
59*dbfe9df8SPeng Fan #define IMX9_SCMI_CORE_LPMMODESET_MSG_LEN	12
60*dbfe9df8SPeng Fan #define IMX9_SCMI_CORE_LPMMODESET_RESP_LEN	8
61*dbfe9df8SPeng Fan 
62*dbfe9df8SPeng Fan #define IMX9_SCMI_PER_LPMMODESET_MSG		0xB
63*dbfe9df8SPeng Fan #define IMX9_SCMI_PER_LPMMODESET_MSG_LEN	12
64*dbfe9df8SPeng Fan #define IMX9_SCMI_PER_LPMMODESET_RESP_LEN	8
65*dbfe9df8SPeng Fan 
66*dbfe9df8SPeng Fan #define IMX9_SCMI_CORE_GETINFO_MSG		0xC
67*dbfe9df8SPeng Fan #define IMX9_SCMI_CORE_GETINFO_MSG_LEN		8
68*dbfe9df8SPeng Fan #define IMX9_SCMI_CORE_GETINFO_RESP_LEN		24
69*dbfe9df8SPeng Fan 
70*dbfe9df8SPeng Fan #define SCMI_CPU_VEC_FLAGS_BOOT			BIT(30)
71*dbfe9df8SPeng Fan #define SCMI_CPU_VEC_FLAGS_RESUME		BIT(31)
72*dbfe9df8SPeng Fan 
73*dbfe9df8SPeng Fan #define SCMI_GPC_WAKEUP				0
74*dbfe9df8SPeng Fan #define SCMI_GIC_WAKEUP				1
75*dbfe9df8SPeng Fan #define SCMI_RESUME_CPU				BIT(1)
76*dbfe9df8SPeng Fan 
77*dbfe9df8SPeng Fan #define SCMI_IMX_SYS_POWER_STATE_MODE_MASK      0xC0000000U
78*dbfe9df8SPeng Fan #define SM_ACTIVE		BIT(0)
79*dbfe9df8SPeng Fan #define FRO_ACTIVE		BIT(1)
80*dbfe9df8SPeng Fan #define SYSCTR_ACTIVE		BIT(2)
81*dbfe9df8SPeng Fan #define PMIC_STBY_INACTIVE	BIT(3)
82*dbfe9df8SPeng Fan #define OSC24M_ACTIVE		BIT(4)
83*dbfe9df8SPeng Fan 
84*dbfe9df8SPeng Fan /*
85*dbfe9df8SPeng Fan  * sleep_mode[3:0] – Currently unused.
86*dbfe9df8SPeng Fan  * sleep_mode[7:4] – sleep mode performance level
87*dbfe9df8SPeng Fan  */
88*dbfe9df8SPeng Fan #define SM_PERF_LVL_PRK U(0)
89*dbfe9df8SPeng Fan #define SM_PERF_LVL_LOW U(1)
90*dbfe9df8SPeng Fan #define SM_PERF_LVL_NOM U(2)
91*dbfe9df8SPeng Fan #define SM_PERF_LVL_ODV U(3)
92*dbfe9df8SPeng Fan #define SM_PERF_LVL_SOD U(4)
93*dbfe9df8SPeng Fan 
94*dbfe9df8SPeng Fan #define SYS_SLEEP_MODE_L(x)	(((x) & 0xF) << 16U)
95*dbfe9df8SPeng Fan #define SYS_SLEEP_MODE_H(x)	(((x) & 0xF) << 20U)
96*dbfe9df8SPeng Fan #define SYS_SLEEP_FLAGS(x)	(((x) & 0xFFFFU))
97*dbfe9df8SPeng Fan 
98*dbfe9df8SPeng Fan struct scmi_cpu_reset_addr_a2p {
99*dbfe9df8SPeng Fan 	uint32_t cpu_id;
100*dbfe9df8SPeng Fan 	uint32_t flags;
101*dbfe9df8SPeng Fan 	uint32_t reset_vector_low;
102*dbfe9df8SPeng Fan 	uint32_t reset_vector_high;
103*dbfe9df8SPeng Fan };
104*dbfe9df8SPeng Fan 
105*dbfe9df8SPeng Fan struct scmi_cpu_reset_addr_p2a {
106*dbfe9df8SPeng Fan 	int32_t status;
107*dbfe9df8SPeng Fan };
108*dbfe9df8SPeng Fan 
109*dbfe9df8SPeng Fan struct scmi_cpu_start_a2p {
110*dbfe9df8SPeng Fan 	uint32_t cpu_id;
111*dbfe9df8SPeng Fan };
112*dbfe9df8SPeng Fan 
113*dbfe9df8SPeng Fan struct scmi_cpu_start_p2a {
114*dbfe9df8SPeng Fan 	int32_t status;
115*dbfe9df8SPeng Fan };
116*dbfe9df8SPeng Fan 
117*dbfe9df8SPeng Fan struct scmi_cpu_stop_a2p {
118*dbfe9df8SPeng Fan 	uint32_t cpu_id;
119*dbfe9df8SPeng Fan };
120*dbfe9df8SPeng Fan 
121*dbfe9df8SPeng Fan struct scmi_cpu_stop_p2a {
122*dbfe9df8SPeng Fan 	int32_t status;
123*dbfe9df8SPeng Fan };
124*dbfe9df8SPeng Fan 
125*dbfe9df8SPeng Fan struct scmi_lpm_config {
126*dbfe9df8SPeng Fan 	uint32_t power_domain;
127*dbfe9df8SPeng Fan 	uint32_t lpmsetting;
128*dbfe9df8SPeng Fan 	uint32_t retentionmask;
129*dbfe9df8SPeng Fan };
130*dbfe9df8SPeng Fan 
131*dbfe9df8SPeng Fan struct scmi_cpu_pd_info {
132*dbfe9df8SPeng Fan 	uint32_t cpu_id;
133*dbfe9df8SPeng Fan 	uint32_t cpu_pd_id;
134*dbfe9df8SPeng Fan 	uint32_t nmem;
135*dbfe9df8SPeng Fan 	uint32_t *cpu_mem_pd_id;
136*dbfe9df8SPeng Fan };
137*dbfe9df8SPeng Fan 
138*dbfe9df8SPeng Fan /*
139*dbfe9df8SPeng Fan  * SCMI CPU peripheral LPM configuration
140*dbfe9df8SPeng Fan  */
141*dbfe9df8SPeng Fan struct scmi_per_lpm_config {
142*dbfe9df8SPeng Fan 	uint32_t perId;
143*dbfe9df8SPeng Fan 	uint32_t lpmSetting;
144*dbfe9df8SPeng Fan };
145*dbfe9df8SPeng Fan 
146*dbfe9df8SPeng Fan int scmi_core_set_reset_addr(void *p, uint64_t reset_addr, uint32_t cpu_id, uint32_t attr);
147*dbfe9df8SPeng Fan int scmi_core_start(void *p, uint32_t cpu_id);
148*dbfe9df8SPeng Fan int scmi_core_stop(void *p, uint32_t cpu_id);
149*dbfe9df8SPeng Fan int scmi_core_info_get(void *p, uint32_t cpu_id, uint32_t *run, uint32_t *sleep,
150*dbfe9df8SPeng Fan 		       uint64_t *vector);
151*dbfe9df8SPeng Fan int scmi_core_set_sleep_mode(void *p, uint32_t cpu_id, uint32_t wakeup, uint32_t mode);
152*dbfe9df8SPeng Fan int scmi_core_Irq_wake_set(void *p, uint32_t cpu_id, uint32_t mask_idx,
153*dbfe9df8SPeng Fan 			   uint32_t num_mask, uint32_t *mask);
154*dbfe9df8SPeng Fan int scmi_core_nonIrq_wake_set(void *p, uint32_t cpu_id, uint32_t mask_idx,
155*dbfe9df8SPeng Fan 			uint32_t num_mask, uint32_t mask);
156*dbfe9df8SPeng Fan int scmi_core_lpm_mode_set(void *p, uint32_t cpu_id, uint32_t num_configs,
157*dbfe9df8SPeng Fan 			   struct scmi_lpm_config *cfg);
158*dbfe9df8SPeng Fan int scmi_per_lpm_mode_set(void *p, uint32_t cpu_id, uint32_t num_configs,
159*dbfe9df8SPeng Fan 			   struct scmi_per_lpm_config *cfg);
160*dbfe9df8SPeng Fan int scmi_perf_mode_set(void *p, uint32_t domain_id, uint32_t perf_level);
161*dbfe9df8SPeng Fan 
162*dbfe9df8SPeng Fan #endif /* SCMI_IMX9_H */
163