ice.c 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. /*
  2. * Copyright (C) 2017-2020 Alibaba Group Holding Limited
  3. *
  4. * SPDX-License-Identifier: GPL-2.0+
  5. */
  6. #include <asm/asm.h>
  7. #include <asm/io.h>
  8. #include <asm/types.h>
  9. #include <lmb.h>
  10. #include <cpu_func.h>
  11. #include <stdio.h>
  12. #include <common.h>
  13. void board_lmb_reserve(struct lmb *lmb)
  14. {
  15. lmb_add(lmb, (phys_addr_t)0x0, (phys_addr_t)0x20000000);
  16. }
  17. static void gmac_hw_init(void)
  18. {
  19. /* release phy by gpio0_0 */
  20. writel(0x1, (void *)0x3fff71000);
  21. udelay(10000);
  22. /* RGMII mode */
  23. writel(0x20202020, (void *)0x3fe8302cc);
  24. writel(0x07072020, (void *)0x3fe8302cf);
  25. writel(0x07070707, (void *)0x3fe8302d4);
  26. /* PHY Mode Sel */
  27. writel(0x1, (void *)0x3fe83025c);
  28. /* Enable TX_CLK PAD */
  29. writel(0x0, (void *)0x3fe83031c);
  30. /* Enable pll_div, 1000/4=250MHz */
  31. writel(0x4, (void *)0x3fff770cc);
  32. writel(0x4, (void *)0x3fff770cc);
  33. writel(0x80000004, (void *)0x3fff770cc);
  34. writel(0x80000004, (void *)0x3fff770cc);
  35. writel(0xa, (void *)0x3fff770d0);
  36. writel(0xa, (void *)0x3fff770d0);
  37. writel(0x8000000a, (void *)0x3fff770d0);
  38. writel(0x8000000a, (void *)0x3fff770d0);
  39. writel(0x28, (void *)0x3fff770d8);
  40. writel(0x28, (void *)0x3fff770d8);
  41. writel(0x80000028, (void *)0x3fff770d8);
  42. writel(0x80000028, (void *)0x3fff770d8);
  43. writel(0x1f, (void *)0x3fff770c4);
  44. writel(0x1f, (void *)0x3fff770c8);
  45. writel(0x13dc, (void *)0x3fff770c0);
  46. }
  47. static void usb_hw_init(void)
  48. {
  49. unsigned int usb_clk_cfg = readl((void *)0x3fff770f0);
  50. usb_clk_cfg |= (1 << 17);
  51. usb_clk_cfg |= (1 << 16);
  52. usb_clk_cfg |= (1 << 7);
  53. usb_clk_cfg |= (1 << 15);
  54. writel(usb_clk_cfg, (void *)0x3fff770f0);
  55. udelay(10);
  56. writel(0x1, (void *)0x3fe83009c);
  57. udelay(10);
  58. writel(0x1, (void *)0x3fff78048);
  59. udelay(10);
  60. }
  61. static void gpu_config(void)
  62. {
  63. writel(readl((void *)0x3fff77070) & ~((1 << 21) | (1 << 20)), (void *)0x3fff77070);
  64. udelay(100);
  65. writel(0x00011212, (void *)0x3fff7709c);
  66. udelay(100);
  67. writel((1 << 21) | (1 << 20), (void *)0x3fff77070);
  68. writel(0x0, (void *)0x3fff780a4);
  69. writel(0x0, (void *)0x3fff78094);
  70. writel(0x0, (void *)0x3fff780c0);
  71. udelay(100);
  72. writel(0x1, (void *)0x3fff78094);
  73. writel(0x1, (void *)0x3fff780c0);
  74. writel(0x1, (void *)0x3fff780a4);
  75. udelay(1000);
  76. printf("GPU ChipDate is:0x%08x\n", readl((void *)0x3fff27028));
  77. printf("GPU Frequency is:%dKHz\n", readl((void *)0x3fff7713c));
  78. }
  79. static void npu_config(void)
  80. {
  81. writel(0xff, (void *)0x3fff78044);
  82. udelay(100);
  83. printf("NPU ChipDate is:0x%08x\n", readl((void *)0x3fff20028));
  84. }
  85. static void dpu_config(void)
  86. {
  87. writel(0x10611212, (void *)0x3fff77098);
  88. writel(readl((void *)0x3fff77070) | (1 << 23 | 1 << 22), (void *)0x3fff77070);
  89. writel(0x11611212, (void *)0x3fff77098);
  90. writel(readl((void *)0x3fff78090) | (1 << 0), (void *)0x3fff78090);
  91. writel(readl((void *)0x3fff780a0) | (1 << 0), (void *)0x3fff780a0);
  92. writel(readl((void *)0x3fff7809c) | (1 << 0), (void *)0x3fff7809c);
  93. writel(readl((void *)0x3fe830700) | (1 << 2), (void *)0x3fe830700);
  94. writel(readl((void *)0x3fff72000) | (1 << 2), (void *)0x3fff72000);
  95. writel(readl((void *)0x3fff72004) | (1 << 2), (void *)0x3fff72004);
  96. printf("DPU ChipDate is:0x%08x\n", readl((void *)0x3fff28028));
  97. }
  98. static void dpu_start(void)
  99. {
  100. writel(0x00000000, (void *)(0x3fff28000 + 0x00001518));
  101. writel(0x00071900, (void *)(0x3fff28000 + 0x00000000));
  102. writel(0x00070900, (void *)(0x3fff28000 + 0x00000000));
  103. writel(0x032f02d0, (void *)(0x3fff28000 + 0x00001430));
  104. writel(0x05190500, (void *)(0x3fff28000 + 0x00001440));
  105. writel(0x418102f8, (void *)(0x3fff28000 + 0x00001438));
  106. writel(0x4287850b, (void *)(0x3fff28000 + 0x00001448));
  107. writel(0x00000080, (void *)(0x3fff28000 + 0x00001488));
  108. writel(0x00000005, (void *)(0x3fff28000 + 0x000014b8));
  109. writel(0x00000111, (void *)(0x3fff28000 + 0x00001418));
  110. writel(0x00000000, (void *)(0x3fff28000 + 0x00001530));
  111. writel(0x00000000, (void *)(0x3fff28000 + 0x00001538));
  112. writel(0x00000000, (void *)(0x3fff28000 + 0x00001800));
  113. writel(0x00000000, (void *)(0x3fff28000 + 0x00001808));
  114. writel(0x00000000, (void *)(0x3fff28000 + 0x00001818));
  115. writel(0x028002d0, (void *)(0x3fff28000 + 0x00001810));
  116. writel(0x00000000, (void *)(0x3fff28000 + 0x00001508));
  117. writel(0x00000000, (void *)(0x3fff28000 + 0x00001510));
  118. writel(0x00000000, (void *)(0x3fff28000 + 0x00001528));
  119. writel(0x00000000, (void *)(0x3fff28000 + 0x00001a18));
  120. writel(0x00000001, (void *)(0x3fff28000 + 0x00001480));
  121. writel(0xcc000000, (void *)(0x3fff28000 + 0x000014f0));
  122. writel(0xcc000000, (void *)(0x3fff28000 + 0x000014e8));
  123. writel(0x00030000, (void *)(0x3fff28000 + 0x000014f8));
  124. writel(0x00000b40, (void *)(0x3fff28000 + 0x00001500));
  125. writel(0x00000b40, (void *)(0x3fff28000 + 0x00001408));
  126. writel(0x00000000, (void *)(0x3fff28000 + 0x00001600));
  127. writel(0x00000000, (void *)(0x3fff28000 + 0x000018c0));
  128. writel(0x00000000, (void *)(0x3fff28000 + 0x00001900));
  129. writel(0x00000000, (void *)(0x3fff28000 + 0x00001640));
  130. writel(0x00780140, (void *)(0x3fff28000 + 0x00001680));
  131. writel(0x00000020, (void *)(0x3fff28000 + 0x00001580));
  132. writel(0x00000000, (void *)(0x3fff28000 + 0x000016c0));
  133. writel(0x00000000, (void *)(0x3fff28000 + 0x00001700));
  134. writel(0x00000000, (void *)(0x3fff28000 + 0x00001940));
  135. writel(0x00500078, (void *)(0x3fff28000 + 0x000017c0));
  136. writel(0x00000000, (void *)(0x3fff28000 + 0x00001740));
  137. writel(0x00000000, (void *)(0x3fff28000 + 0x00001780));
  138. writel(0x00000000, (void *)(0x3fff28000 + 0x00001840));
  139. writel(0x00000000, (void *)(0x3fff28000 + 0x00001880));
  140. writel(0x00005f7f, (void *)(0x3fff28000 + 0x00001a40));
  141. writel(0x0000aa4f, (void *)(0x3fff28000 + 0x00001a80));
  142. writel(0x00000000, (void *)(0x3fff28000 + 0x00001ac0));
  143. writel(0x00000000, (void *)(0x3fff28000 + 0x00001b00));
  144. writel(0x00000000, (void *)(0x3fff28000 + 0x00001b40));
  145. writel(0x00000000, (void *)(0x3fff28000 + 0x00001b80));
  146. writel(0x80008000, (void *)(0x3fff28000 + 0x00001bc0));
  147. writel(0x00000153, (void *)(0x3fff28000 + 0x00001c00));
  148. writel(0x00000000, (void *)(0x3fff28000 + 0x00001518));
  149. writel(0x032f02d0, (void *)(0x3fff28000 + 0x00001430));
  150. writel(0x05190500, (void *)(0x3fff28000 + 0x00001440));
  151. writel(0x418102f8, (void *)(0x3fff28000 + 0x00001438));
  152. writel(0x4287850b, (void *)(0x3fff28000 + 0x00001448));
  153. writel(0x00000080, (void *)(0x3fff28000 + 0x00001488));
  154. writel(0x00000005, (void *)(0x3fff28000 + 0x000014b8));
  155. writel(0x00000111, (void *)(0x3fff28000 + 0x00001418));
  156. writel(0x00000000, (void *)(0x3fff28000 + 0x00001530));
  157. writel(0x00000000, (void *)(0x3fff28000 + 0x00001538));
  158. writel(0x00000000, (void *)(0x3fff28000 + 0x00001800));
  159. writel(0x00000000, (void *)(0x3fff28000 + 0x00001808));
  160. writel(0x00000000, (void *)(0x3fff28000 + 0x00001818));
  161. writel(0x028002d0, (void *)(0x3fff28000 + 0x00001810));
  162. writel(0x00000000, (void *)(0x3fff28000 + 0x00001508));
  163. writel(0x00000000, (void *)(0x3fff28000 + 0x00001510));
  164. writel(0x00000000, (void *)(0x3fff28000 + 0x00001528));
  165. writel(0x00000000, (void *)(0x3fff28000 + 0x00001a18));
  166. writel(0x00000001, (void *)(0x3fff28000 + 0x00001480));
  167. writel(0x04000000, (void *)(0x3fff28000 + 0x000014f0));
  168. writel(0x04000000, (void *)(0x3fff28000 + 0x000014e8));
  169. writel(0x00030000, (void *)(0x3fff28000 + 0x000014f8));
  170. writel(0x00000b40, (void *)(0x3fff28000 + 0x00001500));
  171. writel(0x00000b40, (void *)(0x3fff28000 + 0x00001408));
  172. writel(0x03000000, (void *)(0x3fff28000 + 0x00001400));
  173. writel(0x18000011, (void *)(0x3fff28000 + 0x00001518));
  174. readl((void *)(0x3fff28000 + 0x00001518));
  175. writel(0x18000030, (void *)(0x3fff28000 + 0x00001518));
  176. writel(0x03000000, (void *)(0x3fff28000 + 0x00001400));
  177. writel(0x18002811, (void *)(0x3fff28000 + 0x00001518));
  178. writel(0, (void *)0x3fff72000);
  179. udelay(200 * 1000);
  180. writel(4, (void *)0x3fff72000);
  181. udelay(400 * 1000);
  182. writel(0x00000000, (void *)(0x3fff28000 + 0x00001518));
  183. }
  184. static void vpu_hw_init(void)
  185. {
  186. writel(readl((void *)0x3fff77074) | 0xf, (void *)0x3fff77074);
  187. writel(readl((void *)0x3fff78064) | (1 << 0), (void *)0x3fff78064);
  188. }
  189. static void dmac_hw_init(void)
  190. {
  191. writel(readl((void *)0x3fff77094) | (1 << 11), (void *)0x3fff77094);
  192. writel(readl((void *)0x3fff77070) | (1 << 13), (void *)0x3fff77070);
  193. writel(readl((void *)0x3fff78050) | (1 << 0), (void *)0x3fff78050);
  194. writel(readl((void *)0x3fff780c4) | (1 << 0), (void *)0x3fff780c4);
  195. }
  196. static void sd_hw_init(void)
  197. {
  198. writel(readl((void *)0x3fe83033c) | (1 << 22), (void *)0x3fe83033c);
  199. writel(readl((void *)0x3fff72004) | (1 << 15), (void *)0x3fff72004);
  200. writel(readl((void *)0x3fff72000) & ~(1 << 15), (void *)0x3fff72000);
  201. writel(0x0c800c80, (void *)0x3fff77078);
  202. writel(readl((void *)0x3fff78058) | (1 << 16), (void *)0x3fff78058);
  203. }
  204. static void spi_hw_init(void)
  205. {
  206. writel(readl((void *)0x3fe830334) | (1 << 2) | (1 << 4), (void *)0x3fe830334);
  207. writel(readl((void *)0x3fe830334) | (1 << 12) | (1 << 14), (void *)0x3fe830334);
  208. writel(readl((void *)0x3fe830330) | (1 << 22), (void *)0x3fe830330);
  209. }
  210. int board_init(void)
  211. {
  212. gmac_hw_init();
  213. usb_hw_init();
  214. gpu_config();
  215. npu_config();
  216. dpu_config();
  217. vpu_hw_init();
  218. dmac_hw_init();
  219. sd_hw_init();
  220. spi_hw_init();
  221. dpu_start();
  222. return 0;
  223. }