xref: /rk3399_ARM-atf/plat/mediatek/mt8195/drivers/spmc/mtspmc_private.h (revision a92b02566e23ca73f9874555335dc6b19f0f242c)
10d82eff6SJames Liao /*
20d82eff6SJames Liao  * Copyright (c) 2020, MediaTek Inc. All rights reserved.
30d82eff6SJames Liao  *
40d82eff6SJames Liao  * SPDX-License-Identifier: BSD-3-Clause
50d82eff6SJames Liao  */
60d82eff6SJames Liao 
70d82eff6SJames Liao #ifndef MTSPMC_PRIVATE_H
80d82eff6SJames Liao #define MTSPMC_PRIVATE_H
90d82eff6SJames Liao 
100d82eff6SJames Liao #include <lib/utils_def.h>
110d82eff6SJames Liao #include <platform_def.h>
120d82eff6SJames Liao 
130d82eff6SJames Liao unsigned long read_cpuectlr(void);
140d82eff6SJames Liao void write_cpuectlr(unsigned long cpuectlr);
150d82eff6SJames Liao 
160d82eff6SJames Liao unsigned long read_cpupwrctlr_el1(void);
170d82eff6SJames Liao void write_cpupwrctlr_el1(unsigned long cpuectlr);
180d82eff6SJames Liao 
190d82eff6SJames Liao /*
200d82eff6SJames Liao  * per_cpu/cluster helper
210d82eff6SJames Liao  */
220d82eff6SJames Liao struct per_cpu_reg {
230d82eff6SJames Liao 	unsigned int cluster_addr;
240d82eff6SJames Liao 	unsigned int cpu_stride;
250d82eff6SJames Liao };
260d82eff6SJames Liao 
270d82eff6SJames Liao #define per_cpu(cluster, cpu, reg)	\
280d82eff6SJames Liao 	(reg[cluster].cluster_addr + (cpu << reg[cluster].cpu_stride))
290d82eff6SJames Liao 
300d82eff6SJames Liao #define per_cluster(cluster, reg)	(reg[cluster].cluster_addr)
310d82eff6SJames Liao 
320d82eff6SJames Liao #define SPM_REG(ofs)			(uint32_t)(SPM_BASE + (ofs))
330d82eff6SJames Liao #define MCUCFG_REG(ofs)			(uint32_t)(MCUCFG_BASE + (ofs))
340d82eff6SJames Liao #define INFRACFG_AO_REG(ofs)		(uint32_t)(INFRACFG_AO_BASE + (ofs))
350d82eff6SJames Liao 
360d82eff6SJames Liao /* === SPMC related registers */
370d82eff6SJames Liao #define SPM_POWERON_CONFIG_EN		SPM_REG(0x000)
380d82eff6SJames Liao /* bit-fields of SPM_POWERON_CONFIG_EN */
390d82eff6SJames Liao #define PROJECT_CODE			(U(0xb16) << 16)
400d82eff6SJames Liao #define BCLK_CG_EN			BIT(0)
410d82eff6SJames Liao 
420d82eff6SJames Liao #define SPM_PWR_STATUS			SPM_REG(0x16c)
430d82eff6SJames Liao #define SPM_PWR_STATUS_2ND		SPM_REG(0x170)
440d82eff6SJames Liao #define SPM_CPU_PWR_STATUS		SPM_REG(0x174)
450d82eff6SJames Liao 
460d82eff6SJames Liao /* bit-fields of SPM_PWR_STATUS */
470d82eff6SJames Liao #define MD				BIT(0)
480d82eff6SJames Liao #define CONN				BIT(1)
490d82eff6SJames Liao #define DDRPHY				BIT(2)
500d82eff6SJames Liao #define DISP				BIT(3)
510d82eff6SJames Liao #define MFG				BIT(4)
520d82eff6SJames Liao #define ISP				BIT(5)
530d82eff6SJames Liao #define INFRA				BIT(6)
540d82eff6SJames Liao #define VDEC				BIT(7)
550d82eff6SJames Liao #define MP0_CPUTOP			BIT(8)
560d82eff6SJames Liao #define MP0_CPU0			BIT(9)
570d82eff6SJames Liao #define MP0_CPU1			BIT(10)
580d82eff6SJames Liao #define MP0_CPU2			BIT(11)
590d82eff6SJames Liao #define MP0_CPU3			BIT(12)
600d82eff6SJames Liao #define MCUSYS				BIT(14)
610d82eff6SJames Liao #define MP0_CPU4			BIT(15)
620d82eff6SJames Liao #define MP0_CPU5			BIT(16)
630d82eff6SJames Liao #define MP0_CPU6			BIT(17)
640d82eff6SJames Liao #define MP0_CPU7			BIT(18)
650d82eff6SJames Liao #define VEN				BIT(21)
660d82eff6SJames Liao 
670d82eff6SJames Liao /* === SPMC related registers */
680d82eff6SJames Liao #define SPM_MCUSYS_PWR_CON		MCUCFG_REG(0xd200)
690d82eff6SJames Liao #define SPM_MP0_CPUTOP_PWR_CON		MCUCFG_REG(0xd204)
700d82eff6SJames Liao #define SPM_MP0_CPU0_PWR_CON		MCUCFG_REG(0xd208)
710d82eff6SJames Liao #define SPM_MP0_CPU1_PWR_CON		MCUCFG_REG(0xd20c)
720d82eff6SJames Liao #define SPM_MP0_CPU2_PWR_CON		MCUCFG_REG(0xd210)
730d82eff6SJames Liao #define SPM_MP0_CPU3_PWR_CON		MCUCFG_REG(0xd214)
740d82eff6SJames Liao #define SPM_MP0_CPU4_PWR_CON		MCUCFG_REG(0xd218)
750d82eff6SJames Liao #define SPM_MP0_CPU5_PWR_CON		MCUCFG_REG(0xd21c)
760d82eff6SJames Liao #define SPM_MP0_CPU6_PWR_CON		MCUCFG_REG(0xd220)
770d82eff6SJames Liao #define SPM_MP0_CPU7_PWR_CON		MCUCFG_REG(0xd224)
780d82eff6SJames Liao 
790d82eff6SJames Liao /* bit fields of SPM_*_PWR_CON */
800d82eff6SJames Liao #define PWR_ON_ACK			BIT(31)
810d82eff6SJames Liao #define VPROC_EXT_OFF			BIT(7)
820d82eff6SJames Liao #define DORMANT_EN			BIT(6)
830d82eff6SJames Liao #define RESETPWRON_CONFIG		BIT(5)
840d82eff6SJames Liao #define PWR_CLK_DIS			BIT(4)
850d82eff6SJames Liao #define PWR_ON				BIT(2)
860d82eff6SJames Liao #define PWR_RST_B			BIT(0)
870d82eff6SJames Liao 
880d82eff6SJames Liao /**** per_cpu registers for SPM_MP0_CPU?_PWR_CON */
890d82eff6SJames Liao static const struct per_cpu_reg SPM_CPU_PWR[] = {
900d82eff6SJames Liao 	{ .cluster_addr = SPM_MP0_CPU0_PWR_CON, .cpu_stride = 2U }
910d82eff6SJames Liao };
920d82eff6SJames Liao 
930d82eff6SJames Liao /**** per_cluster registers for SPM_MP0_CPUTOP_PWR_CON */
940d82eff6SJames Liao static const struct per_cpu_reg SPM_CLUSTER_PWR[] = {
950d82eff6SJames Liao 	{ .cluster_addr = SPM_MP0_CPUTOP_PWR_CON, .cpu_stride = 0U }
960d82eff6SJames Liao };
970d82eff6SJames Liao 
980d82eff6SJames Liao /* === MCUCFG related registers */
990d82eff6SJames Liao /* aa64naa32 */
1000d82eff6SJames Liao #define MCUCFG_MP0_CLUSTER_CFG5		MCUCFG_REG(0xc8e4)
1010d82eff6SJames Liao /* reset vectors */
1020d82eff6SJames Liao #define MCUCFG_MP0_CLUSTER_CFG8		MCUCFG_REG(0xc900)
1030d82eff6SJames Liao #define MCUCFG_MP0_CLUSTER_CFG10	MCUCFG_REG(0xc908)
1040d82eff6SJames Liao #define MCUCFG_MP0_CLUSTER_CFG12	MCUCFG_REG(0xc910)
1050d82eff6SJames Liao #define MCUCFG_MP0_CLUSTER_CFG14	MCUCFG_REG(0xc918)
1060d82eff6SJames Liao #define MCUCFG_MP0_CLUSTER_CFG16	MCUCFG_REG(0xc920)
1070d82eff6SJames Liao #define MCUCFG_MP0_CLUSTER_CFG18	MCUCFG_REG(0xc928)
1080d82eff6SJames Liao #define MCUCFG_MP0_CLUSTER_CFG20	MCUCFG_REG(0xc930)
1090d82eff6SJames Liao #define MCUCFG_MP0_CLUSTER_CFG22	MCUCFG_REG(0xc938)
1100d82eff6SJames Liao 
1110d82eff6SJames Liao /* MCUSYS DREQ BIG VPROC ISO control */
1120d82eff6SJames Liao #define DREQ20_BIG_VPROC_ISO		MCUCFG_REG(0xad8c)
1130d82eff6SJames Liao 
1140d82eff6SJames Liao /**** per_cpu registers for MCUCFG_MP0_CLUSTER_CFG? */
1150d82eff6SJames Liao static const struct per_cpu_reg MCUCFG_BOOTADDR[] = {
1160d82eff6SJames Liao 	{ .cluster_addr = MCUCFG_MP0_CLUSTER_CFG8, .cpu_stride = 3U }
1170d82eff6SJames Liao };
1180d82eff6SJames Liao 
1190d82eff6SJames Liao /**** per_cpu registers for MCUCFG_MP0_CLUSTER_CFG5 */
1200d82eff6SJames Liao static const struct per_cpu_reg MCUCFG_INITARCH[] = {
1210d82eff6SJames Liao 	{ .cluster_addr = MCUCFG_MP0_CLUSTER_CFG5, .cpu_stride = 0U }
1220d82eff6SJames Liao };
1230d82eff6SJames Liao 
1240d82eff6SJames Liao #define MCUCFG_INITARCH_CPU_BIT(cpu)	BIT(16U + cpu)
1250d82eff6SJames Liao /* === CPC control */
1260d82eff6SJames Liao #define MCUCFG_CPC_FLOW_CTRL_CFG	MCUCFG_REG(0xa814)
1270d82eff6SJames Liao #define MCUCFG_CPC_SPMC_PWR_STATUS	MCUCFG_REG(0xa840)
1280d82eff6SJames Liao 
1290d82eff6SJames Liao /* bit fields of CPC_FLOW_CTRL_CFG */
1300d82eff6SJames Liao #define CPC_CTRL_ENABLE			BIT(16)
131*fe985428SJames Liao #define SSPM_CORE_PWR_ON_EN		BIT(7) /* for cpu-hotplug */
1320d82eff6SJames Liao #define SSPM_ALL_PWR_CTRL_EN		BIT(13) /* for cpu-hotplug */
1330d82eff6SJames Liao #define GIC_WAKEUP_IGNORE(cpu)		BIT(21 + cpu)
1340d82eff6SJames Liao 
1350d82eff6SJames Liao /* bit fields of CPC_SPMC_PWR_STATUS */
136*fe985428SJames Liao #define CORE_SPMC_PWR_ON_ACK		GENMASK(11, 0)
1370d82eff6SJames Liao 
1380d82eff6SJames Liao /* === APB Module infracfg_ao */
1390d82eff6SJames Liao #define INFRA_TOPAXI_PROTECTEN		INFRACFG_AO_REG(0x0220)
1400d82eff6SJames Liao #define INFRA_TOPAXI_PROTECTEN_STA0	INFRACFG_AO_REG(0x0224)
1410d82eff6SJames Liao #define INFRA_TOPAXI_PROTECTEN_STA1	INFRACFG_AO_REG(0x0228)
1420d82eff6SJames Liao #define INFRA_TOPAXI_PROTECTEN_SET	INFRACFG_AO_REG(0x02a0)
1430d82eff6SJames Liao #define INFRA_TOPAXI_PROTECTEN_CLR	INFRACFG_AO_REG(0x02a4)
1440d82eff6SJames Liao #define INFRA_TOPAXI_PROTECTEN_1	INFRACFG_AO_REG(0x0250)
1450d82eff6SJames Liao #define INFRA_TOPAXI_PROTECTEN_STA0_1	INFRACFG_AO_REG(0x0254)
1460d82eff6SJames Liao #define INFRA_TOPAXI_PROTECTEN_STA1_1	INFRACFG_AO_REG(0x0258)
1470d82eff6SJames Liao #define INFRA_TOPAXI_PROTECTEN_1_SET	INFRACFG_AO_REG(0x02a8)
1480d82eff6SJames Liao #define INFRA_TOPAXI_PROTECTEN_1_CLR	INFRACFG_AO_REG(0x02ac)
1490d82eff6SJames Liao 
1500d82eff6SJames Liao /* bit fields of INFRA_TOPAXI_PROTECTEN */
1510d82eff6SJames Liao #define MP0_SPMC_PROT_STEP1_0_MASK	BIT(12)
1520d82eff6SJames Liao #define MP0_SPMC_PROT_STEP1_1_MASK	(BIT(26) | BIT(12))
1530d82eff6SJames Liao 
1540d82eff6SJames Liao /* === SPARK */
1550d82eff6SJames Liao #define VOLTAGE_04			U(0x40)
1560d82eff6SJames Liao #define VOLTAGE_05			U(0x60)
1570d82eff6SJames Liao 
1580d82eff6SJames Liao #define PTP3_CPU0_SPMC_SW_CFG		MCUCFG_REG(0x200)
1590d82eff6SJames Liao #define CPU0_ILDO_CONTROL5		MCUCFG_REG(0x334)
1600d82eff6SJames Liao #define CPU0_ILDO_CONTROL8		MCUCFG_REG(0x340)
1610d82eff6SJames Liao 
1620d82eff6SJames Liao /* bit fields of CPU0_ILDO_CONTROL5 */
1630d82eff6SJames Liao #define ILDO_RET_VOSEL			GENMASK(7, 0)
1640d82eff6SJames Liao 
1650d82eff6SJames Liao /* bit fields of PTP3_CPU_SPMC_SW_CFG */
1660d82eff6SJames Liao #define SW_SPARK_EN			BIT(0)
1670d82eff6SJames Liao 
1680d82eff6SJames Liao /* bit fields of CPU0_ILDO_CONTROL8 */
1690d82eff6SJames Liao #define ILDO_BYPASS_B			BIT(0)
1700d82eff6SJames Liao 
1710d82eff6SJames Liao static const struct per_cpu_reg MCUCFG_SPARK[] = {
1720d82eff6SJames Liao 	{ .cluster_addr = PTP3_CPU0_SPMC_SW_CFG, .cpu_stride = 11U }
1730d82eff6SJames Liao };
1740d82eff6SJames Liao 
1750d82eff6SJames Liao static const struct per_cpu_reg ILDO_CONTROL5[] = {
1760d82eff6SJames Liao 	{ .cluster_addr = CPU0_ILDO_CONTROL5, .cpu_stride = 11U }
1770d82eff6SJames Liao };
1780d82eff6SJames Liao 
1790d82eff6SJames Liao static const struct per_cpu_reg ILDO_CONTROL8[] = {
1800d82eff6SJames Liao 	{ .cluster_addr = CPU0_ILDO_CONTROL8, .cpu_stride = 11U }
1810d82eff6SJames Liao };
1820d82eff6SJames Liao 
1830d82eff6SJames Liao #endif /* MTSPMC_PRIVATE_H */
184