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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. --- a/drivers/net/ethernet/mediatek/mtk_eth_path.c
  2. +++ b/drivers/net/ethernet/mediatek/mtk_eth_path.c
  3. @@ -96,12 +96,20 @@ static int set_mux_gmac2_gmac0_to_gephy(
  4. static int set_mux_u3_gmac2_to_qphy(struct mtk_eth *eth, int path)
  5. {
  6. - unsigned int val = 0;
  7. + unsigned int val = 0, mask = 0, reg = 0;
  8. bool updated = true;
  9. switch (path) {
  10. case MTK_ETH_PATH_GMAC2_SGMII:
  11. - val = CO_QPHY_SEL;
  12. + if (MTK_HAS_CAPS(eth->soc->caps, MTK_U3_COPHY_V2)) {
  13. + reg = USB_PHY_SWITCH_REG;
  14. + val = SGMII_QPHY_SEL;
  15. + mask = QPHY_SEL_MASK;
  16. + } else {
  17. + reg = INFRA_MISC2;
  18. + val = CO_QPHY_SEL;
  19. + mask = val;
  20. + }
  21. break;
  22. default:
  23. updated = false;
  24. @@ -109,7 +117,7 @@ static int set_mux_u3_gmac2_to_qphy(stru
  25. }
  26. if (updated)
  27. - regmap_update_bits(eth->infra, INFRA_MISC2, CO_QPHY_SEL, val);
  28. + regmap_update_bits(eth->infra, reg, mask, val);
  29. dev_dbg(eth->dev, "path %s in %s updated = %d\n",
  30. mtk_eth_path_name(path), __func__, updated);
  31. --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
  32. +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
  33. @@ -4755,6 +4755,26 @@ static const struct mtk_soc_data mt7629_
  34. },
  35. };
  36. +static const struct mtk_soc_data mt7981_data = {
  37. + .reg_map = &mt7986_reg_map,
  38. + .ana_rgc3 = 0x128,
  39. + .caps = MT7981_CAPS,
  40. + .hw_features = MTK_HW_FEATURES,
  41. + .required_clks = MT7981_CLKS_BITMAP,
  42. + .required_pctl = false,
  43. + .offload_version = 2,
  44. + .hash_offset = 4,
  45. + .foe_entry_size = sizeof(struct mtk_foe_entry),
  46. + .txrx = {
  47. + .txd_size = sizeof(struct mtk_tx_dma_v2),
  48. + .rxd_size = sizeof(struct mtk_rx_dma_v2),
  49. + .rx_irq_done_mask = MTK_RX_DONE_INT_V2,
  50. + .rx_dma_l4_valid = RX_DMA_L4_VALID_V2,
  51. + .dma_max_len = MTK_TX_DMA_BUF_LEN_V2,
  52. + .dma_len_offset = 8,
  53. + },
  54. +};
  55. +
  56. static const struct mtk_soc_data mt7986_data = {
  57. .reg_map = &mt7986_reg_map,
  58. .ana_rgc3 = 0x128,
  59. @@ -4797,6 +4817,7 @@ const struct of_device_id of_mtk_match[]
  60. { .compatible = "mediatek,mt7622-eth", .data = &mt7622_data},
  61. { .compatible = "mediatek,mt7623-eth", .data = &mt7623_data},
  62. { .compatible = "mediatek,mt7629-eth", .data = &mt7629_data},
  63. + { .compatible = "mediatek,mt7981-eth", .data = &mt7981_data},
  64. { .compatible = "mediatek,mt7986-eth", .data = &mt7986_data},
  65. { .compatible = "ralink,rt5350-eth", .data = &rt5350_data},
  66. {},
  67. --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h
  68. +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
  69. @@ -553,11 +553,22 @@
  70. #define SGMSYS_QPHY_PWR_STATE_CTRL 0xe8
  71. #define SGMII_PHYA_PWD BIT(4)
  72. +/* Register to QPHY wrapper control */
  73. +#define SGMSYS_QPHY_WRAP_CTRL 0xec
  74. +#define SGMII_PN_SWAP_MASK GENMASK(1, 0)
  75. +#define SGMII_PN_SWAP_TX_RX (BIT(0) | BIT(1))
  76. +#define MTK_SGMII_FLAG_PN_SWAP BIT(0)
  77. +
  78. /* Infrasys subsystem config registers */
  79. #define INFRA_MISC2 0x70c
  80. #define CO_QPHY_SEL BIT(0)
  81. #define GEPHY_MAC_SEL BIT(1)
  82. +/* Top misc registers */
  83. +#define USB_PHY_SWITCH_REG 0x218
  84. +#define QPHY_SEL_MASK GENMASK(1, 0)
  85. +#define SGMII_QPHY_SEL 0x2
  86. +
  87. /* MT7628/88 specific stuff */
  88. #define MT7628_PDMA_OFFSET 0x0800
  89. #define MT7628_SDM_OFFSET 0x0c00
  90. @@ -738,6 +749,17 @@ enum mtk_clks_map {
  91. BIT(MTK_CLK_SGMII2_CDR_FB) | \
  92. BIT(MTK_CLK_SGMII_CK) | \
  93. BIT(MTK_CLK_ETH2PLL) | BIT(MTK_CLK_SGMIITOP))
  94. +#define MT7981_CLKS_BITMAP (BIT(MTK_CLK_FE) | BIT(MTK_CLK_GP2) | BIT(MTK_CLK_GP1) | \
  95. + BIT(MTK_CLK_WOCPU0) | \
  96. + BIT(MTK_CLK_SGMII_TX_250M) | \
  97. + BIT(MTK_CLK_SGMII_RX_250M) | \
  98. + BIT(MTK_CLK_SGMII_CDR_REF) | \
  99. + BIT(MTK_CLK_SGMII_CDR_FB) | \
  100. + BIT(MTK_CLK_SGMII2_TX_250M) | \
  101. + BIT(MTK_CLK_SGMII2_RX_250M) | \
  102. + BIT(MTK_CLK_SGMII2_CDR_REF) | \
  103. + BIT(MTK_CLK_SGMII2_CDR_FB) | \
  104. + BIT(MTK_CLK_SGMII_CK))
  105. #define MT7986_CLKS_BITMAP (BIT(MTK_CLK_FE) | BIT(MTK_CLK_GP2) | BIT(MTK_CLK_GP1) | \
  106. BIT(MTK_CLK_WOCPU1) | BIT(MTK_CLK_WOCPU0) | \
  107. BIT(MTK_CLK_SGMII_TX_250M) | \
  108. @@ -851,6 +873,7 @@ enum mkt_eth_capabilities {
  109. MTK_NETSYS_V2_BIT,
  110. MTK_SOC_MT7628_BIT,
  111. MTK_RSTCTRL_PPE1_BIT,
  112. + MTK_U3_COPHY_V2_BIT,
  113. /* MUX BITS*/
  114. MTK_ETH_MUX_GDM1_TO_GMAC1_ESW_BIT,
  115. @@ -885,6 +908,7 @@ enum mkt_eth_capabilities {
  116. #define MTK_NETSYS_V2 BIT(MTK_NETSYS_V2_BIT)
  117. #define MTK_SOC_MT7628 BIT(MTK_SOC_MT7628_BIT)
  118. #define MTK_RSTCTRL_PPE1 BIT(MTK_RSTCTRL_PPE1_BIT)
  119. +#define MTK_U3_COPHY_V2 BIT(MTK_U3_COPHY_V2_BIT)
  120. #define MTK_ETH_MUX_GDM1_TO_GMAC1_ESW \
  121. BIT(MTK_ETH_MUX_GDM1_TO_GMAC1_ESW_BIT)
  122. @@ -963,6 +987,11 @@ enum mkt_eth_capabilities {
  123. MTK_MUX_U3_GMAC2_TO_QPHY | \
  124. MTK_MUX_GMAC12_TO_GEPHY_SGMII | MTK_QDMA)
  125. +#define MT7981_CAPS (MTK_GMAC1_SGMII | MTK_GMAC2_SGMII | MTK_GMAC2_GEPHY | \
  126. + MTK_MUX_GMAC12_TO_GEPHY_SGMII | MTK_QDMA | \
  127. + MTK_MUX_U3_GMAC2_TO_QPHY | MTK_U3_COPHY_V2 | \
  128. + MTK_NETSYS_V2 | MTK_RSTCTRL_PPE1)
  129. +
  130. #define MT7986_CAPS (MTK_GMAC1_SGMII | MTK_GMAC2_SGMII | \
  131. MTK_MUX_GMAC12_TO_GEPHY_SGMII | MTK_QDMA | \
  132. MTK_NETSYS_V2 | MTK_RSTCTRL_PPE1)
  133. @@ -1076,12 +1105,14 @@ struct mtk_soc_data {
  134. * @ana_rgc3: The offset refers to register ANA_RGC3 related to regmap
  135. * @interface: Currently configured interface mode
  136. * @pcs: Phylink PCS structure
  137. + * @flags: Flags indicating hardware properties
  138. */
  139. struct mtk_pcs {
  140. struct regmap *regmap;
  141. u32 ana_rgc3;
  142. phy_interface_t interface;
  143. struct phylink_pcs pcs;
  144. + u32 flags;
  145. };
  146. /* struct mtk_sgmii - This is the structure holding sgmii regmap and its
  147. --- a/drivers/net/ethernet/mediatek/mtk_sgmii.c
  148. +++ b/drivers/net/ethernet/mediatek/mtk_sgmii.c
  149. @@ -87,6 +87,11 @@ static int mtk_pcs_config(struct phylink
  150. regmap_update_bits(mpcs->regmap, SGMSYS_QPHY_PWR_STATE_CTRL,
  151. SGMII_PHYA_PWD, SGMII_PHYA_PWD);
  152. + if (mpcs->flags & MTK_SGMII_FLAG_PN_SWAP)
  153. + regmap_update_bits(mpcs->regmap, SGMSYS_QPHY_WRAP_CTRL,
  154. + SGMII_PN_SWAP_MASK,
  155. + SGMII_PN_SWAP_TX_RX);
  156. +
  157. /* Reset SGMII PCS state */
  158. regmap_update_bits(mpcs->regmap, SGMII_RESERVED_0,
  159. SGMII_SW_RESET, SGMII_SW_RESET);
  160. @@ -186,6 +191,11 @@ int mtk_sgmii_init(struct mtk_sgmii *ss,
  161. ss->pcs[i].ana_rgc3 = ana_rgc3;
  162. ss->pcs[i].regmap = syscon_node_to_regmap(np);
  163. +
  164. + ss->pcs[i].flags = 0;
  165. + if (of_property_read_bool(np, "mediatek,pnswap"))
  166. + ss->pcs[i].flags |= MTK_SGMII_FLAG_PN_SWAP;
  167. +
  168. of_node_put(np);
  169. if (IS_ERR(ss->pcs[i].regmap))
  170. return PTR_ERR(ss->pcs[i].regmap);