2
0

715-v6.0-net-ethernet-mtk_eth_soc-add-the-capability-to-run-m.patch 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318
  1. From patchwork Thu Sep 8 19:33:39 2022
  2. Content-Type: text/plain; charset="utf-8"
  3. MIME-Version: 1.0
  4. Content-Transfer-Encoding: 7bit
  5. X-Patchwork-Submitter: Lorenzo Bianconi <[email protected]>
  6. X-Patchwork-Id: 12970559
  7. X-Patchwork-Delegate: [email protected]
  8. Return-Path: <[email protected]>
  9. From: Lorenzo Bianconi <[email protected]>
  10. To: [email protected]
  11. Cc: [email protected], [email protected], [email protected],
  12. [email protected], [email protected], [email protected],
  13. [email protected], [email protected], [email protected],
  14. [email protected], [email protected],
  15. [email protected], [email protected],
  16. [email protected], [email protected],
  17. [email protected], [email protected]
  18. Subject: [PATCH net-next 05/12] net: ethernet: mtk_eth_soc: add the capability
  19. to run multiple ppe
  20. Date: Thu, 8 Sep 2022 21:33:39 +0200
  21. Message-Id:
  22. <dd0254775390eb031c67c448df8b19e87df58558.1662661555.git.lorenzo@kernel.org>
  23. X-Mailer: git-send-email 2.37.3
  24. In-Reply-To: <[email protected]>
  25. References: <[email protected]>
  26. MIME-Version: 1.0
  27. Precedence: bulk
  28. List-ID: <netdev.vger.kernel.org>
  29. X-Mailing-List: [email protected]
  30. X-Patchwork-Delegate: [email protected]
  31. mt7986 chipset support multiple packet engines for wlan <-> eth
  32. packet forwarding.
  33. Co-developed-by: Bo Jiao <[email protected]>
  34. Signed-off-by: Bo Jiao <[email protected]>
  35. Co-developed-by: Sujuan Chen <[email protected]>
  36. Signed-off-by: Sujuan Chen <[email protected]>
  37. Signed-off-by: Lorenzo Bianconi <[email protected]>
  38. ---
  39. drivers/net/ethernet/mediatek/mtk_eth_soc.c | 35 ++++++++++++-------
  40. drivers/net/ethernet/mediatek/mtk_eth_soc.h | 2 +-
  41. drivers/net/ethernet/mediatek/mtk_ppe.c | 14 +++++---
  42. drivers/net/ethernet/mediatek/mtk_ppe.h | 9 +++--
  43. .../net/ethernet/mediatek/mtk_ppe_debugfs.c | 8 ++---
  44. .../net/ethernet/mediatek/mtk_ppe_offload.c | 13 +++----
  45. 6 files changed, 48 insertions(+), 33 deletions(-)
  46. --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
  47. +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
  48. @@ -1871,7 +1871,7 @@ static int mtk_poll_rx(struct napi_struc
  49. reason = FIELD_GET(MTK_RXD4_PPE_CPU_REASON, trxd.rxd4);
  50. if (reason == MTK_PPE_CPU_REASON_HIT_UNBIND_RATE_REACHED)
  51. - mtk_ppe_check_skb(eth->ppe, skb, hash);
  52. + mtk_ppe_check_skb(eth->ppe[0], skb, hash);
  53. if (netdev->features & NETIF_F_HW_VLAN_CTAG_RX) {
  54. if (MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2)) {
  55. @@ -2932,7 +2932,8 @@ static int mtk_open(struct net_device *d
  56. /* we run 2 netdevs on the same dma ring so we only bring it up once */
  57. if (!refcount_read(&eth->dma_refcnt)) {
  58. const struct mtk_soc_data *soc = eth->soc;
  59. - u32 gdm_config = MTK_GDMA_TO_PDMA;
  60. + u32 gdm_config;
  61. + int i;
  62. int err;
  63. err = mtk_start_dma(eth);
  64. @@ -2941,8 +2942,11 @@ static int mtk_open(struct net_device *d
  65. return err;
  66. }
  67. - if (soc->offload_version && mtk_ppe_start(eth->ppe) == 0)
  68. - gdm_config = soc->reg_map->gdma_to_ppe0;
  69. + for (i = 0; i < ARRAY_SIZE(eth->ppe); i++)
  70. + mtk_ppe_start(eth->ppe[i]);
  71. +
  72. + gdm_config = soc->offload_version ? soc->reg_map->gdma_to_ppe0
  73. + : MTK_GDMA_TO_PDMA;
  74. mtk_gdm_config(eth, gdm_config);
  75. @@ -2987,6 +2991,7 @@ static int mtk_stop(struct net_device *d
  76. {
  77. struct mtk_mac *mac = netdev_priv(dev);
  78. struct mtk_eth *eth = mac->hw;
  79. + int i;
  80. phylink_stop(mac->phylink);
  81. @@ -3014,8 +3019,8 @@ static int mtk_stop(struct net_device *d
  82. mtk_dma_free(eth);
  83. - if (eth->soc->offload_version)
  84. - mtk_ppe_stop(eth->ppe);
  85. + for (i = 0; i < ARRAY_SIZE(eth->ppe); i++)
  86. + mtk_ppe_stop(eth->ppe[i]);
  87. return 0;
  88. }
  89. @@ -4048,12 +4053,19 @@ static int mtk_probe(struct platform_dev
  90. }
  91. if (eth->soc->offload_version) {
  92. - u32 ppe_addr = eth->soc->reg_map->ppe_base;
  93. + u32 num_ppe;
  94. - eth->ppe = mtk_ppe_init(eth, eth->base + ppe_addr, 2);
  95. - if (!eth->ppe) {
  96. - err = -ENOMEM;
  97. - goto err_free_dev;
  98. + num_ppe = MTK_HAS_CAPS(eth->soc->caps, MTK_NETSYS_V2) ? 2 : 1;
  99. + num_ppe = min_t(u32, ARRAY_SIZE(eth->ppe), num_ppe);
  100. + for (i = 0; i < num_ppe; i++) {
  101. + u32 ppe_addr = eth->soc->reg_map->ppe_base + i * 0x400;
  102. +
  103. + eth->ppe[i] = mtk_ppe_init(eth, eth->base + ppe_addr,
  104. + eth->soc->offload_version, i);
  105. + if (!eth->ppe[i]) {
  106. + err = -ENOMEM;
  107. + goto err_free_dev;
  108. + }
  109. }
  110. err = mtk_eth_offload_init(eth);
  111. --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h
  112. +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
  113. @@ -1112,7 +1112,7 @@ struct mtk_eth {
  114. int ip_align;
  115. - struct mtk_ppe *ppe;
  116. + struct mtk_ppe *ppe[2];
  117. struct rhashtable flow_table;
  118. struct bpf_prog __rcu *prog;
  119. --- a/drivers/net/ethernet/mediatek/mtk_ppe.c
  120. +++ b/drivers/net/ethernet/mediatek/mtk_ppe.c
  121. @@ -682,7 +682,7 @@ int mtk_foe_entry_idle_time(struct mtk_p
  122. }
  123. struct mtk_ppe *mtk_ppe_init(struct mtk_eth *eth, void __iomem *base,
  124. - int version)
  125. + int version, int index)
  126. {
  127. const struct mtk_soc_data *soc = eth->soc;
  128. struct device *dev = eth->dev;
  129. @@ -717,7 +717,7 @@ struct mtk_ppe *mtk_ppe_init(struct mtk_
  130. if (!ppe->foe_flow)
  131. return NULL;
  132. - mtk_ppe_debugfs_init(ppe);
  133. + mtk_ppe_debugfs_init(ppe, index);
  134. return ppe;
  135. }
  136. @@ -738,10 +738,13 @@ static void mtk_ppe_init_foe_table(struc
  137. ppe->foe_table[i + skip[k]].ib1 |= MTK_FOE_IB1_STATIC;
  138. }
  139. -int mtk_ppe_start(struct mtk_ppe *ppe)
  140. +void mtk_ppe_start(struct mtk_ppe *ppe)
  141. {
  142. u32 val;
  143. + if (!ppe)
  144. + return;
  145. +
  146. mtk_ppe_init_foe_table(ppe);
  147. ppe_w32(ppe, MTK_PPE_TB_BASE, ppe->foe_phys);
  148. @@ -809,8 +812,6 @@ int mtk_ppe_start(struct mtk_ppe *ppe)
  149. ppe_w32(ppe, MTK_PPE_GLO_CFG, val);
  150. ppe_w32(ppe, MTK_PPE_DEFAULT_CPU_PORT, 0);
  151. -
  152. - return 0;
  153. }
  154. int mtk_ppe_stop(struct mtk_ppe *ppe)
  155. @@ -818,6 +819,9 @@ int mtk_ppe_stop(struct mtk_ppe *ppe)
  156. u32 val;
  157. int i;
  158. + if (!ppe)
  159. + return 0;
  160. +
  161. for (i = 0; i < MTK_PPE_ENTRIES; i++)
  162. ppe->foe_table[i].ib1 = FIELD_PREP(MTK_FOE_IB1_STATE,
  163. MTK_FOE_STATE_INVALID);
  164. --- a/drivers/net/ethernet/mediatek/mtk_ppe.h
  165. +++ b/drivers/net/ethernet/mediatek/mtk_ppe.h
  166. @@ -247,6 +247,7 @@ struct mtk_flow_entry {
  167. };
  168. u8 type;
  169. s8 wed_index;
  170. + u8 ppe_index;
  171. u16 hash;
  172. union {
  173. struct mtk_foe_entry data;
  174. @@ -265,6 +266,7 @@ struct mtk_ppe {
  175. struct device *dev;
  176. void __iomem *base;
  177. int version;
  178. + char dirname[5];
  179. struct mtk_foe_entry *foe_table;
  180. dma_addr_t foe_phys;
  181. @@ -277,8 +279,9 @@ struct mtk_ppe {
  182. void *acct_table;
  183. };
  184. -struct mtk_ppe *mtk_ppe_init(struct mtk_eth *eth, void __iomem *base, int version);
  185. -int mtk_ppe_start(struct mtk_ppe *ppe);
  186. +struct mtk_ppe *mtk_ppe_init(struct mtk_eth *eth, void __iomem *base,
  187. + int version, int index);
  188. +void mtk_ppe_start(struct mtk_ppe *ppe);
  189. int mtk_ppe_stop(struct mtk_ppe *ppe);
  190. void __mtk_ppe_check_skb(struct mtk_ppe *ppe, struct sk_buff *skb, u16 hash);
  191. @@ -317,6 +320,6 @@ int mtk_foe_entry_set_wdma(struct mtk_fo
  192. int mtk_foe_entry_commit(struct mtk_ppe *ppe, struct mtk_flow_entry *entry);
  193. void mtk_foe_entry_clear(struct mtk_ppe *ppe, struct mtk_flow_entry *entry);
  194. int mtk_foe_entry_idle_time(struct mtk_ppe *ppe, struct mtk_flow_entry *entry);
  195. -int mtk_ppe_debugfs_init(struct mtk_ppe *ppe);
  196. +int mtk_ppe_debugfs_init(struct mtk_ppe *ppe, int index);
  197. #endif
  198. --- a/drivers/net/ethernet/mediatek/mtk_ppe_debugfs.c
  199. +++ b/drivers/net/ethernet/mediatek/mtk_ppe_debugfs.c
  200. @@ -187,7 +187,7 @@ mtk_ppe_debugfs_foe_open_bind(struct ino
  201. inode->i_private);
  202. }
  203. -int mtk_ppe_debugfs_init(struct mtk_ppe *ppe)
  204. +int mtk_ppe_debugfs_init(struct mtk_ppe *ppe, int index)
  205. {
  206. static const struct file_operations fops_all = {
  207. .open = mtk_ppe_debugfs_foe_open_all,
  208. @@ -195,17 +195,17 @@ int mtk_ppe_debugfs_init(struct mtk_ppe
  209. .llseek = seq_lseek,
  210. .release = single_release,
  211. };
  212. -
  213. static const struct file_operations fops_bind = {
  214. .open = mtk_ppe_debugfs_foe_open_bind,
  215. .read = seq_read,
  216. .llseek = seq_lseek,
  217. .release = single_release,
  218. };
  219. -
  220. struct dentry *root;
  221. - root = debugfs_create_dir("mtk_ppe", NULL);
  222. + snprintf(ppe->dirname, sizeof(ppe->dirname), "ppe%d", index);
  223. +
  224. + root = debugfs_create_dir(ppe->dirname, NULL);
  225. if (!root)
  226. return -ENOMEM;
  227. --- a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c
  228. +++ b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c
  229. @@ -434,7 +434,7 @@ mtk_flow_offload_replace(struct mtk_eth
  230. memcpy(&entry->data, &foe, sizeof(entry->data));
  231. entry->wed_index = wed_index;
  232. - err = mtk_foe_entry_commit(eth->ppe, entry);
  233. + err = mtk_foe_entry_commit(eth->ppe[entry->ppe_index], entry);
  234. if (err < 0)
  235. goto free;
  236. @@ -446,7 +446,7 @@ mtk_flow_offload_replace(struct mtk_eth
  237. return 0;
  238. clear:
  239. - mtk_foe_entry_clear(eth->ppe, entry);
  240. + mtk_foe_entry_clear(eth->ppe[entry->ppe_index], entry);
  241. free:
  242. kfree(entry);
  243. if (wed_index >= 0)
  244. @@ -464,7 +464,7 @@ mtk_flow_offload_destroy(struct mtk_eth
  245. if (!entry)
  246. return -ENOENT;
  247. - mtk_foe_entry_clear(eth->ppe, entry);
  248. + mtk_foe_entry_clear(eth->ppe[entry->ppe_index], entry);
  249. rhashtable_remove_fast(&eth->flow_table, &entry->node,
  250. mtk_flow_ht_params);
  251. if (entry->wed_index >= 0)
  252. @@ -485,7 +485,7 @@ mtk_flow_offload_stats(struct mtk_eth *e
  253. if (!entry)
  254. return -ENOENT;
  255. - idle = mtk_foe_entry_idle_time(eth->ppe, entry);
  256. + idle = mtk_foe_entry_idle_time(eth->ppe[entry->ppe_index], entry);
  257. f->stats.lastused = jiffies - idle * HZ;
  258. return 0;
  259. @@ -537,7 +537,7 @@ mtk_eth_setup_tc_block(struct net_device
  260. struct flow_block_cb *block_cb;
  261. flow_setup_cb_t *cb;
  262. - if (!eth->ppe || !eth->ppe->foe_table)
  263. + if (!eth->soc->offload_version)
  264. return -EOPNOTSUPP;
  265. if (f->binder_type != FLOW_BLOCK_BINDER_TYPE_CLSACT_INGRESS)
  266. @@ -590,8 +590,5 @@ int mtk_eth_setup_tc(struct net_device *
  267. int mtk_eth_offload_init(struct mtk_eth *eth)
  268. {
  269. - if (!eth->ppe || !eth->ppe->foe_table)
  270. - return 0;
  271. -
  272. return rhashtable_init(&eth->flow_table, &mtk_flow_ht_params);
  273. }