733-v6.3-18-net-ethernet-mtk_eth_soc-add-support-for-MT7981.patch 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. From f5d43ddd334b7c32fcaed9ba46afbd85cb467f1f Mon Sep 17 00:00:00 2001
  2. From: Daniel Golle <[email protected]>
  3. Date: Sun, 19 Mar 2023 12:56:28 +0000
  4. Subject: [PATCH] net: ethernet: mtk_eth_soc: add support for MT7981 SoC
  5. The MediaTek MT7981 SoC comes with two 1G/2.5G SGMII ports, just like
  6. MT7986.
  7. In addition MT7981 is equipped with a built-in 1000Base-T PHY which can
  8. be used with GMAC1.
  9. As many MT7981 boards make use of inverting SGMII signal polarity, add
  10. new device-tree attribute 'mediatek,pn_swap' to support them.
  11. Signed-off-by: Daniel Golle <[email protected]>
  12. Signed-off-by: Jakub Kicinski <[email protected]>
  13. ---
  14. drivers/net/ethernet/mediatek/mtk_eth_path.c | 14 +++++++--
  15. drivers/net/ethernet/mediatek/mtk_eth_soc.c | 21 +++++++++++++
  16. drivers/net/ethernet/mediatek/mtk_eth_soc.h | 31 ++++++++++++++++++++
  17. drivers/net/ethernet/mediatek/mtk_sgmii.c | 10 +++++++
  18. 4 files changed, 73 insertions(+), 3 deletions(-)
  19. --- a/drivers/net/ethernet/mediatek/mtk_eth_path.c
  20. +++ b/drivers/net/ethernet/mediatek/mtk_eth_path.c
  21. @@ -96,12 +96,20 @@ static int set_mux_gmac2_gmac0_to_gephy(
  22. static int set_mux_u3_gmac2_to_qphy(struct mtk_eth *eth, int path)
  23. {
  24. - unsigned int val = 0;
  25. + unsigned int val = 0, mask = 0, reg = 0;
  26. bool updated = true;
  27. switch (path) {
  28. case MTK_ETH_PATH_GMAC2_SGMII:
  29. - val = CO_QPHY_SEL;
  30. + if (MTK_HAS_CAPS(eth->soc->caps, MTK_U3_COPHY_V2)) {
  31. + reg = USB_PHY_SWITCH_REG;
  32. + val = SGMII_QPHY_SEL;
  33. + mask = QPHY_SEL_MASK;
  34. + } else {
  35. + reg = INFRA_MISC2;
  36. + val = CO_QPHY_SEL;
  37. + mask = val;
  38. + }
  39. break;
  40. default:
  41. updated = false;
  42. @@ -109,7 +117,7 @@ static int set_mux_u3_gmac2_to_qphy(stru
  43. }
  44. if (updated)
  45. - regmap_update_bits(eth->infra, INFRA_MISC2, CO_QPHY_SEL, val);
  46. + regmap_update_bits(eth->infra, reg, mask, val);
  47. dev_dbg(eth->dev, "path %s in %s updated = %d\n",
  48. mtk_eth_path_name(path), __func__, updated);
  49. --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
  50. +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
  51. @@ -4801,6 +4801,26 @@ static const struct mtk_soc_data mt7629_
  52. },
  53. };
  54. +static const struct mtk_soc_data mt7981_data = {
  55. + .reg_map = &mt7986_reg_map,
  56. + .ana_rgc3 = 0x128,
  57. + .caps = MT7981_CAPS,
  58. + .hw_features = MTK_HW_FEATURES,
  59. + .required_clks = MT7981_CLKS_BITMAP,
  60. + .required_pctl = false,
  61. + .offload_version = 2,
  62. + .hash_offset = 4,
  63. + .foe_entry_size = sizeof(struct mtk_foe_entry),
  64. + .txrx = {
  65. + .txd_size = sizeof(struct mtk_tx_dma_v2),
  66. + .rxd_size = sizeof(struct mtk_rx_dma_v2),
  67. + .rx_irq_done_mask = MTK_RX_DONE_INT_V2,
  68. + .rx_dma_l4_valid = RX_DMA_L4_VALID_V2,
  69. + .dma_max_len = MTK_TX_DMA_BUF_LEN_V2,
  70. + .dma_len_offset = 8,
  71. + },
  72. +};
  73. +
  74. static const struct mtk_soc_data mt7986_data = {
  75. .reg_map = &mt7986_reg_map,
  76. .ana_rgc3 = 0x128,
  77. @@ -4843,6 +4863,7 @@ const struct of_device_id of_mtk_match[]
  78. { .compatible = "mediatek,mt7622-eth", .data = &mt7622_data},
  79. { .compatible = "mediatek,mt7623-eth", .data = &mt7623_data},
  80. { .compatible = "mediatek,mt7629-eth", .data = &mt7629_data},
  81. + { .compatible = "mediatek,mt7981-eth", .data = &mt7981_data},
  82. { .compatible = "mediatek,mt7986-eth", .data = &mt7986_data},
  83. { .compatible = "ralink,rt5350-eth", .data = &rt5350_data},
  84. {},
  85. --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h
  86. +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
  87. @@ -556,11 +556,22 @@
  88. #define SGMSYS_QPHY_PWR_STATE_CTRL 0xe8
  89. #define SGMII_PHYA_PWD BIT(4)
  90. +/* Register to QPHY wrapper control */
  91. +#define SGMSYS_QPHY_WRAP_CTRL 0xec
  92. +#define SGMII_PN_SWAP_MASK GENMASK(1, 0)
  93. +#define SGMII_PN_SWAP_TX_RX (BIT(0) | BIT(1))
  94. +#define MTK_SGMII_FLAG_PN_SWAP BIT(0)
  95. +
  96. /* Infrasys subsystem config registers */
  97. #define INFRA_MISC2 0x70c
  98. #define CO_QPHY_SEL BIT(0)
  99. #define GEPHY_MAC_SEL BIT(1)
  100. +/* Top misc registers */
  101. +#define USB_PHY_SWITCH_REG 0x218
  102. +#define QPHY_SEL_MASK GENMASK(1, 0)
  103. +#define SGMII_QPHY_SEL 0x2
  104. +
  105. /* MT7628/88 specific stuff */
  106. #define MT7628_PDMA_OFFSET 0x0800
  107. #define MT7628_SDM_OFFSET 0x0c00
  108. @@ -741,6 +752,17 @@ enum mtk_clks_map {
  109. BIT(MTK_CLK_SGMII2_CDR_FB) | \
  110. BIT(MTK_CLK_SGMII_CK) | \
  111. BIT(MTK_CLK_ETH2PLL) | BIT(MTK_CLK_SGMIITOP))
  112. +#define MT7981_CLKS_BITMAP (BIT(MTK_CLK_FE) | BIT(MTK_CLK_GP2) | BIT(MTK_CLK_GP1) | \
  113. + BIT(MTK_CLK_WOCPU0) | \
  114. + BIT(MTK_CLK_SGMII_TX_250M) | \
  115. + BIT(MTK_CLK_SGMII_RX_250M) | \
  116. + BIT(MTK_CLK_SGMII_CDR_REF) | \
  117. + BIT(MTK_CLK_SGMII_CDR_FB) | \
  118. + BIT(MTK_CLK_SGMII2_TX_250M) | \
  119. + BIT(MTK_CLK_SGMII2_RX_250M) | \
  120. + BIT(MTK_CLK_SGMII2_CDR_REF) | \
  121. + BIT(MTK_CLK_SGMII2_CDR_FB) | \
  122. + BIT(MTK_CLK_SGMII_CK))
  123. #define MT7986_CLKS_BITMAP (BIT(MTK_CLK_FE) | BIT(MTK_CLK_GP2) | BIT(MTK_CLK_GP1) | \
  124. BIT(MTK_CLK_WOCPU1) | BIT(MTK_CLK_WOCPU0) | \
  125. BIT(MTK_CLK_SGMII_TX_250M) | \
  126. @@ -854,6 +876,7 @@ enum mkt_eth_capabilities {
  127. MTK_NETSYS_V2_BIT,
  128. MTK_SOC_MT7628_BIT,
  129. MTK_RSTCTRL_PPE1_BIT,
  130. + MTK_U3_COPHY_V2_BIT,
  131. /* MUX BITS*/
  132. MTK_ETH_MUX_GDM1_TO_GMAC1_ESW_BIT,
  133. @@ -888,6 +911,7 @@ enum mkt_eth_capabilities {
  134. #define MTK_NETSYS_V2 BIT(MTK_NETSYS_V2_BIT)
  135. #define MTK_SOC_MT7628 BIT(MTK_SOC_MT7628_BIT)
  136. #define MTK_RSTCTRL_PPE1 BIT(MTK_RSTCTRL_PPE1_BIT)
  137. +#define MTK_U3_COPHY_V2 BIT(MTK_U3_COPHY_V2_BIT)
  138. #define MTK_ETH_MUX_GDM1_TO_GMAC1_ESW \
  139. BIT(MTK_ETH_MUX_GDM1_TO_GMAC1_ESW_BIT)
  140. @@ -960,6 +984,11 @@ enum mkt_eth_capabilities {
  141. MTK_MUX_U3_GMAC2_TO_QPHY | \
  142. MTK_MUX_GMAC12_TO_GEPHY_SGMII | MTK_QDMA)
  143. +#define MT7981_CAPS (MTK_GMAC1_SGMII | MTK_GMAC2_SGMII | MTK_GMAC2_GEPHY | \
  144. + MTK_MUX_GMAC12_TO_GEPHY_SGMII | MTK_QDMA | \
  145. + MTK_MUX_U3_GMAC2_TO_QPHY | MTK_U3_COPHY_V2 | \
  146. + MTK_NETSYS_V2 | MTK_RSTCTRL_PPE1)
  147. +
  148. #define MT7986_CAPS (MTK_GMAC1_SGMII | MTK_GMAC2_SGMII | \
  149. MTK_MUX_GMAC12_TO_GEPHY_SGMII | MTK_QDMA | \
  150. MTK_NETSYS_V2 | MTK_RSTCTRL_PPE1)
  151. @@ -1073,12 +1102,14 @@ struct mtk_soc_data {
  152. * @ana_rgc3: The offset refers to register ANA_RGC3 related to regmap
  153. * @interface: Currently configured interface mode
  154. * @pcs: Phylink PCS structure
  155. + * @flags: Flags indicating hardware properties
  156. */
  157. struct mtk_pcs {
  158. struct regmap *regmap;
  159. u32 ana_rgc3;
  160. phy_interface_t interface;
  161. struct phylink_pcs pcs;
  162. + u32 flags;
  163. };
  164. /* struct mtk_sgmii - This is the structure holding sgmii regmap and its
  165. --- a/drivers/net/ethernet/mediatek/mtk_sgmii.c
  166. +++ b/drivers/net/ethernet/mediatek/mtk_sgmii.c
  167. @@ -87,6 +87,11 @@ static int mtk_pcs_config(struct phylink
  168. regmap_update_bits(mpcs->regmap, SGMSYS_QPHY_PWR_STATE_CTRL,
  169. SGMII_PHYA_PWD, SGMII_PHYA_PWD);
  170. + if (mpcs->flags & MTK_SGMII_FLAG_PN_SWAP)
  171. + regmap_update_bits(mpcs->regmap, SGMSYS_QPHY_WRAP_CTRL,
  172. + SGMII_PN_SWAP_MASK,
  173. + SGMII_PN_SWAP_TX_RX);
  174. +
  175. /* Reset SGMII PCS state */
  176. regmap_update_bits(mpcs->regmap, SGMII_RESERVED_0,
  177. SGMII_SW_RESET, SGMII_SW_RESET);
  178. @@ -186,6 +191,11 @@ int mtk_sgmii_init(struct mtk_sgmii *ss,
  179. ss->pcs[i].ana_rgc3 = ana_rgc3;
  180. ss->pcs[i].regmap = syscon_node_to_regmap(np);
  181. +
  182. + ss->pcs[i].flags = 0;
  183. + if (of_property_read_bool(np, "mediatek,pnswap"))
  184. + ss->pcs[i].flags |= MTK_SGMII_FLAG_PN_SWAP;
  185. +
  186. of_node_put(np);
  187. if (IS_ERR(ss->pcs[i].regmap))
  188. return PTR_ERR(ss->pcs[i].regmap);