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