reset_manager.c 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. /*
  2. * Copyright (C) 2013 Altera Corporation <www.altera.com>
  3. *
  4. * SPDX-License-Identifier: GPL-2.0+
  5. */
  6. #include <common.h>
  7. #include <asm/io.h>
  8. #include <asm/arch/reset_manager.h>
  9. #include <asm/arch/fpga_manager.h>
  10. DECLARE_GLOBAL_DATA_PTR;
  11. static const struct socfpga_reset_manager *reset_manager_base =
  12. (void *)SOCFPGA_RSTMGR_ADDRESS;
  13. /* Assert or de-assert SoCFPGA reset manager reset. */
  14. void socfpga_per_reset(u32 reset, int set)
  15. {
  16. const void *reg;
  17. if (RSTMGR_BANK(reset) == 0)
  18. reg = &reset_manager_base->mpu_mod_reset;
  19. else if (RSTMGR_BANK(reset) == 1)
  20. reg = &reset_manager_base->per_mod_reset;
  21. else if (RSTMGR_BANK(reset) == 2)
  22. reg = &reset_manager_base->per2_mod_reset;
  23. else if (RSTMGR_BANK(reset) == 3)
  24. reg = &reset_manager_base->brg_mod_reset;
  25. else if (RSTMGR_BANK(reset) == 4)
  26. reg = &reset_manager_base->misc_mod_reset;
  27. else /* Invalid reset register, do nothing */
  28. return;
  29. if (set)
  30. setbits_le32(reg, 1 << RSTMGR_RESET(reset));
  31. else
  32. clrbits_le32(reg, 1 << RSTMGR_RESET(reset));
  33. }
  34. /*
  35. * Assert reset on every peripheral but L4WD0.
  36. * Watchdog must be kept intact to prevent glitches
  37. * and/or hangs.
  38. */
  39. void socfpga_per_reset_all(void)
  40. {
  41. const u32 l4wd0 = 1 << RSTMGR_RESET(SOCFPGA_RESET(L4WD0));
  42. writel(~l4wd0, &reset_manager_base->per_mod_reset);
  43. writel(0xffffffff, &reset_manager_base->per2_mod_reset);
  44. }
  45. /*
  46. * Write the reset manager register to cause reset
  47. */
  48. void reset_cpu(ulong addr)
  49. {
  50. /* request a warm reset */
  51. writel((1 << RSTMGR_CTRL_SWWARMRSTREQ_LSB),
  52. &reset_manager_base->ctrl);
  53. /*
  54. * infinite loop here as watchdog will trigger and reset
  55. * the processor
  56. */
  57. while (1)
  58. ;
  59. }
  60. /*
  61. * Release peripherals from reset based on handoff
  62. */
  63. void reset_deassert_peripherals_handoff(void)
  64. {
  65. writel(0, &reset_manager_base->per_mod_reset);
  66. }
  67. #if defined(CONFIG_SOCFPGA_VIRTUAL_TARGET)
  68. void socfpga_bridges_reset(int enable)
  69. {
  70. /* For SoCFPGA-VT, this is NOP. */
  71. }
  72. #else
  73. #define L3REGS_REMAP_LWHPS2FPGA_MASK 0x10
  74. #define L3REGS_REMAP_HPS2FPGA_MASK 0x08
  75. #define L3REGS_REMAP_OCRAM_MASK 0x01
  76. void socfpga_bridges_reset(int enable)
  77. {
  78. const uint32_t l3mask = L3REGS_REMAP_LWHPS2FPGA_MASK |
  79. L3REGS_REMAP_HPS2FPGA_MASK |
  80. L3REGS_REMAP_OCRAM_MASK;
  81. if (enable) {
  82. /* brdmodrst */
  83. writel(0xffffffff, &reset_manager_base->brg_mod_reset);
  84. } else {
  85. /* Check signal from FPGA. */
  86. if (!fpgamgr_test_fpga_ready()) {
  87. /* FPGA not ready, do nothing. */
  88. printf("%s: FPGA not ready, aborting.\n", __func__);
  89. return;
  90. }
  91. /* brdmodrst */
  92. writel(0, &reset_manager_base->brg_mod_reset);
  93. /* Remap the bridges into memory map */
  94. writel(l3mask, SOCFPGA_L3REGS_ADDRESS);
  95. }
  96. }
  97. #endif