101-26-net-mediatek-add-support-for-MediaTek-MT7988-SoC.patch 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327
  1. From 59dba9d87c9caf04a5d797af46699055a53870f4 Mon Sep 17 00:00:00 2001
  2. From: Weijie Gao <[email protected]>
  3. Date: Wed, 19 Jul 2023 17:17:41 +0800
  4. Subject: [PATCH 26/29] net: mediatek: add support for MediaTek MT7988 SoC
  5. This patch adds support for MediaTek MT7988.
  6. MT7988 features MediaTek NETSYS v3, including three GMACs, and two
  7. of them supports 10Gbps USXGMII.
  8. MT7988 embeds a MT7531 switch (not MCM) which supports accessing
  9. internal registers through MMIO instead of MDIO.
  10. Signed-off-by: Weijie Gao <[email protected]>
  11. ---
  12. drivers/net/mtk_eth.c | 158 +++++++++++++++++++++++++++++++++++++++++-
  13. drivers/net/mtk_eth.h | 20 ++++++
  14. 2 files changed, 177 insertions(+), 1 deletion(-)
  15. --- a/drivers/net/mtk_eth.c
  16. +++ b/drivers/net/mtk_eth.c
  17. @@ -54,6 +54,16 @@
  18. (DP_PDMA << MC_DP_S) | \
  19. (DP_PDMA << UN_DP_S))
  20. +#define GDMA_BRIDGE_TO_CPU \
  21. + (0xC0000000 | \
  22. + GDM_ICS_EN | \
  23. + GDM_TCS_EN | \
  24. + GDM_UCS_EN | \
  25. + (DP_PDMA << MYMAC_DP_S) | \
  26. + (DP_PDMA << BC_DP_S) | \
  27. + (DP_PDMA << MC_DP_S) | \
  28. + (DP_PDMA << UN_DP_S))
  29. +
  30. #define GDMA_FWD_DISCARD \
  31. (0x20000000 | \
  32. GDM_ICS_EN | \
  33. @@ -68,7 +78,8 @@
  34. enum mtk_switch {
  35. SW_NONE,
  36. SW_MT7530,
  37. - SW_MT7531
  38. + SW_MT7531,
  39. + SW_MT7988,
  40. };
  41. /* struct mtk_soc_data - This is the structure holding all differences
  42. @@ -102,6 +113,7 @@ struct mtk_eth_priv {
  43. void __iomem *fe_base;
  44. void __iomem *gmac_base;
  45. void __iomem *sgmii_base;
  46. + void __iomem *gsw_base;
  47. struct regmap *ethsys_regmap;
  48. @@ -171,6 +183,11 @@ static void mtk_gdma_write(struct mtk_et
  49. writel(val, priv->fe_base + gdma_base + reg);
  50. }
  51. +static void mtk_fe_rmw(struct mtk_eth_priv *priv, u32 reg, u32 clr, u32 set)
  52. +{
  53. + clrsetbits_le32(priv->fe_base + reg, clr, set);
  54. +}
  55. +
  56. static u32 mtk_gmac_read(struct mtk_eth_priv *priv, u32 reg)
  57. {
  58. return readl(priv->gmac_base + reg);
  59. @@ -208,6 +225,16 @@ static void mtk_infra_rmw(struct mtk_eth
  60. regmap_write(priv->infra_regmap, reg, val);
  61. }
  62. +static u32 mtk_gsw_read(struct mtk_eth_priv *priv, u32 reg)
  63. +{
  64. + return readl(priv->gsw_base + reg);
  65. +}
  66. +
  67. +static void mtk_gsw_write(struct mtk_eth_priv *priv, u32 reg, u32 val)
  68. +{
  69. + writel(val, priv->gsw_base + reg);
  70. +}
  71. +
  72. /* Direct MDIO clause 22/45 access via SoC */
  73. static int mtk_mii_rw(struct mtk_eth_priv *priv, u8 phy, u8 reg, u16 data,
  74. u32 cmd, u32 st)
  75. @@ -342,6 +369,11 @@ static int mt753x_reg_read(struct mtk_et
  76. {
  77. int ret, low_word, high_word;
  78. + if (priv->sw == SW_MT7988) {
  79. + *data = mtk_gsw_read(priv, reg);
  80. + return 0;
  81. + }
  82. +
  83. /* Write page address */
  84. ret = mtk_mii_write(priv, priv->mt753x_smi_addr, 0x1f, reg >> 6);
  85. if (ret)
  86. @@ -367,6 +399,11 @@ static int mt753x_reg_write(struct mtk_e
  87. {
  88. int ret;
  89. + if (priv->sw == SW_MT7988) {
  90. + mtk_gsw_write(priv, reg, data);
  91. + return 0;
  92. + }
  93. +
  94. /* Write page address */
  95. ret = mtk_mii_write(priv, priv->mt753x_smi_addr, 0x1f, reg >> 6);
  96. if (ret)
  97. @@ -537,6 +574,7 @@ static int mtk_mdio_register(struct udev
  98. priv->mmd_write = mtk_mmd_ind_write;
  99. break;
  100. case SW_MT7531:
  101. + case SW_MT7988:
  102. priv->mii_read = mt7531_mii_ind_read;
  103. priv->mii_write = mt7531_mii_ind_write;
  104. priv->mmd_read = mt7531_mmd_ind_read;
  105. @@ -957,6 +995,103 @@ static int mt7531_setup(struct mtk_eth_p
  106. return 0;
  107. }
  108. +static void mt7988_phy_setting(struct mtk_eth_priv *priv)
  109. +{
  110. + u16 val;
  111. + u32 i;
  112. +
  113. + for (i = 0; i < MT753X_NUM_PHYS; i++) {
  114. + /* Enable HW auto downshift */
  115. + priv->mii_write(priv, i, 0x1f, 0x1);
  116. + val = priv->mii_read(priv, i, PHY_EXT_REG_14);
  117. + val |= PHY_EN_DOWN_SHFIT;
  118. + priv->mii_write(priv, i, PHY_EXT_REG_14, val);
  119. +
  120. + /* PHY link down power saving enable */
  121. + val = priv->mii_read(priv, i, PHY_EXT_REG_17);
  122. + val |= PHY_LINKDOWN_POWER_SAVING_EN;
  123. + priv->mii_write(priv, i, PHY_EXT_REG_17, val);
  124. + }
  125. +}
  126. +
  127. +static void mt7988_mac_control(struct mtk_eth_priv *priv, bool enable)
  128. +{
  129. + u32 pmcr = FORCE_MODE_LNK;
  130. +
  131. + if (enable)
  132. + pmcr = priv->mt753x_pmcr;
  133. +
  134. + mt753x_reg_write(priv, PMCR_REG(6), pmcr);
  135. +}
  136. +
  137. +static int mt7988_setup(struct mtk_eth_priv *priv)
  138. +{
  139. + u16 phy_addr, phy_val;
  140. + u32 pmcr;
  141. + int i;
  142. +
  143. + priv->gsw_base = regmap_get_range(priv->ethsys_regmap, 0) + GSW_BASE;
  144. +
  145. + priv->mt753x_phy_base = (priv->mt753x_smi_addr + 1) &
  146. + MT753X_SMI_ADDR_MASK;
  147. +
  148. + /* Turn off PHYs */
  149. + for (i = 0; i < MT753X_NUM_PHYS; i++) {
  150. + phy_addr = MT753X_PHY_ADDR(priv->mt753x_phy_base, i);
  151. + phy_val = priv->mii_read(priv, phy_addr, MII_BMCR);
  152. + phy_val |= BMCR_PDOWN;
  153. + priv->mii_write(priv, phy_addr, MII_BMCR, phy_val);
  154. + }
  155. +
  156. + switch (priv->phy_interface) {
  157. + case PHY_INTERFACE_MODE_USXGMII:
  158. + /* Use CPU bridge instead of actual USXGMII path */
  159. +
  160. + /* Set GDM1 no drop */
  161. + mtk_fe_rmw(priv, PSE_NO_DROP_CFG_REG, 0, PSE_NO_DROP_GDM1);
  162. +
  163. + /* Enable GDM1 to GSW CPU bridge */
  164. + mtk_gmac_rmw(priv, GMAC_MAC_MISC_REG, 0, BIT(0));
  165. +
  166. + /* XGMAC force link up */
  167. + mtk_gmac_rmw(priv, GMAC_XGMAC_STS_REG, 0, P1_XGMAC_FORCE_LINK);
  168. +
  169. + /* Setup GSW CPU bridge IPG */
  170. + mtk_gmac_rmw(priv, GMAC_GSW_CFG_REG, GSWTX_IPG_M | GSWRX_IPG_M,
  171. + (0xB << GSWTX_IPG_S) | (0xB << GSWRX_IPG_S));
  172. + break;
  173. + default:
  174. + printf("Error: MT7988 GSW does not support %s interface\n",
  175. + phy_string_for_interface(priv->phy_interface));
  176. + break;
  177. + }
  178. +
  179. + pmcr = MT7988_FORCE_MODE |
  180. + (IPG_96BIT_WITH_SHORT_IPG << IPG_CFG_S) |
  181. + MAC_MODE | MAC_TX_EN | MAC_RX_EN |
  182. + BKOFF_EN | BACKPR_EN |
  183. + FORCE_RX_FC | FORCE_TX_FC |
  184. + (SPEED_1000M << FORCE_SPD_S) | FORCE_DPX |
  185. + FORCE_LINK;
  186. +
  187. + priv->mt753x_pmcr = pmcr;
  188. +
  189. + /* Keep MAC link down before starting eth */
  190. + mt753x_reg_write(priv, PMCR_REG(6), FORCE_MODE_LNK);
  191. +
  192. + /* Turn on PHYs */
  193. + for (i = 0; i < MT753X_NUM_PHYS; i++) {
  194. + phy_addr = MT753X_PHY_ADDR(priv->mt753x_phy_base, i);
  195. + phy_val = priv->mii_read(priv, phy_addr, MII_BMCR);
  196. + phy_val &= ~BMCR_PDOWN;
  197. + priv->mii_write(priv, phy_addr, MII_BMCR, phy_val);
  198. + }
  199. +
  200. + mt7988_phy_setting(priv);
  201. +
  202. + return 0;
  203. +}
  204. +
  205. static int mt753x_switch_init(struct mtk_eth_priv *priv)
  206. {
  207. int ret;
  208. @@ -1497,6 +1632,11 @@ static int mtk_eth_start(struct udevice
  209. }
  210. if (MTK_HAS_CAPS(priv->soc->caps, MTK_NETSYS_V3)) {
  211. + if (priv->sw == SW_MT7988 && priv->gmac_id == 0) {
  212. + mtk_gdma_write(priv, priv->gmac_id, GDMA_IG_CTRL_REG,
  213. + GDMA_BRIDGE_TO_CPU);
  214. + }
  215. +
  216. mtk_gdma_write(priv, priv->gmac_id, GDMA_EG_CTRL_REG,
  217. GDMA_CPU_BRIDGE_EN);
  218. }
  219. @@ -1845,6 +1985,12 @@ static int mtk_eth_of_to_plat(struct ude
  220. priv->switch_mac_control = mt7531_mac_control;
  221. priv->mt753x_smi_addr = MT753X_DFL_SMI_ADDR;
  222. priv->mt753x_reset_wait_time = 200;
  223. + } else if (!strcmp(str, "mt7988")) {
  224. + priv->sw = SW_MT7988;
  225. + priv->switch_init = mt7988_setup;
  226. + priv->switch_mac_control = mt7988_mac_control;
  227. + priv->mt753x_smi_addr = MT753X_DFL_SMI_ADDR;
  228. + priv->mt753x_reset_wait_time = 50;
  229. } else {
  230. printf("error: unsupported switch\n");
  231. return -EINVAL;
  232. @@ -1879,6 +2025,15 @@ static int mtk_eth_of_to_plat(struct ude
  233. return 0;
  234. }
  235. +static const struct mtk_soc_data mt7988_data = {
  236. + .caps = MT7988_CAPS,
  237. + .ana_rgc3 = 0x128,
  238. + .gdma_count = 3,
  239. + .pdma_base = PDMA_V3_BASE,
  240. + .txd_size = sizeof(struct mtk_tx_dma_v2),
  241. + .rxd_size = sizeof(struct mtk_rx_dma_v2),
  242. +};
  243. +
  244. static const struct mtk_soc_data mt7986_data = {
  245. .caps = MT7986_CAPS,
  246. .ana_rgc3 = 0x128,
  247. @@ -1930,6 +2085,7 @@ static const struct mtk_soc_data mt7621_
  248. };
  249. static const struct udevice_id mtk_eth_ids[] = {
  250. + { .compatible = "mediatek,mt7988-eth", .data = (ulong)&mt7988_data },
  251. { .compatible = "mediatek,mt7986-eth", .data = (ulong)&mt7986_data },
  252. { .compatible = "mediatek,mt7981-eth", .data = (ulong)&mt7981_data },
  253. { .compatible = "mediatek,mt7629-eth", .data = (ulong)&mt7629_data },
  254. --- a/drivers/net/mtk_eth.h
  255. +++ b/drivers/net/mtk_eth.h
  256. @@ -51,6 +51,8 @@ enum mkt_eth_capabilities {
  257. #define MT7986_CAPS (MTK_NETSYS_V2)
  258. +#define MT7988_CAPS (MTK_NETSYS_V3 | MTK_INFRA)
  259. +
  260. /* Frame Engine Register Bases */
  261. #define PDMA_V1_BASE 0x0800
  262. #define PDMA_V2_BASE 0x6000
  263. @@ -59,6 +61,7 @@ enum mkt_eth_capabilities {
  264. #define GDMA2_BASE 0x1500
  265. #define GDMA3_BASE 0x0540
  266. #define GMAC_BASE 0x10000
  267. +#define GSW_BASE 0x20000
  268. /* Ethernet subsystem registers */
  269. @@ -117,6 +120,9 @@ enum mkt_eth_capabilities {
  270. #define RG_XFI_PLL_ANA_SWWA 0x02283248
  271. /* Frame Engine Registers */
  272. +#define PSE_NO_DROP_CFG_REG 0x108
  273. +#define PSE_NO_DROP_GDM1 BIT(1)
  274. +
  275. #define FE_GLO_MISC_REG 0x124
  276. #define PDMA_VER_V2 BIT(4)
  277. @@ -187,6 +193,17 @@ enum mkt_eth_capabilities {
  278. #define MDIO_RW_DATA_S 0
  279. #define MDIO_RW_DATA_M 0xffff
  280. +#define GMAC_XGMAC_STS_REG 0x000c
  281. +#define P1_XGMAC_FORCE_LINK BIT(15)
  282. +
  283. +#define GMAC_MAC_MISC_REG 0x0010
  284. +
  285. +#define GMAC_GSW_CFG_REG 0x0080
  286. +#define GSWTX_IPG_M 0xF0000
  287. +#define GSWTX_IPG_S 16
  288. +#define GSWRX_IPG_M 0xF
  289. +#define GSWRX_IPG_S 0
  290. +
  291. /* MDIO_CMD: MDIO commands */
  292. #define MDIO_CMD_ADDR 0
  293. #define MDIO_CMD_WRITE 1
  294. @@ -285,6 +302,9 @@ enum mkt_eth_capabilities {
  295. FORCE_MODE_TX_FC | FORCE_MODE_RX_FC | \
  296. FORCE_MODE_DPX | FORCE_MODE_SPD | \
  297. FORCE_MODE_LNK
  298. +#define MT7988_FORCE_MODE FORCE_MODE_TX_FC | FORCE_MODE_RX_FC | \
  299. + FORCE_MODE_DPX | FORCE_MODE_SPD | \
  300. + FORCE_MODE_LNK
  301. /* MT7531 SGMII Registers */
  302. #define MT7531_SGMII_REG_BASE 0x5000