t4240_serdes.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369
  1. /*
  2. * Copyright 2012 Freescale Semiconductor, Inc.
  3. *
  4. * See file CREDITS for list of people who contributed to this
  5. * project.
  6. *
  7. * This program is free software; you can redistribute it and/or
  8. * modify it under the terms of the GNU General Public License as
  9. * published by the Free Software Foundation; either version 2 of
  10. * the License, or (at your option) any later version.
  11. *
  12. * This program is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. * GNU General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU General Public License
  18. * along with this program; if not, write to the Free Software
  19. * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
  20. * MA 02111-1307 USA
  21. */
  22. #include <common.h>
  23. #include <asm/fsl_serdes.h>
  24. #include <asm/processor.h>
  25. #include <asm/io.h>
  26. #include "fsl_corenet2_serdes.h"
  27. struct serdes_config {
  28. u32 protocol;
  29. u8 lanes[SRDS_MAX_LANES];
  30. };
  31. #ifdef CONFIG_PPC_T4240
  32. static const struct serdes_config serdes1_cfg_tbl[] = {
  33. /* SerDes 1 */
  34. {1, {XAUI_FM1_MAC9, XAUI_FM1_MAC9,
  35. XAUI_FM1_MAC9, XAUI_FM1_MAC9,
  36. XAUI_FM1_MAC10, XAUI_FM1_MAC10,
  37. XAUI_FM1_MAC10, XAUI_FM1_MAC10}},
  38. {2, {HIGIG_FM1_MAC9, HIGIG_FM1_MAC9,
  39. HIGIG_FM1_MAC9, HIGIG_FM1_MAC9,
  40. HIGIG_FM1_MAC10, HIGIG_FM1_MAC10,
  41. HIGIG_FM1_MAC10, HIGIG_FM1_MAC10}},
  42. {4, {HIGIG_FM1_MAC9, HIGIG_FM1_MAC9,
  43. HIGIG_FM1_MAC9, HIGIG_FM1_MAC9,
  44. HIGIG_FM1_MAC10, HIGIG_FM1_MAC10,
  45. HIGIG_FM1_MAC10, HIGIG_FM1_MAC10}},
  46. {28, {SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6,
  47. SGMII_FM1_DTSEC10, SGMII_FM1_DTSEC9,
  48. SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
  49. SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4}},
  50. {36, {SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6,
  51. SGMII_FM1_DTSEC10, SGMII_FM1_DTSEC9,
  52. SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
  53. SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4}},
  54. {38, {NONE, NONE, QSGMII_FM1_B, NONE,
  55. NONE, NONE, QSGMII_FM1_A, NONE}},
  56. {40, {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. {48, {SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6,
  63. SGMII_FM1_DTSEC10, SGMII_FM1_DTSEC9,
  64. NONE, NONE, QSGMII_FM1_A, NONE}},
  65. {}
  66. };
  67. static const struct serdes_config serdes2_cfg_tbl[] = {
  68. /* SerDes 2 */
  69. {1, {XAUI_FM2_MAC9, XAUI_FM2_MAC9,
  70. XAUI_FM2_MAC9, XAUI_FM2_MAC9,
  71. XAUI_FM2_MAC10, XAUI_FM2_MAC10,
  72. XAUI_FM2_MAC10, XAUI_FM2_MAC10}},
  73. {2, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  74. HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  75. HIGIG_FM2_MAC10, HIGIG_FM2_MAC10,
  76. HIGIG_FM2_MAC10, HIGIG_FM2_MAC10}},
  77. {4, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  78. HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  79. HIGIG_FM2_MAC10, HIGIG_FM2_MAC10,
  80. HIGIG_FM2_MAC10, HIGIG_FM2_MAC10}},
  81. {7, {XAUI_FM2_MAC9, XAUI_FM2_MAC9,
  82. XAUI_FM2_MAC9, XAUI_FM2_MAC9,
  83. SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
  84. SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4}},
  85. {13, {XAUI_FM2_MAC9, XAUI_FM2_MAC9,
  86. XAUI_FM2_MAC9, XAUI_FM2_MAC9,
  87. SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
  88. SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4}},
  89. {14, {XAUI_FM2_MAC9, XAUI_FM2_MAC9,
  90. XAUI_FM2_MAC9, XAUI_FM2_MAC9,
  91. SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
  92. SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4}},
  93. {16, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  94. HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  95. SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
  96. SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4}},
  97. {22, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  98. HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  99. SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
  100. SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4}},
  101. {23, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  102. HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  103. SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
  104. SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4}},
  105. {25, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  106. HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  107. SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
  108. SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4}},
  109. {26, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  110. HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  111. SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
  112. SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4}},
  113. {28, {SGMII_FM2_DTSEC5, SGMII_FM2_DTSEC6,
  114. SGMII_FM2_DTSEC10, SGMII_FM2_DTSEC9,
  115. SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
  116. SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4}},
  117. {36, {SGMII_FM2_DTSEC5, SGMII_FM2_DTSEC6,
  118. SGMII_FM2_DTSEC10, SGMII_FM2_DTSEC9,
  119. SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
  120. SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4}},
  121. {38, {NONE, NONE, QSGMII_FM2_B, NONE,
  122. NONE, NONE, QSGMII_FM1_A, NONE}},
  123. {40, {SGMII_FM2_DTSEC5, SGMII_FM2_DTSEC6,
  124. SGMII_FM2_DTSEC10, SGMII_FM2_DTSEC9,
  125. NONE, NONE, QSGMII_FM1_A, NONE}},
  126. {46, {SGMII_FM2_DTSEC5, SGMII_FM2_DTSEC6,
  127. SGMII_FM2_DTSEC10, SGMII_FM2_DTSEC9,
  128. NONE, NONE, QSGMII_FM1_A, NONE}},
  129. {48, {SGMII_FM2_DTSEC5, SGMII_FM2_DTSEC6,
  130. SGMII_FM2_DTSEC10, SGMII_FM2_DTSEC9,
  131. NONE, NONE, QSGMII_FM1_A, NONE}},
  132. {50, {XAUI_FM2_MAC9, XAUI_FM2_MAC9,
  133. XAUI_FM2_MAC9, XAUI_FM2_MAC9,
  134. NONE, NONE, QSGMII_FM1_A, NONE}},
  135. {52, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  136. HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  137. NONE, NONE, QSGMII_FM1_A, NONE}},
  138. {54, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  139. HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  140. NONE, NONE, QSGMII_FM1_A, NONE}},
  141. {56, {XFI_FM1_MAC9, XFI_FM1_MAC10,
  142. XFI_FM2_MAC10, XFI_FM2_MAC9,
  143. SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
  144. SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4}},
  145. {57, {XFI_FM1_MAC9, XFI_FM1_MAC10,
  146. XFI_FM2_MAC10, XFI_FM2_MAC9,
  147. SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
  148. SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4}},
  149. {}
  150. };
  151. static const struct serdes_config serdes3_cfg_tbl[] = {
  152. /* SerDes 3 */
  153. {2, {PCIE1, PCIE1, PCIE1, PCIE1, PCIE1, PCIE1, PCIE1, PCIE1}},
  154. {4, {PCIE1, PCIE1, PCIE1, PCIE1, PCIE2, PCIE2, PCIE2, PCIE2}},
  155. {6, {PCIE1, PCIE1, PCIE1, PCIE1, SRIO1, SRIO1, SRIO1, SRIO1}},
  156. {8, {PCIE1, PCIE1, PCIE1, PCIE1, SRIO1, NONE, NONE, NONE}},
  157. {9, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
  158. INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN}},
  159. {10, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
  160. INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN}},
  161. {12, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
  162. PCIE2, PCIE2, PCIE2, PCIE2}},
  163. {14, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
  164. PCIE2, PCIE2, PCIE2, PCIE2}},
  165. {16, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
  166. SRIO1, SRIO1, SRIO1, SRIO1}},
  167. {17, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
  168. SRIO1, SRIO1, SRIO1, SRIO1}},
  169. {19, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
  170. SRIO1, SRIO1, SRIO1, SRIO1}},
  171. {20, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
  172. SRIO1, SRIO1, SRIO1, SRIO1}},
  173. {}
  174. };
  175. static const struct serdes_config serdes4_cfg_tbl[] = {
  176. /* SerDes 4 */
  177. {2, {PCIE3, PCIE3, PCIE3, PCIE3, PCIE3, PCIE3, PCIE3, PCIE3}},
  178. {4, {PCIE3, PCIE3, PCIE3, PCIE3, PCIE4, PCIE4, PCIE4, PCIE4}},
  179. {6, {PCIE3, PCIE3, PCIE3, PCIE3, SRIO2, SRIO2, SRIO2, SRIO2}},
  180. {8, {PCIE3, PCIE3, PCIE3, PCIE3, SRIO2, SRIO2, SRIO2, SRIO2}},
  181. {10, {PCIE3, PCIE3, PCIE3, PCIE3, PCIE4, PCIE4, SATA1, SATA2} },
  182. {12, {PCIE3, PCIE3, PCIE3, PCIE3, AURORA, AURORA, SATA1, SATA2} },
  183. {14, {PCIE3, PCIE3, PCIE3, PCIE3, AURORA, AURORA, SRIO2, SRIO2}},
  184. {16, {PCIE3, PCIE3, PCIE3, PCIE3, AURORA, AURORA, SRIO2, SRIO2}},
  185. {18, {PCIE3, PCIE3, PCIE3, PCIE3, AURORA, AURORA, AURORA, AURORA}},
  186. {}
  187. };
  188. #elif defined(CONFIG_PPC_T4160)
  189. static const struct serdes_config serdes1_cfg_tbl[] = {
  190. /* SerDes 1 */
  191. {1, {XAUI_FM1_MAC9, XAUI_FM1_MAC9,
  192. XAUI_FM1_MAC9, XAUI_FM1_MAC9,
  193. XAUI_FM1_MAC10, XAUI_FM1_MAC10,
  194. XAUI_FM1_MAC10, XAUI_FM1_MAC10} },
  195. {2, {HIGIG_FM1_MAC9, HIGIG_FM1_MAC9,
  196. HIGIG_FM1_MAC9, HIGIG_FM1_MAC9,
  197. HIGIG_FM1_MAC10, HIGIG_FM1_MAC10,
  198. HIGIG_FM1_MAC10, HIGIG_FM1_MAC10} },
  199. {4, {HIGIG_FM1_MAC9, HIGIG_FM1_MAC9,
  200. HIGIG_FM1_MAC9, HIGIG_FM1_MAC9,
  201. HIGIG_FM1_MAC10, HIGIG_FM1_MAC10,
  202. HIGIG_FM1_MAC10, HIGIG_FM1_MAC10} },
  203. {28, {SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6,
  204. SGMII_FM1_DTSEC10, SGMII_FM1_DTSEC9,
  205. SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
  206. SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4} },
  207. {36, {SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6,
  208. SGMII_FM1_DTSEC10, SGMII_FM1_DTSEC9,
  209. SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
  210. SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4} },
  211. {38, {NONE, NONE, QSGMII_FM1_B, NONE,
  212. NONE, NONE, QSGMII_FM1_A, NONE} },
  213. {}
  214. };
  215. static const struct serdes_config serdes2_cfg_tbl[] = {
  216. /* SerDes 2 */
  217. {7, {XAUI_FM2_MAC9, XAUI_FM2_MAC9,
  218. XAUI_FM2_MAC9, XAUI_FM2_MAC9,
  219. SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
  220. SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4} },
  221. {13, {XAUI_FM2_MAC9, XAUI_FM2_MAC9,
  222. XAUI_FM2_MAC9, XAUI_FM2_MAC9,
  223. SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
  224. SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4} },
  225. {16, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  226. HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  227. SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
  228. SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4} },
  229. {22, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  230. HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  231. SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
  232. SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4} },
  233. {25, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  234. HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  235. SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
  236. SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4} },
  237. {26, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  238. HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  239. SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
  240. NONE, NONE} },
  241. {28, {SGMII_FM2_DTSEC5, SGMII_FM2_DTSEC6,
  242. SGMII_FM2_DTSEC10, SGMII_FM2_DTSEC9,
  243. SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
  244. SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4} },
  245. {36, {SGMII_FM2_DTSEC5, SGMII_FM2_DTSEC6,
  246. SGMII_FM2_DTSEC10, SGMII_FM2_DTSEC9,
  247. SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
  248. SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4} },
  249. {38, {NONE, NONE, QSGMII_FM2_B, NONE,
  250. NONE, QSGMII_FM1_A, NONE, NONE} },
  251. {40, {SGMII_FM2_DTSEC5, SGMII_FM2_DTSEC6,
  252. SGMII_FM2_DTSEC10, SGMII_FM2_DTSEC9,
  253. NONE, QSGMII_FM1_A, NONE, NONE} },
  254. {46, {SGMII_FM2_DTSEC5, SGMII_FM2_DTSEC6,
  255. SGMII_FM2_DTSEC10, SGMII_FM2_DTSEC9,
  256. NONE, QSGMII_FM1_A, NONE, NONE} },
  257. {48, {SGMII_FM2_DTSEC5, SGMII_FM2_DTSEC6,
  258. SGMII_FM2_DTSEC10, SGMII_FM2_DTSEC9,
  259. NONE, QSGMII_FM1_A, NONE, NONE} },
  260. {50, {XAUI_FM2_MAC9, XAUI_FM2_MAC9,
  261. XAUI_FM2_MAC9, XAUI_FM2_MAC9,
  262. NONE, NONE, NONE, NONE} },
  263. {52, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  264. HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  265. NONE, NONE, NONE, NONE} },
  266. {54, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  267. HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  268. NONE, NONE, NONE, NONE} },
  269. {56, {NONE, XFI_FM1_MAC10,
  270. XFI_FM2_MAC10, NONE,
  271. SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
  272. SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4} },
  273. {57, {NONE, XFI_FM1_MAC10,
  274. XFI_FM2_MAC10, NONE,
  275. SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
  276. NONE, NONE} },
  277. {}
  278. };
  279. static const struct serdes_config serdes3_cfg_tbl[] = {
  280. /* SerDes 3 */
  281. {2, {PCIE1, PCIE1, PCIE1, PCIE1, PCIE1, PCIE1, PCIE1, PCIE1} },
  282. {4, {PCIE1, PCIE1, PCIE1, PCIE1, PCIE2, PCIE2, PCIE2, PCIE2} },
  283. {6, {PCIE1, PCIE1, PCIE1, PCIE1, SRIO1, SRIO1, SRIO1, SRIO1} },
  284. {8, {PCIE1, PCIE1, PCIE1, PCIE1, SRIO1, NONE, NONE, NONE} },
  285. {9, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
  286. INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN} },
  287. {10, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
  288. INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN} },
  289. {12, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
  290. PCIE2, PCIE2, PCIE2, PCIE2} },
  291. {14, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
  292. PCIE2, PCIE2, PCIE2, PCIE2} },
  293. {16, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
  294. SRIO1, SRIO1, SRIO1, SRIO1} },
  295. {17, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
  296. SRIO1, SRIO1, SRIO1, SRIO1} },
  297. {19, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
  298. SRIO1, SRIO1, SRIO1, SRIO1} },
  299. {20, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
  300. NONE, NONE, NONE, NONE} },
  301. {}
  302. };
  303. static const struct serdes_config serdes4_cfg_tbl[] = {
  304. /* SerDes 4 */
  305. {4, {PCIE3, PCIE3, PCIE3, PCIE3, PCIE4, PCIE4, PCIE4, PCIE4} },
  306. {6, {SRIO2, SRIO2, SRIO2, SRIO2, SRIO2, SRIO2, SRIO2, SRIO2} },
  307. {8, {SRIO2, SRIO2, SRIO2, SRIO2, SRIO2, SRIO2, SRIO2, SRIO2} },
  308. {10, {PCIE3, PCIE3, PCIE3, PCIE3, SATA1, SATA1, SATA2, SATA2} },
  309. {12, {AURORA, AURORA, AURORA, AURORA, SATA1, SATA1, SATA2, SATA2} },
  310. {14, {AURORA, AURORA, AURORA, AURORA, SRIO2, SRIO2, SRIO2, SRIO2} },
  311. {16, {AURORA, AURORA, AURORA, AURORA, SRIO2, SRIO2, SRIO2, SRIO2} },
  312. {18, {AURORA, AURORA, AURORA, AURORA, AURORA, AURORA, AURORA, AURORA} },
  313. {}
  314. }
  315. ;
  316. #else
  317. #error "Need to define SerDes protocol"
  318. #endif
  319. static const struct serdes_config *serdes_cfg_tbl[] = {
  320. serdes1_cfg_tbl,
  321. serdes2_cfg_tbl,
  322. serdes3_cfg_tbl,
  323. serdes4_cfg_tbl,
  324. };
  325. enum srds_prtcl serdes_get_prtcl(int serdes, int cfg, int lane)
  326. {
  327. const struct serdes_config *ptr;
  328. if (serdes >= ARRAY_SIZE(serdes_cfg_tbl))
  329. return 0;
  330. ptr = serdes_cfg_tbl[serdes];
  331. while (ptr->protocol) {
  332. if (ptr->protocol == cfg)
  333. return ptr->lanes[lane];
  334. ptr++;
  335. }
  336. return 0;
  337. }
  338. int is_serdes_prtcl_valid(int serdes, u32 prtcl)
  339. {
  340. int i;
  341. const struct serdes_config *ptr;
  342. if (serdes >= ARRAY_SIZE(serdes_cfg_tbl))
  343. return 0;
  344. ptr = serdes_cfg_tbl[serdes];
  345. while (ptr->protocol) {
  346. if (ptr->protocol == prtcl)
  347. break;
  348. ptr++;
  349. }
  350. if (!ptr->protocol)
  351. return 0;
  352. for (i = 0; i < SRDS_MAX_LANES; i++) {
  353. if (ptr->lanes[i] != NONE)
  354. return 1;
  355. }
  356. return 0;
  357. }