t4240_serdes.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518
  1. /*
  2. * Copyright 2012 Freescale Semiconductor, Inc.
  3. *
  4. * SPDX-License-Identifier: GPL-2.0+
  5. */
  6. #include <common.h>
  7. #include <asm/fsl_serdes.h>
  8. #include <asm/processor.h>
  9. #include <asm/io.h>
  10. #include "fsl_corenet2_serdes.h"
  11. struct serdes_config {
  12. u32 protocol;
  13. u8 lanes[SRDS_MAX_LANES];
  14. };
  15. #ifdef CONFIG_ARCH_T4240
  16. static const struct serdes_config serdes1_cfg_tbl[] = {
  17. /* SerDes 1 */
  18. {1, {XAUI_FM1_MAC9, XAUI_FM1_MAC9,
  19. XAUI_FM1_MAC9, XAUI_FM1_MAC9,
  20. XAUI_FM1_MAC10, XAUI_FM1_MAC10,
  21. XAUI_FM1_MAC10, XAUI_FM1_MAC10}},
  22. {2, {HIGIG_FM1_MAC9, HIGIG_FM1_MAC9,
  23. HIGIG_FM1_MAC9, HIGIG_FM1_MAC9,
  24. HIGIG_FM1_MAC10, HIGIG_FM1_MAC10,
  25. HIGIG_FM1_MAC10, HIGIG_FM1_MAC10}},
  26. {4, {HIGIG_FM1_MAC9, HIGIG_FM1_MAC9,
  27. HIGIG_FM1_MAC9, HIGIG_FM1_MAC9,
  28. HIGIG_FM1_MAC10, HIGIG_FM1_MAC10,
  29. HIGIG_FM1_MAC10, HIGIG_FM1_MAC10}},
  30. {27, {SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6,
  31. SGMII_FM1_DTSEC10, SGMII_FM1_DTSEC9,
  32. SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
  33. SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4} },
  34. {28, {SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6,
  35. SGMII_FM1_DTSEC10, SGMII_FM1_DTSEC9,
  36. SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
  37. SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4}},
  38. {35, {SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6,
  39. SGMII_FM1_DTSEC10, SGMII_FM1_DTSEC9,
  40. SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
  41. SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4} },
  42. {36, {SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6,
  43. SGMII_FM1_DTSEC10, SGMII_FM1_DTSEC9,
  44. SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
  45. SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4}},
  46. {37, {NONE, NONE, QSGMII_FM1_B, NONE,
  47. NONE, NONE, QSGMII_FM1_A, NONE} },
  48. {38, {NONE, NONE, QSGMII_FM1_B, NONE,
  49. NONE, NONE, QSGMII_FM1_A, NONE}},
  50. {39, {SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6,
  51. SGMII_FM1_DTSEC10, SGMII_FM1_DTSEC9,
  52. NONE, NONE, QSGMII_FM1_A, NONE} },
  53. {40, {SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6,
  54. SGMII_FM1_DTSEC10, SGMII_FM1_DTSEC9,
  55. NONE, NONE, QSGMII_FM1_A, NONE}},
  56. {45, {SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6,
  57. SGMII_FM1_DTSEC10, SGMII_FM1_DTSEC9,
  58. NONE, NONE, QSGMII_FM1_A, NONE} },
  59. {46, {SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6,
  60. SGMII_FM1_DTSEC10, SGMII_FM1_DTSEC9,
  61. NONE, NONE, QSGMII_FM1_A, NONE}},
  62. {47, {SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6,
  63. SGMII_FM1_DTSEC10, SGMII_FM1_DTSEC9,
  64. NONE, NONE, QSGMII_FM1_A, NONE} },
  65. {48, {SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6,
  66. SGMII_FM1_DTSEC10, SGMII_FM1_DTSEC9,
  67. NONE, NONE, QSGMII_FM1_A, NONE}},
  68. {}
  69. };
  70. static const struct serdes_config serdes2_cfg_tbl[] = {
  71. /* SerDes 2 */
  72. {1, {XAUI_FM2_MAC9, XAUI_FM2_MAC9,
  73. XAUI_FM2_MAC9, XAUI_FM2_MAC9,
  74. XAUI_FM2_MAC10, XAUI_FM2_MAC10,
  75. XAUI_FM2_MAC10, XAUI_FM2_MAC10}},
  76. {2, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  77. HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  78. HIGIG_FM2_MAC10, HIGIG_FM2_MAC10,
  79. HIGIG_FM2_MAC10, HIGIG_FM2_MAC10}},
  80. {4, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  81. HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  82. HIGIG_FM2_MAC10, HIGIG_FM2_MAC10,
  83. HIGIG_FM2_MAC10, HIGIG_FM2_MAC10}},
  84. {6, {XAUI_FM2_MAC9, XAUI_FM2_MAC9,
  85. XAUI_FM2_MAC9, XAUI_FM2_MAC9,
  86. SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
  87. SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4} },
  88. {7, {XAUI_FM2_MAC9, XAUI_FM2_MAC9,
  89. XAUI_FM2_MAC9, XAUI_FM2_MAC9,
  90. SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
  91. SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4}},
  92. {12, {XAUI_FM2_MAC9, XAUI_FM2_MAC9,
  93. XAUI_FM2_MAC9, XAUI_FM2_MAC9,
  94. SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
  95. SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4} },
  96. {13, {XAUI_FM2_MAC9, XAUI_FM2_MAC9,
  97. XAUI_FM2_MAC9, XAUI_FM2_MAC9,
  98. SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
  99. SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4}},
  100. {14, {XAUI_FM2_MAC9, XAUI_FM2_MAC9,
  101. XAUI_FM2_MAC9, XAUI_FM2_MAC9,
  102. SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
  103. SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4}},
  104. {15, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  105. HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  106. SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
  107. SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4} },
  108. {16, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  109. HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  110. SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
  111. SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4}},
  112. {21, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  113. HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  114. SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
  115. SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4} },
  116. {22, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  117. HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  118. SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
  119. SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4}},
  120. {23, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  121. HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  122. SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
  123. SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4}},
  124. {24, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  125. HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  126. SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
  127. SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4} },
  128. {25, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  129. HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  130. SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
  131. SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4}},
  132. {26, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  133. HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  134. SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
  135. SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4}},
  136. {27, {SGMII_FM2_DTSEC5, SGMII_FM2_DTSEC6,
  137. SGMII_FM2_DTSEC10, SGMII_FM2_DTSEC9,
  138. SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
  139. SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4} },
  140. {28, {SGMII_FM2_DTSEC5, SGMII_FM2_DTSEC6,
  141. SGMII_FM2_DTSEC10, SGMII_FM2_DTSEC9,
  142. SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
  143. SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4}},
  144. {35, {SGMII_FM2_DTSEC5, SGMII_FM2_DTSEC6,
  145. SGMII_FM2_DTSEC10, SGMII_FM2_DTSEC9,
  146. SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
  147. SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4} },
  148. {36, {SGMII_FM2_DTSEC5, SGMII_FM2_DTSEC6,
  149. SGMII_FM2_DTSEC10, SGMII_FM2_DTSEC9,
  150. SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
  151. SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4}},
  152. {37, {NONE, NONE, QSGMII_FM2_B, NONE,
  153. NONE, NONE, QSGMII_FM2_A, NONE} },
  154. {38, {NONE, NONE, QSGMII_FM2_B, NONE,
  155. NONE, NONE, QSGMII_FM2_A, NONE} },
  156. {39, {SGMII_FM2_DTSEC5, SGMII_FM2_DTSEC6,
  157. SGMII_FM2_DTSEC10, SGMII_FM2_DTSEC9,
  158. NONE, NONE, QSGMII_FM2_A, NONE} },
  159. {40, {SGMII_FM2_DTSEC5, SGMII_FM2_DTSEC6,
  160. SGMII_FM2_DTSEC10, SGMII_FM2_DTSEC9,
  161. NONE, NONE, QSGMII_FM2_A, NONE} },
  162. {45, {SGMII_FM2_DTSEC5, SGMII_FM2_DTSEC6,
  163. SGMII_FM2_DTSEC10, SGMII_FM2_DTSEC9,
  164. NONE, NONE, QSGMII_FM2_A, NONE} },
  165. {46, {SGMII_FM2_DTSEC5, SGMII_FM2_DTSEC6,
  166. SGMII_FM2_DTSEC10, SGMII_FM2_DTSEC9,
  167. NONE, NONE, QSGMII_FM2_A, NONE} },
  168. {47, {SGMII_FM2_DTSEC5, SGMII_FM2_DTSEC6,
  169. SGMII_FM2_DTSEC10, SGMII_FM2_DTSEC9,
  170. NONE, NONE, QSGMII_FM2_A, NONE} },
  171. {48, {SGMII_FM2_DTSEC5, SGMII_FM2_DTSEC6,
  172. SGMII_FM2_DTSEC10, SGMII_FM2_DTSEC9,
  173. NONE, NONE, QSGMII_FM2_A, NONE} },
  174. {49, {XAUI_FM2_MAC9, XAUI_FM2_MAC9,
  175. XAUI_FM2_MAC9, XAUI_FM2_MAC9,
  176. NONE, NONE, QSGMII_FM2_A, NONE} },
  177. {50, {XAUI_FM2_MAC9, XAUI_FM2_MAC9,
  178. XAUI_FM2_MAC9, XAUI_FM2_MAC9,
  179. NONE, NONE, QSGMII_FM2_A, NONE} },
  180. {51, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  181. HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  182. NONE, NONE, QSGMII_FM2_A, NONE} },
  183. {52, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  184. HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  185. NONE, NONE, QSGMII_FM2_A, NONE} },
  186. {53, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  187. HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  188. NONE, NONE, QSGMII_FM2_A, NONE} },
  189. {54, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  190. HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  191. NONE, NONE, QSGMII_FM2_A, NONE} },
  192. {55, {XFI_FM1_MAC9, XFI_FM1_MAC10,
  193. XFI_FM2_MAC10, XFI_FM2_MAC9,
  194. SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
  195. SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4} },
  196. {56, {XFI_FM1_MAC9, XFI_FM1_MAC10,
  197. XFI_FM2_MAC10, XFI_FM2_MAC9,
  198. SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
  199. SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4}},
  200. {57, {XFI_FM1_MAC9, XFI_FM1_MAC10,
  201. XFI_FM2_MAC10, XFI_FM2_MAC9,
  202. SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
  203. SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4}},
  204. {}
  205. };
  206. static const struct serdes_config serdes3_cfg_tbl[] = {
  207. /* SerDes 3 */
  208. {1, {PCIE1, PCIE1, PCIE1, PCIE1, PCIE1, PCIE1, PCIE1, PCIE1} },
  209. {2, {PCIE1, PCIE1, PCIE1, PCIE1, PCIE1, PCIE1, PCIE1, PCIE1}},
  210. {3, {PCIE1, PCIE1, PCIE1, PCIE1, PCIE2, PCIE2, PCIE2, PCIE2} },
  211. {4, {PCIE1, PCIE1, PCIE1, PCIE1, PCIE2, PCIE2, PCIE2, PCIE2}},
  212. {5, {PCIE1, PCIE1, PCIE1, PCIE1, SRIO1, SRIO1, SRIO1, SRIO1} },
  213. {6, {PCIE1, PCIE1, PCIE1, PCIE1, SRIO1, SRIO1, SRIO1, SRIO1}},
  214. {7, {PCIE1, PCIE1, PCIE1, PCIE1, SRIO1, SRIO1, SRIO1, SRIO1} },
  215. {8, {PCIE1, PCIE1, PCIE1, PCIE1, SRIO1, SRIO1, SRIO1, SRIO1} },
  216. {9, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
  217. INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN}},
  218. {10, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
  219. INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN}},
  220. {11, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
  221. PCIE2, PCIE2, PCIE2, PCIE2} },
  222. {12, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
  223. PCIE2, PCIE2, PCIE2, PCIE2}},
  224. {13, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
  225. PCIE2, PCIE2, PCIE2, PCIE2} },
  226. {14, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
  227. PCIE2, PCIE2, PCIE2, PCIE2}},
  228. {15, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
  229. SRIO1, SRIO1, SRIO1, SRIO1} },
  230. {16, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
  231. SRIO1, SRIO1, SRIO1, SRIO1}},
  232. {17, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
  233. SRIO1, SRIO1, SRIO1, SRIO1}},
  234. {18, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
  235. SRIO1, SRIO1, SRIO1, SRIO1} },
  236. {19, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
  237. SRIO1, SRIO1, SRIO1, SRIO1}},
  238. {20, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
  239. SRIO1, SRIO1, SRIO1, SRIO1}},
  240. {}
  241. };
  242. static const struct serdes_config serdes4_cfg_tbl[] = {
  243. /* SerDes 4 */
  244. {1, {PCIE3, PCIE3, PCIE3, PCIE3, PCIE3, PCIE3, PCIE3, PCIE3} },
  245. {2, {PCIE3, PCIE3, PCIE3, PCIE3, PCIE3, PCIE3, PCIE3, PCIE3}},
  246. {3, {PCIE3, PCIE3, PCIE3, PCIE3, PCIE4, PCIE4, PCIE4, PCIE4} },
  247. {4, {PCIE3, PCIE3, PCIE3, PCIE3, PCIE4, PCIE4, PCIE4, PCIE4}},
  248. {5, {PCIE3, PCIE3, PCIE3, PCIE3, SRIO2, SRIO2, SRIO2, SRIO2} },
  249. {6, {PCIE3, PCIE3, PCIE3, PCIE3, SRIO2, SRIO2, SRIO2, SRIO2}},
  250. {7, {PCIE3, PCIE3, PCIE3, PCIE3, SRIO2, SRIO2, SRIO2, SRIO2} },
  251. {8, {PCIE3, PCIE3, PCIE3, PCIE3, SRIO2, SRIO2, SRIO2, SRIO2}},
  252. {9, {PCIE3, PCIE3, PCIE3, PCIE3, PCIE4, PCIE4, SATA1, SATA2} },
  253. {10, {PCIE3, PCIE3, PCIE3, PCIE3, PCIE4, PCIE4, SATA1, SATA2} },
  254. {11, {PCIE3, PCIE3, PCIE3, PCIE3, AURORA, AURORA, SATA1, SATA2} },
  255. {12, {PCIE3, PCIE3, PCIE3, PCIE3, AURORA, AURORA, SATA1, SATA2} },
  256. {13, {PCIE3, PCIE3, PCIE3, PCIE3, AURORA, AURORA, SRIO2, SRIO2} },
  257. {14, {PCIE3, PCIE3, PCIE3, PCIE3, AURORA, AURORA, SRIO2, SRIO2}},
  258. {15, {PCIE3, PCIE3, PCIE3, PCIE3, AURORA, AURORA, SRIO2, SRIO2} },
  259. {16, {PCIE3, PCIE3, PCIE3, PCIE3, AURORA, AURORA, SRIO2, SRIO2}},
  260. {18, {PCIE3, PCIE3, PCIE3, PCIE3, AURORA, AURORA, AURORA, AURORA}},
  261. {}
  262. };
  263. #elif defined(CONFIG_ARCH_T4160)
  264. static const struct serdes_config serdes1_cfg_tbl[] = {
  265. /* SerDes 1 */
  266. {1, {NONE, NONE, NONE, NONE,
  267. XAUI_FM1_MAC10, XAUI_FM1_MAC10,
  268. XAUI_FM1_MAC10, XAUI_FM1_MAC10} },
  269. {2, {NONE, NONE, NONE, NONE,
  270. HIGIG_FM1_MAC10, HIGIG_FM1_MAC10,
  271. HIGIG_FM1_MAC10, HIGIG_FM1_MAC10} },
  272. {4, {NONE, NONE, NONE, NONE,
  273. HIGIG_FM1_MAC10, HIGIG_FM1_MAC10,
  274. HIGIG_FM1_MAC10, HIGIG_FM1_MAC10} },
  275. {27, {NONE, NONE, NONE, NONE,
  276. SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
  277. SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4} },
  278. {28, {NONE, NONE, NONE, NONE,
  279. SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
  280. SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4} },
  281. {35, {NONE, NONE, NONE, NONE,
  282. SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
  283. SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4} },
  284. {36, {NONE, NONE, NONE, NONE,
  285. SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
  286. SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4} },
  287. {37, {NONE, NONE, NONE, NONE,
  288. NONE, NONE, QSGMII_FM1_A, NONE} },
  289. {38, {NONE, NONE, NONE, NONE,
  290. NONE, NONE, QSGMII_FM1_A, NONE} },
  291. {}
  292. };
  293. static const struct serdes_config serdes2_cfg_tbl[] = {
  294. /* SerDes 2 */
  295. {6, {XAUI_FM2_MAC9, XAUI_FM2_MAC9,
  296. XAUI_FM2_MAC9, XAUI_FM2_MAC9,
  297. SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
  298. SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4} },
  299. {7, {XAUI_FM2_MAC9, XAUI_FM2_MAC9,
  300. XAUI_FM2_MAC9, XAUI_FM2_MAC9,
  301. SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
  302. SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4} },
  303. {12, {XAUI_FM2_MAC9, XAUI_FM2_MAC9,
  304. XAUI_FM2_MAC9, XAUI_FM2_MAC9,
  305. SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
  306. SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4} },
  307. {13, {XAUI_FM2_MAC9, XAUI_FM2_MAC9,
  308. XAUI_FM2_MAC9, XAUI_FM2_MAC9,
  309. SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
  310. SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4} },
  311. {15, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  312. HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  313. SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
  314. SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4} },
  315. {16, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  316. HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  317. SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
  318. SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4} },
  319. {21, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  320. HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  321. SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
  322. SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4} },
  323. {22, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  324. HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  325. SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
  326. SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4} },
  327. {24, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  328. HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  329. SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
  330. SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4} },
  331. {25, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  332. HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  333. SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
  334. SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4} },
  335. {26, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  336. HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  337. SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
  338. NONE, NONE} },
  339. {27, {SGMII_FM2_DTSEC5, SGMII_FM2_DTSEC6,
  340. SGMII_FM2_DTSEC10, SGMII_FM2_DTSEC9,
  341. SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
  342. SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4} },
  343. {28, {SGMII_FM2_DTSEC5, SGMII_FM2_DTSEC6,
  344. SGMII_FM2_DTSEC10, SGMII_FM2_DTSEC9,
  345. SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
  346. SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4} },
  347. {35, {SGMII_FM2_DTSEC5, SGMII_FM2_DTSEC6,
  348. SGMII_FM2_DTSEC10, SGMII_FM2_DTSEC9,
  349. SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
  350. SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4} },
  351. {36, {SGMII_FM2_DTSEC5, SGMII_FM2_DTSEC6,
  352. SGMII_FM2_DTSEC10, SGMII_FM2_DTSEC9,
  353. SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
  354. SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4} },
  355. {37, {NONE, NONE, QSGMII_FM2_B, NONE,
  356. NONE, NONE, QSGMII_FM2_A, NONE} },
  357. {38, {NONE, NONE, QSGMII_FM2_B, NONE,
  358. NONE, NONE, QSGMII_FM2_A, NONE} },
  359. {39, {SGMII_FM2_DTSEC5, SGMII_FM2_DTSEC6,
  360. SGMII_FM2_DTSEC10, SGMII_FM2_DTSEC9,
  361. NONE, NONE, QSGMII_FM2_A, NONE} },
  362. {40, {SGMII_FM2_DTSEC5, SGMII_FM2_DTSEC6,
  363. SGMII_FM2_DTSEC10, SGMII_FM2_DTSEC9,
  364. NONE, NONE, QSGMII_FM2_A, NONE} },
  365. {45, {SGMII_FM2_DTSEC5, SGMII_FM2_DTSEC6,
  366. SGMII_FM2_DTSEC10, SGMII_FM2_DTSEC9,
  367. NONE, NONE, QSGMII_FM2_A, NONE} },
  368. {46, {SGMII_FM2_DTSEC5, SGMII_FM2_DTSEC6,
  369. SGMII_FM2_DTSEC10, SGMII_FM2_DTSEC9,
  370. NONE, NONE, QSGMII_FM2_A, NONE} },
  371. {47, {SGMII_FM2_DTSEC5, SGMII_FM2_DTSEC6,
  372. SGMII_FM2_DTSEC10, SGMII_FM2_DTSEC9,
  373. NONE, NONE, QSGMII_FM2_A, NONE} },
  374. {48, {SGMII_FM2_DTSEC5, SGMII_FM2_DTSEC6,
  375. SGMII_FM2_DTSEC10, SGMII_FM2_DTSEC9,
  376. NONE, NONE, QSGMII_FM2_A, NONE} },
  377. {49, {XAUI_FM2_MAC9, XAUI_FM2_MAC9,
  378. XAUI_FM2_MAC9, XAUI_FM2_MAC9,
  379. NONE, NONE, QSGMII_FM2_A, NONE} },
  380. {50, {XAUI_FM2_MAC9, XAUI_FM2_MAC9,
  381. XAUI_FM2_MAC9, XAUI_FM2_MAC9,
  382. NONE, NONE, QSGMII_FM2_A, NONE} },
  383. {51, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  384. HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  385. NONE, NONE, QSGMII_FM2_A, NONE} },
  386. {52, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  387. HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  388. NONE, NONE, QSGMII_FM2_A, NONE} },
  389. {53, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  390. HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  391. NONE, NONE, QSGMII_FM2_A, NONE} },
  392. {54, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  393. HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  394. NONE, NONE, QSGMII_FM2_A, NONE} },
  395. {55, {NONE, XFI_FM1_MAC10,
  396. XFI_FM2_MAC10, NONE,
  397. SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
  398. SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4} },
  399. {56, {NONE, XFI_FM1_MAC10,
  400. XFI_FM2_MAC10, NONE,
  401. SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
  402. SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4} },
  403. {57, {NONE, XFI_FM1_MAC10,
  404. XFI_FM2_MAC10, NONE,
  405. SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
  406. NONE, NONE} },
  407. {}
  408. };
  409. static const struct serdes_config serdes3_cfg_tbl[] = {
  410. /* SerDes 3 */
  411. {1, {PCIE1, PCIE1, PCIE1, PCIE1, PCIE1, PCIE1, PCIE1, PCIE1} },
  412. {2, {PCIE1, PCIE1, PCIE1, PCIE1, PCIE1, PCIE1, PCIE1, PCIE1} },
  413. {3, {PCIE1, PCIE1, PCIE1, PCIE1, PCIE2, PCIE2, PCIE2, PCIE2} },
  414. {4, {PCIE1, PCIE1, PCIE1, PCIE1, PCIE2, PCIE2, PCIE2, PCIE2} },
  415. {5, {PCIE1, PCIE1, PCIE1, PCIE1, SRIO1, SRIO1, SRIO1, SRIO1} },
  416. {6, {PCIE1, PCIE1, PCIE1, PCIE1, SRIO1, SRIO1, SRIO1, SRIO1} },
  417. {7, {PCIE1, PCIE1, PCIE1, PCIE1, SRIO1, SRIO1, SRIO1, SRIO1} },
  418. {8, {PCIE1, PCIE1, PCIE1, PCIE1, SRIO1, SRIO1, SRIO1, SRIO1} },
  419. {9, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
  420. INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN} },
  421. {10, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
  422. INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN} },
  423. {11, {NONE, NONE, NONE, NONE,
  424. PCIE2, PCIE2, PCIE2, PCIE2} },
  425. {12, {NONE, NONE, NONE, NONE,
  426. PCIE2, PCIE2, PCIE2, PCIE2} },
  427. {13, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
  428. PCIE2, PCIE2, PCIE2, PCIE2} },
  429. {14, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
  430. PCIE2, PCIE2, PCIE2, PCIE2} },
  431. {15, {NONE, NONE, NONE, NONE,
  432. SRIO1, SRIO1, SRIO1, SRIO1} },
  433. {16, {NONE, NONE, NONE, NONE,
  434. SRIO1, SRIO1, SRIO1, SRIO1} },
  435. {17, {NONE, NONE, NONE, NONE,
  436. SRIO1, SRIO1, SRIO1, SRIO1} },
  437. {18, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
  438. SRIO1, SRIO1, SRIO1, SRIO1} },
  439. {19, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
  440. SRIO1, SRIO1, SRIO1, SRIO1} },
  441. {20, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
  442. SRIO1, SRIO1, SRIO1, SRIO1} },
  443. {}
  444. };
  445. static const struct serdes_config serdes4_cfg_tbl[] = {
  446. /* SerDes 4 */
  447. {3, {NONE, NONE, NONE, NONE, PCIE4, PCIE4, PCIE4, PCIE4} },
  448. {4, {NONE, NONE, NONE, NONE, PCIE4, PCIE4, PCIE4, PCIE4} },
  449. {5, {NONE, NONE, NONE, NONE, SRIO2, SRIO2, SRIO2, SRIO2} },
  450. {6, {NONE, NONE, NONE, NONE, SRIO2, SRIO2, SRIO2, SRIO2} },
  451. {7, {NONE, NONE, NONE, NONE, SRIO2, SRIO2, SRIO2, SRIO2} },
  452. {8, {NONE, NONE, NONE, NONE, SRIO2, SRIO2, SRIO2, SRIO2} },
  453. {9, {NONE, NONE, NONE, NONE, PCIE4, PCIE4, SATA1, SATA2} },
  454. {10, {NONE, NONE, NONE, NONE, PCIE4, PCIE4, SATA1, SATA2} },
  455. {11, {NONE, NONE, NONE, NONE, AURORA, AURORA, SATA1, SATA2} },
  456. {12, {NONE, NONE, NONE, NONE, AURORA, AURORA, SATA1, SATA2} },
  457. {13, {NONE, NONE, NONE, NONE, AURORA, AURORA, SRIO2, SRIO2} },
  458. {14, {NONE, NONE, NONE, NONE, AURORA, AURORA, SRIO2, SRIO2} },
  459. {15, {NONE, NONE, NONE, NONE, AURORA, AURORA, SRIO2, SRIO2} },
  460. {16, {NONE, NONE, NONE, NONE, AURORA, AURORA, SRIO2, SRIO2} },
  461. {18, {NONE, NONE, NONE, NONE, AURORA, AURORA, AURORA, AURORA} },
  462. {}
  463. }
  464. ;
  465. #else
  466. #error "Need to define SerDes protocol"
  467. #endif
  468. static const struct serdes_config *serdes_cfg_tbl[] = {
  469. serdes1_cfg_tbl,
  470. serdes2_cfg_tbl,
  471. serdes3_cfg_tbl,
  472. serdes4_cfg_tbl,
  473. };
  474. enum srds_prtcl serdes_get_prtcl(int serdes, int cfg, int lane)
  475. {
  476. const struct serdes_config *ptr;
  477. if (serdes >= ARRAY_SIZE(serdes_cfg_tbl))
  478. return 0;
  479. ptr = serdes_cfg_tbl[serdes];
  480. while (ptr->protocol) {
  481. if (ptr->protocol == cfg)
  482. return ptr->lanes[lane];
  483. ptr++;
  484. }
  485. return 0;
  486. }
  487. int is_serdes_prtcl_valid(int serdes, u32 prtcl)
  488. {
  489. int i;
  490. const struct serdes_config *ptr;
  491. if (serdes >= ARRAY_SIZE(serdes_cfg_tbl))
  492. return 0;
  493. ptr = serdes_cfg_tbl[serdes];
  494. while (ptr->protocol) {
  495. if (ptr->protocol == prtcl)
  496. break;
  497. ptr++;
  498. }
  499. if (!ptr->protocol)
  500. return 0;
  501. for (i = 0; i < SRDS_MAX_LANES; i++) {
  502. if (ptr->lanes[i] != NONE)
  503. return 1;
  504. }
  505. return 0;
  506. }