16fba6e04STony Xie /* 2c1185ffdSJulius Werner * Copyright (c) 2016-2019, ARM Limited and Contributors. All rights reserved. 36fba6e04STony Xie * 482cb2c1aSdp-arm * SPDX-License-Identifier: BSD-3-Clause 56fba6e04STony Xie */ 66fba6e04STony Xie 7c3cf06f1SAntonio Nino Diaz #ifndef PMU_H 8c3cf06f1SAntonio Nino Diaz #define PMU_H 96fba6e04STony Xie 101830f790SXing Zheng #include <pmu_bits.h> 119c68748eSCaesar Wang #include <pmu_regs.h> 124c127e68SCaesar Wang #include <soc.h> 139c68748eSCaesar Wang 146fba6e04STony Xie /* Allocate sp reginon in pmusram */ 156fba6e04STony Xie #define PSRAM_SP_SIZE 0x80 166fba6e04STony Xie #define PSRAM_SP_BOTTOM (PSRAM_SP_TOP - PSRAM_SP_SIZE) 176fba6e04STony Xie 186fba6e04STony Xie /***************************************************************************** 196fba6e04STony Xie * Common define for per soc pmu.h 206fba6e04STony Xie *****************************************************************************/ 216fba6e04STony Xie /* The ways of cores power domain contorlling */ 226fba6e04STony Xie enum cores_pm_ctr_mode { 236fba6e04STony Xie core_pwr_pd = 0, 246fba6e04STony Xie core_pwr_wfi = 1, 256fba6e04STony Xie core_pwr_wfi_int = 2 266fba6e04STony Xie }; 276fba6e04STony Xie 286fba6e04STony Xie /***************************************************************************** 296fba6e04STony Xie * pmu con,reg 306fba6e04STony Xie *****************************************************************************/ 316fba6e04STony Xie #define PMU_WKUP_CFG(n) ((n) * 4) 326fba6e04STony Xie 336fba6e04STony Xie #define PMU_CORE_PM_CON(cpu) (0xc0 + (cpu * 4)) 346fba6e04STony Xie 356fba6e04STony Xie /* the shift of bits for cores status */ 366fba6e04STony Xie enum pmu_core_pwrst_shift { 376fba6e04STony Xie clstl_cpu_wfe = 2, 386fba6e04STony Xie clstl_cpu_wfi = 6, 396fba6e04STony Xie clstb_cpu_wfe = 12, 406fba6e04STony Xie clstb_cpu_wfi = 16 416fba6e04STony Xie }; 426fba6e04STony Xie 436fba6e04STony Xie #define CKECK_WFE_MSK 0x1 446fba6e04STony Xie #define CKECK_WFI_MSK 0x10 456fba6e04STony Xie #define CKECK_WFEI_MSK 0x11 466fba6e04STony Xie 479c68748eSCaesar Wang /* Specific features required */ 48f47a25ddSCaesar Wang #define AP_PWROFF 0x0a 49e6517abdSCaesar Wang 509d5aee2bSCaesar Wang #define GPIO0A0_SMT_ENABLE BITS_WITH_WMASK(1, 3, 0) 5186c253e4SCaesar Wang #define GPIO1A6_IOMUX BITS_WITH_WMASK(0, 3, 12) 52e6517abdSCaesar Wang 5386c253e4SCaesar Wang #define TSADC_INT_PIN 38 546fba6e04STony Xie #define CORES_PM_DISABLE 0x0 556fba6e04STony Xie 56aa9ee82dSDerek Basehore #define PD_CTR_LOOP 10000 576fba6e04STony Xie #define CHK_CPU_LOOP 500 589ec78bdfSTony Xie #define MAX_WAIT_COUNT 1000 596fba6e04STony Xie 609ec78bdfSTony Xie #define GRF_SOC_CON4 0x0e210 612bff35bbSCaesar Wang 629d5aee2bSCaesar Wang #define PMUGRF_GPIO0A_SMT 0x0120 639ec78bdfSTony Xie #define PMUGRF_SOC_CON0 0x0180 649ec78bdfSTony Xie 659ec78bdfSTony Xie #define CCI_FORCE_WAKEUP WMSK_BIT(8) 669ec78bdfSTony Xie #define EXTERNAL_32K WMSK_BIT(0) 679ec78bdfSTony Xie 689ec78bdfSTony Xie #define PLL_PD_HW 0xff 699ec78bdfSTony Xie #define IOMUX_CLK_32K 0x00030002 709ec78bdfSTony Xie #define NOC_AUTO_ENABLE 0x3fffffff 719ec78bdfSTony Xie 729ec78bdfSTony Xie #define SAVE_QOS(array, NAME) \ 739ec78bdfSTony Xie RK3399_CPU_AXI_SAVE_QOS(array, CPU_AXI_##NAME##_QOS_BASE) 749ec78bdfSTony Xie #define RESTORE_QOS(array, NAME) \ 759ec78bdfSTony Xie RK3399_CPU_AXI_RESTORE_QOS(array, CPU_AXI_##NAME##_QOS_BASE) 769ec78bdfSTony Xie 779ec78bdfSTony Xie #define RK3399_CPU_AXI_SAVE_QOS(array, base) do { \ 789ec78bdfSTony Xie array[0] = mmio_read_32(base + CPU_AXI_QOS_ID_COREID); \ 799ec78bdfSTony Xie array[1] = mmio_read_32(base + CPU_AXI_QOS_REVISIONID); \ 809ec78bdfSTony Xie array[2] = mmio_read_32(base + CPU_AXI_QOS_PRIORITY); \ 819ec78bdfSTony Xie array[3] = mmio_read_32(base + CPU_AXI_QOS_MODE); \ 829ec78bdfSTony Xie array[4] = mmio_read_32(base + CPU_AXI_QOS_BANDWIDTH); \ 839ec78bdfSTony Xie array[5] = mmio_read_32(base + CPU_AXI_QOS_SATURATION); \ 849ec78bdfSTony Xie array[6] = mmio_read_32(base + CPU_AXI_QOS_EXTCONTROL); \ 859ec78bdfSTony Xie } while (0) 869ec78bdfSTony Xie 879ec78bdfSTony Xie #define RK3399_CPU_AXI_RESTORE_QOS(array, base) do { \ 889ec78bdfSTony Xie mmio_write_32(base + CPU_AXI_QOS_ID_COREID, array[0]); \ 899ec78bdfSTony Xie mmio_write_32(base + CPU_AXI_QOS_REVISIONID, array[1]); \ 909ec78bdfSTony Xie mmio_write_32(base + CPU_AXI_QOS_PRIORITY, array[2]); \ 919ec78bdfSTony Xie mmio_write_32(base + CPU_AXI_QOS_MODE, array[3]); \ 929ec78bdfSTony Xie mmio_write_32(base + CPU_AXI_QOS_BANDWIDTH, array[4]); \ 939ec78bdfSTony Xie mmio_write_32(base + CPU_AXI_QOS_SATURATION, array[5]); \ 949ec78bdfSTony Xie mmio_write_32(base + CPU_AXI_QOS_EXTCONTROL, array[6]); \ 959ec78bdfSTony Xie } while (0) 969ec78bdfSTony Xie 979ec78bdfSTony Xie struct pmu_slpdata_s { 989ec78bdfSTony Xie uint32_t cci_m0_qos[CPU_AXI_QOS_NUM_REGS]; 999ec78bdfSTony Xie uint32_t cci_m1_qos[CPU_AXI_QOS_NUM_REGS]; 1009ec78bdfSTony Xie uint32_t dmac0_qos[CPU_AXI_QOS_NUM_REGS]; 1019ec78bdfSTony Xie uint32_t dmac1_qos[CPU_AXI_QOS_NUM_REGS]; 1029ec78bdfSTony Xie uint32_t dcf_qos[CPU_AXI_QOS_NUM_REGS]; 1039ec78bdfSTony Xie uint32_t crypto0_qos[CPU_AXI_QOS_NUM_REGS]; 1049ec78bdfSTony Xie uint32_t crypto1_qos[CPU_AXI_QOS_NUM_REGS]; 1059ec78bdfSTony Xie uint32_t pmu_cm0_qos[CPU_AXI_QOS_NUM_REGS]; 1069ec78bdfSTony Xie uint32_t peri_cm1_qos[CPU_AXI_QOS_NUM_REGS]; 1079ec78bdfSTony Xie uint32_t gic_qos[CPU_AXI_QOS_NUM_REGS]; 1089ec78bdfSTony Xie uint32_t sdmmc_qos[CPU_AXI_QOS_NUM_REGS]; 1099ec78bdfSTony Xie uint32_t gmac_qos[CPU_AXI_QOS_NUM_REGS]; 1109ec78bdfSTony Xie uint32_t emmc_qos[CPU_AXI_QOS_NUM_REGS]; 1119ec78bdfSTony Xie uint32_t usb_otg0_qos[CPU_AXI_QOS_NUM_REGS]; 1129ec78bdfSTony Xie uint32_t usb_otg1_qos[CPU_AXI_QOS_NUM_REGS]; 1139ec78bdfSTony Xie uint32_t usb_host0_qos[CPU_AXI_QOS_NUM_REGS]; 1149ec78bdfSTony Xie uint32_t usb_host1_qos[CPU_AXI_QOS_NUM_REGS]; 1159ec78bdfSTony Xie uint32_t gpu_qos[CPU_AXI_QOS_NUM_REGS]; 1169ec78bdfSTony Xie uint32_t video_m0_qos[CPU_AXI_QOS_NUM_REGS]; 1179ec78bdfSTony Xie uint32_t video_m1_r_qos[CPU_AXI_QOS_NUM_REGS]; 1189ec78bdfSTony Xie uint32_t video_m1_w_qos[CPU_AXI_QOS_NUM_REGS]; 1199ec78bdfSTony Xie uint32_t rga_r_qos[CPU_AXI_QOS_NUM_REGS]; 1209ec78bdfSTony Xie uint32_t rga_w_qos[CPU_AXI_QOS_NUM_REGS]; 1219ec78bdfSTony Xie uint32_t vop_big_r[CPU_AXI_QOS_NUM_REGS]; 1229ec78bdfSTony Xie uint32_t vop_big_w[CPU_AXI_QOS_NUM_REGS]; 1239ec78bdfSTony Xie uint32_t vop_little[CPU_AXI_QOS_NUM_REGS]; 1249ec78bdfSTony Xie uint32_t iep_qos[CPU_AXI_QOS_NUM_REGS]; 1259ec78bdfSTony Xie uint32_t isp1_m0_qos[CPU_AXI_QOS_NUM_REGS]; 1269ec78bdfSTony Xie uint32_t isp1_m1_qos[CPU_AXI_QOS_NUM_REGS]; 1279ec78bdfSTony Xie uint32_t isp0_m0_qos[CPU_AXI_QOS_NUM_REGS]; 1289ec78bdfSTony Xie uint32_t isp0_m1_qos[CPU_AXI_QOS_NUM_REGS]; 1299ec78bdfSTony Xie uint32_t hdcp_qos[CPU_AXI_QOS_NUM_REGS]; 1309ec78bdfSTony Xie uint32_t perihp_nsp_qos[CPU_AXI_QOS_NUM_REGS]; 1319ec78bdfSTony Xie uint32_t perilp_nsp_qos[CPU_AXI_QOS_NUM_REGS]; 1329ec78bdfSTony Xie uint32_t perilpslv_nsp_qos[CPU_AXI_QOS_NUM_REGS]; 1339ec78bdfSTony Xie uint32_t sdio_qos[CPU_AXI_QOS_NUM_REGS]; 1349ec78bdfSTony Xie }; 1359ec78bdfSTony Xie 1369ec78bdfSTony Xie extern uint32_t clst_warmboot_data[PLATFORM_CLUSTER_COUNT]; 1374c127e68SCaesar Wang 1384c127e68SCaesar Wang extern void sram_func_set_ddrctl_pll(uint32_t pll_src); 139*b4899041SPiotr Szczepanik void pmu_power_domains_on(void); 1404c127e68SCaesar Wang 141c3cf06f1SAntonio Nino Diaz #endif /* PMU_H */ 142