boards.c 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. /*
  2. * Copyright (C) 2015-2016 Socionext Inc.
  3. * Author: Masahiro Yamada <yamada.masahiro@socionext.com>
  4. *
  5. * SPDX-License-Identifier: GPL-2.0+
  6. */
  7. #include <common.h>
  8. #include <libfdt.h>
  9. #include <linux/kernel.h>
  10. #include "init.h"
  11. DECLARE_GLOBAL_DATA_PTR;
  12. #if defined(CONFIG_ARCH_UNIPHIER_SLD3)
  13. static const struct uniphier_board_data uniphier_sld3_data = {
  14. .dram_freq = 1600,
  15. .dram_ch[0] = {
  16. .size = 0x20000000,
  17. .width = 32,
  18. },
  19. .dram_ch[1] = {
  20. .size = 0x20000000,
  21. .width = 16,
  22. },
  23. .dram_ch[2] = {
  24. .size = 0x10000000,
  25. .width = 16,
  26. },
  27. .flags = UNIPHIER_BD_DRAM_SPARSE,
  28. };
  29. #endif
  30. #if defined(CONFIG_ARCH_UNIPHIER_LD4)
  31. static const struct uniphier_board_data uniphier_ld4_data = {
  32. .dram_freq = 1600,
  33. .dram_ch[0] = {
  34. .size = 0x10000000,
  35. .width = 16,
  36. },
  37. .dram_ch[1] = {
  38. .size = 0x10000000,
  39. .width = 16,
  40. },
  41. .flags = UNIPHIER_BD_DDR3PLUS,
  42. };
  43. #endif
  44. #if defined(CONFIG_ARCH_UNIPHIER_PRO4)
  45. /* 1GB RAM board */
  46. static const struct uniphier_board_data uniphier_pro4_data = {
  47. .dram_freq = 1600,
  48. .dram_ch[0] = {
  49. .size = 0x20000000,
  50. .width = 32,
  51. },
  52. .dram_ch[1] = {
  53. .size = 0x20000000,
  54. .width = 32,
  55. },
  56. };
  57. /* 2GB RAM board */
  58. static const struct uniphier_board_data uniphier_pro4_2g_data = {
  59. .dram_freq = 1600,
  60. .dram_ch[0] = {
  61. .size = 0x40000000,
  62. .width = 32,
  63. },
  64. .dram_ch[1] = {
  65. .size = 0x40000000,
  66. .width = 32,
  67. },
  68. };
  69. #endif
  70. #if defined(CONFIG_ARCH_UNIPHIER_SLD8)
  71. static const struct uniphier_board_data uniphier_sld8_data = {
  72. .dram_freq = 1333,
  73. .dram_ch[0] = {
  74. .size = 0x10000000,
  75. .width = 16,
  76. },
  77. .dram_ch[1] = {
  78. .size = 0x10000000,
  79. .width = 16,
  80. },
  81. .flags = UNIPHIER_BD_DDR3PLUS,
  82. };
  83. #endif
  84. #if defined(CONFIG_ARCH_UNIPHIER_PRO5)
  85. static const struct uniphier_board_data uniphier_pro5_data = {
  86. .dram_freq = 1866,
  87. .dram_ch[0] = {
  88. .size = 0x20000000,
  89. .width = 32,
  90. },
  91. .dram_ch[1] = {
  92. .size = 0x20000000,
  93. .width = 32,
  94. },
  95. };
  96. #endif
  97. #if defined(CONFIG_ARCH_UNIPHIER_PXS2)
  98. static const struct uniphier_board_data uniphier_pxs2_data = {
  99. .dram_freq = 2133,
  100. .dram_ch[0] = {
  101. .size = 0x40000000,
  102. .width = 32,
  103. },
  104. .dram_ch[1] = {
  105. .size = 0x20000000,
  106. .width = 32,
  107. },
  108. .dram_ch[2] = {
  109. .size = 0x20000000,
  110. .width = 16,
  111. },
  112. };
  113. #endif
  114. #if defined(CONFIG_ARCH_UNIPHIER_LD6B)
  115. static const struct uniphier_board_data uniphier_ld6b_data = {
  116. .dram_freq = 1866,
  117. .dram_ch[0] = {
  118. .size = 0x40000000,
  119. .width = 32,
  120. },
  121. .dram_ch[1] = {
  122. .size = 0x20000000,
  123. .width = 32,
  124. },
  125. .dram_ch[2] = {
  126. .size = 0x20000000,
  127. .width = 16,
  128. },
  129. };
  130. #endif
  131. #if defined(CONFIG_ARCH_UNIPHIER_LD11)
  132. static const struct uniphier_board_data uniphier_ld11_data = {
  133. .dram_freq = 1600,
  134. .dram_ch[0] = {
  135. .size = 0x20000000,
  136. .width = 16,
  137. },
  138. .dram_ch[1] = {
  139. .size = 0x20000000,
  140. .width = 16,
  141. },
  142. };
  143. #endif
  144. #if defined(CONFIG_ARCH_UNIPHIER_LD20)
  145. static const struct uniphier_board_data uniphier_ld20_ref_data = {
  146. .dram_freq = 1866,
  147. .dram_ch[0] = {
  148. .size = 0x40000000,
  149. .width = 32,
  150. },
  151. .dram_ch[1] = {
  152. .size = 0x40000000,
  153. .width = 32,
  154. },
  155. .dram_ch[2] = {
  156. .size = 0x40000000,
  157. .width = 32,
  158. },
  159. .flags = UNIPHIER_BD_BOARD_LD20_REF,
  160. };
  161. static const struct uniphier_board_data uniphier_ld20_data = {
  162. .dram_freq = 1866,
  163. .dram_ch[0] = {
  164. .size = 0x40000000,
  165. .width = 32,
  166. },
  167. .dram_ch[1] = {
  168. .size = 0x40000000,
  169. .width = 32,
  170. },
  171. .dram_ch[2] = {
  172. .size = 0x40000000,
  173. .width = 32,
  174. },
  175. .flags = UNIPHIER_BD_BOARD_LD20_GLOBAL,
  176. };
  177. static const struct uniphier_board_data uniphier_ld21_data = {
  178. .dram_freq = 1866,
  179. .dram_ch[0] = {
  180. .size = 0x20000000,
  181. .width = 32,
  182. },
  183. .dram_ch[1] = {
  184. .size = 0x40000000,
  185. .width = 32,
  186. },
  187. .flags = UNIPHIER_BD_BOARD_LD21_GLOBAL,
  188. };
  189. #endif
  190. struct uniphier_board_id {
  191. const char *compatible;
  192. const struct uniphier_board_data *param;
  193. };
  194. static const struct uniphier_board_id uniphier_boards[] = {
  195. #if defined(CONFIG_ARCH_UNIPHIER_SLD3)
  196. { "socionext,uniphier-sld3", &uniphier_sld3_data, },
  197. #endif
  198. #if defined(CONFIG_ARCH_UNIPHIER_LD4)
  199. { "socionext,uniphier-ld4", &uniphier_ld4_data, },
  200. #endif
  201. #if defined(CONFIG_ARCH_UNIPHIER_PRO4)
  202. { "socionext,uniphier-pro4-ace", &uniphier_pro4_2g_data, },
  203. { "socionext,uniphier-pro4-sanji", &uniphier_pro4_2g_data, },
  204. { "socionext,uniphier-pro4", &uniphier_pro4_data, },
  205. #endif
  206. #if defined(CONFIG_ARCH_UNIPHIER_SLD8)
  207. { "socionext,uniphier-sld8", &uniphier_sld8_data, },
  208. #endif
  209. #if defined(CONFIG_ARCH_UNIPHIER_PRO5)
  210. { "socionext,uniphier-pro5", &uniphier_pro5_data, },
  211. #endif
  212. #if defined(CONFIG_ARCH_UNIPHIER_PXS2)
  213. { "socionext,uniphier-pxs2", &uniphier_pxs2_data, },
  214. #endif
  215. #if defined(CONFIG_ARCH_UNIPHIER_LD6B)
  216. { "socionext,uniphier-ld6b", &uniphier_ld6b_data, },
  217. #endif
  218. #if defined(CONFIG_ARCH_UNIPHIER_LD11)
  219. { "socionext,uniphier-ld11", &uniphier_ld11_data, },
  220. #endif
  221. #if defined(CONFIG_ARCH_UNIPHIER_LD20)
  222. { "socionext,uniphier-ld21", &uniphier_ld21_data, },
  223. { "socionext,uniphier-ld20-ref", &uniphier_ld20_ref_data, },
  224. { "socionext,uniphier-ld20", &uniphier_ld20_data, },
  225. #endif
  226. };
  227. const struct uniphier_board_data *uniphier_get_board_param(void)
  228. {
  229. int i;
  230. for (i = 0; i < ARRAY_SIZE(uniphier_boards); i++) {
  231. if (!fdt_node_check_compatible(gd->fdt_blob, 0,
  232. uniphier_boards[i].compatible))
  233. return uniphier_boards[i].param;
  234. }
  235. return NULL;
  236. }