p1010_serdes.c 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. /*
  2. * Copyright 2011 Freescale Semiconductor, Inc.
  3. * Author: Prabhakar Kushwaha <prabhakar@freescale.com>
  4. *
  5. * This program is free software; you can redistribute it and/or modify it
  6. * under the terms of the GNU General Public License as published by the Free
  7. * Software Foundation; either version 2 of the License, or (at your option)
  8. * any later version.
  9. */
  10. #include <config.h>
  11. #include <common.h>
  12. #include <asm/io.h>
  13. #include <asm/immap_85xx.h>
  14. #include <asm/fsl_serdes.h>
  15. #define SRDS1_MAX_LANES 4
  16. #define SRDS2_MAX_LANES 2
  17. static u32 serdes1_prtcl_map, serdes2_prtcl_map;
  18. static const u8 serdes1_cfg_tbl[][SRDS1_MAX_LANES] = {
  19. [0x00] = {NONE, NONE, NONE, NONE},
  20. [0x01] = {PCIE1, PCIE2, SGMII_TSEC2, SGMII_TSEC3},
  21. [0x02] = {PCIE1, SGMII_TSEC1, SGMII_TSEC2, SGMII_TSEC3},
  22. [0x03] = {NONE, SGMII_TSEC1, SGMII_TSEC2, SGMII_TSEC3},
  23. };
  24. static const u8 serdes2_cfg_tbl[][SRDS2_MAX_LANES] = {
  25. [0x00] = {NONE, NONE},
  26. [0x01] = {SATA1, SATA2},
  27. [0x02] = {SATA1, SATA2},
  28. [0x03] = {PCIE1, PCIE2},
  29. };
  30. int is_serdes_configured(enum srds_prtcl device)
  31. {
  32. int ret = (1 << device) & serdes1_prtcl_map;
  33. if (ret)
  34. return ret;
  35. return (1 << device) & serdes2_prtcl_map;
  36. }
  37. void fsl_serdes_init(void)
  38. {
  39. ccsr_gur_t *gur = (void *)CONFIG_SYS_MPC85xx_GUTS_ADDR;
  40. u32 pordevsr = in_be32(&gur->pordevsr);
  41. u32 srds_cfg = (pordevsr & MPC85xx_PORDEVSR_IO_SEL) >>
  42. MPC85xx_PORDEVSR_IO_SEL_SHIFT;
  43. int lane;
  44. debug("PORDEVSR[IO_SEL_SRDS] = %x\n", srds_cfg);
  45. if (srds_cfg > ARRAY_SIZE(serdes1_cfg_tbl)) {
  46. printf("Invalid PORDEVSR[IO_SEL_SRDS] = %d\n", srds_cfg);
  47. return;
  48. }
  49. for (lane = 0; lane < SRDS1_MAX_LANES; lane++) {
  50. enum srds_prtcl lane_prtcl = serdes1_cfg_tbl[srds_cfg][lane];
  51. serdes1_prtcl_map |= (1 << lane_prtcl);
  52. }
  53. if (srds_cfg > ARRAY_SIZE(serdes2_cfg_tbl)) {
  54. printf("Invalid PORDEVSR[IO_SEL_SRDS] = %d\n", srds_cfg);
  55. return;
  56. }
  57. for (lane = 0; lane < SRDS2_MAX_LANES; lane++) {
  58. enum srds_prtcl lane_prtcl = serdes2_cfg_tbl[srds_cfg][lane];
  59. serdes2_prtcl_map |= (1 << lane_prtcl);
  60. }
  61. }