xref: /rk3399_ARM-atf/plat/mediatek/mt8186/drivers/spmc/mtspmc_private.h (revision ed780b0b40d5fe0dffffd277de835425f3064f78)
1*1da57e54SGarmin.Chang /*
2*1da57e54SGarmin.Chang  * Copyright (c) 2021, MediaTek Inc. All rights reserved.
3*1da57e54SGarmin.Chang  *
4*1da57e54SGarmin.Chang  * SPDX-License-Identifier: BSD-3-Clause
5*1da57e54SGarmin.Chang  */
6*1da57e54SGarmin.Chang 
7*1da57e54SGarmin.Chang #ifndef MTSPMC_PRIVATE_H
8*1da57e54SGarmin.Chang #define MTSPMC_PRIVATE_H
9*1da57e54SGarmin.Chang 
10*1da57e54SGarmin.Chang #include <lib/utils_def.h>
11*1da57e54SGarmin.Chang #include <platform_def.h>
12*1da57e54SGarmin.Chang 
13*1da57e54SGarmin.Chang unsigned long read_cpuectlr(void);
14*1da57e54SGarmin.Chang void write_cpuectlr(unsigned long cpuectlr);
15*1da57e54SGarmin.Chang 
16*1da57e54SGarmin.Chang unsigned long read_cpupwrctlr_el1(void);
17*1da57e54SGarmin.Chang void write_cpupwrctlr_el1(unsigned long cpuectlr);
18*1da57e54SGarmin.Chang 
19*1da57e54SGarmin.Chang /* per_cpu/cluster helper */
20*1da57e54SGarmin.Chang struct per_cpu_reg {
21*1da57e54SGarmin.Chang 	unsigned int cluster_addr;
22*1da57e54SGarmin.Chang 	unsigned int cpu_stride;
23*1da57e54SGarmin.Chang };
24*1da57e54SGarmin.Chang 
25*1da57e54SGarmin.Chang #define per_cpu(cluster, cpu, reg)	\
26*1da57e54SGarmin.Chang 	(reg[cluster].cluster_addr + (cpu << reg[cluster].cpu_stride))
27*1da57e54SGarmin.Chang 
28*1da57e54SGarmin.Chang #define per_cluster(cluster, reg)	(reg[cluster].cluster_addr)
29*1da57e54SGarmin.Chang 
30*1da57e54SGarmin.Chang #define SPM_REG(ofs)			(uint32_t)(SPM_BASE + (ofs))
31*1da57e54SGarmin.Chang #define MCUCFG_REG(ofs)			(uint32_t)(MCUCFG_BASE + (ofs))
32*1da57e54SGarmin.Chang #define INFRACFG_AO_REG(ofs)		(uint32_t)(INFRACFG_AO_BASE + (ofs))
33*1da57e54SGarmin.Chang 
34*1da57e54SGarmin.Chang /* SPMC related registers */
35*1da57e54SGarmin.Chang #define SPM_POWERON_CONFIG_EN		SPM_REG(0x000)
36*1da57e54SGarmin.Chang /* bit-fields of SPM_POWERON_CONFIG_EN */
37*1da57e54SGarmin.Chang #define PROJECT_CODE			(U(0xb16) << 16)
38*1da57e54SGarmin.Chang #define BCLK_CG_EN			BIT(0)
39*1da57e54SGarmin.Chang 
40*1da57e54SGarmin.Chang #define SPM_PWR_STATUS			SPM_REG(0x16c)
41*1da57e54SGarmin.Chang #define SPM_PWR_STATUS_2ND		SPM_REG(0x170)
42*1da57e54SGarmin.Chang #define SPM_CPU_PWR_STATUS		SPM_REG(0x174)
43*1da57e54SGarmin.Chang 
44*1da57e54SGarmin.Chang /* bit-fields of SPM_PWR_STATUS */
45*1da57e54SGarmin.Chang #define MD				BIT(0)
46*1da57e54SGarmin.Chang #define CONN				BIT(1)
47*1da57e54SGarmin.Chang #define DDRPHY				BIT(2)
48*1da57e54SGarmin.Chang #define DISP				BIT(3)
49*1da57e54SGarmin.Chang #define MFG				BIT(4)
50*1da57e54SGarmin.Chang #define ISP				BIT(5)
51*1da57e54SGarmin.Chang #define INFRA				BIT(6)
52*1da57e54SGarmin.Chang #define VDEC				BIT(7)
53*1da57e54SGarmin.Chang #define MP0_CPUTOP			BIT(8)
54*1da57e54SGarmin.Chang #define MP0_CPU0			BIT(9)
55*1da57e54SGarmin.Chang #define MP0_CPU1			BIT(10)
56*1da57e54SGarmin.Chang #define MP0_CPU2			BIT(11)
57*1da57e54SGarmin.Chang #define MP0_CPU3			BIT(12)
58*1da57e54SGarmin.Chang #define MCUSYS				BIT(14)
59*1da57e54SGarmin.Chang #define MP0_CPU4			BIT(15)
60*1da57e54SGarmin.Chang #define MP0_CPU5			BIT(16)
61*1da57e54SGarmin.Chang #define MP0_CPU6			BIT(17)
62*1da57e54SGarmin.Chang #define MP0_CPU7			BIT(18)
63*1da57e54SGarmin.Chang #define VEN				BIT(21)
64*1da57e54SGarmin.Chang 
65*1da57e54SGarmin.Chang /* SPMC related registers */
66*1da57e54SGarmin.Chang #define SPM_MCUSYS_PWR_CON		SPM_REG(0x200)
67*1da57e54SGarmin.Chang #define SPM_MP0_CPUTOP_PWR_CON		SPM_REG(0x204)
68*1da57e54SGarmin.Chang #define SPM_MP0_CPU0_PWR_CON		SPM_REG(0x208)
69*1da57e54SGarmin.Chang #define SPM_MP0_CPU1_PWR_CON		SPM_REG(0x20c)
70*1da57e54SGarmin.Chang #define SPM_MP0_CPU2_PWR_CON		SPM_REG(0x210)
71*1da57e54SGarmin.Chang #define SPM_MP0_CPU3_PWR_CON		SPM_REG(0x214)
72*1da57e54SGarmin.Chang #define SPM_MP0_CPU4_PWR_CON		SPM_REG(0x218)
73*1da57e54SGarmin.Chang #define SPM_MP0_CPU5_PWR_CON		SPM_REG(0x21c)
74*1da57e54SGarmin.Chang #define SPM_MP0_CPU6_PWR_CON		SPM_REG(0x220)
75*1da57e54SGarmin.Chang #define SPM_MP0_CPU7_PWR_CON		SPM_REG(0x224)
76*1da57e54SGarmin.Chang 
77*1da57e54SGarmin.Chang /* bit-fields of SPM_*_PWR_CON */
78*1da57e54SGarmin.Chang #define PWR_ON_ACK			BIT(31)
79*1da57e54SGarmin.Chang #define VPROC_EXT_OFF			BIT(7)
80*1da57e54SGarmin.Chang #define DORMANT_EN			BIT(6)
81*1da57e54SGarmin.Chang #define RESETPWRON_CONFIG		BIT(5)
82*1da57e54SGarmin.Chang #define PWR_CLK_DIS			BIT(4)
83*1da57e54SGarmin.Chang #define PWR_ON				BIT(2)
84*1da57e54SGarmin.Chang #define PWR_RST_B			BIT(0)
85*1da57e54SGarmin.Chang 
86*1da57e54SGarmin.Chang /* per_cpu registers for SPM_MP0_CPU_PWR_CON */
87*1da57e54SGarmin.Chang static const struct per_cpu_reg SPM_CPU_PWR[] = {
88*1da57e54SGarmin.Chang 	{ .cluster_addr = SPM_MP0_CPU0_PWR_CON, .cpu_stride = 2U }
89*1da57e54SGarmin.Chang };
90*1da57e54SGarmin.Chang 
91*1da57e54SGarmin.Chang /* per_cluster registers for SPM_MP0_CPUTOP_PWR_CON */
92*1da57e54SGarmin.Chang static const struct per_cpu_reg SPM_CLUSTER_PWR[] = {
93*1da57e54SGarmin.Chang 	{ .cluster_addr = SPM_MP0_CPUTOP_PWR_CON, .cpu_stride = 0U }
94*1da57e54SGarmin.Chang };
95*1da57e54SGarmin.Chang 
96*1da57e54SGarmin.Chang /* MCUCFG related registers */
97*1da57e54SGarmin.Chang #define MCUCFG_MP0_CLUSTER_CFG5		MCUCFG_REG(0xc8e4)
98*1da57e54SGarmin.Chang /* reset vectors */
99*1da57e54SGarmin.Chang #define MCUCFG_MP0_CLUSTER_CFG8		MCUCFG_REG(0xc900)
100*1da57e54SGarmin.Chang #define MCUCFG_MP0_CLUSTER_CFG10	MCUCFG_REG(0xc908)
101*1da57e54SGarmin.Chang #define MCUCFG_MP0_CLUSTER_CFG12	MCUCFG_REG(0xc910)
102*1da57e54SGarmin.Chang #define MCUCFG_MP0_CLUSTER_CFG14	MCUCFG_REG(0xc918)
103*1da57e54SGarmin.Chang #define MCUCFG_MP0_CLUSTER_CFG16	MCUCFG_REG(0xc920)
104*1da57e54SGarmin.Chang #define MCUCFG_MP0_CLUSTER_CFG18	MCUCFG_REG(0xc928)
105*1da57e54SGarmin.Chang #define MCUCFG_MP0_CLUSTER_CFG20	MCUCFG_REG(0xc930)
106*1da57e54SGarmin.Chang #define MCUCFG_MP0_CLUSTER_CFG22	MCUCFG_REG(0xc938)
107*1da57e54SGarmin.Chang 
108*1da57e54SGarmin.Chang /* per_cpu registers for MCUCFG_MP0_CLUSTER_CFG */
109*1da57e54SGarmin.Chang static const struct per_cpu_reg MCUCFG_BOOTADDR[] = {
110*1da57e54SGarmin.Chang 	{ .cluster_addr = MCUCFG_MP0_CLUSTER_CFG8, .cpu_stride = 3U }
111*1da57e54SGarmin.Chang };
112*1da57e54SGarmin.Chang 
113*1da57e54SGarmin.Chang /* per_cpu registers for MCUCFG_MP0_CLUSTER_CFG5 */
114*1da57e54SGarmin.Chang static const struct per_cpu_reg MCUCFG_INITARCH[] = {
115*1da57e54SGarmin.Chang 	{ .cluster_addr = MCUCFG_MP0_CLUSTER_CFG5, .cpu_stride = 0U }
116*1da57e54SGarmin.Chang };
117*1da57e54SGarmin.Chang 
118*1da57e54SGarmin.Chang #define MCUCFG_INITARCH_CPU_BIT(cpu)	BIT(16U + cpu)
119*1da57e54SGarmin.Chang /* CPC control */
120*1da57e54SGarmin.Chang #define MCUCFG_CPC_FLOW_CTRL_CFG	MCUCFG_REG(0xa814)
121*1da57e54SGarmin.Chang #define MCUCFG_CPC_SPMC_PWR_STATUS	MCUCFG_REG(0xa840)
122*1da57e54SGarmin.Chang 
123*1da57e54SGarmin.Chang /* bit-fields of CPC_FLOW_CTRL_CFG */
124*1da57e54SGarmin.Chang #define CPC_CTRL_ENABLE			BIT(16)
125*1da57e54SGarmin.Chang #define SSPM_ALL_PWR_CTRL_EN		BIT(13) /* for cpu-hotplug */
126*1da57e54SGarmin.Chang #define GIC_WAKEUP_IGNORE(cpu)		BIT(21 + cpu)
127*1da57e54SGarmin.Chang 
128*1da57e54SGarmin.Chang /* bit-fields of CPC_SPMC_PWR_STATUS */
129*1da57e54SGarmin.Chang #define CORE_SPMC_PWR_ON_ACK		GENMASK(11, 0)
130*1da57e54SGarmin.Chang 
131*1da57e54SGarmin.Chang /* APB module infracfg_ao */
132*1da57e54SGarmin.Chang #define INFRA_TOPAXI_PROTECTEN		INFRACFG_AO_REG(0x0220)
133*1da57e54SGarmin.Chang #define INFRA_TOPAXI_PROTECTEN_STA0	INFRACFG_AO_REG(0x0224)
134*1da57e54SGarmin.Chang #define INFRA_TOPAXI_PROTECTEN_STA1	INFRACFG_AO_REG(0x0228)
135*1da57e54SGarmin.Chang #define INFRA_TOPAXI_PROTECTEN_SET	INFRACFG_AO_REG(0x02a0)
136*1da57e54SGarmin.Chang #define INFRA_TOPAXI_PROTECTEN_CLR	INFRACFG_AO_REG(0x02a4)
137*1da57e54SGarmin.Chang #define INFRA_TOPAXI_PROTECTEN_1	INFRACFG_AO_REG(0x0250)
138*1da57e54SGarmin.Chang #define INFRA_TOPAXI_PROTECTEN_STA0_1	INFRACFG_AO_REG(0x0254)
139*1da57e54SGarmin.Chang #define INFRA_TOPAXI_PROTECTEN_STA1_1	INFRACFG_AO_REG(0x0258)
140*1da57e54SGarmin.Chang #define INFRA_TOPAXI_PROTECTEN_1_SET	INFRACFG_AO_REG(0x02a8)
141*1da57e54SGarmin.Chang #define INFRA_TOPAXI_PROTECTEN_1_CLR	INFRACFG_AO_REG(0x02ac)
142*1da57e54SGarmin.Chang 
143*1da57e54SGarmin.Chang /* bit-fields of INFRA_TOPAXI_PROTECTEN */
144*1da57e54SGarmin.Chang #define MP0_SPMC_PROT_STEP1_0_MASK	BIT(12)
145*1da57e54SGarmin.Chang #define MP0_SPMC_PROT_STEP1_1_MASK	(BIT(26) | BIT(12))
146*1da57e54SGarmin.Chang 
147*1da57e54SGarmin.Chang /* SPARK */
148*1da57e54SGarmin.Chang #define VOLTAGE_04			U(0x40)
149*1da57e54SGarmin.Chang #define VOLTAGE_05			U(0x60)
150*1da57e54SGarmin.Chang 
151*1da57e54SGarmin.Chang #define PTP3_CPU0_SPMC_SW_CFG		MCUCFG_REG(0x200)
152*1da57e54SGarmin.Chang #define CPU0_ILDO_CONTROL5		MCUCFG_REG(0x334)
153*1da57e54SGarmin.Chang #define CPU0_ILDO_CONTROL8		MCUCFG_REG(0x340)
154*1da57e54SGarmin.Chang 
155*1da57e54SGarmin.Chang /* bit-fields of CPU0_ILDO_CONTROL5 */
156*1da57e54SGarmin.Chang #define ILDO_RET_VOSEL			GENMASK(7, 0)
157*1da57e54SGarmin.Chang 
158*1da57e54SGarmin.Chang /* bit-fields of PTP3_CPU_SPMC_SW_CFG */
159*1da57e54SGarmin.Chang #define SW_SPARK_EN			BIT(0)
160*1da57e54SGarmin.Chang 
161*1da57e54SGarmin.Chang /* bit-fields of CPU0_ILDO_CONTROL8 */
162*1da57e54SGarmin.Chang #define ILDO_BYPASS_B			BIT(0)
163*1da57e54SGarmin.Chang 
164*1da57e54SGarmin.Chang static const struct per_cpu_reg MCUCFG_SPARK[] = {
165*1da57e54SGarmin.Chang 	{ .cluster_addr = PTP3_CPU0_SPMC_SW_CFG, .cpu_stride = 11U }
166*1da57e54SGarmin.Chang };
167*1da57e54SGarmin.Chang 
168*1da57e54SGarmin.Chang static const struct per_cpu_reg ILDO_CONTROL5[] = {
169*1da57e54SGarmin.Chang 	{ .cluster_addr = CPU0_ILDO_CONTROL5, .cpu_stride = 11U }
170*1da57e54SGarmin.Chang };
171*1da57e54SGarmin.Chang 
172*1da57e54SGarmin.Chang static const struct per_cpu_reg ILDO_CONTROL8[] = {
173*1da57e54SGarmin.Chang 	{ .cluster_addr = CPU0_ILDO_CONTROL8, .cpu_stride = 11U }
174*1da57e54SGarmin.Chang };
175*1da57e54SGarmin.Chang 
176*1da57e54SGarmin.Chang #endif /* MTSPMC_PRIVATE_H */
177