xref: /rk3399_ARM-atf/drivers/renesas/rzg/qos/qos_init.c (revision 86c3cc305aaa40c62c0d03556958b4427bb8435d)
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*86c3cc30SLad 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"
17f4db9216SBiju Das #endif /* RCAR_LSI == RCAR_AUTO */
18f4db9216SBiju Das #if (RCAR_LSI == RZ_G2M)
19f4db9216SBiju Das #include "G2M/qos_init_g2m_v10.h"
20f4db9216SBiju Das #include "G2M/qos_init_g2m_v11.h"
21f4db9216SBiju Das #include "G2M/qos_init_g2m_v30.h"
22f4db9216SBiju Das #endif /* RCAR_LSI == RZ_G2M */
23*86c3cc30SLad Prabhakar #if RCAR_LSI == RZ_G2H
24*86c3cc30SLad Prabhakar #include "G2H/qos_init_g2h_v30.h"
25*86c3cc30SLad Prabhakar #endif /* RCAR_LSI == RZ_G2H */
26f4db9216SBiju Das #include "qos_common.h"
27f4db9216SBiju Das #include "qos_init.h"
28f4db9216SBiju Das #include "qos_reg.h"
29f4db9216SBiju Das #include "rcar_def.h"
30f4db9216SBiju Das 
31f4db9216SBiju Das #define DRAM_CH_CNT	0x04U
32f4db9216SBiju Das uint32_t qos_init_ddr_ch;
33f4db9216SBiju Das uint8_t qos_init_ddr_phyvalid;
34f4db9216SBiju Das 
35f4db9216SBiju Das #define PRR_PRODUCT_ERR(reg)				\
36f4db9216SBiju Das 	{						\
37f4db9216SBiju Das 		ERROR("LSI Product ID(PRR=0x%x) QoS "	\
38f4db9216SBiju Das 		"initialize not supported.\n", reg);	\
39f4db9216SBiju Das 		panic();				\
40f4db9216SBiju Das 	}
41f4db9216SBiju Das 
42f4db9216SBiju Das #define PRR_CUT_ERR(reg)				\
43f4db9216SBiju Das 	{						\
44f4db9216SBiju Das 		ERROR("LSI Cut ID(PRR=0x%x) QoS "	\
45f4db9216SBiju Das 		"initialize not supported.\n", reg);	\
46f4db9216SBiju Das 		panic();				\
47f4db9216SBiju Das 	}
48f4db9216SBiju Das 
49f4db9216SBiju Das void rzg_qos_init(void)
50f4db9216SBiju Das {
51f4db9216SBiju Das 	uint32_t reg;
52f4db9216SBiju Das 	uint32_t i;
53f4db9216SBiju Das 
54f4db9216SBiju Das 	qos_init_ddr_ch = 0U;
55778db0e9SLad Prabhakar 	qos_init_ddr_phyvalid = get_boardcnf_phyvalid();
56f4db9216SBiju Das 	for (i = 0U; i < DRAM_CH_CNT; i++) {
57f4db9216SBiju Das 		if ((qos_init_ddr_phyvalid & (1U << i))) {
58f4db9216SBiju Das 			qos_init_ddr_ch++;
59f4db9216SBiju Das 		}
60f4db9216SBiju Das 	}
61f4db9216SBiju Das 
62f4db9216SBiju Das 	reg = mmio_read_32(PRR);
63f4db9216SBiju Das #if (RCAR_LSI == RCAR_AUTO) || RCAR_LSI_CUT_COMPAT
64f4db9216SBiju Das 	switch (reg & PRR_PRODUCT_MASK) {
65f4db9216SBiju Das 	case PRR_PRODUCT_M3:
66f4db9216SBiju Das #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2M)
67f4db9216SBiju Das 		switch (reg & PRR_CUT_MASK) {
68f4db9216SBiju Das 		case PRR_PRODUCT_10:
69f4db9216SBiju Das 			qos_init_g2m_v10();
70f4db9216SBiju Das 			break;
71f4db9216SBiju Das 		case PRR_PRODUCT_21: /* G2M Cut 13 */
72f4db9216SBiju Das 			qos_init_g2m_v11();
73f4db9216SBiju Das 			break;
74f4db9216SBiju Das 		case PRR_PRODUCT_30: /* G2M Cut 30 */
75f4db9216SBiju Das 		default:
76f4db9216SBiju Das 			qos_init_g2m_v30();
77f4db9216SBiju Das 			break;
78f4db9216SBiju Das 		}
79f4db9216SBiju Das #else /* (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2M) */
80f4db9216SBiju Das 		PRR_PRODUCT_ERR(reg);
81f4db9216SBiju Das #endif /* (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2M) */
82f4db9216SBiju Das 		break;
83*86c3cc30SLad Prabhakar 	case PRR_PRODUCT_H3:
84*86c3cc30SLad Prabhakar #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2H)
85*86c3cc30SLad Prabhakar 		switch (reg & PRR_CUT_MASK) {
86*86c3cc30SLad Prabhakar 		case PRR_PRODUCT_30:
87*86c3cc30SLad Prabhakar 		default:
88*86c3cc30SLad Prabhakar 			qos_init_g2h_v30();
89*86c3cc30SLad Prabhakar 			break;
90*86c3cc30SLad Prabhakar 		}
91*86c3cc30SLad Prabhakar #else
92*86c3cc30SLad Prabhakar 		PRR_PRODUCT_ERR(reg);
93*86c3cc30SLad Prabhakar #endif /* (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2H) */
94*86c3cc30SLad Prabhakar 		break;
95f4db9216SBiju Das 	default:
96f4db9216SBiju Das 		PRR_PRODUCT_ERR(reg);
97f4db9216SBiju Das 		break;
98f4db9216SBiju Das 	}
99f4db9216SBiju Das #else /* RCAR_LSI == RCAR_AUTO || RCAR_LSI_CUT_COMPAT */
100f4db9216SBiju Das #if (RCAR_LSI == RZ_G2M)
101f4db9216SBiju Das #if RCAR_LSI_CUT == RCAR_CUT_10
102f4db9216SBiju Das 	/* G2M Cut 10 */
103f4db9216SBiju Das 	if ((PRR_PRODUCT_M3 | PRR_PRODUCT_10)
104f4db9216SBiju Das 	    != (reg & (PRR_PRODUCT_MASK | PRR_CUT_MASK))) {
105f4db9216SBiju Das 		PRR_PRODUCT_ERR(reg);
106f4db9216SBiju Das 	}
107f4db9216SBiju Das 	qos_init_g2m_v10();
108f4db9216SBiju Das #elif RCAR_LSI_CUT == RCAR_CUT_11
109f4db9216SBiju Das 	/* G2M Cut 11 */
110f4db9216SBiju Das 	if ((PRR_PRODUCT_M3 | PRR_PRODUCT_20)
111f4db9216SBiju Das 	    != (reg & (PRR_PRODUCT_MASK | PRR_CUT_MASK))) {
112f4db9216SBiju Das 		PRR_PRODUCT_ERR(reg);
113f4db9216SBiju Das 	}
114f4db9216SBiju Das 	qos_init_g2m_v11();
115f4db9216SBiju Das #elif RCAR_LSI_CUT == RCAR_CUT_13
116f4db9216SBiju Das 	/* G2M Cut 13 */
117f4db9216SBiju Das 	if ((PRR_PRODUCT_M3 | PRR_PRODUCT_21)
118f4db9216SBiju Das 	    != (reg & (PRR_PRODUCT_MASK | PRR_CUT_MASK))) {
119f4db9216SBiju Das 		PRR_PRODUCT_ERR(reg);
120f4db9216SBiju Das 	}
121f4db9216SBiju Das 	qos_init_g2m_v11();
122f4db9216SBiju Das #else
123f4db9216SBiju Das 	/* G2M Cut 30 or later */
124f4db9216SBiju Das 	if ((PRR_PRODUCT_M3)
125f4db9216SBiju Das 	    != (reg & (PRR_PRODUCT_MASK))) {
126f4db9216SBiju Das 		PRR_PRODUCT_ERR(reg);
127f4db9216SBiju Das 	}
128f4db9216SBiju Das 	qos_init_g2m_v30();
129f4db9216SBiju Das #endif /* RCAR_LSI_CUT == RCAR_CUT_10 */
130*86c3cc30SLad Prabhakar #elif (RCAR_LSI == RZ_G2H)
131*86c3cc30SLad Prabhakar 	/* G2H Cut 30 or later */
132*86c3cc30SLad Prabhakar 	if ((reg & PRR_PRODUCT_MASK) != PRR_PRODUCT_H3) {
133*86c3cc30SLad Prabhakar 		PRR_PRODUCT_ERR(reg);
134*86c3cc30SLad Prabhakar 	}
135*86c3cc30SLad Prabhakar 	qos_init_g2h_v30();
136f4db9216SBiju Das #else /* (RCAR_LSI == RZ_G2M) */
137f4db9216SBiju Das #error "Don't have QoS initialize routine(Unknown chip)."
138f4db9216SBiju Das #endif /* (RCAR_LSI == RZ_G2M) */
139f4db9216SBiju Das #endif /* RCAR_LSI == RCAR_AUTO || RCAR_LSI_CUT_COMPAT */
140f4db9216SBiju Das }
141f4db9216SBiju Das 
142f4db9216SBiju Das uint32_t get_refperiod(void)
143f4db9216SBiju Das {
144f4db9216SBiju Das 	uint32_t refperiod = QOSWT_WTSET0_CYCLE;
145f4db9216SBiju Das 
146f4db9216SBiju Das #if (RCAR_LSI == RCAR_AUTO) || RCAR_LSI_CUT_COMPAT
147f4db9216SBiju Das 	uint32_t reg;
148f4db9216SBiju Das 
149f4db9216SBiju Das 	reg = mmio_read_32(PRR);
150f4db9216SBiju Das 	switch (reg & PRR_PRODUCT_MASK) {
151f4db9216SBiju Das #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2M)
152f4db9216SBiju Das 	case PRR_PRODUCT_M3:
153f4db9216SBiju Das 		switch (reg & PRR_CUT_MASK) {
154f4db9216SBiju Das 		case PRR_PRODUCT_10:
155f4db9216SBiju Das 			break;
156f4db9216SBiju Das 		case PRR_PRODUCT_20: /* G2M Cut 11 */
157f4db9216SBiju Das 		case PRR_PRODUCT_21: /* G2M Cut 13 */
158f4db9216SBiju Das 		case PRR_PRODUCT_30: /* G2M Cut 30 */
159f4db9216SBiju Das 		default:
160f4db9216SBiju Das 			refperiod = REFPERIOD_CYCLE;
161f4db9216SBiju Das 			break;
162f4db9216SBiju Das 		}
163f4db9216SBiju Das 		break;
164f4db9216SBiju Das #endif /* (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2M) */
165*86c3cc30SLad Prabhakar #if (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2H)
166*86c3cc30SLad Prabhakar 	case PRR_PRODUCT_H3:
167*86c3cc30SLad Prabhakar 		switch (reg & PRR_CUT_MASK) {
168*86c3cc30SLad Prabhakar 		case PRR_PRODUCT_30:
169*86c3cc30SLad Prabhakar 		default:
170*86c3cc30SLad Prabhakar 			refperiod = REFPERIOD_CYCLE;
171*86c3cc30SLad Prabhakar 			break;
172*86c3cc30SLad Prabhakar 		}
173*86c3cc30SLad Prabhakar 		break;
174*86c3cc30SLad Prabhakar #endif /* (RCAR_LSI == RCAR_AUTO) || (RCAR_LSI == RZ_G2H) */
175f4db9216SBiju Das 	default:
176f4db9216SBiju Das 		break;
177f4db9216SBiju Das 	}
178f4db9216SBiju Das #elif RCAR_LSI == RZ_G2M
179f4db9216SBiju Das #if RCAR_LSI_CUT == RCAR_CUT_10
180f4db9216SBiju Das 	/* G2M Cut 10 */
181f4db9216SBiju Das #else /* RCAR_LSI_CUT == RCAR_CUT_10 */
182f4db9216SBiju Das 	/* G2M Cut 11|13|30 or later */
183f4db9216SBiju Das 	refperiod = REFPERIOD_CYCLE;
184f4db9216SBiju Das #endif /* RCAR_LSI_CUT == RCAR_CUT_10 */
185*86c3cc30SLad Prabhakar #elif RCAR_LSI == RZ_G2H
186*86c3cc30SLad Prabhakar 	/* G2H Cut 30 or later */
187*86c3cc30SLad Prabhakar 	refperiod = REFPERIOD_CYCLE;
188f4db9216SBiju Das #endif /* RCAR_LSI == RCAR_AUTO || RCAR_LSI_CUT_COMPAT */
189f4db9216SBiju Das 	return refperiod;
190f4db9216SBiju Das }
191f4db9216SBiju Das 
192f4db9216SBiju Das void rzg_qos_dbsc_setting(const struct rcar_gen3_dbsc_qos_settings *qos,
193f4db9216SBiju Das 			  unsigned int qos_size, bool dbsc_wren)
194f4db9216SBiju Das {
195f4db9216SBiju Das 	unsigned int i;
196f4db9216SBiju Das 
197f4db9216SBiju Das 	/* Register write enable */
198f4db9216SBiju Das 	if (dbsc_wren) {
199f4db9216SBiju Das 		mmio_write_32(DBSC_DBSYSCNT0, 0x00001234U);
200f4db9216SBiju Das 	}
201f4db9216SBiju Das 
202f4db9216SBiju Das 	for (i = 0; i < qos_size; i++) {
203f4db9216SBiju Das 		mmio_write_32(qos[i].reg, qos[i].val);
204f4db9216SBiju Das 	}
205f4db9216SBiju Das 
206f4db9216SBiju Das 	/* Register write protect */
207f4db9216SBiju Das 	if (dbsc_wren) {
208f4db9216SBiju Das 		mmio_write_32(DBSC_DBSYSCNT0, 0x00000000U);
209f4db9216SBiju Das 	}
210f4db9216SBiju Das }
211