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