xref: /rk3399_ARM-atf/plat/rockchip/rk3399/drivers/pmu/pmu.h (revision 287a81dfada75024e06a16544ea8da2672630011)
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