1*e3ec6ff4SXiaoDong Huang /*
2*e3ec6ff4SXiaoDong Huang * Copyright (c) 2024, Rockchip, Inc. All rights reserved.
3*e3ec6ff4SXiaoDong Huang *
4*e3ec6ff4SXiaoDong Huang * SPDX-License-Identifier: BSD-3-Clause
5*e3ec6ff4SXiaoDong Huang */
6*e3ec6ff4SXiaoDong Huang
7*e3ec6ff4SXiaoDong Huang #include <assert.h>
8*e3ec6ff4SXiaoDong Huang #include <errno.h>
9*e3ec6ff4SXiaoDong Huang
10*e3ec6ff4SXiaoDong Huang #include <arch_helpers.h>
11*e3ec6ff4SXiaoDong Huang #include <bl31/bl31.h>
12*e3ec6ff4SXiaoDong Huang #include <common/debug.h>
13*e3ec6ff4SXiaoDong Huang #include <drivers/console.h>
14*e3ec6ff4SXiaoDong Huang #include <drivers/delay_timer.h>
15*e3ec6ff4SXiaoDong Huang #include <lib/mmio.h>
16*e3ec6ff4SXiaoDong Huang #include <platform.h>
17*e3ec6ff4SXiaoDong Huang #include <platform_def.h>
18*e3ec6ff4SXiaoDong Huang #include <pmu.h>
19*e3ec6ff4SXiaoDong Huang
20*e3ec6ff4SXiaoDong Huang #include <plat_pm_helpers.h>
21*e3ec6ff4SXiaoDong Huang #include <plat_private.h>
22*e3ec6ff4SXiaoDong Huang #include <pm_pd_regs.h>
23*e3ec6ff4SXiaoDong Huang #include <soc.h>
24*e3ec6ff4SXiaoDong Huang
25*e3ec6ff4SXiaoDong Huang #define WMSK_VAL 0xffff0000
26*e3ec6ff4SXiaoDong Huang
27*e3ec6ff4SXiaoDong Huang static struct reg_region qos_reg_rgns[] = {
28*e3ec6ff4SXiaoDong Huang [QOS_ISP0_MWO] = REG_REGION(0x08, 0x18, 4, 0xfdf40500, 0),
29*e3ec6ff4SXiaoDong Huang [QOS_ISP0_MRO] = REG_REGION(0x08, 0x18, 4, 0xfdf40400, 0),
30*e3ec6ff4SXiaoDong Huang [QOS_ISP1_MWO] = REG_REGION(0x08, 0x18, 4, 0xfdf41000, 0),
31*e3ec6ff4SXiaoDong Huang [QOS_ISP1_MRO] = REG_REGION(0x08, 0x18, 4, 0xfdf41100, 0),
32*e3ec6ff4SXiaoDong Huang [QOS_VICAP_M0] = REG_REGION(0x08, 0x18, 4, 0xfdf40600, 0),
33*e3ec6ff4SXiaoDong Huang [QOS_VICAP_M1] = REG_REGION(0x08, 0x18, 4, 0xfdf40800, 0),
34*e3ec6ff4SXiaoDong Huang [QOS_FISHEYE0] = REG_REGION(0x08, 0x18, 4, 0xfdf40000, 0),
35*e3ec6ff4SXiaoDong Huang [QOS_FISHEYE1] = REG_REGION(0x08, 0x18, 4, 0xfdf40200, 0),
36*e3ec6ff4SXiaoDong Huang [QOS_VOP_M0] = REG_REGION(0x08, 0x18, 4, 0xfdf82000, 0),
37*e3ec6ff4SXiaoDong Huang [QOS_VOP_M1] = REG_REGION(0x08, 0x18, 4, 0xfdf82200, 0),
38*e3ec6ff4SXiaoDong Huang [QOS_RKVDEC0] = REG_REGION(0x08, 0x18, 4, 0xfdf62000, 0),
39*e3ec6ff4SXiaoDong Huang [QOS_RKVDEC1] = REG_REGION(0x08, 0x18, 4, 0xfdf63000, 0),
40*e3ec6ff4SXiaoDong Huang [QOS_AV1] = REG_REGION(0x08, 0x18, 4, 0xfdf64000, 0),
41*e3ec6ff4SXiaoDong Huang [QOS_RKVENC0_M0RO] = REG_REGION(0x08, 0x18, 4, 0xfdf60000, 0),
42*e3ec6ff4SXiaoDong Huang [QOS_RKVENC0_M1RO] = REG_REGION(0x08, 0x18, 4, 0xfdf60200, 0),
43*e3ec6ff4SXiaoDong Huang [QOS_RKVENC0_M2WO] = REG_REGION(0x08, 0x18, 4, 0xfdf60400, 0),
44*e3ec6ff4SXiaoDong Huang [QOS_RKVENC1_M0RO] = REG_REGION(0x08, 0x18, 4, 0xfdf61000, 0),
45*e3ec6ff4SXiaoDong Huang [QOS_RKVENC1_M1RO] = REG_REGION(0x08, 0x18, 4, 0xfdf61200, 0),
46*e3ec6ff4SXiaoDong Huang [QOS_RKVENC1_M2WO] = REG_REGION(0x08, 0x18, 4, 0xfdf61400, 0),
47*e3ec6ff4SXiaoDong Huang [QOS_DSU_M0] = REG_REGION(0x08, 0x18, 4, 0xfe008000, 0),
48*e3ec6ff4SXiaoDong Huang [QOS_DSU_M1] = REG_REGION(0x08, 0x18, 4, 0xfe008800, 0),
49*e3ec6ff4SXiaoDong Huang [QOS_DSU_MP] = REG_REGION(0x08, 0x18, 4, 0xfdf34200, 0),
50*e3ec6ff4SXiaoDong Huang [QOS_DEBUG] = REG_REGION(0x08, 0x18, 4, 0xfdf34400, 0),
51*e3ec6ff4SXiaoDong Huang [QOS_GPU_M0] = REG_REGION(0x08, 0x18, 4, 0xfdf35000, 0),
52*e3ec6ff4SXiaoDong Huang [QOS_GPU_M1] = REG_REGION(0x08, 0x18, 4, 0xfdf35200, 0),
53*e3ec6ff4SXiaoDong Huang [QOS_GPU_M2] = REG_REGION(0x08, 0x18, 4, 0xfdf35400, 0),
54*e3ec6ff4SXiaoDong Huang [QOS_GPU_M3] = REG_REGION(0x08, 0x18, 4, 0xfdf35600, 0),
55*e3ec6ff4SXiaoDong Huang [QOS_NPU1] = REG_REGION(0x08, 0x18, 4, 0xfdf70000, 0),
56*e3ec6ff4SXiaoDong Huang [QOS_NPU0_MRO] = REG_REGION(0x08, 0x18, 4, 0xfdf72200, 0),
57*e3ec6ff4SXiaoDong Huang [QOS_NPU2] = REG_REGION(0x08, 0x18, 4, 0xfdf71000, 0),
58*e3ec6ff4SXiaoDong Huang [QOS_NPU0_MWR] = REG_REGION(0x08, 0x18, 4, 0xfdf72000, 0),
59*e3ec6ff4SXiaoDong Huang [QOS_MCU_NPU] = REG_REGION(0x08, 0x18, 4, 0xfdf72400, 0),
60*e3ec6ff4SXiaoDong Huang [QOS_JPEG_DEC] = REG_REGION(0x08, 0x18, 4, 0xfdf66200, 0),
61*e3ec6ff4SXiaoDong Huang [QOS_JPEG_ENC0] = REG_REGION(0x08, 0x18, 4, 0xfdf66400, 0),
62*e3ec6ff4SXiaoDong Huang [QOS_JPEG_ENC1] = REG_REGION(0x08, 0x18, 4, 0xfdf66600, 0),
63*e3ec6ff4SXiaoDong Huang [QOS_JPEG_ENC2] = REG_REGION(0x08, 0x18, 4, 0xfdf66800, 0),
64*e3ec6ff4SXiaoDong Huang [QOS_JPEG_ENC3] = REG_REGION(0x08, 0x18, 4, 0xfdf66a00, 0),
65*e3ec6ff4SXiaoDong Huang [QOS_RGA2_MRO] = REG_REGION(0x08, 0x18, 4, 0xfdf66c00, 0),
66*e3ec6ff4SXiaoDong Huang [QOS_RGA2_MWO] = REG_REGION(0x08, 0x18, 4, 0xfdf66e00, 0),
67*e3ec6ff4SXiaoDong Huang [QOS_RGA3_0] = REG_REGION(0x08, 0x18, 4, 0xfdf67000, 0),
68*e3ec6ff4SXiaoDong Huang [QOS_RGA3_1] = REG_REGION(0x08, 0x18, 4, 0xfdf36000, 0),
69*e3ec6ff4SXiaoDong Huang [QOS_VDPU] = REG_REGION(0x08, 0x18, 4, 0xfdf67200, 0),
70*e3ec6ff4SXiaoDong Huang [QOS_IEP] = REG_REGION(0x08, 0x18, 4, 0xfdf66000, 0),
71*e3ec6ff4SXiaoDong Huang [QOS_HDCP0] = REG_REGION(0x08, 0x18, 4, 0xfdf80000, 0),
72*e3ec6ff4SXiaoDong Huang [QOS_HDCP1] = REG_REGION(0x08, 0x18, 4, 0xfdf81000, 0),
73*e3ec6ff4SXiaoDong Huang [QOS_HDMIRX] = REG_REGION(0x08, 0x18, 4, 0xfdf81200, 0),
74*e3ec6ff4SXiaoDong Huang [QOS_GIC600_M0] = REG_REGION(0x08, 0x18, 4, 0xfdf3a000, 0),
75*e3ec6ff4SXiaoDong Huang [QOS_GIC600_M1] = REG_REGION(0x08, 0x18, 4, 0xfdf3a200, 0),
76*e3ec6ff4SXiaoDong Huang [QOS_MMU600PCIE_TCU] = REG_REGION(0x08, 0x18, 4, 0xfdf3a400, 0),
77*e3ec6ff4SXiaoDong Huang [QOS_MMU600PHP_TBU] = REG_REGION(0x08, 0x18, 4, 0xfdf3a600, 0),
78*e3ec6ff4SXiaoDong Huang [QOS_MMU600PHP_TCU] = REG_REGION(0x08, 0x18, 4, 0xfdf3a800, 0),
79*e3ec6ff4SXiaoDong Huang [QOS_USB3_0] = REG_REGION(0x08, 0x18, 4, 0xfdf3e200, 0),
80*e3ec6ff4SXiaoDong Huang [QOS_USB3_1] = REG_REGION(0x08, 0x18, 4, 0xfdf3e000, 0),
81*e3ec6ff4SXiaoDong Huang [QOS_USBHOST_0] = REG_REGION(0x08, 0x18, 4, 0xfdf3e400, 0),
82*e3ec6ff4SXiaoDong Huang [QOS_USBHOST_1] = REG_REGION(0x08, 0x18, 4, 0xfdf3e600, 0),
83*e3ec6ff4SXiaoDong Huang [QOS_EMMC] = REG_REGION(0x08, 0x18, 4, 0xfdf38200, 0),
84*e3ec6ff4SXiaoDong Huang [QOS_FSPI] = REG_REGION(0x08, 0x18, 4, 0xfdf38000, 0),
85*e3ec6ff4SXiaoDong Huang [QOS_SDIO] = REG_REGION(0x08, 0x18, 4, 0xfdf39000, 0),
86*e3ec6ff4SXiaoDong Huang [QOS_DECOM] = REG_REGION(0x08, 0x18, 4, 0xfdf32000, 0),
87*e3ec6ff4SXiaoDong Huang [QOS_DMAC0] = REG_REGION(0x08, 0x18, 4, 0xfdf32200, 0),
88*e3ec6ff4SXiaoDong Huang [QOS_DMAC1] = REG_REGION(0x08, 0x18, 4, 0xfdf32400, 0),
89*e3ec6ff4SXiaoDong Huang [QOS_DMAC2] = REG_REGION(0x08, 0x18, 4, 0xfdf32600, 0),
90*e3ec6ff4SXiaoDong Huang [QOS_GIC600M] = REG_REGION(0x08, 0x18, 4, 0xfdf32800, 0),
91*e3ec6ff4SXiaoDong Huang [QOS_DMA2DDR] = REG_REGION(0x08, 0x18, 4, 0xfdf52000, 0),
92*e3ec6ff4SXiaoDong Huang [QOS_MCU_DDR] = REG_REGION(0x08, 0x18, 4, 0xfdf52200, 0),
93*e3ec6ff4SXiaoDong Huang [QOS_VAD] = REG_REGION(0x08, 0x18, 4, 0xfdf3b200, 0),
94*e3ec6ff4SXiaoDong Huang [QOS_MCU_PMU] = REG_REGION(0x08, 0x18, 4, 0xfdf3b000, 0),
95*e3ec6ff4SXiaoDong Huang [QOS_CRYPTOS] = REG_REGION(0x08, 0x18, 4, 0xfdf3d200, 0),
96*e3ec6ff4SXiaoDong Huang [QOS_CRYPTONS] = REG_REGION(0x08, 0x18, 4, 0xfdf3d000, 0),
97*e3ec6ff4SXiaoDong Huang [QOS_DCF] = REG_REGION(0x08, 0x18, 4, 0xfdf3d400, 0),
98*e3ec6ff4SXiaoDong Huang [QOS_SDMMC] = REG_REGION(0x08, 0x18, 4, 0xfdf3d800, 0),
99*e3ec6ff4SXiaoDong Huang };
100*e3ec6ff4SXiaoDong Huang
101*e3ec6ff4SXiaoDong Huang static struct reg_region pd_crypto_reg_rgns[] = {
102*e3ec6ff4SXiaoDong Huang /* SECURE CRU */
103*e3ec6ff4SXiaoDong Huang REG_REGION(0x300, 0x30c, 4, SCRU_BASE, WMSK_VAL),
104*e3ec6ff4SXiaoDong Huang REG_REGION(0x800, 0x80c, 4, SCRU_BASE, WMSK_VAL),
105*e3ec6ff4SXiaoDong Huang REG_REGION(0xa00, 0xa0c, 4, SCRU_BASE, WMSK_VAL),
106*e3ec6ff4SXiaoDong Huang REG_REGION(0xd00, 0xd20, 8, SCRU_BASE, 0),
107*e3ec6ff4SXiaoDong Huang REG_REGION(0xd04, 0xd24, 8, SCRU_BASE, WMSK_VAL),
108*e3ec6ff4SXiaoDong Huang
109*e3ec6ff4SXiaoDong Huang /* S TIMER0 6 channel */
110*e3ec6ff4SXiaoDong Huang REG_REGION(0x00, 0x04, 4, STIMER0_BASE + 0x00, 0),
111*e3ec6ff4SXiaoDong Huang REG_REGION(0x10, 0x10, 4, STIMER0_BASE + 0x00, 0),
112*e3ec6ff4SXiaoDong Huang REG_REGION(0x00, 0x04, 4, STIMER0_BASE + 0x20, 0),
113*e3ec6ff4SXiaoDong Huang REG_REGION(0x10, 0x10, 4, STIMER0_BASE + 0x20, 0),
114*e3ec6ff4SXiaoDong Huang REG_REGION(0x00, 0x04, 4, STIMER0_BASE + 0x40, 0),
115*e3ec6ff4SXiaoDong Huang REG_REGION(0x10, 0x10, 4, STIMER0_BASE + 0x40, 0),
116*e3ec6ff4SXiaoDong Huang REG_REGION(0x00, 0x04, 4, STIMER0_BASE + 0x60, 0),
117*e3ec6ff4SXiaoDong Huang REG_REGION(0x10, 0x10, 4, STIMER0_BASE + 0x60, 0),
118*e3ec6ff4SXiaoDong Huang REG_REGION(0x00, 0x04, 4, STIMER0_BASE + 0x80, 0),
119*e3ec6ff4SXiaoDong Huang REG_REGION(0x10, 0x10, 4, STIMER0_BASE + 0x80, 0),
120*e3ec6ff4SXiaoDong Huang REG_REGION(0x00, 0x04, 4, STIMER0_BASE + 0xa0, 0),
121*e3ec6ff4SXiaoDong Huang REG_REGION(0x10, 0x10, 4, STIMER0_BASE + 0xa0, 0),
122*e3ec6ff4SXiaoDong Huang
123*e3ec6ff4SXiaoDong Huang /* S TIMER1 6 channel */
124*e3ec6ff4SXiaoDong Huang REG_REGION(0x00, 0x04, 4, STIMER1_BASE + 0x00, 0),
125*e3ec6ff4SXiaoDong Huang REG_REGION(0x10, 0x10, 4, STIMER1_BASE + 0x00, 0),
126*e3ec6ff4SXiaoDong Huang REG_REGION(0x00, 0x04, 4, STIMER1_BASE + 0x20, 0),
127*e3ec6ff4SXiaoDong Huang REG_REGION(0x10, 0x10, 4, STIMER1_BASE + 0x20, 0),
128*e3ec6ff4SXiaoDong Huang REG_REGION(0x00, 0x04, 4, STIMER1_BASE + 0x40, 0),
129*e3ec6ff4SXiaoDong Huang REG_REGION(0x10, 0x10, 4, STIMER1_BASE + 0x40, 0),
130*e3ec6ff4SXiaoDong Huang REG_REGION(0x00, 0x04, 4, STIMER1_BASE + 0x60, 0),
131*e3ec6ff4SXiaoDong Huang REG_REGION(0x10, 0x10, 4, STIMER1_BASE + 0x60, 0),
132*e3ec6ff4SXiaoDong Huang REG_REGION(0x00, 0x04, 4, STIMER1_BASE + 0x80, 0),
133*e3ec6ff4SXiaoDong Huang REG_REGION(0x10, 0x10, 4, STIMER1_BASE + 0x80, 0),
134*e3ec6ff4SXiaoDong Huang REG_REGION(0x00, 0x04, 4, STIMER1_BASE + 0xa0, 0),
135*e3ec6ff4SXiaoDong Huang REG_REGION(0x10, 0x10, 4, STIMER1_BASE + 0xa0, 0),
136*e3ec6ff4SXiaoDong Huang
137*e3ec6ff4SXiaoDong Huang /* wdt_s */
138*e3ec6ff4SXiaoDong Huang REG_REGION(0x04, 0x04, 4, WDT_S_BASE, 0),
139*e3ec6ff4SXiaoDong Huang REG_REGION(0x00, 0x00, 4, WDT_S_BASE, 0),
140*e3ec6ff4SXiaoDong Huang };
141*e3ec6ff4SXiaoDong Huang
142*e3ec6ff4SXiaoDong Huang static struct reg_region pd_dsu_reg_rgns[] = {
143*e3ec6ff4SXiaoDong Huang /* dsucru */
144*e3ec6ff4SXiaoDong Huang REG_REGION(0x040, 0x054, 4, DSUCRU_BASE, WMSK_VAL),
145*e3ec6ff4SXiaoDong Huang REG_REGION(0x300, 0x31c, 4, DSUCRU_BASE, WMSK_VAL),
146*e3ec6ff4SXiaoDong Huang REG_REGION(0x800, 0x80c, 4, DSUCRU_BASE, WMSK_VAL),
147*e3ec6ff4SXiaoDong Huang REG_REGION(0xa00, 0xa0c, 4, DSUCRU_BASE, WMSK_VAL),
148*e3ec6ff4SXiaoDong Huang REG_REGION(0xd00, 0xd20, 8, DSUCRU_BASE, 0),
149*e3ec6ff4SXiaoDong Huang REG_REGION(0xd04, 0xd24, 8, DSUCRU_BASE, WMSK_VAL),
150*e3ec6ff4SXiaoDong Huang REG_REGION(0xf00, 0xf00, 4, DSUCRU_BASE, WMSK_VAL),
151*e3ec6ff4SXiaoDong Huang REG_REGION(0xf10, 0xf1c, 4, DSUCRU_BASE, 0),
152*e3ec6ff4SXiaoDong Huang
153*e3ec6ff4SXiaoDong Huang /* bcore0cru */
154*e3ec6ff4SXiaoDong Huang REG_REGION(0x000, 0x014, 4, BIGCORE0CRU_BASE, WMSK_VAL),
155*e3ec6ff4SXiaoDong Huang REG_REGION(0x300, 0x304, 4, BIGCORE0CRU_BASE, WMSK_VAL),
156*e3ec6ff4SXiaoDong Huang REG_REGION(0x800, 0x804, 4, BIGCORE0CRU_BASE, WMSK_VAL),
157*e3ec6ff4SXiaoDong Huang REG_REGION(0xa00, 0xa04, 4, BIGCORE0CRU_BASE, WMSK_VAL),
158*e3ec6ff4SXiaoDong Huang REG_REGION(0xcc0, 0xcc4, 4, BIGCORE0CRU_BASE, 0),
159*e3ec6ff4SXiaoDong Huang REG_REGION(0xd00, 0xd00, 4, BIGCORE0CRU_BASE, 0),
160*e3ec6ff4SXiaoDong Huang REG_REGION(0xd04, 0xd04, 4, BIGCORE0CRU_BASE, WMSK_VAL),
161*e3ec6ff4SXiaoDong Huang
162*e3ec6ff4SXiaoDong Huang /* bcore1cru */
163*e3ec6ff4SXiaoDong Huang REG_REGION(0x020, 0x034, 4, BIGCORE1CRU_BASE, WMSK_VAL),
164*e3ec6ff4SXiaoDong Huang REG_REGION(0x300, 0x304, 4, BIGCORE1CRU_BASE, WMSK_VAL),
165*e3ec6ff4SXiaoDong Huang REG_REGION(0x800, 0x804, 4, BIGCORE1CRU_BASE, WMSK_VAL),
166*e3ec6ff4SXiaoDong Huang REG_REGION(0xa00, 0xa04, 4, BIGCORE1CRU_BASE, WMSK_VAL),
167*e3ec6ff4SXiaoDong Huang REG_REGION(0xcc0, 0xcc4, 4, BIGCORE1CRU_BASE, 0),
168*e3ec6ff4SXiaoDong Huang REG_REGION(0xd00, 0xd00, 4, BIGCORE1CRU_BASE, 0),
169*e3ec6ff4SXiaoDong Huang REG_REGION(0xd04, 0xd04, 4, BIGCORE1CRU_BASE, WMSK_VAL),
170*e3ec6ff4SXiaoDong Huang
171*e3ec6ff4SXiaoDong Huang /* dsugrf */
172*e3ec6ff4SXiaoDong Huang REG_REGION(0x00, 0x18, 4, DSUGRF_BASE, WMSK_VAL),
173*e3ec6ff4SXiaoDong Huang REG_REGION(0x20, 0x20, 4, DSUGRF_BASE, WMSK_VAL),
174*e3ec6ff4SXiaoDong Huang REG_REGION(0x28, 0x30, 4, DSUGRF_BASE, WMSK_VAL),
175*e3ec6ff4SXiaoDong Huang REG_REGION(0x38, 0x38, 4, DSUGRF_BASE, WMSK_VAL),
176*e3ec6ff4SXiaoDong Huang
177*e3ec6ff4SXiaoDong Huang /* lcore_grf */
178*e3ec6ff4SXiaoDong Huang REG_REGION(0x20, 0x20, 4, LITCOREGRF_BASE, WMSK_VAL),
179*e3ec6ff4SXiaoDong Huang REG_REGION(0x28, 0x30, 4, LITCOREGRF_BASE, WMSK_VAL),
180*e3ec6ff4SXiaoDong Huang
181*e3ec6ff4SXiaoDong Huang /* bcore0_grf */
182*e3ec6ff4SXiaoDong Huang REG_REGION(0x20, 0x20, 4, BIGCORE0GRF_BASE, WMSK_VAL),
183*e3ec6ff4SXiaoDong Huang REG_REGION(0x28, 0x30, 4, BIGCORE0GRF_BASE, WMSK_VAL),
184*e3ec6ff4SXiaoDong Huang
185*e3ec6ff4SXiaoDong Huang /* bcore1_grf */
186*e3ec6ff4SXiaoDong Huang REG_REGION(0x20, 0x20, 4, BIGCORE1GRF_BASE, WMSK_VAL),
187*e3ec6ff4SXiaoDong Huang REG_REGION(0x28, 0x28, 4, BIGCORE1GRF_BASE, WMSK_VAL),
188*e3ec6ff4SXiaoDong Huang };
189*e3ec6ff4SXiaoDong Huang
190*e3ec6ff4SXiaoDong Huang static struct reg_region pd_php_reg_rgns[] = {
191*e3ec6ff4SXiaoDong Huang /* php_grf */
192*e3ec6ff4SXiaoDong Huang REG_REGION(0x000, 0x008, 4, PHPGRF_BASE, WMSK_VAL),
193*e3ec6ff4SXiaoDong Huang REG_REGION(0x014, 0x024, 4, PHPGRF_BASE, WMSK_VAL),
194*e3ec6ff4SXiaoDong Huang REG_REGION(0x028, 0x02c, 4, PHPGRF_BASE, 0),
195*e3ec6ff4SXiaoDong Huang REG_REGION(0x030, 0x03c, 4, PHPGRF_BASE, WMSK_VAL),
196*e3ec6ff4SXiaoDong Huang REG_REGION(0x05c, 0x060, 4, PHPGRF_BASE, WMSK_VAL),
197*e3ec6ff4SXiaoDong Huang REG_REGION(0x064, 0x068, 4, PHPGRF_BASE, 0),
198*e3ec6ff4SXiaoDong Huang REG_REGION(0x070, 0x070, 4, PHPGRF_BASE, WMSK_VAL),
199*e3ec6ff4SXiaoDong Huang REG_REGION(0x074, 0x0d0, 4, PHPGRF_BASE, 0),
200*e3ec6ff4SXiaoDong Huang REG_REGION(0x0d4, 0x0d4, 4, PHPGRF_BASE, WMSK_VAL),
201*e3ec6ff4SXiaoDong Huang REG_REGION(0x0e0, 0x0e0, 4, PHPGRF_BASE, 0),
202*e3ec6ff4SXiaoDong Huang REG_REGION(0x0e4, 0x0ec, 4, PHPGRF_BASE, WMSK_VAL),
203*e3ec6ff4SXiaoDong Huang REG_REGION(0x100, 0x104, 4, PHPGRF_BASE, WMSK_VAL),
204*e3ec6ff4SXiaoDong Huang REG_REGION(0x10c, 0x130, 4, PHPGRF_BASE, 0),
205*e3ec6ff4SXiaoDong Huang REG_REGION(0x138, 0x138, 4, PHPGRF_BASE, WMSK_VAL),
206*e3ec6ff4SXiaoDong Huang REG_REGION(0x144, 0x168, 4, PHPGRF_BASE, 0),
207*e3ec6ff4SXiaoDong Huang REG_REGION(0x16c, 0x174, 4, PHPGRF_BASE, WMSK_VAL),
208*e3ec6ff4SXiaoDong Huang
209*e3ec6ff4SXiaoDong Huang /* php_cru */
210*e3ec6ff4SXiaoDong Huang REG_REGION(0x200, 0x218, 4, PHP_CRU_BASE, WMSK_VAL),
211*e3ec6ff4SXiaoDong Huang REG_REGION(0x800, 0x800, 4, PHP_CRU_BASE, WMSK_VAL),
212*e3ec6ff4SXiaoDong Huang REG_REGION(0xa00, 0xa00, 4, PHP_CRU_BASE, WMSK_VAL),
213*e3ec6ff4SXiaoDong Huang
214*e3ec6ff4SXiaoDong Huang /* pcie3phy_grf_cmn_con0 */
215*e3ec6ff4SXiaoDong Huang REG_REGION(0x00, 0x00, 4, PCIE3PHYGRF_BASE, WMSK_VAL),
216*e3ec6ff4SXiaoDong Huang };
217*e3ec6ff4SXiaoDong Huang
qos_save(void)218*e3ec6ff4SXiaoDong Huang void qos_save(void)
219*e3ec6ff4SXiaoDong Huang {
220*e3ec6ff4SXiaoDong Huang uint32_t pmu_pd_st0 = mmio_read_32(PMU_BASE + PMU2_PWR_GATE_ST(0));
221*e3ec6ff4SXiaoDong Huang
222*e3ec6ff4SXiaoDong Huang if ((pmu_pd_st0 & BIT(PD_GPU)) == 0) {
223*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_save(&qos_reg_rgns[QOS_GPU_M0], 1);
224*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_save(&qos_reg_rgns[QOS_GPU_M1], 1);
225*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_save(&qos_reg_rgns[QOS_GPU_M2], 1);
226*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_save(&qos_reg_rgns[QOS_GPU_M3], 1);
227*e3ec6ff4SXiaoDong Huang }
228*e3ec6ff4SXiaoDong Huang
229*e3ec6ff4SXiaoDong Huang if ((pmu_pd_st0 & BIT(PD_NPU1)) == 0)
230*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_save(&qos_reg_rgns[QOS_NPU1], 1);
231*e3ec6ff4SXiaoDong Huang if ((pmu_pd_st0 & BIT(PD_NPU2)) == 0)
232*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_save(&qos_reg_rgns[QOS_NPU2], 1);
233*e3ec6ff4SXiaoDong Huang if ((pmu_pd_st0 & BIT(PD_NPUTOP)) == 0) {
234*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_save(&qos_reg_rgns[QOS_NPU0_MRO], 1);
235*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_save(&qos_reg_rgns[QOS_NPU0_MWR], 1);
236*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_save(&qos_reg_rgns[QOS_MCU_NPU], 1);
237*e3ec6ff4SXiaoDong Huang }
238*e3ec6ff4SXiaoDong Huang
239*e3ec6ff4SXiaoDong Huang if ((pmu_pd_st0 & BIT(PD_RKVDEC1)) == 0)
240*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_save(&qos_reg_rgns[QOS_RKVDEC1], 1);
241*e3ec6ff4SXiaoDong Huang if ((pmu_pd_st0 & BIT(PD_RKVDEC0)) == 0)
242*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_save(&qos_reg_rgns[QOS_RKVDEC0], 1);
243*e3ec6ff4SXiaoDong Huang
244*e3ec6ff4SXiaoDong Huang if ((pmu_pd_st0 & BIT(PD_VENC1)) == 0) {
245*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_save(&qos_reg_rgns[QOS_RKVENC1_M0RO], 1);
246*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_save(&qos_reg_rgns[QOS_RKVENC1_M1RO], 1);
247*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_save(&qos_reg_rgns[QOS_RKVENC1_M2WO], 1);
248*e3ec6ff4SXiaoDong Huang }
249*e3ec6ff4SXiaoDong Huang if ((pmu_pd_st0 & BIT(PD_VENC0)) == 0) {
250*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_save(&qos_reg_rgns[QOS_RKVENC0_M0RO], 1);
251*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_save(&qos_reg_rgns[QOS_RKVENC0_M1RO], 1);
252*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_save(&qos_reg_rgns[QOS_RKVENC0_M2WO], 1);
253*e3ec6ff4SXiaoDong Huang }
254*e3ec6ff4SXiaoDong Huang
255*e3ec6ff4SXiaoDong Huang if ((pmu_pd_st0 & BIT(PD_RGA30)) == 0)
256*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_save(&qos_reg_rgns[QOS_RGA3_0], 1);
257*e3ec6ff4SXiaoDong Huang if ((pmu_pd_st0 & BIT(PD_AV1)) == 0)
258*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_save(&qos_reg_rgns[QOS_AV1], 1);
259*e3ec6ff4SXiaoDong Huang if ((pmu_pd_st0 & BIT(PD_VDPU)) == 0) {
260*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_save(&qos_reg_rgns[QOS_JPEG_DEC], 1);
261*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_save(&qos_reg_rgns[QOS_JPEG_ENC0], 1);
262*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_save(&qos_reg_rgns[QOS_JPEG_ENC1], 1);
263*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_save(&qos_reg_rgns[QOS_JPEG_ENC2], 1);
264*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_save(&qos_reg_rgns[QOS_JPEG_ENC3], 1);
265*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_save(&qos_reg_rgns[QOS_RGA2_MRO], 1);
266*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_save(&qos_reg_rgns[QOS_RGA2_MWO], 1);
267*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_save(&qos_reg_rgns[QOS_VDPU], 1);
268*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_save(&qos_reg_rgns[QOS_IEP], 1);
269*e3ec6ff4SXiaoDong Huang }
270*e3ec6ff4SXiaoDong Huang
271*e3ec6ff4SXiaoDong Huang if ((pmu_pd_st0 & BIT(PD_VO0)) == 0)
272*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_save(&qos_reg_rgns[QOS_HDCP0], 1);
273*e3ec6ff4SXiaoDong Huang if ((pmu_pd_st0 & BIT(PD_VO1)) == 0) {
274*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_save(&qos_reg_rgns[QOS_HDCP1], 1);
275*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_save(&qos_reg_rgns[QOS_HDMIRX], 1);
276*e3ec6ff4SXiaoDong Huang }
277*e3ec6ff4SXiaoDong Huang if ((pmu_pd_st0 & BIT(PD_VOP)) == 0) {
278*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_save(&qos_reg_rgns[QOS_VOP_M0], 1);
279*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_save(&qos_reg_rgns[QOS_VOP_M1], 1);
280*e3ec6ff4SXiaoDong Huang }
281*e3ec6ff4SXiaoDong Huang
282*e3ec6ff4SXiaoDong Huang if ((pmu_pd_st0 & BIT(PD_FEC)) == 0) {
283*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_save(&qos_reg_rgns[QOS_FISHEYE0], 1);
284*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_save(&qos_reg_rgns[QOS_FISHEYE1], 1);
285*e3ec6ff4SXiaoDong Huang }
286*e3ec6ff4SXiaoDong Huang if ((pmu_pd_st0 & BIT(PD_ISP1)) == 0) {
287*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_save(&qos_reg_rgns[QOS_ISP1_MWO], 1);
288*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_save(&qos_reg_rgns[QOS_ISP1_MRO], 1);
289*e3ec6ff4SXiaoDong Huang }
290*e3ec6ff4SXiaoDong Huang if ((pmu_pd_st0 & BIT(PD_VI)) == 0) {
291*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_save(&qos_reg_rgns[QOS_ISP0_MWO], 1);
292*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_save(&qos_reg_rgns[QOS_ISP0_MRO], 1);
293*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_save(&qos_reg_rgns[QOS_VICAP_M0], 1);
294*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_save(&qos_reg_rgns[QOS_VICAP_M1], 1);
295*e3ec6ff4SXiaoDong Huang }
296*e3ec6ff4SXiaoDong Huang
297*e3ec6ff4SXiaoDong Huang if ((pmu_pd_st0 & BIT(PD_RGA31)) == 0)
298*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_save(&qos_reg_rgns[QOS_RGA3_1], 1);
299*e3ec6ff4SXiaoDong Huang
300*e3ec6ff4SXiaoDong Huang if ((pmu_pd_st0 & BIT(PD_USB)) == 0) {
301*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_save(&qos_reg_rgns[QOS_USB3_0], 1);
302*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_save(&qos_reg_rgns[QOS_USB3_1], 1);
303*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_save(&qos_reg_rgns[QOS_USBHOST_0], 1);
304*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_save(&qos_reg_rgns[QOS_USBHOST_1], 1);
305*e3ec6ff4SXiaoDong Huang }
306*e3ec6ff4SXiaoDong Huang
307*e3ec6ff4SXiaoDong Huang if ((pmu_pd_st0 & BIT(PD_PHP)) == 0) {
308*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_save(&qos_reg_rgns[QOS_GIC600_M0], 1);
309*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_save(&qos_reg_rgns[QOS_GIC600_M1], 1);
310*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_save(&qos_reg_rgns[QOS_MMU600PCIE_TCU], 1);
311*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_save(&qos_reg_rgns[QOS_MMU600PHP_TBU], 1);
312*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_save(&qos_reg_rgns[QOS_MMU600PHP_TCU], 1);
313*e3ec6ff4SXiaoDong Huang }
314*e3ec6ff4SXiaoDong Huang
315*e3ec6ff4SXiaoDong Huang if ((pmu_pd_st0 & BIT(PD_SDIO)) == 0)
316*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_save(&qos_reg_rgns[QOS_SDIO], 1);
317*e3ec6ff4SXiaoDong Huang if ((pmu_pd_st0 & BIT(PD_NVM0)) == 0) {
318*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_save(&qos_reg_rgns[QOS_FSPI], 1);
319*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_save(&qos_reg_rgns[QOS_EMMC], 1);
320*e3ec6ff4SXiaoDong Huang }
321*e3ec6ff4SXiaoDong Huang
322*e3ec6ff4SXiaoDong Huang if ((pmu_pd_st0 & BIT(PD_SDMMC)) == 0)
323*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_save(&qos_reg_rgns[QOS_SDMMC], 1);
324*e3ec6ff4SXiaoDong Huang
325*e3ec6ff4SXiaoDong Huang if ((pmu_pd_st0 & BIT(PD_CRYPTO)) == 0) {
326*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_save(&qos_reg_rgns[QOS_CRYPTONS], 1);
327*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_save(&qos_reg_rgns[QOS_CRYPTOS], 1);
328*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_save(&qos_reg_rgns[QOS_DCF], 1);
329*e3ec6ff4SXiaoDong Huang }
330*e3ec6ff4SXiaoDong Huang
331*e3ec6ff4SXiaoDong Huang /* PD_DSU */
332*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_save(&qos_reg_rgns[QOS_DSU_M0], 1);
333*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_save(&qos_reg_rgns[QOS_DSU_M1], 1);
334*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_save(&qos_reg_rgns[QOS_DSU_MP], 1);
335*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_save(&qos_reg_rgns[QOS_DEBUG], 1);
336*e3ec6ff4SXiaoDong Huang }
337*e3ec6ff4SXiaoDong Huang
qos_restore(void)338*e3ec6ff4SXiaoDong Huang void qos_restore(void)
339*e3ec6ff4SXiaoDong Huang {
340*e3ec6ff4SXiaoDong Huang uint32_t pmu_pd_st0 = mmio_read_32(PMU_BASE + PMU2_PWR_GATE_ST(0));
341*e3ec6ff4SXiaoDong Huang
342*e3ec6ff4SXiaoDong Huang if ((pmu_pd_st0 & BIT(PD_GPU)) == 0) {
343*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_restore(&qos_reg_rgns[QOS_GPU_M0], 1);
344*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_restore(&qos_reg_rgns[QOS_GPU_M1], 1);
345*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_restore(&qos_reg_rgns[QOS_GPU_M2], 1);
346*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_restore(&qos_reg_rgns[QOS_GPU_M3], 1);
347*e3ec6ff4SXiaoDong Huang }
348*e3ec6ff4SXiaoDong Huang
349*e3ec6ff4SXiaoDong Huang if ((pmu_pd_st0 & BIT(PD_NPU1)) == 0)
350*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_restore(&qos_reg_rgns[QOS_NPU1], 1);
351*e3ec6ff4SXiaoDong Huang if ((pmu_pd_st0 & BIT(PD_NPU2)) == 0)
352*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_restore(&qos_reg_rgns[QOS_NPU2], 1);
353*e3ec6ff4SXiaoDong Huang if ((pmu_pd_st0 & BIT(PD_NPUTOP)) == 0) {
354*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_restore(&qos_reg_rgns[QOS_NPU0_MRO], 1);
355*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_restore(&qos_reg_rgns[QOS_NPU0_MWR], 1);
356*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_restore(&qos_reg_rgns[QOS_MCU_NPU], 1);
357*e3ec6ff4SXiaoDong Huang }
358*e3ec6ff4SXiaoDong Huang
359*e3ec6ff4SXiaoDong Huang if ((pmu_pd_st0 & BIT(PD_RKVDEC1)) == 0)
360*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_restore(&qos_reg_rgns[QOS_RKVDEC1], 1);
361*e3ec6ff4SXiaoDong Huang if ((pmu_pd_st0 & BIT(PD_RKVDEC0)) == 0)
362*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_restore(&qos_reg_rgns[QOS_RKVDEC0], 1);
363*e3ec6ff4SXiaoDong Huang
364*e3ec6ff4SXiaoDong Huang if ((pmu_pd_st0 & BIT(PD_VENC1)) == 0) {
365*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_restore(&qos_reg_rgns[QOS_RKVENC1_M0RO], 1);
366*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_restore(&qos_reg_rgns[QOS_RKVENC1_M1RO], 1);
367*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_restore(&qos_reg_rgns[QOS_RKVENC1_M2WO], 1);
368*e3ec6ff4SXiaoDong Huang }
369*e3ec6ff4SXiaoDong Huang if ((pmu_pd_st0 & BIT(PD_VENC0)) == 0) {
370*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_restore(&qos_reg_rgns[QOS_RKVENC0_M0RO], 1);
371*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_restore(&qos_reg_rgns[QOS_RKVENC0_M1RO], 1);
372*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_restore(&qos_reg_rgns[QOS_RKVENC0_M2WO], 1);
373*e3ec6ff4SXiaoDong Huang }
374*e3ec6ff4SXiaoDong Huang
375*e3ec6ff4SXiaoDong Huang if ((pmu_pd_st0 & BIT(PD_RGA30)) == 0)
376*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_restore(&qos_reg_rgns[QOS_RGA3_0], 1);
377*e3ec6ff4SXiaoDong Huang if ((pmu_pd_st0 & BIT(PD_AV1)) == 0)
378*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_restore(&qos_reg_rgns[QOS_AV1], 1);
379*e3ec6ff4SXiaoDong Huang if ((pmu_pd_st0 & BIT(PD_VDPU)) == 0) {
380*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_restore(&qos_reg_rgns[QOS_JPEG_DEC], 1);
381*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_restore(&qos_reg_rgns[QOS_JPEG_ENC0], 1);
382*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_restore(&qos_reg_rgns[QOS_JPEG_ENC1], 1);
383*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_restore(&qos_reg_rgns[QOS_JPEG_ENC2], 1);
384*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_restore(&qos_reg_rgns[QOS_JPEG_ENC3], 1);
385*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_restore(&qos_reg_rgns[QOS_RGA2_MRO], 1);
386*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_restore(&qos_reg_rgns[QOS_RGA2_MWO], 1);
387*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_restore(&qos_reg_rgns[QOS_VDPU], 1);
388*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_restore(&qos_reg_rgns[QOS_IEP], 1);
389*e3ec6ff4SXiaoDong Huang }
390*e3ec6ff4SXiaoDong Huang
391*e3ec6ff4SXiaoDong Huang if ((pmu_pd_st0 & BIT(PD_VO0)) == 0)
392*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_restore(&qos_reg_rgns[QOS_HDCP0], 1);
393*e3ec6ff4SXiaoDong Huang if ((pmu_pd_st0 & BIT(PD_VO1)) == 0) {
394*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_restore(&qos_reg_rgns[QOS_HDCP1], 1);
395*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_restore(&qos_reg_rgns[QOS_HDMIRX], 1);
396*e3ec6ff4SXiaoDong Huang }
397*e3ec6ff4SXiaoDong Huang if ((pmu_pd_st0 & BIT(PD_VOP)) == 0) {
398*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_restore(&qos_reg_rgns[QOS_VOP_M0], 1);
399*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_restore(&qos_reg_rgns[QOS_VOP_M1], 1);
400*e3ec6ff4SXiaoDong Huang }
401*e3ec6ff4SXiaoDong Huang
402*e3ec6ff4SXiaoDong Huang if ((pmu_pd_st0 & BIT(PD_FEC)) == 0) {
403*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_restore(&qos_reg_rgns[QOS_FISHEYE0], 1);
404*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_restore(&qos_reg_rgns[QOS_FISHEYE1], 1);
405*e3ec6ff4SXiaoDong Huang }
406*e3ec6ff4SXiaoDong Huang if ((pmu_pd_st0 & BIT(PD_ISP1)) == 0) {
407*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_restore(&qos_reg_rgns[QOS_ISP1_MWO], 1);
408*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_restore(&qos_reg_rgns[QOS_ISP1_MRO], 1);
409*e3ec6ff4SXiaoDong Huang }
410*e3ec6ff4SXiaoDong Huang if ((pmu_pd_st0 & BIT(PD_VI)) == 0) {
411*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_restore(&qos_reg_rgns[QOS_ISP0_MWO], 1);
412*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_restore(&qos_reg_rgns[QOS_ISP0_MRO], 1);
413*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_restore(&qos_reg_rgns[QOS_VICAP_M0], 1);
414*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_restore(&qos_reg_rgns[QOS_VICAP_M1], 1);
415*e3ec6ff4SXiaoDong Huang }
416*e3ec6ff4SXiaoDong Huang
417*e3ec6ff4SXiaoDong Huang if ((pmu_pd_st0 & BIT(PD_RGA31)) == 0)
418*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_restore(&qos_reg_rgns[QOS_RGA3_1], 1);
419*e3ec6ff4SXiaoDong Huang
420*e3ec6ff4SXiaoDong Huang if ((pmu_pd_st0 & BIT(PD_USB)) == 0) {
421*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_restore(&qos_reg_rgns[QOS_USB3_0], 1);
422*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_restore(&qos_reg_rgns[QOS_USB3_1], 1);
423*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_restore(&qos_reg_rgns[QOS_USBHOST_0], 1);
424*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_restore(&qos_reg_rgns[QOS_USBHOST_1], 1);
425*e3ec6ff4SXiaoDong Huang }
426*e3ec6ff4SXiaoDong Huang
427*e3ec6ff4SXiaoDong Huang if ((pmu_pd_st0 & BIT(PD_PHP)) == 0) {
428*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_restore(&qos_reg_rgns[QOS_GIC600_M0], 1);
429*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_restore(&qos_reg_rgns[QOS_GIC600_M1], 1);
430*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_restore(&qos_reg_rgns[QOS_MMU600PCIE_TCU], 1);
431*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_restore(&qos_reg_rgns[QOS_MMU600PHP_TBU], 1);
432*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_restore(&qos_reg_rgns[QOS_MMU600PHP_TCU], 1);
433*e3ec6ff4SXiaoDong Huang }
434*e3ec6ff4SXiaoDong Huang
435*e3ec6ff4SXiaoDong Huang if ((pmu_pd_st0 & BIT(PD_SDIO)) == 0)
436*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_restore(&qos_reg_rgns[QOS_SDIO], 1);
437*e3ec6ff4SXiaoDong Huang if ((pmu_pd_st0 & BIT(PD_NVM0)) == 0) {
438*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_restore(&qos_reg_rgns[QOS_FSPI], 1);
439*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_restore(&qos_reg_rgns[QOS_EMMC], 1);
440*e3ec6ff4SXiaoDong Huang }
441*e3ec6ff4SXiaoDong Huang
442*e3ec6ff4SXiaoDong Huang if ((pmu_pd_st0 & BIT(PD_SDMMC)) == 0)
443*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_restore(&qos_reg_rgns[QOS_SDMMC], 1);
444*e3ec6ff4SXiaoDong Huang
445*e3ec6ff4SXiaoDong Huang if ((pmu_pd_st0 & BIT(PD_CRYPTO)) == 0) {
446*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_restore(&qos_reg_rgns[QOS_CRYPTONS], 1);
447*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_restore(&qos_reg_rgns[QOS_CRYPTOS], 1);
448*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_restore(&qos_reg_rgns[QOS_DCF], 1);
449*e3ec6ff4SXiaoDong Huang }
450*e3ec6ff4SXiaoDong Huang
451*e3ec6ff4SXiaoDong Huang /* PD_DSU */
452*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_restore(&qos_reg_rgns[QOS_DSU_M0], 1);
453*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_restore(&qos_reg_rgns[QOS_DSU_M1], 1);
454*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_restore(&qos_reg_rgns[QOS_DSU_MP], 1);
455*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_restore(&qos_reg_rgns[QOS_DEBUG], 1);
456*e3ec6ff4SXiaoDong Huang }
457*e3ec6ff4SXiaoDong Huang
pd_crypto_save(void)458*e3ec6ff4SXiaoDong Huang void pd_crypto_save(void)
459*e3ec6ff4SXiaoDong Huang {
460*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_save(pd_crypto_reg_rgns, ARRAY_SIZE(pd_crypto_reg_rgns));
461*e3ec6ff4SXiaoDong Huang }
462*e3ec6ff4SXiaoDong Huang
pd_crypto_restore(void)463*e3ec6ff4SXiaoDong Huang void pd_crypto_restore(void)
464*e3ec6ff4SXiaoDong Huang {
465*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_restore(pd_crypto_reg_rgns, ARRAY_SIZE(pd_crypto_reg_rgns));
466*e3ec6ff4SXiaoDong Huang }
467*e3ec6ff4SXiaoDong Huang
468*e3ec6ff4SXiaoDong Huang static uint32_t b0_cru_mode;
469*e3ec6ff4SXiaoDong Huang static uint32_t b1_cru_mode;
470*e3ec6ff4SXiaoDong Huang static uint32_t dsu_cru_mode;
471*e3ec6ff4SXiaoDong Huang static uint32_t bcore0_cru_sel_con2, bcore1_cru_sel_con2;
472*e3ec6ff4SXiaoDong Huang
pd_dsu_core_save(void)473*e3ec6ff4SXiaoDong Huang void pd_dsu_core_save(void)
474*e3ec6ff4SXiaoDong Huang {
475*e3ec6ff4SXiaoDong Huang b0_cru_mode = mmio_read_32(BIGCORE0CRU_BASE + 0x280);
476*e3ec6ff4SXiaoDong Huang b1_cru_mode = mmio_read_32(BIGCORE1CRU_BASE + 0x280);
477*e3ec6ff4SXiaoDong Huang dsu_cru_mode = mmio_read_32(DSUCRU_BASE + 0x280);
478*e3ec6ff4SXiaoDong Huang bcore0_cru_sel_con2 = mmio_read_32(BIGCORE0CRU_BASE + CRU_CLKSEL_CON(2));
479*e3ec6ff4SXiaoDong Huang bcore1_cru_sel_con2 = mmio_read_32(BIGCORE1CRU_BASE + CRU_CLKSEL_CON(2));
480*e3ec6ff4SXiaoDong Huang
481*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_save(pd_dsu_reg_rgns, ARRAY_SIZE(pd_dsu_reg_rgns));
482*e3ec6ff4SXiaoDong Huang }
483*e3ec6ff4SXiaoDong Huang
pd_dsu_core_restore(void)484*e3ec6ff4SXiaoDong Huang void pd_dsu_core_restore(void)
485*e3ec6ff4SXiaoDong Huang {
486*e3ec6ff4SXiaoDong Huang /* switch bcore0/1 pclk root to 24M */
487*e3ec6ff4SXiaoDong Huang mmio_write_32(BIGCORE0CRU_BASE + CRU_CLKSEL_CON(2),
488*e3ec6ff4SXiaoDong Huang BITS_WITH_WMASK(2, 0x3, 0));
489*e3ec6ff4SXiaoDong Huang mmio_write_32(BIGCORE1CRU_BASE + CRU_CLKSEL_CON(2),
490*e3ec6ff4SXiaoDong Huang BITS_WITH_WMASK(2, 0x3, 0));
491*e3ec6ff4SXiaoDong Huang
492*e3ec6ff4SXiaoDong Huang /* slow mode */
493*e3ec6ff4SXiaoDong Huang mmio_write_32(BIGCORE0CRU_BASE + 0x280, 0x00030000);
494*e3ec6ff4SXiaoDong Huang mmio_write_32(BIGCORE1CRU_BASE + 0x280, 0x00030000);
495*e3ec6ff4SXiaoDong Huang mmio_write_32(DSUCRU_BASE + 0x280, 0x00030000);
496*e3ec6ff4SXiaoDong Huang
497*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_restore(pd_dsu_reg_rgns, ARRAY_SIZE(pd_dsu_reg_rgns));
498*e3ec6ff4SXiaoDong Huang
499*e3ec6ff4SXiaoDong Huang /* trigger dsu/lcore/bcore mem_cfg */
500*e3ec6ff4SXiaoDong Huang mmio_write_32(DSUGRF_BASE + 0x18, BITS_WITH_WMASK(1, 0x1, 14));
501*e3ec6ff4SXiaoDong Huang mmio_write_32(LITCOREGRF_BASE + 0x30, BITS_WITH_WMASK(1, 0x1, 5));
502*e3ec6ff4SXiaoDong Huang mmio_write_32(BIGCORE0GRF_BASE + 0x30, BITS_WITH_WMASK(1, 0x1, 5));
503*e3ec6ff4SXiaoDong Huang mmio_write_32(BIGCORE1GRF_BASE + 0x30, BITS_WITH_WMASK(1, 0x1, 5));
504*e3ec6ff4SXiaoDong Huang udelay(1);
505*e3ec6ff4SXiaoDong Huang mmio_write_32(DSUGRF_BASE + 0x18, BITS_WITH_WMASK(0, 0x1, 14));
506*e3ec6ff4SXiaoDong Huang mmio_write_32(LITCOREGRF_BASE + 0x30, BITS_WITH_WMASK(0, 0x1, 5));
507*e3ec6ff4SXiaoDong Huang mmio_write_32(BIGCORE0GRF_BASE + 0x30, BITS_WITH_WMASK(0, 0x1, 5));
508*e3ec6ff4SXiaoDong Huang mmio_write_32(BIGCORE1GRF_BASE + 0x30, BITS_WITH_WMASK(0, 0x1, 5));
509*e3ec6ff4SXiaoDong Huang
510*e3ec6ff4SXiaoDong Huang /* wait lock */
511*e3ec6ff4SXiaoDong Huang pm_pll_wait_lock(BIGCORE0CRU_BASE + 0x00);
512*e3ec6ff4SXiaoDong Huang pm_pll_wait_lock(BIGCORE1CRU_BASE + 0x20);
513*e3ec6ff4SXiaoDong Huang pm_pll_wait_lock(DSUCRU_BASE + 0x40);
514*e3ec6ff4SXiaoDong Huang
515*e3ec6ff4SXiaoDong Huang /* restore mode */
516*e3ec6ff4SXiaoDong Huang mmio_write_32(BIGCORE0CRU_BASE + 0x280, WITH_16BITS_WMSK(b0_cru_mode));
517*e3ec6ff4SXiaoDong Huang mmio_write_32(BIGCORE1CRU_BASE + 0x280, WITH_16BITS_WMSK(b1_cru_mode));
518*e3ec6ff4SXiaoDong Huang mmio_write_32(DSUCRU_BASE + 0x280, WITH_16BITS_WMSK(dsu_cru_mode));
519*e3ec6ff4SXiaoDong Huang
520*e3ec6ff4SXiaoDong Huang mmio_write_32(BIGCORE0CRU_BASE + CRU_CLKSEL_CON(2),
521*e3ec6ff4SXiaoDong Huang WITH_16BITS_WMSK(bcore0_cru_sel_con2));
522*e3ec6ff4SXiaoDong Huang mmio_write_32(BIGCORE1CRU_BASE + CRU_CLKSEL_CON(2),
523*e3ec6ff4SXiaoDong Huang WITH_16BITS_WMSK(bcore1_cru_sel_con2));
524*e3ec6ff4SXiaoDong Huang }
525*e3ec6ff4SXiaoDong Huang
526*e3ec6ff4SXiaoDong Huang static uint32_t php_ppll_con0;
527*e3ec6ff4SXiaoDong Huang
pd_php_save(void)528*e3ec6ff4SXiaoDong Huang void pd_php_save(void)
529*e3ec6ff4SXiaoDong Huang {
530*e3ec6ff4SXiaoDong Huang php_ppll_con0 = mmio_read_32(PHP_CRU_BASE + 0x200);
531*e3ec6ff4SXiaoDong Huang
532*e3ec6ff4SXiaoDong Huang /* php_ppll bypass */
533*e3ec6ff4SXiaoDong Huang mmio_write_32(PHP_CRU_BASE + 0x200, BITS_WITH_WMASK(1u, 1u, 15));
534*e3ec6ff4SXiaoDong Huang dsb();
535*e3ec6ff4SXiaoDong Huang isb();
536*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_save(pd_php_reg_rgns, ARRAY_SIZE(pd_php_reg_rgns));
537*e3ec6ff4SXiaoDong Huang }
538*e3ec6ff4SXiaoDong Huang
pd_php_restore(void)539*e3ec6ff4SXiaoDong Huang void pd_php_restore(void)
540*e3ec6ff4SXiaoDong Huang {
541*e3ec6ff4SXiaoDong Huang rockchip_reg_rgn_restore(pd_php_reg_rgns, ARRAY_SIZE(pd_php_reg_rgns));
542*e3ec6ff4SXiaoDong Huang
543*e3ec6ff4SXiaoDong Huang pm_pll_wait_lock(PHP_CRU_BASE + 0x200);
544*e3ec6ff4SXiaoDong Huang
545*e3ec6ff4SXiaoDong Huang /* restore php_ppll bypass */
546*e3ec6ff4SXiaoDong Huang mmio_write_32(PHP_CRU_BASE + 0x200, WITH_16BITS_WMSK(php_ppll_con0));
547*e3ec6ff4SXiaoDong Huang }
548*e3ec6ff4SXiaoDong Huang
pm_reg_rgns_init(void)549*e3ec6ff4SXiaoDong Huang void pm_reg_rgns_init(void)
550*e3ec6ff4SXiaoDong Huang {
551*e3ec6ff4SXiaoDong Huang rockchip_alloc_region_mem(qos_reg_rgns, ARRAY_SIZE(qos_reg_rgns));
552*e3ec6ff4SXiaoDong Huang rockchip_alloc_region_mem(pd_crypto_reg_rgns, ARRAY_SIZE(pd_crypto_reg_rgns));
553*e3ec6ff4SXiaoDong Huang rockchip_alloc_region_mem(pd_dsu_reg_rgns, ARRAY_SIZE(pd_dsu_reg_rgns));
554*e3ec6ff4SXiaoDong Huang rockchip_alloc_region_mem(pd_php_reg_rgns, ARRAY_SIZE(pd_php_reg_rgns));
555*e3ec6ff4SXiaoDong Huang }
556