zynqmp.c 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333
  1. /*
  2. * (C) Copyright 2014 - 2015 Xilinx, Inc.
  3. * Michal Simek <michal.simek@xilinx.com>
  4. *
  5. * SPDX-License-Identifier: GPL-2.0+
  6. */
  7. #include <common.h>
  8. #include <sata.h>
  9. #include <ahci.h>
  10. #include <scsi.h>
  11. #include <malloc.h>
  12. #include <asm/arch/clk.h>
  13. #include <asm/arch/hardware.h>
  14. #include <asm/arch/sys_proto.h>
  15. #include <asm/io.h>
  16. #include <usb.h>
  17. #include <dwc3-uboot.h>
  18. #include <zynqmppl.h>
  19. #include <i2c.h>
  20. #include <g_dnl.h>
  21. DECLARE_GLOBAL_DATA_PTR;
  22. #if defined(CONFIG_FPGA) && defined(CONFIG_FPGA_ZYNQMPPL) && \
  23. !defined(CONFIG_SPL_BUILD)
  24. static xilinx_desc zynqmppl = XILINX_ZYNQMP_DESC;
  25. static const struct {
  26. uint32_t id;
  27. char *name;
  28. } zynqmp_devices[] = {
  29. {
  30. .id = 0x10,
  31. .name = "3eg",
  32. },
  33. {
  34. .id = 0x11,
  35. .name = "2eg",
  36. },
  37. {
  38. .id = 0x20,
  39. .name = "5ev",
  40. },
  41. {
  42. .id = 0x21,
  43. .name = "4ev",
  44. },
  45. {
  46. .id = 0x30,
  47. .name = "7ev",
  48. },
  49. {
  50. .id = 0x38,
  51. .name = "9eg",
  52. },
  53. {
  54. .id = 0x39,
  55. .name = "6eg",
  56. },
  57. {
  58. .id = 0x40,
  59. .name = "11eg",
  60. },
  61. {
  62. .id = 0x50,
  63. .name = "15eg",
  64. },
  65. {
  66. .id = 0x58,
  67. .name = "19eg",
  68. },
  69. {
  70. .id = 0x59,
  71. .name = "17eg",
  72. },
  73. };
  74. static int chip_id(void)
  75. {
  76. struct pt_regs regs;
  77. regs.regs[0] = ZYNQMP_SIP_SVC_CSU_DMA_CHIPID;
  78. regs.regs[1] = 0;
  79. regs.regs[2] = 0;
  80. regs.regs[3] = 0;
  81. smc_call(&regs);
  82. /*
  83. * SMC returns:
  84. * regs[0][31:0] = status of the operation
  85. * regs[0][63:32] = CSU.IDCODE register
  86. * regs[1][31:0] = CSU.version register
  87. */
  88. regs.regs[0] = upper_32_bits(regs.regs[0]);
  89. regs.regs[0] &= ZYNQMP_CSU_IDCODE_DEVICE_CODE_MASK |
  90. ZYNQMP_CSU_IDCODE_SVD_MASK;
  91. regs.regs[0] >>= ZYNQMP_CSU_IDCODE_SVD_SHIFT;
  92. return regs.regs[0];
  93. }
  94. static char *zynqmp_get_silicon_idcode_name(void)
  95. {
  96. uint32_t i, id;
  97. id = chip_id();
  98. for (i = 0; i < ARRAY_SIZE(zynqmp_devices); i++) {
  99. if (zynqmp_devices[i].id == id)
  100. return zynqmp_devices[i].name;
  101. }
  102. return "unknown";
  103. }
  104. #endif
  105. #define ZYNQMP_VERSION_SIZE 9
  106. int board_init(void)
  107. {
  108. printf("EL Level:\tEL%d\n", current_el());
  109. #if defined(CONFIG_FPGA) && defined(CONFIG_FPGA_ZYNQMPPL) && \
  110. !defined(CONFIG_SPL_BUILD) || (defined(CONFIG_SPL_FPGA_SUPPORT) && \
  111. defined(CONFIG_SPL_BUILD))
  112. if (current_el() != 3) {
  113. static char version[ZYNQMP_VERSION_SIZE];
  114. strncat(version, "xczu", ZYNQMP_VERSION_SIZE);
  115. zynqmppl.name = strncat(version,
  116. zynqmp_get_silicon_idcode_name(),
  117. ZYNQMP_VERSION_SIZE);
  118. printf("Chip ID:\t%s\n", zynqmppl.name);
  119. fpga_init();
  120. fpga_add(fpga_xilinx, &zynqmppl);
  121. }
  122. #endif
  123. return 0;
  124. }
  125. int board_early_init_r(void)
  126. {
  127. u32 val;
  128. if (current_el() == 3) {
  129. val = readl(&crlapb_base->timestamp_ref_ctrl);
  130. val |= ZYNQMP_CRL_APB_TIMESTAMP_REF_CTRL_CLKACT;
  131. writel(val, &crlapb_base->timestamp_ref_ctrl);
  132. /* Program freq register in System counter */
  133. writel(zynqmp_get_system_timer_freq(),
  134. &iou_scntr_secure->base_frequency_id_register);
  135. /* And enable system counter */
  136. writel(ZYNQMP_IOU_SCNTR_COUNTER_CONTROL_REGISTER_EN,
  137. &iou_scntr_secure->counter_control_register);
  138. }
  139. /* Program freq register in System counter and enable system counter */
  140. writel(gd->cpu_clk, &iou_scntr->base_frequency_id_register);
  141. writel(ZYNQMP_IOU_SCNTR_COUNTER_CONTROL_REGISTER_HDBG |
  142. ZYNQMP_IOU_SCNTR_COUNTER_CONTROL_REGISTER_EN,
  143. &iou_scntr->counter_control_register);
  144. return 0;
  145. }
  146. int zynq_board_read_rom_ethaddr(unsigned char *ethaddr)
  147. {
  148. #if defined(CONFIG_ZYNQ_GEM_EEPROM_ADDR) && \
  149. defined(CONFIG_ZYNQ_GEM_I2C_MAC_OFFSET) && \
  150. defined(CONFIG_ZYNQ_EEPROM_BUS)
  151. i2c_set_bus_num(CONFIG_ZYNQ_EEPROM_BUS);
  152. if (eeprom_read(CONFIG_ZYNQ_GEM_EEPROM_ADDR,
  153. CONFIG_ZYNQ_GEM_I2C_MAC_OFFSET,
  154. ethaddr, 6))
  155. printf("I2C EEPROM MAC address read failed\n");
  156. #endif
  157. return 0;
  158. }
  159. #if !defined(CONFIG_SYS_SDRAM_BASE) && !defined(CONFIG_SYS_SDRAM_SIZE)
  160. void dram_init_banksize(void)
  161. {
  162. fdtdec_setup_memory_banksize();
  163. }
  164. int dram_init(void)
  165. {
  166. if (fdtdec_setup_memory_size() != 0)
  167. return -EINVAL;
  168. return 0;
  169. }
  170. #else
  171. int dram_init(void)
  172. {
  173. gd->ram_size = CONFIG_SYS_SDRAM_SIZE;
  174. return 0;
  175. }
  176. #endif
  177. void reset_cpu(ulong addr)
  178. {
  179. }
  180. int board_late_init(void)
  181. {
  182. u32 reg = 0;
  183. u8 bootmode;
  184. const char *mode;
  185. char *new_targets;
  186. if (!(gd->flags & GD_FLG_ENV_DEFAULT)) {
  187. debug("Saved variables - Skipping\n");
  188. return 0;
  189. }
  190. reg = readl(&crlapb_base->boot_mode);
  191. if (reg >> BOOT_MODE_ALT_SHIFT)
  192. reg >>= BOOT_MODE_ALT_SHIFT;
  193. bootmode = reg & BOOT_MODES_MASK;
  194. puts("Bootmode: ");
  195. switch (bootmode) {
  196. case USB_MODE:
  197. puts("USB_MODE\n");
  198. mode = "usb";
  199. break;
  200. case JTAG_MODE:
  201. puts("JTAG_MODE\n");
  202. mode = "pxe dhcp";
  203. break;
  204. case QSPI_MODE_24BIT:
  205. case QSPI_MODE_32BIT:
  206. mode = "qspi0";
  207. puts("QSPI_MODE\n");
  208. break;
  209. case EMMC_MODE:
  210. puts("EMMC_MODE\n");
  211. mode = "mmc0";
  212. break;
  213. case SD_MODE:
  214. puts("SD_MODE\n");
  215. mode = "mmc0";
  216. break;
  217. case SD1_LSHFT_MODE:
  218. puts("LVL_SHFT_");
  219. /* fall through */
  220. case SD_MODE1:
  221. puts("SD_MODE1\n");
  222. #if defined(CONFIG_ZYNQ_SDHCI0) && defined(CONFIG_ZYNQ_SDHCI1)
  223. mode = "mmc1";
  224. #else
  225. mode = "mmc0";
  226. #endif
  227. break;
  228. case NAND_MODE:
  229. puts("NAND_MODE\n");
  230. mode = "nand0";
  231. break;
  232. default:
  233. mode = "";
  234. printf("Invalid Boot Mode:0x%x\n", bootmode);
  235. break;
  236. }
  237. /*
  238. * One terminating char + one byte for space between mode
  239. * and default boot_targets
  240. */
  241. new_targets = calloc(1, strlen(mode) +
  242. strlen(getenv("boot_targets")) + 2);
  243. sprintf(new_targets, "%s %s", mode, getenv("boot_targets"));
  244. setenv("boot_targets", new_targets);
  245. return 0;
  246. }
  247. int checkboard(void)
  248. {
  249. puts("Board: Xilinx ZynqMP\n");
  250. return 0;
  251. }
  252. #ifdef CONFIG_USB_DWC3
  253. static struct dwc3_device dwc3_device_data0 = {
  254. .maximum_speed = USB_SPEED_HIGH,
  255. .base = ZYNQMP_USB0_XHCI_BASEADDR,
  256. .dr_mode = USB_DR_MODE_PERIPHERAL,
  257. .index = 0,
  258. };
  259. static struct dwc3_device dwc3_device_data1 = {
  260. .maximum_speed = USB_SPEED_HIGH,
  261. .base = ZYNQMP_USB1_XHCI_BASEADDR,
  262. .dr_mode = USB_DR_MODE_PERIPHERAL,
  263. .index = 1,
  264. };
  265. int usb_gadget_handle_interrupts(int index)
  266. {
  267. dwc3_uboot_handle_interrupt(index);
  268. return 0;
  269. }
  270. int board_usb_init(int index, enum usb_init_type init)
  271. {
  272. debug("%s: index %x\n", __func__, index);
  273. #if defined(CONFIG_USB_GADGET_DOWNLOAD)
  274. g_dnl_set_serialnumber(CONFIG_SYS_CONFIG_NAME);
  275. #endif
  276. switch (index) {
  277. case 0:
  278. return dwc3_uboot_init(&dwc3_device_data0);
  279. case 1:
  280. return dwc3_uboot_init(&dwc3_device_data1);
  281. };
  282. return -1;
  283. }
  284. int board_usb_cleanup(int index, enum usb_init_type init)
  285. {
  286. dwc3_uboot_exit(index);
  287. return 0;
  288. }
  289. #endif