misc_arria10.c 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Copyright (C) 2016-2017 Intel Corporation
  4. */
  5. #include <altera.h>
  6. #include <common.h>
  7. #include <errno.h>
  8. #include <fdtdec.h>
  9. #include <miiphy.h>
  10. #include <netdev.h>
  11. #include <ns16550.h>
  12. #include <watchdog.h>
  13. #include <asm/arch/misc.h>
  14. #include <asm/arch/pinmux.h>
  15. #include <asm/arch/reset_manager.h>
  16. #include <asm/arch/reset_manager_arria10.h>
  17. #include <asm/arch/sdram_arria10.h>
  18. #include <asm/arch/system_manager.h>
  19. #include <asm/arch/nic301.h>
  20. #include <asm/io.h>
  21. #include <asm/pl310.h>
  22. #define PINMUX_UART0_TX_SHARED_IO_OFFSET_Q1_3 0x08
  23. #define PINMUX_UART0_TX_SHARED_IO_OFFSET_Q2_11 0x58
  24. #define PINMUX_UART0_TX_SHARED_IO_OFFSET_Q3_3 0x68
  25. #define PINMUX_UART1_TX_SHARED_IO_OFFSET_Q1_7 0x18
  26. #define PINMUX_UART1_TX_SHARED_IO_OFFSET_Q3_7 0x78
  27. #define PINMUX_UART1_TX_SHARED_IO_OFFSET_Q4_3 0x98
  28. #if defined(CONFIG_SPL_BUILD)
  29. static struct pl310_regs *const pl310 =
  30. (struct pl310_regs *)CONFIG_SYS_PL310_BASE;
  31. static const struct socfpga_noc_fw_ocram *noc_fw_ocram_base =
  32. (void *)SOCFPGA_SDR_FIREWALL_OCRAM_ADDRESS;
  33. #endif
  34. static struct socfpga_system_manager *sysmgr_regs =
  35. (struct socfpga_system_manager *)SOCFPGA_SYSMGR_ADDRESS;
  36. /*
  37. * DesignWare Ethernet initialization
  38. */
  39. #ifdef CONFIG_ETH_DESIGNWARE
  40. static void arria10_dwmac_reset(const u8 of_reset_id, const u8 phymode)
  41. {
  42. u32 reset;
  43. if (of_reset_id == EMAC0_RESET) {
  44. reset = SOCFPGA_RESET(EMAC0);
  45. } else if (of_reset_id == EMAC1_RESET) {
  46. reset = SOCFPGA_RESET(EMAC1);
  47. } else if (of_reset_id == EMAC2_RESET) {
  48. reset = SOCFPGA_RESET(EMAC2);
  49. } else {
  50. printf("GMAC: Invalid reset ID (%i)!\n", of_reset_id);
  51. return;
  52. }
  53. clrsetbits_le32(&sysmgr_regs->emac[of_reset_id - EMAC0_RESET],
  54. SYSMGR_EMACGRP_CTRL_PHYSEL_MASK,
  55. phymode);
  56. /* Release the EMAC controller from reset */
  57. socfpga_per_reset(reset, 0);
  58. }
  59. static int socfpga_eth_reset(void)
  60. {
  61. /* Put all GMACs into RESET state. */
  62. socfpga_per_reset(SOCFPGA_RESET(EMAC0), 1);
  63. socfpga_per_reset(SOCFPGA_RESET(EMAC1), 1);
  64. socfpga_per_reset(SOCFPGA_RESET(EMAC2), 1);
  65. return socfpga_eth_reset_common(arria10_dwmac_reset);
  66. };
  67. #else
  68. static int socfpga_eth_reset(void)
  69. {
  70. return 0;
  71. };
  72. #endif
  73. #if defined(CONFIG_SPL_BUILD)
  74. /*
  75. + * This function initializes security policies to be consistent across
  76. + * all logic units in the Arria 10.
  77. + *
  78. + * The idea is to set all security policies to be normal, nonsecure
  79. + * for all units.
  80. + */
  81. static void initialize_security_policies(void)
  82. {
  83. /* Put OCRAM in non-secure */
  84. writel(0x003f0000, &noc_fw_ocram_base->region0);
  85. writel(0x1, &noc_fw_ocram_base->enable);
  86. /* Put DDR in non-secure */
  87. writel(0xffff0000, SOCFPGA_SDR_FIREWALL_L3_ADDRESS + 0xc);
  88. writel(0x1, SOCFPGA_SDR_FIREWALL_L3_ADDRESS);
  89. /* Enable priviledged and non-priviledged access to L4 peripherals */
  90. writel(~0, SOCFPGA_NOC_L4_PRIV_FLT_OFST);
  91. /* Enable secure and non-secure transactions to bridges */
  92. writel(~0, SOCFPGA_NOC_FW_H2F_SCR_OFST);
  93. writel(~0, SOCFPGA_NOC_FW_H2F_SCR_OFST + 4);
  94. writel(0x0007FFFF, &sysmgr_regs->ecc_intmask_set);
  95. }
  96. int arch_early_init_r(void)
  97. {
  98. initialize_security_policies();
  99. /* Configure the L2 controller to make SDRAM start at 0 */
  100. writel(0x1, &pl310->pl310_addr_filter_start);
  101. /* assert reset to all except L4WD0 and L4TIMER0 */
  102. socfpga_per_reset_all();
  103. return 0;
  104. }
  105. #else
  106. int arch_early_init_r(void)
  107. {
  108. return 0;
  109. }
  110. #endif
  111. /*
  112. * Print CPU information
  113. */
  114. #if defined(CONFIG_DISPLAY_CPUINFO)
  115. int print_cpuinfo(void)
  116. {
  117. const u32 bsel =
  118. SYSMGR_GET_BOOTINFO_BSEL(readl(&sysmgr_regs->bootinfo));
  119. puts("CPU: Altera SoCFPGA Arria 10\n");
  120. printf("BOOT: %s\n", bsel_str[bsel].name);
  121. return 0;
  122. }
  123. #endif
  124. #ifdef CONFIG_ARCH_MISC_INIT
  125. int arch_misc_init(void)
  126. {
  127. return socfpga_eth_reset();
  128. }
  129. #endif
  130. void do_bridge_reset(int enable)
  131. {
  132. if (enable)
  133. socfpga_reset_deassert_bridges_handoff();
  134. else
  135. socfpga_bridges_reset();
  136. }