1 /*
2  * Copyright (c) 2019-2023, Intel Corporation. All rights reserved.
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
7 #include <assert.h>
8 #include <errno.h>
9 #include <common/debug.h>
10 #include <drivers/delay_timer.h>
11 #include <lib/mmio.h>
12 #include <platform_def.h>
13 
14 #include "socfpga_f2sdram_manager.h"
15 #include "socfpga_mailbox.h"
16 #include "socfpga_plat_def.h"
17 #include "socfpga_reset_manager.h"
18 #include "socfpga_system_manager.h"
19 
deassert_peripheral_reset(void)20 void deassert_peripheral_reset(void)
21 {
22 	mmio_clrbits_32(SOCFPGA_RSTMGR(PER1MODRST),
23 			RSTMGR_FIELD(PER1, WATCHDOG0) |
24 			RSTMGR_FIELD(PER1, WATCHDOG1) |
25 			RSTMGR_FIELD(PER1, WATCHDOG2) |
26 			RSTMGR_FIELD(PER1, WATCHDOG3) |
27 			RSTMGR_FIELD(PER1, WATCHDOG4) |
28 			RSTMGR_FIELD(PER1, L4SYSTIMER0) |
29 			RSTMGR_FIELD(PER1, L4SYSTIMER1) |
30 			RSTMGR_FIELD(PER1, SPTIMER0) |
31 			RSTMGR_FIELD(PER1, SPTIMER1) |
32 			RSTMGR_FIELD(PER1, I2C0) |
33 			RSTMGR_FIELD(PER1, I2C1) |
34 			RSTMGR_FIELD(PER1, I2C2) |
35 			RSTMGR_FIELD(PER1, I2C3) |
36 			RSTMGR_FIELD(PER1, I2C4) |
37 			RSTMGR_FIELD(PER1, I3C0) |
38 			RSTMGR_FIELD(PER1, I3C1) |
39 			RSTMGR_FIELD(PER1, UART0) |
40 			RSTMGR_FIELD(PER1, UART1) |
41 			RSTMGR_FIELD(PER1, GPIO0) |
42 			RSTMGR_FIELD(PER1, GPIO1));
43 
44 	mmio_clrbits_32(SOCFPGA_RSTMGR(PER0MODRST),
45 			RSTMGR_FIELD(PER0, SOFTPHY) |
46 			RSTMGR_FIELD(PER0, EMAC0OCP) |
47 			RSTMGR_FIELD(PER0, EMAC1OCP) |
48 			RSTMGR_FIELD(PER0, EMAC2OCP) |
49 			RSTMGR_FIELD(PER0, USB0OCP) |
50 			RSTMGR_FIELD(PER0, USB1OCP) |
51 			RSTMGR_FIELD(PER0, NANDOCP) |
52 			RSTMGR_FIELD(PER0, SDMMCOCP) |
53 			RSTMGR_FIELD(PER0, DMAOCP));
54 
55 	mmio_clrbits_32(SOCFPGA_RSTMGR(PER0MODRST),
56 			RSTMGR_FIELD(PER0, EMAC0) |
57 			RSTMGR_FIELD(PER0, EMAC1) |
58 			RSTMGR_FIELD(PER0, EMAC2) |
59 			RSTMGR_FIELD(PER0, USB0) |
60 			RSTMGR_FIELD(PER0, USB1) |
61 			RSTMGR_FIELD(PER0, NAND) |
62 			RSTMGR_FIELD(PER0, SDMMC) |
63 			RSTMGR_FIELD(PER0, DMA) |
64 			RSTMGR_FIELD(PER0, SPIM0) |
65 			RSTMGR_FIELD(PER0, SPIM1) |
66 			RSTMGR_FIELD(PER0, SPIS0) |
67 			RSTMGR_FIELD(PER0, SPIS1) |
68 			RSTMGR_FIELD(PER0, EMACPTP) |
69 			RSTMGR_FIELD(PER0, DMAIF0) |
70 			RSTMGR_FIELD(PER0, DMAIF1) |
71 			RSTMGR_FIELD(PER0, DMAIF2) |
72 			RSTMGR_FIELD(PER0, DMAIF3) |
73 			RSTMGR_FIELD(PER0, DMAIF4) |
74 			RSTMGR_FIELD(PER0, DMAIF5) |
75 			RSTMGR_FIELD(PER0, DMAIF6) |
76 			RSTMGR_FIELD(PER0, DMAIF7));
77 
78 #if PLATFORM_MODEL == PLAT_SOCFPGA_AGILEX
79 	mmio_clrbits_32(SOCFPGA_RSTMGR(BRGMODRST),
80 			RSTMGR_FIELD(BRG, MPFE));
81 #endif
82 }
83 
config_hps_hs_before_warm_reset(void)84 void config_hps_hs_before_warm_reset(void)
85 {
86 	uint32_t or_mask = 0;
87 
88 	or_mask |= RSTMGR_HDSKEN_EMIF_FLUSH;
89 	or_mask |= RSTMGR_HDSKEN_FPGAHSEN;
90 	or_mask |= RSTMGR_HDSKEN_ETRSTALLEN;
91 	or_mask |= RSTMGR_HDSKEN_LWS2F_FLUSH;
92 	or_mask |= RSTMGR_HDSKEN_L3NOC_DBG;
93 	or_mask |= RSTMGR_HDSKEN_DEBUG_L3NOC;
94 
95 	mmio_setbits_32(SOCFPGA_RSTMGR(HDSKEN), or_mask);
96 }
97 
poll_idle_status(uint32_t addr,uint32_t mask,uint32_t match,uint32_t delay_ms)98 static int poll_idle_status(uint32_t addr, uint32_t mask, uint32_t match, uint32_t delay_ms)
99 {
100 	int time_out = delay_ms;
101 
102 	while (time_out-- > 0) {
103 
104 		if ((mmio_read_32(addr) & mask) == match) {
105 			return 0;
106 		}
107 		udelay(1000);
108 	}
109 	return -ETIMEDOUT;
110 }
111 
112 #if PLATFORM_MODEL == PLAT_SOCFPGA_AGILEX5
poll_idle_status_by_counter(uint32_t addr,uint32_t mask,uint32_t match,uint32_t delay_ms)113 static int poll_idle_status_by_counter(uint32_t addr, uint32_t mask,
114 					uint32_t match, uint32_t delay_ms)
115 {
116 	int time_out = delay_ms;
117 
118 	while (time_out-- > 0) {
119 
120 		if ((mmio_read_32(addr) & mask) == match) {
121 			return 0;
122 		}
123 
124 		/* ToDo: Shall use udelay for product release */
125 		for (int i = 0; i < 2000; i++) {
126 			/* dummy delay */
127 		}
128 	}
129 	return -ETIMEDOUT;
130 }
131 #endif
132 
poll_idle_status_by_clkcycles(uint32_t addr,uint32_t mask,uint32_t match,uint32_t delay_clk_cycles)133 static int poll_idle_status_by_clkcycles(uint32_t addr, uint32_t mask,
134 					 uint32_t match, uint32_t delay_clk_cycles)
135 {
136 	int time_out = delay_clk_cycles;
137 
138 	while (time_out-- > 0) {
139 
140 		if ((mmio_read_32(addr) & mask) == match) {
141 			return 0;
142 		}
143 		udelay(1);
144 	}
145 	return -ETIMEDOUT;
146 }
147 
socfpga_s2f_bridge_mask(uint32_t mask,uint32_t * brg_mask,uint32_t * noc_mask)148 static void socfpga_s2f_bridge_mask(uint32_t mask,
149 				    uint32_t *brg_mask,
150 				    uint32_t *noc_mask)
151 {
152 	*brg_mask = 0;
153 	*noc_mask = 0;
154 
155 	if ((mask & SOC2FPGA_MASK) != 0U) {
156 		*brg_mask |= RSTMGR_FIELD(BRG, SOC2FPGA);
157 		*noc_mask |= IDLE_DATA_SOC2FPGA;
158 	}
159 
160 	if ((mask & LWHPS2FPGA_MASK) != 0U) {
161 		*brg_mask |= RSTMGR_FIELD(BRG, LWHPS2FPGA);
162 		*noc_mask |= IDLE_DATA_LWSOC2FPGA;
163 	}
164 }
165 
socfpga_f2s_bridge_mask(uint32_t mask,uint32_t * brg_mask,uint32_t * f2s_idlereq,uint32_t * f2s_force_drain,uint32_t * f2s_en,uint32_t * f2s_idleack,uint32_t * f2s_respempty,uint32_t * f2s_cmdidle)166 static void socfpga_f2s_bridge_mask(uint32_t mask,
167 				    uint32_t *brg_mask,
168 				    uint32_t *f2s_idlereq,
169 				    uint32_t *f2s_force_drain,
170 				    uint32_t *f2s_en,
171 				    uint32_t *f2s_idleack,
172 				    uint32_t *f2s_respempty,
173 				    uint32_t *f2s_cmdidle)
174 {
175 	*brg_mask = 0;
176 	*f2s_idlereq = 0;
177 	*f2s_force_drain = 0;
178 	*f2s_en = 0;
179 	*f2s_idleack = 0;
180 	*f2s_respempty = 0;
181 	*f2s_cmdidle = 0;
182 
183 #if PLATFORM_MODEL == PLAT_SOCFPGA_STRATIX10
184 	if ((mask & FPGA2SOC_MASK) != 0U) {
185 		*brg_mask |= RSTMGR_FIELD(BRG, FPGA2SOC);
186 	}
187 	if ((mask & F2SDRAM0_MASK) != 0U) {
188 		*brg_mask |= RSTMGR_FIELD(BRG, F2SSDRAM0);
189 		*f2s_idlereq |= FLAGOUTSETCLR_F2SDRAM0_IDLEREQ;
190 		*f2s_force_drain |= FLAGOUTSETCLR_F2SDRAM0_FORCE_DRAIN;
191 		*f2s_en |= FLAGOUTSETCLR_F2SDRAM0_ENABLE;
192 		*f2s_idleack |= FLAGINSTATUS_F2SDRAM0_IDLEACK;
193 		*f2s_respempty |= FLAGINSTATUS_F2SDRAM0_RESPEMPTY;
194 		*f2s_cmdidle |= FLAGINSTATUS_F2SDRAM0_CMDIDLE;
195 	}
196 	if ((mask & F2SDRAM1_MASK) != 0U) {
197 		*brg_mask |= RSTMGR_FIELD(BRG, F2SSDRAM1);
198 		*f2s_idlereq |= FLAGOUTSETCLR_F2SDRAM1_IDLEREQ;
199 		*f2s_force_drain |= FLAGOUTSETCLR_F2SDRAM1_FORCE_DRAIN;
200 		*f2s_en |= FLAGOUTSETCLR_F2SDRAM1_ENABLE;
201 		*f2s_idleack |= FLAGINSTATUS_F2SDRAM1_IDLEACK;
202 		*f2s_respempty |= FLAGINSTATUS_F2SDRAM1_RESPEMPTY;
203 		*f2s_cmdidle |= FLAGINSTATUS_F2SDRAM1_CMDIDLE;
204 	}
205 	if ((mask & F2SDRAM2_MASK) != 0U) {
206 		*brg_mask |= RSTMGR_FIELD(BRG, F2SSDRAM2);
207 		*f2s_idlereq |= FLAGOUTSETCLR_F2SDRAM2_IDLEREQ;
208 		*f2s_force_drain |= FLAGOUTSETCLR_F2SDRAM2_FORCE_DRAIN;
209 		*f2s_en |= FLAGOUTSETCLR_F2SDRAM2_ENABLE;
210 		*f2s_idleack |= FLAGINSTATUS_F2SDRAM2_IDLEACK;
211 		*f2s_respempty |= FLAGINSTATUS_F2SDRAM2_RESPEMPTY;
212 		*f2s_cmdidle |= FLAGINSTATUS_F2SDRAM2_CMDIDLE;
213 	}
214 #elif PLATFORM_MODEL == PLAT_SOCFPGA_AGILEX5
215 	if (mask & FPGA2SOC_MASK) {
216 		*brg_mask |= RSTMGR_FIELD(BRG, FPGA2SOC);
217 		*f2s_idlereq |= FLAGOUTSETCLR_F2SDRAM0_IDLEREQ;
218 		*f2s_force_drain |= FLAGOUTSETCLR_F2SDRAM0_FORCE_DRAIN;
219 		*f2s_en |= FLAGOUTSETCLR_F2SDRAM0_ENABLE;
220 		*f2s_idleack |= FLAGINSTATUS_F2SDRAM0_IDLEACK;
221 		*f2s_respempty |= FLAGINSTATUS_F2SDRAM0_RESPEMPTY;
222 	}
223 	if (mask & F2SDRAM0_MASK) {
224 		*brg_mask |= RSTMGR_FIELD(BRG, F2SSDRAM0);
225 		*f2s_idlereq |= FLAGOUTSETCLR_F2SDRAM0_IDLEREQ;
226 		*f2s_force_drain |= FLAGOUTSETCLR_F2SDRAM0_FORCE_DRAIN;
227 		*f2s_en |= FLAGOUTSETCLR_F2SDRAM0_ENABLE;
228 		*f2s_idleack |= FLAGINSTATUS_F2SDRAM0_IDLEACK;
229 		*f2s_respempty |= FLAGINSTATUS_F2SDRAM0_RESPEMPTY;
230 	}
231 	if (mask & F2SDRAM1_MASK) {
232 		*brg_mask |= RSTMGR_FIELD(BRG, F2SSDRAM1);
233 		*f2s_idlereq |= FLAGOUTSETCLR_F2SDRAM1_IDLEREQ;
234 		*f2s_force_drain |= FLAGOUTSETCLR_F2SDRAM1_FORCE_DRAIN;
235 		*f2s_en |= FLAGOUTSETCLR_F2SDRAM1_ENABLE;
236 		*f2s_idleack |= FLAGINSTATUS_F2SDRAM1_IDLEACK;
237 		*f2s_respempty |= FLAGINSTATUS_F2SDRAM1_RESPEMPTY;
238 	}
239 	if (mask & F2SDRAM2_MASK) {
240 		*brg_mask |= RSTMGR_FIELD(BRG, F2SSDRAM2);
241 		*f2s_idlereq |= FLAGOUTSETCLR_F2SDRAM2_IDLEREQ;
242 		*f2s_force_drain |= FLAGOUTSETCLR_F2SDRAM2_FORCE_DRAIN;
243 		*f2s_en |= FLAGOUTSETCLR_F2SDRAM2_ENABLE;
244 		*f2s_idleack |= FLAGINSTATUS_F2SDRAM2_IDLEACK;
245 		*f2s_respempty |= FLAGINSTATUS_F2SDRAM2_RESPEMPTY;
246 	}
247 #else
248 	if ((mask & FPGA2SOC_MASK) != 0U) {
249 		*brg_mask |= RSTMGR_FIELD(BRG, FPGA2SOC);
250 		*f2s_idlereq |= FLAGOUTSETCLR_F2SDRAM0_IDLEREQ;
251 		*f2s_force_drain |= FLAGOUTSETCLR_F2SDRAM0_FORCE_DRAIN;
252 		*f2s_en |= FLAGOUTSETCLR_F2SDRAM0_ENABLE;
253 		*f2s_idleack |= FLAGINSTATUS_F2SDRAM0_IDLEACK;
254 		*f2s_respempty |= FLAGINSTATUS_F2SDRAM0_RESPEMPTY;
255 		*f2s_cmdidle |= FLAGINSTATUS_F2SDRAM0_CMDIDLE;
256 	}
257 #endif
258 }
259 
socfpga_bridges_reset(uint32_t mask)260 int socfpga_bridges_reset(uint32_t mask)
261 {
262 	int ret = 0;
263 	int timeout = 300;
264 	uint32_t brg_mask = 0;
265 	uint32_t noc_mask = 0;
266 	uint32_t f2s_idlereq = 0;
267 	uint32_t f2s_force_drain = 0;
268 	uint32_t f2s_en = 0;
269 	uint32_t f2s_idleack = 0;
270 	uint32_t f2s_respempty = 0;
271 	uint32_t f2s_cmdidle = 0;
272 
273 	/* Reset s2f bridge */
274 	socfpga_s2f_bridge_mask(mask, &brg_mask, &noc_mask);
275 	if (brg_mask) {
276 		if (mask & SOC2FPGA_MASK) {
277 			/* Request handshake with SOC2FPGA bridge to clear traffic */
278 			mmio_setbits_32(SOCFPGA_RSTMGR(HDSKREQ),
279 					RSTMGR_HDSKREQ_S2F_FLUSH);
280 
281 			/* Wait for bridge to idle status */
282 			ret = poll_idle_status(SOCFPGA_RSTMGR(HDSKACK),
283 					RSTMGR_HDSKACK_S2F_FLUSH,
284 					RSTMGR_HDSKACK_S2F_FLUSH, 300);
285 		}
286 
287 		if (mask & LWHPS2FPGA_MASK) {
288 			/* Request handshake with LWSOC2FPGA bridge to clear traffic */
289 			mmio_setbits_32(SOCFPGA_RSTMGR(HDSKREQ),
290 					RSTMGR_HDSKREQ_LWS2F_FLUSH);
291 
292 			/* Wait for bridge to idle status */
293 			ret = poll_idle_status(SOCFPGA_RSTMGR(HDSKACK),
294 					RSTMGR_HDSKACK_LWS2F_FLUSH,
295 					RSTMGR_HDSKACK_LWS2F_FLUSH, 300);
296 		}
297 
298 		if (ret < 0) {
299 			ERROR("S2F Bridge reset: Timeout waiting for idle ack\n");
300 			assert(false);
301 		}
302 
303 		/* Assert reset to bridge */
304 		mmio_setbits_32(SOCFPGA_RSTMGR(BRGMODRST),
305 				brg_mask);
306 
307 		/* Clear idle requests to bridge */
308 		if (mask & SOC2FPGA_MASK) {
309 			mmio_clrbits_32(SOCFPGA_RSTMGR(HDSKREQ),
310 					RSTMGR_HDSKREQ_S2F_FLUSH);
311 		}
312 
313 		if (mask & LWHPS2FPGA_MASK) {
314 			mmio_clrbits_32(SOCFPGA_RSTMGR(HDSKREQ),
315 					RSTMGR_HDSKREQ_LWS2F_FLUSH);
316 		}
317 
318 		/* When FPGA reconfig is complete */
319 		mmio_clrbits_32(SOCFPGA_RSTMGR(BRGMODRST), brg_mask);
320 	}
321 
322 	/* Reset f2s bridge */
323 	socfpga_f2s_bridge_mask(mask, &brg_mask, &f2s_idlereq,
324 					&f2s_force_drain, &f2s_en,
325 					&f2s_idleack, &f2s_respempty,
326 					&f2s_cmdidle);
327 
328 	if (brg_mask) {
329 		mmio_setbits_32(SOCFPGA_RSTMGR(HDSKEN),
330 				RSTMGR_HDSKEN_FPGAHSEN);
331 
332 		mmio_setbits_32(SOCFPGA_RSTMGR(HDSKREQ),
333 				RSTMGR_HDSKREQ_FPGAHSREQ);
334 
335 		ret = poll_idle_status(SOCFPGA_RSTMGR(HDSKACK),
336 				RSTMGR_HDSKACK_FPGAHSREQ,
337 				RSTMGR_HDSKACK_FPGAHSREQ, 300);
338 
339 		if (ret < 0) {
340 			ERROR("F2S Bridge disable: Timeout waiting for idle req\n");
341 			assert(false);
342 		}
343 
344 		/* Disable f2s bridge */
345 		mmio_clrbits_32(SOCFPGA_F2SDRAMMGR(SIDEBANDMGR_FLAGOUTSET0),
346 				f2s_en);
347 		udelay(5);
348 
349 		mmio_setbits_32(SOCFPGA_F2SDRAMMGR(SIDEBANDMGR_FLAGOUTSET0),
350 				f2s_force_drain);
351 		udelay(5);
352 
353 		do {
354 			/* Read response queue status to ensure it is empty */
355 			uint32_t idle_status;
356 
357 			idle_status = mmio_read_32(SOCFPGA_F2SDRAMMGR(
358 				SIDEBANDMGR_FLAGINSTATUS0));
359 			if (idle_status & f2s_respempty) {
360 				idle_status = mmio_read_32(SOCFPGA_F2SDRAMMGR(
361 					SIDEBANDMGR_FLAGINSTATUS0));
362 				if (idle_status & f2s_respempty) {
363 					break;
364 				}
365 			}
366 			udelay(1000);
367 		} while (timeout-- > 0);
368 
369 		/* Assert reset to f2s bridge */
370 		mmio_setbits_32(SOCFPGA_RSTMGR(BRGMODRST),
371 				brg_mask);
372 
373 		/* Clear idle request to FPGA */
374 		mmio_clrbits_32(SOCFPGA_RSTMGR(HDSKREQ),
375 				RSTMGR_HDSKREQ_FPGAHSREQ);
376 
377 		/* Clear idle request to MPFE */
378 		mmio_setbits_32(SOCFPGA_F2SDRAMMGR(SIDEBANDMGR_FLAGOUTCLR0),
379 				f2s_idlereq);
380 
381 		/* When FPGA reconfig is complete */
382 		mmio_clrbits_32(SOCFPGA_RSTMGR(BRGMODRST), brg_mask);
383 
384 		/* Enable f2s bridge */
385 		mmio_clrbits_32(SOCFPGA_F2SDRAMMGR(SIDEBANDMGR_FLAGOUTSET0),
386 			f2s_idlereq);
387 
388 		ret = poll_idle_status(SOCFPGA_F2SDRAMMGR(
389 			SIDEBANDMGR_FLAGINSTATUS0), f2s_idleack, 0, 300);
390 		if (ret < 0) {
391 			ERROR("F2S bridge enable: Timeout waiting for idle ack");
392 			assert(false);
393 		}
394 
395 		mmio_clrbits_32(SOCFPGA_F2SDRAMMGR(SIDEBANDMGR_FLAGOUTSET0),
396 			f2s_force_drain);
397 		udelay(5);
398 
399 		mmio_setbits_32(SOCFPGA_F2SDRAMMGR(SIDEBANDMGR_FLAGOUTSET0),
400 			f2s_en);
401 		udelay(5);
402 	}
403 
404 	return ret;
405 }
406 
socfpga_bridges_enable(uint32_t mask)407 int socfpga_bridges_enable(uint32_t mask)
408 {
409 	int ret = 0;
410 	uint32_t brg_mask = 0;
411 	uint32_t noc_mask = 0;
412 	uint32_t f2s_idlereq = 0;
413 	uint32_t f2s_force_drain = 0;
414 	uint32_t f2s_en = 0;
415 	uint32_t f2s_idleack = 0;
416 	uint32_t f2s_respempty = 0;
417 	uint32_t f2s_cmdidle = 0;
418 #if PLATFORM_MODEL == PLAT_SOCFPGA_AGILEX5
419 	uint32_t delay = 0;
420 #endif
421 
422 	/* Enable s2f bridge */
423 	socfpga_s2f_bridge_mask(mask, &brg_mask, &noc_mask);
424 #if PLATFORM_MODEL == PLAT_SOCFPGA_AGILEX5
425 	/* Enable SOC2FPGA bridge */
426 	if (brg_mask & RSTMGR_BRGMODRSTMASK_SOC2FPGA) {
427 		/* Write Reset Manager hdskreq[soc2fpga_flush_req] = 1 */
428 		NOTICE("Set S2F hdskreq ...\n");
429 		mmio_setbits_32(SOCFPGA_RSTMGR(HDSKREQ),
430 			RSTMGR_HDSKREQ_SOC2FPGAREQ);
431 
432 		/* Read Reset Manager hdskack[soc2fpga] = 1 */
433 		ret = poll_idle_status_by_counter(SOCFPGA_RSTMGR(HDSKACK),
434 			RSTMGR_HDSKACK_SOC2FPGAACK, RSTMGR_HDSKACK_SOC2FPGAACK,
435 			300);
436 
437 		if (ret < 0) {
438 			ERROR("S2F bridge enable: Timeout hdskack\n");
439 		}
440 
441 		/* Write Reset Manager hdskreq[soc2fpga_flush_req] = 0 */
442 		NOTICE("Clear S2F hdskreq ...\n");
443 		mmio_clrbits_32(SOCFPGA_RSTMGR(HDSKREQ),
444 			RSTMGR_HDSKREQ_SOC2FPGAREQ);
445 
446 		/* Write Reset Manager brgmodrst[soc2fpga] = 1 */
447 		NOTICE("Assert S2F ...\n");
448 		mmio_setbits_32(SOCFPGA_RSTMGR(BRGMODRST),
449 			RSTMGR_BRGMODRST_SOC2FPGA);
450 
451 		/* ToDo: Shall use udelay for product release */
452 		for (delay = 0; delay < 1000; delay++) {
453 			/* dummy delay */
454 		}
455 
456 		/* Write Reset Manager brgmodrst[soc2fpga] = 0 */
457 		NOTICE("Deassert S2F ...\n");
458 		mmio_clrbits_32(SOCFPGA_RSTMGR(BRGMODRST),
459 			RSTMGR_BRGMODRST_SOC2FPGA);
460 	}
461 
462 	/* Enable LWSOC2FPGA bridge */
463 	if (brg_mask & RSTMGR_BRGMODRSTMASK_LWHPS2FPGA) {
464 		/* Write Reset Manager hdskreq[lwsoc2fpga_flush_req] = 1 */
465 		NOTICE("Set LWS2F hdskreq ...\n");
466 		mmio_setbits_32(SOCFPGA_RSTMGR(HDSKREQ),
467 			RSTMGR_HDSKREQ_LWSOC2FPGAREQ);
468 
469 		/* Read Reset Manager hdskack[lwsoc2fpga] = 1 */
470 		ret = poll_idle_status_by_counter(SOCFPGA_RSTMGR(HDSKACK),
471 			RSTMGR_HDSKACK_LWSOC2FPGAACK, RSTMGR_HDSKACK_LWSOC2FPGAACK,
472 			300);
473 
474 		if (ret < 0) {
475 			ERROR("LWS2F bridge enable: Timeout hdskack\n");
476 		}
477 
478 		/* Write Reset Manager hdskreq[lwsoc2fpga_flush_req] = 0 */
479 		NOTICE("Clear LWS2F hdskreq ...\n");
480 		mmio_clrbits_32(SOCFPGA_RSTMGR(HDSKREQ),
481 			RSTMGR_HDSKREQ_LWSOC2FPGAREQ);
482 
483 		/* Write Reset Manager brgmodrst[lwsoc2fpga] = 1 */
484 		NOTICE("Assert LWS2F ...\n");
485 		mmio_setbits_32(SOCFPGA_RSTMGR(BRGMODRST),
486 			RSTMGR_BRGMODRST_LWHPS2FPGA);
487 
488 		/* ToDo: Shall use udelay for product release */
489 		for (delay = 0; delay < 1000; delay++) {
490 			/* dummy delay */
491 		}
492 
493 		/* Write Reset Manager brgmodrst[lwsoc2fpga] = 0 */
494 		NOTICE("Deassert LWS2F ...\n");
495 		mmio_clrbits_32(SOCFPGA_RSTMGR(BRGMODRST),
496 			RSTMGR_BRGMODRST_LWHPS2FPGA);
497 	}
498 #else
499 	if (brg_mask != 0U) {
500 		/* Clear idle request */
501 		mmio_setbits_32(SOCFPGA_SYSMGR(NOC_IDLEREQ_CLR),
502 				noc_mask);
503 
504 		/* De-assert all bridges */
505 		mmio_clrbits_32(SOCFPGA_RSTMGR(BRGMODRST), brg_mask);
506 
507 		/* Wait until idle ack becomes 0 */
508 		ret = poll_idle_status(SOCFPGA_SYSMGR(NOC_IDLEACK),
509 				       noc_mask, 0, 300);
510 		if (ret < 0) {
511 			ERROR("S2F bridge enable: Timeout idle ack\n");
512 		}
513 	}
514 #endif
515 
516 	/* Enable f2s bridge */
517 	socfpga_f2s_bridge_mask(mask, &brg_mask, &f2s_idlereq,
518 				&f2s_force_drain, &f2s_en,
519 				&f2s_idleack, &f2s_respempty, &f2s_cmdidle);
520 #if PLATFORM_MODEL == PLAT_SOCFPGA_AGILEX5
521 	/* Enable FPGA2SOC bridge */
522 	if (brg_mask & RSTMGR_BRGMODRSTMASK_FPGA2SOC) {
523 		/* Write Reset Manager hdsken[fpgahsen] = 1 */
524 		NOTICE("Set FPGA hdsken(fpgahsen) ...\n");
525 		mmio_setbits_32(SOCFPGA_RSTMGR(HDSKEN), RSTMGR_HDSKEN_FPGAHSEN);
526 
527 		/* Write Reset Manager hdskreq[fpgahsreq] = 1 */
528 		NOTICE("Set FPGA hdskreq(fpgahsreq) ...\n");
529 		mmio_setbits_32(SOCFPGA_RSTMGR(HDSKREQ), RSTMGR_HDSKREQ_FPGAHSREQ);
530 
531 		/* Read Reset Manager hdskack[fpgahsack] = 1 */
532 		NOTICE("Get FPGA hdskack(fpgahsack) ...\n");
533 		ret = poll_idle_status_by_counter(SOCFPGA_RSTMGR(HDSKACK),
534 			RSTMGR_HDSKACK_FPGAHSACK, RSTMGR_HDSKACK_FPGAHSACK,
535 			300);
536 
537 		if (ret < 0) {
538 			ERROR("FPGA bridge fpga handshake fpgahsreq: Timeout\n");
539 		}
540 
541 		/* Write Reset Manager hdskreq[f2s_flush_req] = 1 */
542 		NOTICE("Set F2S hdskreq(f2s_flush_req) ...\n");
543 		mmio_setbits_32(SOCFPGA_RSTMGR(HDSKREQ),
544 			RSTMGR_HDSKREQ_FPGA2SOCREQ);
545 
546 		/* Read Reset Manager hdskack[f2s_flush_ack] = 1 */
547 		NOTICE("Get F2S hdskack(f2s_flush_ack) ...\n");
548 		ret = poll_idle_status_by_counter(SOCFPGA_RSTMGR(HDSKACK),
549 			RSTMGR_HDSKACK_FPGA2SOCACK, RSTMGR_HDSKACK_FPGA2SOCACK,
550 			300);
551 
552 		if (ret < 0) {
553 			ERROR("F2S bridge fpga handshake f2sdram_flush_req: Timeout\n");
554 		}
555 
556 		/* Write Reset Manager hdskreq[fpgahsreq] = 1 */
557 		NOTICE("Clear FPGA hdskreq(fpgahsreq) ...\n");
558 		mmio_clrbits_32(SOCFPGA_RSTMGR(HDSKREQ), RSTMGR_HDSKREQ_FPGAHSREQ);
559 
560 		/* Write Reset Manager hdskreq[f2s_flush_req] = 1 */
561 		NOTICE("Clear F2S hdskreq(f2s_flush_req) ...\n");
562 		mmio_clrbits_32(SOCFPGA_RSTMGR(HDSKREQ),
563 			RSTMGR_HDSKREQ_FPGA2SOCREQ);
564 
565 		/* Read Reset Manager hdskack[f2s_flush_ack] = 0 */
566 		NOTICE("Get F2SDRAM hdskack(f2s_flush_ack) ...\n");
567 		ret = poll_idle_status_by_counter(SOCFPGA_RSTMGR(HDSKACK),
568 			RSTMGR_HDSKACK_FPGA2SOCACK, RSTMGR_HDSKACK_FPGA2SOCACK_DASRT,
569 			300);
570 
571 		if (ret < 0) {
572 			ERROR("F2S bridge fpga handshake f2s_flush_ack: Timeout\n");
573 		}
574 
575 		/* Read Reset Manager hdskack[fpgahsack] = 0 */
576 		NOTICE("Get FPGA hdskack(fpgahsack) ...\n");
577 		ret = poll_idle_status_by_counter(SOCFPGA_RSTMGR(HDSKACK),
578 			RSTMGR_HDSKACK_FPGAHSACK, RSTMGR_HDSKACK_FPGAHSACK_DASRT,
579 			300);
580 
581 		if (ret < 0) {
582 			ERROR("F2S bridge fpga handshake fpgahsack: Timeout\n");
583 		}
584 
585 		/* Write Reset Manager brgmodrst[fpga2soc] = 1 */
586 		NOTICE("Assert F2S ...\n");
587 		mmio_setbits_32(SOCFPGA_RSTMGR(BRGMODRST), RSTMGR_BRGMODRST_FPGA2SOC);
588 
589 		/* ToDo: Shall use udelay for product release */
590 		for (delay = 0; delay < 1000; delay++) {
591 			/* dummy delay */
592 		}
593 
594 		/* Write Reset Manager brgmodrst[fpga2soc] = 0 */
595 		NOTICE("Deassert F2S ...\n");
596 		mmio_clrbits_32(SOCFPGA_RSTMGR(BRGMODRST), RSTMGR_BRGMODRST_FPGA2SOC);
597 
598 		/* Write System Manager f2s bridge control register[f2soc_enable] = 1 */
599 		NOTICE("Deassert F2S f2soc_enable ...\n");
600 		mmio_setbits_32(SOCFPGA_SYSMGR(F2S_BRIDGE_CTRL),
601 			SYSMGR_F2S_BRIDGE_CTRL_EN);
602 	}
603 
604 	/* Enable FPGA2SDRAM bridge */
605 	if (brg_mask & RSTMGR_BRGMODRSTMASK_F2SDRAM0) {
606 		/* Write Reset Manager hdsken[fpgahsen] = 1 */
607 		NOTICE("Set F2SDRAM hdsken(fpgahsen) ...\n");
608 		mmio_setbits_32(SOCFPGA_RSTMGR(HDSKEN), RSTMGR_HDSKEN_FPGAHSEN);
609 
610 		/* Write Reset Manager hdskreq[fpgahsreq] = 1 */
611 		NOTICE("Set F2SDRAM hdskreq(fpgahsreq) ...\n");
612 		mmio_setbits_32(SOCFPGA_RSTMGR(HDSKREQ), RSTMGR_HDSKREQ_FPGAHSREQ);
613 
614 		/* Read Reset Manager hdskack[fpgahsack] = 1 */
615 		NOTICE("Get F2SDRAM hdskack(fpgahsack) ...\n");
616 		ret = poll_idle_status_by_counter(SOCFPGA_RSTMGR(HDSKACK),
617 			RSTMGR_HDSKACK_FPGAHSACK, RSTMGR_HDSKACK_FPGAHSACK,
618 			300);
619 
620 		if (ret < 0) {
621 			ERROR("F2SDRAM bridge fpga handshake fpgahsreq: Timeout\n");
622 		}
623 
624 		/* Write Reset Manager hdskreq[f2sdram_flush_req] = 1 */
625 		NOTICE("Set F2SDRAM hdskreq(f2sdram_flush_req) ...\n");
626 		mmio_setbits_32(SOCFPGA_RSTMGR(HDSKREQ),
627 			RSTMGR_HDSKREQ_F2SDRAM0REQ);
628 
629 		/* Read Reset Manager hdskack[f2sdram_flush_ack] = 1 */
630 		NOTICE("Get F2SDRAM hdskack(f2sdram_flush_ack) ...\n");
631 		ret = poll_idle_status_by_counter(SOCFPGA_RSTMGR(HDSKACK),
632 			RSTMGR_HDSKACK_F2SDRAM0ACK, RSTMGR_HDSKACK_F2SDRAM0ACK,
633 			300);
634 
635 		if (ret < 0) {
636 			ERROR("F2SDRAM bridge fpga handshake f2sdram_flush_req: Timeout\n");
637 		}
638 
639 		/* Write Reset Manager hdskreq[fpgahsreq] = 1 */
640 		NOTICE("Clear F2SDRAM hdskreq(fpgahsreq) ...\n");
641 		mmio_clrbits_32(SOCFPGA_RSTMGR(HDSKREQ), RSTMGR_HDSKREQ_FPGAHSREQ);
642 
643 		/* Write Reset Manager hdskreq[f2sdram_flush_req] = 1 */
644 		NOTICE("Clear F2SDRAM hdskreq(f2sdram_flush_req) ...\n");
645 		mmio_clrbits_32(SOCFPGA_RSTMGR(HDSKREQ), RSTMGR_HDSKREQ_F2SDRAM0REQ);
646 
647 		/* Read Reset Manager hdskack[f2sdram_flush_ack] = 0 */
648 		NOTICE("Get F2SDRAM hdskack(f2sdram_flush_ack) ...\n");
649 		ret = poll_idle_status_by_counter(SOCFPGA_RSTMGR(HDSKACK),
650 			RSTMGR_HDSKACK_F2SDRAM0ACK, RSTMGR_HDSKACK_F2SDRAM0ACK_DASRT,
651 			300);
652 
653 		if (ret < 0) {
654 			ERROR("F2SDRAM bridge fpga handshake f2sdram_flush_ack: Timeout\n");
655 		}
656 
657 		/* Read Reset Manager hdskack[fpgahsack] = 0 */
658 		NOTICE("Get F2SDRAM hdskack(fpgahsack) ...\n");
659 		ret = poll_idle_status_by_counter(SOCFPGA_RSTMGR(HDSKACK),
660 			RSTMGR_HDSKACK_FPGAHSACK, RSTMGR_HDSKACK_FPGAHSACK_DASRT,
661 			300);
662 
663 		if (ret < 0) {
664 			ERROR("F2SDRAM bridge fpga handshake fpgahsack: Timeout\n");
665 		}
666 
667 		/* Write Reset Manager brgmodrst[fpga2sdram] = 1 */
668 		NOTICE("Assert F2SDRAM ...\n");
669 		mmio_setbits_32(SOCFPGA_RSTMGR(BRGMODRST),
670 			RSTMGR_BRGMODRST_F2SSDRAM0);
671 
672 		/* ToDo: Shall use udelay for product release */
673 		for (delay = 0; delay < 1000; delay++) {
674 			/* dummy delay */
675 		}
676 
677 		/* Write Reset Manager brgmodrst[fpga2sdram] = 0 */
678 		NOTICE("Deassert F2SDRAM ...\n");
679 		mmio_clrbits_32(SOCFPGA_RSTMGR(BRGMODRST),
680 			RSTMGR_BRGMODRST_F2SSDRAM0);
681 
682 		/*
683 		 * Clear fpga2sdram_manager_main_SidebandManager_FlagOutClr0
684 		 * f2s_ready_latency_enable
685 		 */
686 		NOTICE("Clear F2SDRAM f2s_ready_latency_enable ...\n");
687 		mmio_setbits_32(SOCFPGA_F2SDRAMMGR(SIDEBANDMGR_FLAGOUTCLR0),
688 			FLAGOUTCLR0_F2SDRAM0_ENABLE);
689 	}
690 #else
691 	if (brg_mask != 0U) {
692 		mmio_clrbits_32(SOCFPGA_RSTMGR(BRGMODRST), brg_mask);
693 
694 		mmio_setbits_32(SOCFPGA_F2SDRAMMGR(SIDEBANDMGR_FLAGOUTCLR0),
695 				f2s_idlereq);
696 
697 		ret = poll_idle_status(SOCFPGA_F2SDRAMMGR(SIDEBANDMGR_FLAGINSTATUS0),
698 				       f2s_idleack, 0, 300);
699 
700 		if (ret < 0) {
701 			ERROR("F2S bridge enable: Timeout idle ack");
702 		}
703 
704 		/* Clear the force drain */
705 		mmio_setbits_32(SOCFPGA_F2SDRAMMGR(SIDEBANDMGR_FLAGOUTCLR0),
706 				f2s_force_drain);
707 		udelay(5);
708 
709 		mmio_setbits_32(SOCFPGA_F2SDRAMMGR(SIDEBANDMGR_FLAGOUTSET0),
710 				f2s_en);
711 		udelay(5);
712 	}
713 #endif
714 	return ret;
715 }
716 
socfpga_bridge_nongraceful_disable(uint32_t mask)717 int socfpga_bridge_nongraceful_disable(uint32_t mask)
718 {
719 	int ret = 0;
720 	int timeout = 1000;
721 	uint32_t brg_mask = 0;
722 	uint32_t f2s_idlereq = 0;
723 	uint32_t f2s_force_drain = 0;
724 	uint32_t f2s_en = 0;
725 	uint32_t f2s_idleack = 0;
726 	uint32_t f2s_respempty = 0;
727 	uint32_t f2s_cmdidle = 0;
728 
729 	socfpga_f2s_bridge_mask(mask, &brg_mask, &f2s_idlereq,
730 				&f2s_force_drain, &f2s_en,
731 				&f2s_idleack, &f2s_respempty, &f2s_cmdidle);
732 
733 	mmio_setbits_32(SOCFPGA_F2SDRAMMGR(SIDEBANDMGR_FLAGOUTSET0),
734 			f2s_idlereq);
735 
736 	/* Time out Error - Bus is still active */
737 	/* Performing a non-graceful shutdown with Force drain */
738 	mmio_setbits_32(SOCFPGA_F2SDRAMMGR(SIDEBANDMGR_FLAGOUTSET0),
739 			f2s_force_drain);
740 
741 	ret = -ETIMEDOUT;
742 	do {
743 		/* Read response queue status to ensure it is empty */
744 		uint32_t idle_status;
745 
746 		idle_status = mmio_read_32(SOCFPGA_F2SDRAMMGR(SIDEBANDMGR_FLAGINSTATUS0));
747 		if ((idle_status & f2s_respempty) != 0U) {
748 			idle_status = mmio_read_32(SOCFPGA_F2SDRAMMGR(SIDEBANDMGR_FLAGINSTATUS0));
749 			if ((idle_status & f2s_respempty) != 0U) {
750 				/* No time-out we are good! */
751 				ret = 0;
752 				break;
753 			}
754 		}
755 
756 		asm("nop");
757 
758 	} while (timeout-- > 0);
759 
760 	return ret;
761 }
762 
socfpga_bridges_disable(uint32_t mask)763 int socfpga_bridges_disable(uint32_t mask)
764 {
765 	int ret = 0;
766 	uint32_t brg_mask = 0;
767 	uint32_t noc_mask = 0;
768 	uint32_t f2s_idlereq = 0;
769 	uint32_t f2s_force_drain = 0;
770 	uint32_t f2s_en = 0;
771 	uint32_t f2s_idleack = 0;
772 	uint32_t f2s_respempty = 0;
773 	uint32_t f2s_cmdidle = 0;
774 
775 	/* Disable s2f bridge */
776 	socfpga_s2f_bridge_mask(mask, &brg_mask, &noc_mask);
777 	if (brg_mask != 0U) {
778 		mmio_setbits_32(SOCFPGA_SYSMGR(NOC_IDLEREQ_SET),
779 				noc_mask);
780 
781 		mmio_write_32(SOCFPGA_SYSMGR(NOC_TIMEOUT), 1);
782 
783 		ret = poll_idle_status(SOCFPGA_SYSMGR(NOC_IDLEACK),
784 				       noc_mask, noc_mask, 300);
785 		if (ret < 0) {
786 			ERROR("S2F Bridge disable: Timeout idle ack\n");
787 		}
788 
789 		ret = poll_idle_status(SOCFPGA_SYSMGR(NOC_IDLESTATUS),
790 				       noc_mask, noc_mask, 300);
791 		if (ret < 0) {
792 			ERROR("S2F Bridge disable: Timeout idle status\n");
793 		}
794 
795 		mmio_setbits_32(SOCFPGA_RSTMGR(BRGMODRST), brg_mask);
796 
797 		mmio_write_32(SOCFPGA_SYSMGR(NOC_TIMEOUT), 0);
798 	}
799 
800 	/* Disable f2s bridge */
801 	socfpga_f2s_bridge_mask(mask, &brg_mask, &f2s_idlereq,
802 				&f2s_force_drain, &f2s_en,
803 				&f2s_idleack, &f2s_respempty, &f2s_cmdidle);
804 	if (brg_mask != 0U) {
805 
806 		if (mmio_read_32(SOCFPGA_RSTMGR(BRGMODRST)) & brg_mask) {
807 			/* Bridge cannot be reset twice */
808 			return 0;
809 		}
810 
811 		/* Starts the fence and drain traffic from F2SDRAM to MPFE */
812 		mmio_setbits_32(SOCFPGA_RSTMGR(HDSKEN),
813 				RSTMGR_HDSKEN_FPGAHSEN);
814 		udelay(5);
815 		/* Ignoring FPGA ACK as it will time-out */
816 		mmio_setbits_32(SOCFPGA_RSTMGR(HDSKREQ),
817 				RSTMGR_HDSKREQ_FPGAHSREQ);
818 
819 		ret = poll_idle_status_by_clkcycles(SOCFPGA_RSTMGR(HDSKACK),
820 						    RSTMGR_HDSKACK_FPGAHSREQ,
821 						    RSTMGR_HDSKACK_FPGAHSREQ, 1000);
822 
823 		/* DISABLE F2S Bridge */
824 		mmio_setbits_32(SOCFPGA_F2SDRAMMGR(SIDEBANDMGR_FLAGOUTCLR0),
825 				f2s_en);
826 		udelay(5);
827 
828 		ret = socfpga_bridge_nongraceful_disable(mask);
829 
830 		/* Bridge reset */
831 #if PLATFORM_MODEL == PLAT_SOCFPGA_STRATIX10
832 		/* Software must never write a 0x1 to FPGA2SOC_MASK bit */
833 		mmio_setbits_32(SOCFPGA_RSTMGR(BRGMODRST),
834 				brg_mask & ~RSTMGR_FIELD(BRG, FPGA2SOC));
835 #else
836 		mmio_setbits_32(SOCFPGA_RSTMGR(BRGMODRST),
837 				brg_mask);
838 #endif
839 		/* Re-enable traffic to SDRAM*/
840 		mmio_clrbits_32(SOCFPGA_RSTMGR(HDSKREQ),
841 				RSTMGR_HDSKREQ_FPGAHSREQ);
842 
843 		mmio_setbits_32(SOCFPGA_F2SDRAMMGR(SIDEBANDMGR_FLAGOUTCLR0),
844 				f2s_idlereq);
845 	}
846 
847 	return ret;
848 }
849 
850 /* CPUxRESETBASELOW */
socfpga_cpu_reset_base(unsigned int cpu_id)851 int socfpga_cpu_reset_base(unsigned int cpu_id)
852 {
853 	int ret = 0;
854 	uint32_t entrypoint = 0;
855 
856 	ret = socfpga_cpurstrelease(cpu_id);
857 
858 	if (ret < 0) {
859 		return RSTMGR_RET_ERROR;
860 	}
861 
862 	if (ret == RSTMGR_RET_OK) {
863 
864 		switch (cpu_id) {
865 		case 0:
866 			entrypoint = mmio_read_32(SOCFPGA_RSTMGR_CPUBASELOW_0);
867 			entrypoint |= mmio_read_32(SOCFPGA_RSTMGR_CPUBASEHIGH_0) << 24;
868 		break;
869 
870 		case 1:
871 			entrypoint = mmio_read_32(SOCFPGA_RSTMGR_CPUBASELOW_1);
872 			entrypoint |= mmio_read_32(SOCFPGA_RSTMGR_CPUBASEHIGH_1) << 24;
873 		break;
874 
875 		case 2:
876 			entrypoint = mmio_read_32(SOCFPGA_RSTMGR_CPUBASELOW_2);
877 			entrypoint |= mmio_read_32(SOCFPGA_RSTMGR_CPUBASEHIGH_2) << 24;
878 		break;
879 
880 		case 3:
881 			entrypoint = mmio_read_32(SOCFPGA_RSTMGR_CPUBASELOW_3);
882 			entrypoint |= mmio_read_32(SOCFPGA_RSTMGR_CPUBASEHIGH_3) << 24;
883 		break;
884 
885 		default:
886 		break;
887 		}
888 
889 		mmio_write_64(PLAT_SEC_ENTRY, entrypoint);
890 	}
891 
892 	return RSTMGR_RET_OK;
893 }
894 
895 /* CPURSTRELEASE */
socfpga_cpurstrelease(unsigned int cpu_id)896 int socfpga_cpurstrelease(unsigned int cpu_id)
897 {
898 	unsigned int timeout = 0;
899 
900 	do {
901 		/* Read response queue status to ensure it is empty */
902 		uint32_t cpurstrelease_status;
903 
904 		cpurstrelease_status = mmio_read_32(SOCFPGA_RSTMGR(CPURSTRELEASE));
905 
906 		if ((cpurstrelease_status & RSTMGR_CPUSTRELEASE_CPUx) == cpu_id) {
907 			return RSTMGR_RET_OK;
908 		}
909 		udelay(1000);
910 	} while (timeout-- > 0);
911 
912 	return RSTMGR_RET_ERROR;
913 }
914