750-v6.5-08-net-ethernet-mtk_eth_soc-add-NETSYS_V3-version-suppo.patch 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307
  1. From a41d535855976838d246c079143c948dcf0f7931 Mon Sep 17 00:00:00 2001
  2. From: Lorenzo Bianconi <[email protected]>
  3. Date: Tue, 25 Jul 2023 01:52:59 +0100
  4. Subject: [PATCH 102/250] net: ethernet: mtk_eth_soc: add NETSYS_V3 version
  5. support
  6. Introduce NETSYS_V3 chipset version support.
  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. Link: https://lore.kernel.org/r/0db2260910755d76fa48e303b9f9bdf4e5a82340.1690246066.git.daniel@makrotopia.org
  11. Signed-off-by: Jakub Kicinski <[email protected]>
  12. ---
  13. drivers/net/ethernet/mediatek/mtk_eth_soc.c | 105 ++++++++++++++------
  14. drivers/net/ethernet/mediatek/mtk_eth_soc.h | 48 +++++++--
  15. 2 files changed, 116 insertions(+), 37 deletions(-)
  16. --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
  17. +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
  18. @@ -861,17 +861,32 @@ void mtk_stats_update_mac(struct mtk_mac
  19. mtk_r32(mac->hw, reg_map->gdm1_cnt + 0x20 + offs);
  20. hw_stats->rx_flow_control_packets +=
  21. mtk_r32(mac->hw, reg_map->gdm1_cnt + 0x24 + offs);
  22. - hw_stats->tx_skip +=
  23. - mtk_r32(mac->hw, reg_map->gdm1_cnt + 0x28 + offs);
  24. - hw_stats->tx_collisions +=
  25. - mtk_r32(mac->hw, reg_map->gdm1_cnt + 0x2c + offs);
  26. - hw_stats->tx_bytes +=
  27. - mtk_r32(mac->hw, reg_map->gdm1_cnt + 0x30 + offs);
  28. - stats = mtk_r32(mac->hw, reg_map->gdm1_cnt + 0x34 + offs);
  29. - if (stats)
  30. - hw_stats->tx_bytes += (stats << 32);
  31. - hw_stats->tx_packets +=
  32. - mtk_r32(mac->hw, reg_map->gdm1_cnt + 0x38 + offs);
  33. +
  34. + if (mtk_is_netsys_v3_or_greater(eth)) {
  35. + hw_stats->tx_skip +=
  36. + mtk_r32(mac->hw, reg_map->gdm1_cnt + 0x50 + offs);
  37. + hw_stats->tx_collisions +=
  38. + mtk_r32(mac->hw, reg_map->gdm1_cnt + 0x54 + offs);
  39. + hw_stats->tx_bytes +=
  40. + mtk_r32(mac->hw, reg_map->gdm1_cnt + 0x40 + offs);
  41. + stats = mtk_r32(mac->hw, reg_map->gdm1_cnt + 0x44 + offs);
  42. + if (stats)
  43. + hw_stats->tx_bytes += (stats << 32);
  44. + hw_stats->tx_packets +=
  45. + mtk_r32(mac->hw, reg_map->gdm1_cnt + 0x48 + offs);
  46. + } else {
  47. + hw_stats->tx_skip +=
  48. + mtk_r32(mac->hw, reg_map->gdm1_cnt + 0x28 + offs);
  49. + hw_stats->tx_collisions +=
  50. + mtk_r32(mac->hw, reg_map->gdm1_cnt + 0x2c + offs);
  51. + hw_stats->tx_bytes +=
  52. + mtk_r32(mac->hw, reg_map->gdm1_cnt + 0x30 + offs);
  53. + stats = mtk_r32(mac->hw, reg_map->gdm1_cnt + 0x34 + offs);
  54. + if (stats)
  55. + hw_stats->tx_bytes += (stats << 32);
  56. + hw_stats->tx_packets +=
  57. + mtk_r32(mac->hw, reg_map->gdm1_cnt + 0x38 + offs);
  58. + }
  59. }
  60. u64_stats_update_end(&hw_stats->syncp);
  61. @@ -1175,7 +1190,10 @@ static void mtk_tx_set_dma_desc_v2(struc
  62. data |= TX_DMA_LS0;
  63. WRITE_ONCE(desc->txd3, data);
  64. - data = (mac->id + 1) << TX_DMA_FPORT_SHIFT_V2; /* forward port */
  65. + if (mac->id == MTK_GMAC3_ID)
  66. + data = PSE_GDM3_PORT;
  67. + else
  68. + data = (mac->id + 1) << TX_DMA_FPORT_SHIFT_V2; /* forward port */
  69. data |= TX_DMA_SWC_V2 | QID_BITS_V2(info->qid);
  70. WRITE_ONCE(desc->txd4, data);
  71. @@ -1186,6 +1204,8 @@ static void mtk_tx_set_dma_desc_v2(struc
  72. /* tx checksum offload */
  73. if (info->csum)
  74. data |= TX_DMA_CHKSUM_V2;
  75. + if (mtk_is_netsys_v3_or_greater(eth) && netdev_uses_dsa(dev))
  76. + data |= TX_DMA_SPTAG_V3;
  77. }
  78. WRITE_ONCE(desc->txd5, data);
  79. @@ -1251,8 +1271,7 @@ static int mtk_tx_map(struct sk_buff *sk
  80. mtk_tx_set_dma_desc(dev, itxd, &txd_info);
  81. itx_buf->flags |= MTK_TX_FLAGS_SINGLE0;
  82. - itx_buf->flags |= (!mac->id) ? MTK_TX_FLAGS_FPORT0 :
  83. - MTK_TX_FLAGS_FPORT1;
  84. + itx_buf->mac_id = mac->id;
  85. setup_tx_buf(eth, itx_buf, itxd_pdma, txd_info.addr, txd_info.size,
  86. k++);
  87. @@ -1300,8 +1319,7 @@ static int mtk_tx_map(struct sk_buff *sk
  88. memset(tx_buf, 0, sizeof(*tx_buf));
  89. tx_buf->data = (void *)MTK_DMA_DUMMY_DESC;
  90. tx_buf->flags |= MTK_TX_FLAGS_PAGE0;
  91. - tx_buf->flags |= (!mac->id) ? MTK_TX_FLAGS_FPORT0 :
  92. - MTK_TX_FLAGS_FPORT1;
  93. + tx_buf->mac_id = mac->id;
  94. setup_tx_buf(eth, tx_buf, txd_pdma, txd_info.addr,
  95. txd_info.size, k++);
  96. @@ -1603,7 +1621,7 @@ static int mtk_xdp_frame_map(struct mtk_
  97. }
  98. mtk_tx_set_dma_desc(dev, txd, txd_info);
  99. - tx_buf->flags |= !mac->id ? MTK_TX_FLAGS_FPORT0 : MTK_TX_FLAGS_FPORT1;
  100. + tx_buf->mac_id = mac->id;
  101. tx_buf->type = dma_map ? MTK_TYPE_XDP_NDO : MTK_TYPE_XDP_TX;
  102. tx_buf->data = (void *)MTK_DMA_DUMMY_DESC;
  103. @@ -1853,11 +1871,24 @@ static int mtk_poll_rx(struct napi_struc
  104. break;
  105. /* find out which mac the packet come from. values start at 1 */
  106. - if (mtk_is_netsys_v2_or_greater(eth))
  107. - mac = RX_DMA_GET_SPORT_V2(trxd.rxd5) - 1;
  108. - else if (!MTK_HAS_CAPS(eth->soc->caps, MTK_SOC_MT7628) &&
  109. - !(trxd.rxd4 & RX_DMA_SPECIAL_TAG))
  110. + if (mtk_is_netsys_v2_or_greater(eth)) {
  111. + u32 val = RX_DMA_GET_SPORT_V2(trxd.rxd5);
  112. +
  113. + switch (val) {
  114. + case PSE_GDM1_PORT:
  115. + case PSE_GDM2_PORT:
  116. + mac = val - 1;
  117. + break;
  118. + case PSE_GDM3_PORT:
  119. + mac = MTK_GMAC3_ID;
  120. + break;
  121. + default:
  122. + break;
  123. + }
  124. + } else if (!MTK_HAS_CAPS(eth->soc->caps, MTK_SOC_MT7628) &&
  125. + !(trxd.rxd4 & RX_DMA_SPECIAL_TAG)) {
  126. mac = RX_DMA_GET_SPORT(trxd.rxd4) - 1;
  127. + }
  128. if (unlikely(mac < 0 || mac >= MTK_MAX_DEVS ||
  129. !eth->netdev[mac]))
  130. @@ -2079,7 +2110,6 @@ static int mtk_poll_tx_qdma(struct mtk_e
  131. while ((cpu != dma) && budget) {
  132. u32 next_cpu = desc->txd2;
  133. - int mac = 0;
  134. desc = mtk_qdma_phys_to_virt(ring, desc->txd2);
  135. if ((desc->txd3 & TX_DMA_OWNER_CPU) == 0)
  136. @@ -2087,15 +2117,13 @@ static int mtk_poll_tx_qdma(struct mtk_e
  137. tx_buf = mtk_desc_to_tx_buf(ring, desc,
  138. eth->soc->txrx.txd_size);
  139. - if (tx_buf->flags & MTK_TX_FLAGS_FPORT1)
  140. - mac = 1;
  141. -
  142. if (!tx_buf->data)
  143. break;
  144. if (tx_buf->data != (void *)MTK_DMA_DUMMY_DESC) {
  145. if (tx_buf->type == MTK_TYPE_SKB)
  146. - mtk_poll_tx_done(eth, state, mac, tx_buf->data);
  147. + mtk_poll_tx_done(eth, state, tx_buf->mac_id,
  148. + tx_buf->data);
  149. budget--;
  150. }
  151. @@ -3704,7 +3732,24 @@ static int mtk_hw_init(struct mtk_eth *e
  152. mtk_w32(eth, eth->soc->txrx.rx_irq_done_mask, reg_map->qdma.int_grp + 4);
  153. mtk_w32(eth, 0x21021000, MTK_FE_INT_GRP);
  154. - if (mtk_is_netsys_v2_or_greater(eth)) {
  155. + if (mtk_is_netsys_v3_or_greater(eth)) {
  156. + /* PSE should not drop port1, port8 and port9 packets */
  157. + mtk_w32(eth, 0x00000302, PSE_DROP_CFG);
  158. +
  159. + /* GDM and CDM Threshold */
  160. + mtk_w32(eth, 0x00000707, MTK_CDMW0_THRES);
  161. + mtk_w32(eth, 0x00000077, MTK_CDMW1_THRES);
  162. +
  163. + /* Disable GDM1 RX CRC stripping */
  164. + mtk_m32(eth, MTK_GDMA_STRP_CRC, 0, MTK_GDMA_FWD_CFG(0));
  165. +
  166. + /* PSE GDM3 MIB counter has incorrect hw default values,
  167. + * so the driver ought to read clear the values beforehand
  168. + * in case ethtool retrieve wrong mib values.
  169. + */
  170. + for (i = 0; i < 0x80; i += 0x4)
  171. + mtk_r32(eth, reg_map->gdm1_cnt + 0x100 + i);
  172. + } else if (!mtk_is_netsys_v1(eth)) {
  173. /* PSE should not drop port8 and port9 packets from WDMA Tx */
  174. mtk_w32(eth, 0x00000300, PSE_DROP_CFG);
  175. @@ -4266,7 +4311,11 @@ static int mtk_add_mac(struct mtk_eth *e
  176. }
  177. spin_lock_init(&mac->hw_stats->stats_lock);
  178. u64_stats_init(&mac->hw_stats->syncp);
  179. - mac->hw_stats->reg_offset = id * MTK_STAT_OFFSET;
  180. +
  181. + if (mtk_is_netsys_v3_or_greater(eth))
  182. + mac->hw_stats->reg_offset = id * 0x80;
  183. + else
  184. + mac->hw_stats->reg_offset = id * 0x40;
  185. /* phylink create */
  186. err = of_get_phy_mode(np, &phy_mode);
  187. --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h
  188. +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
  189. @@ -122,6 +122,7 @@
  190. #define MTK_GDMA_ICS_EN BIT(22)
  191. #define MTK_GDMA_TCS_EN BIT(21)
  192. #define MTK_GDMA_UCS_EN BIT(20)
  193. +#define MTK_GDMA_STRP_CRC BIT(16)
  194. #define MTK_GDMA_TO_PDMA 0x0
  195. #define MTK_GDMA_DROP_ALL 0x7777
  196. @@ -287,8 +288,6 @@
  197. /* QDMA Interrupt grouping registers */
  198. #define MTK_RLS_DONE_INT BIT(0)
  199. -#define MTK_STAT_OFFSET 0x40
  200. -
  201. /* QDMA TX NUM */
  202. #define QID_BITS_V2(x) (((x) & 0x3f) << 16)
  203. #define MTK_QDMA_GMAC2_QID 8
  204. @@ -301,6 +300,8 @@
  205. #define TX_DMA_CHKSUM_V2 (0x7 << 28)
  206. #define TX_DMA_TSO_V2 BIT(31)
  207. +#define TX_DMA_SPTAG_V3 BIT(27)
  208. +
  209. /* QDMA V2 descriptor txd4 */
  210. #define TX_DMA_FPORT_SHIFT_V2 8
  211. #define TX_DMA_FPORT_MASK_V2 0xf
  212. @@ -634,12 +635,6 @@ enum mtk_tx_flags {
  213. */
  214. MTK_TX_FLAGS_SINGLE0 = 0x01,
  215. MTK_TX_FLAGS_PAGE0 = 0x02,
  216. -
  217. - /* MTK_TX_FLAGS_FPORTx allows tracking which port the transmitted
  218. - * SKB out instead of looking up through hardware TX descriptor.
  219. - */
  220. - MTK_TX_FLAGS_FPORT0 = 0x04,
  221. - MTK_TX_FLAGS_FPORT1 = 0x08,
  222. };
  223. /* This enum allows us to identify how the clock is defined on the array of the
  224. @@ -725,6 +720,35 @@ enum mtk_dev_state {
  225. MTK_RESETTING
  226. };
  227. +/* PSE Port Definition */
  228. +enum mtk_pse_port {
  229. + PSE_ADMA_PORT = 0,
  230. + PSE_GDM1_PORT,
  231. + PSE_GDM2_PORT,
  232. + PSE_PPE0_PORT,
  233. + PSE_PPE1_PORT,
  234. + PSE_QDMA_TX_PORT,
  235. + PSE_QDMA_RX_PORT,
  236. + PSE_DROP_PORT,
  237. + PSE_WDMA0_PORT,
  238. + PSE_WDMA1_PORT,
  239. + PSE_TDMA_PORT,
  240. + PSE_NONE_PORT,
  241. + PSE_PPE2_PORT,
  242. + PSE_WDMA2_PORT,
  243. + PSE_EIP197_PORT,
  244. + PSE_GDM3_PORT,
  245. + PSE_PORT_MAX
  246. +};
  247. +
  248. +/* GMAC Identifier */
  249. +enum mtk_gmac_id {
  250. + MTK_GMAC1_ID = 0,
  251. + MTK_GMAC2_ID,
  252. + MTK_GMAC3_ID,
  253. + MTK_GMAC_ID_MAX
  254. +};
  255. +
  256. enum mtk_tx_buf_type {
  257. MTK_TYPE_SKB,
  258. MTK_TYPE_XDP_TX,
  259. @@ -743,7 +767,8 @@ struct mtk_tx_buf {
  260. enum mtk_tx_buf_type type;
  261. void *data;
  262. - u32 flags;
  263. + u16 mac_id;
  264. + u16 flags;
  265. DEFINE_DMA_UNMAP_ADDR(dma_addr0);
  266. DEFINE_DMA_UNMAP_LEN(dma_len0);
  267. DEFINE_DMA_UNMAP_ADDR(dma_addr1);
  268. @@ -1192,6 +1217,11 @@ static inline bool mtk_is_netsys_v2_or_g
  269. return eth->soc->version > 1;
  270. }
  271. +static inline bool mtk_is_netsys_v3_or_greater(struct mtk_eth *eth)
  272. +{
  273. + return eth->soc->version > 2;
  274. +}
  275. +
  276. static inline struct mtk_foe_entry *
  277. mtk_foe_get_entry(struct mtk_ppe *ppe, u16 hash)
  278. {