xref: /rk3399_ARM-atf/drivers/renesas/rzg/qos/qos_init.c (revision f8ecfd68ef875e714b648d4595c44f23c9a35f37)
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
1386c3cc30SLad Prabhakar #include "G2H/qos_init_g2h_v30.h"
14f4db9216SBiju Das #include "G2M/qos_init_g2m_v10.h"
15f4db9216SBiju Das #include "G2M/qos_init_g2m_v11.h"
16f4db9216SBiju Das #include "G2M/qos_init_g2m_v30.h"
17*f8ecfd68SLad Prabhakar #include "G2N/qos_init_g2n_v10.h"
18f4db9216SBiju Das #endif /* RCAR_LSI == RCAR_AUTO */
19f4db9216SBiju Das #if (RCAR_LSI == RZ_G2M)
20f4db9216SBiju Das #include "G2M/qos_init_g2m_v10.h"
21f4db9216SBiju Das #include "G2M/qos_init_g2m_v11.h"
22f4db9216SBiju Das #include "G2M/qos_init_g2m_v30.h"
23f4db9216SBiju Das #endif /* RCAR_LSI == RZ_G2M */
2486c3cc30SLad Prabhakar #if RCAR_LSI == RZ_G2H
2586c3cc30SLad Prabhakar #include "G2H/qos_init_g2h_v30.h"
2686c3cc30SLad Prabhakar #endif /* RCAR_LSI == RZ_G2H */
27*f8ecfd68SLad Prabhakar #if RCAR_LSI == RZ_G2N
28*f8ecfd68SLad Prabhakar #include "G2N/qos_init_g2n_v10.h"
29*f8ecfd68SLad Prabhakar #endif /* RCAR_LSI == RZ_G2N */
30f4db9216SBiju Das #include "qos_common.h"
31f4db9216SBiju Das #include "qos_init.h"
32f4db9216SBiju Das #include "qos_reg.h"
33f4db9216SBiju Das #include "rcar_def.h"
34f4db9216SBiju Das 
35f4db9216SBiju Das #define DRAM_CH_CNT	0x04U
36f4db9216SBiju Das uint32_t qos_init_ddr_ch;
37f4db9216SBiju Das uint8_t qos_init_ddr_phyvalid;
38f4db9216SBiju Das 
39f4db9216SBiju Das #define PRR_PRODUCT_ERR(reg)				\
40f4db9216SBiju Das 	{						\
41f4db9216SBiju Das 		ERROR("LSI Product ID(PRR=0x%x) QoS "	\
42f4db9216SBiju Das 		"initialize not supported.\n", reg);	\
43f4db9216SBiju Das 		panic();				\
44f4db9216SBiju Das 	}
45f4db9216SBiju Das 
46f4db9216SBiju Das #define PRR_CUT_ERR(reg)				\
47f4db9216SBiju Das 	{						\
48f4db9216SBiju Das 		ERROR("LSI Cut ID(PRR=0x%x) QoS "	\
49f4db9216SBiju Das 		"initialize not supported.\n", reg);	\
50f4db9216SBiju Das 		panic();				\
51f4db9216SBiju Das 	}
52f4db9216SBiju Das 
53f4db9216SBiju Das void rzg_qos_init(void)
54f4db9216SBiju Das {
55f4db9216SBiju Das 	uint32_t reg;
56f4db9216SBiju Das 	uint32_t i;
57f4db9216SBiju Das 
58f4db9216SBiju Das 	qos_init_ddr_ch = 0U;
59778db0e9SLad Prabhakar 	qos_init_ddr_phyvalid = get_boardcnf_phyvalid();
60f4db9216SBiju Das 	for (i = 0U; i < DRAM_CH_CNT; i++) {
61f4db9216SBiju Das 		if ((qos_init_ddr_phyvalid & (1U << i))) {
62f4db9216SBiju Das 			qos_init_ddr_ch++;
63f4db9216SBiju Das 		}
64f4db9216SBiju Das 	}
65f4db9216SBiju Das 
66f4db9216SBiju Das 	reg = mmio_read_32(PRR);
67f4db9216SBiju Das #if (RCAR_LSI == RCAR_AUTO) || RCAR_LSI_CUT_COMPAT
68f4db9216SBiju Das 	switch (reg & PRR_PRODUCT_MASK) {
69f4db9216SBiju Das 	case PRR_PRODUCT_M3:
70f4db9216SBiju Das #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2M)
71f4db9216SBiju Das 		switch (reg & PRR_CUT_MASK) {
72f4db9216SBiju Das 		case PRR_PRODUCT_10:
73f4db9216SBiju Das 			qos_init_g2m_v10();
74f4db9216SBiju Das 			break;
75f4db9216SBiju Das 		case PRR_PRODUCT_21: /* G2M Cut 13 */
76f4db9216SBiju Das 			qos_init_g2m_v11();
77f4db9216SBiju Das 			break;
78f4db9216SBiju Das 		case PRR_PRODUCT_30: /* G2M Cut 30 */
79f4db9216SBiju Das 		default:
80f4db9216SBiju Das 			qos_init_g2m_v30();
81f4db9216SBiju Das 			break;
82f4db9216SBiju Das 		}
83f4db9216SBiju Das #else /* (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2M) */
84f4db9216SBiju Das 		PRR_PRODUCT_ERR(reg);
85f4db9216SBiju Das #endif /* (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2M) */
86f4db9216SBiju Das 		break;
8786c3cc30SLad Prabhakar 	case PRR_PRODUCT_H3:
8886c3cc30SLad Prabhakar #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2H)
8986c3cc30SLad Prabhakar 		switch (reg & PRR_CUT_MASK) {
9086c3cc30SLad Prabhakar 		case PRR_PRODUCT_30:
9186c3cc30SLad Prabhakar 		default:
9286c3cc30SLad Prabhakar 			qos_init_g2h_v30();
9386c3cc30SLad Prabhakar 			break;
9486c3cc30SLad Prabhakar 		}
9586c3cc30SLad Prabhakar #else
9686c3cc30SLad Prabhakar 		PRR_PRODUCT_ERR(reg);
9786c3cc30SLad Prabhakar #endif /* (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2H) */
9886c3cc30SLad Prabhakar 		break;
99*f8ecfd68SLad Prabhakar 	case PRR_PRODUCT_M3N:
100*f8ecfd68SLad Prabhakar #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2N)
101*f8ecfd68SLad Prabhakar 		switch (reg & PRR_CUT_MASK) {
102*f8ecfd68SLad Prabhakar 		case PRR_PRODUCT_10:
103*f8ecfd68SLad Prabhakar 		default:
104*f8ecfd68SLad Prabhakar 			qos_init_g2n_v10();
105*f8ecfd68SLad Prabhakar 			break;
106*f8ecfd68SLad Prabhakar 		}
107*f8ecfd68SLad Prabhakar #else
108*f8ecfd68SLad Prabhakar 		PRR_PRODUCT_ERR(reg);
109*f8ecfd68SLad Prabhakar #endif /* (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2N) */
110*f8ecfd68SLad Prabhakar 		break;
111f4db9216SBiju Das 	default:
112f4db9216SBiju Das 		PRR_PRODUCT_ERR(reg);
113f4db9216SBiju Das 		break;
114f4db9216SBiju Das 	}
115f4db9216SBiju Das #else /* RCAR_LSI == RCAR_AUTO || RCAR_LSI_CUT_COMPAT */
116f4db9216SBiju Das #if (RCAR_LSI == RZ_G2M)
117f4db9216SBiju Das #if RCAR_LSI_CUT == RCAR_CUT_10
118f4db9216SBiju Das 	/* G2M Cut 10 */
119f4db9216SBiju Das 	if ((PRR_PRODUCT_M3 | PRR_PRODUCT_10)
120f4db9216SBiju Das 	    != (reg & (PRR_PRODUCT_MASK | PRR_CUT_MASK))) {
121f4db9216SBiju Das 		PRR_PRODUCT_ERR(reg);
122f4db9216SBiju Das 	}
123f4db9216SBiju Das 	qos_init_g2m_v10();
124f4db9216SBiju Das #elif RCAR_LSI_CUT == RCAR_CUT_11
125f4db9216SBiju Das 	/* G2M Cut 11 */
126f4db9216SBiju Das 	if ((PRR_PRODUCT_M3 | PRR_PRODUCT_20)
127f4db9216SBiju Das 	    != (reg & (PRR_PRODUCT_MASK | PRR_CUT_MASK))) {
128f4db9216SBiju Das 		PRR_PRODUCT_ERR(reg);
129f4db9216SBiju Das 	}
130f4db9216SBiju Das 	qos_init_g2m_v11();
131f4db9216SBiju Das #elif RCAR_LSI_CUT == RCAR_CUT_13
132f4db9216SBiju Das 	/* G2M Cut 13 */
133f4db9216SBiju Das 	if ((PRR_PRODUCT_M3 | PRR_PRODUCT_21)
134f4db9216SBiju Das 	    != (reg & (PRR_PRODUCT_MASK | PRR_CUT_MASK))) {
135f4db9216SBiju Das 		PRR_PRODUCT_ERR(reg);
136f4db9216SBiju Das 	}
137f4db9216SBiju Das 	qos_init_g2m_v11();
138f4db9216SBiju Das #else
139f4db9216SBiju Das 	/* G2M Cut 30 or later */
140f4db9216SBiju Das 	if ((PRR_PRODUCT_M3)
141f4db9216SBiju Das 	    != (reg & (PRR_PRODUCT_MASK))) {
142f4db9216SBiju Das 		PRR_PRODUCT_ERR(reg);
143f4db9216SBiju Das 	}
144f4db9216SBiju Das 	qos_init_g2m_v30();
145f4db9216SBiju Das #endif /* RCAR_LSI_CUT == RCAR_CUT_10 */
14686c3cc30SLad Prabhakar #elif (RCAR_LSI == RZ_G2H)
14786c3cc30SLad Prabhakar 	/* G2H Cut 30 or later */
14886c3cc30SLad Prabhakar 	if ((reg & PRR_PRODUCT_MASK) != PRR_PRODUCT_H3) {
14986c3cc30SLad Prabhakar 		PRR_PRODUCT_ERR(reg);
15086c3cc30SLad Prabhakar 	}
15186c3cc30SLad Prabhakar 	qos_init_g2h_v30();
152*f8ecfd68SLad Prabhakar #elif (RCAR_LSI == RZ_G2N)
153*f8ecfd68SLad Prabhakar 	/* G2N Cut 10 or later */
154*f8ecfd68SLad Prabhakar 	if ((reg & (PRR_PRODUCT_MASK)) != PRR_PRODUCT_M3N) {
155*f8ecfd68SLad Prabhakar 		PRR_PRODUCT_ERR(reg);
156*f8ecfd68SLad Prabhakar 	}
157*f8ecfd68SLad Prabhakar 	qos_init_g2n_v10();
158f4db9216SBiju Das #else /* (RCAR_LSI == RZ_G2M) */
159f4db9216SBiju Das #error "Don't have QoS initialize routine(Unknown chip)."
160f4db9216SBiju Das #endif /* (RCAR_LSI == RZ_G2M) */
161f4db9216SBiju Das #endif /* RCAR_LSI == RCAR_AUTO || RCAR_LSI_CUT_COMPAT */
162f4db9216SBiju Das }
163f4db9216SBiju Das 
164f4db9216SBiju Das uint32_t get_refperiod(void)
165f4db9216SBiju Das {
166f4db9216SBiju Das 	uint32_t refperiod = QOSWT_WTSET0_CYCLE;
167f4db9216SBiju Das 
168f4db9216SBiju Das #if (RCAR_LSI == RCAR_AUTO) || RCAR_LSI_CUT_COMPAT
169f4db9216SBiju Das 	uint32_t reg;
170f4db9216SBiju Das 
171f4db9216SBiju Das 	reg = mmio_read_32(PRR);
172f4db9216SBiju Das 	switch (reg & PRR_PRODUCT_MASK) {
173f4db9216SBiju Das #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2M)
174f4db9216SBiju Das 	case PRR_PRODUCT_M3:
175f4db9216SBiju Das 		switch (reg & PRR_CUT_MASK) {
176f4db9216SBiju Das 		case PRR_PRODUCT_10:
177f4db9216SBiju Das 			break;
178f4db9216SBiju Das 		case PRR_PRODUCT_20: /* G2M Cut 11 */
179f4db9216SBiju Das 		case PRR_PRODUCT_21: /* G2M Cut 13 */
180f4db9216SBiju Das 		case PRR_PRODUCT_30: /* G2M Cut 30 */
181f4db9216SBiju Das 		default:
182f4db9216SBiju Das 			refperiod = REFPERIOD_CYCLE;
183f4db9216SBiju Das 			break;
184f4db9216SBiju Das 		}
185f4db9216SBiju Das 		break;
186f4db9216SBiju Das #endif /* (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2M) */
18786c3cc30SLad Prabhakar #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2H)
18886c3cc30SLad Prabhakar 	case PRR_PRODUCT_H3:
18986c3cc30SLad Prabhakar 		switch (reg & PRR_CUT_MASK) {
19086c3cc30SLad Prabhakar 		case PRR_PRODUCT_30:
19186c3cc30SLad Prabhakar 		default:
19286c3cc30SLad Prabhakar 			refperiod = REFPERIOD_CYCLE;
19386c3cc30SLad Prabhakar 			break;
19486c3cc30SLad Prabhakar 		}
19586c3cc30SLad Prabhakar 		break;
19686c3cc30SLad Prabhakar #endif /* (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2H) */
197*f8ecfd68SLad Prabhakar #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2N)
198*f8ecfd68SLad Prabhakar 	case PRR_PRODUCT_M3N:
199*f8ecfd68SLad Prabhakar 		refperiod = REFPERIOD_CYCLE;
200*f8ecfd68SLad Prabhakar 		break;
201*f8ecfd68SLad Prabhakar #endif /* (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2N) */
202f4db9216SBiju Das 	default:
203f4db9216SBiju Das 		break;
204f4db9216SBiju Das 	}
205f4db9216SBiju Das #elif RCAR_LSI == RZ_G2M
206f4db9216SBiju Das #if RCAR_LSI_CUT == RCAR_CUT_10
207f4db9216SBiju Das 	/* G2M Cut 10 */
208f4db9216SBiju Das #else /* RCAR_LSI_CUT == RCAR_CUT_10 */
209f4db9216SBiju Das 	/* G2M Cut 11|13|30 or later */
210f4db9216SBiju Das 	refperiod = REFPERIOD_CYCLE;
211f4db9216SBiju Das #endif /* RCAR_LSI_CUT == RCAR_CUT_10 */
212*f8ecfd68SLad Prabhakar #elif RCAR_LSI == RZ_G2N
213*f8ecfd68SLad Prabhakar 	refperiod = REFPERIOD_CYCLE;
21486c3cc30SLad Prabhakar #elif RCAR_LSI == RZ_G2H
21586c3cc30SLad Prabhakar 	/* G2H Cut 30 or later */
21686c3cc30SLad Prabhakar 	refperiod = REFPERIOD_CYCLE;
217f4db9216SBiju Das #endif /* RCAR_LSI == RCAR_AUTO || RCAR_LSI_CUT_COMPAT */
218f4db9216SBiju Das 	return refperiod;
219f4db9216SBiju Das }
220f4db9216SBiju Das 
221f4db9216SBiju Das void rzg_qos_dbsc_setting(const struct rcar_gen3_dbsc_qos_settings *qos,
222f4db9216SBiju Das 			  unsigned int qos_size, bool dbsc_wren)
223f4db9216SBiju Das {
224f4db9216SBiju Das 	unsigned int i;
225f4db9216SBiju Das 
226f4db9216SBiju Das 	/* Register write enable */
227f4db9216SBiju Das 	if (dbsc_wren) {
228f4db9216SBiju Das 		mmio_write_32(DBSC_DBSYSCNT0, 0x00001234U);
229f4db9216SBiju Das 	}
230f4db9216SBiju Das 
231f4db9216SBiju Das 	for (i = 0; i < qos_size; i++) {
232f4db9216SBiju Das 		mmio_write_32(qos[i].reg, qos[i].val);
233f4db9216SBiju Das 	}
234f4db9216SBiju Das 
235f4db9216SBiju Das 	/* Register write protect */
236f4db9216SBiju Das 	if (dbsc_wren) {
237f4db9216SBiju Das 		mmio_write_32(DBSC_DBSYSCNT0, 0x00000000U);
238f4db9216SBiju Das 	}
239f4db9216SBiju Das }
240