t4240_serdes.c 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  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. static struct serdes_config serdes1_cfg_tbl[] = {
  32. /* SerDes 1 */
  33. {1, {XAUI_FM1_MAC9, XAUI_FM1_MAC9,
  34. XAUI_FM1_MAC9, XAUI_FM1_MAC9,
  35. XAUI_FM1_MAC10, XAUI_FM1_MAC10,
  36. XAUI_FM1_MAC10, XAUI_FM1_MAC10}},
  37. {2, {HIGIG_FM1_MAC9, HIGIG_FM1_MAC9,
  38. HIGIG_FM1_MAC9, HIGIG_FM1_MAC9,
  39. HIGIG_FM1_MAC10, HIGIG_FM1_MAC10,
  40. HIGIG_FM1_MAC10, HIGIG_FM1_MAC10}},
  41. {4, {HIGIG_FM1_MAC9, HIGIG_FM1_MAC9,
  42. HIGIG_FM1_MAC9, HIGIG_FM1_MAC9,
  43. HIGIG_FM1_MAC10, HIGIG_FM1_MAC10,
  44. HIGIG_FM1_MAC10, HIGIG_FM1_MAC10}},
  45. {28, {SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6,
  46. SGMII_FM1_DTSEC10, SGMII_FM1_DTSEC9,
  47. SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
  48. SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4}},
  49. {36, {SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6,
  50. SGMII_FM1_DTSEC10, SGMII_FM1_DTSEC9,
  51. SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
  52. SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4}},
  53. {38, {NONE, NONE, QSGMII_FM1_B, NONE,
  54. NONE, NONE, QSGMII_FM1_A, NONE}},
  55. {40, {SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6,
  56. SGMII_FM1_DTSEC10, SGMII_FM1_DTSEC9,
  57. NONE, NONE, QSGMII_FM1_A, NONE}},
  58. {46, {SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6,
  59. SGMII_FM1_DTSEC10, SGMII_FM1_DTSEC9,
  60. NONE, NONE, QSGMII_FM1_A, NONE}},
  61. {48, {SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6,
  62. SGMII_FM1_DTSEC10, SGMII_FM1_DTSEC9,
  63. NONE, NONE, QSGMII_FM1_A, NONE}},
  64. {}
  65. };
  66. static struct serdes_config serdes2_cfg_tbl[] = {
  67. /* SerDes 2 */
  68. {1, {XAUI_FM2_MAC9, XAUI_FM2_MAC9,
  69. XAUI_FM2_MAC9, XAUI_FM2_MAC9,
  70. XAUI_FM2_MAC10, XAUI_FM2_MAC10,
  71. XAUI_FM2_MAC10, XAUI_FM2_MAC10}},
  72. {2, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  73. HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  74. HIGIG_FM2_MAC10, HIGIG_FM2_MAC10,
  75. HIGIG_FM2_MAC10, HIGIG_FM2_MAC10}},
  76. {4, {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. {7, {XAUI_FM2_MAC9, XAUI_FM2_MAC9,
  81. XAUI_FM2_MAC9, XAUI_FM2_MAC9,
  82. SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
  83. SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4}},
  84. {13, {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. {14, {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. {16, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  93. HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  94. SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
  95. SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4}},
  96. {22, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  97. HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  98. SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
  99. SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4}},
  100. {23, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  101. HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  102. SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
  103. SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4}},
  104. {25, {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. {26, {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. {28, {SGMII_FM2_DTSEC5, SGMII_FM2_DTSEC6,
  113. SGMII_FM2_DTSEC10, SGMII_FM2_DTSEC9,
  114. SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
  115. SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4}},
  116. {36, {SGMII_FM2_DTSEC5, SGMII_FM2_DTSEC6,
  117. SGMII_FM2_DTSEC10, SGMII_FM2_DTSEC9,
  118. SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
  119. SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4}},
  120. {38, {NONE, NONE, QSGMII_FM2_B, NONE,
  121. NONE, NONE, QSGMII_FM1_A, NONE}},
  122. {40, {SGMII_FM2_DTSEC5, SGMII_FM2_DTSEC6,
  123. SGMII_FM2_DTSEC10, SGMII_FM2_DTSEC9,
  124. NONE, NONE, QSGMII_FM1_A, NONE}},
  125. {46, {SGMII_FM2_DTSEC5, SGMII_FM2_DTSEC6,
  126. SGMII_FM2_DTSEC10, SGMII_FM2_DTSEC9,
  127. NONE, NONE, QSGMII_FM1_A, NONE}},
  128. {48, {SGMII_FM2_DTSEC5, SGMII_FM2_DTSEC6,
  129. SGMII_FM2_DTSEC10, SGMII_FM2_DTSEC9,
  130. NONE, NONE, QSGMII_FM1_A, NONE}},
  131. {50, {XAUI_FM2_MAC9, XAUI_FM2_MAC9,
  132. XAUI_FM2_MAC9, XAUI_FM2_MAC9,
  133. NONE, NONE, QSGMII_FM1_A, NONE}},
  134. {52, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  135. HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  136. NONE, NONE, QSGMII_FM1_A, NONE}},
  137. {54, {HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  138. HIGIG_FM2_MAC9, HIGIG_FM2_MAC9,
  139. NONE, NONE, QSGMII_FM1_A, NONE}},
  140. {56, {XFI_FM1_MAC9, XFI_FM1_MAC10,
  141. XFI_FM2_MAC10, XFI_FM2_MAC9,
  142. SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
  143. SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4}},
  144. {57, {XFI_FM1_MAC9, XFI_FM1_MAC10,
  145. XFI_FM2_MAC10, XFI_FM2_MAC9,
  146. SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
  147. SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4}},
  148. {}
  149. };
  150. static struct serdes_config serdes3_cfg_tbl[] = {
  151. /* SerDes 3 */
  152. {2, {PCIE1, PCIE1, PCIE1, PCIE1, PCIE1, PCIE1, PCIE1, PCIE1}},
  153. {4, {PCIE1, PCIE1, PCIE1, PCIE1, PCIE2, PCIE2, PCIE2, PCIE2}},
  154. {6, {PCIE1, PCIE1, PCIE1, PCIE1, SRIO1, SRIO1, SRIO1, SRIO1}},
  155. {8, {PCIE1, PCIE1, PCIE1, PCIE1, SRIO1, NONE, NONE, NONE}},
  156. {9, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
  157. INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN}},
  158. {10, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
  159. INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN}},
  160. {12, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
  161. PCIE2, PCIE2, PCIE2, PCIE2}},
  162. {14, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
  163. PCIE2, PCIE2, PCIE2, PCIE2}},
  164. {16, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
  165. SRIO1, SRIO1, SRIO1, SRIO1}},
  166. {17, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
  167. SRIO1, SRIO1, SRIO1, SRIO1}},
  168. {19, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
  169. SRIO1, SRIO1, SRIO1, SRIO1}},
  170. {20, {INTERLAKEN, INTERLAKEN, INTERLAKEN, INTERLAKEN,
  171. SRIO1, SRIO1, SRIO1, SRIO1}},
  172. {}
  173. };
  174. static struct serdes_config serdes4_cfg_tbl[] = {
  175. /* SerDes 4 */
  176. {2, {PCIE3, PCIE3, PCIE3, PCIE3, PCIE3, PCIE3, PCIE3, PCIE3}},
  177. {4, {PCIE3, PCIE3, PCIE3, PCIE3, PCIE4, PCIE4, PCIE4, PCIE4}},
  178. {6, {PCIE3, PCIE3, PCIE3, PCIE3, SRIO2, SRIO2, SRIO2, SRIO2}},
  179. {8, {PCIE3, PCIE3, PCIE3, PCIE3, SRIO2, SRIO2, SRIO2, SRIO2}},
  180. {10, {PCIE3, PCIE3, PCIE3, PCIE3, PCIE4, PCIE4, SATA1, SATA2} },
  181. {12, {PCIE3, PCIE3, PCIE3, PCIE3, AURORA, AURORA, SATA1, SATA2} },
  182. {14, {PCIE3, PCIE3, PCIE3, PCIE3, AURORA, AURORA, SRIO2, SRIO2}},
  183. {16, {PCIE3, PCIE3, PCIE3, PCIE3, AURORA, AURORA, SRIO2, SRIO2}},
  184. {18, {PCIE3, PCIE3, PCIE3, PCIE3, AURORA, AURORA, AURORA, AURORA}},
  185. {}
  186. };
  187. static struct serdes_config *serdes_cfg_tbl[] = {
  188. serdes1_cfg_tbl,
  189. serdes2_cfg_tbl,
  190. serdes3_cfg_tbl,
  191. serdes4_cfg_tbl,
  192. };
  193. enum srds_prtcl serdes_get_prtcl(int serdes, int cfg, int lane)
  194. {
  195. struct serdes_config *ptr;
  196. if (serdes >= ARRAY_SIZE(serdes_cfg_tbl))
  197. return 0;
  198. ptr = serdes_cfg_tbl[serdes];
  199. while (ptr->protocol) {
  200. if (ptr->protocol == cfg)
  201. return ptr->lanes[lane];
  202. ptr++;
  203. }
  204. return 0;
  205. }
  206. int is_serdes_prtcl_valid(int serdes, u32 prtcl)
  207. {
  208. int i;
  209. struct serdes_config *ptr;
  210. if (serdes >= ARRAY_SIZE(serdes_cfg_tbl))
  211. return 0;
  212. ptr = serdes_cfg_tbl[serdes];
  213. while (ptr->protocol) {
  214. if (ptr->protocol == prtcl)
  215. break;
  216. ptr++;
  217. }
  218. if (!ptr->protocol)
  219. return 0;
  220. for (i = 0; i < SRDS_MAX_LANES; i++) {
  221. if (ptr->lanes[i] != NONE)
  222. return 1;
  223. }
  224. return 0;
  225. }