Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
[platform/kernel/linux-starfive.git] / drivers / net / ethernet / fungible / funeth / funeth_txrx.h
1 /* SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) */
2
3 #ifndef _FUNETH_TXRX_H
4 #define _FUNETH_TXRX_H
5
6 #include <linux/netdevice.h>
7 #include <linux/u64_stats_sync.h>
8
9 /* Tx descriptor size */
10 #define FUNETH_SQE_SIZE 64U
11
12 /* Size of device headers per Tx packet */
13 #define FUNETH_FUNOS_HDR_SZ (sizeof(struct fun_eth_tx_req))
14
15 /* Number of gather list entries per Tx descriptor */
16 #define FUNETH_GLE_PER_DESC (FUNETH_SQE_SIZE / sizeof(struct fun_dataop_gl))
17
18 /* Max gather list size in bytes for an sk_buff. */
19 #define FUNETH_MAX_GL_SZ ((MAX_SKB_FRAGS + 1) * sizeof(struct fun_dataop_gl))
20
21 #if IS_ENABLED(CONFIG_TLS_DEVICE)
22 # define FUNETH_TLS_SZ sizeof(struct fun_eth_tls)
23 #else
24 # define FUNETH_TLS_SZ 0
25 #endif
26
27 /* Max number of Tx descriptors for an sk_buff using a gather list. */
28 #define FUNETH_MAX_GL_DESC \
29         DIV_ROUND_UP((FUNETH_FUNOS_HDR_SZ + FUNETH_MAX_GL_SZ + FUNETH_TLS_SZ), \
30                      FUNETH_SQE_SIZE)
31
32 /* Max number of Tx descriptors for any packet. */
33 #define FUNETH_MAX_PKT_DESC FUNETH_MAX_GL_DESC
34
35 /* Rx CQ descriptor size. */
36 #define FUNETH_CQE_SIZE 64U
37
38 /* Offset of cqe_info within a CQE. */
39 #define FUNETH_CQE_INFO_OFFSET (FUNETH_CQE_SIZE - sizeof(struct fun_cqe_info))
40
41 /* Construct the IRQ portion of a CQ doorbell. The resulting value arms the
42  * interrupt with the supplied time delay and packet count moderation settings.
43  */
44 #define FUN_IRQ_CQ_DB(usec, pkts) \
45         (FUN_DB_IRQ_ARM_F | ((usec) << FUN_DB_INTCOAL_USEC_S) | \
46          ((pkts) << FUN_DB_INTCOAL_ENTRIES_S))
47
48 /* As above for SQ doorbells. */
49 #define FUN_IRQ_SQ_DB(usec, pkts) \
50         (FUN_DB_IRQ_ARM_F | \
51          ((usec) << FUN_DB_INTCOAL_USEC_S) | \
52          ((pkts) << FUN_DB_INTCOAL_ENTRIES_S))
53
54 /* Per packet tailroom. Present only for 1-frag packets. */
55 #define FUN_RX_TAILROOM SKB_DATA_ALIGN(sizeof(struct skb_shared_info))
56
57 /* Per packet headroom for XDP. Preferred over XDP_PACKET_HEADROOM to
58  * accommodate two packets per buffer for 4K pages and 1500B MTUs.
59  */
60 #define FUN_XDP_HEADROOM 192
61
62 /* Initialization state of a queue. */
63 enum {
64         FUN_QSTATE_DESTROYED, /* what queue? */
65         FUN_QSTATE_INIT_SW,   /* exists in SW, not on the device */
66         FUN_QSTATE_INIT_FULL, /* exists both in SW and on device */
67 };
68
69 /* Initialization state of an interrupt. */
70 enum {
71         FUN_IRQ_INIT,      /* initialized and in the XArray but inactive */
72         FUN_IRQ_REQUESTED, /* request_irq() done */
73         FUN_IRQ_ENABLED,   /* processing enabled */
74         FUN_IRQ_DISABLED,  /* processing disabled */
75 };
76
77 struct bpf_prog;
78
79 struct funeth_txq_stats {  /* per Tx queue SW counters */
80         u64 tx_pkts;       /* # of Tx packets */
81         u64 tx_bytes;      /* total bytes of Tx packets */
82         u64 tx_cso;        /* # of packets with checksum offload */
83         u64 tx_tso;        /* # of non-encapsulated TSO super-packets */
84         u64 tx_encap_tso;  /* # of encapsulated TSO super-packets */
85         u64 tx_uso;        /* # of non-encapsulated UDP LSO super-packets */
86         u64 tx_more;       /* # of DBs elided due to xmit_more */
87         u64 tx_nstops;     /* # of times the queue has stopped */
88         u64 tx_nrestarts;  /* # of times the queue has restarted */
89         u64 tx_map_err;    /* # of packets dropped due to DMA mapping errors */
90         u64 tx_xdp_full;   /* # of XDP packets that could not be enqueued */
91         u64 tx_tls_pkts;   /* # of Tx TLS packets offloaded to HW */
92         u64 tx_tls_bytes;  /* Tx bytes of HW-handled TLS payload */
93         u64 tx_tls_fallback; /* attempted Tx TLS offloads punted to SW */
94         u64 tx_tls_drops;  /* attempted Tx TLS offloads dropped */
95 };
96
97 struct funeth_tx_info {      /* per Tx descriptor state */
98         union {
99                 struct sk_buff *skb; /* associated packet */
100                 void *vaddr;         /* start address for XDP */
101         };
102 };
103
104 struct funeth_txq {
105         /* RO cacheline of frequently accessed data */
106         u32 mask;               /* queue depth - 1 */
107         u32 hw_qid;             /* device ID of the queue */
108         void *desc;             /* base address of descriptor ring */
109         struct funeth_tx_info *info;
110         struct device *dma_dev; /* device for DMA mappings */
111         volatile __be64 *hw_wb; /* HW write-back location */
112         u32 __iomem *db;        /* SQ doorbell register address */
113         struct netdev_queue *ndq;
114         dma_addr_t dma_addr;    /* DMA address of descriptor ring */
115         /* producer R/W cacheline */
116         u16 qidx;               /* queue index within net_device */
117         u16 ethid;
118         u32 prod_cnt;           /* producer counter */
119         struct funeth_txq_stats stats;
120         /* shared R/W cacheline, primarily accessed by consumer */
121         u32 irq_db_val;         /* value written to IRQ doorbell */
122         u32 cons_cnt;           /* consumer (cleanup) counter */
123         struct net_device *netdev;
124         struct fun_irq *irq;
125         int numa_node;
126         u8 init_state;          /* queue initialization state */
127         struct u64_stats_sync syncp;
128 };
129
130 struct funeth_rxq_stats {  /* per Rx queue SW counters */
131         u64 rx_pkts;       /* # of received packets, including SW drops */
132         u64 rx_bytes;      /* total size of received packets */
133         u64 rx_cso;        /* # of packets with checksum offload */
134         u64 rx_bufs;       /* total # of Rx buffers provided to device */
135         u64 gro_pkts;      /* # of GRO superpackets */
136         u64 gro_merged;    /* # of pkts merged into existing GRO superpackets */
137         u64 rx_page_alloc; /* # of page allocations for Rx buffers */
138         u64 rx_budget;     /* NAPI iterations that exhausted their budget */
139         u64 rx_mem_drops;  /* # of packets dropped due to memory shortage */
140         u64 rx_map_err;    /* # of page DMA mapping errors */
141         u64 xdp_drops;     /* XDP_DROPped packets */
142         u64 xdp_tx;        /* successful XDP transmits */
143         u64 xdp_redir;     /* successful XDP redirects */
144         u64 xdp_err;       /* packets dropped due to XDP errors */
145 };
146
147 struct funeth_rxbuf {          /* per Rx buffer state */
148         struct page *page;     /* associated page */
149         dma_addr_t dma_addr;   /* DMA address of page start */
150         int pg_refs;           /* page refs held by driver */
151         int node;              /* page node, or -1 if it is PF_MEMALLOC */
152 };
153
154 struct funeth_rx_cache {       /* cache of DMA-mapped previously used buffers */
155         struct funeth_rxbuf *bufs; /* base of Rx buffer state ring */
156         unsigned int prod_cnt;     /* producer counter */
157         unsigned int cons_cnt;     /* consumer counter */
158         unsigned int mask;         /* depth - 1 */
159 };
160
161 /* An Rx queue consists of a CQ and an SQ used to provide Rx buffers. */
162 struct funeth_rxq {
163         struct net_device *netdev;
164         struct napi_struct *napi;
165         struct device *dma_dev;    /* device for DMA mappings */
166         void *cqes;                /* base of CQ descriptor ring */
167         const void *next_cqe_info; /* fun_cqe_info of next CQE */
168         u32 __iomem *cq_db;        /* CQ doorbell register address */
169         unsigned int cq_head;      /* CQ head index */
170         unsigned int cq_mask;      /* CQ depth - 1 */
171         u16 phase;                 /* CQ phase tag */
172         u16 qidx;                  /* queue index within net_device */
173         unsigned int irq_db_val;   /* IRQ info for CQ doorbell */
174         struct fun_eprq_rqbuf *rqes; /* base of RQ descriptor ring */
175         struct funeth_rxbuf *bufs; /* base of Rx buffer state ring */
176         struct funeth_rxbuf *cur_buf; /* currently active buffer */
177         u32 __iomem *rq_db;        /* RQ doorbell register address */
178         unsigned int rq_cons;      /* RQ consumer counter */
179         unsigned int rq_mask;      /* RQ depth - 1 */
180         unsigned int buf_offset;   /* offset of next pkt in head buffer */
181         u8 xdp_flush;              /* XDP flush types needed at NAPI end */
182         u8 init_state;             /* queue initialization state */
183         u16 headroom;              /* per packet headroom */
184         unsigned int rq_cons_db;   /* value of rq_cons at last RQ db */
185         unsigned int rq_db_thres;  /* # of new buffers needed to write RQ db */
186         struct funeth_rxbuf spare_buf; /* spare for next buffer replacement */
187         struct funeth_rx_cache cache; /* used buffer cache */
188         struct bpf_prog *xdp_prog; /* optional XDP BPF program */
189         struct funeth_rxq_stats stats;
190         dma_addr_t cq_dma_addr;    /* DMA address of CQE ring */
191         dma_addr_t rq_dma_addr;    /* DMA address of RQE ring */
192         u16 irq_cnt;
193         u32 hw_cqid;               /* device ID of the queue's CQ */
194         u32 hw_sqid;               /* device ID of the queue's SQ */
195         int numa_node;
196         struct u64_stats_sync syncp;
197         struct xdp_rxq_info xdp_rxq;
198 };
199
200 #define FUN_QSTAT_INC(q, counter) \
201         do { \
202                 u64_stats_update_begin(&(q)->syncp); \
203                 (q)->stats.counter++; \
204                 u64_stats_update_end(&(q)->syncp); \
205         } while (0)
206
207 #define FUN_QSTAT_READ(q, seq, stats_copy) \
208         do { \
209                 seq = u64_stats_fetch_begin(&(q)->syncp); \
210                 stats_copy = (q)->stats; \
211         } while (u64_stats_fetch_retry(&(q)->syncp, (seq)))
212
213 #define FUN_INT_NAME_LEN (IFNAMSIZ + 16)
214
215 struct fun_irq {
216         struct napi_struct napi;
217         struct funeth_txq *txq;
218         struct funeth_rxq *rxq;
219         u8 state;
220         u16 irq_idx;              /* index of MSI-X interrupt */
221         int irq;                  /* Linux IRQ vector */
222         cpumask_t affinity_mask;  /* IRQ affinity */
223         struct irq_affinity_notify aff_notify;
224         char name[FUN_INT_NAME_LEN];
225 } ____cacheline_internodealigned_in_smp;
226
227 /* Return the start address of the idx-th Tx descriptor. */
228 static inline void *fun_tx_desc_addr(const struct funeth_txq *q,
229                                      unsigned int idx)
230 {
231         return q->desc + idx * FUNETH_SQE_SIZE;
232 }
233
234 static inline void fun_txq_wr_db(const struct funeth_txq *q)
235 {
236         unsigned int tail = q->prod_cnt & q->mask;
237
238         writel(tail, q->db);
239 }
240
241 static inline int fun_irq_node(const struct fun_irq *p)
242 {
243         return cpu_to_mem(cpumask_first(&p->affinity_mask));
244 }
245
246 int fun_rxq_napi_poll(struct napi_struct *napi, int budget);
247 int fun_txq_napi_poll(struct napi_struct *napi, int budget);
248 netdev_tx_t fun_start_xmit(struct sk_buff *skb, struct net_device *netdev);
249 bool fun_xdp_tx(struct funeth_txq *q, void *data, unsigned int len);
250 int fun_xdp_xmit_frames(struct net_device *dev, int n,
251                         struct xdp_frame **frames, u32 flags);
252
253 int funeth_txq_create(struct net_device *dev, unsigned int qidx,
254                       unsigned int ndesc, struct fun_irq *irq, int state,
255                       struct funeth_txq **qp);
256 int fun_txq_create_dev(struct funeth_txq *q, struct fun_irq *irq);
257 struct funeth_txq *funeth_txq_free(struct funeth_txq *q, int state);
258 int funeth_rxq_create(struct net_device *dev, unsigned int qidx,
259                       unsigned int ncqe, unsigned int nrqe, struct fun_irq *irq,
260                       int state, struct funeth_rxq **qp);
261 int fun_rxq_create_dev(struct funeth_rxq *q, struct fun_irq *irq);
262 struct funeth_rxq *funeth_rxq_free(struct funeth_rxq *q, int state);
263 int fun_rxq_set_bpf(struct funeth_rxq *q, struct bpf_prog *prog);
264
265 #endif /* _FUNETH_TXRX_H */