xref: /arm-trusted-firmware/drivers/renesas/rzg/qos/qos_init.c (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu /*
2*91f16700Schasinglulu  * Copyright (c) 2021, Renesas Electronics Corporation. All rights reserved.
3*91f16700Schasinglulu  *
4*91f16700Schasinglulu  * SPDX-License-Identifier: BSD-3-Clause
5*91f16700Schasinglulu  */
6*91f16700Schasinglulu 
7*91f16700Schasinglulu #include <stdint.h>
8*91f16700Schasinglulu 
9*91f16700Schasinglulu #include <common/debug.h>
10*91f16700Schasinglulu #include <lib/mmio.h>
11*91f16700Schasinglulu 
12*91f16700Schasinglulu #if RCAR_LSI == RCAR_AUTO
13*91f16700Schasinglulu #include "G2E/qos_init_g2e_v10.h"
14*91f16700Schasinglulu #include "G2H/qos_init_g2h_v30.h"
15*91f16700Schasinglulu #include "G2M/qos_init_g2m_v10.h"
16*91f16700Schasinglulu #include "G2M/qos_init_g2m_v11.h"
17*91f16700Schasinglulu #include "G2M/qos_init_g2m_v30.h"
18*91f16700Schasinglulu #include "G2N/qos_init_g2n_v10.h"
19*91f16700Schasinglulu #endif /* RCAR_LSI == RCAR_AUTO */
20*91f16700Schasinglulu #if (RCAR_LSI == RZ_G2M)
21*91f16700Schasinglulu #include "G2M/qos_init_g2m_v10.h"
22*91f16700Schasinglulu #include "G2M/qos_init_g2m_v11.h"
23*91f16700Schasinglulu #include "G2M/qos_init_g2m_v30.h"
24*91f16700Schasinglulu #endif /* RCAR_LSI == RZ_G2M */
25*91f16700Schasinglulu #if RCAR_LSI == RZ_G2H
26*91f16700Schasinglulu #include "G2H/qos_init_g2h_v30.h"
27*91f16700Schasinglulu #endif /* RCAR_LSI == RZ_G2H */
28*91f16700Schasinglulu #if RCAR_LSI == RZ_G2N
29*91f16700Schasinglulu #include "G2N/qos_init_g2n_v10.h"
30*91f16700Schasinglulu #endif /* RCAR_LSI == RZ_G2N */
31*91f16700Schasinglulu #if RCAR_LSI == RZ_G2E
32*91f16700Schasinglulu #include "G2E/qos_init_g2e_v10.h"
33*91f16700Schasinglulu #endif /* RCAR_LSI == RZ_G2E */
34*91f16700Schasinglulu #include "qos_common.h"
35*91f16700Schasinglulu #include "qos_init.h"
36*91f16700Schasinglulu #include "qos_reg.h"
37*91f16700Schasinglulu #include "rcar_def.h"
38*91f16700Schasinglulu 
39*91f16700Schasinglulu #if (RCAR_LSI != RZ_G2E)
40*91f16700Schasinglulu #define DRAM_CH_CNT	0x04U
41*91f16700Schasinglulu uint32_t qos_init_ddr_ch;
42*91f16700Schasinglulu uint8_t qos_init_ddr_phyvalid;
43*91f16700Schasinglulu #endif /* RCAR_LSI != RZ_G2E */
44*91f16700Schasinglulu 
45*91f16700Schasinglulu #define PRR_PRODUCT_ERR(reg)				\
46*91f16700Schasinglulu 	{						\
47*91f16700Schasinglulu 		ERROR("LSI Product ID(PRR=0x%x) QoS "	\
48*91f16700Schasinglulu 		"initialize not supported.\n", reg);	\
49*91f16700Schasinglulu 		panic();				\
50*91f16700Schasinglulu 	}
51*91f16700Schasinglulu 
52*91f16700Schasinglulu #define PRR_CUT_ERR(reg)				\
53*91f16700Schasinglulu 	{						\
54*91f16700Schasinglulu 		ERROR("LSI Cut ID(PRR=0x%x) QoS "	\
55*91f16700Schasinglulu 		"initialize not supported.\n", reg);	\
56*91f16700Schasinglulu 		panic();				\
57*91f16700Schasinglulu 	}
58*91f16700Schasinglulu 
59*91f16700Schasinglulu void rzg_qos_init(void)
60*91f16700Schasinglulu {
61*91f16700Schasinglulu 	uint32_t reg;
62*91f16700Schasinglulu #if (RCAR_LSI != RZ_G2E)
63*91f16700Schasinglulu 	uint32_t i;
64*91f16700Schasinglulu 
65*91f16700Schasinglulu 	qos_init_ddr_ch = 0U;
66*91f16700Schasinglulu 	qos_init_ddr_phyvalid = get_boardcnf_phyvalid();
67*91f16700Schasinglulu 	for (i = 0U; i < DRAM_CH_CNT; i++) {
68*91f16700Schasinglulu 		if ((qos_init_ddr_phyvalid & (1U << i))) {
69*91f16700Schasinglulu 			qos_init_ddr_ch++;
70*91f16700Schasinglulu 		}
71*91f16700Schasinglulu 	}
72*91f16700Schasinglulu #endif /* RCAR_LSI != RZ_G2E */
73*91f16700Schasinglulu 
74*91f16700Schasinglulu 	reg = mmio_read_32(PRR);
75*91f16700Schasinglulu #if (RCAR_LSI == RCAR_AUTO) || RCAR_LSI_CUT_COMPAT
76*91f16700Schasinglulu 	switch (reg & PRR_PRODUCT_MASK) {
77*91f16700Schasinglulu 	case PRR_PRODUCT_M3:
78*91f16700Schasinglulu #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2M)
79*91f16700Schasinglulu 		switch (reg & PRR_CUT_MASK) {
80*91f16700Schasinglulu 		case PRR_PRODUCT_10:
81*91f16700Schasinglulu 			qos_init_g2m_v10();
82*91f16700Schasinglulu 			break;
83*91f16700Schasinglulu 		case PRR_PRODUCT_21: /* G2M Cut 13 */
84*91f16700Schasinglulu 			qos_init_g2m_v11();
85*91f16700Schasinglulu 			break;
86*91f16700Schasinglulu 		case PRR_PRODUCT_30: /* G2M Cut 30 */
87*91f16700Schasinglulu 		default:
88*91f16700Schasinglulu 			qos_init_g2m_v30();
89*91f16700Schasinglulu 			break;
90*91f16700Schasinglulu 		}
91*91f16700Schasinglulu #else /* (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2M) */
92*91f16700Schasinglulu 		PRR_PRODUCT_ERR(reg);
93*91f16700Schasinglulu #endif /* (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2M) */
94*91f16700Schasinglulu 		break;
95*91f16700Schasinglulu 	case PRR_PRODUCT_H3:
96*91f16700Schasinglulu #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2H)
97*91f16700Schasinglulu 		switch (reg & PRR_CUT_MASK) {
98*91f16700Schasinglulu 		case PRR_PRODUCT_30:
99*91f16700Schasinglulu 		default:
100*91f16700Schasinglulu 			qos_init_g2h_v30();
101*91f16700Schasinglulu 			break;
102*91f16700Schasinglulu 		}
103*91f16700Schasinglulu #else
104*91f16700Schasinglulu 		PRR_PRODUCT_ERR(reg);
105*91f16700Schasinglulu #endif /* (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2H) */
106*91f16700Schasinglulu 		break;
107*91f16700Schasinglulu 	case PRR_PRODUCT_M3N:
108*91f16700Schasinglulu #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2N)
109*91f16700Schasinglulu 		switch (reg & PRR_CUT_MASK) {
110*91f16700Schasinglulu 		case PRR_PRODUCT_10:
111*91f16700Schasinglulu 		default:
112*91f16700Schasinglulu 			qos_init_g2n_v10();
113*91f16700Schasinglulu 			break;
114*91f16700Schasinglulu 		}
115*91f16700Schasinglulu #else
116*91f16700Schasinglulu 		PRR_PRODUCT_ERR(reg);
117*91f16700Schasinglulu #endif /* (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2N) */
118*91f16700Schasinglulu 		break;
119*91f16700Schasinglulu 	case PRR_PRODUCT_E3:
120*91f16700Schasinglulu #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2E)
121*91f16700Schasinglulu 		switch (reg & PRR_CUT_MASK) {
122*91f16700Schasinglulu 		case PRR_PRODUCT_10:
123*91f16700Schasinglulu 		default:
124*91f16700Schasinglulu 			qos_init_g2e_v10();
125*91f16700Schasinglulu 			break;
126*91f16700Schasinglulu 		}
127*91f16700Schasinglulu #else
128*91f16700Schasinglulu 		PRR_PRODUCT_ERR(reg);
129*91f16700Schasinglulu #endif /* (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2E) */
130*91f16700Schasinglulu 		break;
131*91f16700Schasinglulu 	default:
132*91f16700Schasinglulu 		PRR_PRODUCT_ERR(reg);
133*91f16700Schasinglulu 		break;
134*91f16700Schasinglulu 	}
135*91f16700Schasinglulu #else /* RCAR_LSI == RCAR_AUTO || RCAR_LSI_CUT_COMPAT */
136*91f16700Schasinglulu #if (RCAR_LSI == RZ_G2M)
137*91f16700Schasinglulu #if RCAR_LSI_CUT == RCAR_CUT_10
138*91f16700Schasinglulu 	/* G2M Cut 10 */
139*91f16700Schasinglulu 	if ((PRR_PRODUCT_M3 | PRR_PRODUCT_10)
140*91f16700Schasinglulu 	    != (reg & (PRR_PRODUCT_MASK | PRR_CUT_MASK))) {
141*91f16700Schasinglulu 		PRR_PRODUCT_ERR(reg);
142*91f16700Schasinglulu 	}
143*91f16700Schasinglulu 	qos_init_g2m_v10();
144*91f16700Schasinglulu #elif RCAR_LSI_CUT == RCAR_CUT_11
145*91f16700Schasinglulu 	/* G2M Cut 11 */
146*91f16700Schasinglulu 	if ((PRR_PRODUCT_M3 | PRR_PRODUCT_20)
147*91f16700Schasinglulu 	    != (reg & (PRR_PRODUCT_MASK | PRR_CUT_MASK))) {
148*91f16700Schasinglulu 		PRR_PRODUCT_ERR(reg);
149*91f16700Schasinglulu 	}
150*91f16700Schasinglulu 	qos_init_g2m_v11();
151*91f16700Schasinglulu #elif RCAR_LSI_CUT == RCAR_CUT_13
152*91f16700Schasinglulu 	/* G2M Cut 13 */
153*91f16700Schasinglulu 	if ((PRR_PRODUCT_M3 | PRR_PRODUCT_21)
154*91f16700Schasinglulu 	    != (reg & (PRR_PRODUCT_MASK | PRR_CUT_MASK))) {
155*91f16700Schasinglulu 		PRR_PRODUCT_ERR(reg);
156*91f16700Schasinglulu 	}
157*91f16700Schasinglulu 	qos_init_g2m_v11();
158*91f16700Schasinglulu #else
159*91f16700Schasinglulu 	/* G2M Cut 30 or later */
160*91f16700Schasinglulu 	if ((PRR_PRODUCT_M3)
161*91f16700Schasinglulu 	    != (reg & (PRR_PRODUCT_MASK))) {
162*91f16700Schasinglulu 		PRR_PRODUCT_ERR(reg);
163*91f16700Schasinglulu 	}
164*91f16700Schasinglulu 	qos_init_g2m_v30();
165*91f16700Schasinglulu #endif /* RCAR_LSI_CUT == RCAR_CUT_10 */
166*91f16700Schasinglulu #elif (RCAR_LSI == RZ_G2H)
167*91f16700Schasinglulu 	/* G2H Cut 30 or later */
168*91f16700Schasinglulu 	if ((reg & PRR_PRODUCT_MASK) != PRR_PRODUCT_H3) {
169*91f16700Schasinglulu 		PRR_PRODUCT_ERR(reg);
170*91f16700Schasinglulu 	}
171*91f16700Schasinglulu 	qos_init_g2h_v30();
172*91f16700Schasinglulu #elif (RCAR_LSI == RZ_G2N)
173*91f16700Schasinglulu 	/* G2N Cut 10 or later */
174*91f16700Schasinglulu 	if ((reg & (PRR_PRODUCT_MASK)) != PRR_PRODUCT_M3N) {
175*91f16700Schasinglulu 		PRR_PRODUCT_ERR(reg);
176*91f16700Schasinglulu 	}
177*91f16700Schasinglulu 	qos_init_g2n_v10();
178*91f16700Schasinglulu #elif RCAR_LSI == RZ_G2E
179*91f16700Schasinglulu 	/* G2E Cut 10 or later */
180*91f16700Schasinglulu 	if ((reg & (PRR_PRODUCT_MASK)) != PRR_PRODUCT_E3) {
181*91f16700Schasinglulu 		PRR_PRODUCT_ERR(reg);
182*91f16700Schasinglulu 	}
183*91f16700Schasinglulu 	qos_init_g2e_v10();
184*91f16700Schasinglulu #else /* (RCAR_LSI == RZ_G2M) */
185*91f16700Schasinglulu #error "Don't have QoS initialize routine(Unknown chip)."
186*91f16700Schasinglulu #endif /* (RCAR_LSI == RZ_G2M) */
187*91f16700Schasinglulu #endif /* RCAR_LSI == RCAR_AUTO || RCAR_LSI_CUT_COMPAT */
188*91f16700Schasinglulu }
189*91f16700Schasinglulu 
190*91f16700Schasinglulu #if (RCAR_LSI != RZ_G2E)
191*91f16700Schasinglulu uint32_t get_refperiod(void)
192*91f16700Schasinglulu {
193*91f16700Schasinglulu 	uint32_t refperiod = QOSWT_WTSET0_CYCLE;
194*91f16700Schasinglulu 
195*91f16700Schasinglulu #if (RCAR_LSI == RCAR_AUTO) || RCAR_LSI_CUT_COMPAT
196*91f16700Schasinglulu 	uint32_t reg;
197*91f16700Schasinglulu 
198*91f16700Schasinglulu 	reg = mmio_read_32(PRR);
199*91f16700Schasinglulu 	switch (reg & PRR_PRODUCT_MASK) {
200*91f16700Schasinglulu #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2M)
201*91f16700Schasinglulu 	case PRR_PRODUCT_M3:
202*91f16700Schasinglulu 		switch (reg & PRR_CUT_MASK) {
203*91f16700Schasinglulu 		case PRR_PRODUCT_10:
204*91f16700Schasinglulu 			break;
205*91f16700Schasinglulu 		case PRR_PRODUCT_20: /* G2M Cut 11 */
206*91f16700Schasinglulu 		case PRR_PRODUCT_21: /* G2M Cut 13 */
207*91f16700Schasinglulu 		case PRR_PRODUCT_30: /* G2M Cut 30 */
208*91f16700Schasinglulu 		default:
209*91f16700Schasinglulu 			refperiod = REFPERIOD_CYCLE;
210*91f16700Schasinglulu 			break;
211*91f16700Schasinglulu 		}
212*91f16700Schasinglulu 		break;
213*91f16700Schasinglulu #endif /* (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2M) */
214*91f16700Schasinglulu #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2H)
215*91f16700Schasinglulu 	case PRR_PRODUCT_H3:
216*91f16700Schasinglulu 		switch (reg & PRR_CUT_MASK) {
217*91f16700Schasinglulu 		case PRR_PRODUCT_30:
218*91f16700Schasinglulu 		default:
219*91f16700Schasinglulu 			refperiod = REFPERIOD_CYCLE;
220*91f16700Schasinglulu 			break;
221*91f16700Schasinglulu 		}
222*91f16700Schasinglulu 		break;
223*91f16700Schasinglulu #endif /* (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2H) */
224*91f16700Schasinglulu #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2N)
225*91f16700Schasinglulu 	case PRR_PRODUCT_M3N:
226*91f16700Schasinglulu 		refperiod = REFPERIOD_CYCLE;
227*91f16700Schasinglulu 		break;
228*91f16700Schasinglulu #endif /* (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2N) */
229*91f16700Schasinglulu 	default:
230*91f16700Schasinglulu 		break;
231*91f16700Schasinglulu 	}
232*91f16700Schasinglulu #elif RCAR_LSI == RZ_G2M
233*91f16700Schasinglulu #if RCAR_LSI_CUT == RCAR_CUT_10
234*91f16700Schasinglulu 	/* G2M Cut 10 */
235*91f16700Schasinglulu #else /* RCAR_LSI_CUT == RCAR_CUT_10 */
236*91f16700Schasinglulu 	/* G2M Cut 11|13|30 or later */
237*91f16700Schasinglulu 	refperiod = REFPERIOD_CYCLE;
238*91f16700Schasinglulu #endif /* RCAR_LSI_CUT == RCAR_CUT_10 */
239*91f16700Schasinglulu #elif RCAR_LSI == RZ_G2N
240*91f16700Schasinglulu 	refperiod = REFPERIOD_CYCLE;
241*91f16700Schasinglulu #elif RCAR_LSI == RZ_G2H
242*91f16700Schasinglulu 	/* G2H Cut 30 or later */
243*91f16700Schasinglulu 	refperiod = REFPERIOD_CYCLE;
244*91f16700Schasinglulu #endif /* RCAR_LSI == RCAR_AUTO || RCAR_LSI_CUT_COMPAT */
245*91f16700Schasinglulu 	return refperiod;
246*91f16700Schasinglulu }
247*91f16700Schasinglulu #endif /* RCAR_LSI != RZ_G2E */
248*91f16700Schasinglulu 
249*91f16700Schasinglulu void rzg_qos_dbsc_setting(const struct rcar_gen3_dbsc_qos_settings *qos,
250*91f16700Schasinglulu 			  unsigned int qos_size, bool dbsc_wren)
251*91f16700Schasinglulu {
252*91f16700Schasinglulu 	unsigned int i;
253*91f16700Schasinglulu 
254*91f16700Schasinglulu 	/* Register write enable */
255*91f16700Schasinglulu 	if (dbsc_wren) {
256*91f16700Schasinglulu 		mmio_write_32(DBSC_DBSYSCNT0, 0x00001234U);
257*91f16700Schasinglulu 	}
258*91f16700Schasinglulu 
259*91f16700Schasinglulu 	for (i = 0; i < qos_size; i++) {
260*91f16700Schasinglulu 		mmio_write_32(qos[i].reg, qos[i].val);
261*91f16700Schasinglulu 	}
262*91f16700Schasinglulu 
263*91f16700Schasinglulu 	/* Register write protect */
264*91f16700Schasinglulu 	if (dbsc_wren) {
265*91f16700Schasinglulu 		mmio_write_32(DBSC_DBSYSCNT0, 0x00000000U);
266*91f16700Schasinglulu 	}
267*91f16700Schasinglulu }
268