t4240.c 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. /*
  2. * Copyright 2012 Freescale Semiconductor, Inc.
  3. * Roy Zang <tie-fei.zang@freescale.com>
  4. *
  5. * This program is free software; you can redistribute it and/or
  6. * modify it under the terms of the GNU General Public License as
  7. * published by the Free Software Foundation; either version 2 of
  8. * the License, or (at your option) any later version.
  9. *
  10. * This program is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. *
  15. * You should have received a copy of the GNU General Public License
  16. * along with this program; if not, write to the Free Software
  17. * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
  18. * MA 02111-1307 USA
  19. */
  20. #include <common.h>
  21. #include <phy.h>
  22. #include <fm_eth.h>
  23. #include <asm/io.h>
  24. #include <asm/immap_85xx.h>
  25. #include <asm/fsl_serdes.h>
  26. u32 port_to_devdisr[] = {
  27. [FM1_DTSEC1] = FSL_CORENET_DEVDISR2_DTSEC1_1,
  28. [FM1_DTSEC2] = FSL_CORENET_DEVDISR2_DTSEC1_2,
  29. [FM1_DTSEC3] = FSL_CORENET_DEVDISR2_DTSEC1_3,
  30. [FM1_DTSEC4] = FSL_CORENET_DEVDISR2_DTSEC1_4,
  31. [FM1_DTSEC5] = FSL_CORENET_DEVDISR2_DTSEC1_5,
  32. [FM1_DTSEC6] = FSL_CORENET_DEVDISR2_DTSEC1_6,
  33. [FM1_DTSEC9] = FSL_CORENET_DEVDISR2_DTSEC1_9,
  34. [FM1_DTSEC10] = FSL_CORENET_DEVDISR2_DTSEC1_10,
  35. [FM1_10GEC1] = FSL_CORENET_DEVDISR2_10GEC1_1,
  36. [FM1_10GEC2] = FSL_CORENET_DEVDISR2_10GEC1_2,
  37. [FM2_DTSEC1] = FSL_CORENET_DEVDISR2_DTSEC2_1,
  38. [FM2_DTSEC2] = FSL_CORENET_DEVDISR2_DTSEC2_2,
  39. [FM2_DTSEC3] = FSL_CORENET_DEVDISR2_DTSEC2_3,
  40. [FM2_DTSEC4] = FSL_CORENET_DEVDISR2_DTSEC2_4,
  41. [FM2_DTSEC5] = FSL_CORENET_DEVDISR2_DTSEC2_5,
  42. [FM2_DTSEC6] = FSL_CORENET_DEVDISR2_DTSEC2_6,
  43. [FM2_DTSEC9] = FSL_CORENET_DEVDISR2_DTSEC2_9,
  44. [FM2_DTSEC10] = FSL_CORENET_DEVDISR2_DTSEC2_10,
  45. [FM2_10GEC1] = FSL_CORENET_DEVDISR2_10GEC2_1,
  46. [FM2_10GEC2] = FSL_CORENET_DEVDISR2_10GEC2_2,
  47. };
  48. static int is_device_disabled(enum fm_port port)
  49. {
  50. ccsr_gur_t *gur = (void __iomem *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
  51. u32 devdisr2 = in_be32(&gur->devdisr2);
  52. return port_to_devdisr[port] & devdisr2;
  53. }
  54. void fman_disable_port(enum fm_port port)
  55. {
  56. ccsr_gur_t *gur = (void __iomem *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
  57. setbits_be32(&gur->devdisr2, port_to_devdisr[port]);
  58. }
  59. phy_interface_t fman_port_enet_if(enum fm_port port)
  60. {
  61. ccsr_gur_t *gur = (void __iomem *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
  62. u32 rcwsr13 = in_be32(&gur->rcwsr[13]);
  63. if (is_device_disabled(port))
  64. return PHY_INTERFACE_MODE_NONE;
  65. if ((port == FM1_10GEC1 || port == FM1_10GEC2)
  66. && (is_serdes_configured(XAUI_FM1)))
  67. return PHY_INTERFACE_MODE_XGMII;
  68. if ((port == FM2_10GEC1 || port == FM2_10GEC2)
  69. && (is_serdes_configured(XAUI_FM2)))
  70. return PHY_INTERFACE_MODE_XGMII;
  71. #define FSL_CORENET_RCWSR13_EC1 0x60000000 /* bits 417..418 */
  72. #define FSL_CORENET_RCWSR13_EC1_FM2_DTSEC5_RGMII 0x00000000
  73. #define FSL_CORENET_RCWSR13_EC1_FM2_GPIO 0x40000000
  74. #define FSL_CORENET_RCWSR13_EC2 0x18000000 /* bits 419..420 */
  75. #define FSL_CORENET_RCWSR13_EC2_FM1_DTSEC5_RGMII 0x00000000
  76. #define FSL_CORENET_RCWSR13_EC2_FM2_DTSEC6_RGMII 0x08000000
  77. #define FSL_CORENET_RCWSR13_EC2_FM1_GPIO 0x10000000
  78. /* handle RGMII first */
  79. if ((port == FM2_DTSEC5) && ((rcwsr13 & FSL_CORENET_RCWSR13_EC1) ==
  80. FSL_CORENET_RCWSR13_EC1_FM2_DTSEC5_RGMII))
  81. return PHY_INTERFACE_MODE_RGMII;
  82. if ((port == FM1_DTSEC5) && ((rcwsr13 & FSL_CORENET_RCWSR13_EC2) ==
  83. FSL_CORENET_RCWSR13_EC2_FM1_DTSEC5_RGMII))
  84. return PHY_INTERFACE_MODE_RGMII;
  85. if ((port == FM2_DTSEC6) && ((rcwsr13 & FSL_CORENET_RCWSR13_EC2) ==
  86. FSL_CORENET_RCWSR13_EC2_FM2_DTSEC6_RGMII))
  87. return PHY_INTERFACE_MODE_RGMII;
  88. switch (port) {
  89. case FM1_DTSEC1:
  90. case FM1_DTSEC2:
  91. case FM1_DTSEC3:
  92. case FM1_DTSEC4:
  93. case FM1_DTSEC5:
  94. case FM1_DTSEC6:
  95. case FM1_DTSEC9:
  96. case FM1_DTSEC10:
  97. if (is_serdes_configured(SGMII_FM1_DTSEC1 + port - FM1_DTSEC1))
  98. return PHY_INTERFACE_MODE_SGMII;
  99. break;
  100. case FM2_DTSEC1:
  101. case FM2_DTSEC2:
  102. case FM2_DTSEC3:
  103. case FM2_DTSEC4:
  104. case FM2_DTSEC5:
  105. case FM2_DTSEC6:
  106. case FM2_DTSEC9:
  107. case FM2_DTSEC10:
  108. if (is_serdes_configured(SGMII_FM2_DTSEC1 + port - FM2_DTSEC1))
  109. return PHY_INTERFACE_MODE_SGMII;
  110. break;
  111. default:
  112. return PHY_INTERFACE_MODE_NONE;
  113. }
  114. return PHY_INTERFACE_MODE_NONE;
  115. }