eth.c 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Copyright 2015-2016 Freescale Semiconductor, Inc.
  4. * Copyright 2017 NXP
  5. */
  6. #include <common.h>
  7. #include <dm.h>
  8. #include <asm/io.h>
  9. #include <netdev.h>
  10. #include <fm_eth.h>
  11. #include <fsl_mdio.h>
  12. #include <malloc.h>
  13. #include <asm/types.h>
  14. #include <fsl_dtsec.h>
  15. #include <asm/arch/soc.h>
  16. #include <asm/arch-fsl-layerscape/config.h>
  17. #include <asm/arch-fsl-layerscape/immap_lsch2.h>
  18. #include <asm/arch/fsl_serdes.h>
  19. #include "../common/qixis.h"
  20. #include <net/pfe_eth/pfe_eth.h>
  21. #include <dm/platform_data/pfe_dm_eth.h>
  22. #include "ls1012aqds_qixis.h"
  23. #define EMI_NONE 0xFF
  24. #define EMI1_RGMII 1
  25. #define EMI1_SLOT1 2
  26. #define EMI1_SLOT2 3
  27. #define DEFAULT_PFE_MDIO_NAME "PFE_MDIO"
  28. #define DEFAULT_PFE_MDIO1_NAME "PFE_MDIO1"
  29. static const char * const mdio_names[] = {
  30. "NULL",
  31. "LS1012AQDS_MDIO_RGMII",
  32. "LS1012AQDS_MDIO_SLOT1",
  33. "LS1012AQDS_MDIO_SLOT2",
  34. "NULL",
  35. };
  36. static const char *ls1012aqds_mdio_name_for_muxval(u8 muxval)
  37. {
  38. return mdio_names[muxval];
  39. }
  40. struct ls1012aqds_mdio {
  41. u8 muxval;
  42. struct mii_dev *realbus;
  43. };
  44. static void ls1012aqds_mux_mdio(u8 muxval)
  45. {
  46. u8 brdcfg4;
  47. if (muxval < 7) {
  48. brdcfg4 = QIXIS_READ(brdcfg[4]);
  49. brdcfg4 &= ~BRDCFG4_EMISEL_MASK;
  50. brdcfg4 |= (muxval << BRDCFG4_EMISEL_SHIFT);
  51. QIXIS_WRITE(brdcfg[4], brdcfg4);
  52. }
  53. }
  54. static int ls1012aqds_mdio_read(struct mii_dev *bus, int addr, int devad,
  55. int regnum)
  56. {
  57. struct ls1012aqds_mdio *priv = bus->priv;
  58. ls1012aqds_mux_mdio(priv->muxval);
  59. return priv->realbus->read(priv->realbus, addr, devad, regnum);
  60. }
  61. static int ls1012aqds_mdio_write(struct mii_dev *bus, int addr, int devad,
  62. int regnum, u16 value)
  63. {
  64. struct ls1012aqds_mdio *priv = bus->priv;
  65. ls1012aqds_mux_mdio(priv->muxval);
  66. return priv->realbus->write(priv->realbus, addr, devad, regnum, value);
  67. }
  68. static int ls1012aqds_mdio_reset(struct mii_dev *bus)
  69. {
  70. struct ls1012aqds_mdio *priv = bus->priv;
  71. if (priv->realbus->reset)
  72. return priv->realbus->reset(priv->realbus);
  73. else
  74. return -1;
  75. }
  76. static int ls1012aqds_mdio_init(char *realbusname, u8 muxval)
  77. {
  78. struct ls1012aqds_mdio *pmdio;
  79. struct mii_dev *bus = mdio_alloc();
  80. if (!bus) {
  81. printf("Failed to allocate ls1012aqds MDIO bus\n");
  82. return -1;
  83. }
  84. pmdio = malloc(sizeof(*pmdio));
  85. if (!pmdio) {
  86. printf("Failed to allocate ls1012aqds private data\n");
  87. free(bus);
  88. return -1;
  89. }
  90. bus->read = ls1012aqds_mdio_read;
  91. bus->write = ls1012aqds_mdio_write;
  92. bus->reset = ls1012aqds_mdio_reset;
  93. sprintf(bus->name, ls1012aqds_mdio_name_for_muxval(muxval));
  94. pmdio->realbus = miiphy_get_dev_by_name(realbusname);
  95. if (!pmdio->realbus) {
  96. printf("No bus with name %s\n", realbusname);
  97. free(bus);
  98. free(pmdio);
  99. return -1;
  100. }
  101. pmdio->muxval = muxval;
  102. bus->priv = pmdio;
  103. return mdio_register(bus);
  104. }
  105. int pfe_eth_board_init(struct udevice *dev)
  106. {
  107. static int init_done;
  108. struct mii_dev *bus;
  109. static const char *mdio_name;
  110. struct pfe_mdio_info mac_mdio_info;
  111. struct ccsr_gur __iomem *gur = (void *)CONFIG_SYS_FSL_GUTS_ADDR;
  112. u8 data8;
  113. struct pfe_eth_dev *priv = dev_get_priv(dev);
  114. int srds_s1 = in_be32(&gur->rcwsr[4]) &
  115. FSL_CHASSIS2_RCWSR4_SRDS1_PRTCL_MASK;
  116. srds_s1 >>= FSL_CHASSIS2_RCWSR4_SRDS1_PRTCL_SHIFT;
  117. ls1012aqds_mux_mdio(EMI1_SLOT1);
  118. if (!init_done) {
  119. mac_mdio_info.reg_base = (void *)EMAC1_BASE_ADDR;
  120. mac_mdio_info.name = DEFAULT_PFE_MDIO_NAME;
  121. bus = pfe_mdio_init(&mac_mdio_info);
  122. if (!bus) {
  123. printf("Failed to register mdio\n");
  124. return -1;
  125. }
  126. init_done = 1;
  127. }
  128. if (priv->gemac_port) {
  129. mac_mdio_info.reg_base = (void *)EMAC2_BASE_ADDR;
  130. mac_mdio_info.name = DEFAULT_PFE_MDIO1_NAME;
  131. bus = pfe_mdio_init(&mac_mdio_info);
  132. if (!bus) {
  133. printf("Failed to register mdio\n");
  134. return -1;
  135. }
  136. }
  137. switch (srds_s1) {
  138. case 0x3508:
  139. printf("ls1012aqds:supported SerDes PRCTL= %d\n", srds_s1);
  140. #ifdef CONFIG_PFE_RGMII_RESET_WA
  141. /*
  142. * Work around for FPGA registers initialization
  143. * This is needed for RGMII to work.
  144. */
  145. printf("Reset RGMII WA....\n");
  146. data8 = QIXIS_READ(rst_frc[0]);
  147. data8 |= 0x2;
  148. QIXIS_WRITE(rst_frc[0], data8);
  149. data8 = QIXIS_READ(rst_frc[0]);
  150. data8 = QIXIS_READ(res8[6]);
  151. data8 |= 0xff;
  152. QIXIS_WRITE(res8[6], data8);
  153. data8 = QIXIS_READ(res8[6]);
  154. #endif
  155. if (priv->gemac_port) {
  156. mdio_name = ls1012aqds_mdio_name_for_muxval(EMI1_RGMII);
  157. if (ls1012aqds_mdio_init(DEFAULT_PFE_MDIO_NAME, EMI1_RGMII)
  158. < 0) {
  159. printf("Failed to register mdio for %s\n", mdio_name);
  160. }
  161. /* MAC2 */
  162. mdio_name = ls1012aqds_mdio_name_for_muxval(EMI1_RGMII);
  163. bus = miiphy_get_dev_by_name(mdio_name);
  164. pfe_set_mdio(priv->gemac_port, bus);
  165. pfe_set_phy_address_mode(priv->gemac_port,
  166. CONFIG_PFE_EMAC2_PHY_ADDR,
  167. PHY_INTERFACE_MODE_RGMII);
  168. } else {
  169. mdio_name = ls1012aqds_mdio_name_for_muxval(EMI1_SLOT1);
  170. if (ls1012aqds_mdio_init(DEFAULT_PFE_MDIO_NAME, EMI1_SLOT1)
  171. < 0) {
  172. printf("Failed to register mdio for %s\n", mdio_name);
  173. }
  174. /* MAC1 */
  175. mdio_name = ls1012aqds_mdio_name_for_muxval(EMI1_SLOT1);
  176. bus = miiphy_get_dev_by_name(mdio_name);
  177. pfe_set_mdio(priv->gemac_port, bus);
  178. pfe_set_phy_address_mode(priv->gemac_port,
  179. CONFIG_PFE_EMAC1_PHY_ADDR,
  180. PHY_INTERFACE_MODE_SGMII);
  181. }
  182. break;
  183. case 0x2205:
  184. printf("ls1012aqds:supported SerDes PRCTL= %d\n", srds_s1);
  185. /*
  186. * Work around for FPGA registers initialization
  187. * This is needed for RGMII to work.
  188. */
  189. printf("Reset SLOT1 SLOT2....\n");
  190. data8 = QIXIS_READ(rst_frc[2]);
  191. data8 |= 0xc0;
  192. QIXIS_WRITE(rst_frc[2], data8);
  193. mdelay(100);
  194. data8 = QIXIS_READ(rst_frc[2]);
  195. data8 &= 0x3f;
  196. QIXIS_WRITE(rst_frc[2], data8);
  197. if (priv->gemac_port) {
  198. mdio_name = ls1012aqds_mdio_name_for_muxval(EMI1_SLOT2);
  199. if (ls1012aqds_mdio_init(DEFAULT_PFE_MDIO_NAME, EMI1_SLOT2)
  200. < 0) {
  201. printf("Failed to register mdio for %s\n", mdio_name);
  202. }
  203. /* MAC2 */
  204. mdio_name = ls1012aqds_mdio_name_for_muxval(EMI1_SLOT2);
  205. bus = miiphy_get_dev_by_name(mdio_name);
  206. pfe_set_mdio(1, bus);
  207. pfe_set_phy_address_mode(1, CONFIG_PFE_SGMII_2500_PHY2_ADDR,
  208. PHY_INTERFACE_MODE_SGMII_2500);
  209. data8 = QIXIS_READ(brdcfg[12]);
  210. data8 |= 0x20;
  211. QIXIS_WRITE(brdcfg[12], data8);
  212. } else {
  213. mdio_name = ls1012aqds_mdio_name_for_muxval(EMI1_SLOT1);
  214. if (ls1012aqds_mdio_init(DEFAULT_PFE_MDIO_NAME, EMI1_SLOT1)
  215. < 0) {
  216. printf("Failed to register mdio for %s\n", mdio_name);
  217. }
  218. /* MAC1 */
  219. mdio_name = ls1012aqds_mdio_name_for_muxval(EMI1_SLOT1);
  220. bus = miiphy_get_dev_by_name(mdio_name);
  221. pfe_set_mdio(0, bus);
  222. pfe_set_phy_address_mode(0,
  223. CONFIG_PFE_SGMII_2500_PHY1_ADDR,
  224. PHY_INTERFACE_MODE_SGMII_2500);
  225. }
  226. break;
  227. default:
  228. printf("ls1012aqds:unsupported SerDes PRCTL= %d\n", srds_s1);
  229. break;
  230. }
  231. return 0;
  232. }
  233. static struct pfe_eth_pdata pfe_pdata0 = {
  234. .pfe_eth_pdata_mac = {
  235. .iobase = (phys_addr_t)EMAC1_BASE_ADDR,
  236. .phy_interface = 0,
  237. },
  238. .pfe_ddr_addr = {
  239. .ddr_pfe_baseaddr = (void *)CONFIG_DDR_PFE_BASEADDR,
  240. .ddr_pfe_phys_baseaddr = CONFIG_DDR_PFE_PHYS_BASEADDR,
  241. },
  242. };
  243. static struct pfe_eth_pdata pfe_pdata1 = {
  244. .pfe_eth_pdata_mac = {
  245. .iobase = (phys_addr_t)EMAC2_BASE_ADDR,
  246. .phy_interface = 1,
  247. },
  248. .pfe_ddr_addr = {
  249. .ddr_pfe_baseaddr = (void *)CONFIG_DDR_PFE_BASEADDR,
  250. .ddr_pfe_phys_baseaddr = CONFIG_DDR_PFE_PHYS_BASEADDR,
  251. },
  252. };
  253. U_BOOT_DEVICE(ls1012a_pfe0) = {
  254. .name = "pfe_eth",
  255. .platdata = &pfe_pdata0,
  256. };
  257. U_BOOT_DEVICE(ls1012a_pfe1) = {
  258. .name = "pfe_eth",
  259. .platdata = &pfe_pdata1,
  260. };