reset_manager_gen5.c 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  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/fpga_manager.h>
  9. #include <asm/arch/reset_manager.h>
  10. #include <asm/arch/system_manager.h>
  11. DECLARE_GLOBAL_DATA_PTR;
  12. static const struct socfpga_reset_manager *reset_manager_base =
  13. (void *)SOCFPGA_RSTMGR_ADDRESS;
  14. static const struct socfpga_system_manager *sysmgr_regs =
  15. (struct socfpga_system_manager *)SOCFPGA_SYSMGR_ADDRESS;
  16. /* Assert or de-assert SoCFPGA reset manager reset. */
  17. void socfpga_per_reset(u32 reset, int set)
  18. {
  19. const u32 *reg;
  20. u32 rstmgr_bank = RSTMGR_BANK(reset);
  21. switch (rstmgr_bank) {
  22. case 0:
  23. reg = &reset_manager_base->mpu_mod_reset;
  24. break;
  25. case 1:
  26. reg = &reset_manager_base->per_mod_reset;
  27. break;
  28. case 2:
  29. reg = &reset_manager_base->per2_mod_reset;
  30. break;
  31. case 3:
  32. reg = &reset_manager_base->brg_mod_reset;
  33. break;
  34. case 4:
  35. reg = &reset_manager_base->misc_mod_reset;
  36. break;
  37. default:
  38. return;
  39. }
  40. if (set)
  41. setbits_le32(reg, 1 << RSTMGR_RESET(reset));
  42. else
  43. clrbits_le32(reg, 1 << RSTMGR_RESET(reset));
  44. }
  45. /*
  46. * Assert reset on every peripheral but L4WD0.
  47. * Watchdog must be kept intact to prevent glitches
  48. * and/or hangs.
  49. */
  50. void socfpga_per_reset_all(void)
  51. {
  52. const u32 l4wd0 = 1 << RSTMGR_RESET(SOCFPGA_RESET(L4WD0));
  53. writel(~l4wd0, &reset_manager_base->per_mod_reset);
  54. writel(0xffffffff, &reset_manager_base->per2_mod_reset);
  55. }
  56. /*
  57. * Release peripherals from reset based on handoff
  58. */
  59. void reset_deassert_peripherals_handoff(void)
  60. {
  61. writel(0, &reset_manager_base->per_mod_reset);
  62. }
  63. #if defined(CONFIG_SOCFPGA_VIRTUAL_TARGET)
  64. void socfpga_bridges_reset(int enable)
  65. {
  66. /* For SoCFPGA-VT, this is NOP. */
  67. return;
  68. }
  69. #else
  70. #define L3REGS_REMAP_LWHPS2FPGA_MASK 0x10
  71. #define L3REGS_REMAP_HPS2FPGA_MASK 0x08
  72. #define L3REGS_REMAP_OCRAM_MASK 0x01
  73. void socfpga_bridges_reset(int enable)
  74. {
  75. const u32 l3mask = L3REGS_REMAP_LWHPS2FPGA_MASK |
  76. L3REGS_REMAP_HPS2FPGA_MASK |
  77. L3REGS_REMAP_OCRAM_MASK;
  78. if (enable) {
  79. /* brdmodrst */
  80. writel(0xffffffff, &reset_manager_base->brg_mod_reset);
  81. } else {
  82. writel(0, &sysmgr_regs->iswgrp_handoff[0]);
  83. writel(l3mask, &sysmgr_regs->iswgrp_handoff[1]);
  84. /* Check signal from FPGA. */
  85. if (!fpgamgr_test_fpga_ready()) {
  86. /* FPGA not ready, do nothing. We allow system to boot
  87. * without FPGA ready. So, return 0 instead of error. */
  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. return;
  97. }
  98. #endif