xref: /rk3399_ARM-atf/drivers/renesas/rzg/qos/qos_init.c (revision f4db9216f5291f0678d12c53839e49077bfceaec)
1*f4db9216SBiju Das /*
2*f4db9216SBiju Das  * Copyright (c) 2021, Renesas Electronics Corporation. All rights reserved.
3*f4db9216SBiju Das  *
4*f4db9216SBiju Das  * SPDX-License-Identifier: BSD-3-Clause
5*f4db9216SBiju Das  */
6*f4db9216SBiju Das 
7*f4db9216SBiju Das #include <stdint.h>
8*f4db9216SBiju Das 
9*f4db9216SBiju Das #include <common/debug.h>
10*f4db9216SBiju Das #include <lib/mmio.h>
11*f4db9216SBiju Das 
12*f4db9216SBiju Das #if RCAR_LSI == RCAR_AUTO
13*f4db9216SBiju Das #include "G2M/qos_init_g2m_v10.h"
14*f4db9216SBiju Das #include "G2M/qos_init_g2m_v11.h"
15*f4db9216SBiju Das #include "G2M/qos_init_g2m_v30.h"
16*f4db9216SBiju Das #endif /* RCAR_LSI == RCAR_AUTO */
17*f4db9216SBiju Das #if (RCAR_LSI == RZ_G2M)
18*f4db9216SBiju Das #include "G2M/qos_init_g2m_v10.h"
19*f4db9216SBiju Das #include "G2M/qos_init_g2m_v11.h"
20*f4db9216SBiju Das #include "G2M/qos_init_g2m_v30.h"
21*f4db9216SBiju Das #endif /* RCAR_LSI == RZ_G2M */
22*f4db9216SBiju Das #include "qos_common.h"
23*f4db9216SBiju Das #include "qos_init.h"
24*f4db9216SBiju Das #include "qos_reg.h"
25*f4db9216SBiju Das #include "rcar_def.h"
26*f4db9216SBiju Das 
27*f4db9216SBiju Das #define DRAM_CH_CNT	0x04U
28*f4db9216SBiju Das uint32_t qos_init_ddr_ch;
29*f4db9216SBiju Das uint8_t qos_init_ddr_phyvalid;
30*f4db9216SBiju Das 
31*f4db9216SBiju Das #define PRR_PRODUCT_ERR(reg)				\
32*f4db9216SBiju Das 	{						\
33*f4db9216SBiju Das 		ERROR("LSI Product ID(PRR=0x%x) QoS "	\
34*f4db9216SBiju Das 		"initialize not supported.\n", reg);	\
35*f4db9216SBiju Das 		panic();				\
36*f4db9216SBiju Das 	}
37*f4db9216SBiju Das 
38*f4db9216SBiju Das #define PRR_CUT_ERR(reg)				\
39*f4db9216SBiju Das 	{						\
40*f4db9216SBiju Das 		ERROR("LSI Cut ID(PRR=0x%x) QoS "	\
41*f4db9216SBiju Das 		"initialize not supported.\n", reg);	\
42*f4db9216SBiju Das 		panic();				\
43*f4db9216SBiju Das 	}
44*f4db9216SBiju Das 
45*f4db9216SBiju Das void rzg_qos_init(void)
46*f4db9216SBiju Das {
47*f4db9216SBiju Das 	uint32_t reg;
48*f4db9216SBiju Das 	uint32_t i;
49*f4db9216SBiju Das 
50*f4db9216SBiju Das 	qos_init_ddr_ch = 0U;
51*f4db9216SBiju Das 	qos_init_ddr_phyvalid = rzg_get_boardcnf_phyvalid();
52*f4db9216SBiju Das 	for (i = 0U; i < DRAM_CH_CNT; i++) {
53*f4db9216SBiju Das 		if ((qos_init_ddr_phyvalid & (1U << i))) {
54*f4db9216SBiju Das 			qos_init_ddr_ch++;
55*f4db9216SBiju Das 		}
56*f4db9216SBiju Das 	}
57*f4db9216SBiju Das 
58*f4db9216SBiju Das 	reg = mmio_read_32(PRR);
59*f4db9216SBiju Das #if (RCAR_LSI == RCAR_AUTO) || RCAR_LSI_CUT_COMPAT
60*f4db9216SBiju Das 	switch (reg & PRR_PRODUCT_MASK) {
61*f4db9216SBiju Das 	case PRR_PRODUCT_M3:
62*f4db9216SBiju Das #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2M)
63*f4db9216SBiju Das 		switch (reg & PRR_CUT_MASK) {
64*f4db9216SBiju Das 		case PRR_PRODUCT_10:
65*f4db9216SBiju Das 			qos_init_g2m_v10();
66*f4db9216SBiju Das 			break;
67*f4db9216SBiju Das 		case PRR_PRODUCT_21: /* G2M Cut 13 */
68*f4db9216SBiju Das 			qos_init_g2m_v11();
69*f4db9216SBiju Das 			break;
70*f4db9216SBiju Das 		case PRR_PRODUCT_30: /* G2M Cut 30 */
71*f4db9216SBiju Das 		default:
72*f4db9216SBiju Das 			qos_init_g2m_v30();
73*f4db9216SBiju Das 			break;
74*f4db9216SBiju Das 		}
75*f4db9216SBiju Das #else /* (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2M) */
76*f4db9216SBiju Das 		PRR_PRODUCT_ERR(reg);
77*f4db9216SBiju Das #endif /* (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2M) */
78*f4db9216SBiju Das 		break;
79*f4db9216SBiju Das 	default:
80*f4db9216SBiju Das 		PRR_PRODUCT_ERR(reg);
81*f4db9216SBiju Das 		break;
82*f4db9216SBiju Das 	}
83*f4db9216SBiju Das #else /* RCAR_LSI == RCAR_AUTO || RCAR_LSI_CUT_COMPAT */
84*f4db9216SBiju Das #if (RCAR_LSI == RZ_G2M)
85*f4db9216SBiju Das #if RCAR_LSI_CUT == RCAR_CUT_10
86*f4db9216SBiju Das 	/* G2M Cut 10 */
87*f4db9216SBiju Das 	if ((PRR_PRODUCT_M3 | PRR_PRODUCT_10)
88*f4db9216SBiju Das 	    != (reg & (PRR_PRODUCT_MASK | PRR_CUT_MASK))) {
89*f4db9216SBiju Das 		PRR_PRODUCT_ERR(reg);
90*f4db9216SBiju Das 	}
91*f4db9216SBiju Das 	qos_init_g2m_v10();
92*f4db9216SBiju Das #elif RCAR_LSI_CUT == RCAR_CUT_11
93*f4db9216SBiju Das 	/* G2M Cut 11 */
94*f4db9216SBiju Das 	if ((PRR_PRODUCT_M3 | PRR_PRODUCT_20)
95*f4db9216SBiju Das 	    != (reg & (PRR_PRODUCT_MASK | PRR_CUT_MASK))) {
96*f4db9216SBiju Das 		PRR_PRODUCT_ERR(reg);
97*f4db9216SBiju Das 	}
98*f4db9216SBiju Das 	qos_init_g2m_v11();
99*f4db9216SBiju Das #elif RCAR_LSI_CUT == RCAR_CUT_13
100*f4db9216SBiju Das 	/* G2M Cut 13 */
101*f4db9216SBiju Das 	if ((PRR_PRODUCT_M3 | PRR_PRODUCT_21)
102*f4db9216SBiju Das 	    != (reg & (PRR_PRODUCT_MASK | PRR_CUT_MASK))) {
103*f4db9216SBiju Das 		PRR_PRODUCT_ERR(reg);
104*f4db9216SBiju Das 	}
105*f4db9216SBiju Das 	qos_init_g2m_v11();
106*f4db9216SBiju Das #else
107*f4db9216SBiju Das 	/* G2M Cut 30 or later */
108*f4db9216SBiju Das 	if ((PRR_PRODUCT_M3)
109*f4db9216SBiju Das 	    != (reg & (PRR_PRODUCT_MASK))) {
110*f4db9216SBiju Das 		PRR_PRODUCT_ERR(reg);
111*f4db9216SBiju Das 	}
112*f4db9216SBiju Das 	qos_init_g2m_v30();
113*f4db9216SBiju Das #endif /* RCAR_LSI_CUT == RCAR_CUT_10 */
114*f4db9216SBiju Das #else /* (RCAR_LSI == RZ_G2M) */
115*f4db9216SBiju Das #error "Don't have QoS initialize routine(Unknown chip)."
116*f4db9216SBiju Das #endif /* (RCAR_LSI == RZ_G2M) */
117*f4db9216SBiju Das #endif /* RCAR_LSI == RCAR_AUTO || RCAR_LSI_CUT_COMPAT */
118*f4db9216SBiju Das }
119*f4db9216SBiju Das 
120*f4db9216SBiju Das uint32_t get_refperiod(void)
121*f4db9216SBiju Das {
122*f4db9216SBiju Das 	uint32_t refperiod = QOSWT_WTSET0_CYCLE;
123*f4db9216SBiju Das 
124*f4db9216SBiju Das #if (RCAR_LSI == RCAR_AUTO) || RCAR_LSI_CUT_COMPAT
125*f4db9216SBiju Das 	uint32_t reg;
126*f4db9216SBiju Das 
127*f4db9216SBiju Das 	reg = mmio_read_32(PRR);
128*f4db9216SBiju Das 	switch (reg & PRR_PRODUCT_MASK) {
129*f4db9216SBiju Das #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2M)
130*f4db9216SBiju Das 	case PRR_PRODUCT_M3:
131*f4db9216SBiju Das 		switch (reg & PRR_CUT_MASK) {
132*f4db9216SBiju Das 		case PRR_PRODUCT_10:
133*f4db9216SBiju Das 			break;
134*f4db9216SBiju Das 		case PRR_PRODUCT_20: /* G2M Cut 11 */
135*f4db9216SBiju Das 		case PRR_PRODUCT_21: /* G2M Cut 13 */
136*f4db9216SBiju Das 		case PRR_PRODUCT_30: /* G2M Cut 30 */
137*f4db9216SBiju Das 		default:
138*f4db9216SBiju Das 			refperiod = REFPERIOD_CYCLE;
139*f4db9216SBiju Das 			break;
140*f4db9216SBiju Das 		}
141*f4db9216SBiju Das 		break;
142*f4db9216SBiju Das #endif /* (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2M) */
143*f4db9216SBiju Das 	default:
144*f4db9216SBiju Das 		break;
145*f4db9216SBiju Das 	}
146*f4db9216SBiju Das #elif RCAR_LSI == RZ_G2M
147*f4db9216SBiju Das #if RCAR_LSI_CUT == RCAR_CUT_10
148*f4db9216SBiju Das 	/* G2M Cut 10 */
149*f4db9216SBiju Das #else /* RCAR_LSI_CUT == RCAR_CUT_10 */
150*f4db9216SBiju Das 	/* G2M Cut 11|13|30 or later */
151*f4db9216SBiju Das 	refperiod = REFPERIOD_CYCLE;
152*f4db9216SBiju Das #endif /* RCAR_LSI_CUT == RCAR_CUT_10 */
153*f4db9216SBiju Das #endif /* RCAR_LSI == RCAR_AUTO || RCAR_LSI_CUT_COMPAT */
154*f4db9216SBiju Das 	return refperiod;
155*f4db9216SBiju Das }
156*f4db9216SBiju Das 
157*f4db9216SBiju Das void rzg_qos_dbsc_setting(const struct rcar_gen3_dbsc_qos_settings *qos,
158*f4db9216SBiju Das 			  unsigned int qos_size, bool dbsc_wren)
159*f4db9216SBiju Das {
160*f4db9216SBiju Das 	unsigned int i;
161*f4db9216SBiju Das 
162*f4db9216SBiju Das 	/* Register write enable */
163*f4db9216SBiju Das 	if (dbsc_wren) {
164*f4db9216SBiju Das 		mmio_write_32(DBSC_DBSYSCNT0, 0x00001234U);
165*f4db9216SBiju Das 	}
166*f4db9216SBiju Das 
167*f4db9216SBiju Das 	for (i = 0; i < qos_size; i++) {
168*f4db9216SBiju Das 		mmio_write_32(qos[i].reg, qos[i].val);
169*f4db9216SBiju Das 	}
170*f4db9216SBiju Das 
171*f4db9216SBiju Das 	/* Register write protect */
172*f4db9216SBiju Das 	if (dbsc_wren) {
173*f4db9216SBiju Das 		mmio_write_32(DBSC_DBSYSCNT0, 0x00000000U);
174*f4db9216SBiju Das 	}
175*f4db9216SBiju Das }
176