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