ls1043a_serdes.c 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Copyright 2015 Freescale Semiconductor, Inc.
  4. */
  5. #include <common.h>
  6. #include <asm/arch/fsl_serdes.h>
  7. #include <asm/arch/immap_lsch2.h>
  8. struct serdes_config {
  9. u32 protocol;
  10. u8 lanes[SRDS_MAX_LANES];
  11. };
  12. static struct serdes_config serdes1_cfg_tbl[] = {
  13. /* SerDes 1 */
  14. {0x1555, {XFI_FM1_MAC9, PCIE1, PCIE2, PCIE3} },
  15. {0x2555, {SGMII_2500_FM1_DTSEC9, PCIE1, PCIE2, PCIE3} },
  16. {0x4555, {QSGMII_FM1_A, PCIE1, PCIE2, PCIE3} },
  17. {0x4558, {QSGMII_FM1_A, PCIE1, PCIE2, SATA1} },
  18. {0x1355, {XFI_FM1_MAC9, SGMII_FM1_DTSEC2, PCIE2, PCIE3} },
  19. {0x2355, {SGMII_2500_FM1_DTSEC9, SGMII_FM1_DTSEC2, PCIE2, PCIE3} },
  20. {0x3335, {SGMII_FM1_DTSEC9, SGMII_FM1_DTSEC2, SGMII_FM1_DTSEC5,
  21. PCIE3} },
  22. {0x3355, {SGMII_FM1_DTSEC9, SGMII_FM1_DTSEC2, PCIE2, PCIE3} },
  23. {0x3358, {SGMII_FM1_DTSEC9, SGMII_FM1_DTSEC2, PCIE2, SATA1} },
  24. {0x3555, {SGMII_FM1_DTSEC9, PCIE1, PCIE2, PCIE3} },
  25. {0x3558, {SGMII_FM1_DTSEC9, PCIE1, PCIE2, SATA1} },
  26. {0x7000, {PCIE1, PCIE1, PCIE1, PCIE1} },
  27. {0x9998, {PCIE1, PCIE2, PCIE3, SATA1} },
  28. {0x6058, {PCIE1, PCIE1, PCIE2, SATA1} },
  29. {0x1455, {XFI_FM1_MAC9, QSGMII_FM1_A, PCIE2, PCIE3} },
  30. {0x2455, {SGMII_2500_FM1_DTSEC9, QSGMII_FM1_A, PCIE2, PCIE3} },
  31. {0x2255, {SGMII_2500_FM1_DTSEC9, SGMII_2500_FM1_DTSEC2, PCIE2, PCIE3} },
  32. {0x3333, {SGMII_FM1_DTSEC9, SGMII_FM1_DTSEC2, SGMII_FM1_DTSEC5,
  33. SGMII_FM1_DTSEC6} },
  34. {}
  35. };
  36. static struct serdes_config *serdes_cfg_tbl[] = {
  37. serdes1_cfg_tbl,
  38. };
  39. enum srds_prtcl serdes_get_prtcl(int serdes, int cfg, int lane)
  40. {
  41. struct serdes_config *ptr;
  42. if (serdes >= ARRAY_SIZE(serdes_cfg_tbl))
  43. return 0;
  44. ptr = serdes_cfg_tbl[serdes];
  45. while (ptr->protocol) {
  46. if (ptr->protocol == cfg)
  47. return ptr->lanes[lane];
  48. ptr++;
  49. }
  50. return 0;
  51. }
  52. int is_serdes_prtcl_valid(int serdes, u32 prtcl)
  53. {
  54. int i;
  55. struct serdes_config *ptr;
  56. if (serdes >= ARRAY_SIZE(serdes_cfg_tbl))
  57. return 0;
  58. ptr = serdes_cfg_tbl[serdes];
  59. while (ptr->protocol) {
  60. if (ptr->protocol == prtcl)
  61. break;
  62. ptr++;
  63. }
  64. if (!ptr->protocol)
  65. return 0;
  66. for (i = 0; i < SRDS_MAX_LANES; i++) {
  67. if (ptr->lanes[i] != NONE)
  68. return 1;
  69. }
  70. return 0;
  71. }