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