1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright (c) 2016-2019, ARM Limited and Contributors. All rights reserved. 3*91f16700Schasinglulu * 4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause 5*91f16700Schasinglulu */ 6*91f16700Schasinglulu 7*91f16700Schasinglulu #ifndef PMU_H 8*91f16700Schasinglulu #define PMU_H 9*91f16700Schasinglulu 10*91f16700Schasinglulu #include <pmu_bits.h> 11*91f16700Schasinglulu #include <pmu_regs.h> 12*91f16700Schasinglulu #include <soc.h> 13*91f16700Schasinglulu 14*91f16700Schasinglulu /* Allocate sp reginon in pmusram */ 15*91f16700Schasinglulu #define PSRAM_SP_SIZE 0x80 16*91f16700Schasinglulu #define PSRAM_SP_BOTTOM (PSRAM_SP_TOP - PSRAM_SP_SIZE) 17*91f16700Schasinglulu 18*91f16700Schasinglulu /***************************************************************************** 19*91f16700Schasinglulu * Common define for per soc pmu.h 20*91f16700Schasinglulu *****************************************************************************/ 21*91f16700Schasinglulu /* The ways of cores power domain contorlling */ 22*91f16700Schasinglulu enum cores_pm_ctr_mode { 23*91f16700Schasinglulu core_pwr_pd = 0, 24*91f16700Schasinglulu core_pwr_wfi = 1, 25*91f16700Schasinglulu core_pwr_wfi_int = 2 26*91f16700Schasinglulu }; 27*91f16700Schasinglulu 28*91f16700Schasinglulu /***************************************************************************** 29*91f16700Schasinglulu * pmu con,reg 30*91f16700Schasinglulu *****************************************************************************/ 31*91f16700Schasinglulu #define PMU_WKUP_CFG(n) ((n) * 4) 32*91f16700Schasinglulu 33*91f16700Schasinglulu #define PMU_CORE_PM_CON(cpu) (0xc0 + (cpu * 4)) 34*91f16700Schasinglulu 35*91f16700Schasinglulu /* the shift of bits for cores status */ 36*91f16700Schasinglulu enum pmu_core_pwrst_shift { 37*91f16700Schasinglulu clstl_cpu_wfe = 2, 38*91f16700Schasinglulu clstl_cpu_wfi = 6, 39*91f16700Schasinglulu clstb_cpu_wfe = 12, 40*91f16700Schasinglulu clstb_cpu_wfi = 16 41*91f16700Schasinglulu }; 42*91f16700Schasinglulu 43*91f16700Schasinglulu #define CKECK_WFE_MSK 0x1 44*91f16700Schasinglulu #define CKECK_WFI_MSK 0x10 45*91f16700Schasinglulu #define CKECK_WFEI_MSK 0x11 46*91f16700Schasinglulu 47*91f16700Schasinglulu /* Specific features required */ 48*91f16700Schasinglulu #define AP_PWROFF 0x0a 49*91f16700Schasinglulu 50*91f16700Schasinglulu #define GPIO0A0_SMT_ENABLE BITS_WITH_WMASK(1, 3, 0) 51*91f16700Schasinglulu #define GPIO1A6_IOMUX BITS_WITH_WMASK(0, 3, 12) 52*91f16700Schasinglulu 53*91f16700Schasinglulu #define TSADC_INT_PIN 38 54*91f16700Schasinglulu #define CORES_PM_DISABLE 0x0 55*91f16700Schasinglulu 56*91f16700Schasinglulu #define PD_CTR_LOOP 10000 57*91f16700Schasinglulu #define CHK_CPU_LOOP 500 58*91f16700Schasinglulu #define MAX_WAIT_COUNT 1000 59*91f16700Schasinglulu 60*91f16700Schasinglulu #define GRF_SOC_CON4 0x0e210 61*91f16700Schasinglulu 62*91f16700Schasinglulu #define PMUGRF_GPIO0A_SMT 0x0120 63*91f16700Schasinglulu #define PMUGRF_SOC_CON0 0x0180 64*91f16700Schasinglulu 65*91f16700Schasinglulu #define CCI_FORCE_WAKEUP WMSK_BIT(8) 66*91f16700Schasinglulu #define EXTERNAL_32K WMSK_BIT(0) 67*91f16700Schasinglulu 68*91f16700Schasinglulu #define PLL_PD_HW 0xff 69*91f16700Schasinglulu #define IOMUX_CLK_32K 0x00030002 70*91f16700Schasinglulu #define NOC_AUTO_ENABLE 0x3fffffff 71*91f16700Schasinglulu 72*91f16700Schasinglulu #define SAVE_QOS(array, NAME) \ 73*91f16700Schasinglulu RK3399_CPU_AXI_SAVE_QOS(array, CPU_AXI_##NAME##_QOS_BASE) 74*91f16700Schasinglulu #define RESTORE_QOS(array, NAME) \ 75*91f16700Schasinglulu RK3399_CPU_AXI_RESTORE_QOS(array, CPU_AXI_##NAME##_QOS_BASE) 76*91f16700Schasinglulu 77*91f16700Schasinglulu #define RK3399_CPU_AXI_SAVE_QOS(array, base) do { \ 78*91f16700Schasinglulu array[0] = mmio_read_32(base + CPU_AXI_QOS_ID_COREID); \ 79*91f16700Schasinglulu array[1] = mmio_read_32(base + CPU_AXI_QOS_REVISIONID); \ 80*91f16700Schasinglulu array[2] = mmio_read_32(base + CPU_AXI_QOS_PRIORITY); \ 81*91f16700Schasinglulu array[3] = mmio_read_32(base + CPU_AXI_QOS_MODE); \ 82*91f16700Schasinglulu array[4] = mmio_read_32(base + CPU_AXI_QOS_BANDWIDTH); \ 83*91f16700Schasinglulu array[5] = mmio_read_32(base + CPU_AXI_QOS_SATURATION); \ 84*91f16700Schasinglulu array[6] = mmio_read_32(base + CPU_AXI_QOS_EXTCONTROL); \ 85*91f16700Schasinglulu } while (0) 86*91f16700Schasinglulu 87*91f16700Schasinglulu #define RK3399_CPU_AXI_RESTORE_QOS(array, base) do { \ 88*91f16700Schasinglulu mmio_write_32(base + CPU_AXI_QOS_ID_COREID, array[0]); \ 89*91f16700Schasinglulu mmio_write_32(base + CPU_AXI_QOS_REVISIONID, array[1]); \ 90*91f16700Schasinglulu mmio_write_32(base + CPU_AXI_QOS_PRIORITY, array[2]); \ 91*91f16700Schasinglulu mmio_write_32(base + CPU_AXI_QOS_MODE, array[3]); \ 92*91f16700Schasinglulu mmio_write_32(base + CPU_AXI_QOS_BANDWIDTH, array[4]); \ 93*91f16700Schasinglulu mmio_write_32(base + CPU_AXI_QOS_SATURATION, array[5]); \ 94*91f16700Schasinglulu mmio_write_32(base + CPU_AXI_QOS_EXTCONTROL, array[6]); \ 95*91f16700Schasinglulu } while (0) 96*91f16700Schasinglulu 97*91f16700Schasinglulu struct pmu_slpdata_s { 98*91f16700Schasinglulu uint32_t cci_m0_qos[CPU_AXI_QOS_NUM_REGS]; 99*91f16700Schasinglulu uint32_t cci_m1_qos[CPU_AXI_QOS_NUM_REGS]; 100*91f16700Schasinglulu uint32_t dmac0_qos[CPU_AXI_QOS_NUM_REGS]; 101*91f16700Schasinglulu uint32_t dmac1_qos[CPU_AXI_QOS_NUM_REGS]; 102*91f16700Schasinglulu uint32_t dcf_qos[CPU_AXI_QOS_NUM_REGS]; 103*91f16700Schasinglulu uint32_t crypto0_qos[CPU_AXI_QOS_NUM_REGS]; 104*91f16700Schasinglulu uint32_t crypto1_qos[CPU_AXI_QOS_NUM_REGS]; 105*91f16700Schasinglulu uint32_t pmu_cm0_qos[CPU_AXI_QOS_NUM_REGS]; 106*91f16700Schasinglulu uint32_t peri_cm1_qos[CPU_AXI_QOS_NUM_REGS]; 107*91f16700Schasinglulu uint32_t gic_qos[CPU_AXI_QOS_NUM_REGS]; 108*91f16700Schasinglulu uint32_t sdmmc_qos[CPU_AXI_QOS_NUM_REGS]; 109*91f16700Schasinglulu uint32_t gmac_qos[CPU_AXI_QOS_NUM_REGS]; 110*91f16700Schasinglulu uint32_t emmc_qos[CPU_AXI_QOS_NUM_REGS]; 111*91f16700Schasinglulu uint32_t usb_otg0_qos[CPU_AXI_QOS_NUM_REGS]; 112*91f16700Schasinglulu uint32_t usb_otg1_qos[CPU_AXI_QOS_NUM_REGS]; 113*91f16700Schasinglulu uint32_t usb_host0_qos[CPU_AXI_QOS_NUM_REGS]; 114*91f16700Schasinglulu uint32_t usb_host1_qos[CPU_AXI_QOS_NUM_REGS]; 115*91f16700Schasinglulu uint32_t gpu_qos[CPU_AXI_QOS_NUM_REGS]; 116*91f16700Schasinglulu uint32_t video_m0_qos[CPU_AXI_QOS_NUM_REGS]; 117*91f16700Schasinglulu uint32_t video_m1_r_qos[CPU_AXI_QOS_NUM_REGS]; 118*91f16700Schasinglulu uint32_t video_m1_w_qos[CPU_AXI_QOS_NUM_REGS]; 119*91f16700Schasinglulu uint32_t rga_r_qos[CPU_AXI_QOS_NUM_REGS]; 120*91f16700Schasinglulu uint32_t rga_w_qos[CPU_AXI_QOS_NUM_REGS]; 121*91f16700Schasinglulu uint32_t vop_big_r[CPU_AXI_QOS_NUM_REGS]; 122*91f16700Schasinglulu uint32_t vop_big_w[CPU_AXI_QOS_NUM_REGS]; 123*91f16700Schasinglulu uint32_t vop_little[CPU_AXI_QOS_NUM_REGS]; 124*91f16700Schasinglulu uint32_t iep_qos[CPU_AXI_QOS_NUM_REGS]; 125*91f16700Schasinglulu uint32_t isp1_m0_qos[CPU_AXI_QOS_NUM_REGS]; 126*91f16700Schasinglulu uint32_t isp1_m1_qos[CPU_AXI_QOS_NUM_REGS]; 127*91f16700Schasinglulu uint32_t isp0_m0_qos[CPU_AXI_QOS_NUM_REGS]; 128*91f16700Schasinglulu uint32_t isp0_m1_qos[CPU_AXI_QOS_NUM_REGS]; 129*91f16700Schasinglulu uint32_t hdcp_qos[CPU_AXI_QOS_NUM_REGS]; 130*91f16700Schasinglulu uint32_t perihp_nsp_qos[CPU_AXI_QOS_NUM_REGS]; 131*91f16700Schasinglulu uint32_t perilp_nsp_qos[CPU_AXI_QOS_NUM_REGS]; 132*91f16700Schasinglulu uint32_t perilpslv_nsp_qos[CPU_AXI_QOS_NUM_REGS]; 133*91f16700Schasinglulu uint32_t sdio_qos[CPU_AXI_QOS_NUM_REGS]; 134*91f16700Schasinglulu }; 135*91f16700Schasinglulu 136*91f16700Schasinglulu extern uint32_t clst_warmboot_data[PLATFORM_CLUSTER_COUNT]; 137*91f16700Schasinglulu 138*91f16700Schasinglulu extern void sram_func_set_ddrctl_pll(uint32_t pll_src); 139*91f16700Schasinglulu void pmu_power_domains_on(void); 140*91f16700Schasinglulu 141*91f16700Schasinglulu #endif /* PMU_H */ 142