1*2b09ea48SLey Foon Tan /*
2*2b09ea48SLey Foon Tan * Copyright (C) 2013 Altera Corporation <www.altera.com>
3*2b09ea48SLey Foon Tan *
4*2b09ea48SLey Foon Tan * SPDX-License-Identifier: GPL-2.0+
5*2b09ea48SLey Foon Tan */
6*2b09ea48SLey Foon Tan
7*2b09ea48SLey Foon Tan
8*2b09ea48SLey Foon Tan #include <common.h>
9*2b09ea48SLey Foon Tan #include <asm/io.h>
10*2b09ea48SLey Foon Tan #include <asm/arch/fpga_manager.h>
11*2b09ea48SLey Foon Tan #include <asm/arch/reset_manager.h>
12*2b09ea48SLey Foon Tan #include <asm/arch/system_manager.h>
13*2b09ea48SLey Foon Tan
14*2b09ea48SLey Foon Tan DECLARE_GLOBAL_DATA_PTR;
15*2b09ea48SLey Foon Tan
16*2b09ea48SLey Foon Tan static const struct socfpga_reset_manager *reset_manager_base =
17*2b09ea48SLey Foon Tan (void *)SOCFPGA_RSTMGR_ADDRESS;
18*2b09ea48SLey Foon Tan static const struct socfpga_system_manager *sysmgr_regs =
19*2b09ea48SLey Foon Tan (struct socfpga_system_manager *)SOCFPGA_SYSMGR_ADDRESS;
20*2b09ea48SLey Foon Tan
21*2b09ea48SLey Foon Tan /* Assert or de-assert SoCFPGA reset manager reset. */
socfpga_per_reset(u32 reset,int set)22*2b09ea48SLey Foon Tan void socfpga_per_reset(u32 reset, int set)
23*2b09ea48SLey Foon Tan {
24*2b09ea48SLey Foon Tan const u32 *reg;
25*2b09ea48SLey Foon Tan u32 rstmgr_bank = RSTMGR_BANK(reset);
26*2b09ea48SLey Foon Tan
27*2b09ea48SLey Foon Tan switch (rstmgr_bank) {
28*2b09ea48SLey Foon Tan case 0:
29*2b09ea48SLey Foon Tan reg = &reset_manager_base->mpu_mod_reset;
30*2b09ea48SLey Foon Tan break;
31*2b09ea48SLey Foon Tan case 1:
32*2b09ea48SLey Foon Tan reg = &reset_manager_base->per_mod_reset;
33*2b09ea48SLey Foon Tan break;
34*2b09ea48SLey Foon Tan case 2:
35*2b09ea48SLey Foon Tan reg = &reset_manager_base->per2_mod_reset;
36*2b09ea48SLey Foon Tan break;
37*2b09ea48SLey Foon Tan case 3:
38*2b09ea48SLey Foon Tan reg = &reset_manager_base->brg_mod_reset;
39*2b09ea48SLey Foon Tan break;
40*2b09ea48SLey Foon Tan case 4:
41*2b09ea48SLey Foon Tan reg = &reset_manager_base->misc_mod_reset;
42*2b09ea48SLey Foon Tan break;
43*2b09ea48SLey Foon Tan
44*2b09ea48SLey Foon Tan default:
45*2b09ea48SLey Foon Tan return;
46*2b09ea48SLey Foon Tan }
47*2b09ea48SLey Foon Tan
48*2b09ea48SLey Foon Tan if (set)
49*2b09ea48SLey Foon Tan setbits_le32(reg, 1 << RSTMGR_RESET(reset));
50*2b09ea48SLey Foon Tan else
51*2b09ea48SLey Foon Tan clrbits_le32(reg, 1 << RSTMGR_RESET(reset));
52*2b09ea48SLey Foon Tan }
53*2b09ea48SLey Foon Tan
54*2b09ea48SLey Foon Tan /*
55*2b09ea48SLey Foon Tan * Assert reset on every peripheral but L4WD0.
56*2b09ea48SLey Foon Tan * Watchdog must be kept intact to prevent glitches
57*2b09ea48SLey Foon Tan * and/or hangs.
58*2b09ea48SLey Foon Tan */
socfpga_per_reset_all(void)59*2b09ea48SLey Foon Tan void socfpga_per_reset_all(void)
60*2b09ea48SLey Foon Tan {
61*2b09ea48SLey Foon Tan const u32 l4wd0 = 1 << RSTMGR_RESET(SOCFPGA_RESET(L4WD0));
62*2b09ea48SLey Foon Tan
63*2b09ea48SLey Foon Tan writel(~l4wd0, &reset_manager_base->per_mod_reset);
64*2b09ea48SLey Foon Tan writel(0xffffffff, &reset_manager_base->per2_mod_reset);
65*2b09ea48SLey Foon Tan }
66*2b09ea48SLey Foon Tan
67*2b09ea48SLey Foon Tan /*
68*2b09ea48SLey Foon Tan * Release peripherals from reset based on handoff
69*2b09ea48SLey Foon Tan */
reset_deassert_peripherals_handoff(void)70*2b09ea48SLey Foon Tan void reset_deassert_peripherals_handoff(void)
71*2b09ea48SLey Foon Tan {
72*2b09ea48SLey Foon Tan writel(0, &reset_manager_base->per_mod_reset);
73*2b09ea48SLey Foon Tan }
74*2b09ea48SLey Foon Tan
75*2b09ea48SLey Foon Tan #if defined(CONFIG_SOCFPGA_VIRTUAL_TARGET)
socfpga_bridges_reset(int enable)76*2b09ea48SLey Foon Tan void socfpga_bridges_reset(int enable)
77*2b09ea48SLey Foon Tan {
78*2b09ea48SLey Foon Tan /* For SoCFPGA-VT, this is NOP. */
79*2b09ea48SLey Foon Tan return;
80*2b09ea48SLey Foon Tan }
81*2b09ea48SLey Foon Tan #else
82*2b09ea48SLey Foon Tan
83*2b09ea48SLey Foon Tan #define L3REGS_REMAP_LWHPS2FPGA_MASK 0x10
84*2b09ea48SLey Foon Tan #define L3REGS_REMAP_HPS2FPGA_MASK 0x08
85*2b09ea48SLey Foon Tan #define L3REGS_REMAP_OCRAM_MASK 0x01
86*2b09ea48SLey Foon Tan
socfpga_bridges_reset(int enable)87*2b09ea48SLey Foon Tan void socfpga_bridges_reset(int enable)
88*2b09ea48SLey Foon Tan {
89*2b09ea48SLey Foon Tan const u32 l3mask = L3REGS_REMAP_LWHPS2FPGA_MASK |
90*2b09ea48SLey Foon Tan L3REGS_REMAP_HPS2FPGA_MASK |
91*2b09ea48SLey Foon Tan L3REGS_REMAP_OCRAM_MASK;
92*2b09ea48SLey Foon Tan
93*2b09ea48SLey Foon Tan if (enable) {
94*2b09ea48SLey Foon Tan /* brdmodrst */
95*2b09ea48SLey Foon Tan writel(0xffffffff, &reset_manager_base->brg_mod_reset);
96*2b09ea48SLey Foon Tan } else {
97*2b09ea48SLey Foon Tan writel(0, &sysmgr_regs->iswgrp_handoff[0]);
98*2b09ea48SLey Foon Tan writel(l3mask, &sysmgr_regs->iswgrp_handoff[1]);
99*2b09ea48SLey Foon Tan
100*2b09ea48SLey Foon Tan /* Check signal from FPGA. */
101*2b09ea48SLey Foon Tan if (!fpgamgr_test_fpga_ready()) {
102*2b09ea48SLey Foon Tan /* FPGA not ready, do nothing. We allow system to boot
103*2b09ea48SLey Foon Tan * without FPGA ready. So, return 0 instead of error. */
104*2b09ea48SLey Foon Tan printf("%s: FPGA not ready, aborting.\n", __func__);
105*2b09ea48SLey Foon Tan return;
106*2b09ea48SLey Foon Tan }
107*2b09ea48SLey Foon Tan
108*2b09ea48SLey Foon Tan /* brdmodrst */
109*2b09ea48SLey Foon Tan writel(0, &reset_manager_base->brg_mod_reset);
110*2b09ea48SLey Foon Tan
111*2b09ea48SLey Foon Tan /* Remap the bridges into memory map */
112*2b09ea48SLey Foon Tan writel(l3mask, SOCFPGA_L3REGS_ADDRESS);
113*2b09ea48SLey Foon Tan }
114*2b09ea48SLey Foon Tan return;
115*2b09ea48SLey Foon Tan }
116*2b09ea48SLey Foon Tan #endif
117