752-13-v6.7-net-ethernet-mtk_wed-add-mtk_wed_soc_data-structure.patch 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. From: Lorenzo Bianconi <[email protected]>
  2. Date: Mon, 18 Sep 2023 12:29:12 +0200
  3. Subject: [PATCH] net: ethernet: mtk_wed: add mtk_wed_soc_data structure
  4. Introduce mtk_wed_soc_data utility structure to contain per-SoC
  5. definitions.
  6. Signed-off-by: Lorenzo Bianconi <[email protected]>
  7. Signed-off-by: Paolo Abeni <[email protected]>
  8. ---
  9. --- a/drivers/net/ethernet/mediatek/mtk_wed.c
  10. +++ b/drivers/net/ethernet/mediatek/mtk_wed.c
  11. @@ -49,6 +49,26 @@ struct mtk_wed_flow_block_priv {
  12. struct net_device *dev;
  13. };
  14. +static const struct mtk_wed_soc_data mt7622_data = {
  15. + .regmap = {
  16. + .tx_bm_tkid = 0x088,
  17. + .wpdma_rx_ring0 = 0x770,
  18. + .reset_idx_tx_mask = GENMASK(3, 0),
  19. + .reset_idx_rx_mask = GENMASK(17, 16),
  20. + },
  21. + .wdma_desc_size = sizeof(struct mtk_wdma_desc),
  22. +};
  23. +
  24. +static const struct mtk_wed_soc_data mt7986_data = {
  25. + .regmap = {
  26. + .tx_bm_tkid = 0x0c8,
  27. + .wpdma_rx_ring0 = 0x770,
  28. + .reset_idx_tx_mask = GENMASK(1, 0),
  29. + .reset_idx_rx_mask = GENMASK(7, 6),
  30. + },
  31. + .wdma_desc_size = 2 * sizeof(struct mtk_wdma_desc),
  32. +};
  33. +
  34. static void
  35. wed_m32(struct mtk_wed_device *dev, u32 reg, u32 mask, u32 val)
  36. {
  37. @@ -746,7 +766,7 @@ mtk_wed_set_wpdma(struct mtk_wed_device
  38. return;
  39. wed_w32(dev, MTK_WED_WPDMA_RX_GLO_CFG, dev->wlan.wpdma_rx_glo);
  40. - wed_w32(dev, MTK_WED_WPDMA_RX_RING, dev->wlan.wpdma_rx);
  41. + wed_w32(dev, dev->hw->soc->regmap.wpdma_rx_ring0, dev->wlan.wpdma_rx);
  42. }
  43. static void
  44. @@ -940,22 +960,10 @@ mtk_wed_hw_init(struct mtk_wed_device *d
  45. wed_w32(dev, MTK_WED_TX_BM_BUF_LEN, MTK_WED_PKT_SIZE);
  46. if (mtk_wed_is_v1(dev->hw)) {
  47. - wed_w32(dev, MTK_WED_TX_BM_TKID,
  48. - FIELD_PREP(MTK_WED_TX_BM_TKID_START,
  49. - dev->wlan.token_start) |
  50. - FIELD_PREP(MTK_WED_TX_BM_TKID_END,
  51. - dev->wlan.token_start +
  52. - dev->wlan.nbuf - 1));
  53. wed_w32(dev, MTK_WED_TX_BM_DYN_THR,
  54. FIELD_PREP(MTK_WED_TX_BM_DYN_THR_LO, 1) |
  55. MTK_WED_TX_BM_DYN_THR_HI);
  56. } else {
  57. - wed_w32(dev, MTK_WED_TX_BM_TKID_V2,
  58. - FIELD_PREP(MTK_WED_TX_BM_TKID_START,
  59. - dev->wlan.token_start) |
  60. - FIELD_PREP(MTK_WED_TX_BM_TKID_END,
  61. - dev->wlan.token_start +
  62. - dev->wlan.nbuf - 1));
  63. wed_w32(dev, MTK_WED_TX_BM_DYN_THR,
  64. FIELD_PREP(MTK_WED_TX_BM_DYN_THR_LO_V2, 0) |
  65. MTK_WED_TX_BM_DYN_THR_HI_V2);
  66. @@ -970,6 +978,11 @@ mtk_wed_hw_init(struct mtk_wed_device *d
  67. MTK_WED_TX_TKID_DYN_THR_HI);
  68. }
  69. + wed_w32(dev, dev->hw->soc->regmap.tx_bm_tkid,
  70. + FIELD_PREP(MTK_WED_TX_BM_TKID_START, dev->wlan.token_start) |
  71. + FIELD_PREP(MTK_WED_TX_BM_TKID_END,
  72. + dev->wlan.token_start + dev->wlan.nbuf - 1));
  73. +
  74. mtk_wed_reset(dev, MTK_WED_RESET_TX_BM);
  75. if (mtk_wed_is_v1(dev->hw)) {
  76. @@ -1104,13 +1117,8 @@ mtk_wed_rx_reset(struct mtk_wed_device *
  77. if (ret) {
  78. mtk_wed_reset(dev, MTK_WED_RESET_WED_RX_DMA);
  79. } else {
  80. - struct mtk_eth *eth = dev->hw->eth;
  81. -
  82. - if (mtk_is_netsys_v2_or_greater(eth))
  83. - wed_set(dev, MTK_WED_RESET_IDX,
  84. - MTK_WED_RESET_IDX_RX_V2);
  85. - else
  86. - wed_set(dev, MTK_WED_RESET_IDX, MTK_WED_RESET_IDX_RX);
  87. + wed_set(dev, MTK_WED_RESET_IDX,
  88. + dev->hw->soc->regmap.reset_idx_rx_mask);
  89. wed_w32(dev, MTK_WED_RESET_IDX, 0);
  90. }
  91. @@ -1163,7 +1171,8 @@ mtk_wed_reset_dma(struct mtk_wed_device
  92. if (busy) {
  93. mtk_wed_reset(dev, MTK_WED_RESET_WED_TX_DMA);
  94. } else {
  95. - wed_w32(dev, MTK_WED_RESET_IDX, MTK_WED_RESET_IDX_TX);
  96. + wed_w32(dev, MTK_WED_RESET_IDX,
  97. + dev->hw->soc->regmap.reset_idx_tx_mask);
  98. wed_w32(dev, MTK_WED_RESET_IDX, 0);
  99. }
  100. @@ -1255,7 +1264,6 @@ static int
  101. mtk_wed_wdma_rx_ring_setup(struct mtk_wed_device *dev, int idx, int size,
  102. bool reset)
  103. {
  104. - u32 desc_size = sizeof(struct mtk_wdma_desc) * dev->hw->version;
  105. struct mtk_wed_ring *wdma;
  106. if (idx >= ARRAY_SIZE(dev->rx_wdma))
  107. @@ -1263,7 +1271,7 @@ mtk_wed_wdma_rx_ring_setup(struct mtk_we
  108. wdma = &dev->rx_wdma[idx];
  109. if (!reset && mtk_wed_ring_alloc(dev, wdma, MTK_WED_WDMA_RING_SIZE,
  110. - desc_size, true))
  111. + dev->hw->soc->wdma_desc_size, true))
  112. return -ENOMEM;
  113. wdma_w32(dev, MTK_WDMA_RING_RX(idx) + MTK_WED_RING_OFS_BASE,
  114. @@ -1284,7 +1292,6 @@ static int
  115. mtk_wed_wdma_tx_ring_setup(struct mtk_wed_device *dev, int idx, int size,
  116. bool reset)
  117. {
  118. - u32 desc_size = sizeof(struct mtk_wdma_desc) * dev->hw->version;
  119. struct mtk_wed_ring *wdma;
  120. if (idx >= ARRAY_SIZE(dev->tx_wdma))
  121. @@ -1292,7 +1299,7 @@ mtk_wed_wdma_tx_ring_setup(struct mtk_we
  122. wdma = &dev->tx_wdma[idx];
  123. if (!reset && mtk_wed_ring_alloc(dev, wdma, MTK_WED_WDMA_RING_SIZE,
  124. - desc_size, true))
  125. + dev->hw->soc->wdma_desc_size, true))
  126. return -ENOMEM;
  127. wdma_w32(dev, MTK_WDMA_RING_TX(idx) + MTK_WED_RING_OFS_BASE,
  128. @@ -1928,7 +1935,12 @@ void mtk_wed_add_hw(struct device_node *
  129. hw->irq = irq;
  130. hw->version = eth->soc->version;
  131. - if (mtk_wed_is_v1(hw)) {
  132. + switch (hw->version) {
  133. + case 2:
  134. + hw->soc = &mt7986_data;
  135. + break;
  136. + default:
  137. + case 1:
  138. hw->mirror = syscon_regmap_lookup_by_phandle(eth_np,
  139. "mediatek,pcie-mirror");
  140. hw->hifsys = syscon_regmap_lookup_by_phandle(eth_np,
  141. @@ -1942,6 +1954,8 @@ void mtk_wed_add_hw(struct device_node *
  142. regmap_write(hw->mirror, 0, 0);
  143. regmap_write(hw->mirror, 4, 0);
  144. }
  145. + hw->soc = &mt7622_data;
  146. + break;
  147. }
  148. mtk_wed_hw_add_debugfs(hw);
  149. --- a/drivers/net/ethernet/mediatek/mtk_wed.h
  150. +++ b/drivers/net/ethernet/mediatek/mtk_wed.h
  151. @@ -12,7 +12,18 @@
  152. struct mtk_eth;
  153. struct mtk_wed_wo;
  154. +struct mtk_wed_soc_data {
  155. + struct {
  156. + u32 tx_bm_tkid;
  157. + u32 wpdma_rx_ring0;
  158. + u32 reset_idx_tx_mask;
  159. + u32 reset_idx_rx_mask;
  160. + } regmap;
  161. + u32 wdma_desc_size;
  162. +};
  163. +
  164. struct mtk_wed_hw {
  165. + const struct mtk_wed_soc_data *soc;
  166. struct device_node *node;
  167. struct mtk_eth *eth;
  168. struct regmap *regs;
  169. --- a/drivers/net/ethernet/mediatek/mtk_wed_regs.h
  170. +++ b/drivers/net/ethernet/mediatek/mtk_wed_regs.h
  171. @@ -100,8 +100,6 @@ struct mtk_wdma_desc {
  172. #define MTK_WED_TX_BM_BASE 0x084
  173. -#define MTK_WED_TX_BM_TKID 0x088
  174. -#define MTK_WED_TX_BM_TKID_V2 0x0c8
  175. #define MTK_WED_TX_BM_TKID_START GENMASK(15, 0)
  176. #define MTK_WED_TX_BM_TKID_END GENMASK(31, 16)
  177. @@ -160,9 +158,6 @@ struct mtk_wdma_desc {
  178. #define MTK_WED_GLO_CFG_RX_2B_OFFSET BIT(31)
  179. #define MTK_WED_RESET_IDX 0x20c
  180. -#define MTK_WED_RESET_IDX_TX GENMASK(3, 0)
  181. -#define MTK_WED_RESET_IDX_RX GENMASK(17, 16)
  182. -#define MTK_WED_RESET_IDX_RX_V2 GENMASK(7, 6)
  183. #define MTK_WED_RESET_WPDMA_IDX_RX GENMASK(31, 30)
  184. #define MTK_WED_TX_MIB(_n) (0x2a0 + (_n) * 4)
  185. @@ -286,7 +281,6 @@ struct mtk_wdma_desc {
  186. #define MTK_WED_WPDMA_RX_D_RST_DRV_IDX GENMASK(25, 24)
  187. #define MTK_WED_WPDMA_RX_GLO_CFG 0x76c
  188. -#define MTK_WED_WPDMA_RX_RING 0x770
  189. #define MTK_WED_WPDMA_RX_D_MIB(_n) (0x774 + (_n) * 4)
  190. #define MTK_WED_WPDMA_RX_D_PROCESSED_MIB(_n) (0x784 + (_n) * 4)