sunxi_hal_phy.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355
  1. /*
  2. * Copyright (c) 2019-2025 Allwinner Technology Co., Ltd. ALL rights reserved.
  3. *
  4. * Allwinner is a trademark of Allwinner Technology Co.,Ltd., registered in
  5. * the the People's Republic of China and other countries.
  6. * All Allwinner Technology Co.,Ltd. trademarks are used with permission.
  7. *
  8. * DISCLAIMER
  9. * THIRD PARTY LICENCES MAY BE REQUIRED TO IMPLEMENT THE SOLUTION/PRODUCT.
  10. * IF YOU NEED TO INTEGRATE THIRD PARTY’S TECHNOLOGY (SONY, DTS, DOLBY, AVS OR MPEGLA, ETC.)
  11. * IN ALLWINNERS’SDK OR PRODUCTS, YOU SHALL BE SOLELY RESPONSIBLE TO OBTAIN
  12. * ALL APPROPRIATELY REQUIRED THIRD PARTY LICENCES.
  13. * ALLWINNER SHALL HAVE NO WARRANTY, INDEMNITY OR OTHER OBLIGATIONS WITH RESPECT TO MATTERS
  14. * COVERED UNDER ANY REQUIRED THIRD PARTY LICENSE.
  15. * YOU ARE SOLELY RESPONSIBLE FOR YOUR USAGE OF THIRD PARTY’S TECHNOLOGY.
  16. *
  17. *
  18. * THIS SOFTWARE IS PROVIDED BY ALLWINNER"AS IS" AND TO THE MAXIMUM EXTENT
  19. * PERMITTED BY LAW, ALLWINNER EXPRESSLY DISCLAIMS ALL WARRANTIES OF ANY KIND,
  20. * WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING WITHOUT LIMITATION REGARDING
  21. * THE TITLE, NON-INFRINGEMENT, ACCURACY, CONDITION, COMPLETENESS, PERFORMANCE
  22. * OR MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  23. * IN NO EVENT SHALL ALLWINNER BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  24. * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  25. * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  26. * LOSS OF USE, DATA, OR PROFITS, OR BUSINESS INTERRUPTION)
  27. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
  28. * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  29. * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
  30. * OF THE POSSIBILITY OF SUCH DAMAGE.
  31. */
  32. #ifndef __SUNXI_HAL_PHY_H__
  33. #define __SUNXI_HAL_PHY_H__
  34. #include <stdint.h>
  35. #include <sunxi_hal_mii.h>
  36. #include <sunxi_hal_mdio.h>
  37. #include <aw_list.h>
  38. #define PHY_MAX_ADDR 32
  39. /* Indicates what features are supported by the interface. */
  40. #define SUPPORTED_10baseT_Half (1 << 0)
  41. #define SUPPORTED_10baseT_Full (1 << 1)
  42. #define SUPPORTED_100baseT_Half (1 << 2)
  43. #define SUPPORTED_100baseT_Full (1 << 3)
  44. #define SUPPORTED_1000baseT_Half (1 << 4)
  45. #define SUPPORTED_1000baseT_Full (1 << 5)
  46. #define SUPPORTED_Autoneg (1 << 6)
  47. #define SUPPORTED_TP (1 << 7)
  48. #define SUPPORTED_AUI (1 << 8)
  49. #define SUPPORTED_MII (1 << 9)
  50. #define SUPPORTED_FIBRE (1 << 10)
  51. #define SUPPORTED_BNC (1 << 11)
  52. #define SUPPORTED_10000baseT_Full (1 << 12)
  53. #define SUPPORTED_Pause (1 << 13)
  54. #define SUPPORTED_Asym_Pause (1 << 14)
  55. #define SUPPORTED_2500baseX_Full (1 << 15)
  56. #define SUPPORTED_Backplane (1 << 16)
  57. #define SUPPORTED_1000baseKX_Full (1 << 17)
  58. #define SUPPORTED_10000baseKX4_Full (1 << 18)
  59. #define SUPPORTED_10000baseKR_Full (1 << 19)
  60. #define SUPPORTED_10000baseR_FEC (1 << 20)
  61. #define SUPPORTED_1000baseX_Half (1 << 21)
  62. #define SUPPORTED_1000baseX_Full (1 << 22)
  63. /* Indicates what features are advertised by the interface. */
  64. #define ADVERTISED_10baseT_Half (1 << 0)
  65. #define ADVERTISED_10baseT_Full (1 << 1)
  66. #define ADVERTISED_100baseT_Half (1 << 2)
  67. #define ADVERTISED_100baseT_Full (1 << 3)
  68. #define ADVERTISED_1000baseT_Half (1 << 4)
  69. #define ADVERTISED_1000baseT_Full (1 << 5)
  70. #define ADVERTISED_Autoneg (1 << 6)
  71. #define ADVERTISED_TP (1 << 7)
  72. #define ADVERTISED_AUI (1 << 8)
  73. #define ADVERTISED_MII (1 << 9)
  74. #define ADVERTISED_FIBRE (1 << 10)
  75. #define ADVERTISED_BNC (1 << 11)
  76. #define ADVERTISED_10000baseT_Full (1 << 12)
  77. #define ADVERTISED_Pause (1 << 13)
  78. #define ADVERTISED_Asym_Pause (1 << 14)
  79. #define ADVERTISED_2500baseX_Full (1 << 15)
  80. #define ADVERTISED_Backplane (1 << 16)
  81. #define ADVERTISED_1000baseKX_Full (1 << 17)
  82. #define ADVERTISED_10000baseKX4_Full (1 << 18)
  83. #define ADVERTISED_10000baseKR_Full (1 << 19)
  84. #define ADVERTISED_10000baseR_FEC (1 << 20)
  85. #define ADVERTISED_1000baseX_Half (1 << 21)
  86. #define ADVERTISED_1000baseX_Full (1 << 22)
  87. /* The following are all involved in forcing a particular link
  88. * mode for the device for setting things. When getting the
  89. * devices settings, these indicate the current mode and whether
  90. * it was foced up into this mode or autonegotiated.
  91. */
  92. /* The forced speed, 10Mb, 100Mb, gigabit, 2.5Gb, 10GbE. */
  93. #define SPEED_10 10
  94. #define SPEED_100 100
  95. #define SPEED_1000 1000
  96. #define SPEED_2500 2500
  97. #define SPEED_10000 10000
  98. /* Duplex, half or full. */
  99. #define DUPLEX_HALF 0x00
  100. #define DUPLEX_FULL 0x01
  101. /* Which connector port. */
  102. #define PORT_TP 0x00
  103. #define PORT_AUI 0x01
  104. #define PORT_MII 0x02
  105. #define PORT_FIBRE 0x03
  106. #define PORT_BNC 0x04
  107. #define PORT_DA 0x05
  108. #define PORT_NONE 0xef
  109. #define PORT_OTHER 0xff
  110. /* Which transceiver to use. */
  111. #define XCVR_INTERNAL 0x00
  112. #define XCVR_EXTERNAL 0x01
  113. #define XCVR_DUMMY1 0x02
  114. #define XCVR_DUMMY2 0x03
  115. #define XCVR_DUMMY3 0x04
  116. /* Enable or disable autonegotiation. If this is set to enable,
  117. * the forced link modes above are completely ignored.
  118. */
  119. #define AUTONEG_DISABLE 0x00
  120. #define AUTONEG_ENABLE 0x01
  121. #define PHY_BASIC_FEATURES (SUPPORTED_10baseT_Half | \
  122. SUPPORTED_10baseT_Full | \
  123. SUPPORTED_100baseT_Half | \
  124. SUPPORTED_100baseT_Full | \
  125. SUPPORTED_Autoneg | \
  126. SUPPORTED_TP | \
  127. SUPPORTED_MII)
  128. #define PHY_GBIT_FEATURES (PHY_BASIC_FEATURES | \
  129. SUPPORTED_1000baseT_Half | \
  130. SUPPORTED_1000baseT_Full)
  131. #define PHY_10G_FEATURES (PHY_GBIT_FEATURES | \
  132. SUPPORTED_10000baseT_Full)
  133. #define PHY_ANEG_TIMEOUT 4000
  134. typedef enum {
  135. PHY_INTERFACE_MODE_MII,
  136. PHY_INTERFACE_MODE_GMII,
  137. PHY_INTERFACE_MODE_SGMII,
  138. PHY_INTERFACE_MODE_QSGMII,
  139. PHY_INTERFACE_MODE_TBI,
  140. PHY_INTERFACE_MODE_RMII,
  141. PHY_INTERFACE_MODE_RGMII,
  142. PHY_INTERFACE_MODE_RGMII_ID,
  143. PHY_INTERFACE_MODE_RGMII_RXID,
  144. PHY_INTERFACE_MODE_RGMII_TXID,
  145. PHY_INTERFACE_MODE_RTBI,
  146. PHY_INTERFACE_MODE_XGMII,
  147. PHY_INTERFACE_MODE_NONE /* Must be last */
  148. } phy_interface_t;
  149. static const char *phy_interface_strings[] = {
  150. [PHY_INTERFACE_MODE_MII] = "mii",
  151. [PHY_INTERFACE_MODE_GMII] = "gmii",
  152. [PHY_INTERFACE_MODE_SGMII] = "sgmii",
  153. [PHY_INTERFACE_MODE_QSGMII] = "qsgmii",
  154. [PHY_INTERFACE_MODE_TBI] = "tbi",
  155. [PHY_INTERFACE_MODE_RMII] = "rmii",
  156. [PHY_INTERFACE_MODE_RGMII] = "rgmii",
  157. [PHY_INTERFACE_MODE_RGMII_ID] = "rgmii-id",
  158. [PHY_INTERFACE_MODE_RGMII_RXID] = "rgmii-rxid",
  159. [PHY_INTERFACE_MODE_RGMII_TXID] = "rgmii-txid",
  160. [PHY_INTERFACE_MODE_RTBI] = "rtbi",
  161. [PHY_INTERFACE_MODE_XGMII] = "xgmii",
  162. [PHY_INTERFACE_MODE_NONE] = "",
  163. };
  164. static inline const char *phy_string_for_interface(phy_interface_t i)
  165. {
  166. /* Default to unknown */
  167. if (i > PHY_INTERFACE_MODE_NONE)
  168. i = PHY_INTERFACE_MODE_NONE;
  169. return phy_interface_strings[i];
  170. }
  171. struct phy_device;
  172. #define MDIO_NAME_LEN 32
  173. struct mii_dev {
  174. struct list_head link;
  175. char name[MDIO_NAME_LEN];
  176. void *priv;
  177. int (*read)(struct mii_dev *bus, int addr, int devad, int reg);
  178. int (*write)(struct mii_dev *bus, int addr, int devad, int reg,
  179. uint16_t val);
  180. int (*reset)(struct mii_dev *bus);
  181. struct phy_device *phymap[PHY_MAX_ADDR];
  182. uint32_t phy_mask;
  183. };
  184. /* struct phy_driver: a structure which defines PHY behavior
  185. *
  186. * uid will contain a number which represents the PHY. During
  187. * startup, the driver will poll the PHY to find out what its
  188. * UID--as defined by registers 2 and 3--is. The 32-bit result
  189. * gotten from the PHY will be masked to
  190. * discard any bits which may change based on revision numbers
  191. * unimportant to functionality
  192. *
  193. */
  194. struct phy_driver {
  195. char *name;
  196. unsigned int uid;
  197. unsigned int mask;
  198. unsigned int mmds;
  199. uint32_t features;
  200. /* Called to do any driver startup necessities */
  201. /* Will be called during phy_connect */
  202. int (*probe)(struct phy_device *phydev);
  203. /* Called to configure the PHY, and modify the controller
  204. * based on the results. Should be called after phy_connect */
  205. int (*config)(struct phy_device *phydev);
  206. /* Called when starting up the controller */
  207. int (*startup)(struct phy_device *phydev);
  208. /* Called when bringing down the controller */
  209. int (*shutdown)(struct phy_device *phydev);
  210. int (*readext)(struct phy_device *phydev, int addr, int devad, int reg);
  211. int (*writeext)(struct phy_device *phydev, int addr, int devad, int reg,
  212. uint16_t val);
  213. struct list_head list;
  214. };
  215. struct phy_device {
  216. /* Information about the PHY type */
  217. /* And management functions */
  218. struct mii_dev *bus;
  219. struct phy_driver *drv;
  220. void *priv;
  221. struct eth_device *dev;
  222. /* forced speed & duplex (no autoneg)
  223. * partner speed & duplex & pause (autoneg)
  224. */
  225. int speed;
  226. int duplex;
  227. /* The most recently read link state */
  228. int link;
  229. int port;
  230. phy_interface_t interface;
  231. uint32_t advertising;
  232. uint32_t supported;
  233. uint32_t mmds;
  234. int autoneg;
  235. int addr;
  236. int pause;
  237. int asym_pause;
  238. uint32_t phy_id;
  239. uint32_t flags;
  240. };
  241. struct fixed_link {
  242. int phy_id;
  243. int duplex;
  244. int link_speed;
  245. int pause;
  246. int asym_pause;
  247. };
  248. static inline int phy_read(struct phy_device *phydev, int devad, int regnum)
  249. {
  250. struct mii_dev *bus = phydev->bus;
  251. return bus->read(bus, phydev->addr, devad, regnum);
  252. }
  253. static inline int phy_write(struct phy_device *phydev, int devad, int regnum,
  254. uint32_t val)
  255. {
  256. struct mii_dev *bus = phydev->bus;
  257. return bus->write(bus, phydev->addr, devad, regnum, val);
  258. }
  259. #ifdef CONFIG_PHYLIB_10G
  260. extern struct phy_driver gen10g_driver;
  261. /* For now, XGMII is the only 10G interface */
  262. static inline int is_10g_interface(phy_interface_t interface)
  263. {
  264. return interface == PHY_INTERFACE_MODE_XGMII;
  265. }
  266. #endif
  267. int phy_init(void);
  268. int phy_reset(struct phy_device *phydev);
  269. struct phy_device *phy_find_by_mask(struct mii_dev *bus, unsigned phy_mask,
  270. phy_interface_t interface);
  271. void phy_connect_dev(struct phy_device *phydev, struct eth_device *dev);
  272. struct phy_device *phy_connect(struct mii_dev *bus, int addr,
  273. struct eth_device *dev,
  274. phy_interface_t interface);
  275. int phy_startup(struct phy_device *phydev);
  276. int phy_config(struct phy_device *phydev);
  277. int phy_shutdown(struct phy_device *phydev);
  278. int phy_register(struct phy_driver *drv);
  279. int genphy_config_aneg(struct phy_device *phydev);
  280. int genphy_restart_aneg(struct phy_device *phydev);
  281. int genphy_update_link(struct phy_device *phydev);
  282. int genphy_parse_link(struct phy_device *phydev);
  283. int genphy_config(struct phy_device *phydev);
  284. int genphy_startup(struct phy_device *phydev);
  285. int genphy_shutdown(struct phy_device *phydev);
  286. int gen10g_config(struct phy_device *phydev);
  287. int gen10g_startup(struct phy_device *phydev);
  288. int gen10g_shutdown(struct phy_device *phydev);
  289. int gen10g_discover_mmds(struct phy_device *phydev);
  290. int phy_atheros_init(void);
  291. int phy_broadcom_init(void);
  292. int phy_davicom_init(void);
  293. int phy_et1011c_init(void);
  294. int phy_lxt_init(void);
  295. int phy_marvell_init(void);
  296. int phy_micrel_init(void);
  297. int phy_natsemi_init(void);
  298. int phy_realtek_init(void);
  299. int phy_smsc_init(void);
  300. int phy_teranetics_init(void);
  301. int phy_vitesse_init(void);
  302. int board_phy_config(struct phy_device *phydev);
  303. /* PHY UIDs for various PHYs that are referenced in external code */
  304. #define PHY_UID_TN2020 0x00a19410
  305. #endif /* __SUNXI_HAL_PHY_H__ */