1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright (c) Meta Platforms, Inc. and affiliates. */
3
4 #include <linux/bitfield.h>
5 #include <linux/bpf.h>
6 #include <linux/bpf_trace.h>
7 #include <linux/iopoll.h>
8 #include <linux/pci.h>
9 #include <net/netdev_queues.h>
10 #include <net/netdev_rx_queue.h>
11 #include <net/page_pool/helpers.h>
12 #include <net/tcp.h>
13 #include <net/xdp.h>
14
15 #include "fbnic.h"
16 #include "fbnic_csr.h"
17 #include "fbnic_netdev.h"
18 #include "fbnic_txrx.h"
19
20 enum {
21 FBNIC_XDP_PASS = 0,
22 FBNIC_XDP_CONSUME,
23 FBNIC_XDP_TX,
24 FBNIC_XDP_LEN_ERR,
25 };
26
27 enum {
28 FBNIC_XMIT_CB_TS = 0x01,
29 };
30
31 struct fbnic_xmit_cb {
32 u32 bytecount;
33 u16 gso_segs;
34 u8 desc_count;
35 u8 flags;
36 int hw_head;
37 };
38
39 #define FBNIC_XMIT_CB(__skb) ((struct fbnic_xmit_cb *)((__skb)->cb))
40
41 #define FBNIC_XMIT_NOUNMAP ((void *)1)
42
fbnic_ring_csr_base(const struct fbnic_ring * ring)43 u32 __iomem *fbnic_ring_csr_base(const struct fbnic_ring *ring)
44 {
45 unsigned long csr_base = (unsigned long)ring->doorbell;
46
47 csr_base &= ~(FBNIC_QUEUE_STRIDE * sizeof(u32) - 1);
48
49 return (u32 __iomem *)csr_base;
50 }
51
fbnic_ring_rd32(struct fbnic_ring * ring,unsigned int csr)52 static u32 fbnic_ring_rd32(struct fbnic_ring *ring, unsigned int csr)
53 {
54 u32 __iomem *csr_base = fbnic_ring_csr_base(ring);
55
56 return readl(csr_base + csr);
57 }
58
fbnic_ring_wr32(struct fbnic_ring * ring,unsigned int csr,u32 val)59 static void fbnic_ring_wr32(struct fbnic_ring *ring, unsigned int csr, u32 val)
60 {
61 u32 __iomem *csr_base = fbnic_ring_csr_base(ring);
62
63 writel(val, csr_base + csr);
64 }
65
66 /**
67 * fbnic_ts40_to_ns() - convert descriptor timestamp to PHC time
68 * @fbn: netdev priv of the FB NIC
69 * @ts40: timestamp read from a descriptor
70 *
71 * Return: u64 value of PHC time in nanoseconds
72 *
73 * Convert truncated 40 bit device timestamp as read from a descriptor
74 * to the full PHC time in nanoseconds.
75 */
fbnic_ts40_to_ns(struct fbnic_net * fbn,u64 ts40)76 static __maybe_unused u64 fbnic_ts40_to_ns(struct fbnic_net *fbn, u64 ts40)
77 {
78 unsigned int s;
79 u64 time_ns;
80 s64 offset;
81 u8 ts_top;
82 u32 high;
83
84 do {
85 s = u64_stats_fetch_begin(&fbn->time_seq);
86 offset = READ_ONCE(fbn->time_offset);
87 } while (u64_stats_fetch_retry(&fbn->time_seq, s));
88
89 high = READ_ONCE(fbn->time_high);
90
91 /* Bits 63..40 from periodic clock reads, 39..0 from ts40 */
92 time_ns = (u64)(high >> 8) << 40 | ts40;
93
94 /* Compare bits 32-39 between periodic reads and ts40,
95 * see if HW clock may have wrapped since last read. We are sure
96 * that periodic reads are always at least ~1 minute behind, so
97 * this logic works perfectly fine.
98 */
99 ts_top = ts40 >> 32;
100 if (ts_top < (u8)high && (u8)high - ts_top > U8_MAX / 2)
101 time_ns += 1ULL << 40;
102
103 return time_ns + offset;
104 }
105
fbnic_desc_unused(struct fbnic_ring * ring)106 static unsigned int fbnic_desc_unused(struct fbnic_ring *ring)
107 {
108 return (ring->head - ring->tail - 1) & ring->size_mask;
109 }
110
fbnic_desc_used(struct fbnic_ring * ring)111 static unsigned int fbnic_desc_used(struct fbnic_ring *ring)
112 {
113 return (ring->tail - ring->head) & ring->size_mask;
114 }
115
txring_txq(const struct net_device * dev,const struct fbnic_ring * ring)116 static struct netdev_queue *txring_txq(const struct net_device *dev,
117 const struct fbnic_ring *ring)
118 {
119 return netdev_get_tx_queue(dev, ring->q_idx);
120 }
121
fbnic_maybe_stop_tx(const struct net_device * dev,struct fbnic_ring * ring,const unsigned int size)122 static int fbnic_maybe_stop_tx(const struct net_device *dev,
123 struct fbnic_ring *ring,
124 const unsigned int size)
125 {
126 struct netdev_queue *txq = txring_txq(dev, ring);
127 int res;
128
129 res = netif_txq_maybe_stop(txq, fbnic_desc_unused(ring), size,
130 FBNIC_TX_DESC_WAKEUP);
131 if (!res) {
132 u64_stats_update_begin(&ring->stats.syncp);
133 ring->stats.twq.stop++;
134 u64_stats_update_end(&ring->stats.syncp);
135 }
136
137 return !res;
138 }
139
fbnic_tx_sent_queue(struct sk_buff * skb,struct fbnic_ring * ring)140 static bool fbnic_tx_sent_queue(struct sk_buff *skb, struct fbnic_ring *ring)
141 {
142 struct netdev_queue *dev_queue = txring_txq(skb->dev, ring);
143 unsigned int bytecount = FBNIC_XMIT_CB(skb)->bytecount;
144 bool xmit_more = netdev_xmit_more();
145
146 /* TBD: Request completion more often if xmit_more becomes large */
147
148 return __netdev_tx_sent_queue(dev_queue, bytecount, xmit_more);
149 }
150
fbnic_unmap_single_twd(struct device * dev,__le64 * twd)151 static void fbnic_unmap_single_twd(struct device *dev, __le64 *twd)
152 {
153 u64 raw_twd = le64_to_cpu(*twd);
154 unsigned int len;
155 dma_addr_t dma;
156
157 dma = FIELD_GET(FBNIC_TWD_ADDR_MASK, raw_twd);
158 len = FIELD_GET(FBNIC_TWD_LEN_MASK, raw_twd);
159
160 dma_unmap_single(dev, dma, len, DMA_TO_DEVICE);
161 }
162
fbnic_unmap_page_twd(struct device * dev,__le64 * twd)163 static void fbnic_unmap_page_twd(struct device *dev, __le64 *twd)
164 {
165 u64 raw_twd = le64_to_cpu(*twd);
166 unsigned int len;
167 dma_addr_t dma;
168
169 dma = FIELD_GET(FBNIC_TWD_ADDR_MASK, raw_twd);
170 len = FIELD_GET(FBNIC_TWD_LEN_MASK, raw_twd);
171
172 dma_unmap_page(dev, dma, len, DMA_TO_DEVICE);
173 }
174
175 #define FBNIC_TWD_TYPE(_type) \
176 cpu_to_le64(FIELD_PREP(FBNIC_TWD_TYPE_MASK, FBNIC_TWD_TYPE_##_type))
177
fbnic_tx_tstamp(struct sk_buff * skb)178 static bool fbnic_tx_tstamp(struct sk_buff *skb)
179 {
180 struct fbnic_net *fbn;
181
182 if (!unlikely(skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP))
183 return false;
184
185 fbn = netdev_priv(skb->dev);
186 if (fbn->hwtstamp_config.tx_type == HWTSTAMP_TX_OFF)
187 return false;
188
189 skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS;
190 FBNIC_XMIT_CB(skb)->flags |= FBNIC_XMIT_CB_TS;
191 FBNIC_XMIT_CB(skb)->hw_head = -1;
192
193 return true;
194 }
195
196 static bool
fbnic_tx_lso(struct fbnic_ring * ring,struct sk_buff * skb,__le64 * meta,unsigned int * l2len,unsigned int * i3len)197 fbnic_tx_lso(struct fbnic_ring *ring, struct sk_buff *skb,
198 __le64 *meta, unsigned int *l2len, unsigned int *i3len)
199 {
200 unsigned int l3_type, l4_type, l4len, hdrlen;
201 struct skb_shared_info *shinfo;
202 unsigned char *l4hdr;
203 __be16 payload_len;
204
205 if (unlikely(skb_cow_head(skb, 0)))
206 return true;
207
208 shinfo = skb_shinfo(skb);
209
210 if (shinfo->gso_type & SKB_GSO_PARTIAL) {
211 l3_type = FBNIC_TWD_L3_TYPE_OTHER;
212 } else if (!skb->encapsulation) {
213 if (ip_hdr(skb)->version == 4)
214 l3_type = FBNIC_TWD_L3_TYPE_IPV4;
215 else
216 l3_type = FBNIC_TWD_L3_TYPE_IPV6;
217 } else {
218 unsigned int o3len;
219
220 o3len = skb_inner_network_header(skb) - skb_network_header(skb);
221 *i3len -= o3len;
222 *meta |= cpu_to_le64(FIELD_PREP(FBNIC_TWD_L3_OHLEN_MASK,
223 o3len / 2));
224 l3_type = FBNIC_TWD_L3_TYPE_V6V6;
225 }
226
227 l4hdr = skb_checksum_start(skb);
228 payload_len = cpu_to_be16(skb->len - (l4hdr - skb->data));
229
230 if (shinfo->gso_type & (SKB_GSO_TCPV4 | SKB_GSO_TCPV6)) {
231 struct tcphdr *tcph = (struct tcphdr *)l4hdr;
232
233 l4_type = FBNIC_TWD_L4_TYPE_TCP;
234 l4len = __tcp_hdrlen((struct tcphdr *)l4hdr);
235 csum_replace_by_diff(&tcph->check, (__force __wsum)payload_len);
236 } else {
237 struct udphdr *udph = (struct udphdr *)l4hdr;
238
239 l4_type = FBNIC_TWD_L4_TYPE_UDP;
240 l4len = sizeof(struct udphdr);
241 csum_replace_by_diff(&udph->check, (__force __wsum)payload_len);
242 }
243
244 hdrlen = (l4hdr - skb->data) + l4len;
245 *meta |= cpu_to_le64(FIELD_PREP(FBNIC_TWD_L3_TYPE_MASK, l3_type) |
246 FIELD_PREP(FBNIC_TWD_L4_TYPE_MASK, l4_type) |
247 FIELD_PREP(FBNIC_TWD_L4_HLEN_MASK, l4len / 4) |
248 FIELD_PREP(FBNIC_TWD_MSS_MASK, shinfo->gso_size) |
249 FBNIC_TWD_FLAG_REQ_LSO);
250
251 FBNIC_XMIT_CB(skb)->bytecount += (shinfo->gso_segs - 1) * hdrlen;
252 FBNIC_XMIT_CB(skb)->gso_segs = shinfo->gso_segs;
253
254 u64_stats_update_begin(&ring->stats.syncp);
255 ring->stats.twq.lso += shinfo->gso_segs;
256 u64_stats_update_end(&ring->stats.syncp);
257
258 return false;
259 }
260
261 static bool
fbnic_tx_offloads(struct fbnic_ring * ring,struct sk_buff * skb,__le64 * meta)262 fbnic_tx_offloads(struct fbnic_ring *ring, struct sk_buff *skb, __le64 *meta)
263 {
264 unsigned int l2len, i3len;
265
266 if (fbnic_tx_tstamp(skb))
267 *meta |= cpu_to_le64(FBNIC_TWD_FLAG_REQ_TS);
268
269 if (unlikely(skb->ip_summed != CHECKSUM_PARTIAL))
270 return false;
271
272 l2len = skb_mac_header_len(skb);
273 i3len = skb_checksum_start(skb) - skb_network_header(skb);
274
275 *meta |= cpu_to_le64(FIELD_PREP(FBNIC_TWD_CSUM_OFFSET_MASK,
276 skb->csum_offset / 2));
277
278 if (skb_is_gso(skb)) {
279 if (fbnic_tx_lso(ring, skb, meta, &l2len, &i3len))
280 return true;
281 } else {
282 *meta |= cpu_to_le64(FBNIC_TWD_FLAG_REQ_CSO);
283 u64_stats_update_begin(&ring->stats.syncp);
284 ring->stats.twq.csum_partial++;
285 u64_stats_update_end(&ring->stats.syncp);
286 }
287
288 *meta |= cpu_to_le64(FIELD_PREP(FBNIC_TWD_L2_HLEN_MASK, l2len / 2) |
289 FIELD_PREP(FBNIC_TWD_L3_IHLEN_MASK, i3len / 2));
290 return false;
291 }
292
293 static void
fbnic_rx_csum(u64 rcd,struct sk_buff * skb,struct fbnic_ring * rcq,u64 * csum_cmpl,u64 * csum_none)294 fbnic_rx_csum(u64 rcd, struct sk_buff *skb, struct fbnic_ring *rcq,
295 u64 *csum_cmpl, u64 *csum_none)
296 {
297 skb_checksum_none_assert(skb);
298
299 if (unlikely(!(skb->dev->features & NETIF_F_RXCSUM))) {
300 (*csum_none)++;
301 return;
302 }
303
304 if (FIELD_GET(FBNIC_RCD_META_L4_CSUM_UNNECESSARY, rcd)) {
305 skb->ip_summed = CHECKSUM_UNNECESSARY;
306 } else {
307 u16 csum = FIELD_GET(FBNIC_RCD_META_L2_CSUM_MASK, rcd);
308
309 skb->ip_summed = CHECKSUM_COMPLETE;
310 skb->csum = (__force __wsum)csum;
311 (*csum_cmpl)++;
312 }
313 }
314
fbnic_tx_doorbell(struct fbnic_ring * ring,__le64 * meta)315 static void fbnic_tx_doorbell(struct fbnic_ring *ring, __le64 *meta)
316 {
317 *meta |= cpu_to_le64(FBNIC_TWD_FLAG_REQ_COMPLETION);
318 ring->deferred_meta = -1;
319
320 /* Force DMA writes to flush before writing to tail */
321 dma_wmb();
322
323 writel(ring->tail, ring->doorbell);
324 }
325
326 /* Packets handed to us with xmit_more set are left in the ring without a
327 * doorbell, and without a completion request, in the expectation that the
328 * packet ending the burst will ring for all of them. If that packet gets
329 * dropped instead we have to ring here, otherwise the descriptors sit in
330 * the ring until the next transmit, which may never come.
331 */
fbnic_tx_flush_doorbell(struct fbnic_ring * ring)332 static void fbnic_tx_flush_doorbell(struct fbnic_ring *ring)
333 {
334 if (ring->deferred_meta >= 0)
335 fbnic_tx_doorbell(ring, &ring->desc[ring->deferred_meta]);
336 }
337
338 static bool
fbnic_tx_map(struct fbnic_ring * ring,struct sk_buff * skb,__le64 * meta)339 fbnic_tx_map(struct fbnic_ring *ring, struct sk_buff *skb, __le64 *meta)
340 {
341 struct device *dev = skb->dev->dev.parent;
342 unsigned int tail = ring->tail, first;
343 unsigned int size, data_len;
344 skb_frag_t *frag;
345 bool is_net_iov;
346 dma_addr_t dma;
347 __le64 *twd;
348
349 ring->tx_buf[tail] = skb;
350
351 tail++;
352 tail &= ring->size_mask;
353 first = tail;
354
355 size = skb_headlen(skb);
356 data_len = skb->data_len;
357
358 if (size > FIELD_MAX(FBNIC_TWD_LEN_MASK))
359 goto dma_error;
360
361 is_net_iov = false;
362 dma = dma_map_single(dev, skb->data, size, DMA_TO_DEVICE);
363
364 for (frag = &skb_shinfo(skb)->frags[0];; frag++) {
365 twd = &ring->desc[tail];
366
367 if (dma_mapping_error(dev, dma))
368 goto dma_error;
369
370 *twd = cpu_to_le64(FIELD_PREP(FBNIC_TWD_ADDR_MASK, dma) |
371 FIELD_PREP(FBNIC_TWD_LEN_MASK, size) |
372 FIELD_PREP(FBNIC_TWD_TYPE_MASK,
373 FBNIC_TWD_TYPE_AL));
374 if (is_net_iov)
375 ring->tx_buf[tail] = FBNIC_XMIT_NOUNMAP;
376
377 tail++;
378 tail &= ring->size_mask;
379
380 if (!data_len)
381 break;
382
383 size = skb_frag_size(frag);
384 data_len -= size;
385
386 if (size > FIELD_MAX(FBNIC_TWD_LEN_MASK))
387 goto dma_error;
388
389 is_net_iov = skb_frag_is_net_iov(frag);
390 dma = skb_frag_dma_map(dev, frag, 0, size, DMA_TO_DEVICE);
391 }
392
393 *twd |= FBNIC_TWD_TYPE(LAST_AL);
394
395 FBNIC_XMIT_CB(skb)->desc_count = ((twd - meta) + 1) & ring->size_mask;
396
397 ring->tail = tail;
398
399 /* Record SW timestamp */
400 skb_tx_timestamp(skb);
401
402 /* Verify there is room for another packet */
403 fbnic_maybe_stop_tx(skb->dev, ring, FBNIC_MAX_SKB_DESC);
404
405 if (fbnic_tx_sent_queue(skb, ring))
406 fbnic_tx_doorbell(ring, meta);
407 else
408 ring->deferred_meta = meta - ring->desc;
409
410 return false;
411 dma_error:
412 if (net_ratelimit())
413 netdev_err(skb->dev, "TX DMA map failed\n");
414
415 while (tail != first) {
416 tail--;
417 tail &= ring->size_mask;
418 twd = &ring->desc[tail];
419 if (tail == first)
420 fbnic_unmap_single_twd(dev, twd);
421 else if (ring->tx_buf[tail] == FBNIC_XMIT_NOUNMAP)
422 ring->tx_buf[tail] = NULL;
423 else
424 fbnic_unmap_page_twd(dev, twd);
425 }
426
427 return true;
428 }
429
430 #define FBNIC_MIN_FRAME_LEN 60
431
432 static netdev_tx_t
fbnic_xmit_frame_ring(struct sk_buff * skb,struct fbnic_ring * ring)433 fbnic_xmit_frame_ring(struct sk_buff *skb, struct fbnic_ring *ring)
434 {
435 __le64 *meta = &ring->desc[ring->tail];
436 u16 desc_needed;
437
438 if (skb_put_padto(skb, FBNIC_MIN_FRAME_LEN))
439 goto err_count;
440
441 /* Need: 1 descriptor per page,
442 * + 1 desc for skb_head,
443 * + 2 desc for metadata and timestamp metadata
444 * + 7 desc gap to keep tail from touching head
445 * otherwise try next time
446 */
447 desc_needed = skb_shinfo(skb)->nr_frags + 10;
448 if (fbnic_maybe_stop_tx(skb->dev, ring, desc_needed)) {
449 fbnic_tx_flush_doorbell(ring);
450 return NETDEV_TX_BUSY;
451 }
452
453 *meta = cpu_to_le64(FBNIC_TWD_FLAG_DEST_MAC);
454
455 /* Write all members within DWORD to condense this into 2 4B writes */
456 FBNIC_XMIT_CB(skb)->bytecount = skb->len;
457 FBNIC_XMIT_CB(skb)->gso_segs = 1;
458 FBNIC_XMIT_CB(skb)->desc_count = 0;
459 FBNIC_XMIT_CB(skb)->flags = 0;
460
461 if (fbnic_tx_offloads(ring, skb, meta))
462 goto err_free;
463
464 if (fbnic_tx_map(ring, skb, meta))
465 goto err_free;
466
467 return NETDEV_TX_OK;
468
469 err_free:
470 dev_kfree_skb_any(skb);
471 err_count:
472 fbnic_tx_flush_doorbell(ring);
473
474 u64_stats_update_begin(&ring->stats.syncp);
475 ring->stats.dropped++;
476 u64_stats_update_end(&ring->stats.syncp);
477 return NETDEV_TX_OK;
478 }
479
fbnic_xmit_frame(struct sk_buff * skb,struct net_device * dev)480 netdev_tx_t fbnic_xmit_frame(struct sk_buff *skb, struct net_device *dev)
481 {
482 struct fbnic_net *fbn = netdev_priv(dev);
483 unsigned int q_map = skb->queue_mapping;
484
485 return fbnic_xmit_frame_ring(skb, fbn->tx[q_map]);
486 }
487
488 static netdev_features_t
fbnic_features_check_encap_gso(struct sk_buff * skb,struct net_device * dev,netdev_features_t features,unsigned int l3len)489 fbnic_features_check_encap_gso(struct sk_buff *skb, struct net_device *dev,
490 netdev_features_t features, unsigned int l3len)
491 {
492 netdev_features_t skb_gso_features;
493 struct ipv6hdr *ip6_hdr;
494 unsigned char l4_hdr;
495 unsigned int start;
496 __be16 frag_off;
497
498 /* Require MANGLEID for GSO_PARTIAL of IPv4.
499 * In theory we could support TSO with single, innermost v4 header
500 * by pretending everything before it is L2, but that needs to be
501 * parsed case by case.. so leaving it for when the need arises.
502 */
503 if (!(features & NETIF_F_TSO_MANGLEID))
504 features &= ~NETIF_F_TSO;
505
506 skb_gso_features = skb_shinfo(skb)->gso_type;
507 skb_gso_features <<= NETIF_F_GSO_SHIFT;
508
509 /* We'd only clear the native GSO features, so don't bother validating
510 * if the match can only be on those supported thru GSO_PARTIAL.
511 */
512 if (!(skb_gso_features & FBNIC_TUN_GSO_FEATURES))
513 return features;
514
515 /* We can only do IPv6-in-IPv6, not v4-in-v6. It'd be nice
516 * to fall back to partial for this, or any failure below.
517 * This is just an optimization, UDPv4 will be caught later on.
518 */
519 if (skb_gso_features & NETIF_F_TSO)
520 return features & ~FBNIC_TUN_GSO_FEATURES;
521
522 /* Inner headers multiple of 2 */
523 if ((skb_inner_network_header(skb) - skb_network_header(skb)) % 2)
524 return features & ~FBNIC_TUN_GSO_FEATURES;
525
526 /* Encapsulated GSO packet, make 100% sure it's IPv6-in-IPv6. */
527 ip6_hdr = ipv6_hdr(skb);
528 if (ip6_hdr->version != 6)
529 return features & ~FBNIC_TUN_GSO_FEATURES;
530
531 l4_hdr = ip6_hdr->nexthdr;
532 start = (unsigned char *)ip6_hdr - skb->data + sizeof(struct ipv6hdr);
533 start = ipv6_skip_exthdr(skb, start, &l4_hdr, &frag_off);
534 if (frag_off || l4_hdr != IPPROTO_IPV6 ||
535 skb->data + start != skb_inner_network_header(skb))
536 return features & ~FBNIC_TUN_GSO_FEATURES;
537
538 return features;
539 }
540
541 netdev_features_t
fbnic_features_check(struct sk_buff * skb,struct net_device * dev,netdev_features_t features)542 fbnic_features_check(struct sk_buff *skb, struct net_device *dev,
543 netdev_features_t features)
544 {
545 unsigned int l2len, l3len;
546
547 if (unlikely(skb->ip_summed != CHECKSUM_PARTIAL))
548 return features;
549
550 l2len = skb_mac_header_len(skb);
551 l3len = skb_checksum_start(skb) - skb_network_header(skb);
552
553 /* Check header lengths are multiple of 2.
554 * In case of 6in6 we support longer headers (IHLEN + OHLEN)
555 * but keep things simple for now, 512B is plenty.
556 */
557 if ((l2len | l3len | skb->csum_offset) % 2 ||
558 !FIELD_FIT(FBNIC_TWD_L2_HLEN_MASK, l2len / 2) ||
559 !FIELD_FIT(FBNIC_TWD_L3_IHLEN_MASK, l3len / 2) ||
560 !FIELD_FIT(FBNIC_TWD_CSUM_OFFSET_MASK, skb->csum_offset / 2))
561 return features & ~(NETIF_F_CSUM_MASK | NETIF_F_GSO_MASK);
562
563 if (likely(!skb->encapsulation) || !skb_is_gso(skb))
564 return features;
565
566 return fbnic_features_check_encap_gso(skb, dev, features, l3len);
567 }
568
fbnic_clean_twq0(struct fbnic_napi_vector * nv,int napi_budget,struct fbnic_ring * ring,bool discard,unsigned int hw_head)569 static void fbnic_clean_twq0(struct fbnic_napi_vector *nv, int napi_budget,
570 struct fbnic_ring *ring, bool discard,
571 unsigned int hw_head)
572 {
573 u64 total_bytes = 0, total_packets = 0, ts_lost = 0;
574 unsigned int head = ring->head;
575 struct netdev_queue *txq;
576 unsigned int clean_desc;
577
578 clean_desc = (hw_head - head) & ring->size_mask;
579
580 while (clean_desc) {
581 struct sk_buff *skb = ring->tx_buf[head];
582 unsigned int desc_cnt;
583
584 desc_cnt = FBNIC_XMIT_CB(skb)->desc_count;
585 if (desc_cnt > clean_desc)
586 break;
587
588 if (unlikely(FBNIC_XMIT_CB(skb)->flags & FBNIC_XMIT_CB_TS)) {
589 FBNIC_XMIT_CB(skb)->hw_head = hw_head;
590 if (likely(!discard))
591 break;
592 ts_lost++;
593 }
594
595 ring->tx_buf[head] = NULL;
596
597 clean_desc -= desc_cnt;
598
599 while (!(ring->desc[head] & FBNIC_TWD_TYPE(AL))) {
600 head++;
601 head &= ring->size_mask;
602 desc_cnt--;
603 }
604
605 fbnic_unmap_single_twd(nv->dev, &ring->desc[head]);
606 head++;
607 head &= ring->size_mask;
608 desc_cnt--;
609
610 while (desc_cnt--) {
611 if (ring->tx_buf[head] != FBNIC_XMIT_NOUNMAP)
612 fbnic_unmap_page_twd(nv->dev,
613 &ring->desc[head]);
614 else
615 ring->tx_buf[head] = NULL;
616 head++;
617 head &= ring->size_mask;
618 }
619
620 total_bytes += FBNIC_XMIT_CB(skb)->bytecount;
621 total_packets += FBNIC_XMIT_CB(skb)->gso_segs;
622
623 napi_consume_skb(skb, napi_budget);
624 }
625
626 if (!total_bytes)
627 return;
628
629 ring->head = head;
630
631 txq = txring_txq(nv->napi.dev, ring);
632
633 if (unlikely(discard)) {
634 u64_stats_update_begin(&ring->stats.syncp);
635 ring->stats.dropped += total_packets;
636 ring->stats.twq.ts_lost += ts_lost;
637 u64_stats_update_end(&ring->stats.syncp);
638
639 netdev_tx_completed_queue(txq, total_packets, total_bytes);
640 return;
641 }
642
643 u64_stats_update_begin(&ring->stats.syncp);
644 ring->stats.bytes += total_bytes;
645 ring->stats.packets += total_packets;
646 u64_stats_update_end(&ring->stats.syncp);
647
648 if (!netif_txq_completed_wake(txq, total_packets, total_bytes,
649 fbnic_desc_unused(ring),
650 FBNIC_TX_DESC_WAKEUP)) {
651 u64_stats_update_begin(&ring->stats.syncp);
652 ring->stats.twq.wake++;
653 u64_stats_update_end(&ring->stats.syncp);
654 }
655 }
656
fbnic_clean_twq1(struct fbnic_napi_vector * nv,bool pp_allow_direct,struct fbnic_ring * ring,bool discard,unsigned int hw_head)657 static void fbnic_clean_twq1(struct fbnic_napi_vector *nv, bool pp_allow_direct,
658 struct fbnic_ring *ring, bool discard,
659 unsigned int hw_head)
660 {
661 u64 total_bytes = 0, total_packets = 0;
662 unsigned int head = ring->head;
663
664 while (hw_head != head) {
665 struct page *page;
666 u64 twd;
667
668 if (unlikely(!(ring->desc[head] & FBNIC_TWD_TYPE(AL))))
669 goto next_desc;
670
671 twd = le64_to_cpu(ring->desc[head]);
672 page = ring->tx_buf[head];
673
674 /* TYPE_AL is 2, TYPE_LAST_AL is 3. So this trick gives
675 * us one increment per packet, with no branches.
676 */
677 total_packets += FIELD_GET(FBNIC_TWD_TYPE_MASK, twd) -
678 FBNIC_TWD_TYPE_AL;
679 total_bytes += FIELD_GET(FBNIC_TWD_LEN_MASK, twd);
680
681 page_pool_put_page(pp_page_to_nmdesc(page)->pp, page, -1,
682 pp_allow_direct);
683 next_desc:
684 head++;
685 head &= ring->size_mask;
686 }
687
688 if (!total_bytes)
689 return;
690
691 ring->head = head;
692
693 if (discard) {
694 u64_stats_update_begin(&ring->stats.syncp);
695 ring->stats.dropped += total_packets;
696 u64_stats_update_end(&ring->stats.syncp);
697 return;
698 }
699
700 u64_stats_update_begin(&ring->stats.syncp);
701 ring->stats.bytes += total_bytes;
702 ring->stats.packets += total_packets;
703 u64_stats_update_end(&ring->stats.syncp);
704 }
705
fbnic_clean_tsq(struct fbnic_napi_vector * nv,struct fbnic_ring * ring,u64 tcd,int * ts_head,int * head0)706 static void fbnic_clean_tsq(struct fbnic_napi_vector *nv,
707 struct fbnic_ring *ring,
708 u64 tcd, int *ts_head, int *head0)
709 {
710 struct skb_shared_hwtstamps hwtstamp;
711 struct fbnic_net *fbn;
712 struct sk_buff *skb;
713 int head;
714 u64 ns;
715
716 head = (*ts_head < 0) ? ring->head : *ts_head;
717
718 do {
719 unsigned int desc_cnt;
720
721 if (head == ring->tail) {
722 if (unlikely(net_ratelimit()))
723 netdev_err(nv->napi.dev,
724 "Tx timestamp without matching packet\n");
725 return;
726 }
727
728 skb = ring->tx_buf[head];
729 desc_cnt = FBNIC_XMIT_CB(skb)->desc_count;
730
731 head += desc_cnt;
732 head &= ring->size_mask;
733 } while (!(FBNIC_XMIT_CB(skb)->flags & FBNIC_XMIT_CB_TS));
734
735 fbn = netdev_priv(nv->napi.dev);
736 ns = fbnic_ts40_to_ns(fbn, FIELD_GET(FBNIC_TCD_TYPE1_TS_MASK, tcd));
737
738 memset(&hwtstamp, 0, sizeof(hwtstamp));
739 hwtstamp.hwtstamp = ns_to_ktime(ns);
740
741 *ts_head = head;
742
743 FBNIC_XMIT_CB(skb)->flags &= ~FBNIC_XMIT_CB_TS;
744 if (*head0 < 0) {
745 head = FBNIC_XMIT_CB(skb)->hw_head;
746 if (head >= 0)
747 *head0 = head;
748 }
749
750 skb_tstamp_tx(skb, &hwtstamp);
751 u64_stats_update_begin(&ring->stats.syncp);
752 ring->stats.twq.ts_packets++;
753 u64_stats_update_end(&ring->stats.syncp);
754 }
755
fbnic_page_pool_init(struct fbnic_ring * ring,unsigned int idx,netmem_ref netmem)756 static void fbnic_page_pool_init(struct fbnic_ring *ring, unsigned int idx,
757 netmem_ref netmem)
758 {
759 struct fbnic_rx_buf *rx_buf = &ring->rx_buf[idx];
760
761 page_pool_fragment_netmem(netmem, FBNIC_PAGECNT_BIAS_MAX);
762 rx_buf->pagecnt_bias = FBNIC_PAGECNT_BIAS_MAX;
763 rx_buf->netmem = netmem;
764 }
765
766 static struct page *
fbnic_page_pool_get_head(struct fbnic_q_triad * qt,unsigned int idx)767 fbnic_page_pool_get_head(struct fbnic_q_triad *qt, unsigned int idx)
768 {
769 struct fbnic_rx_buf *rx_buf = &qt->sub0.rx_buf[idx];
770
771 rx_buf->pagecnt_bias--;
772
773 /* sub0 is always fed system pages, from the NAPI-level page_pool */
774 return netmem_to_page(rx_buf->netmem);
775 }
776
777 static netmem_ref
fbnic_page_pool_get_data(struct fbnic_q_triad * qt,unsigned int idx)778 fbnic_page_pool_get_data(struct fbnic_q_triad *qt, unsigned int idx)
779 {
780 struct fbnic_rx_buf *rx_buf = &qt->sub1.rx_buf[idx];
781
782 rx_buf->pagecnt_bias--;
783
784 return rx_buf->netmem;
785 }
786
fbnic_page_pool_drain(struct fbnic_ring * ring,unsigned int idx,int budget)787 static void fbnic_page_pool_drain(struct fbnic_ring *ring, unsigned int idx,
788 int budget)
789 {
790 struct fbnic_rx_buf *rx_buf = &ring->rx_buf[idx];
791 netmem_ref netmem = rx_buf->netmem;
792
793 if (!page_pool_unref_netmem(netmem, rx_buf->pagecnt_bias))
794 page_pool_put_unrefed_netmem(ring->page_pool, netmem, -1,
795 !!budget);
796
797 rx_buf->netmem = 0;
798 }
799
fbnic_clean_twq(struct fbnic_napi_vector * nv,int napi_budget,struct fbnic_q_triad * qt,s32 ts_head,s32 head0,s32 head1)800 static void fbnic_clean_twq(struct fbnic_napi_vector *nv, int napi_budget,
801 struct fbnic_q_triad *qt, s32 ts_head, s32 head0,
802 s32 head1)
803 {
804 if (head0 >= 0)
805 fbnic_clean_twq0(nv, napi_budget, &qt->sub0, false, head0);
806 else if (ts_head >= 0)
807 fbnic_clean_twq0(nv, napi_budget, &qt->sub0, false, ts_head);
808
809 if (head1 >= 0) {
810 qt->cmpl.deferred_head = -1;
811 if (napi_budget)
812 fbnic_clean_twq1(nv, true, &qt->sub1, false, head1);
813 else
814 qt->cmpl.deferred_head = head1;
815 }
816 }
817
818 static void
fbnic_clean_tcq(struct fbnic_napi_vector * nv,struct fbnic_q_triad * qt,int napi_budget)819 fbnic_clean_tcq(struct fbnic_napi_vector *nv, struct fbnic_q_triad *qt,
820 int napi_budget)
821 {
822 struct fbnic_ring *cmpl = &qt->cmpl;
823 s32 head1 = cmpl->deferred_head;
824 s32 head0 = -1, ts_head = -1;
825 __le64 *raw_tcd, done;
826 u32 head = cmpl->head;
827
828 done = (head & (cmpl->size_mask + 1)) ? 0 : cpu_to_le64(FBNIC_TCD_DONE);
829 raw_tcd = &cmpl->desc[head & cmpl->size_mask];
830
831 /* Walk the completion queue collecting the heads reported by NIC */
832 while ((*raw_tcd & cpu_to_le64(FBNIC_TCD_DONE)) == done) {
833 u64 tcd;
834
835 dma_rmb();
836
837 tcd = le64_to_cpu(*raw_tcd);
838
839 switch (FIELD_GET(FBNIC_TCD_TYPE_MASK, tcd)) {
840 case FBNIC_TCD_TYPE_0:
841 if (tcd & FBNIC_TCD_TWQ1)
842 head1 = FIELD_GET(FBNIC_TCD_TYPE0_HEAD1_MASK,
843 tcd);
844 else
845 head0 = FIELD_GET(FBNIC_TCD_TYPE0_HEAD0_MASK,
846 tcd);
847 /* Currently all err status bits are related to
848 * timestamps and as those have yet to be added
849 * they are skipped for now.
850 */
851 break;
852 case FBNIC_TCD_TYPE_1:
853 if (WARN_ON_ONCE(tcd & FBNIC_TCD_TWQ1))
854 break;
855
856 fbnic_clean_tsq(nv, &qt->sub0, tcd, &ts_head, &head0);
857 break;
858 default:
859 break;
860 }
861
862 raw_tcd++;
863 head++;
864 if (!(head & cmpl->size_mask)) {
865 done ^= cpu_to_le64(FBNIC_TCD_DONE);
866 raw_tcd = &cmpl->desc[0];
867 }
868 }
869
870 /* Record the current head/tail of the queue */
871 if (cmpl->head != head) {
872 cmpl->head = head;
873 writel(head & cmpl->size_mask, cmpl->doorbell);
874 }
875
876 /* Unmap and free processed buffers */
877 fbnic_clean_twq(nv, napi_budget, qt, ts_head, head0, head1);
878 }
879
fbnic_clean_bdq(struct fbnic_ring * ring,unsigned int hw_head,int napi_budget)880 static void fbnic_clean_bdq(struct fbnic_ring *ring, unsigned int hw_head,
881 int napi_budget)
882 {
883 unsigned int head = ring->head;
884
885 if (head == hw_head)
886 return;
887
888 do {
889 fbnic_page_pool_drain(ring, head, napi_budget);
890
891 head++;
892 head &= ring->size_mask;
893 } while (head != hw_head);
894
895 ring->head = head;
896 }
897
fbnic_bd_prep(struct fbnic_ring * bdq,u16 id,netmem_ref netmem)898 static void fbnic_bd_prep(struct fbnic_ring *bdq, u16 id, netmem_ref netmem)
899 {
900 __le64 *bdq_desc = &bdq->desc[id * FBNIC_BD_FRAG_COUNT];
901 dma_addr_t dma = page_pool_get_dma_addr_netmem(netmem);
902 u64 bd, i = FBNIC_BD_FRAG_COUNT;
903
904 bd = (FBNIC_BD_PAGE_ADDR_MASK & dma) |
905 FIELD_PREP(FBNIC_BD_PAGE_ID_MASK, id);
906
907 /* In the case that a page size is larger than 4K we will map a
908 * single page to multiple fragments. The fragments will be
909 * FBNIC_BD_FRAG_COUNT in size and the lower n bits will be use
910 * to indicate the individual fragment IDs.
911 */
912 do {
913 *bdq_desc = cpu_to_le64(bd);
914 bd += FIELD_PREP(FBNIC_BD_DESC_ADDR_MASK, 1) |
915 FIELD_PREP(FBNIC_BD_DESC_ID_MASK, 1);
916 bdq_desc++;
917 } while (--i);
918 }
919
fbnic_fill_bdq(struct fbnic_ring * bdq)920 static void fbnic_fill_bdq(struct fbnic_ring *bdq)
921 {
922 unsigned int count = fbnic_desc_unused(bdq);
923 unsigned int i = bdq->tail;
924
925 if (!count)
926 return;
927
928 do {
929 netmem_ref netmem;
930
931 netmem = page_pool_dev_alloc_netmems(bdq->page_pool);
932 if (!netmem) {
933 u64_stats_update_begin(&bdq->stats.syncp);
934 bdq->stats.bdq.alloc_failed++;
935 u64_stats_update_end(&bdq->stats.syncp);
936
937 break;
938 }
939
940 fbnic_page_pool_init(bdq, i, netmem);
941 fbnic_bd_prep(bdq, i, netmem);
942
943 i++;
944 i &= bdq->size_mask;
945
946 count--;
947 } while (count);
948
949 if (bdq->tail != i) {
950 bdq->tail = i;
951
952 /* Force DMA writes to flush before writing to tail */
953 dma_wmb();
954
955 writel(i * FBNIC_BD_FRAG_COUNT, bdq->doorbell);
956 }
957 }
958
fbnic_hdr_pg_start(unsigned int pg_off)959 static unsigned int fbnic_hdr_pg_start(unsigned int pg_off)
960 {
961 /* The headroom of the first header may be larger than FBNIC_RX_HROOM
962 * due to alignment. So account for that by just making the page
963 * offset 0 if we are starting at the first header.
964 */
965 if (ALIGN(FBNIC_RX_HROOM, 128) > FBNIC_RX_HROOM &&
966 pg_off == ALIGN(FBNIC_RX_HROOM, 128))
967 return 0;
968
969 return pg_off - FBNIC_RX_HROOM;
970 }
971
fbnic_hdr_pg_end(unsigned int pg_off,unsigned int len)972 static unsigned int fbnic_hdr_pg_end(unsigned int pg_off, unsigned int len)
973 {
974 /* Determine the end of the buffer by finding the start of the next
975 * and then subtracting the headroom from that frame.
976 */
977 pg_off += len + FBNIC_RX_TROOM + FBNIC_RX_HROOM;
978
979 return ALIGN(pg_off, 128) - FBNIC_RX_HROOM;
980 }
981
fbnic_pkt_prepare(struct fbnic_napi_vector * nv,u64 rcd,struct fbnic_pkt_buff * pkt,struct fbnic_q_triad * qt)982 static void fbnic_pkt_prepare(struct fbnic_napi_vector *nv, u64 rcd,
983 struct fbnic_pkt_buff *pkt,
984 struct fbnic_q_triad *qt)
985 {
986 unsigned int hdr_pg_idx = FIELD_GET(FBNIC_RCD_AL_BUFF_PAGE_MASK, rcd);
987 unsigned int hdr_pg_off = FIELD_GET(FBNIC_RCD_AL_BUFF_OFF_MASK, rcd);
988 struct page *page = fbnic_page_pool_get_head(qt, hdr_pg_idx);
989 unsigned int len = FIELD_GET(FBNIC_RCD_AL_BUFF_LEN_MASK, rcd);
990 unsigned int frame_sz, hdr_pg_start, hdr_pg_end, headroom;
991 unsigned char *hdr_start;
992
993 /* data_hard_start should always be NULL when this is called */
994 WARN_ON_ONCE(pkt->buff.data_hard_start);
995
996 /* Short-cut the end calculation if we know page is fully consumed */
997 hdr_pg_end = FIELD_GET(FBNIC_RCD_AL_PAGE_FIN, rcd) ?
998 FBNIC_BD_FRAG_SIZE : fbnic_hdr_pg_end(hdr_pg_off, len);
999 hdr_pg_start = fbnic_hdr_pg_start(hdr_pg_off);
1000
1001 headroom = hdr_pg_off - hdr_pg_start + FBNIC_RX_PAD;
1002 frame_sz = hdr_pg_end - hdr_pg_start;
1003 xdp_init_buff(&pkt->buff, frame_sz, &qt->xdp_rxq);
1004 hdr_pg_start += (FBNIC_RCD_AL_BUFF_FRAG_MASK & rcd) *
1005 FBNIC_BD_FRAG_SIZE;
1006
1007 /* Sync DMA buffer */
1008 dma_sync_single_range_for_cpu(nv->dev, page_pool_get_dma_addr(page),
1009 hdr_pg_start, frame_sz,
1010 DMA_BIDIRECTIONAL);
1011
1012 /* Build frame around buffer */
1013 hdr_start = page_address(page) + hdr_pg_start;
1014 net_prefetch(pkt->buff.data);
1015 xdp_prepare_buff(&pkt->buff, hdr_start, headroom,
1016 len - FBNIC_RX_PAD, true);
1017
1018 pkt->hwtstamp = 0;
1019 pkt->add_frag_failed = false;
1020 }
1021
fbnic_add_rx_frag(struct fbnic_napi_vector * nv,u64 rcd,struct fbnic_pkt_buff * pkt,struct fbnic_q_triad * qt)1022 static void fbnic_add_rx_frag(struct fbnic_napi_vector *nv, u64 rcd,
1023 struct fbnic_pkt_buff *pkt,
1024 struct fbnic_q_triad *qt)
1025 {
1026 unsigned int pg_idx = FIELD_GET(FBNIC_RCD_AL_BUFF_PAGE_MASK, rcd);
1027 unsigned int pg_off = FIELD_GET(FBNIC_RCD_AL_BUFF_OFF_MASK, rcd);
1028 unsigned int len = FIELD_GET(FBNIC_RCD_AL_BUFF_LEN_MASK, rcd);
1029 netmem_ref netmem = fbnic_page_pool_get_data(qt, pg_idx);
1030 unsigned int truesize;
1031 bool added;
1032
1033 truesize = FIELD_GET(FBNIC_RCD_AL_PAGE_FIN, rcd) ?
1034 FBNIC_BD_FRAG_SIZE - pg_off : ALIGN(len, 128);
1035
1036 pg_off += (FBNIC_RCD_AL_BUFF_FRAG_MASK & rcd) *
1037 FBNIC_BD_FRAG_SIZE;
1038
1039 /* Sync DMA buffer */
1040 page_pool_dma_sync_netmem_for_cpu(qt->sub1.page_pool, netmem,
1041 pg_off, truesize);
1042
1043 added = xdp_buff_add_frag(&pkt->buff, netmem, pg_off, len, truesize);
1044 if (unlikely(!added)) {
1045 pkt->add_frag_failed = true;
1046 netdev_err_once(nv->napi.dev,
1047 "Failed to add fragment to xdp_buff\n");
1048 }
1049 }
1050
fbnic_put_pkt_buff(struct fbnic_q_triad * qt,struct fbnic_pkt_buff * pkt,int budget)1051 static void fbnic_put_pkt_buff(struct fbnic_q_triad *qt,
1052 struct fbnic_pkt_buff *pkt, int budget)
1053 {
1054 struct page *page;
1055
1056 if (!pkt->buff.data_hard_start)
1057 return;
1058
1059 if (xdp_buff_has_frags(&pkt->buff)) {
1060 struct skb_shared_info *shinfo;
1061 netmem_ref netmem;
1062 int nr_frags;
1063
1064 shinfo = xdp_get_shared_info_from_buff(&pkt->buff);
1065 nr_frags = shinfo->nr_frags;
1066
1067 while (nr_frags--) {
1068 netmem = skb_frag_netmem(&shinfo->frags[nr_frags]);
1069 page_pool_put_full_netmem(qt->sub1.page_pool, netmem,
1070 !!budget);
1071 }
1072 }
1073
1074 page = virt_to_page(pkt->buff.data_hard_start);
1075 page_pool_put_full_page(qt->sub0.page_pool, page, !!budget);
1076 }
1077
fbnic_build_skb(struct fbnic_napi_vector * nv,struct fbnic_pkt_buff * pkt)1078 static struct sk_buff *fbnic_build_skb(struct fbnic_napi_vector *nv,
1079 struct fbnic_pkt_buff *pkt)
1080 {
1081 struct sk_buff *skb;
1082
1083 skb = xdp_build_skb_from_buff(&pkt->buff);
1084 if (!skb)
1085 return NULL;
1086
1087 /* Add timestamp if present */
1088 if (pkt->hwtstamp)
1089 skb_hwtstamps(skb)->hwtstamp = pkt->hwtstamp;
1090
1091 return skb;
1092 }
1093
fbnic_pkt_tx(struct fbnic_napi_vector * nv,struct fbnic_pkt_buff * pkt)1094 static long fbnic_pkt_tx(struct fbnic_napi_vector *nv,
1095 struct fbnic_pkt_buff *pkt)
1096 {
1097 struct fbnic_ring *ring = &nv->qt[0].sub1;
1098 int size, offset, nsegs = 1, data_len = 0;
1099 unsigned int tail = ring->tail;
1100 struct skb_shared_info *shinfo;
1101 skb_frag_t *frag = NULL;
1102 struct page *page;
1103 dma_addr_t dma;
1104 __le64 *twd;
1105
1106 if (unlikely(xdp_buff_has_frags(&pkt->buff))) {
1107 shinfo = xdp_get_shared_info_from_buff(&pkt->buff);
1108 nsegs += shinfo->nr_frags;
1109 data_len = shinfo->xdp_frags_size;
1110 frag = &shinfo->frags[0];
1111 }
1112
1113 if (fbnic_desc_unused(ring) < nsegs) {
1114 u64_stats_update_begin(&ring->stats.syncp);
1115 ring->stats.dropped++;
1116 u64_stats_update_end(&ring->stats.syncp);
1117 return -FBNIC_XDP_CONSUME;
1118 }
1119
1120 page = virt_to_page(pkt->buff.data_hard_start);
1121 offset = offset_in_page(pkt->buff.data);
1122 dma = page_pool_get_dma_addr(page);
1123
1124 size = pkt->buff.data_end - pkt->buff.data;
1125
1126 while (nsegs--) {
1127 dma_sync_single_range_for_device(nv->dev, dma, offset, size,
1128 DMA_BIDIRECTIONAL);
1129 dma += offset;
1130
1131 ring->tx_buf[tail] = page;
1132
1133 twd = &ring->desc[tail];
1134 *twd = cpu_to_le64(FIELD_PREP(FBNIC_TWD_ADDR_MASK, dma) |
1135 FIELD_PREP(FBNIC_TWD_LEN_MASK, size) |
1136 FIELD_PREP(FBNIC_TWD_TYPE_MASK,
1137 FBNIC_TWD_TYPE_AL));
1138
1139 tail++;
1140 tail &= ring->size_mask;
1141
1142 if (!data_len)
1143 break;
1144
1145 offset = skb_frag_off(frag);
1146 page = skb_frag_page(frag);
1147 dma = page_pool_get_dma_addr(page);
1148
1149 size = skb_frag_size(frag);
1150 data_len -= size;
1151 frag++;
1152 }
1153
1154 *twd |= FBNIC_TWD_TYPE(LAST_AL);
1155
1156 ring->tail = tail;
1157
1158 return -FBNIC_XDP_TX;
1159 }
1160
fbnic_pkt_commit_tail(struct fbnic_napi_vector * nv,unsigned int pkt_tail)1161 static void fbnic_pkt_commit_tail(struct fbnic_napi_vector *nv,
1162 unsigned int pkt_tail)
1163 {
1164 struct fbnic_ring *ring = &nv->qt[0].sub1;
1165
1166 /* Force DMA writes to flush before writing to tail */
1167 dma_wmb();
1168
1169 writel(pkt_tail, ring->doorbell);
1170 }
1171
fbnic_run_xdp(struct fbnic_napi_vector * nv,struct fbnic_pkt_buff * pkt)1172 static struct sk_buff *fbnic_run_xdp(struct fbnic_napi_vector *nv,
1173 struct fbnic_pkt_buff *pkt)
1174 {
1175 struct fbnic_net *fbn = netdev_priv(nv->napi.dev);
1176 struct bpf_prog *xdp_prog;
1177 int act;
1178
1179 xdp_prog = READ_ONCE(fbn->xdp_prog);
1180 if (!xdp_prog)
1181 goto xdp_pass;
1182
1183 /* Should never happen, config paths enforce HDS threshold > MTU */
1184 if (xdp_buff_has_frags(&pkt->buff) && !xdp_prog->aux->xdp_has_frags)
1185 return ERR_PTR(-FBNIC_XDP_LEN_ERR);
1186
1187 act = bpf_prog_run_xdp(xdp_prog, &pkt->buff);
1188 switch (act) {
1189 case XDP_PASS:
1190 xdp_pass:
1191 return fbnic_build_skb(nv, pkt);
1192 case XDP_TX:
1193 return ERR_PTR(fbnic_pkt_tx(nv, pkt));
1194 default:
1195 bpf_warn_invalid_xdp_action(nv->napi.dev, xdp_prog, act);
1196 fallthrough;
1197 case XDP_ABORTED:
1198 trace_xdp_exception(nv->napi.dev, xdp_prog, act);
1199 fallthrough;
1200 case XDP_DROP:
1201 break;
1202 }
1203
1204 return ERR_PTR(-FBNIC_XDP_CONSUME);
1205 }
1206
fbnic_skb_hash_type(u64 rcd)1207 static enum pkt_hash_types fbnic_skb_hash_type(u64 rcd)
1208 {
1209 return (FBNIC_RCD_META_L4_TYPE_MASK & rcd) ? PKT_HASH_TYPE_L4 :
1210 (FBNIC_RCD_META_L3_TYPE_MASK & rcd) ? PKT_HASH_TYPE_L3 :
1211 PKT_HASH_TYPE_L2;
1212 }
1213
fbnic_rx_tstamp(struct fbnic_napi_vector * nv,u64 rcd,struct fbnic_pkt_buff * pkt)1214 static void fbnic_rx_tstamp(struct fbnic_napi_vector *nv, u64 rcd,
1215 struct fbnic_pkt_buff *pkt)
1216 {
1217 struct fbnic_net *fbn;
1218 u64 ns, ts;
1219
1220 if (!FIELD_GET(FBNIC_RCD_OPT_META_TS, rcd))
1221 return;
1222
1223 fbn = netdev_priv(nv->napi.dev);
1224 ts = FIELD_GET(FBNIC_RCD_OPT_META_TS_MASK, rcd);
1225 ns = fbnic_ts40_to_ns(fbn, ts);
1226
1227 /* Add timestamp to shared info */
1228 pkt->hwtstamp = ns_to_ktime(ns);
1229 }
1230
fbnic_populate_skb_fields(struct fbnic_napi_vector * nv,u64 rcd,struct sk_buff * skb,struct fbnic_q_triad * qt,u64 * csum_cmpl,u64 * csum_none)1231 static void fbnic_populate_skb_fields(struct fbnic_napi_vector *nv,
1232 u64 rcd, struct sk_buff *skb,
1233 struct fbnic_q_triad *qt,
1234 u64 *csum_cmpl, u64 *csum_none)
1235 {
1236 struct net_device *netdev = nv->napi.dev;
1237 struct fbnic_ring *rcq = &qt->cmpl;
1238
1239 fbnic_rx_csum(rcd, skb, rcq, csum_cmpl, csum_none);
1240
1241 if (netdev->features & NETIF_F_RXHASH)
1242 skb_set_hash(skb,
1243 FIELD_GET(FBNIC_RCD_META_RSS_HASH_MASK, rcd),
1244 fbnic_skb_hash_type(rcd));
1245
1246 skb_record_rx_queue(skb, rcq->q_idx);
1247 }
1248
fbnic_rcd_metadata_err(u64 rcd)1249 static bool fbnic_rcd_metadata_err(u64 rcd)
1250 {
1251 return !!(FBNIC_RCD_META_UNCORRECTABLE_ERR_MASK & rcd);
1252 }
1253
fbnic_clean_rcq(struct fbnic_napi_vector * nv,struct fbnic_q_triad * qt,int budget)1254 static int fbnic_clean_rcq(struct fbnic_napi_vector *nv,
1255 struct fbnic_q_triad *qt, int budget)
1256 {
1257 unsigned int packets = 0, bytes = 0, dropped = 0, alloc_failed = 0;
1258 u64 csum_complete = 0, csum_none = 0, length_errors = 0;
1259 s32 head0 = -1, head1 = -1, pkt_tail = -1;
1260 struct fbnic_ring *rcq = &qt->cmpl;
1261 struct fbnic_pkt_buff *pkt;
1262 __le64 *raw_rcd, done;
1263 u32 head = rcq->head;
1264
1265 done = (head & (rcq->size_mask + 1)) ? cpu_to_le64(FBNIC_RCD_DONE) : 0;
1266 raw_rcd = &rcq->desc[head & rcq->size_mask];
1267 pkt = rcq->pkt;
1268
1269 /* Walk the completion queue collecting the heads reported by NIC */
1270 while (likely(packets < budget)) {
1271 struct sk_buff *skb = ERR_PTR(-EINVAL);
1272 u32 pkt_bytes;
1273 u64 rcd;
1274
1275 if ((*raw_rcd & cpu_to_le64(FBNIC_RCD_DONE)) == done)
1276 break;
1277
1278 dma_rmb();
1279
1280 rcd = le64_to_cpu(*raw_rcd);
1281
1282 switch (FIELD_GET(FBNIC_RCD_TYPE_MASK, rcd)) {
1283 case FBNIC_RCD_TYPE_HDR_AL:
1284 head0 = FIELD_GET(FBNIC_RCD_AL_BUFF_PAGE_MASK, rcd);
1285 fbnic_pkt_prepare(nv, rcd, pkt, qt);
1286
1287 break;
1288 case FBNIC_RCD_TYPE_PAY_AL:
1289 head1 = FIELD_GET(FBNIC_RCD_AL_BUFF_PAGE_MASK, rcd);
1290 fbnic_add_rx_frag(nv, rcd, pkt, qt);
1291
1292 break;
1293 case FBNIC_RCD_TYPE_OPT_META:
1294 /* Only type 0 is currently supported */
1295 if (FIELD_GET(FBNIC_RCD_OPT_META_TYPE_MASK, rcd))
1296 break;
1297
1298 fbnic_rx_tstamp(nv, rcd, pkt);
1299
1300 /* We currently ignore the action table index */
1301 break;
1302 case FBNIC_RCD_TYPE_META:
1303 if (likely(!fbnic_rcd_metadata_err(rcd) &&
1304 !pkt->add_frag_failed)) {
1305 pkt_bytes = xdp_get_buff_len(&pkt->buff);
1306 skb = fbnic_run_xdp(nv, pkt);
1307 }
1308
1309 /* Populate skb and invalidate XDP */
1310 if (!IS_ERR_OR_NULL(skb)) {
1311 fbnic_populate_skb_fields(nv, rcd, skb, qt,
1312 &csum_complete,
1313 &csum_none);
1314 napi_gro_receive(&nv->napi, skb);
1315 } else if (skb == ERR_PTR(-FBNIC_XDP_TX)) {
1316 pkt_tail = nv->qt[0].sub1.tail;
1317 } else if (PTR_ERR(skb) == -FBNIC_XDP_CONSUME) {
1318 fbnic_put_pkt_buff(qt, pkt, 1);
1319 } else {
1320 if (!skb)
1321 alloc_failed++;
1322
1323 if (skb == ERR_PTR(-FBNIC_XDP_LEN_ERR))
1324 length_errors++;
1325 else
1326 dropped++;
1327
1328 fbnic_put_pkt_buff(qt, pkt, 1);
1329 goto next_dont_count;
1330 }
1331
1332 packets++;
1333 bytes += pkt_bytes;
1334 next_dont_count:
1335 pkt->buff.data_hard_start = NULL;
1336
1337 break;
1338 }
1339
1340 raw_rcd++;
1341 head++;
1342 if (!(head & rcq->size_mask)) {
1343 done ^= cpu_to_le64(FBNIC_RCD_DONE);
1344 raw_rcd = &rcq->desc[0];
1345 }
1346 }
1347
1348 u64_stats_update_begin(&rcq->stats.syncp);
1349 rcq->stats.packets += packets;
1350 rcq->stats.bytes += bytes;
1351 rcq->stats.dropped += dropped;
1352 rcq->stats.rx.alloc_failed += alloc_failed;
1353 rcq->stats.rx.csum_complete += csum_complete;
1354 rcq->stats.rx.csum_none += csum_none;
1355 rcq->stats.rx.length_errors += length_errors;
1356 u64_stats_update_end(&rcq->stats.syncp);
1357
1358 if (pkt_tail >= 0)
1359 fbnic_pkt_commit_tail(nv, pkt_tail);
1360
1361 /* Unmap and free processed buffers */
1362 if (head0 >= 0)
1363 fbnic_clean_bdq(&qt->sub0, head0, budget);
1364 fbnic_fill_bdq(&qt->sub0);
1365
1366 if (head1 >= 0)
1367 fbnic_clean_bdq(&qt->sub1, head1, budget);
1368 fbnic_fill_bdq(&qt->sub1);
1369
1370 /* Record the current head/tail of the queue */
1371 if (rcq->head != head) {
1372 rcq->head = head;
1373 writel(head & rcq->size_mask, rcq->doorbell);
1374 }
1375
1376 return packets;
1377 }
1378
fbnic_nv_irq_disable(struct fbnic_napi_vector * nv)1379 static void fbnic_nv_irq_disable(struct fbnic_napi_vector *nv)
1380 {
1381 struct fbnic_dev *fbd = nv->fbd;
1382 u32 v_idx = nv->v_idx;
1383
1384 fbnic_wr32(fbd, FBNIC_INTR_MASK_SET(v_idx / 32), 1 << (v_idx % 32));
1385 }
1386
fbnic_nv_irq_rearm(struct fbnic_napi_vector * nv)1387 static void fbnic_nv_irq_rearm(struct fbnic_napi_vector *nv)
1388 {
1389 struct fbnic_dev *fbd = nv->fbd;
1390 u32 v_idx = nv->v_idx;
1391
1392 fbnic_wr32(fbd, FBNIC_INTR_CQ_REARM(v_idx),
1393 FBNIC_INTR_CQ_REARM_INTR_UNMASK);
1394 }
1395
fbnic_poll(struct napi_struct * napi,int budget)1396 static int fbnic_poll(struct napi_struct *napi, int budget)
1397 {
1398 struct fbnic_napi_vector *nv = container_of(napi,
1399 struct fbnic_napi_vector,
1400 napi);
1401 int i, j, work_done = 0;
1402
1403 for (i = 0; i < nv->txt_count; i++)
1404 fbnic_clean_tcq(nv, &nv->qt[i], budget);
1405
1406 for (j = 0; j < nv->rxt_count; j++, i++)
1407 work_done += fbnic_clean_rcq(nv, &nv->qt[i], budget);
1408
1409 if (work_done >= budget)
1410 return budget;
1411
1412 if (likely(napi_complete_done(napi, work_done)))
1413 fbnic_nv_irq_rearm(nv);
1414
1415 return work_done;
1416 }
1417
fbnic_msix_clean_rings(int __always_unused irq,void * data)1418 irqreturn_t fbnic_msix_clean_rings(int __always_unused irq, void *data)
1419 {
1420 struct fbnic_napi_vector *nv = *(void **)data;
1421
1422 napi_schedule_irqoff(&nv->napi);
1423
1424 return IRQ_HANDLED;
1425 }
1426
fbnic_aggregate_ring_rx_counters(struct fbnic_net * fbn,struct fbnic_ring * rxr)1427 void fbnic_aggregate_ring_rx_counters(struct fbnic_net *fbn,
1428 struct fbnic_ring *rxr)
1429 {
1430 struct fbnic_queue_stats *stats = &rxr->stats;
1431
1432 /* Capture stats from queues before dissasociating them */
1433 fbn->rx_stats.bytes += stats->bytes;
1434 fbn->rx_stats.packets += stats->packets;
1435 fbn->rx_stats.dropped += stats->dropped;
1436 fbn->rx_stats.rx.alloc_failed += stats->rx.alloc_failed;
1437 fbn->rx_stats.rx.csum_complete += stats->rx.csum_complete;
1438 fbn->rx_stats.rx.csum_none += stats->rx.csum_none;
1439 fbn->rx_stats.rx.length_errors += stats->rx.length_errors;
1440 /* Remember to add new stats here */
1441 BUILD_BUG_ON(sizeof(fbn->rx_stats.rx) / 8 != 4);
1442 }
1443
fbnic_aggregate_ring_bdq_counters(struct fbnic_net * fbn,struct fbnic_ring * bdq)1444 void fbnic_aggregate_ring_bdq_counters(struct fbnic_net *fbn,
1445 struct fbnic_ring *bdq)
1446 {
1447 struct fbnic_queue_stats *stats = &bdq->stats;
1448
1449 /* Capture stats from queues before dissasociating them */
1450 fbn->bdq_stats.bdq.alloc_failed += stats->bdq.alloc_failed;
1451 /* Remember to add new stats here */
1452 BUILD_BUG_ON(sizeof(fbn->rx_stats.bdq) / 8 != 1);
1453 }
1454
fbnic_aggregate_ring_tx_counters(struct fbnic_net * fbn,struct fbnic_ring * txr)1455 void fbnic_aggregate_ring_tx_counters(struct fbnic_net *fbn,
1456 struct fbnic_ring *txr)
1457 {
1458 struct fbnic_queue_stats *stats = &txr->stats;
1459
1460 /* Capture stats from queues before dissasociating them */
1461 fbn->tx_stats.bytes += stats->bytes;
1462 fbn->tx_stats.packets += stats->packets;
1463 fbn->tx_stats.dropped += stats->dropped;
1464 fbn->tx_stats.twq.csum_partial += stats->twq.csum_partial;
1465 fbn->tx_stats.twq.lso += stats->twq.lso;
1466 fbn->tx_stats.twq.ts_lost += stats->twq.ts_lost;
1467 fbn->tx_stats.twq.ts_packets += stats->twq.ts_packets;
1468 fbn->tx_stats.twq.stop += stats->twq.stop;
1469 fbn->tx_stats.twq.wake += stats->twq.wake;
1470 /* Remember to add new stats here */
1471 BUILD_BUG_ON(sizeof(fbn->tx_stats.twq) / 8 != 6);
1472 }
1473
fbnic_aggregate_ring_xdp_counters(struct fbnic_net * fbn,struct fbnic_ring * xdpr)1474 void fbnic_aggregate_ring_xdp_counters(struct fbnic_net *fbn,
1475 struct fbnic_ring *xdpr)
1476 {
1477 struct fbnic_queue_stats *stats = &xdpr->stats;
1478
1479 if (!(xdpr->flags & FBNIC_RING_F_STATS))
1480 return;
1481
1482 /* Capture stats from queues before dissasociating them */
1483 fbn->tx_stats.dropped += stats->dropped;
1484 fbn->tx_stats.bytes += stats->bytes;
1485 fbn->tx_stats.packets += stats->packets;
1486 }
1487
fbnic_remove_tx_ring(struct fbnic_net * fbn,struct fbnic_ring * txr)1488 static void fbnic_remove_tx_ring(struct fbnic_net *fbn,
1489 struct fbnic_ring *txr)
1490 {
1491 if (!(txr->flags & FBNIC_RING_F_STATS))
1492 return;
1493
1494 fbnic_aggregate_ring_tx_counters(fbn, txr);
1495
1496 /* Remove pointer to the Tx ring */
1497 WARN_ON(fbn->tx[txr->q_idx] && fbn->tx[txr->q_idx] != txr);
1498 fbn->tx[txr->q_idx] = NULL;
1499 }
1500
fbnic_remove_xdp_ring(struct fbnic_net * fbn,struct fbnic_ring * xdpr)1501 static void fbnic_remove_xdp_ring(struct fbnic_net *fbn,
1502 struct fbnic_ring *xdpr)
1503 {
1504 if (!(xdpr->flags & FBNIC_RING_F_STATS))
1505 return;
1506
1507 fbnic_aggregate_ring_xdp_counters(fbn, xdpr);
1508
1509 /* Remove pointer to the Tx ring */
1510 WARN_ON(fbn->tx[xdpr->q_idx] && fbn->tx[xdpr->q_idx] != xdpr);
1511 fbn->tx[xdpr->q_idx] = NULL;
1512 }
1513
fbnic_remove_rx_ring(struct fbnic_net * fbn,struct fbnic_ring * rxr)1514 static void fbnic_remove_rx_ring(struct fbnic_net *fbn,
1515 struct fbnic_ring *rxr)
1516 {
1517 if (!(rxr->flags & FBNIC_RING_F_STATS))
1518 return;
1519
1520 fbnic_aggregate_ring_rx_counters(fbn, rxr);
1521
1522 /* Remove pointer to the Rx ring */
1523 WARN_ON(fbn->rx[rxr->q_idx] && fbn->rx[rxr->q_idx] != rxr);
1524 fbn->rx[rxr->q_idx] = NULL;
1525 }
1526
fbnic_remove_bdq_ring(struct fbnic_net * fbn,struct fbnic_ring * bdq)1527 static void fbnic_remove_bdq_ring(struct fbnic_net *fbn,
1528 struct fbnic_ring *bdq)
1529 {
1530 if (!(bdq->flags & FBNIC_RING_F_STATS))
1531 return;
1532
1533 fbnic_aggregate_ring_bdq_counters(fbn, bdq);
1534 }
1535
fbnic_free_qt_page_pools(struct fbnic_q_triad * qt)1536 static void fbnic_free_qt_page_pools(struct fbnic_q_triad *qt)
1537 {
1538 page_pool_destroy(qt->sub0.page_pool);
1539 page_pool_destroy(qt->sub1.page_pool);
1540 }
1541
fbnic_free_napi_vector(struct fbnic_net * fbn,struct fbnic_napi_vector * nv)1542 static void fbnic_free_napi_vector(struct fbnic_net *fbn,
1543 struct fbnic_napi_vector *nv)
1544 {
1545 struct fbnic_dev *fbd = nv->fbd;
1546 int i, j;
1547
1548 for (i = 0; i < nv->txt_count; i++) {
1549 fbnic_remove_tx_ring(fbn, &nv->qt[i].sub0);
1550 fbnic_remove_xdp_ring(fbn, &nv->qt[i].sub1);
1551 fbnic_remove_tx_ring(fbn, &nv->qt[i].cmpl);
1552 }
1553
1554 for (j = 0; j < nv->rxt_count; j++, i++) {
1555 fbnic_remove_bdq_ring(fbn, &nv->qt[i].sub0);
1556 fbnic_remove_bdq_ring(fbn, &nv->qt[i].sub1);
1557 fbnic_remove_rx_ring(fbn, &nv->qt[i].cmpl);
1558 }
1559
1560 fbnic_napi_free_irq(fbd, nv);
1561 netif_napi_del_locked(&nv->napi);
1562 fbn->napi[fbnic_napi_idx(nv)] = NULL;
1563 kfree(nv);
1564 }
1565
fbnic_free_napi_vectors(struct fbnic_net * fbn)1566 void fbnic_free_napi_vectors(struct fbnic_net *fbn)
1567 {
1568 int i;
1569
1570 for (i = 0; i < fbn->num_napi; i++)
1571 if (fbn->napi[i])
1572 fbnic_free_napi_vector(fbn, fbn->napi[i]);
1573 }
1574
1575 static int
fbnic_alloc_qt_page_pools(struct fbnic_net * fbn,struct fbnic_q_triad * qt,unsigned int rxq_idx)1576 fbnic_alloc_qt_page_pools(struct fbnic_net *fbn, struct fbnic_q_triad *qt,
1577 unsigned int rxq_idx)
1578 {
1579 struct page_pool_params pp_params = {
1580 .order = 0,
1581 .flags = PP_FLAG_DMA_MAP |
1582 PP_FLAG_DMA_SYNC_DEV,
1583 .pool_size = fbn->hpq_size + fbn->ppq_size,
1584 .nid = NUMA_NO_NODE,
1585 .dev = fbn->netdev->dev.parent,
1586 .dma_dir = DMA_BIDIRECTIONAL,
1587 .offset = 0,
1588 .max_len = PAGE_SIZE,
1589 .netdev = fbn->netdev,
1590 .queue_idx = rxq_idx,
1591 };
1592 struct page_pool *pp;
1593
1594 /* Page pool cannot exceed a size of 32768. This doesn't limit the
1595 * pages on the ring but the number we can have cached waiting on
1596 * the next use.
1597 *
1598 * TBD: Can this be reduced further? Would a multiple of
1599 * NAPI_POLL_WEIGHT possibly make more sense? The question is how
1600 * may pages do we need to hold in reserve to get the best return
1601 * without hogging too much system memory.
1602 */
1603 if (pp_params.pool_size > 32768)
1604 pp_params.pool_size = 32768;
1605
1606 pp = page_pool_create(&pp_params);
1607 if (IS_ERR(pp))
1608 return PTR_ERR(pp);
1609
1610 qt->sub0.page_pool = pp;
1611 if (netif_rxq_has_unreadable_mp(fbn->netdev, rxq_idx)) {
1612 pp_params.flags |= PP_FLAG_ALLOW_UNREADABLE_NETMEM;
1613 pp_params.dma_dir = DMA_FROM_DEVICE;
1614
1615 pp = page_pool_create(&pp_params);
1616 if (IS_ERR(pp))
1617 goto err_destroy_sub0;
1618 } else {
1619 page_pool_get(pp);
1620 }
1621 qt->sub1.page_pool = pp;
1622
1623 return 0;
1624
1625 err_destroy_sub0:
1626 page_pool_destroy(qt->sub0.page_pool);
1627 return PTR_ERR(pp);
1628 }
1629
fbnic_ring_init(struct fbnic_ring * ring,u32 __iomem * doorbell,int q_idx,u8 flags)1630 static void fbnic_ring_init(struct fbnic_ring *ring, u32 __iomem *doorbell,
1631 int q_idx, u8 flags)
1632 {
1633 u64_stats_init(&ring->stats.syncp);
1634 ring->doorbell = doorbell;
1635 ring->q_idx = q_idx;
1636 ring->flags = flags;
1637 ring->deferred_head = -1;
1638 }
1639
fbnic_alloc_napi_vector(struct fbnic_dev * fbd,struct fbnic_net * fbn,unsigned int v_count,unsigned int v_idx,unsigned int txq_count,unsigned int txq_idx,unsigned int rxq_count,unsigned int rxq_idx)1640 static int fbnic_alloc_napi_vector(struct fbnic_dev *fbd, struct fbnic_net *fbn,
1641 unsigned int v_count, unsigned int v_idx,
1642 unsigned int txq_count, unsigned int txq_idx,
1643 unsigned int rxq_count, unsigned int rxq_idx)
1644 {
1645 int txt_count = txq_count, rxt_count = rxq_count;
1646 u32 __iomem *uc_addr = fbd->uc_addr0;
1647 int xdp_count = 0, qt_count, err;
1648 struct fbnic_napi_vector *nv;
1649 struct fbnic_q_triad *qt;
1650 u32 __iomem *db;
1651
1652 /* We need to reserve at least one Tx Queue Triad for an XDP ring */
1653 if (rxq_count) {
1654 xdp_count = 1;
1655 if (!txt_count)
1656 txt_count = 1;
1657 }
1658
1659 qt_count = txt_count + rxq_count;
1660 if (!qt_count)
1661 return -EINVAL;
1662
1663 /* If MMIO has already failed there are no rings to initialize */
1664 if (!uc_addr)
1665 return -EIO;
1666
1667 /* Allocate NAPI vector and queue triads */
1668 nv = kzalloc_flex(*nv, qt, qt_count);
1669 if (!nv)
1670 return -ENOMEM;
1671
1672 /* Record queue triad counts */
1673 nv->txt_count = txt_count;
1674 nv->rxt_count = rxt_count;
1675
1676 /* Provide pointer back to fbnic and MSI-X vectors */
1677 nv->fbd = fbd;
1678 nv->v_idx = v_idx;
1679
1680 /* Tie napi to netdev */
1681 fbn->napi[fbnic_napi_idx(nv)] = nv;
1682 netif_napi_add_config_locked(fbn->netdev, &nv->napi, fbnic_poll,
1683 fbnic_napi_idx(nv));
1684
1685 /* Record IRQ to NAPI struct */
1686 netif_napi_set_irq_locked(&nv->napi,
1687 pci_irq_vector(to_pci_dev(fbd->dev),
1688 nv->v_idx));
1689
1690 /* Tie nv back to PCIe dev */
1691 nv->dev = fbd->dev;
1692
1693 /* Request the IRQ for napi vector */
1694 err = fbnic_napi_request_irq(fbd, nv);
1695 if (err)
1696 goto napi_del;
1697
1698 /* Initialize queue triads */
1699 qt = nv->qt;
1700
1701 while (txt_count) {
1702 u8 flags = FBNIC_RING_F_CTX | FBNIC_RING_F_STATS;
1703
1704 /* Configure Tx queue */
1705 db = &uc_addr[FBNIC_QUEUE(txq_idx) + FBNIC_QUEUE_TWQ0_TAIL];
1706
1707 /* Assign Tx queue to netdev if applicable */
1708 if (txq_count > 0) {
1709
1710 fbnic_ring_init(&qt->sub0, db, txq_idx, flags);
1711 fbn->tx[txq_idx] = &qt->sub0;
1712 txq_count--;
1713 } else {
1714 fbnic_ring_init(&qt->sub0, db, 0,
1715 FBNIC_RING_F_DISABLED);
1716 }
1717
1718 /* Configure XDP queue */
1719 db = &uc_addr[FBNIC_QUEUE(txq_idx) + FBNIC_QUEUE_TWQ1_TAIL];
1720
1721 /* Assign XDP queue to netdev if applicable
1722 *
1723 * The setup for this is in itself a bit different.
1724 * 1. We only need one XDP Tx queue per NAPI vector.
1725 * 2. We associate it to the first Rx queue index.
1726 * 3. The hardware side is associated based on the Tx Queue.
1727 * 4. The netdev queue is offset by FBNIC_MAX_TXQs.
1728 */
1729 if (xdp_count > 0) {
1730 unsigned int xdp_idx = FBNIC_MAX_TXQS + rxq_idx;
1731
1732 fbnic_ring_init(&qt->sub1, db, xdp_idx, flags);
1733 fbn->tx[xdp_idx] = &qt->sub1;
1734 xdp_count--;
1735 } else {
1736 fbnic_ring_init(&qt->sub1, db, 0,
1737 FBNIC_RING_F_DISABLED);
1738 }
1739
1740 /* Configure Tx completion queue */
1741 db = &uc_addr[FBNIC_QUEUE(txq_idx) + FBNIC_QUEUE_TCQ_HEAD];
1742 fbnic_ring_init(&qt->cmpl, db, 0, 0);
1743
1744 /* Update Tx queue index */
1745 txt_count--;
1746 txq_idx += v_count;
1747
1748 /* Move to next queue triad */
1749 qt++;
1750 }
1751
1752 while (rxt_count) {
1753 /* Configure header queue */
1754 db = &uc_addr[FBNIC_QUEUE(rxq_idx) + FBNIC_QUEUE_BDQ_HPQ_TAIL];
1755 fbnic_ring_init(&qt->sub0, db, 0,
1756 FBNIC_RING_F_CTX | FBNIC_RING_F_STATS);
1757
1758 /* Configure payload queue */
1759 db = &uc_addr[FBNIC_QUEUE(rxq_idx) + FBNIC_QUEUE_BDQ_PPQ_TAIL];
1760 fbnic_ring_init(&qt->sub1, db, 0,
1761 FBNIC_RING_F_CTX | FBNIC_RING_F_STATS);
1762
1763 /* Configure Rx completion queue */
1764 db = &uc_addr[FBNIC_QUEUE(rxq_idx) + FBNIC_QUEUE_RCQ_HEAD];
1765 fbnic_ring_init(&qt->cmpl, db, rxq_idx, FBNIC_RING_F_STATS);
1766 fbn->rx[rxq_idx] = &qt->cmpl;
1767
1768 /* Update Rx queue index */
1769 rxt_count--;
1770 rxq_idx += v_count;
1771
1772 /* Move to next queue triad */
1773 qt++;
1774 }
1775
1776 return 0;
1777
1778 napi_del:
1779 netif_napi_del_locked(&nv->napi);
1780 fbn->napi[fbnic_napi_idx(nv)] = NULL;
1781 kfree(nv);
1782 return err;
1783 }
1784
fbnic_alloc_napi_vectors(struct fbnic_net * fbn)1785 int fbnic_alloc_napi_vectors(struct fbnic_net *fbn)
1786 {
1787 unsigned int txq_idx = 0, rxq_idx = 0, v_idx = FBNIC_NON_NAPI_VECTORS;
1788 unsigned int num_tx = fbn->num_tx_queues;
1789 unsigned int num_rx = fbn->num_rx_queues;
1790 unsigned int num_napi = fbn->num_napi;
1791 struct fbnic_dev *fbd = fbn->fbd;
1792 int err;
1793
1794 /* Allocate 1 Tx queue per napi vector */
1795 if (num_napi <= FBNIC_MAX_TXQS && num_napi == num_tx + num_rx) {
1796 while (num_tx) {
1797 err = fbnic_alloc_napi_vector(fbd, fbn,
1798 num_napi, v_idx,
1799 1, txq_idx, 0, 0);
1800 if (err)
1801 goto free_vectors;
1802
1803 /* Update counts and index */
1804 num_tx--;
1805 txq_idx++;
1806
1807 v_idx++;
1808 }
1809 }
1810
1811 /* Allocate Tx/Rx queue pairs per vector, or allocate remaining Rx */
1812 while (num_rx | num_tx) {
1813 int tqpv = DIV_ROUND_UP(num_tx, num_napi - txq_idx);
1814 int rqpv = DIV_ROUND_UP(num_rx, num_napi - rxq_idx);
1815
1816 err = fbnic_alloc_napi_vector(fbd, fbn, num_napi, v_idx,
1817 tqpv, txq_idx, rqpv, rxq_idx);
1818 if (err)
1819 goto free_vectors;
1820
1821 /* Update counts and index */
1822 num_tx -= tqpv;
1823 txq_idx++;
1824
1825 num_rx -= rqpv;
1826 rxq_idx++;
1827
1828 v_idx++;
1829 }
1830
1831 return 0;
1832
1833 free_vectors:
1834 fbnic_free_napi_vectors(fbn);
1835
1836 return err;
1837 }
1838
fbnic_free_ring_resources(struct device * dev,struct fbnic_ring * ring)1839 static void fbnic_free_ring_resources(struct device *dev,
1840 struct fbnic_ring *ring)
1841 {
1842 kvfree(ring->buffer);
1843 ring->buffer = NULL;
1844
1845 /* If size is not set there are no descriptors present */
1846 if (!ring->size)
1847 return;
1848
1849 dma_free_coherent(dev, ring->size, ring->desc, ring->dma);
1850 ring->size_mask = 0;
1851 ring->size = 0;
1852 }
1853
fbnic_alloc_tx_ring_desc(struct fbnic_net * fbn,struct fbnic_ring * txr)1854 static int fbnic_alloc_tx_ring_desc(struct fbnic_net *fbn,
1855 struct fbnic_ring *txr)
1856 {
1857 struct device *dev = fbn->netdev->dev.parent;
1858 size_t size;
1859
1860 /* Round size up to nearest 4K */
1861 size = ALIGN(array_size(sizeof(*txr->desc), fbn->txq_size), 4096);
1862
1863 txr->desc = dma_alloc_coherent(dev, size, &txr->dma,
1864 GFP_KERNEL | __GFP_NOWARN);
1865 if (!txr->desc)
1866 return -ENOMEM;
1867
1868 /* txq_size should be a power of 2, so mask is just that -1 */
1869 txr->size_mask = fbn->txq_size - 1;
1870 txr->size = size;
1871
1872 return 0;
1873 }
1874
fbnic_alloc_tx_ring_buffer(struct fbnic_ring * txr)1875 static int fbnic_alloc_tx_ring_buffer(struct fbnic_ring *txr)
1876 {
1877 size_t size = array_size(sizeof(*txr->tx_buf), txr->size_mask + 1);
1878
1879 txr->tx_buf = kvzalloc(size, GFP_KERNEL | __GFP_NOWARN);
1880
1881 return txr->tx_buf ? 0 : -ENOMEM;
1882 }
1883
fbnic_alloc_tx_ring_resources(struct fbnic_net * fbn,struct fbnic_ring * txr)1884 static int fbnic_alloc_tx_ring_resources(struct fbnic_net *fbn,
1885 struct fbnic_ring *txr)
1886 {
1887 struct device *dev = fbn->netdev->dev.parent;
1888 int err;
1889
1890 if (txr->flags & FBNIC_RING_F_DISABLED)
1891 return 0;
1892
1893 err = fbnic_alloc_tx_ring_desc(fbn, txr);
1894 if (err)
1895 return err;
1896
1897 if (!(txr->flags & FBNIC_RING_F_CTX))
1898 return 0;
1899
1900 err = fbnic_alloc_tx_ring_buffer(txr);
1901 if (err)
1902 goto free_desc;
1903
1904 return 0;
1905
1906 free_desc:
1907 fbnic_free_ring_resources(dev, txr);
1908 return err;
1909 }
1910
fbnic_alloc_rx_ring_desc(struct fbnic_net * fbn,struct fbnic_ring * rxr)1911 static int fbnic_alloc_rx_ring_desc(struct fbnic_net *fbn,
1912 struct fbnic_ring *rxr)
1913 {
1914 struct device *dev = fbn->netdev->dev.parent;
1915 size_t desc_size = sizeof(*rxr->desc);
1916 u32 rxq_size;
1917 size_t size;
1918
1919 switch (rxr->doorbell - fbnic_ring_csr_base(rxr)) {
1920 case FBNIC_QUEUE_BDQ_HPQ_TAIL:
1921 rxq_size = fbn->hpq_size / FBNIC_BD_FRAG_COUNT;
1922 desc_size *= FBNIC_BD_FRAG_COUNT;
1923 break;
1924 case FBNIC_QUEUE_BDQ_PPQ_TAIL:
1925 rxq_size = fbn->ppq_size / FBNIC_BD_FRAG_COUNT;
1926 desc_size *= FBNIC_BD_FRAG_COUNT;
1927 break;
1928 case FBNIC_QUEUE_RCQ_HEAD:
1929 rxq_size = fbn->rcq_size;
1930 break;
1931 default:
1932 return -EINVAL;
1933 }
1934
1935 /* Round size up to nearest 4K */
1936 size = ALIGN(array_size(desc_size, rxq_size), 4096);
1937
1938 rxr->desc = dma_alloc_coherent(dev, size, &rxr->dma,
1939 GFP_KERNEL | __GFP_NOWARN);
1940 if (!rxr->desc)
1941 return -ENOMEM;
1942
1943 /* rxq_size should be a power of 2, so mask is just that -1 */
1944 rxr->size_mask = rxq_size - 1;
1945 rxr->size = size;
1946
1947 return 0;
1948 }
1949
fbnic_alloc_rx_ring_buffer(struct fbnic_ring * rxr)1950 static int fbnic_alloc_rx_ring_buffer(struct fbnic_ring *rxr)
1951 {
1952 size_t size = array_size(sizeof(*rxr->rx_buf), rxr->size_mask + 1);
1953
1954 if (rxr->flags & FBNIC_RING_F_CTX)
1955 size = sizeof(*rxr->rx_buf) * (rxr->size_mask + 1);
1956 else
1957 size = sizeof(*rxr->pkt);
1958
1959 rxr->rx_buf = kvzalloc(size, GFP_KERNEL | __GFP_NOWARN);
1960
1961 return rxr->rx_buf ? 0 : -ENOMEM;
1962 }
1963
fbnic_alloc_rx_ring_resources(struct fbnic_net * fbn,struct fbnic_ring * rxr)1964 static int fbnic_alloc_rx_ring_resources(struct fbnic_net *fbn,
1965 struct fbnic_ring *rxr)
1966 {
1967 struct device *dev = fbn->netdev->dev.parent;
1968 int err;
1969
1970 err = fbnic_alloc_rx_ring_desc(fbn, rxr);
1971 if (err)
1972 return err;
1973
1974 err = fbnic_alloc_rx_ring_buffer(rxr);
1975 if (err)
1976 goto free_desc;
1977
1978 return 0;
1979
1980 free_desc:
1981 fbnic_free_ring_resources(dev, rxr);
1982 return err;
1983 }
1984
fbnic_free_qt_resources(struct fbnic_net * fbn,struct fbnic_q_triad * qt)1985 static void fbnic_free_qt_resources(struct fbnic_net *fbn,
1986 struct fbnic_q_triad *qt)
1987 {
1988 struct device *dev = fbn->netdev->dev.parent;
1989
1990 fbnic_free_ring_resources(dev, &qt->cmpl);
1991 fbnic_free_ring_resources(dev, &qt->sub1);
1992 fbnic_free_ring_resources(dev, &qt->sub0);
1993
1994 if (xdp_rxq_info_is_reg(&qt->xdp_rxq)) {
1995 xdp_rxq_info_unreg_mem_model(&qt->xdp_rxq);
1996 xdp_rxq_info_unreg(&qt->xdp_rxq);
1997 fbnic_free_qt_page_pools(qt);
1998 }
1999 }
2000
fbnic_alloc_tx_qt_resources(struct fbnic_net * fbn,struct fbnic_q_triad * qt)2001 static int fbnic_alloc_tx_qt_resources(struct fbnic_net *fbn,
2002 struct fbnic_q_triad *qt)
2003 {
2004 struct device *dev = fbn->netdev->dev.parent;
2005 int err;
2006
2007 err = fbnic_alloc_tx_ring_resources(fbn, &qt->sub0);
2008 if (err)
2009 return err;
2010
2011 err = fbnic_alloc_tx_ring_resources(fbn, &qt->sub1);
2012 if (err)
2013 goto free_sub0;
2014
2015 err = fbnic_alloc_tx_ring_resources(fbn, &qt->cmpl);
2016 if (err)
2017 goto free_sub1;
2018
2019 return 0;
2020
2021 free_sub1:
2022 fbnic_free_ring_resources(dev, &qt->sub1);
2023 free_sub0:
2024 fbnic_free_ring_resources(dev, &qt->sub0);
2025 return err;
2026 }
2027
fbnic_alloc_rx_qt_resources(struct fbnic_net * fbn,struct fbnic_napi_vector * nv,struct fbnic_q_triad * qt)2028 static int fbnic_alloc_rx_qt_resources(struct fbnic_net *fbn,
2029 struct fbnic_napi_vector *nv,
2030 struct fbnic_q_triad *qt)
2031 {
2032 struct device *dev = fbn->netdev->dev.parent;
2033 int err;
2034
2035 err = fbnic_alloc_qt_page_pools(fbn, qt, qt->cmpl.q_idx);
2036 if (err)
2037 return err;
2038
2039 err = xdp_rxq_info_reg(&qt->xdp_rxq, fbn->netdev, qt->sub0.q_idx,
2040 nv->napi.napi_id);
2041 if (err)
2042 goto free_page_pools;
2043
2044 err = xdp_rxq_info_reg_mem_model(&qt->xdp_rxq, MEM_TYPE_PAGE_POOL,
2045 qt->sub0.page_pool);
2046 if (err)
2047 goto unreg_rxq;
2048
2049 err = fbnic_alloc_rx_ring_resources(fbn, &qt->sub0);
2050 if (err)
2051 goto unreg_mm;
2052
2053 err = fbnic_alloc_rx_ring_resources(fbn, &qt->sub1);
2054 if (err)
2055 goto free_sub0;
2056
2057 err = fbnic_alloc_rx_ring_resources(fbn, &qt->cmpl);
2058 if (err)
2059 goto free_sub1;
2060
2061 return 0;
2062
2063 free_sub1:
2064 fbnic_free_ring_resources(dev, &qt->sub1);
2065 free_sub0:
2066 fbnic_free_ring_resources(dev, &qt->sub0);
2067 unreg_mm:
2068 xdp_rxq_info_unreg_mem_model(&qt->xdp_rxq);
2069 unreg_rxq:
2070 xdp_rxq_info_unreg(&qt->xdp_rxq);
2071 free_page_pools:
2072 fbnic_free_qt_page_pools(qt);
2073 return err;
2074 }
2075
fbnic_free_nv_resources(struct fbnic_net * fbn,struct fbnic_napi_vector * nv)2076 static void fbnic_free_nv_resources(struct fbnic_net *fbn,
2077 struct fbnic_napi_vector *nv)
2078 {
2079 int i;
2080
2081 for (i = 0; i < nv->txt_count + nv->rxt_count; i++)
2082 fbnic_free_qt_resources(fbn, &nv->qt[i]);
2083 }
2084
fbnic_alloc_nv_resources(struct fbnic_net * fbn,struct fbnic_napi_vector * nv)2085 static int fbnic_alloc_nv_resources(struct fbnic_net *fbn,
2086 struct fbnic_napi_vector *nv)
2087 {
2088 int i, j, err;
2089
2090 /* Allocate Tx Resources */
2091 for (i = 0; i < nv->txt_count; i++) {
2092 err = fbnic_alloc_tx_qt_resources(fbn, &nv->qt[i]);
2093 if (err)
2094 goto free_qt_resources;
2095 }
2096
2097 /* Allocate Rx Resources */
2098 for (j = 0; j < nv->rxt_count; j++, i++) {
2099 err = fbnic_alloc_rx_qt_resources(fbn, nv, &nv->qt[i]);
2100 if (err)
2101 goto free_qt_resources;
2102 }
2103
2104 return 0;
2105
2106 free_qt_resources:
2107 while (i--)
2108 fbnic_free_qt_resources(fbn, &nv->qt[i]);
2109 return err;
2110 }
2111
fbnic_free_resources(struct fbnic_net * fbn)2112 void fbnic_free_resources(struct fbnic_net *fbn)
2113 {
2114 int i;
2115
2116 for (i = 0; i < fbn->num_napi; i++)
2117 fbnic_free_nv_resources(fbn, fbn->napi[i]);
2118 }
2119
fbnic_alloc_resources(struct fbnic_net * fbn)2120 int fbnic_alloc_resources(struct fbnic_net *fbn)
2121 {
2122 int i, err = -ENODEV;
2123
2124 for (i = 0; i < fbn->num_napi; i++) {
2125 err = fbnic_alloc_nv_resources(fbn, fbn->napi[i]);
2126 if (err)
2127 goto free_resources;
2128 }
2129
2130 return 0;
2131
2132 free_resources:
2133 while (i--)
2134 fbnic_free_nv_resources(fbn, fbn->napi[i]);
2135
2136 return err;
2137 }
2138
fbnic_set_netif_napi(struct fbnic_napi_vector * nv)2139 static void fbnic_set_netif_napi(struct fbnic_napi_vector *nv)
2140 {
2141 int i, j;
2142
2143 /* Associate Tx queue with NAPI */
2144 for (i = 0; i < nv->txt_count; i++) {
2145 struct fbnic_q_triad *qt = &nv->qt[i];
2146
2147 netif_queue_set_napi(nv->napi.dev, qt->sub0.q_idx,
2148 NETDEV_QUEUE_TYPE_TX, &nv->napi);
2149 }
2150
2151 /* Associate Rx queue with NAPI */
2152 for (j = 0; j < nv->rxt_count; j++, i++) {
2153 struct fbnic_q_triad *qt = &nv->qt[i];
2154
2155 netif_queue_set_napi(nv->napi.dev, qt->cmpl.q_idx,
2156 NETDEV_QUEUE_TYPE_RX, &nv->napi);
2157 }
2158 }
2159
fbnic_reset_netif_napi(struct fbnic_napi_vector * nv)2160 static void fbnic_reset_netif_napi(struct fbnic_napi_vector *nv)
2161 {
2162 int i, j;
2163
2164 /* Disassociate Tx queue from NAPI */
2165 for (i = 0; i < nv->txt_count; i++) {
2166 struct fbnic_q_triad *qt = &nv->qt[i];
2167
2168 netif_queue_set_napi(nv->napi.dev, qt->sub0.q_idx,
2169 NETDEV_QUEUE_TYPE_TX, NULL);
2170 }
2171
2172 /* Disassociate Rx queue from NAPI */
2173 for (j = 0; j < nv->rxt_count; j++, i++) {
2174 struct fbnic_q_triad *qt = &nv->qt[i];
2175
2176 netif_queue_set_napi(nv->napi.dev, qt->cmpl.q_idx,
2177 NETDEV_QUEUE_TYPE_RX, NULL);
2178 }
2179 }
2180
fbnic_set_netif_queues(struct fbnic_net * fbn)2181 int fbnic_set_netif_queues(struct fbnic_net *fbn)
2182 {
2183 int i, err;
2184
2185 err = netif_set_real_num_queues(fbn->netdev, fbn->num_tx_queues,
2186 fbn->num_rx_queues);
2187 if (err)
2188 return err;
2189
2190 for (i = 0; i < fbn->num_napi; i++)
2191 fbnic_set_netif_napi(fbn->napi[i]);
2192
2193 return 0;
2194 }
2195
fbnic_reset_netif_queues(struct fbnic_net * fbn)2196 void fbnic_reset_netif_queues(struct fbnic_net *fbn)
2197 {
2198 int i;
2199
2200 for (i = 0; i < fbn->num_napi; i++)
2201 fbnic_reset_netif_napi(fbn->napi[i]);
2202 }
2203
fbnic_disable_twq0(struct fbnic_ring * txr)2204 static void fbnic_disable_twq0(struct fbnic_ring *txr)
2205 {
2206 u32 twq_ctl = fbnic_ring_rd32(txr, FBNIC_QUEUE_TWQ0_CTL);
2207
2208 twq_ctl &= ~FBNIC_QUEUE_TWQ_CTL_ENABLE;
2209
2210 fbnic_ring_wr32(txr, FBNIC_QUEUE_TWQ0_CTL, twq_ctl);
2211 }
2212
fbnic_disable_twq1(struct fbnic_ring * txr)2213 static void fbnic_disable_twq1(struct fbnic_ring *txr)
2214 {
2215 u32 twq_ctl = fbnic_ring_rd32(txr, FBNIC_QUEUE_TWQ1_CTL);
2216
2217 twq_ctl &= ~FBNIC_QUEUE_TWQ_CTL_ENABLE;
2218
2219 fbnic_ring_wr32(txr, FBNIC_QUEUE_TWQ1_CTL, twq_ctl);
2220 }
2221
fbnic_disable_tcq(struct fbnic_ring * txr)2222 static void fbnic_disable_tcq(struct fbnic_ring *txr)
2223 {
2224 fbnic_ring_wr32(txr, FBNIC_QUEUE_TCQ_CTL, 0);
2225 fbnic_ring_wr32(txr, FBNIC_QUEUE_TIM_MASK, FBNIC_QUEUE_TIM_MASK_MASK);
2226 }
2227
fbnic_disable_bdq(struct fbnic_ring * hpq,struct fbnic_ring * ppq)2228 static void fbnic_disable_bdq(struct fbnic_ring *hpq, struct fbnic_ring *ppq)
2229 {
2230 u32 bdq_ctl = fbnic_ring_rd32(hpq, FBNIC_QUEUE_BDQ_CTL);
2231
2232 bdq_ctl &= ~FBNIC_QUEUE_BDQ_CTL_ENABLE;
2233
2234 fbnic_ring_wr32(hpq, FBNIC_QUEUE_BDQ_CTL, bdq_ctl);
2235 }
2236
fbnic_disable_rcq(struct fbnic_ring * rxr)2237 static void fbnic_disable_rcq(struct fbnic_ring *rxr)
2238 {
2239 fbnic_ring_wr32(rxr, FBNIC_QUEUE_RCQ_CTL, 0);
2240 fbnic_ring_wr32(rxr, FBNIC_QUEUE_RIM_MASK, FBNIC_QUEUE_RIM_MASK_MASK);
2241 }
2242
fbnic_napi_disable(struct fbnic_net * fbn)2243 void fbnic_napi_disable(struct fbnic_net *fbn)
2244 {
2245 int i;
2246
2247 for (i = 0; i < fbn->num_napi; i++) {
2248 napi_disable_locked(&fbn->napi[i]->napi);
2249
2250 fbnic_nv_irq_disable(fbn->napi[i]);
2251 }
2252 }
2253
__fbnic_nv_disable(struct fbnic_napi_vector * nv)2254 static void __fbnic_nv_disable(struct fbnic_napi_vector *nv)
2255 {
2256 int i, t;
2257
2258 /* Disable Tx queue triads */
2259 for (t = 0; t < nv->txt_count; t++) {
2260 struct fbnic_q_triad *qt = &nv->qt[t];
2261
2262 fbnic_disable_twq0(&qt->sub0);
2263 fbnic_disable_twq1(&qt->sub1);
2264 fbnic_disable_tcq(&qt->cmpl);
2265 }
2266
2267 /* Disable Rx queue triads */
2268 for (i = 0; i < nv->rxt_count; i++, t++) {
2269 struct fbnic_q_triad *qt = &nv->qt[t];
2270
2271 fbnic_disable_bdq(&qt->sub0, &qt->sub1);
2272 fbnic_disable_rcq(&qt->cmpl);
2273 }
2274 }
2275
2276 static void
fbnic_nv_disable(struct fbnic_net * fbn,struct fbnic_napi_vector * nv)2277 fbnic_nv_disable(struct fbnic_net *fbn, struct fbnic_napi_vector *nv)
2278 {
2279 __fbnic_nv_disable(nv);
2280 fbnic_wrfl(fbn->fbd);
2281 }
2282
fbnic_dbg_down(struct fbnic_net * fbn)2283 void fbnic_dbg_down(struct fbnic_net *fbn)
2284 {
2285 int i;
2286
2287 for (i = 0; i < fbn->num_napi; i++)
2288 fbnic_dbg_nv_exit(fbn->napi[i]);
2289 }
2290
fbnic_dbg_up(struct fbnic_net * fbn)2291 void fbnic_dbg_up(struct fbnic_net *fbn)
2292 {
2293 int i;
2294
2295 for (i = 0; i < fbn->num_napi; i++)
2296 fbnic_dbg_nv_init(fbn->napi[i]);
2297 }
2298
fbnic_disable(struct fbnic_net * fbn)2299 void fbnic_disable(struct fbnic_net *fbn)
2300 {
2301 struct fbnic_dev *fbd = fbn->fbd;
2302 int i;
2303
2304 for (i = 0; i < fbn->num_napi; i++)
2305 __fbnic_nv_disable(fbn->napi[i]);
2306
2307 fbnic_wrfl(fbd);
2308 }
2309
fbnic_tx_flush(struct fbnic_dev * fbd)2310 static void fbnic_tx_flush(struct fbnic_dev *fbd)
2311 {
2312 netdev_warn(fbd->netdev, "triggering Tx flush\n");
2313
2314 fbnic_rmw32(fbd, FBNIC_TMI_DROP_CTRL, FBNIC_TMI_DROP_CTRL_EN,
2315 FBNIC_TMI_DROP_CTRL_EN);
2316 }
2317
fbnic_tx_flush_off(struct fbnic_dev * fbd)2318 static void fbnic_tx_flush_off(struct fbnic_dev *fbd)
2319 {
2320 fbnic_rmw32(fbd, FBNIC_TMI_DROP_CTRL, FBNIC_TMI_DROP_CTRL_EN, 0);
2321 }
2322
2323 struct fbnic_idle_regs {
2324 u32 reg_base;
2325 u8 reg_cnt;
2326 };
2327
fbnic_all_idle(struct fbnic_dev * fbd,const struct fbnic_idle_regs * regs,unsigned int nregs)2328 static bool fbnic_all_idle(struct fbnic_dev *fbd,
2329 const struct fbnic_idle_regs *regs,
2330 unsigned int nregs)
2331 {
2332 unsigned int i, j;
2333
2334 for (i = 0; i < nregs; i++) {
2335 for (j = 0; j < regs[i].reg_cnt; j++) {
2336 if (fbnic_rd32(fbd, regs[i].reg_base + j) != ~0U)
2337 return false;
2338 }
2339 }
2340 return true;
2341 }
2342
fbnic_idle_dump(struct fbnic_dev * fbd,const struct fbnic_idle_regs * regs,unsigned int nregs,const char * dir,int err)2343 static void fbnic_idle_dump(struct fbnic_dev *fbd,
2344 const struct fbnic_idle_regs *regs,
2345 unsigned int nregs, const char *dir, int err)
2346 {
2347 unsigned int i, j;
2348
2349 netdev_err(fbd->netdev, "error waiting for %s idle %d\n", dir, err);
2350 for (i = 0; i < nregs; i++)
2351 for (j = 0; j < regs[i].reg_cnt; j++)
2352 netdev_err(fbd->netdev, "0x%04x: %08x\n",
2353 regs[i].reg_base + j,
2354 fbnic_rd32(fbd, regs[i].reg_base + j));
2355 }
2356
fbnic_wait_all_queues_idle(struct fbnic_dev * fbd,bool may_fail)2357 int fbnic_wait_all_queues_idle(struct fbnic_dev *fbd, bool may_fail)
2358 {
2359 static const struct fbnic_idle_regs tx[] = {
2360 { FBNIC_QM_TWQ_IDLE(0), FBNIC_QM_TWQ_IDLE_CNT, },
2361 { FBNIC_QM_TQS_IDLE(0), FBNIC_QM_TQS_IDLE_CNT, },
2362 { FBNIC_QM_TDE_IDLE(0), FBNIC_QM_TDE_IDLE_CNT, },
2363 { FBNIC_QM_TCQ_IDLE(0), FBNIC_QM_TCQ_IDLE_CNT, },
2364 }, rx[] = {
2365 { FBNIC_QM_HPQ_IDLE(0), FBNIC_QM_HPQ_IDLE_CNT, },
2366 { FBNIC_QM_PPQ_IDLE(0), FBNIC_QM_PPQ_IDLE_CNT, },
2367 { FBNIC_QM_RCQ_IDLE(0), FBNIC_QM_RCQ_IDLE_CNT, },
2368 };
2369 bool idle;
2370 int err;
2371
2372 err = read_poll_timeout_atomic(fbnic_all_idle, idle, idle, 2, 500000,
2373 false, fbd, tx, ARRAY_SIZE(tx));
2374 if (err == -ETIMEDOUT) {
2375 fbnic_tx_flush(fbd);
2376 err = read_poll_timeout_atomic(fbnic_all_idle, idle, idle,
2377 2, 500000, false,
2378 fbd, tx, ARRAY_SIZE(tx));
2379 fbnic_tx_flush_off(fbd);
2380 }
2381 if (err) {
2382 fbnic_idle_dump(fbd, tx, ARRAY_SIZE(tx), "Tx", err);
2383 if (may_fail)
2384 return err;
2385 }
2386
2387 err = read_poll_timeout_atomic(fbnic_all_idle, idle, idle, 2, 500000,
2388 false, fbd, rx, ARRAY_SIZE(rx));
2389 if (err)
2390 fbnic_idle_dump(fbd, rx, ARRAY_SIZE(rx), "Rx", err);
2391 return err;
2392 }
2393
2394 static int
fbnic_wait_queue_idle(struct fbnic_net * fbn,bool rx,unsigned int idx)2395 fbnic_wait_queue_idle(struct fbnic_net *fbn, bool rx, unsigned int idx)
2396 {
2397 static const unsigned int tx_regs[] = {
2398 FBNIC_QM_TWQ_IDLE(0), FBNIC_QM_TQS_IDLE(0),
2399 FBNIC_QM_TDE_IDLE(0), FBNIC_QM_TCQ_IDLE(0),
2400 }, rx_regs[] = {
2401 FBNIC_QM_HPQ_IDLE(0), FBNIC_QM_PPQ_IDLE(0),
2402 FBNIC_QM_RCQ_IDLE(0),
2403 };
2404 struct fbnic_dev *fbd = fbn->fbd;
2405 unsigned int val, mask, off;
2406 const unsigned int *regs;
2407 unsigned int reg_cnt;
2408 int i, err;
2409
2410 regs = rx ? rx_regs : tx_regs;
2411 reg_cnt = rx ? ARRAY_SIZE(rx_regs) : ARRAY_SIZE(tx_regs);
2412
2413 off = idx / 32;
2414 mask = BIT(idx % 32);
2415
2416 for (i = 0; i < reg_cnt; i++) {
2417 err = read_poll_timeout_atomic(fbnic_rd32, val, val & mask,
2418 2, 500000, false,
2419 fbd, regs[i] + off);
2420 if (err) {
2421 netdev_err(fbd->netdev,
2422 "wait for queue %s%d idle failed 0x%04x(%d): %08x (mask: %08x)\n",
2423 rx ? "Rx" : "Tx", idx, regs[i] + off, i,
2424 val, mask);
2425 return err;
2426 }
2427 }
2428
2429 return 0;
2430 }
2431
fbnic_nv_flush(struct fbnic_napi_vector * nv)2432 static void fbnic_nv_flush(struct fbnic_napi_vector *nv)
2433 {
2434 int j, t;
2435
2436 /* Flush any processed Tx Queue Triads and drop the rest */
2437 for (t = 0; t < nv->txt_count; t++) {
2438 struct fbnic_q_triad *qt = &nv->qt[t];
2439 struct netdev_queue *tx_queue;
2440
2441 /* Clean the work queues of unprocessed work */
2442 fbnic_clean_twq0(nv, 0, &qt->sub0, true, qt->sub0.tail);
2443 fbnic_clean_twq1(nv, false, &qt->sub1, true,
2444 qt->sub1.tail);
2445
2446 /* Reset completion queue descriptor ring */
2447 memset(qt->cmpl.desc, 0, qt->cmpl.size);
2448
2449 /* Nothing else to do if Tx queue is disabled */
2450 if (qt->sub0.flags & FBNIC_RING_F_DISABLED)
2451 continue;
2452
2453 /* Reset BQL associated with Tx queue */
2454 tx_queue = netdev_get_tx_queue(nv->napi.dev,
2455 qt->sub0.q_idx);
2456 netdev_tx_reset_queue(tx_queue);
2457 }
2458
2459 /* Flush any processed Rx Queue Triads and drop the rest */
2460 for (j = 0; j < nv->rxt_count; j++, t++) {
2461 struct fbnic_q_triad *qt = &nv->qt[t];
2462
2463 /* Clean the work queues of unprocessed work */
2464 fbnic_clean_bdq(&qt->sub0, qt->sub0.tail, 0);
2465 fbnic_clean_bdq(&qt->sub1, qt->sub1.tail, 0);
2466
2467 /* Reset completion queue descriptor ring */
2468 memset(qt->cmpl.desc, 0, qt->cmpl.size);
2469
2470 fbnic_put_pkt_buff(qt, qt->cmpl.pkt, 0);
2471 memset(qt->cmpl.pkt, 0, sizeof(struct fbnic_pkt_buff));
2472 }
2473 }
2474
fbnic_flush(struct fbnic_net * fbn)2475 void fbnic_flush(struct fbnic_net *fbn)
2476 {
2477 int i;
2478
2479 for (i = 0; i < fbn->num_napi; i++)
2480 fbnic_nv_flush(fbn->napi[i]);
2481 }
2482
fbnic_nv_fill(struct fbnic_napi_vector * nv)2483 static void fbnic_nv_fill(struct fbnic_napi_vector *nv)
2484 {
2485 int j, t;
2486
2487 /* Configure NAPI mapping and populate pages
2488 * in the BDQ rings to use for Rx
2489 */
2490 for (j = 0, t = nv->txt_count; j < nv->rxt_count; j++, t++) {
2491 struct fbnic_q_triad *qt = &nv->qt[t];
2492
2493 /* Populate the header and payload BDQs */
2494 fbnic_fill_bdq(&qt->sub0);
2495 fbnic_fill_bdq(&qt->sub1);
2496 }
2497 }
2498
fbnic_fill(struct fbnic_net * fbn)2499 void fbnic_fill(struct fbnic_net *fbn)
2500 {
2501 int i;
2502
2503 for (i = 0; i < fbn->num_napi; i++)
2504 fbnic_nv_fill(fbn->napi[i]);
2505 }
2506
fbnic_enable_twq0(struct fbnic_ring * twq)2507 static void fbnic_enable_twq0(struct fbnic_ring *twq)
2508 {
2509 u32 log_size = fls(twq->size_mask);
2510
2511 if (!twq->size_mask)
2512 return;
2513
2514 /* Reset head/tail */
2515 fbnic_ring_wr32(twq, FBNIC_QUEUE_TWQ0_CTL, FBNIC_QUEUE_TWQ_CTL_RESET);
2516 twq->tail = 0;
2517 twq->head = 0;
2518 twq->deferred_meta = -1;
2519
2520 /* Store descriptor ring address and size */
2521 fbnic_ring_wr32(twq, FBNIC_QUEUE_TWQ0_BAL, lower_32_bits(twq->dma));
2522 fbnic_ring_wr32(twq, FBNIC_QUEUE_TWQ0_BAH, upper_32_bits(twq->dma));
2523
2524 /* Write lower 4 bits of log size as 64K ring size is 0 */
2525 fbnic_ring_wr32(twq, FBNIC_QUEUE_TWQ0_SIZE, log_size & 0xf);
2526
2527 fbnic_ring_wr32(twq, FBNIC_QUEUE_TWQ0_CTL, FBNIC_QUEUE_TWQ_CTL_ENABLE);
2528 }
2529
fbnic_enable_twq1(struct fbnic_ring * twq)2530 static void fbnic_enable_twq1(struct fbnic_ring *twq)
2531 {
2532 u32 log_size = fls(twq->size_mask);
2533
2534 if (!twq->size_mask)
2535 return;
2536
2537 /* Reset head/tail */
2538 fbnic_ring_wr32(twq, FBNIC_QUEUE_TWQ1_CTL, FBNIC_QUEUE_TWQ_CTL_RESET);
2539 twq->tail = 0;
2540 twq->head = 0;
2541
2542 /* Store descriptor ring address and size */
2543 fbnic_ring_wr32(twq, FBNIC_QUEUE_TWQ1_BAL, lower_32_bits(twq->dma));
2544 fbnic_ring_wr32(twq, FBNIC_QUEUE_TWQ1_BAH, upper_32_bits(twq->dma));
2545
2546 /* Write lower 4 bits of log size as 64K ring size is 0 */
2547 fbnic_ring_wr32(twq, FBNIC_QUEUE_TWQ1_SIZE, log_size & 0xf);
2548
2549 fbnic_ring_wr32(twq, FBNIC_QUEUE_TWQ1_CTL, FBNIC_QUEUE_TWQ_CTL_ENABLE);
2550 }
2551
fbnic_enable_tcq(struct fbnic_napi_vector * nv,struct fbnic_ring * tcq)2552 static void fbnic_enable_tcq(struct fbnic_napi_vector *nv,
2553 struct fbnic_ring *tcq)
2554 {
2555 u32 log_size = fls(tcq->size_mask);
2556
2557 if (!tcq->size_mask)
2558 return;
2559
2560 /* Reset head/tail */
2561 fbnic_ring_wr32(tcq, FBNIC_QUEUE_TCQ_CTL, FBNIC_QUEUE_TCQ_CTL_RESET);
2562 tcq->tail = 0;
2563 tcq->head = 0;
2564
2565 /* Store descriptor ring address and size */
2566 fbnic_ring_wr32(tcq, FBNIC_QUEUE_TCQ_BAL, lower_32_bits(tcq->dma));
2567 fbnic_ring_wr32(tcq, FBNIC_QUEUE_TCQ_BAH, upper_32_bits(tcq->dma));
2568
2569 /* Write lower 4 bits of log size as 64K ring size is 0 */
2570 fbnic_ring_wr32(tcq, FBNIC_QUEUE_TCQ_SIZE, log_size & 0xf);
2571
2572 /* Store interrupt information for the completion queue */
2573 fbnic_ring_wr32(tcq, FBNIC_QUEUE_TIM_CTL, nv->v_idx);
2574 fbnic_ring_wr32(tcq, FBNIC_QUEUE_TIM_THRESHOLD, tcq->size_mask / 2);
2575 fbnic_ring_wr32(tcq, FBNIC_QUEUE_TIM_MASK, 0);
2576
2577 /* Enable queue */
2578 fbnic_ring_wr32(tcq, FBNIC_QUEUE_TCQ_CTL, FBNIC_QUEUE_TCQ_CTL_ENABLE);
2579 }
2580
fbnic_enable_bdq(struct fbnic_ring * hpq,struct fbnic_ring * ppq)2581 static void fbnic_enable_bdq(struct fbnic_ring *hpq, struct fbnic_ring *ppq)
2582 {
2583 u32 bdq_ctl = FBNIC_QUEUE_BDQ_CTL_ENABLE;
2584 u32 log_size;
2585
2586 /* Reset head/tail */
2587 fbnic_ring_wr32(hpq, FBNIC_QUEUE_BDQ_CTL, FBNIC_QUEUE_BDQ_CTL_RESET);
2588 ppq->tail = 0;
2589 ppq->head = 0;
2590 hpq->tail = 0;
2591 hpq->head = 0;
2592
2593 log_size = fls(hpq->size_mask) + ilog2(FBNIC_BD_FRAG_COUNT);
2594
2595 /* Store descriptor ring address and size */
2596 fbnic_ring_wr32(hpq, FBNIC_QUEUE_BDQ_HPQ_BAL, lower_32_bits(hpq->dma));
2597 fbnic_ring_wr32(hpq, FBNIC_QUEUE_BDQ_HPQ_BAH, upper_32_bits(hpq->dma));
2598
2599 /* Write lower 4 bits of log size as 64K ring size is 0 */
2600 fbnic_ring_wr32(hpq, FBNIC_QUEUE_BDQ_HPQ_SIZE, log_size & 0xf);
2601
2602 if (!ppq->size_mask)
2603 goto write_ctl;
2604
2605 log_size = fls(ppq->size_mask) + ilog2(FBNIC_BD_FRAG_COUNT);
2606
2607 /* Add enabling of PPQ to BDQ control */
2608 bdq_ctl |= FBNIC_QUEUE_BDQ_CTL_PPQ_ENABLE;
2609
2610 /* Store descriptor ring address and size */
2611 fbnic_ring_wr32(ppq, FBNIC_QUEUE_BDQ_PPQ_BAL, lower_32_bits(ppq->dma));
2612 fbnic_ring_wr32(ppq, FBNIC_QUEUE_BDQ_PPQ_BAH, upper_32_bits(ppq->dma));
2613 fbnic_ring_wr32(ppq, FBNIC_QUEUE_BDQ_PPQ_SIZE, log_size & 0xf);
2614
2615 write_ctl:
2616 fbnic_ring_wr32(hpq, FBNIC_QUEUE_BDQ_CTL, bdq_ctl);
2617 }
2618
fbnic_config_drop_mode_rcq(struct fbnic_napi_vector * nv,struct fbnic_ring * rcq,bool tx_pause,bool hdr_split)2619 static void fbnic_config_drop_mode_rcq(struct fbnic_napi_vector *nv,
2620 struct fbnic_ring *rcq, bool tx_pause,
2621 bool hdr_split)
2622 {
2623 struct fbnic_net *fbn = netdev_priv(nv->napi.dev);
2624 u32 drop_mode, rcq_ctl;
2625
2626 if (!tx_pause && fbn->num_rx_queues > 1)
2627 drop_mode = FBNIC_QUEUE_RDE_CTL0_DROP_IMMEDIATE;
2628 else
2629 drop_mode = FBNIC_QUEUE_RDE_CTL0_DROP_NEVER;
2630
2631 /* Specify packet layout */
2632 rcq_ctl = FIELD_PREP(FBNIC_QUEUE_RDE_CTL0_DROP_MODE_MASK, drop_mode) |
2633 FIELD_PREP(FBNIC_QUEUE_RDE_CTL0_MIN_HROOM_MASK, FBNIC_RX_HROOM) |
2634 FIELD_PREP(FBNIC_QUEUE_RDE_CTL0_MIN_TROOM_MASK, FBNIC_RX_TROOM) |
2635 FIELD_PREP(FBNIC_QUEUE_RDE_CTL0_EN_HDR_SPLIT, hdr_split);
2636
2637 fbnic_ring_wr32(rcq, FBNIC_QUEUE_RDE_CTL0, rcq_ctl);
2638 }
2639
fbnic_config_drop_mode(struct fbnic_net * fbn,bool txp)2640 void fbnic_config_drop_mode(struct fbnic_net *fbn, bool txp)
2641 {
2642 bool hds;
2643 int i, t;
2644
2645 hds = fbn->hds_thresh < FBNIC_HDR_BYTES_MIN;
2646
2647 for (i = 0; i < fbn->num_napi; i++) {
2648 struct fbnic_napi_vector *nv = fbn->napi[i];
2649
2650 for (t = 0; t < nv->rxt_count; t++) {
2651 struct fbnic_q_triad *qt = &nv->qt[nv->txt_count + t];
2652
2653 fbnic_config_drop_mode_rcq(nv, &qt->cmpl, txp, hds);
2654 }
2655 }
2656 }
2657
fbnic_config_rim_threshold(struct fbnic_ring * rcq,u16 nv_idx,u32 rx_desc)2658 static void fbnic_config_rim_threshold(struct fbnic_ring *rcq, u16 nv_idx, u32 rx_desc)
2659 {
2660 u32 threshold;
2661
2662 /* Set the threhsold to half the ring size if rx_frames
2663 * is not configured
2664 */
2665 threshold = rx_desc ? : rcq->size_mask / 2;
2666
2667 fbnic_ring_wr32(rcq, FBNIC_QUEUE_RIM_CTL, nv_idx);
2668 fbnic_ring_wr32(rcq, FBNIC_QUEUE_RIM_THRESHOLD, threshold);
2669 }
2670
fbnic_config_txrx_usecs(struct fbnic_napi_vector * nv,u32 arm)2671 void fbnic_config_txrx_usecs(struct fbnic_napi_vector *nv, u32 arm)
2672 {
2673 struct fbnic_net *fbn = netdev_priv(nv->napi.dev);
2674 struct fbnic_dev *fbd = nv->fbd;
2675 u32 val = arm;
2676
2677 val |= FIELD_PREP(FBNIC_INTR_CQ_REARM_RCQ_TIMEOUT, fbn->rx_usecs) |
2678 FBNIC_INTR_CQ_REARM_RCQ_TIMEOUT_UPD_EN;
2679 val |= FIELD_PREP(FBNIC_INTR_CQ_REARM_TCQ_TIMEOUT, fbn->tx_usecs) |
2680 FBNIC_INTR_CQ_REARM_TCQ_TIMEOUT_UPD_EN;
2681
2682 fbnic_wr32(fbd, FBNIC_INTR_CQ_REARM(nv->v_idx), val);
2683 }
2684
fbnic_config_rx_frames(struct fbnic_napi_vector * nv)2685 void fbnic_config_rx_frames(struct fbnic_napi_vector *nv)
2686 {
2687 struct fbnic_net *fbn = netdev_priv(nv->napi.dev);
2688 int i;
2689
2690 for (i = nv->txt_count; i < nv->rxt_count + nv->txt_count; i++) {
2691 struct fbnic_q_triad *qt = &nv->qt[i];
2692
2693 fbnic_config_rim_threshold(&qt->cmpl, nv->v_idx,
2694 fbn->rx_max_frames *
2695 FBNIC_MIN_RXD_PER_FRAME);
2696 }
2697 }
2698
fbnic_enable_rcq(struct fbnic_napi_vector * nv,struct fbnic_ring * rcq)2699 static void fbnic_enable_rcq(struct fbnic_napi_vector *nv,
2700 struct fbnic_ring *rcq)
2701 {
2702 struct fbnic_net *fbn = netdev_priv(nv->napi.dev);
2703 u32 log_size = fls(rcq->size_mask);
2704 u32 rcq_ctl = 0;
2705 bool hdr_split;
2706 u32 hds_thresh;
2707
2708 /* Force lower bound on MAX_HEADER_BYTES. Below this, all frames should
2709 * be split at L4. It would also result in the frames being split at
2710 * L2/L3 depending on the frame size.
2711 */
2712 hdr_split = fbn->hds_thresh < FBNIC_HDR_BYTES_MIN;
2713 fbnic_config_drop_mode_rcq(nv, rcq, fbn->tx_pause, hdr_split);
2714
2715 hds_thresh = max(fbn->hds_thresh, FBNIC_HDR_BYTES_MIN);
2716 rcq_ctl |= FIELD_PREP(FBNIC_QUEUE_RDE_CTL1_PADLEN_MASK, FBNIC_RX_PAD) |
2717 FIELD_PREP(FBNIC_QUEUE_RDE_CTL1_MAX_HDR_MASK, hds_thresh) |
2718 FIELD_PREP(FBNIC_QUEUE_RDE_CTL1_PAYLD_OFF_MASK,
2719 FBNIC_RX_PAYLD_OFFSET) |
2720 FIELD_PREP(FBNIC_QUEUE_RDE_CTL1_PAYLD_PG_CL_MASK,
2721 FBNIC_RX_PAYLD_PG_CL);
2722 fbnic_ring_wr32(rcq, FBNIC_QUEUE_RDE_CTL1, rcq_ctl);
2723
2724 /* Reset head/tail */
2725 fbnic_ring_wr32(rcq, FBNIC_QUEUE_RCQ_CTL, FBNIC_QUEUE_RCQ_CTL_RESET);
2726 rcq->head = 0;
2727 rcq->tail = 0;
2728
2729 /* Store descriptor ring address and size */
2730 fbnic_ring_wr32(rcq, FBNIC_QUEUE_RCQ_BAL, lower_32_bits(rcq->dma));
2731 fbnic_ring_wr32(rcq, FBNIC_QUEUE_RCQ_BAH, upper_32_bits(rcq->dma));
2732
2733 /* Write lower 4 bits of log size as 64K ring size is 0 */
2734 fbnic_ring_wr32(rcq, FBNIC_QUEUE_RCQ_SIZE, log_size & 0xf);
2735
2736 /* Store interrupt information for the completion queue */
2737 fbnic_config_rim_threshold(rcq, nv->v_idx, fbn->rx_max_frames *
2738 FBNIC_MIN_RXD_PER_FRAME);
2739 fbnic_ring_wr32(rcq, FBNIC_QUEUE_RIM_MASK, 0);
2740
2741 /* Enable queue */
2742 fbnic_ring_wr32(rcq, FBNIC_QUEUE_RCQ_CTL, FBNIC_QUEUE_RCQ_CTL_ENABLE);
2743 }
2744
__fbnic_nv_enable(struct fbnic_napi_vector * nv)2745 static void __fbnic_nv_enable(struct fbnic_napi_vector *nv)
2746 {
2747 int j, t;
2748
2749 /* Setup Tx Queue Triads */
2750 for (t = 0; t < nv->txt_count; t++) {
2751 struct fbnic_q_triad *qt = &nv->qt[t];
2752
2753 fbnic_enable_twq0(&qt->sub0);
2754 fbnic_enable_twq1(&qt->sub1);
2755 fbnic_enable_tcq(nv, &qt->cmpl);
2756 }
2757
2758 /* Setup Rx Queue Triads */
2759 for (j = 0; j < nv->rxt_count; j++, t++) {
2760 struct fbnic_q_triad *qt = &nv->qt[t];
2761
2762 page_pool_enable_direct_recycling(qt->sub0.page_pool,
2763 &nv->napi);
2764 page_pool_enable_direct_recycling(qt->sub1.page_pool,
2765 &nv->napi);
2766
2767 fbnic_enable_bdq(&qt->sub0, &qt->sub1);
2768 fbnic_enable_rcq(nv, &qt->cmpl);
2769 }
2770 }
2771
fbnic_nv_enable(struct fbnic_net * fbn,struct fbnic_napi_vector * nv)2772 static void fbnic_nv_enable(struct fbnic_net *fbn, struct fbnic_napi_vector *nv)
2773 {
2774 __fbnic_nv_enable(nv);
2775 fbnic_wrfl(fbn->fbd);
2776 }
2777
fbnic_enable(struct fbnic_net * fbn)2778 void fbnic_enable(struct fbnic_net *fbn)
2779 {
2780 struct fbnic_dev *fbd = fbn->fbd;
2781 int i;
2782
2783 for (i = 0; i < fbn->num_napi; i++)
2784 __fbnic_nv_enable(fbn->napi[i]);
2785
2786 fbnic_wrfl(fbd);
2787 }
2788
fbnic_nv_irq_enable(struct fbnic_napi_vector * nv)2789 static void fbnic_nv_irq_enable(struct fbnic_napi_vector *nv)
2790 {
2791 fbnic_config_txrx_usecs(nv, FBNIC_INTR_CQ_REARM_INTR_UNMASK);
2792 }
2793
fbnic_napi_enable(struct fbnic_net * fbn)2794 void fbnic_napi_enable(struct fbnic_net *fbn)
2795 {
2796 u32 irqs[FBNIC_MAX_MSIX_VECS / 32] = {};
2797 struct fbnic_dev *fbd = fbn->fbd;
2798 int i;
2799
2800 for (i = 0; i < fbn->num_napi; i++) {
2801 struct fbnic_napi_vector *nv = fbn->napi[i];
2802
2803 napi_enable_locked(&nv->napi);
2804
2805 fbnic_nv_irq_enable(nv);
2806
2807 /* Record bit used for NAPI IRQs so we can
2808 * set the mask appropriately
2809 */
2810 irqs[nv->v_idx / 32] |= BIT(nv->v_idx % 32);
2811 }
2812
2813 /* Force the first interrupt on the device to guarantee
2814 * that any packets that may have been enqueued during the
2815 * bringup are processed.
2816 */
2817 for (i = 0; i < ARRAY_SIZE(irqs); i++) {
2818 if (!irqs[i])
2819 continue;
2820 fbnic_wr32(fbd, FBNIC_INTR_SET(i), irqs[i]);
2821 }
2822
2823 fbnic_wrfl(fbd);
2824 }
2825
fbnic_napi_depletion_check(struct net_device * netdev)2826 void fbnic_napi_depletion_check(struct net_device *netdev)
2827 {
2828 struct fbnic_net *fbn = netdev_priv(netdev);
2829 u32 irqs[FBNIC_MAX_MSIX_VECS / 32] = {};
2830 struct fbnic_dev *fbd = fbn->fbd;
2831 int i, j, t;
2832
2833 for (i = 0; i < fbn->num_napi; i++) {
2834 struct fbnic_napi_vector *nv = fbn->napi[i];
2835
2836 /* Find RQs which are completely out of pages */
2837 for (t = nv->txt_count, j = 0; j < nv->rxt_count; j++, t++) {
2838 /* Assume 4 pages is always enough to fit a packet
2839 * and therefore generate a completion and an IRQ.
2840 */
2841 if (fbnic_desc_used(&nv->qt[t].sub0) < 4 ||
2842 fbnic_desc_used(&nv->qt[t].sub1) < 4)
2843 irqs[nv->v_idx / 32] |= BIT(nv->v_idx % 32);
2844 }
2845 }
2846
2847 for (i = 0; i < ARRAY_SIZE(irqs); i++) {
2848 if (!irqs[i])
2849 continue;
2850 fbnic_wr32(fbd, FBNIC_INTR_MASK_CLEAR(i), irqs[i]);
2851 fbnic_wr32(fbd, FBNIC_INTR_SET(i), irqs[i]);
2852 }
2853
2854 fbnic_wrfl(fbd);
2855 }
2856
2857 /* Returns the napi vector servicing an Rx queue, or NULL if the datapath
2858 * is torn down. The association is published by fbnic_set_netif_napi()
2859 * and cleared by fbnic_reset_netif_napi(), both under the instance lock.
2860 */
fbnic_rxq_nv(struct net_device * dev,int idx)2861 static struct fbnic_napi_vector *fbnic_rxq_nv(struct net_device *dev, int idx)
2862 {
2863 struct napi_struct *napi = __netif_get_rx_queue(dev, idx)->napi;
2864
2865 return napi ? container_of(napi, struct fbnic_napi_vector, napi) : NULL;
2866 }
2867
fbnic_queue_mem_alloc(struct net_device * dev,struct netdev_queue_config * qcfg,void * qmem,int idx)2868 static int fbnic_queue_mem_alloc(struct net_device *dev,
2869 struct netdev_queue_config *qcfg,
2870 void *qmem, int idx)
2871 {
2872 struct fbnic_net *fbn = netdev_priv(dev);
2873 const struct fbnic_q_triad *real;
2874 struct fbnic_q_triad *qt = qmem;
2875 struct fbnic_napi_vector *nv;
2876
2877 if (!netif_running(dev))
2878 return fbnic_alloc_qt_page_pools(fbn, qt, idx);
2879
2880 /* A failed PCIe recovery or resume can leave the datapath torn down
2881 * while netif_running() is still true. This ndo runs before
2882 * netdev_rx_queue_restart() checks netif_running(), so bail out
2883 * rather than touching rings and vectors that are already freed.
2884 */
2885 nv = fbnic_rxq_nv(dev, idx);
2886 if (!nv)
2887 return -ENETDOWN;
2888
2889 real = container_of(fbn->rx[idx], struct fbnic_q_triad, cmpl);
2890
2891 fbnic_ring_init(&qt->sub0, real->sub0.doorbell, real->sub0.q_idx,
2892 real->sub0.flags);
2893 fbnic_ring_init(&qt->sub1, real->sub1.doorbell, real->sub1.q_idx,
2894 real->sub1.flags);
2895 fbnic_ring_init(&qt->cmpl, real->cmpl.doorbell, real->cmpl.q_idx,
2896 real->cmpl.flags);
2897
2898 return fbnic_alloc_rx_qt_resources(fbn, nv, qt);
2899 }
2900
fbnic_queue_mem_free(struct net_device * dev,void * qmem)2901 static void fbnic_queue_mem_free(struct net_device *dev, void *qmem)
2902 {
2903 struct fbnic_net *fbn = netdev_priv(dev);
2904 struct fbnic_q_triad *qt = qmem;
2905
2906 if (!netif_running(dev))
2907 fbnic_free_qt_page_pools(qt);
2908 else
2909 fbnic_free_qt_resources(fbn, qt);
2910 }
2911
__fbnic_nv_restart(struct fbnic_net * fbn,struct fbnic_napi_vector * nv)2912 static void __fbnic_nv_restart(struct fbnic_net *fbn,
2913 struct fbnic_napi_vector *nv)
2914 {
2915 struct fbnic_dev *fbd = fbn->fbd;
2916 int i;
2917
2918 fbnic_nv_enable(fbn, nv);
2919 fbnic_nv_fill(nv);
2920
2921 napi_enable_locked(&nv->napi);
2922 fbnic_nv_irq_enable(nv);
2923 fbnic_wr32(fbd, FBNIC_INTR_SET(nv->v_idx / 32), BIT(nv->v_idx % 32));
2924 fbnic_wrfl(fbd);
2925
2926 for (i = 0; i < nv->txt_count; i++)
2927 netif_wake_subqueue(fbn->netdev, nv->qt[i].sub0.q_idx);
2928 fbnic_dbg_nv_init(nv);
2929 }
2930
fbnic_queue_start(struct net_device * dev,struct netdev_queue_config * qcfg,void * qmem,int idx)2931 static int fbnic_queue_start(struct net_device *dev,
2932 struct netdev_queue_config *qcfg,
2933 void *qmem, int idx)
2934 {
2935 struct fbnic_net *fbn = netdev_priv(dev);
2936 struct fbnic_napi_vector *nv;
2937 struct fbnic_q_triad *real;
2938
2939 real = container_of(fbn->rx[idx], struct fbnic_q_triad, cmpl);
2940 nv = fbnic_rxq_nv(dev, idx);
2941
2942 fbnic_aggregate_ring_bdq_counters(fbn, &real->sub0);
2943 fbnic_aggregate_ring_bdq_counters(fbn, &real->sub1);
2944 fbnic_aggregate_ring_rx_counters(fbn, &real->cmpl);
2945
2946 memcpy(real, qmem, sizeof(*real));
2947
2948 __fbnic_nv_restart(fbn, nv);
2949
2950 return 0;
2951 }
2952
fbnic_queue_stop(struct net_device * dev,void * qmem,int idx)2953 static int fbnic_queue_stop(struct net_device *dev, void *qmem, int idx)
2954 {
2955 struct fbnic_net *fbn = netdev_priv(dev);
2956 const struct fbnic_q_triad *real;
2957 struct fbnic_napi_vector *nv;
2958 int i, t;
2959 int err;
2960
2961 real = container_of(fbn->rx[idx], struct fbnic_q_triad, cmpl);
2962 nv = fbnic_rxq_nv(dev, idx);
2963 fbnic_dbg_nv_exit(nv);
2964
2965 napi_disable_locked(&nv->napi);
2966 fbnic_nv_irq_disable(nv);
2967
2968 for (i = 0; i < nv->txt_count; i++)
2969 netif_stop_subqueue(dev, nv->qt[i].sub0.q_idx);
2970 fbnic_nv_disable(fbn, nv);
2971
2972 for (t = 0; t < nv->txt_count + nv->rxt_count; t++) {
2973 err = fbnic_wait_queue_idle(fbn, t >= nv->txt_count,
2974 nv->qt[t].sub0.q_idx);
2975 if (err)
2976 goto err_restart;
2977 }
2978
2979 fbnic_synchronize_irq(fbn->fbd, nv->v_idx);
2980 fbnic_nv_flush(nv);
2981
2982 page_pool_disable_direct_recycling(real->sub0.page_pool);
2983 page_pool_disable_direct_recycling(real->sub1.page_pool);
2984
2985 memcpy(qmem, real, sizeof(*real));
2986
2987 return 0;
2988
2989 err_restart:
2990 __fbnic_nv_restart(fbn, nv);
2991 return err;
2992 }
2993
2994 const struct netdev_queue_mgmt_ops fbnic_queue_mgmt_ops = {
2995 .ndo_queue_mem_size = sizeof(struct fbnic_q_triad),
2996 .ndo_queue_mem_alloc = fbnic_queue_mem_alloc,
2997 .ndo_queue_mem_free = fbnic_queue_mem_free,
2998 .ndo_queue_start = fbnic_queue_start,
2999 .ndo_queue_stop = fbnic_queue_stop,
3000 };
3001