rgmii.c 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * drivers/net/ethernet/ibm/emac/rgmii.c
  4. *
  5. * Driver for PowerPC 4xx on-chip ethernet controller, RGMII bridge support.
  6. *
  7. * Copyright 2007 Benjamin Herrenschmidt, IBM Corp.
  8. * <[email protected]>
  9. *
  10. * Based on the arch/ppc version of the driver:
  11. *
  12. * Copyright (c) 2004, 2005 Zultys Technologies.
  13. * Eugene Surovegin <[email protected]> or <[email protected]>
  14. *
  15. * Based on original work by
  16. * Matt Porter <[email protected]>
  17. * Copyright 2004 MontaVista Software, Inc.
  18. */
  19. #include <linux/slab.h>
  20. #include <linux/kernel.h>
  21. #include <linux/ethtool.h>
  22. #include <linux/of_address.h>
  23. #include <asm/io.h>
  24. #include "emac.h"
  25. #include "debug.h"
  26. // XXX FIXME: Axon seems to support a subset of the RGMII, we
  27. // thus need to take that into account and possibly change some
  28. // of the bit settings below that don't seem to quite match the
  29. // AXON spec
  30. /* RGMIIx_FER */
  31. #define RGMII_FER_MASK(idx) (0x7 << ((idx) * 4))
  32. #define RGMII_FER_RTBI(idx) (0x4 << ((idx) * 4))
  33. #define RGMII_FER_RGMII(idx) (0x5 << ((idx) * 4))
  34. #define RGMII_FER_TBI(idx) (0x6 << ((idx) * 4))
  35. #define RGMII_FER_GMII(idx) (0x7 << ((idx) * 4))
  36. #define RGMII_FER_MII(idx) RGMII_FER_GMII(idx)
  37. /* RGMIIx_SSR */
  38. #define RGMII_SSR_MASK(idx) (0x7 << ((idx) * 8))
  39. #define RGMII_SSR_10(idx) (0x1 << ((idx) * 8))
  40. #define RGMII_SSR_100(idx) (0x2 << ((idx) * 8))
  41. #define RGMII_SSR_1000(idx) (0x4 << ((idx) * 8))
  42. /* RGMII bridge supports only GMII/TBI and RGMII/RTBI PHYs */
  43. static inline int rgmii_valid_mode(int phy_mode)
  44. {
  45. return phy_interface_mode_is_rgmii(phy_mode) ||
  46. phy_mode == PHY_INTERFACE_MODE_GMII ||
  47. phy_mode == PHY_INTERFACE_MODE_MII ||
  48. phy_mode == PHY_INTERFACE_MODE_TBI ||
  49. phy_mode == PHY_INTERFACE_MODE_RTBI;
  50. }
  51. static inline u32 rgmii_mode_mask(int mode, int input)
  52. {
  53. switch (mode) {
  54. case PHY_INTERFACE_MODE_RGMII:
  55. case PHY_INTERFACE_MODE_RGMII_ID:
  56. case PHY_INTERFACE_MODE_RGMII_RXID:
  57. case PHY_INTERFACE_MODE_RGMII_TXID:
  58. return RGMII_FER_RGMII(input);
  59. case PHY_INTERFACE_MODE_TBI:
  60. return RGMII_FER_TBI(input);
  61. case PHY_INTERFACE_MODE_GMII:
  62. return RGMII_FER_GMII(input);
  63. case PHY_INTERFACE_MODE_MII:
  64. return RGMII_FER_MII(input);
  65. case PHY_INTERFACE_MODE_RTBI:
  66. return RGMII_FER_RTBI(input);
  67. default:
  68. BUG();
  69. }
  70. }
  71. int rgmii_attach(struct platform_device *ofdev, int input, int mode)
  72. {
  73. struct rgmii_instance *dev = platform_get_drvdata(ofdev);
  74. struct rgmii_regs __iomem *p = dev->base;
  75. RGMII_DBG(dev, "attach(%d)" NL, input);
  76. /* Check if we need to attach to a RGMII */
  77. if (input < 0 || !rgmii_valid_mode(mode)) {
  78. printk(KERN_ERR "%pOF: unsupported settings !\n",
  79. ofdev->dev.of_node);
  80. return -ENODEV;
  81. }
  82. mutex_lock(&dev->lock);
  83. /* Enable this input */
  84. out_be32(&p->fer, in_be32(&p->fer) | rgmii_mode_mask(mode, input));
  85. printk(KERN_NOTICE "%pOF: input %d in %s mode\n",
  86. ofdev->dev.of_node, input, phy_modes(mode));
  87. ++dev->users;
  88. mutex_unlock(&dev->lock);
  89. return 0;
  90. }
  91. void rgmii_set_speed(struct platform_device *ofdev, int input, int speed)
  92. {
  93. struct rgmii_instance *dev = platform_get_drvdata(ofdev);
  94. struct rgmii_regs __iomem *p = dev->base;
  95. u32 ssr;
  96. mutex_lock(&dev->lock);
  97. ssr = in_be32(&p->ssr) & ~RGMII_SSR_MASK(input);
  98. RGMII_DBG(dev, "speed(%d, %d)" NL, input, speed);
  99. if (speed == SPEED_1000)
  100. ssr |= RGMII_SSR_1000(input);
  101. else if (speed == SPEED_100)
  102. ssr |= RGMII_SSR_100(input);
  103. else if (speed == SPEED_10)
  104. ssr |= RGMII_SSR_10(input);
  105. out_be32(&p->ssr, ssr);
  106. mutex_unlock(&dev->lock);
  107. }
  108. void rgmii_get_mdio(struct platform_device *ofdev, int input)
  109. {
  110. struct rgmii_instance *dev = platform_get_drvdata(ofdev);
  111. struct rgmii_regs __iomem *p = dev->base;
  112. u32 fer;
  113. RGMII_DBG2(dev, "get_mdio(%d)" NL, input);
  114. if (!(dev->flags & EMAC_RGMII_FLAG_HAS_MDIO))
  115. return;
  116. mutex_lock(&dev->lock);
  117. fer = in_be32(&p->fer);
  118. fer |= 0x00080000u >> input;
  119. out_be32(&p->fer, fer);
  120. (void)in_be32(&p->fer);
  121. DBG2(dev, " fer = 0x%08x\n", fer);
  122. }
  123. void rgmii_put_mdio(struct platform_device *ofdev, int input)
  124. {
  125. struct rgmii_instance *dev = platform_get_drvdata(ofdev);
  126. struct rgmii_regs __iomem *p = dev->base;
  127. u32 fer;
  128. RGMII_DBG2(dev, "put_mdio(%d)" NL, input);
  129. if (!(dev->flags & EMAC_RGMII_FLAG_HAS_MDIO))
  130. return;
  131. fer = in_be32(&p->fer);
  132. fer &= ~(0x00080000u >> input);
  133. out_be32(&p->fer, fer);
  134. (void)in_be32(&p->fer);
  135. DBG2(dev, " fer = 0x%08x\n", fer);
  136. mutex_unlock(&dev->lock);
  137. }
  138. void rgmii_detach(struct platform_device *ofdev, int input)
  139. {
  140. struct rgmii_instance *dev = platform_get_drvdata(ofdev);
  141. struct rgmii_regs __iomem *p;
  142. BUG_ON(!dev || dev->users == 0);
  143. p = dev->base;
  144. mutex_lock(&dev->lock);
  145. RGMII_DBG(dev, "detach(%d)" NL, input);
  146. /* Disable this input */
  147. out_be32(&p->fer, in_be32(&p->fer) & ~RGMII_FER_MASK(input));
  148. --dev->users;
  149. mutex_unlock(&dev->lock);
  150. }
  151. int rgmii_get_regs_len(struct platform_device *ofdev)
  152. {
  153. return sizeof(struct emac_ethtool_regs_subhdr) +
  154. sizeof(struct rgmii_regs);
  155. }
  156. void *rgmii_dump_regs(struct platform_device *ofdev, void *buf)
  157. {
  158. struct rgmii_instance *dev = platform_get_drvdata(ofdev);
  159. struct emac_ethtool_regs_subhdr *hdr = buf;
  160. struct rgmii_regs *regs = (struct rgmii_regs *)(hdr + 1);
  161. hdr->version = 0;
  162. hdr->index = 0; /* for now, are there chips with more than one
  163. * rgmii ? if yes, then we'll add a cell_index
  164. * like we do for emac
  165. */
  166. memcpy_fromio(regs, dev->base, sizeof(struct rgmii_regs));
  167. return regs + 1;
  168. }
  169. static int rgmii_probe(struct platform_device *ofdev)
  170. {
  171. struct device_node *np = ofdev->dev.of_node;
  172. struct rgmii_instance *dev;
  173. struct resource regs;
  174. int rc;
  175. rc = -ENOMEM;
  176. dev = kzalloc(sizeof(struct rgmii_instance), GFP_KERNEL);
  177. if (dev == NULL)
  178. goto err_gone;
  179. mutex_init(&dev->lock);
  180. dev->ofdev = ofdev;
  181. rc = -ENXIO;
  182. if (of_address_to_resource(np, 0, &regs)) {
  183. printk(KERN_ERR "%pOF: Can't get registers address\n", np);
  184. goto err_free;
  185. }
  186. rc = -ENOMEM;
  187. dev->base = (struct rgmii_regs __iomem *)ioremap(regs.start,
  188. sizeof(struct rgmii_regs));
  189. if (dev->base == NULL) {
  190. printk(KERN_ERR "%pOF: Can't map device registers!\n", np);
  191. goto err_free;
  192. }
  193. /* Check for RGMII flags */
  194. if (of_get_property(ofdev->dev.of_node, "has-mdio", NULL))
  195. dev->flags |= EMAC_RGMII_FLAG_HAS_MDIO;
  196. /* CAB lacks the right properties, fix this up */
  197. if (of_device_is_compatible(ofdev->dev.of_node, "ibm,rgmii-axon"))
  198. dev->flags |= EMAC_RGMII_FLAG_HAS_MDIO;
  199. DBG2(dev, " Boot FER = 0x%08x, SSR = 0x%08x\n",
  200. in_be32(&dev->base->fer), in_be32(&dev->base->ssr));
  201. /* Disable all inputs by default */
  202. out_be32(&dev->base->fer, 0);
  203. printk(KERN_INFO
  204. "RGMII %pOF initialized with%s MDIO support\n",
  205. ofdev->dev.of_node,
  206. (dev->flags & EMAC_RGMII_FLAG_HAS_MDIO) ? "" : "out");
  207. wmb();
  208. platform_set_drvdata(ofdev, dev);
  209. return 0;
  210. err_free:
  211. kfree(dev);
  212. err_gone:
  213. return rc;
  214. }
  215. static int rgmii_remove(struct platform_device *ofdev)
  216. {
  217. struct rgmii_instance *dev = platform_get_drvdata(ofdev);
  218. WARN_ON(dev->users != 0);
  219. iounmap(dev->base);
  220. kfree(dev);
  221. return 0;
  222. }
  223. static const struct of_device_id rgmii_match[] =
  224. {
  225. {
  226. .compatible = "ibm,rgmii",
  227. },
  228. {
  229. .type = "emac-rgmii",
  230. },
  231. {},
  232. };
  233. static struct platform_driver rgmii_driver = {
  234. .driver = {
  235. .name = "emac-rgmii",
  236. .of_match_table = rgmii_match,
  237. },
  238. .probe = rgmii_probe,
  239. .remove = rgmii_remove,
  240. };
  241. int __init rgmii_init(void)
  242. {
  243. return platform_driver_register(&rgmii_driver);
  244. }
  245. void rgmii_exit(void)
  246. {
  247. platform_driver_unregister(&rgmii_driver);
  248. }