Commit 61aee772 authored by David S. Miller's avatar David S. Miller

Merge branch 'mtk_eth_soc-xdp'

Lorenzo Bianconi says:

====================
mtk_eth_soc: add xdp support

Introduce XDP support for mtk_eth_soc driver if rx hwlro is not
enabled in the chipset (e.g. mt7986).
Supported XDP verdicts:
- XDP_PASS
- XDP_DROP
- XDP_REDIRECT
- XDP_TX
- ndo_xdp_xmit
Rely on page_pool allocator for single page buffers in order to keep
them dma mapped and add skb recycling support.

Changes since v3:
- add missing rcu_read_lock()/rcu_read_unlock()
- introduce mtk_page_pool_enabled() utility routine

Changes since v2:
- fix leftover sparse warning
- add page_pool ethtool stats

Changes since v1:
- do not allocate mtk_xdp_stats array on the stack in mtk_rx_poll
- add rcu annotation to bpf program
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 502c6f8c 84b9cd38
...@@ -17,6 +17,8 @@ config NET_MEDIATEK_SOC ...@@ -17,6 +17,8 @@ config NET_MEDIATEK_SOC
select PINCTRL select PINCTRL
select PHYLINK select PHYLINK
select DIMLIB select DIMLIB
select PAGE_POOL
select PAGE_POOL_STATS
help help
This driver supports the gigabit ethernet MACs in the This driver supports the gigabit ethernet MACs in the
MediaTek SoC family. MediaTek SoC family.
......
This diff is collapsed.
...@@ -18,6 +18,8 @@ ...@@ -18,6 +18,8 @@
#include <linux/rhashtable.h> #include <linux/rhashtable.h>
#include <linux/dim.h> #include <linux/dim.h>
#include <linux/bitfield.h> #include <linux/bitfield.h>
#include <net/page_pool.h>
#include <linux/bpf_trace.h>
#include "mtk_ppe.h" #include "mtk_ppe.h"
#define MTK_QDMA_PAGE_SIZE 2048 #define MTK_QDMA_PAGE_SIZE 2048
...@@ -49,6 +51,11 @@ ...@@ -49,6 +51,11 @@
#define MTK_HW_FEATURES_MT7628 (NETIF_F_SG | NETIF_F_RXCSUM) #define MTK_HW_FEATURES_MT7628 (NETIF_F_SG | NETIF_F_RXCSUM)
#define NEXT_DESP_IDX(X, Y) (((X) + 1) & ((Y) - 1)) #define NEXT_DESP_IDX(X, Y) (((X) + 1) & ((Y) - 1))
#define MTK_PP_HEADROOM XDP_PACKET_HEADROOM
#define MTK_PP_PAD (MTK_PP_HEADROOM + \
SKB_DATA_ALIGN(sizeof(struct skb_shared_info)))
#define MTK_PP_MAX_BUF_SIZE (PAGE_SIZE - MTK_PP_PAD)
#define MTK_QRX_OFFSET 0x10 #define MTK_QRX_OFFSET 0x10
#define MTK_MAX_RX_RING_NUM 4 #define MTK_MAX_RX_RING_NUM 4
...@@ -563,6 +570,16 @@ struct mtk_tx_dma_v2 { ...@@ -563,6 +570,16 @@ struct mtk_tx_dma_v2 {
struct mtk_eth; struct mtk_eth;
struct mtk_mac; struct mtk_mac;
struct mtk_xdp_stats {
u64 rx_xdp_redirect;
u64 rx_xdp_pass;
u64 rx_xdp_drop;
u64 rx_xdp_tx;
u64 rx_xdp_tx_errors;
u64 tx_xdp_xmit;
u64 tx_xdp_xmit_errors;
};
/* struct mtk_hw_stats - the structure that holds the traffic statistics. /* struct mtk_hw_stats - the structure that holds the traffic statistics.
* @stats_lock: make sure that stats operations are atomic * @stats_lock: make sure that stats operations are atomic
* @reg_offset: the status register offset of the SoC * @reg_offset: the status register offset of the SoC
...@@ -586,6 +603,8 @@ struct mtk_hw_stats { ...@@ -586,6 +603,8 @@ struct mtk_hw_stats {
u64 rx_checksum_errors; u64 rx_checksum_errors;
u64 rx_flow_control_packets; u64 rx_flow_control_packets;
struct mtk_xdp_stats xdp_stats;
spinlock_t stats_lock; spinlock_t stats_lock;
u32 reg_offset; u32 reg_offset;
struct u64_stats_sync syncp; struct u64_stats_sync syncp;
...@@ -677,6 +696,12 @@ enum mtk_dev_state { ...@@ -677,6 +696,12 @@ enum mtk_dev_state {
MTK_RESETTING MTK_RESETTING
}; };
enum mtk_tx_buf_type {
MTK_TYPE_SKB,
MTK_TYPE_XDP_TX,
MTK_TYPE_XDP_NDO,
};
/* struct mtk_tx_buf - This struct holds the pointers to the memory pointed at /* struct mtk_tx_buf - This struct holds the pointers to the memory pointed at
* by the TX descriptor s * by the TX descriptor s
* @skb: The SKB pointer of the packet being sent * @skb: The SKB pointer of the packet being sent
...@@ -686,7 +711,9 @@ enum mtk_dev_state { ...@@ -686,7 +711,9 @@ enum mtk_dev_state {
* @dma_len1: The length of the second segment * @dma_len1: The length of the second segment
*/ */
struct mtk_tx_buf { struct mtk_tx_buf {
struct sk_buff *skb; enum mtk_tx_buf_type type;
void *data;
u32 flags; u32 flags;
DEFINE_DMA_UNMAP_ADDR(dma_addr0); DEFINE_DMA_UNMAP_ADDR(dma_addr0);
DEFINE_DMA_UNMAP_LEN(dma_len0); DEFINE_DMA_UNMAP_LEN(dma_len0);
...@@ -745,6 +772,9 @@ struct mtk_rx_ring { ...@@ -745,6 +772,9 @@ struct mtk_rx_ring {
bool calc_idx_update; bool calc_idx_update;
u16 calc_idx; u16 calc_idx;
u32 crx_idx_reg; u32 crx_idx_reg;
/* page_pool */
struct page_pool *page_pool;
struct xdp_rxq_info xdp_q;
}; };
enum mkt_eth_capabilities { enum mkt_eth_capabilities {
...@@ -1078,6 +1108,8 @@ struct mtk_eth { ...@@ -1078,6 +1108,8 @@ struct mtk_eth {
struct mtk_ppe *ppe; struct mtk_ppe *ppe;
struct rhashtable flow_table; struct rhashtable flow_table;
struct bpf_prog __rcu *prog;
}; };
/* struct mtk_mac - the structure that holds the info about the MACs of the /* struct mtk_mac - the structure that holds the info about the MACs of the
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment