zynqmp.c 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439
  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. /*
  161. * fdt_get_reg - Fill buffer by information from DT
  162. */
  163. static phys_size_t fdt_get_reg(const void *fdt, int nodeoffset, void *buf,
  164. const u32 *cell, int n)
  165. {
  166. int i = 0, b, banks;
  167. int parent_offset = fdt_parent_offset(fdt, nodeoffset);
  168. int address_cells = fdt_address_cells(fdt, parent_offset);
  169. int size_cells = fdt_size_cells(fdt, parent_offset);
  170. char *p = buf;
  171. u64 val;
  172. u64 vals;
  173. debug("%s: addr_cells=%x, size_cell=%x, buf=%p, cell=%p\n",
  174. __func__, address_cells, size_cells, buf, cell);
  175. /* Check memory bank setup */
  176. banks = n % (address_cells + size_cells);
  177. if (banks)
  178. panic("Incorrect memory setup cells=%d, ac=%d, sc=%d\n",
  179. n, address_cells, size_cells);
  180. banks = n / (address_cells + size_cells);
  181. for (b = 0; b < banks; b++) {
  182. debug("%s: Bank #%d:\n", __func__, b);
  183. if (address_cells == 2) {
  184. val = cell[i + 1];
  185. val <<= 32;
  186. val |= cell[i];
  187. val = fdt64_to_cpu(val);
  188. debug("%s: addr64=%llx, ptr=%p, cell=%p\n",
  189. __func__, val, p, &cell[i]);
  190. *(phys_addr_t *)p = val;
  191. } else {
  192. debug("%s: addr32=%x, ptr=%p\n",
  193. __func__, fdt32_to_cpu(cell[i]), p);
  194. *(phys_addr_t *)p = fdt32_to_cpu(cell[i]);
  195. }
  196. p += sizeof(phys_addr_t);
  197. i += address_cells;
  198. debug("%s: pa=%p, i=%x, size=%zu\n", __func__, p, i,
  199. sizeof(phys_addr_t));
  200. if (size_cells == 2) {
  201. vals = cell[i + 1];
  202. vals <<= 32;
  203. vals |= cell[i];
  204. vals = fdt64_to_cpu(vals);
  205. debug("%s: size64=%llx, ptr=%p, cell=%p\n",
  206. __func__, vals, p, &cell[i]);
  207. *(phys_size_t *)p = vals;
  208. } else {
  209. debug("%s: size32=%x, ptr=%p\n",
  210. __func__, fdt32_to_cpu(cell[i]), p);
  211. *(phys_size_t *)p = fdt32_to_cpu(cell[i]);
  212. }
  213. p += sizeof(phys_size_t);
  214. i += size_cells;
  215. debug("%s: ps=%p, i=%x, size=%zu\n",
  216. __func__, p, i, sizeof(phys_size_t));
  217. }
  218. /* Return the first address size */
  219. return *(phys_size_t *)((char *)buf + sizeof(phys_addr_t));
  220. }
  221. #define FDT_REG_SIZE sizeof(u32)
  222. /* Temp location for sharing data for storing */
  223. /* Up to 64-bit address + 64-bit size */
  224. static u8 tmp[CONFIG_NR_DRAM_BANKS * 16];
  225. void dram_init_banksize(void)
  226. {
  227. int bank;
  228. memcpy(&gd->bd->bi_dram[0], &tmp, sizeof(tmp));
  229. for (bank = 0; bank < CONFIG_NR_DRAM_BANKS; bank++) {
  230. debug("Bank #%d: start %llx\n", bank,
  231. (unsigned long long)gd->bd->bi_dram[bank].start);
  232. debug("Bank #%d: size %llx\n", bank,
  233. (unsigned long long)gd->bd->bi_dram[bank].size);
  234. }
  235. }
  236. int dram_init(void)
  237. {
  238. int node, len;
  239. const void *blob = gd->fdt_blob;
  240. const u32 *cell;
  241. memset(&tmp, 0, sizeof(tmp));
  242. /* find or create "/memory" node. */
  243. node = fdt_subnode_offset(blob, 0, "memory");
  244. if (node < 0) {
  245. printf("%s: Can't get memory node\n", __func__);
  246. return node;
  247. }
  248. /* Get pointer to cells and lenght of it */
  249. cell = fdt_getprop(blob, node, "reg", &len);
  250. if (!cell) {
  251. printf("%s: Can't get reg property\n", __func__);
  252. return -1;
  253. }
  254. gd->ram_size = fdt_get_reg(blob, node, &tmp, cell, len / FDT_REG_SIZE);
  255. debug("%s: Initial DRAM size %llx\n", __func__, (u64)gd->ram_size);
  256. return 0;
  257. }
  258. #else
  259. int dram_init(void)
  260. {
  261. gd->ram_size = CONFIG_SYS_SDRAM_SIZE;
  262. return 0;
  263. }
  264. #endif
  265. void reset_cpu(ulong addr)
  266. {
  267. }
  268. int board_late_init(void)
  269. {
  270. u32 reg = 0;
  271. u8 bootmode;
  272. const char *mode;
  273. char *new_targets;
  274. if (!(gd->flags & GD_FLG_ENV_DEFAULT)) {
  275. debug("Saved variables - Skipping\n");
  276. return 0;
  277. }
  278. reg = readl(&crlapb_base->boot_mode);
  279. if (reg >> BOOT_MODE_ALT_SHIFT)
  280. reg >>= BOOT_MODE_ALT_SHIFT;
  281. bootmode = reg & BOOT_MODES_MASK;
  282. puts("Bootmode: ");
  283. switch (bootmode) {
  284. case USB_MODE:
  285. puts("USB_MODE\n");
  286. mode = "usb";
  287. break;
  288. case JTAG_MODE:
  289. puts("JTAG_MODE\n");
  290. mode = "pxe dhcp";
  291. break;
  292. case QSPI_MODE_24BIT:
  293. case QSPI_MODE_32BIT:
  294. mode = "qspi0";
  295. puts("QSPI_MODE\n");
  296. break;
  297. case EMMC_MODE:
  298. puts("EMMC_MODE\n");
  299. mode = "mmc0";
  300. break;
  301. case SD_MODE:
  302. puts("SD_MODE\n");
  303. mode = "mmc0";
  304. break;
  305. case SD1_LSHFT_MODE:
  306. puts("LVL_SHFT_");
  307. /* fall through */
  308. case SD_MODE1:
  309. puts("SD_MODE1\n");
  310. #if defined(CONFIG_ZYNQ_SDHCI0) && defined(CONFIG_ZYNQ_SDHCI1)
  311. mode = "mmc1";
  312. #else
  313. mode = "mmc0";
  314. #endif
  315. break;
  316. case NAND_MODE:
  317. puts("NAND_MODE\n");
  318. mode = "nand0";
  319. break;
  320. default:
  321. mode = "";
  322. printf("Invalid Boot Mode:0x%x\n", bootmode);
  323. break;
  324. }
  325. /*
  326. * One terminating char + one byte for space between mode
  327. * and default boot_targets
  328. */
  329. new_targets = calloc(1, strlen(mode) +
  330. strlen(getenv("boot_targets")) + 2);
  331. sprintf(new_targets, "%s %s", mode, getenv("boot_targets"));
  332. setenv("boot_targets", new_targets);
  333. return 0;
  334. }
  335. int checkboard(void)
  336. {
  337. puts("Board: Xilinx ZynqMP\n");
  338. return 0;
  339. }
  340. #ifdef CONFIG_USB_DWC3
  341. static struct dwc3_device dwc3_device_data0 = {
  342. .maximum_speed = USB_SPEED_HIGH,
  343. .base = ZYNQMP_USB0_XHCI_BASEADDR,
  344. .dr_mode = USB_DR_MODE_PERIPHERAL,
  345. .index = 0,
  346. };
  347. static struct dwc3_device dwc3_device_data1 = {
  348. .maximum_speed = USB_SPEED_HIGH,
  349. .base = ZYNQMP_USB1_XHCI_BASEADDR,
  350. .dr_mode = USB_DR_MODE_PERIPHERAL,
  351. .index = 1,
  352. };
  353. int usb_gadget_handle_interrupts(int index)
  354. {
  355. dwc3_uboot_handle_interrupt(index);
  356. return 0;
  357. }
  358. int board_usb_init(int index, enum usb_init_type init)
  359. {
  360. debug("%s: index %x\n", __func__, index);
  361. #if defined(CONFIG_USB_GADGET_DOWNLOAD)
  362. g_dnl_set_serialnumber(CONFIG_SYS_CONFIG_NAME);
  363. #endif
  364. switch (index) {
  365. case 0:
  366. return dwc3_uboot_init(&dwc3_device_data0);
  367. case 1:
  368. return dwc3_uboot_init(&dwc3_device_data1);
  369. };
  370. return -1;
  371. }
  372. int board_usb_cleanup(int index, enum usb_init_type init)
  373. {
  374. dwc3_uboot_exit(index);
  375. return 0;
  376. }
  377. #endif