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