737-04-net-ethernet-mtk_eth_soc-add-MTK_NETSYS_V3-capabilit.patch 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  1. From ab817f559d505329d8a413c7d29250f6d87d77a0 Mon Sep 17 00:00:00 2001
  2. From: Lorenzo Bianconi <[email protected]>
  3. Date: Tue, 7 Mar 2023 15:55:47 +0000
  4. Subject: [PATCH 4/7] net: ethernet: mtk_eth_soc: add MTK_NETSYS_V3 capability
  5. bit
  6. Introduce MTK_NETSYS_V3 bit in the device capabilities.
  7. This is a preliminary patch to introduce support for MT7988 SoC.
  8. Signed-off-by: Lorenzo Bianconi <[email protected]>
  9. Signed-off-by: Daniel Golle <[email protected]>
  10. ---
  11. drivers/net/ethernet/mediatek/mtk_eth_soc.c | 115 ++++++++++++++++----
  12. drivers/net/ethernet/mediatek/mtk_eth_soc.h | 44 +++++++-
  13. 2 files changed, 134 insertions(+), 25 deletions(-)
  14. --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
  15. +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
  16. @@ -880,17 +880,32 @@ void mtk_stats_update_mac(struct mtk_mac
  17. mtk_r32(mac->hw, reg_map->gdm1_cnt + 0x20 + offs);
  18. hw_stats->rx_flow_control_packets +=
  19. mtk_r32(mac->hw, reg_map->gdm1_cnt + 0x24 + offs);
  20. - hw_stats->tx_skip +=
  21. - mtk_r32(mac->hw, reg_map->gdm1_cnt + 0x28 + offs);
  22. - hw_stats->tx_collisions +=
  23. - mtk_r32(mac->hw, reg_map->gdm1_cnt + 0x2c + offs);
  24. - hw_stats->tx_bytes +=
  25. - mtk_r32(mac->hw, reg_map->gdm1_cnt + 0x30 + offs);
  26. - stats = mtk_r32(mac->hw, reg_map->gdm1_cnt + 0x34 + offs);
  27. - if (stats)
  28. - hw_stats->tx_bytes += (stats << 32);
  29. - hw_stats->tx_packets +=
  30. - mtk_r32(mac->hw, reg_map->gdm1_cnt + 0x38 + offs);
  31. +
  32. + if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V3)) {
  33. + hw_stats->tx_skip +=
  34. + mtk_r32(mac->hw, reg_map->gdm1_cnt + 0x50 + offs);
  35. + hw_stats->tx_collisions +=
  36. + mtk_r32(mac->hw, reg_map->gdm1_cnt + 0x54 + offs);
  37. + hw_stats->tx_bytes +=
  38. + mtk_r32(mac->hw, reg_map->gdm1_cnt + 0x40 + offs);
  39. + stats = mtk_r32(mac->hw, reg_map->gdm1_cnt + 0x44 + offs);
  40. + if (stats)
  41. + hw_stats->tx_bytes += (stats << 32);
  42. + hw_stats->tx_packets +=
  43. + mtk_r32(mac->hw, reg_map->gdm1_cnt + 0x48 + offs);
  44. + } else {
  45. + hw_stats->tx_skip +=
  46. + mtk_r32(mac->hw, reg_map->gdm1_cnt + 0x28 + offs);
  47. + hw_stats->tx_collisions +=
  48. + mtk_r32(mac->hw, reg_map->gdm1_cnt + 0x2c + offs);
  49. + hw_stats->tx_bytes +=
  50. + mtk_r32(mac->hw, reg_map->gdm1_cnt + 0x30 + offs);
  51. + stats = mtk_r32(mac->hw, reg_map->gdm1_cnt + 0x34 + offs);
  52. + if (stats)
  53. + hw_stats->tx_bytes += (stats << 32);
  54. + hw_stats->tx_packets +=
  55. + mtk_r32(mac->hw, reg_map->gdm1_cnt + 0x38 + offs);
  56. + }
  57. }
  58. u64_stats_update_end(&hw_stats->syncp);
  59. @@ -1192,7 +1207,10 @@ static void mtk_tx_set_dma_desc_v2(struc
  60. data |= TX_DMA_LS0;
  61. WRITE_ONCE(desc->txd3, data);
  62. - data = (mac->id + 1) << TX_DMA_FPORT_SHIFT_V2; /* forward port */
  63. + if (mac->id == MTK_GMAC3_ID)
  64. + data = PSE_GDM3_PORT;
  65. + else
  66. + data = (mac->id + 1) << TX_DMA_FPORT_SHIFT_V2; /* forward port */
  67. data |= TX_DMA_SWC_V2 | QID_BITS_V2(info->qid);
  68. WRITE_ONCE(desc->txd4, data);
  69. @@ -1203,6 +1221,9 @@ static void mtk_tx_set_dma_desc_v2(struc
  70. /* tx checksum offload */
  71. if (info->csum)
  72. data |= TX_DMA_CHKSUM_V2;
  73. + if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V3) &&
  74. + netdev_uses_dsa(dev))
  75. + data |= TX_DMA_SPTAG_V3;
  76. }
  77. WRITE_ONCE(desc->txd5, data);
  78. @@ -1268,8 +1289,13 @@ static int mtk_tx_map(struct sk_buff *sk
  79. mtk_tx_set_dma_desc(dev, itxd, &txd_info);
  80. itx_buf->flags |= MTK_TX_FLAGS_SINGLE0;
  81. - itx_buf->flags |= (!mac->id) ? MTK_TX_FLAGS_FPORT0 :
  82. - MTK_TX_FLAGS_FPORT1;
  83. + if (mac->id == MTK_GMAC1_ID)
  84. + itx_buf->flags |= MTK_TX_FLAGS_FPORT0;
  85. + else if (mac->id == MTK_GMAC2_ID)
  86. + itx_buf->flags |= MTK_TX_FLAGS_FPORT1;
  87. + else
  88. + itx_buf->flags |= MTK_TX_FLAGS_FPORT2;
  89. +
  90. setup_tx_buf(eth, itx_buf, itxd_pdma, txd_info.addr, txd_info.size,
  91. k++);
  92. @@ -1317,8 +1343,13 @@ static int mtk_tx_map(struct sk_buff *sk
  93. memset(tx_buf, 0, sizeof(*tx_buf));
  94. tx_buf->data = (void *)MTK_DMA_DUMMY_DESC;
  95. tx_buf->flags |= MTK_TX_FLAGS_PAGE0;
  96. - tx_buf->flags |= (!mac->id) ? MTK_TX_FLAGS_FPORT0 :
  97. - MTK_TX_FLAGS_FPORT1;
  98. +
  99. + if (mac->id == MTK_GMAC1_ID)
  100. + tx_buf->flags |= MTK_TX_FLAGS_FPORT0;
  101. + else if (mac->id == MTK_GMAC2_ID)
  102. + tx_buf->flags |= MTK_TX_FLAGS_FPORT1;
  103. + else
  104. + tx_buf->flags |= MTK_TX_FLAGS_FPORT2;
  105. setup_tx_buf(eth, tx_buf, txd_pdma, txd_info.addr,
  106. txd_info.size, k++);
  107. @@ -1902,11 +1933,24 @@ static int mtk_poll_rx(struct napi_struc
  108. break;
  109. /* find out which mac the packet come from. values start at 1 */
  110. - if (!MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V1))
  111. - mac = RX_DMA_GET_SPORT_V2(trxd.rxd5) - 1;
  112. - else if (!MTK_HAS_CAPS(eth->soc->caps, MTK_SOC_MT7628) &&
  113. - !(trxd.rxd4 & RX_DMA_SPECIAL_TAG))
  114. + if (!MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V1)) {
  115. + u32 val = RX_DMA_GET_SPORT_V2(trxd.rxd5);
  116. +
  117. + switch (val) {
  118. + case PSE_GDM1_PORT:
  119. + case PSE_GDM2_PORT:
  120. + mac = val - 1;
  121. + break;
  122. + case PSE_GDM3_PORT:
  123. + mac = MTK_GMAC3_ID;
  124. + break;
  125. + default:
  126. + break;
  127. + }
  128. + } else if (!MTK_HAS_CAPS(eth->soc->caps, MTK_SOC_MT7628) &&
  129. + !(trxd.rxd4 & RX_DMA_SPECIAL_TAG)) {
  130. mac = RX_DMA_GET_SPORT(trxd.rxd4) - 1;
  131. + }
  132. if (unlikely(mac < 0 || mac >= eth->soc->num_devs ||
  133. !eth->netdev[mac]))
  134. @@ -2135,7 +2179,9 @@ static int mtk_poll_tx_qdma(struct mtk_e
  135. tx_buf = mtk_desc_to_tx_buf(ring, desc,
  136. eth->soc->txrx.txd_size);
  137. if (tx_buf->flags & MTK_TX_FLAGS_FPORT1)
  138. - mac = 1;
  139. + mac = MTK_GMAC2_ID;
  140. + else if (tx_buf->flags & MTK_TX_FLAGS_FPORT2)
  141. + mac = MTK_GMAC3_ID;
  142. if (!tx_buf->data)
  143. break;
  144. @@ -3742,7 +3788,26 @@ static int mtk_hw_init(struct mtk_eth *e
  145. mtk_w32(eth, eth->soc->txrx.rx_irq_done_mask, reg_map->qdma.int_grp + 4);
  146. mtk_w32(eth, 0x21021000, MTK_FE_INT_GRP);
  147. - if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) {
  148. + if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V3)) {
  149. + /* PSE should not drop port1, port8 and port9 packets */
  150. + mtk_w32(eth, 0x00000302, PSE_DROP_CFG);
  151. +
  152. + /* GDM and CDM Threshold */
  153. + mtk_w32(eth, 0x00000707, MTK_CDMW0_THRES);
  154. + mtk_w32(eth, 0x00000077, MTK_CDMW1_THRES);
  155. +
  156. + /* Disable GDM1 RX CRC stripping */
  157. + val = mtk_r32(eth, MTK_GDMA_FWD_CFG(0));
  158. + val &= ~MTK_GDMA_STRP_CRC;
  159. + mtk_w32(eth, val, MTK_GDMA_FWD_CFG(0));
  160. +
  161. + /* PSE GDM3 MIB counter has incorrect hw default values,
  162. + * so the driver ought to read clear the values beforehand
  163. + * in case ethtool retrieve wrong mib values.
  164. + */
  165. + for (i = 0; i < 0x80; i += 0x4)
  166. + mtk_r32(eth, reg_map->gdm1_cnt + 0x100 + i);
  167. + } else if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) {
  168. /* PSE should not drop port8 and port9 packets from WDMA Tx */
  169. mtk_w32(eth, 0x00000300, PSE_DROP_CFG);
  170. @@ -4314,7 +4379,11 @@ static int mtk_add_mac(struct mtk_eth *e
  171. }
  172. spin_lock_init(&mac->hw_stats->stats_lock);
  173. u64_stats_init(&mac->hw_stats->syncp);
  174. - mac->hw_stats->reg_offset = id * MTK_STAT_OFFSET;
  175. +
  176. + if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V3))
  177. + mac->hw_stats->reg_offset = id * 0x80;
  178. + else
  179. + mac->hw_stats->reg_offset = id * 0x40;
  180. /* phylink create */
  181. err = of_get_phy_mode(np, &phy_mode);
  182. --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h
  183. +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
  184. @@ -121,6 +121,7 @@
  185. #define MTK_GDMA_ICS_EN BIT(22)
  186. #define MTK_GDMA_TCS_EN BIT(21)
  187. #define MTK_GDMA_UCS_EN BIT(20)
  188. +#define MTK_GDMA_STRP_CRC BIT(16)
  189. #define MTK_GDMA_TO_PDMA 0x0
  190. #define MTK_GDMA_DROP_ALL 0x7777
  191. @@ -286,8 +287,6 @@
  192. /* QDMA Interrupt grouping registers */
  193. #define MTK_RLS_DONE_INT BIT(0)
  194. -#define MTK_STAT_OFFSET 0x40
  195. -
  196. /* QDMA TX NUM */
  197. #define QID_BITS_V2(x) (((x) & 0x3f) << 16)
  198. #define MTK_QDMA_GMAC2_QID 8
  199. @@ -300,6 +299,8 @@
  200. #define TX_DMA_CHKSUM_V2 (0x7 << 28)
  201. #define TX_DMA_TSO_V2 BIT(31)
  202. +#define TX_DMA_SPTAG_V3 BIT(27)
  203. +
  204. /* QDMA V2 descriptor txd4 */
  205. #define TX_DMA_FPORT_SHIFT_V2 8
  206. #define TX_DMA_FPORT_MASK_V2 0xf
  207. @@ -636,6 +637,7 @@ enum mtk_tx_flags {
  208. */
  209. MTK_TX_FLAGS_FPORT0 = 0x04,
  210. MTK_TX_FLAGS_FPORT1 = 0x08,
  211. + MTK_TX_FLAGS_FPORT2 = 0x10,
  212. };
  213. /* This enum allows us to identify how the clock is defined on the array of the
  214. @@ -721,6 +723,42 @@ enum mtk_dev_state {
  215. MTK_RESETTING
  216. };
  217. +/* PSE Port Definition */
  218. +enum mtk_pse_port {
  219. + PSE_ADMA_PORT = 0,
  220. + PSE_GDM1_PORT,
  221. + PSE_GDM2_PORT,
  222. + PSE_PPE0_PORT,
  223. + PSE_PPE1_PORT,
  224. + PSE_QDMA_TX_PORT,
  225. + PSE_QDMA_RX_PORT,
  226. + PSE_DROP_PORT,
  227. + PSE_WDMA0_PORT,
  228. + PSE_WDMA1_PORT,
  229. + PSE_TDMA_PORT,
  230. + PSE_NONE_PORT,
  231. + PSE_PPE2_PORT,
  232. + PSE_WDMA2_PORT,
  233. + PSE_EIP197_PORT,
  234. + PSE_GDM3_PORT,
  235. + PSE_PORT_MAX
  236. +};
  237. +
  238. +/* GMAC Identifier */
  239. +enum mtk_gmac_id {
  240. + MTK_GMAC1_ID = 0,
  241. + MTK_GMAC2_ID,
  242. + MTK_GMAC3_ID,
  243. + MTK_GMAC_ID_MAX
  244. +};
  245. +
  246. +/* GDM Type */
  247. +enum mtk_gdm_type {
  248. + MTK_GDM_TYPE = 0,
  249. + MTK_XGDM_TYPE,
  250. + MTK_GDM_TYPE_MAX
  251. +};
  252. +
  253. enum mtk_tx_buf_type {
  254. MTK_TYPE_SKB,
  255. MTK_TYPE_XDP_TX,
  256. @@ -817,6 +855,7 @@ enum mkt_eth_capabilities {
  257. MTK_QDMA_BIT,
  258. MTK_NETSYS_V1_BIT,
  259. MTK_NETSYS_V2_BIT,
  260. + MTK_NETSYS_V3_BIT,
  261. MTK_SOC_MT7628_BIT,
  262. MTK_RSTCTRL_PPE1_BIT,
  263. MTK_U3_COPHY_V2_BIT,
  264. @@ -853,6 +892,7 @@ enum mkt_eth_capabilities {
  265. #define MTK_QDMA BIT(MTK_QDMA_BIT)
  266. #define MTK_NETSYS_V1 BIT(MTK_NETSYS_V1_BIT)
  267. #define MTK_NETSYS_V2 BIT(MTK_NETSYS_V2_BIT)
  268. +#define MTK_NETSYS_V3 BIT(MTK_NETSYS_V3_BIT)
  269. #define MTK_SOC_MT7628 BIT(MTK_SOC_MT7628_BIT)
  270. #define MTK_RSTCTRL_PPE1 BIT(MTK_RSTCTRL_PPE1_BIT)
  271. #define MTK_U3_COPHY_V2 BIT(MTK_U3_COPHY_V2_BIT)