xref: /OK3568_Linux_fs/u-boot/arch/arm/mach-socfpga/reset_manager_arria10.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Copyright (C) 2016-2017 Intel Corporation
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * SPDX-License-Identifier:    GPL-2.0
5*4882a593Smuzhiyun  */
6*4882a593Smuzhiyun 
7*4882a593Smuzhiyun #include <asm/io.h>
8*4882a593Smuzhiyun #include <asm/arch/fpga_manager.h>
9*4882a593Smuzhiyun #include <asm/arch/misc.h>
10*4882a593Smuzhiyun #include <asm/arch/reset_manager.h>
11*4882a593Smuzhiyun #include <asm/arch/system_manager.h>
12*4882a593Smuzhiyun #include <common.h>
13*4882a593Smuzhiyun #include <errno.h>
14*4882a593Smuzhiyun #include <fdtdec.h>
15*4882a593Smuzhiyun #include <wait_bit.h>
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun DECLARE_GLOBAL_DATA_PTR;
18*4882a593Smuzhiyun 
19*4882a593Smuzhiyun static const struct socfpga_reset_manager *reset_manager_base =
20*4882a593Smuzhiyun 		(void *)SOCFPGA_RSTMGR_ADDRESS;
21*4882a593Smuzhiyun static const struct socfpga_system_manager *sysmgr_regs =
22*4882a593Smuzhiyun 		(struct socfpga_system_manager *)SOCFPGA_SYSMGR_ADDRESS;
23*4882a593Smuzhiyun 
24*4882a593Smuzhiyun #define ECC_MASK (ALT_RSTMGR_PER0MODRST_EMACECC0_SET_MSK | \
25*4882a593Smuzhiyun 	ALT_RSTMGR_PER0MODRST_EMACECC1_SET_MSK | \
26*4882a593Smuzhiyun 	ALT_RSTMGR_PER0MODRST_EMACECC2_SET_MSK | \
27*4882a593Smuzhiyun 	ALT_RSTMGR_PER0MODRST_NANDECC_SET_MSK | \
28*4882a593Smuzhiyun 	ALT_RSTMGR_PER0MODRST_QSPIECC_SET_MSK | \
29*4882a593Smuzhiyun 	ALT_RSTMGR_PER0MODRST_SDMMCECC_SET_MSK)
30*4882a593Smuzhiyun 
socfpga_reset_uart(int assert)31*4882a593Smuzhiyun void socfpga_reset_uart(int assert)
32*4882a593Smuzhiyun {
33*4882a593Smuzhiyun 	unsigned int com_port;
34*4882a593Smuzhiyun 
35*4882a593Smuzhiyun 	com_port = uart_com_port(gd->fdt_blob);
36*4882a593Smuzhiyun 
37*4882a593Smuzhiyun 	if (com_port == SOCFPGA_UART1_ADDRESS)
38*4882a593Smuzhiyun 		socfpga_per_reset(SOCFPGA_RESET(UART1), assert);
39*4882a593Smuzhiyun 	else if (com_port == SOCFPGA_UART0_ADDRESS)
40*4882a593Smuzhiyun 		socfpga_per_reset(SOCFPGA_RESET(UART0), assert);
41*4882a593Smuzhiyun }
42*4882a593Smuzhiyun 
43*4882a593Smuzhiyun static const u32 per0fpgamasks[] = {
44*4882a593Smuzhiyun 	ALT_RSTMGR_PER0MODRST_EMACECC0_SET_MSK |
45*4882a593Smuzhiyun 	ALT_RSTMGR_PER0MODRST_EMAC0_SET_MSK,
46*4882a593Smuzhiyun 	ALT_RSTMGR_PER0MODRST_EMACECC1_SET_MSK |
47*4882a593Smuzhiyun 	ALT_RSTMGR_PER0MODRST_EMAC1_SET_MSK,
48*4882a593Smuzhiyun 	ALT_RSTMGR_PER0MODRST_EMACECC2_SET_MSK |
49*4882a593Smuzhiyun 	ALT_RSTMGR_PER0MODRST_EMAC2_SET_MSK,
50*4882a593Smuzhiyun 	0, /* i2c0 per1mod */
51*4882a593Smuzhiyun 	0, /* i2c1 per1mod */
52*4882a593Smuzhiyun 	0, /* i2c0_emac */
53*4882a593Smuzhiyun 	0, /* i2c1_emac */
54*4882a593Smuzhiyun 	0, /* i2c2_emac */
55*4882a593Smuzhiyun 	ALT_RSTMGR_PER0MODRST_NANDECC_SET_MSK |
56*4882a593Smuzhiyun 	ALT_RSTMGR_PER0MODRST_NAND_SET_MSK,
57*4882a593Smuzhiyun 	ALT_RSTMGR_PER0MODRST_QSPIECC_SET_MSK |
58*4882a593Smuzhiyun 	ALT_RSTMGR_PER0MODRST_QSPI_SET_MSK,
59*4882a593Smuzhiyun 	ALT_RSTMGR_PER0MODRST_SDMMCECC_SET_MSK |
60*4882a593Smuzhiyun 	ALT_RSTMGR_PER0MODRST_SDMMC_SET_MSK,
61*4882a593Smuzhiyun 	ALT_RSTMGR_PER0MODRST_SPIM0_SET_MSK,
62*4882a593Smuzhiyun 	ALT_RSTMGR_PER0MODRST_SPIM1_SET_MSK,
63*4882a593Smuzhiyun 	ALT_RSTMGR_PER0MODRST_SPIS0_SET_MSK,
64*4882a593Smuzhiyun 	ALT_RSTMGR_PER0MODRST_SPIS1_SET_MSK,
65*4882a593Smuzhiyun 	0, /* uart0 per1mod */
66*4882a593Smuzhiyun 	0, /* uart1 per1mod */
67*4882a593Smuzhiyun };
68*4882a593Smuzhiyun 
69*4882a593Smuzhiyun static const u32 per1fpgamasks[] = {
70*4882a593Smuzhiyun 	0, /* emac0 per0mod */
71*4882a593Smuzhiyun 	0, /* emac1 per0mod */
72*4882a593Smuzhiyun 	0, /* emac2 per0mod */
73*4882a593Smuzhiyun 	ALT_RSTMGR_PER1MODRST_I2C0_SET_MSK,
74*4882a593Smuzhiyun 	ALT_RSTMGR_PER1MODRST_I2C1_SET_MSK,
75*4882a593Smuzhiyun 	ALT_RSTMGR_PER1MODRST_I2C2_SET_MSK, /* i2c0_emac */
76*4882a593Smuzhiyun 	ALT_RSTMGR_PER1MODRST_I2C3_SET_MSK, /* i2c1_emac */
77*4882a593Smuzhiyun 	ALT_RSTMGR_PER1MODRST_I2C4_SET_MSK, /* i2c2_emac */
78*4882a593Smuzhiyun 	0, /* nand per0mod */
79*4882a593Smuzhiyun 	0, /* qspi per0mod */
80*4882a593Smuzhiyun 	0, /* sdmmc per0mod */
81*4882a593Smuzhiyun 	0, /* spim0 per0mod */
82*4882a593Smuzhiyun 	0, /* spim1 per0mod */
83*4882a593Smuzhiyun 	0, /* spis0 per0mod */
84*4882a593Smuzhiyun 	0, /* spis1 per0mod */
85*4882a593Smuzhiyun 	ALT_RSTMGR_PER1MODRST_UART0_SET_MSK,
86*4882a593Smuzhiyun 	ALT_RSTMGR_PER1MODRST_UART1_SET_MSK,
87*4882a593Smuzhiyun };
88*4882a593Smuzhiyun 
89*4882a593Smuzhiyun struct bridge_cfg {
90*4882a593Smuzhiyun 	int compat_id;
91*4882a593Smuzhiyun 	u32  mask_noc;
92*4882a593Smuzhiyun 	u32  mask_rstmgr;
93*4882a593Smuzhiyun };
94*4882a593Smuzhiyun 
95*4882a593Smuzhiyun static const struct bridge_cfg bridge_cfg_tbl[] = {
96*4882a593Smuzhiyun 	{
97*4882a593Smuzhiyun 		COMPAT_ALTERA_SOCFPGA_H2F_BRG,
98*4882a593Smuzhiyun 		ALT_SYSMGR_NOC_H2F_SET_MSK,
99*4882a593Smuzhiyun 		ALT_RSTMGR_BRGMODRST_H2F_SET_MSK,
100*4882a593Smuzhiyun 	},
101*4882a593Smuzhiyun 	{
102*4882a593Smuzhiyun 		COMPAT_ALTERA_SOCFPGA_LWH2F_BRG,
103*4882a593Smuzhiyun 		ALT_SYSMGR_NOC_LWH2F_SET_MSK,
104*4882a593Smuzhiyun 		ALT_RSTMGR_BRGMODRST_LWH2F_SET_MSK,
105*4882a593Smuzhiyun 	},
106*4882a593Smuzhiyun 	{
107*4882a593Smuzhiyun 		COMPAT_ALTERA_SOCFPGA_F2H_BRG,
108*4882a593Smuzhiyun 		ALT_SYSMGR_NOC_F2H_SET_MSK,
109*4882a593Smuzhiyun 		ALT_RSTMGR_BRGMODRST_F2H_SET_MSK,
110*4882a593Smuzhiyun 	},
111*4882a593Smuzhiyun 	{
112*4882a593Smuzhiyun 		COMPAT_ALTERA_SOCFPGA_F2SDR0,
113*4882a593Smuzhiyun 		ALT_SYSMGR_NOC_F2SDR0_SET_MSK,
114*4882a593Smuzhiyun 		ALT_RSTMGR_BRGMODRST_F2SSDRAM0_SET_MSK,
115*4882a593Smuzhiyun 	},
116*4882a593Smuzhiyun 	{
117*4882a593Smuzhiyun 		COMPAT_ALTERA_SOCFPGA_F2SDR1,
118*4882a593Smuzhiyun 		ALT_SYSMGR_NOC_F2SDR1_SET_MSK,
119*4882a593Smuzhiyun 		ALT_RSTMGR_BRGMODRST_F2SSDRAM1_SET_MSK,
120*4882a593Smuzhiyun 	},
121*4882a593Smuzhiyun 	{
122*4882a593Smuzhiyun 		COMPAT_ALTERA_SOCFPGA_F2SDR2,
123*4882a593Smuzhiyun 		ALT_SYSMGR_NOC_F2SDR2_SET_MSK,
124*4882a593Smuzhiyun 		ALT_RSTMGR_BRGMODRST_F2SSDRAM2_SET_MSK,
125*4882a593Smuzhiyun 	},
126*4882a593Smuzhiyun };
127*4882a593Smuzhiyun 
128*4882a593Smuzhiyun /* Disable the watchdog (toggle reset to watchdog) */
socfpga_watchdog_disable(void)129*4882a593Smuzhiyun void socfpga_watchdog_disable(void)
130*4882a593Smuzhiyun {
131*4882a593Smuzhiyun 	/* assert reset for watchdog */
132*4882a593Smuzhiyun 	setbits_le32(&reset_manager_base->per1modrst,
133*4882a593Smuzhiyun 		     ALT_RSTMGR_PER1MODRST_WD0_SET_MSK);
134*4882a593Smuzhiyun }
135*4882a593Smuzhiyun 
136*4882a593Smuzhiyun /* Release NOC ddr scheduler from reset */
socfpga_reset_deassert_noc_ddr_scheduler(void)137*4882a593Smuzhiyun void socfpga_reset_deassert_noc_ddr_scheduler(void)
138*4882a593Smuzhiyun {
139*4882a593Smuzhiyun 	clrbits_le32(&reset_manager_base->brgmodrst,
140*4882a593Smuzhiyun 		     ALT_RSTMGR_BRGMODRST_DDRSCH_SET_MSK);
141*4882a593Smuzhiyun }
142*4882a593Smuzhiyun 
143*4882a593Smuzhiyun /* Check whether Watchdog in reset state? */
socfpga_is_wdt_in_reset(void)144*4882a593Smuzhiyun int socfpga_is_wdt_in_reset(void)
145*4882a593Smuzhiyun {
146*4882a593Smuzhiyun 	u32 val;
147*4882a593Smuzhiyun 
148*4882a593Smuzhiyun 	val = readl(&reset_manager_base->per1modrst);
149*4882a593Smuzhiyun 	val &= ALT_RSTMGR_PER1MODRST_WD0_SET_MSK;
150*4882a593Smuzhiyun 
151*4882a593Smuzhiyun 	/* return 0x1 if watchdog in reset */
152*4882a593Smuzhiyun 	return val;
153*4882a593Smuzhiyun }
154*4882a593Smuzhiyun 
155*4882a593Smuzhiyun /* emacbase: base address of emac to enable/disable reset
156*4882a593Smuzhiyun  * state: 0 - disable reset, !0 - enable reset
157*4882a593Smuzhiyun  */
socfpga_emac_manage_reset(ulong emacbase,u32 state)158*4882a593Smuzhiyun void socfpga_emac_manage_reset(ulong emacbase, u32 state)
159*4882a593Smuzhiyun {
160*4882a593Smuzhiyun 	ulong eccmask;
161*4882a593Smuzhiyun 	ulong emacmask;
162*4882a593Smuzhiyun 
163*4882a593Smuzhiyun 	switch (emacbase) {
164*4882a593Smuzhiyun 	case SOCFPGA_EMAC0_ADDRESS:
165*4882a593Smuzhiyun 		eccmask = ALT_RSTMGR_PER0MODRST_EMACECC0_SET_MSK;
166*4882a593Smuzhiyun 		emacmask = ALT_RSTMGR_PER0MODRST_EMAC0_SET_MSK;
167*4882a593Smuzhiyun 		break;
168*4882a593Smuzhiyun 	case SOCFPGA_EMAC1_ADDRESS:
169*4882a593Smuzhiyun 		eccmask = ALT_RSTMGR_PER0MODRST_EMACECC1_SET_MSK;
170*4882a593Smuzhiyun 		emacmask = ALT_RSTMGR_PER0MODRST_EMAC1_SET_MSK;
171*4882a593Smuzhiyun 		break;
172*4882a593Smuzhiyun 	case SOCFPGA_EMAC2_ADDRESS:
173*4882a593Smuzhiyun 		eccmask = ALT_RSTMGR_PER0MODRST_EMACECC2_SET_MSK;
174*4882a593Smuzhiyun 		emacmask = ALT_RSTMGR_PER0MODRST_EMAC2_SET_MSK;
175*4882a593Smuzhiyun 		break;
176*4882a593Smuzhiyun 	default:
177*4882a593Smuzhiyun 		pr_err("emac base address unexpected! %lx", emacbase);
178*4882a593Smuzhiyun 		hang();
179*4882a593Smuzhiyun 		break;
180*4882a593Smuzhiyun 	}
181*4882a593Smuzhiyun 
182*4882a593Smuzhiyun 	if (state) {
183*4882a593Smuzhiyun 		/* Enable ECC OCP first */
184*4882a593Smuzhiyun 		setbits_le32(&reset_manager_base->per0modrst, eccmask);
185*4882a593Smuzhiyun 		setbits_le32(&reset_manager_base->per0modrst, emacmask);
186*4882a593Smuzhiyun 	} else {
187*4882a593Smuzhiyun 		/* Disable ECC OCP first */
188*4882a593Smuzhiyun 		clrbits_le32(&reset_manager_base->per0modrst, emacmask);
189*4882a593Smuzhiyun 		clrbits_le32(&reset_manager_base->per0modrst, eccmask);
190*4882a593Smuzhiyun 	}
191*4882a593Smuzhiyun }
192*4882a593Smuzhiyun 
get_bridge_init_val(const void * blob,int compat_id)193*4882a593Smuzhiyun static int get_bridge_init_val(const void *blob, int compat_id)
194*4882a593Smuzhiyun {
195*4882a593Smuzhiyun 	int node;
196*4882a593Smuzhiyun 
197*4882a593Smuzhiyun 	node = fdtdec_next_compatible(blob, 0, compat_id);
198*4882a593Smuzhiyun 	if (node < 0)
199*4882a593Smuzhiyun 		return 0;
200*4882a593Smuzhiyun 
201*4882a593Smuzhiyun 	return fdtdec_get_uint(blob, node, "init-val", 0);
202*4882a593Smuzhiyun }
203*4882a593Smuzhiyun 
204*4882a593Smuzhiyun /* Enable bridges (hps2fpga, lwhps2fpga, fpga2hps, fpga2sdram) per handoff */
socfpga_reset_deassert_bridges_handoff(void)205*4882a593Smuzhiyun int socfpga_reset_deassert_bridges_handoff(void)
206*4882a593Smuzhiyun {
207*4882a593Smuzhiyun 	u32 mask_noc = 0, mask_rstmgr = 0;
208*4882a593Smuzhiyun 	int i;
209*4882a593Smuzhiyun 
210*4882a593Smuzhiyun 	for (i = 0; i < ARRAY_SIZE(bridge_cfg_tbl); i++) {
211*4882a593Smuzhiyun 		if (get_bridge_init_val(gd->fdt_blob,
212*4882a593Smuzhiyun 					bridge_cfg_tbl[i].compat_id)) {
213*4882a593Smuzhiyun 			mask_noc |= bridge_cfg_tbl[i].mask_noc;
214*4882a593Smuzhiyun 			mask_rstmgr |= bridge_cfg_tbl[i].mask_rstmgr;
215*4882a593Smuzhiyun 		}
216*4882a593Smuzhiyun 	}
217*4882a593Smuzhiyun 
218*4882a593Smuzhiyun 	/* clear idle request to all bridges */
219*4882a593Smuzhiyun 	setbits_le32(&sysmgr_regs->noc_idlereq_clr, mask_noc);
220*4882a593Smuzhiyun 
221*4882a593Smuzhiyun 	/* Release bridges from reset state per handoff value */
222*4882a593Smuzhiyun 	clrbits_le32(&reset_manager_base->brgmodrst, mask_rstmgr);
223*4882a593Smuzhiyun 
224*4882a593Smuzhiyun 	/* Poll until all idleack to 0, timeout at 1000ms */
225*4882a593Smuzhiyun 	return wait_for_bit_le32(&sysmgr_regs->noc_idleack, mask_noc,
226*4882a593Smuzhiyun 				 false, 1000, false);
227*4882a593Smuzhiyun }
228*4882a593Smuzhiyun 
socfpga_reset_assert_fpga_connected_peripherals(void)229*4882a593Smuzhiyun void socfpga_reset_assert_fpga_connected_peripherals(void)
230*4882a593Smuzhiyun {
231*4882a593Smuzhiyun 	u32 mask0 = 0;
232*4882a593Smuzhiyun 	u32 mask1 = 0;
233*4882a593Smuzhiyun 	u32 fpga_pinux_addr = SOCFPGA_PINMUX_FPGA_INTERFACE_ADDRESS;
234*4882a593Smuzhiyun 	int i;
235*4882a593Smuzhiyun 
236*4882a593Smuzhiyun 	for (i = 0; i < ARRAY_SIZE(per1fpgamasks); i++) {
237*4882a593Smuzhiyun 		if (readl(fpga_pinux_addr)) {
238*4882a593Smuzhiyun 			mask0 |= per0fpgamasks[i];
239*4882a593Smuzhiyun 			mask1 |= per1fpgamasks[i];
240*4882a593Smuzhiyun 		}
241*4882a593Smuzhiyun 		fpga_pinux_addr += sizeof(u32);
242*4882a593Smuzhiyun 	}
243*4882a593Smuzhiyun 
244*4882a593Smuzhiyun 	setbits_le32(&reset_manager_base->per0modrst, mask0 & ECC_MASK);
245*4882a593Smuzhiyun 	setbits_le32(&reset_manager_base->per1modrst, mask1);
246*4882a593Smuzhiyun 	setbits_le32(&reset_manager_base->per0modrst, mask0);
247*4882a593Smuzhiyun }
248*4882a593Smuzhiyun 
249*4882a593Smuzhiyun /* Release L4 OSC1 Watchdog Timer 0 from reset through reset manager */
socfpga_reset_deassert_osc1wd0(void)250*4882a593Smuzhiyun void socfpga_reset_deassert_osc1wd0(void)
251*4882a593Smuzhiyun {
252*4882a593Smuzhiyun 	clrbits_le32(&reset_manager_base->per1modrst,
253*4882a593Smuzhiyun 		     ALT_RSTMGR_PER1MODRST_WD0_SET_MSK);
254*4882a593Smuzhiyun }
255*4882a593Smuzhiyun 
256*4882a593Smuzhiyun /*
257*4882a593Smuzhiyun  * Assert or de-assert SoCFPGA reset manager reset.
258*4882a593Smuzhiyun  */
socfpga_per_reset(u32 reset,int set)259*4882a593Smuzhiyun void socfpga_per_reset(u32 reset, int set)
260*4882a593Smuzhiyun {
261*4882a593Smuzhiyun 	const u32 *reg;
262*4882a593Smuzhiyun 	u32 rstmgr_bank = RSTMGR_BANK(reset);
263*4882a593Smuzhiyun 
264*4882a593Smuzhiyun 	switch (rstmgr_bank) {
265*4882a593Smuzhiyun 	case 0:
266*4882a593Smuzhiyun 		reg = &reset_manager_base->mpumodrst;
267*4882a593Smuzhiyun 		break;
268*4882a593Smuzhiyun 	case 1:
269*4882a593Smuzhiyun 		reg = &reset_manager_base->per0modrst;
270*4882a593Smuzhiyun 		break;
271*4882a593Smuzhiyun 	case 2:
272*4882a593Smuzhiyun 		reg = &reset_manager_base->per1modrst;
273*4882a593Smuzhiyun 		break;
274*4882a593Smuzhiyun 	case 3:
275*4882a593Smuzhiyun 		reg = &reset_manager_base->brgmodrst;
276*4882a593Smuzhiyun 		break;
277*4882a593Smuzhiyun 	case 4:
278*4882a593Smuzhiyun 		reg = &reset_manager_base->sysmodrst;
279*4882a593Smuzhiyun 		break;
280*4882a593Smuzhiyun 
281*4882a593Smuzhiyun 	default:
282*4882a593Smuzhiyun 		return;
283*4882a593Smuzhiyun 	}
284*4882a593Smuzhiyun 
285*4882a593Smuzhiyun 	if (set)
286*4882a593Smuzhiyun 		setbits_le32(reg, 1 << RSTMGR_RESET(reset));
287*4882a593Smuzhiyun 	else
288*4882a593Smuzhiyun 		clrbits_le32(reg, 1 << RSTMGR_RESET(reset));
289*4882a593Smuzhiyun }
290*4882a593Smuzhiyun 
291*4882a593Smuzhiyun /*
292*4882a593Smuzhiyun  * Assert reset on every peripheral but L4WD0.
293*4882a593Smuzhiyun  * Watchdog must be kept intact to prevent glitches
294*4882a593Smuzhiyun  * and/or hangs.
295*4882a593Smuzhiyun  * For the Arria10, we disable all the peripherals except L4 watchdog0,
296*4882a593Smuzhiyun  * L4 Timer 0, and ECC.
297*4882a593Smuzhiyun  */
socfpga_per_reset_all(void)298*4882a593Smuzhiyun void socfpga_per_reset_all(void)
299*4882a593Smuzhiyun {
300*4882a593Smuzhiyun 	const u32 l4wd0 = (1 << RSTMGR_RESET(SOCFPGA_RESET(L4WD0)) |
301*4882a593Smuzhiyun 			  (1 << RSTMGR_RESET(SOCFPGA_RESET(L4SYSTIMER0))));
302*4882a593Smuzhiyun 	unsigned mask_ecc_ocp =
303*4882a593Smuzhiyun 		ALT_RSTMGR_PER0MODRST_EMACECC0_SET_MSK |
304*4882a593Smuzhiyun 		ALT_RSTMGR_PER0MODRST_EMACECC1_SET_MSK |
305*4882a593Smuzhiyun 		ALT_RSTMGR_PER0MODRST_EMACECC2_SET_MSK |
306*4882a593Smuzhiyun 		ALT_RSTMGR_PER0MODRST_USBECC0_SET_MSK |
307*4882a593Smuzhiyun 		ALT_RSTMGR_PER0MODRST_USBECC1_SET_MSK |
308*4882a593Smuzhiyun 		ALT_RSTMGR_PER0MODRST_NANDECC_SET_MSK |
309*4882a593Smuzhiyun 		ALT_RSTMGR_PER0MODRST_QSPIECC_SET_MSK |
310*4882a593Smuzhiyun 		ALT_RSTMGR_PER0MODRST_SDMMCECC_SET_MSK;
311*4882a593Smuzhiyun 
312*4882a593Smuzhiyun 	/* disable all components except ECC_OCP, L4 Timer0 and L4 WD0 */
313*4882a593Smuzhiyun 	writel(~l4wd0, &reset_manager_base->per1modrst);
314*4882a593Smuzhiyun 	setbits_le32(&reset_manager_base->per0modrst, ~mask_ecc_ocp);
315*4882a593Smuzhiyun 
316*4882a593Smuzhiyun 	/* Finally disable the ECC_OCP */
317*4882a593Smuzhiyun 	setbits_le32(&reset_manager_base->per0modrst, mask_ecc_ocp);
318*4882a593Smuzhiyun }
319*4882a593Smuzhiyun 
320*4882a593Smuzhiyun #if defined(CONFIG_SOCFPGA_VIRTUAL_TARGET)
socfpga_bridges_reset(void)321*4882a593Smuzhiyun int socfpga_bridges_reset(void)
322*4882a593Smuzhiyun {
323*4882a593Smuzhiyun 	/* For SoCFPGA-VT, this is NOP. */
324*4882a593Smuzhiyun 	return 0;
325*4882a593Smuzhiyun }
326*4882a593Smuzhiyun #else
socfpga_bridges_reset(void)327*4882a593Smuzhiyun int socfpga_bridges_reset(void)
328*4882a593Smuzhiyun {
329*4882a593Smuzhiyun 	int ret;
330*4882a593Smuzhiyun 
331*4882a593Smuzhiyun 	/* Disable all the bridges (hps2fpga, lwhps2fpga, fpga2hps,
332*4882a593Smuzhiyun 	   fpga2sdram) */
333*4882a593Smuzhiyun 	/* set idle request to all bridges */
334*4882a593Smuzhiyun 	writel(ALT_SYSMGR_NOC_H2F_SET_MSK |
335*4882a593Smuzhiyun 		ALT_SYSMGR_NOC_LWH2F_SET_MSK |
336*4882a593Smuzhiyun 		ALT_SYSMGR_NOC_F2H_SET_MSK |
337*4882a593Smuzhiyun 		ALT_SYSMGR_NOC_F2SDR0_SET_MSK |
338*4882a593Smuzhiyun 		ALT_SYSMGR_NOC_F2SDR1_SET_MSK |
339*4882a593Smuzhiyun 		ALT_SYSMGR_NOC_F2SDR2_SET_MSK,
340*4882a593Smuzhiyun 		&sysmgr_regs->noc_idlereq_set);
341*4882a593Smuzhiyun 
342*4882a593Smuzhiyun 	/* Enable the NOC timeout */
343*4882a593Smuzhiyun 	writel(ALT_SYSMGR_NOC_TMO_EN_SET_MSK, &sysmgr_regs->noc_timeout);
344*4882a593Smuzhiyun 
345*4882a593Smuzhiyun 	/* Poll until all idleack to 1 */
346*4882a593Smuzhiyun 	ret = wait_for_bit_le32(&sysmgr_regs->noc_idleack,
347*4882a593Smuzhiyun 				ALT_SYSMGR_NOC_H2F_SET_MSK |
348*4882a593Smuzhiyun 				ALT_SYSMGR_NOC_LWH2F_SET_MSK |
349*4882a593Smuzhiyun 				ALT_SYSMGR_NOC_F2H_SET_MSK |
350*4882a593Smuzhiyun 				ALT_SYSMGR_NOC_F2SDR0_SET_MSK |
351*4882a593Smuzhiyun 				ALT_SYSMGR_NOC_F2SDR1_SET_MSK |
352*4882a593Smuzhiyun 				ALT_SYSMGR_NOC_F2SDR2_SET_MSK,
353*4882a593Smuzhiyun 				true, 10000, false);
354*4882a593Smuzhiyun 	if (ret)
355*4882a593Smuzhiyun 		return ret;
356*4882a593Smuzhiyun 
357*4882a593Smuzhiyun 	/* Poll until all idlestatus to 1 */
358*4882a593Smuzhiyun 	ret = wait_for_bit_le32(&sysmgr_regs->noc_idlestatus,
359*4882a593Smuzhiyun 				ALT_SYSMGR_NOC_H2F_SET_MSK |
360*4882a593Smuzhiyun 				ALT_SYSMGR_NOC_LWH2F_SET_MSK |
361*4882a593Smuzhiyun 				ALT_SYSMGR_NOC_F2H_SET_MSK |
362*4882a593Smuzhiyun 				ALT_SYSMGR_NOC_F2SDR0_SET_MSK |
363*4882a593Smuzhiyun 				ALT_SYSMGR_NOC_F2SDR1_SET_MSK |
364*4882a593Smuzhiyun 				ALT_SYSMGR_NOC_F2SDR2_SET_MSK,
365*4882a593Smuzhiyun 				true, 10000, false);
366*4882a593Smuzhiyun 	if (ret)
367*4882a593Smuzhiyun 		return ret;
368*4882a593Smuzhiyun 
369*4882a593Smuzhiyun 	/* Put all bridges (except NOR DDR scheduler) into reset state */
370*4882a593Smuzhiyun 	setbits_le32(&reset_manager_base->brgmodrst,
371*4882a593Smuzhiyun 		     (ALT_RSTMGR_BRGMODRST_H2F_SET_MSK |
372*4882a593Smuzhiyun 		     ALT_RSTMGR_BRGMODRST_LWH2F_SET_MSK |
373*4882a593Smuzhiyun 		     ALT_RSTMGR_BRGMODRST_F2H_SET_MSK |
374*4882a593Smuzhiyun 		     ALT_RSTMGR_BRGMODRST_F2SSDRAM0_SET_MSK |
375*4882a593Smuzhiyun 		     ALT_RSTMGR_BRGMODRST_F2SSDRAM1_SET_MSK |
376*4882a593Smuzhiyun 		     ALT_RSTMGR_BRGMODRST_F2SSDRAM2_SET_MSK));
377*4882a593Smuzhiyun 
378*4882a593Smuzhiyun 	/* Disable NOC timeout */
379*4882a593Smuzhiyun 	writel(0, &sysmgr_regs->noc_timeout);
380*4882a593Smuzhiyun 
381*4882a593Smuzhiyun 	return 0;
382*4882a593Smuzhiyun }
383*4882a593Smuzhiyun #endif
384