ls1012a_serdes.c 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Copyright 2016 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. {0x2208, {SGMII_2500_FM1_DTSEC1, SGMII_2500_FM1_DTSEC2, NONE, SATA1} },
  14. {0x0008, {NONE, NONE, NONE, SATA1} },
  15. {0x3508, {SGMII_FM1_DTSEC1, PCIE1, NONE, SATA1} },
  16. {0x3305, {SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2, NONE, PCIE1} },
  17. {0x2205, {SGMII_2500_FM1_DTSEC1, SGMII_2500_FM1_DTSEC2, NONE, PCIE1} },
  18. {0x2305, {SGMII_2500_FM1_DTSEC1, SGMII_FM1_DTSEC2, NONE, PCIE1} },
  19. {0x9508, {TX_CLK, PCIE1, NONE, SATA1} },
  20. {0x3905, {SGMII_FM1_DTSEC1, TX_CLK, NONE, PCIE1} },
  21. {0x9305, {TX_CLK, SGMII_FM1_DTSEC2, NONE, PCIE1} },
  22. {}
  23. };
  24. static struct serdes_config *serdes_cfg_tbl[] = {
  25. serdes1_cfg_tbl,
  26. };
  27. enum srds_prtcl serdes_get_prtcl(int serdes, int cfg, int lane)
  28. {
  29. struct serdes_config *ptr;
  30. if (serdes >= ARRAY_SIZE(serdes_cfg_tbl))
  31. return 0;
  32. ptr = serdes_cfg_tbl[serdes];
  33. while (ptr->protocol) {
  34. if (ptr->protocol == cfg)
  35. return ptr->lanes[lane];
  36. ptr++;
  37. }
  38. return 0;
  39. }
  40. int is_serdes_prtcl_valid(int serdes, u32 prtcl)
  41. {
  42. int i;
  43. struct serdes_config *ptr;
  44. if (serdes >= ARRAY_SIZE(serdes_cfg_tbl))
  45. return 0;
  46. ptr = serdes_cfg_tbl[serdes];
  47. while (ptr->protocol) {
  48. if (ptr->protocol == prtcl)
  49. break;
  50. ptr++;
  51. }
  52. if (!ptr->protocol)
  53. return 0;
  54. for (i = 0; i < SRDS_MAX_LANES; i++) {
  55. if (ptr->lanes[i] != NONE)
  56. return 1;
  57. }
  58. return 0;
  59. }