1 /*
2  * Copyright (c) 2015-2019, Renesas Electronics Corporation. All rights reserved.
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
7 #include <stdint.h>
8 
9 #include <common/debug.h>
10 #include <lib/mmio.h>
11 
12 #include "rcar_def.h"
13 #if RCAR_LSI == RCAR_AUTO
14 #include "H3/pfc_init_h3_v1.h"
15 #include "H3/pfc_init_h3_v2.h"
16 #include "M3/pfc_init_m3.h"
17 #include "M3N/pfc_init_m3n.h"
18 #include "V3M/pfc_init_v3m.h"
19 #endif
20 #if (RCAR_LSI == RCAR_H3) || (RCAR_LSI == RCAR_H3N)	/* H3 */
21 #include "H3/pfc_init_h3_v1.h"
22 #include "H3/pfc_init_h3_v2.h"
23 #endif
24 #if RCAR_LSI == RCAR_M3		/* M3 */
25 #include "M3/pfc_init_m3.h"
26 #endif
27 #if RCAR_LSI == RCAR_M3N	/* M3N */
28 #include "M3N/pfc_init_m3n.h"
29 #endif
30 #if RCAR_LSI == RCAR_V3M	/* V3M */
31 #include "V3M/pfc_init_v3m.h"
32 #endif
33 #if RCAR_LSI == RCAR_E3		/* E3 */
34 #include "E3/pfc_init_e3.h"
35 #endif
36 #if RCAR_LSI == RCAR_D3		/* D3 */
37 #include "D3/pfc_init_d3.h"
38 #endif
39 
40 #define PRR_PRODUCT_ERR(reg)				\
41 	do {						\
42 		ERROR("LSI Product ID(PRR=0x%x) PFC initialize not supported.\n", \
43 			reg);				\
44 		panic();				\
45 	} while (0)
46 
47 #define PRR_CUT_ERR(reg)				\
48 	do {						\
49 		ERROR("LSI Cut ID(PRR=0x%x) PFC initialize not supported.\n", \
50 			reg);				\
51 		panic();\
52 	} while (0)
53 
rcar_pfc_init(void)54 void rcar_pfc_init(void)
55 {
56 	uint32_t reg;
57 
58 	reg = mmio_read_32(RCAR_PRR);
59 #if RCAR_LSI == RCAR_AUTO
60 	switch (reg & PRR_PRODUCT_MASK) {
61 	case PRR_PRODUCT_H3:
62 		switch (reg & PRR_CUT_MASK) {
63 		case PRR_PRODUCT_10:	/* H3 Ver.1.0 */
64 			pfc_init_h3_v1();
65 			break;
66 		case PRR_PRODUCT_11:	/* H3 Ver.1.1 */
67 			pfc_init_h3_v1();
68 			break;
69 		default:	/* H3 Ver.2.0 or later */
70 			pfc_init_h3_v2();
71 			break;
72 		}
73 		break;
74 	case PRR_PRODUCT_M3:
75 		pfc_init_m3();
76 		break;
77 	case PRR_PRODUCT_M3N:
78 		pfc_init_m3n();
79 		break;
80 	case PRR_PRODUCT_V3M:
81 		pfc_init_v3m();
82 		break;
83 	default:
84 		PRR_PRODUCT_ERR(reg);
85 		break;
86 	}
87 
88 #elif RCAR_LSI_CUT_COMPAT
89 	switch (reg & PRR_PRODUCT_MASK) {
90 	case PRR_PRODUCT_H3:
91 #if (RCAR_LSI != RCAR_H3) && (RCAR_LSI != RCAR_H3N)
92 		PRR_PRODUCT_ERR(reg);
93 #else
94 		switch (reg & PRR_CUT_MASK) {
95 		case PRR_PRODUCT_10:	/* H3 Ver.1.0 */
96 			pfc_init_h3_v1();
97 			break;
98 		case PRR_PRODUCT_11:	/* H3 Ver.1.1 */
99 			pfc_init_h3_v1();
100 			break;
101 		default:	/* H3 Ver.2.0 or later */
102 			pfc_init_h3_v2();
103 			break;
104 		}
105 #endif
106 		break;
107 	case PRR_PRODUCT_M3:
108 #if RCAR_LSI != RCAR_M3
109 		PRR_PRODUCT_ERR(reg);
110 #else
111 		pfc_init_m3();
112 #endif
113 		break;
114 	case PRR_PRODUCT_M3N:
115 #if RCAR_LSI != RCAR_M3N
116 		PRR_PRODUCT_ERR(reg);
117 #else
118 		pfc_init_m3n();
119 #endif
120 		break;
121 	case PRR_PRODUCT_V3M:
122 #if RCAR_LSI != RCAR_V3M
123 		PRR_PRODUCT_ERR(reg);
124 #else
125 		pfc_init_v3m();
126 #endif
127 		break;
128 	case PRR_PRODUCT_E3:
129 #if RCAR_LSI != RCAR_E3
130 		PRR_PRODUCT_ERR(reg);
131 #else
132 		pfc_init_e3();
133 #endif
134 		break;
135 	case PRR_PRODUCT_D3:
136 #if RCAR_LSI != RCAR_D3
137 		PRR_PRODUCT_ERR(reg);
138 #else
139 		pfc_init_d3();
140 #endif
141 		break;
142 	default:
143 		PRR_PRODUCT_ERR(reg);
144 		break;
145 	}
146 
147 #else
148 #if (RCAR_LSI == RCAR_H3) || (RCAR_LSI == RCAR_H3N)	/* H3 */
149 #if RCAR_LSI_CUT == RCAR_CUT_10
150 	/* H3 Ver.1.0 */
151 	if ((PRR_PRODUCT_H3 | PRR_PRODUCT_10)
152 	    != (reg & (PRR_PRODUCT_MASK | PRR_CUT_MASK))) {
153 		PRR_PRODUCT_ERR(reg);
154 	}
155 	pfc_init_h3_v1();
156 #elif RCAR_LSI_CUT == RCAR_CUT_11
157 	/* H3 Ver.1.1 */
158 	if ((PRR_PRODUCT_H3 | PRR_PRODUCT_11)
159 	    != (reg & (PRR_PRODUCT_MASK | PRR_CUT_MASK))) {
160 		PRR_PRODUCT_ERR(reg);
161 	}
162 	pfc_init_h3_v1();
163 #else
164 	/* H3 Ver.2.0 or later */
165 	if (PRR_PRODUCT_H3 != (reg & PRR_PRODUCT_MASK)) {
166 		PRR_PRODUCT_ERR(reg);
167 	}
168 	pfc_init_h3_v2();
169 #endif
170 #elif RCAR_LSI == RCAR_M3	/* M3 */
171 	if ((PRR_PRODUCT_M3) != (reg & PRR_PRODUCT_MASK)) {
172 		PRR_PRODUCT_ERR(reg);
173 	}
174 	pfc_init_m3();
175 #elif RCAR_LSI == RCAR_M3N	/* M3N */
176 	if ((PRR_PRODUCT_M3N) != (reg & PRR_PRODUCT_MASK)) {
177 		PRR_PRODUCT_ERR(reg);
178 	}
179 	pfc_init_m3n();
180 #elif RCAR_LSI == RCAR_V3M	/* V3M */
181 	if ((PRR_PRODUCT_V3M) != (reg & PRR_PRODUCT_MASK)) {
182 		PRR_PRODUCT_ERR(reg);
183 	}
184 	pfc_init_v3m();
185 #elif RCAR_LSI == RCAR_E3	/* E3 */
186 	if ((PRR_PRODUCT_E3) != (reg & PRR_PRODUCT_MASK)) {
187 		PRR_PRODUCT_ERR(reg);
188 	}
189 	pfc_init_e3();
190 #elif RCAR_LSI == RCAR_D3	/* D3 */
191 	if ((PRR_PRODUCT_D3) != (reg & PRR_PRODUCT_MASK)) {
192 		PRR_PRODUCT_ERR(reg);
193 	}
194 	pfc_init_d3();
195 #else
196 #error "Don't have PFC initialize routine(unknown)."
197 #endif
198 #endif
199 }
200