4 * Copyright(c) 2013-2015 Intel Corporation. All rights reserved.
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
11 * * Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * * Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in
15 * the documentation and/or other materials provided with the
17 * * Neither the name of Intel Corporation nor the names of its
18 * contributors may be used to endorse or promote products derived
19 * from this software without specific prior written permission.
21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34 #include <rte_ethdev.h>
35 #include <rte_malloc.h>
36 #include <rte_memzone.h>
37 #include <rte_string_fns.h>
39 #include <rte_spinlock.h>
42 #include "base/fm10k_api.h"
44 #define FM10K_RX_BUFF_ALIGN 512
45 /* Default delay to acquire mailbox lock */
46 #define FM10K_MBXLOCK_DELAY_US 20
47 #define UINT64_LOWER_32BITS_MASK 0x00000000ffffffffULL
49 /* Number of chars per uint32 type */
50 #define CHARS_PER_UINT32 (sizeof(uint32_t))
51 #define BIT_MASK_PER_UINT32 ((1 << CHARS_PER_UINT32) - 1)
53 static void fm10k_close_mbx_service(struct fm10k_hw *hw);
56 fm10k_mbx_initlock(struct fm10k_hw *hw)
58 rte_spinlock_init(FM10K_DEV_PRIVATE_TO_MBXLOCK(hw->back));
62 fm10k_mbx_lock(struct fm10k_hw *hw)
64 while (!rte_spinlock_trylock(FM10K_DEV_PRIVATE_TO_MBXLOCK(hw->back)))
65 rte_delay_us(FM10K_MBXLOCK_DELAY_US);
69 fm10k_mbx_unlock(struct fm10k_hw *hw)
71 rte_spinlock_unlock(FM10K_DEV_PRIVATE_TO_MBXLOCK(hw->back));
75 * reset queue to initial state, allocate software buffers used when starting
78 * return -ENOMEM if buffers cannot be allocated
79 * return -EINVAL if buffers do not satisfy alignment condition
82 rx_queue_reset(struct fm10k_rx_queue *q)
86 PMD_INIT_FUNC_TRACE();
88 diag = rte_mempool_get_bulk(q->mp, (void **)q->sw_ring, q->nb_desc);
92 for (i = 0; i < q->nb_desc; ++i) {
93 fm10k_pktmbuf_reset(q->sw_ring[i], q->port_id);
94 if (!fm10k_addr_alignment_valid(q->sw_ring[i])) {
95 rte_mempool_put_bulk(q->mp, (void **)q->sw_ring,
99 dma_addr = MBUF_DMA_ADDR_DEFAULT(q->sw_ring[i]);
100 q->hw_ring[i].q.pkt_addr = dma_addr;
101 q->hw_ring[i].q.hdr_addr = dma_addr;
106 q->next_trigger = q->alloc_thresh - 1;
107 FM10K_PCI_REG_WRITE(q->tail_ptr, q->nb_desc - 1);
112 * clean queue, descriptor rings, free software buffers used when stopping
116 rx_queue_clean(struct fm10k_rx_queue *q)
118 union fm10k_rx_desc zero = {.q = {0, 0, 0, 0} };
120 PMD_INIT_FUNC_TRACE();
122 /* zero descriptor rings */
123 for (i = 0; i < q->nb_desc; ++i)
124 q->hw_ring[i] = zero;
126 /* free software buffers */
127 for (i = 0; i < q->nb_desc; ++i) {
129 rte_pktmbuf_free_seg(q->sw_ring[i]);
130 q->sw_ring[i] = NULL;
136 * free all queue memory used when releasing the queue (i.e. configure)
139 rx_queue_free(struct fm10k_rx_queue *q)
141 PMD_INIT_FUNC_TRACE();
143 PMD_INIT_LOG(DEBUG, "Freeing rx queue %p", q);
146 rte_free(q->sw_ring);
155 * disable RX queue, wait unitl HW finished necessary flush operation
158 rx_queue_disable(struct fm10k_hw *hw, uint16_t qnum)
162 reg = FM10K_READ_REG(hw, FM10K_RXQCTL(qnum));
163 FM10K_WRITE_REG(hw, FM10K_RXQCTL(qnum),
164 reg & ~FM10K_RXQCTL_ENABLE);
166 /* Wait 100us at most */
167 for (i = 0; i < FM10K_QUEUE_DISABLE_TIMEOUT; i++) {
169 reg = FM10K_READ_REG(hw, FM10K_RXQCTL(i));
170 if (!(reg & FM10K_RXQCTL_ENABLE))
174 if (i == FM10K_QUEUE_DISABLE_TIMEOUT)
181 * reset queue to initial state, allocate software buffers used when starting
185 tx_queue_reset(struct fm10k_tx_queue *q)
187 PMD_INIT_FUNC_TRACE();
191 q->nb_free = q->nb_desc - 1;
192 q->free_trigger = q->nb_free - q->free_thresh;
193 fifo_reset(&q->rs_tracker, (q->nb_desc + 1) / q->rs_thresh);
194 FM10K_PCI_REG_WRITE(q->tail_ptr, 0);
198 * clean queue, descriptor rings, free software buffers used when stopping
202 tx_queue_clean(struct fm10k_tx_queue *q)
204 struct fm10k_tx_desc zero = {0, 0, 0, 0, 0, 0};
206 PMD_INIT_FUNC_TRACE();
208 /* zero descriptor rings */
209 for (i = 0; i < q->nb_desc; ++i)
210 q->hw_ring[i] = zero;
212 /* free software buffers */
213 for (i = 0; i < q->nb_desc; ++i) {
215 rte_pktmbuf_free_seg(q->sw_ring[i]);
216 q->sw_ring[i] = NULL;
222 * free all queue memory used when releasing the queue (i.e. configure)
225 tx_queue_free(struct fm10k_tx_queue *q)
227 PMD_INIT_FUNC_TRACE();
229 PMD_INIT_LOG(DEBUG, "Freeing tx queue %p", q);
231 if (q->rs_tracker.list) {
232 rte_free(q->rs_tracker.list);
233 q->rs_tracker.list = NULL;
236 rte_free(q->sw_ring);
245 * disable TX queue, wait unitl HW finished necessary flush operation
248 tx_queue_disable(struct fm10k_hw *hw, uint16_t qnum)
252 reg = FM10K_READ_REG(hw, FM10K_TXDCTL(qnum));
253 FM10K_WRITE_REG(hw, FM10K_TXDCTL(qnum),
254 reg & ~FM10K_TXDCTL_ENABLE);
256 /* Wait 100us at most */
257 for (i = 0; i < FM10K_QUEUE_DISABLE_TIMEOUT; i++) {
259 reg = FM10K_READ_REG(hw, FM10K_TXDCTL(i));
260 if (!(reg & FM10K_TXDCTL_ENABLE))
264 if (i == FM10K_QUEUE_DISABLE_TIMEOUT)
271 fm10k_dev_configure(struct rte_eth_dev *dev)
273 PMD_INIT_FUNC_TRACE();
275 if (dev->data->dev_conf.rxmode.hw_strip_crc == 0)
276 PMD_INIT_LOG(WARNING, "fm10k always strip CRC");
282 fm10k_dev_mq_rx_configure(struct rte_eth_dev *dev)
284 struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
285 struct rte_eth_conf *dev_conf = &dev->data->dev_conf;
286 uint32_t mrqc, *key, i, reta, j;
289 #define RSS_KEY_SIZE 40
290 static uint8_t rss_intel_key[RSS_KEY_SIZE] = {
291 0x6D, 0x5A, 0x56, 0xDA, 0x25, 0x5B, 0x0E, 0xC2,
292 0x41, 0x67, 0x25, 0x3D, 0x43, 0xA3, 0x8F, 0xB0,
293 0xD0, 0xCA, 0x2B, 0xCB, 0xAE, 0x7B, 0x30, 0xB4,
294 0x77, 0xCB, 0x2D, 0xA3, 0x80, 0x30, 0xF2, 0x0C,
295 0x6A, 0x42, 0xB7, 0x3B, 0xBE, 0xAC, 0x01, 0xFA,
298 if (dev->data->nb_rx_queues == 1 ||
299 dev_conf->rxmode.mq_mode != ETH_MQ_RX_RSS ||
300 dev_conf->rx_adv_conf.rss_conf.rss_hf == 0)
303 /* random key is rss_intel_key (default) or user provided (rss_key) */
304 if (dev_conf->rx_adv_conf.rss_conf.rss_key == NULL)
305 key = (uint32_t *)rss_intel_key;
307 key = (uint32_t *)dev_conf->rx_adv_conf.rss_conf.rss_key;
309 /* Now fill our hash function seeds, 4 bytes at a time */
310 for (i = 0; i < RSS_KEY_SIZE / sizeof(*key); ++i)
311 FM10K_WRITE_REG(hw, FM10K_RSSRK(0, i), key[i]);
314 * Fill in redirection table
315 * The byte-swap is needed because NIC registers are in
316 * little-endian order.
319 for (i = 0, j = 0; i < FM10K_RETA_SIZE; i++, j++) {
320 if (j == dev->data->nb_rx_queues)
322 reta = (reta << CHAR_BIT) | j;
324 FM10K_WRITE_REG(hw, FM10K_RETA(0, i >> 2),
329 * Generate RSS hash based on packet types, TCP/UDP
330 * port numbers and/or IPv4/v6 src and dst addresses
332 hf = dev_conf->rx_adv_conf.rss_conf.rss_hf;
334 mrqc |= (hf & ETH_RSS_IPV4) ? FM10K_MRQC_IPV4 : 0;
335 mrqc |= (hf & ETH_RSS_IPV6) ? FM10K_MRQC_IPV6 : 0;
336 mrqc |= (hf & ETH_RSS_IPV6_EX) ? FM10K_MRQC_IPV6 : 0;
337 mrqc |= (hf & ETH_RSS_NONFRAG_IPV4_TCP) ? FM10K_MRQC_TCP_IPV4 : 0;
338 mrqc |= (hf & ETH_RSS_NONFRAG_IPV6_TCP) ? FM10K_MRQC_TCP_IPV6 : 0;
339 mrqc |= (hf & ETH_RSS_IPV6_TCP_EX) ? FM10K_MRQC_TCP_IPV6 : 0;
340 mrqc |= (hf & ETH_RSS_NONFRAG_IPV4_UDP) ? FM10K_MRQC_UDP_IPV4 : 0;
341 mrqc |= (hf & ETH_RSS_NONFRAG_IPV6_UDP) ? FM10K_MRQC_UDP_IPV6 : 0;
342 mrqc |= (hf & ETH_RSS_IPV6_UDP_EX) ? FM10K_MRQC_UDP_IPV6 : 0;
345 PMD_INIT_LOG(ERR, "Specified RSS mode 0x%"PRIx64"is not"
350 FM10K_WRITE_REG(hw, FM10K_MRQC(0), mrqc);
354 fm10k_dev_tx_init(struct rte_eth_dev *dev)
356 struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
358 struct fm10k_tx_queue *txq;
362 /* Disable TXINT to avoid possible interrupt */
363 for (i = 0; i < hw->mac.max_queues; i++)
364 FM10K_WRITE_REG(hw, FM10K_TXINT(i),
365 3 << FM10K_TXINT_TIMER_SHIFT);
368 for (i = 0; i < dev->data->nb_tx_queues; ++i) {
369 txq = dev->data->tx_queues[i];
370 base_addr = txq->hw_ring_phys_addr;
371 size = txq->nb_desc * sizeof(struct fm10k_tx_desc);
373 /* disable queue to avoid issues while updating state */
374 ret = tx_queue_disable(hw, i);
376 PMD_INIT_LOG(ERR, "failed to disable queue %d", i);
380 /* set location and size for descriptor ring */
381 FM10K_WRITE_REG(hw, FM10K_TDBAL(i),
382 base_addr & UINT64_LOWER_32BITS_MASK);
383 FM10K_WRITE_REG(hw, FM10K_TDBAH(i),
384 base_addr >> (CHAR_BIT * sizeof(uint32_t)));
385 FM10K_WRITE_REG(hw, FM10K_TDLEN(i), size);
391 fm10k_dev_rx_init(struct rte_eth_dev *dev)
393 struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
395 struct fm10k_rx_queue *rxq;
398 uint32_t rxdctl = FM10K_RXDCTL_WRITE_BACK_MIN_DELAY;
401 /* Disable RXINT to avoid possible interrupt */
402 for (i = 0; i < hw->mac.max_queues; i++)
403 FM10K_WRITE_REG(hw, FM10K_RXINT(i),
404 3 << FM10K_RXINT_TIMER_SHIFT);
406 /* Setup RX queues */
407 for (i = 0; i < dev->data->nb_rx_queues; ++i) {
408 rxq = dev->data->rx_queues[i];
409 base_addr = rxq->hw_ring_phys_addr;
410 size = rxq->nb_desc * sizeof(union fm10k_rx_desc);
412 /* disable queue to avoid issues while updating state */
413 ret = rx_queue_disable(hw, i);
415 PMD_INIT_LOG(ERR, "failed to disable queue %d", i);
419 /* Setup the Base and Length of the Rx Descriptor Ring */
420 FM10K_WRITE_REG(hw, FM10K_RDBAL(i),
421 base_addr & UINT64_LOWER_32BITS_MASK);
422 FM10K_WRITE_REG(hw, FM10K_RDBAH(i),
423 base_addr >> (CHAR_BIT * sizeof(uint32_t)));
424 FM10K_WRITE_REG(hw, FM10K_RDLEN(i), size);
426 /* Configure the Rx buffer size for one buff without split */
427 buf_size = (uint16_t)(rte_pktmbuf_data_room_size(rxq->mp) -
428 RTE_PKTMBUF_HEADROOM);
429 FM10K_WRITE_REG(hw, FM10K_SRRCTL(i),
430 buf_size >> FM10K_SRRCTL_BSIZEPKT_SHIFT);
432 /* It adds dual VLAN length for supporting dual VLAN */
433 if ((dev->data->dev_conf.rxmode.max_rx_pkt_len +
434 2 * FM10K_VLAN_TAG_SIZE) > buf_size){
435 dev->data->scattered_rx = 1;
436 dev->rx_pkt_burst = fm10k_recv_scattered_pkts;
439 /* Enable drop on empty, it's RO for VF */
440 if (hw->mac.type == fm10k_mac_pf && rxq->drop_en)
441 rxdctl |= FM10K_RXDCTL_DROP_ON_EMPTY;
443 FM10K_WRITE_REG(hw, FM10K_RXDCTL(i), rxdctl);
444 FM10K_WRITE_FLUSH(hw);
447 if (dev->data->dev_conf.rxmode.enable_scatter) {
448 dev->rx_pkt_burst = fm10k_recv_scattered_pkts;
449 dev->data->scattered_rx = 1;
452 /* Configure RSS if applicable */
453 fm10k_dev_mq_rx_configure(dev);
458 fm10k_dev_rx_queue_start(struct rte_eth_dev *dev, uint16_t rx_queue_id)
460 struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
463 struct fm10k_rx_queue *rxq;
465 PMD_INIT_FUNC_TRACE();
467 if (rx_queue_id < dev->data->nb_rx_queues) {
468 rxq = dev->data->rx_queues[rx_queue_id];
469 err = rx_queue_reset(rxq);
470 if (err == -ENOMEM) {
471 PMD_INIT_LOG(ERR, "Failed to alloc memory : %d", err);
473 } else if (err == -EINVAL) {
474 PMD_INIT_LOG(ERR, "Invalid buffer address alignment :"
479 /* Setup the HW Rx Head and Tail Descriptor Pointers
480 * Note: this must be done AFTER the queue is enabled on real
481 * hardware, but BEFORE the queue is enabled when using the
482 * emulation platform. Do it in both places for now and remove
483 * this comment and the following two register writes when the
484 * emulation platform is no longer being used.
486 FM10K_WRITE_REG(hw, FM10K_RDH(rx_queue_id), 0);
487 FM10K_WRITE_REG(hw, FM10K_RDT(rx_queue_id), rxq->nb_desc - 1);
489 /* Set PF ownership flag for PF devices */
490 reg = FM10K_READ_REG(hw, FM10K_RXQCTL(rx_queue_id));
491 if (hw->mac.type == fm10k_mac_pf)
492 reg |= FM10K_RXQCTL_PF;
493 reg |= FM10K_RXQCTL_ENABLE;
494 /* enable RX queue */
495 FM10K_WRITE_REG(hw, FM10K_RXQCTL(rx_queue_id), reg);
496 FM10K_WRITE_FLUSH(hw);
498 /* Setup the HW Rx Head and Tail Descriptor Pointers
499 * Note: this must be done AFTER the queue is enabled
501 FM10K_WRITE_REG(hw, FM10K_RDH(rx_queue_id), 0);
502 FM10K_WRITE_REG(hw, FM10K_RDT(rx_queue_id), rxq->nb_desc - 1);
509 fm10k_dev_rx_queue_stop(struct rte_eth_dev *dev, uint16_t rx_queue_id)
511 struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
513 PMD_INIT_FUNC_TRACE();
515 if (rx_queue_id < dev->data->nb_rx_queues) {
516 /* Disable RX queue */
517 rx_queue_disable(hw, rx_queue_id);
519 /* Free mbuf and clean HW ring */
520 rx_queue_clean(dev->data->rx_queues[rx_queue_id]);
527 fm10k_dev_tx_queue_start(struct rte_eth_dev *dev, uint16_t tx_queue_id)
529 struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
530 /** @todo - this should be defined in the shared code */
531 #define FM10K_TXDCTL_WRITE_BACK_MIN_DELAY 0x00010000
532 uint32_t txdctl = FM10K_TXDCTL_WRITE_BACK_MIN_DELAY;
535 PMD_INIT_FUNC_TRACE();
537 if (tx_queue_id < dev->data->nb_tx_queues) {
538 tx_queue_reset(dev->data->tx_queues[tx_queue_id]);
540 /* reset head and tail pointers */
541 FM10K_WRITE_REG(hw, FM10K_TDH(tx_queue_id), 0);
542 FM10K_WRITE_REG(hw, FM10K_TDT(tx_queue_id), 0);
544 /* enable TX queue */
545 FM10K_WRITE_REG(hw, FM10K_TXDCTL(tx_queue_id),
546 FM10K_TXDCTL_ENABLE | txdctl);
547 FM10K_WRITE_FLUSH(hw);
555 fm10k_dev_tx_queue_stop(struct rte_eth_dev *dev, uint16_t tx_queue_id)
557 struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
559 PMD_INIT_FUNC_TRACE();
561 if (tx_queue_id < dev->data->nb_tx_queues) {
562 tx_queue_disable(hw, tx_queue_id);
563 tx_queue_clean(dev->data->tx_queues[tx_queue_id]);
569 /* fls = find last set bit = 32 minus the number of leading zeros */
571 #define fls(x) (((x) == 0) ? 0 : (32 - __builtin_clz((x))))
573 #define BSIZEPKT_ROUNDUP ((1 << FM10K_SRRCTL_BSIZEPKT_SHIFT) - 1)
575 fm10k_dev_start(struct rte_eth_dev *dev)
577 struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
580 PMD_INIT_FUNC_TRACE();
582 /* stop, init, then start the hw */
583 diag = fm10k_stop_hw(hw);
584 if (diag != FM10K_SUCCESS) {
585 PMD_INIT_LOG(ERR, "Hardware stop failed: %d", diag);
589 diag = fm10k_init_hw(hw);
590 if (diag != FM10K_SUCCESS) {
591 PMD_INIT_LOG(ERR, "Hardware init failed: %d", diag);
595 diag = fm10k_start_hw(hw);
596 if (diag != FM10K_SUCCESS) {
597 PMD_INIT_LOG(ERR, "Hardware start failed: %d", diag);
601 diag = fm10k_dev_tx_init(dev);
603 PMD_INIT_LOG(ERR, "TX init failed: %d", diag);
607 diag = fm10k_dev_rx_init(dev);
609 PMD_INIT_LOG(ERR, "RX init failed: %d", diag);
613 if (hw->mac.type == fm10k_mac_pf) {
614 /* Establish only VSI 0 as valid */
615 FM10K_WRITE_REG(hw, FM10K_DGLORTMAP(0), FM10K_DGLORTMAP_ANY);
617 /* Configure RSS bits used in RETA table */
618 FM10K_WRITE_REG(hw, FM10K_DGLORTDEC(0),
619 fls(dev->data->nb_rx_queues - 1) <<
620 FM10K_DGLORTDEC_RSSLENGTH_SHIFT);
622 /* Invalidate all other GLORT entries */
623 for (i = 1; i < FM10K_DGLORT_COUNT; i++)
624 FM10K_WRITE_REG(hw, FM10K_DGLORTMAP(i),
625 FM10K_DGLORTMAP_NONE);
628 for (i = 0; i < dev->data->nb_rx_queues; i++) {
629 struct fm10k_rx_queue *rxq;
630 rxq = dev->data->rx_queues[i];
632 if (rxq->rx_deferred_start)
634 diag = fm10k_dev_rx_queue_start(dev, i);
637 for (j = 0; j < i; ++j)
638 rx_queue_clean(dev->data->rx_queues[j]);
643 for (i = 0; i < dev->data->nb_tx_queues; i++) {
644 struct fm10k_tx_queue *txq;
645 txq = dev->data->tx_queues[i];
647 if (txq->tx_deferred_start)
649 diag = fm10k_dev_tx_queue_start(dev, i);
652 for (j = 0; j < dev->data->nb_rx_queues; ++j)
653 rx_queue_clean(dev->data->rx_queues[j]);
662 fm10k_dev_stop(struct rte_eth_dev *dev)
666 PMD_INIT_FUNC_TRACE();
668 for (i = 0; i < dev->data->nb_tx_queues; i++)
669 fm10k_dev_tx_queue_stop(dev, i);
671 for (i = 0; i < dev->data->nb_rx_queues; i++)
672 fm10k_dev_rx_queue_stop(dev, i);
676 fm10k_dev_close(struct rte_eth_dev *dev)
678 struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
680 PMD_INIT_FUNC_TRACE();
682 /* Stop mailbox service first */
683 fm10k_close_mbx_service(hw);
689 fm10k_link_update(struct rte_eth_dev *dev,
690 __rte_unused int wait_to_complete)
692 PMD_INIT_FUNC_TRACE();
694 /* The host-interface link is always up. The speed is ~50Gbps per Gen3
695 * x8 PCIe interface. For now, we leave the speed undefined since there
696 * is no 50Gbps Ethernet. */
697 dev->data->dev_link.link_speed = 0;
698 dev->data->dev_link.link_duplex = ETH_LINK_FULL_DUPLEX;
699 dev->data->dev_link.link_status = 1;
705 fm10k_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
707 uint64_t ipackets, opackets, ibytes, obytes;
708 struct fm10k_hw *hw =
709 FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
710 struct fm10k_hw_stats *hw_stats =
711 FM10K_DEV_PRIVATE_TO_STATS(dev->data->dev_private);
714 PMD_INIT_FUNC_TRACE();
716 fm10k_update_hw_stats(hw, hw_stats);
718 ipackets = opackets = ibytes = obytes = 0;
719 for (i = 0; (i < RTE_ETHDEV_QUEUE_STAT_CNTRS) &&
720 (i < FM10K_MAX_QUEUES_PF); ++i) {
721 stats->q_ipackets[i] = hw_stats->q[i].rx_packets.count;
722 stats->q_opackets[i] = hw_stats->q[i].tx_packets.count;
723 stats->q_ibytes[i] = hw_stats->q[i].rx_bytes.count;
724 stats->q_obytes[i] = hw_stats->q[i].tx_bytes.count;
725 ipackets += stats->q_ipackets[i];
726 opackets += stats->q_opackets[i];
727 ibytes += stats->q_ibytes[i];
728 obytes += stats->q_obytes[i];
730 stats->ipackets = ipackets;
731 stats->opackets = opackets;
732 stats->ibytes = ibytes;
733 stats->obytes = obytes;
737 fm10k_stats_reset(struct rte_eth_dev *dev)
739 struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
740 struct fm10k_hw_stats *hw_stats =
741 FM10K_DEV_PRIVATE_TO_STATS(dev->data->dev_private);
743 PMD_INIT_FUNC_TRACE();
745 memset(hw_stats, 0, sizeof(*hw_stats));
746 fm10k_rebind_hw_stats(hw, hw_stats);
750 fm10k_dev_infos_get(struct rte_eth_dev *dev,
751 struct rte_eth_dev_info *dev_info)
753 struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
755 PMD_INIT_FUNC_TRACE();
757 dev_info->min_rx_bufsize = FM10K_MIN_RX_BUF_SIZE;
758 dev_info->max_rx_pktlen = FM10K_MAX_PKT_SIZE;
759 dev_info->max_rx_queues = hw->mac.max_queues;
760 dev_info->max_tx_queues = hw->mac.max_queues;
761 dev_info->max_mac_addrs = 1;
762 dev_info->max_hash_mac_addrs = 0;
763 dev_info->max_vfs = dev->pci_dev->max_vfs;
764 dev_info->max_vmdq_pools = ETH_64_POOLS;
765 dev_info->rx_offload_capa =
766 DEV_RX_OFFLOAD_IPV4_CKSUM |
767 DEV_RX_OFFLOAD_UDP_CKSUM |
768 DEV_RX_OFFLOAD_TCP_CKSUM;
769 dev_info->tx_offload_capa = 0;
770 dev_info->reta_size = FM10K_MAX_RSS_INDICES;
772 dev_info->default_rxconf = (struct rte_eth_rxconf) {
774 .pthresh = FM10K_DEFAULT_RX_PTHRESH,
775 .hthresh = FM10K_DEFAULT_RX_HTHRESH,
776 .wthresh = FM10K_DEFAULT_RX_WTHRESH,
778 .rx_free_thresh = FM10K_RX_FREE_THRESH_DEFAULT(0),
782 dev_info->default_txconf = (struct rte_eth_txconf) {
784 .pthresh = FM10K_DEFAULT_TX_PTHRESH,
785 .hthresh = FM10K_DEFAULT_TX_HTHRESH,
786 .wthresh = FM10K_DEFAULT_TX_WTHRESH,
788 .tx_free_thresh = FM10K_TX_FREE_THRESH_DEFAULT(0),
789 .tx_rs_thresh = FM10K_TX_RS_THRESH_DEFAULT(0),
790 .txq_flags = ETH_TXQ_FLAGS_NOMULTSEGS |
791 ETH_TXQ_FLAGS_NOOFFLOADS,
797 fm10k_vlan_filter_set(struct rte_eth_dev *dev, uint16_t vlan_id, int on)
799 struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
801 PMD_INIT_FUNC_TRACE();
803 /* @todo - add support for the VF */
804 if (hw->mac.type != fm10k_mac_pf)
807 return fm10k_update_vlan(hw, vlan_id, 0, on);
811 check_nb_desc(uint16_t min, uint16_t max, uint16_t mult, uint16_t request)
813 if ((request < min) || (request > max) || ((request % mult) != 0))
820 * Create a memzone for hardware descriptor rings. Malloc cannot be used since
821 * the physical address is required. If the memzone is already created, then
822 * this function returns a pointer to the existing memzone.
824 static inline const struct rte_memzone *
825 allocate_hw_ring(const char *driver_name, const char *ring_name,
826 uint8_t port_id, uint16_t queue_id, int socket_id,
827 uint32_t size, uint32_t align)
829 char name[RTE_MEMZONE_NAMESIZE];
830 const struct rte_memzone *mz;
832 snprintf(name, sizeof(name), "%s_%s_%d_%d_%d",
833 driver_name, ring_name, port_id, queue_id, socket_id);
835 /* return the memzone if it already exists */
836 mz = rte_memzone_lookup(name);
840 #ifdef RTE_LIBRTE_XEN_DOM0
841 return rte_memzone_reserve_bounded(name, size, socket_id, 0, align,
844 return rte_memzone_reserve_aligned(name, size, socket_id, 0, align);
849 check_thresh(uint16_t min, uint16_t max, uint16_t div, uint16_t request)
851 if ((request < min) || (request > max) || ((div % request) != 0))
858 handle_rxconf(struct fm10k_rx_queue *q, const struct rte_eth_rxconf *conf)
860 uint16_t rx_free_thresh;
862 if (conf->rx_free_thresh == 0)
863 rx_free_thresh = FM10K_RX_FREE_THRESH_DEFAULT(q);
865 rx_free_thresh = conf->rx_free_thresh;
867 /* make sure the requested threshold satisfies the constraints */
868 if (check_thresh(FM10K_RX_FREE_THRESH_MIN(q),
869 FM10K_RX_FREE_THRESH_MAX(q),
870 FM10K_RX_FREE_THRESH_DIV(q),
872 PMD_INIT_LOG(ERR, "rx_free_thresh (%u) must be "
873 "less than or equal to %u, "
874 "greater than or equal to %u, "
875 "and a divisor of %u",
876 rx_free_thresh, FM10K_RX_FREE_THRESH_MAX(q),
877 FM10K_RX_FREE_THRESH_MIN(q),
878 FM10K_RX_FREE_THRESH_DIV(q));
882 q->alloc_thresh = rx_free_thresh;
883 q->drop_en = conf->rx_drop_en;
884 q->rx_deferred_start = conf->rx_deferred_start;
890 * Hardware requires specific alignment for Rx packet buffers. At
891 * least one of the following two conditions must be satisfied.
892 * 1. Address is 512B aligned
893 * 2. Address is 8B aligned and buffer does not cross 4K boundary.
895 * As such, the driver may need to adjust the DMA address within the
896 * buffer by up to 512B. The mempool element size is checked here
897 * to make sure a maximally sized Ethernet frame can still be wholly
898 * contained within the buffer after 512B alignment.
900 * return 1 if the element size is valid, otherwise return 0.
903 mempool_element_size_valid(struct rte_mempool *mp)
907 /* elt_size includes mbuf header and headroom */
908 min_size = mp->elt_size - sizeof(struct rte_mbuf) -
909 RTE_PKTMBUF_HEADROOM;
911 /* account for up to 512B of alignment */
912 min_size -= FM10K_RX_BUFF_ALIGN;
914 /* sanity check for overflow */
915 if (min_size > mp->elt_size)
918 if (min_size < ETHER_MAX_VLAN_FRAME_LEN)
926 fm10k_rx_queue_setup(struct rte_eth_dev *dev, uint16_t queue_id,
927 uint16_t nb_desc, unsigned int socket_id,
928 const struct rte_eth_rxconf *conf, struct rte_mempool *mp)
930 struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
931 struct fm10k_rx_queue *q;
932 const struct rte_memzone *mz;
934 PMD_INIT_FUNC_TRACE();
936 /* make sure the mempool element size can account for alignment. */
937 if (!mempool_element_size_valid(mp)) {
938 PMD_INIT_LOG(ERR, "Error : Mempool element size is too small");
942 /* make sure a valid number of descriptors have been requested */
943 if (check_nb_desc(FM10K_MIN_RX_DESC, FM10K_MAX_RX_DESC,
944 FM10K_MULT_RX_DESC, nb_desc)) {
945 PMD_INIT_LOG(ERR, "Number of Rx descriptors (%u) must be "
946 "less than or equal to %"PRIu32", "
947 "greater than or equal to %u, "
948 "and a multiple of %u",
949 nb_desc, (uint32_t)FM10K_MAX_RX_DESC, FM10K_MIN_RX_DESC,
955 * if this queue existed already, free the associated memory. The
956 * queue cannot be reused in case we need to allocate memory on
957 * different socket than was previously used.
959 if (dev->data->rx_queues[queue_id] != NULL) {
960 rx_queue_free(dev->data->rx_queues[queue_id]);
961 dev->data->rx_queues[queue_id] = NULL;
964 /* allocate memory for the queue structure */
965 q = rte_zmalloc_socket("fm10k", sizeof(*q), RTE_CACHE_LINE_SIZE,
968 PMD_INIT_LOG(ERR, "Cannot allocate queue structure");
974 q->nb_desc = nb_desc;
975 q->port_id = dev->data->port_id;
976 q->queue_id = queue_id;
977 q->tail_ptr = (volatile uint32_t *)
978 &((uint32_t *)hw->hw_addr)[FM10K_RDT(queue_id)];
979 if (handle_rxconf(q, conf))
982 /* allocate memory for the software ring */
983 q->sw_ring = rte_zmalloc_socket("fm10k sw ring",
984 nb_desc * sizeof(struct rte_mbuf *),
985 RTE_CACHE_LINE_SIZE, socket_id);
986 if (q->sw_ring == NULL) {
987 PMD_INIT_LOG(ERR, "Cannot allocate software ring");
993 * allocate memory for the hardware descriptor ring. A memzone large
994 * enough to hold the maximum ring size is requested to allow for
995 * resizing in later calls to the queue setup function.
997 mz = allocate_hw_ring(dev->driver->pci_drv.name, "rx_ring",
998 dev->data->port_id, queue_id, socket_id,
999 FM10K_MAX_RX_RING_SZ, FM10K_ALIGN_RX_DESC);
1001 PMD_INIT_LOG(ERR, "Cannot allocate hardware ring");
1002 rte_free(q->sw_ring);
1006 q->hw_ring = mz->addr;
1007 q->hw_ring_phys_addr = mz->phys_addr;
1009 dev->data->rx_queues[queue_id] = q;
1014 fm10k_rx_queue_release(void *queue)
1016 PMD_INIT_FUNC_TRACE();
1018 rx_queue_free(queue);
1022 handle_txconf(struct fm10k_tx_queue *q, const struct rte_eth_txconf *conf)
1024 uint16_t tx_free_thresh;
1025 uint16_t tx_rs_thresh;
1027 /* constraint MACROs require that tx_free_thresh is configured
1028 * before tx_rs_thresh */
1029 if (conf->tx_free_thresh == 0)
1030 tx_free_thresh = FM10K_TX_FREE_THRESH_DEFAULT(q);
1032 tx_free_thresh = conf->tx_free_thresh;
1034 /* make sure the requested threshold satisfies the constraints */
1035 if (check_thresh(FM10K_TX_FREE_THRESH_MIN(q),
1036 FM10K_TX_FREE_THRESH_MAX(q),
1037 FM10K_TX_FREE_THRESH_DIV(q),
1039 PMD_INIT_LOG(ERR, "tx_free_thresh (%u) must be "
1040 "less than or equal to %u, "
1041 "greater than or equal to %u, "
1042 "and a divisor of %u",
1043 tx_free_thresh, FM10K_TX_FREE_THRESH_MAX(q),
1044 FM10K_TX_FREE_THRESH_MIN(q),
1045 FM10K_TX_FREE_THRESH_DIV(q));
1049 q->free_thresh = tx_free_thresh;
1051 if (conf->tx_rs_thresh == 0)
1052 tx_rs_thresh = FM10K_TX_RS_THRESH_DEFAULT(q);
1054 tx_rs_thresh = conf->tx_rs_thresh;
1056 q->tx_deferred_start = conf->tx_deferred_start;
1058 /* make sure the requested threshold satisfies the constraints */
1059 if (check_thresh(FM10K_TX_RS_THRESH_MIN(q),
1060 FM10K_TX_RS_THRESH_MAX(q),
1061 FM10K_TX_RS_THRESH_DIV(q),
1063 PMD_INIT_LOG(ERR, "tx_rs_thresh (%u) must be "
1064 "less than or equal to %u, "
1065 "greater than or equal to %u, "
1066 "and a divisor of %u",
1067 tx_rs_thresh, FM10K_TX_RS_THRESH_MAX(q),
1068 FM10K_TX_RS_THRESH_MIN(q),
1069 FM10K_TX_RS_THRESH_DIV(q));
1073 q->rs_thresh = tx_rs_thresh;
1079 fm10k_tx_queue_setup(struct rte_eth_dev *dev, uint16_t queue_id,
1080 uint16_t nb_desc, unsigned int socket_id,
1081 const struct rte_eth_txconf *conf)
1083 struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
1084 struct fm10k_tx_queue *q;
1085 const struct rte_memzone *mz;
1087 PMD_INIT_FUNC_TRACE();
1089 /* make sure a valid number of descriptors have been requested */
1090 if (check_nb_desc(FM10K_MIN_TX_DESC, FM10K_MAX_TX_DESC,
1091 FM10K_MULT_TX_DESC, nb_desc)) {
1092 PMD_INIT_LOG(ERR, "Number of Tx descriptors (%u) must be "
1093 "less than or equal to %"PRIu32", "
1094 "greater than or equal to %u, "
1095 "and a multiple of %u",
1096 nb_desc, (uint32_t)FM10K_MAX_TX_DESC, FM10K_MIN_TX_DESC,
1097 FM10K_MULT_TX_DESC);
1102 * if this queue existed already, free the associated memory. The
1103 * queue cannot be reused in case we need to allocate memory on
1104 * different socket than was previously used.
1106 if (dev->data->tx_queues[queue_id] != NULL) {
1107 tx_queue_free(dev->data->tx_queues[queue_id]);
1108 dev->data->tx_queues[queue_id] = NULL;
1111 /* allocate memory for the queue structure */
1112 q = rte_zmalloc_socket("fm10k", sizeof(*q), RTE_CACHE_LINE_SIZE,
1115 PMD_INIT_LOG(ERR, "Cannot allocate queue structure");
1120 q->nb_desc = nb_desc;
1121 q->port_id = dev->data->port_id;
1122 q->queue_id = queue_id;
1123 q->tail_ptr = (volatile uint32_t *)
1124 &((uint32_t *)hw->hw_addr)[FM10K_TDT(queue_id)];
1125 if (handle_txconf(q, conf))
1128 /* allocate memory for the software ring */
1129 q->sw_ring = rte_zmalloc_socket("fm10k sw ring",
1130 nb_desc * sizeof(struct rte_mbuf *),
1131 RTE_CACHE_LINE_SIZE, socket_id);
1132 if (q->sw_ring == NULL) {
1133 PMD_INIT_LOG(ERR, "Cannot allocate software ring");
1139 * allocate memory for the hardware descriptor ring. A memzone large
1140 * enough to hold the maximum ring size is requested to allow for
1141 * resizing in later calls to the queue setup function.
1143 mz = allocate_hw_ring(dev->driver->pci_drv.name, "tx_ring",
1144 dev->data->port_id, queue_id, socket_id,
1145 FM10K_MAX_TX_RING_SZ, FM10K_ALIGN_TX_DESC);
1147 PMD_INIT_LOG(ERR, "Cannot allocate hardware ring");
1148 rte_free(q->sw_ring);
1152 q->hw_ring = mz->addr;
1153 q->hw_ring_phys_addr = mz->phys_addr;
1156 * allocate memory for the RS bit tracker. Enough slots to hold the
1157 * descriptor index for each RS bit needing to be set are required.
1159 q->rs_tracker.list = rte_zmalloc_socket("fm10k rs tracker",
1160 ((nb_desc + 1) / q->rs_thresh) *
1162 RTE_CACHE_LINE_SIZE, socket_id);
1163 if (q->rs_tracker.list == NULL) {
1164 PMD_INIT_LOG(ERR, "Cannot allocate RS bit tracker");
1165 rte_free(q->sw_ring);
1170 dev->data->tx_queues[queue_id] = q;
1175 fm10k_tx_queue_release(void *queue)
1177 PMD_INIT_FUNC_TRACE();
1179 tx_queue_free(queue);
1183 fm10k_reta_update(struct rte_eth_dev *dev,
1184 struct rte_eth_rss_reta_entry64 *reta_conf,
1187 struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
1188 uint16_t i, j, idx, shift;
1192 PMD_INIT_FUNC_TRACE();
1194 if (reta_size > FM10K_MAX_RSS_INDICES) {
1195 PMD_INIT_LOG(ERR, "The size of hash lookup table configured "
1196 "(%d) doesn't match the number hardware can supported "
1197 "(%d)", reta_size, FM10K_MAX_RSS_INDICES);
1202 * Update Redirection Table RETA[n], n=0..31. The redirection table has
1203 * 128-entries in 32 registers
1205 for (i = 0; i < FM10K_MAX_RSS_INDICES; i += CHARS_PER_UINT32) {
1206 idx = i / RTE_RETA_GROUP_SIZE;
1207 shift = i % RTE_RETA_GROUP_SIZE;
1208 mask = (uint8_t)((reta_conf[idx].mask >> shift) &
1209 BIT_MASK_PER_UINT32);
1214 if (mask != BIT_MASK_PER_UINT32)
1215 reta = FM10K_READ_REG(hw, FM10K_RETA(0, i >> 2));
1217 for (j = 0; j < CHARS_PER_UINT32; j++) {
1218 if (mask & (0x1 << j)) {
1220 reta &= ~(UINT8_MAX << CHAR_BIT * j);
1221 reta |= reta_conf[idx].reta[shift + j] <<
1225 FM10K_WRITE_REG(hw, FM10K_RETA(0, i >> 2), reta);
1232 fm10k_reta_query(struct rte_eth_dev *dev,
1233 struct rte_eth_rss_reta_entry64 *reta_conf,
1236 struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
1237 uint16_t i, j, idx, shift;
1241 PMD_INIT_FUNC_TRACE();
1243 if (reta_size < FM10K_MAX_RSS_INDICES) {
1244 PMD_INIT_LOG(ERR, "The size of hash lookup table configured "
1245 "(%d) doesn't match the number hardware can supported "
1246 "(%d)", reta_size, FM10K_MAX_RSS_INDICES);
1251 * Read Redirection Table RETA[n], n=0..31. The redirection table has
1252 * 128-entries in 32 registers
1254 for (i = 0; i < FM10K_MAX_RSS_INDICES; i += CHARS_PER_UINT32) {
1255 idx = i / RTE_RETA_GROUP_SIZE;
1256 shift = i % RTE_RETA_GROUP_SIZE;
1257 mask = (uint8_t)((reta_conf[idx].mask >> shift) &
1258 BIT_MASK_PER_UINT32);
1262 reta = FM10K_READ_REG(hw, FM10K_RETA(0, i >> 2));
1263 for (j = 0; j < CHARS_PER_UINT32; j++) {
1264 if (mask & (0x1 << j))
1265 reta_conf[idx].reta[shift + j] = ((reta >>
1266 CHAR_BIT * j) & UINT8_MAX);
1274 fm10k_rss_hash_update(struct rte_eth_dev *dev,
1275 struct rte_eth_rss_conf *rss_conf)
1277 struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
1278 uint32_t *key = (uint32_t *)rss_conf->rss_key;
1280 uint64_t hf = rss_conf->rss_hf;
1283 PMD_INIT_FUNC_TRACE();
1285 if (rss_conf->rss_key_len < FM10K_RSSRK_SIZE *
1286 FM10K_RSSRK_ENTRIES_PER_REG)
1293 mrqc |= (hf & ETH_RSS_IPV4) ? FM10K_MRQC_IPV4 : 0;
1294 mrqc |= (hf & ETH_RSS_IPV6) ? FM10K_MRQC_IPV6 : 0;
1295 mrqc |= (hf & ETH_RSS_IPV6_EX) ? FM10K_MRQC_IPV6 : 0;
1296 mrqc |= (hf & ETH_RSS_NONFRAG_IPV4_TCP) ? FM10K_MRQC_TCP_IPV4 : 0;
1297 mrqc |= (hf & ETH_RSS_NONFRAG_IPV6_TCP) ? FM10K_MRQC_TCP_IPV6 : 0;
1298 mrqc |= (hf & ETH_RSS_IPV6_TCP_EX) ? FM10K_MRQC_TCP_IPV6 : 0;
1299 mrqc |= (hf & ETH_RSS_NONFRAG_IPV4_UDP) ? FM10K_MRQC_UDP_IPV4 : 0;
1300 mrqc |= (hf & ETH_RSS_NONFRAG_IPV6_UDP) ? FM10K_MRQC_UDP_IPV6 : 0;
1301 mrqc |= (hf & ETH_RSS_IPV6_UDP_EX) ? FM10K_MRQC_UDP_IPV6 : 0;
1303 /* If the mapping doesn't fit any supported, return */
1308 for (i = 0; i < FM10K_RSSRK_SIZE; ++i)
1309 FM10K_WRITE_REG(hw, FM10K_RSSRK(0, i), key[i]);
1311 FM10K_WRITE_REG(hw, FM10K_MRQC(0), mrqc);
1317 fm10k_rss_hash_conf_get(struct rte_eth_dev *dev,
1318 struct rte_eth_rss_conf *rss_conf)
1320 struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
1321 uint32_t *key = (uint32_t *)rss_conf->rss_key;
1326 PMD_INIT_FUNC_TRACE();
1328 if (rss_conf->rss_key_len < FM10K_RSSRK_SIZE *
1329 FM10K_RSSRK_ENTRIES_PER_REG)
1333 for (i = 0; i < FM10K_RSSRK_SIZE; ++i)
1334 key[i] = FM10K_READ_REG(hw, FM10K_RSSRK(0, i));
1336 mrqc = FM10K_READ_REG(hw, FM10K_MRQC(0));
1338 hf |= (mrqc & FM10K_MRQC_IPV4) ? ETH_RSS_IPV4 : 0;
1339 hf |= (mrqc & FM10K_MRQC_IPV6) ? ETH_RSS_IPV6 : 0;
1340 hf |= (mrqc & FM10K_MRQC_IPV6) ? ETH_RSS_IPV6_EX : 0;
1341 hf |= (mrqc & FM10K_MRQC_TCP_IPV4) ? ETH_RSS_NONFRAG_IPV4_TCP : 0;
1342 hf |= (mrqc & FM10K_MRQC_TCP_IPV6) ? ETH_RSS_NONFRAG_IPV6_TCP : 0;
1343 hf |= (mrqc & FM10K_MRQC_TCP_IPV6) ? ETH_RSS_IPV6_TCP_EX : 0;
1344 hf |= (mrqc & FM10K_MRQC_UDP_IPV4) ? ETH_RSS_NONFRAG_IPV4_UDP : 0;
1345 hf |= (mrqc & FM10K_MRQC_UDP_IPV6) ? ETH_RSS_NONFRAG_IPV6_UDP : 0;
1346 hf |= (mrqc & FM10K_MRQC_UDP_IPV6) ? ETH_RSS_IPV6_UDP_EX : 0;
1348 rss_conf->rss_hf = hf;
1354 fm10k_dev_enable_intr_pf(struct rte_eth_dev *dev)
1356 struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
1357 uint32_t int_map = FM10K_INT_MAP_IMMEDIATE;
1359 /* Bind all local non-queue interrupt to vector 0 */
1362 FM10K_WRITE_REG(hw, FM10K_INT_MAP(fm10k_int_Mailbox), int_map);
1363 FM10K_WRITE_REG(hw, FM10K_INT_MAP(fm10k_int_PCIeFault), int_map);
1364 FM10K_WRITE_REG(hw, FM10K_INT_MAP(fm10k_int_SwitchUpDown), int_map);
1365 FM10K_WRITE_REG(hw, FM10K_INT_MAP(fm10k_int_SwitchEvent), int_map);
1366 FM10K_WRITE_REG(hw, FM10K_INT_MAP(fm10k_int_SRAM), int_map);
1367 FM10K_WRITE_REG(hw, FM10K_INT_MAP(fm10k_int_VFLR), int_map);
1369 /* Enable misc causes */
1370 FM10K_WRITE_REG(hw, FM10K_EIMR, FM10K_EIMR_ENABLE(PCA_FAULT) |
1371 FM10K_EIMR_ENABLE(THI_FAULT) |
1372 FM10K_EIMR_ENABLE(FUM_FAULT) |
1373 FM10K_EIMR_ENABLE(MAILBOX) |
1374 FM10K_EIMR_ENABLE(SWITCHREADY) |
1375 FM10K_EIMR_ENABLE(SWITCHNOTREADY) |
1376 FM10K_EIMR_ENABLE(SRAMERROR) |
1377 FM10K_EIMR_ENABLE(VFLR));
1380 FM10K_WRITE_REG(hw, FM10K_ITR(0), FM10K_ITR_AUTOMASK |
1381 FM10K_ITR_MASK_CLEAR);
1382 FM10K_WRITE_FLUSH(hw);
1386 fm10k_dev_enable_intr_vf(struct rte_eth_dev *dev)
1388 struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
1389 uint32_t int_map = FM10K_INT_MAP_IMMEDIATE;
1391 /* Bind all local non-queue interrupt to vector 0 */
1394 /* Only INT 0 available, other 15 are reserved. */
1395 FM10K_WRITE_REG(hw, FM10K_VFINT_MAP, int_map);
1398 FM10K_WRITE_REG(hw, FM10K_VFITR(0), FM10K_ITR_AUTOMASK |
1399 FM10K_ITR_MASK_CLEAR);
1400 FM10K_WRITE_FLUSH(hw);
1404 fm10k_dev_handle_fault(struct fm10k_hw *hw, uint32_t eicr)
1406 struct fm10k_fault fault;
1408 const char *estr = "Unknown error";
1410 /* Process PCA fault */
1411 if (eicr & FM10K_EIMR_PCA_FAULT) {
1412 err = fm10k_get_fault(hw, FM10K_PCA_FAULT, &fault);
1415 switch (fault.type) {
1417 estr = "PCA_NO_FAULT"; break;
1418 case PCA_UNMAPPED_ADDR:
1419 estr = "PCA_UNMAPPED_ADDR"; break;
1420 case PCA_BAD_QACCESS_PF:
1421 estr = "PCA_BAD_QACCESS_PF"; break;
1422 case PCA_BAD_QACCESS_VF:
1423 estr = "PCA_BAD_QACCESS_VF"; break;
1424 case PCA_MALICIOUS_REQ:
1425 estr = "PCA_MALICIOUS_REQ"; break;
1426 case PCA_POISONED_TLP:
1427 estr = "PCA_POISONED_TLP"; break;
1429 estr = "PCA_TLP_ABORT"; break;
1433 PMD_INIT_LOG(ERR, "%s: %s(%d) Addr:0x%"PRIx64" Spec: 0x%x",
1434 estr, fault.func ? "VF" : "PF", fault.func,
1435 fault.address, fault.specinfo);
1438 /* Process THI fault */
1439 if (eicr & FM10K_EIMR_THI_FAULT) {
1440 err = fm10k_get_fault(hw, FM10K_THI_FAULT, &fault);
1443 switch (fault.type) {
1445 estr = "THI_NO_FAULT"; break;
1446 case THI_MAL_DIS_Q_FAULT:
1447 estr = "THI_MAL_DIS_Q_FAULT"; break;
1451 PMD_INIT_LOG(ERR, "%s: %s(%d) Addr:0x%"PRIx64" Spec: 0x%x",
1452 estr, fault.func ? "VF" : "PF", fault.func,
1453 fault.address, fault.specinfo);
1456 /* Process FUM fault */
1457 if (eicr & FM10K_EIMR_FUM_FAULT) {
1458 err = fm10k_get_fault(hw, FM10K_FUM_FAULT, &fault);
1461 switch (fault.type) {
1463 estr = "FUM_NO_FAULT"; break;
1464 case FUM_UNMAPPED_ADDR:
1465 estr = "FUM_UNMAPPED_ADDR"; break;
1466 case FUM_POISONED_TLP:
1467 estr = "FUM_POISONED_TLP"; break;
1468 case FUM_BAD_VF_QACCESS:
1469 estr = "FUM_BAD_VF_QACCESS"; break;
1470 case FUM_ADD_DECODE_ERR:
1471 estr = "FUM_ADD_DECODE_ERR"; break;
1473 estr = "FUM_RO_ERROR"; break;
1474 case FUM_QPRC_CRC_ERROR:
1475 estr = "FUM_QPRC_CRC_ERROR"; break;
1476 case FUM_CSR_TIMEOUT:
1477 estr = "FUM_CSR_TIMEOUT"; break;
1478 case FUM_INVALID_TYPE:
1479 estr = "FUM_INVALID_TYPE"; break;
1480 case FUM_INVALID_LENGTH:
1481 estr = "FUM_INVALID_LENGTH"; break;
1482 case FUM_INVALID_BE:
1483 estr = "FUM_INVALID_BE"; break;
1484 case FUM_INVALID_ALIGN:
1485 estr = "FUM_INVALID_ALIGN"; break;
1489 PMD_INIT_LOG(ERR, "%s: %s(%d) Addr:0x%"PRIx64" Spec: 0x%x",
1490 estr, fault.func ? "VF" : "PF", fault.func,
1491 fault.address, fault.specinfo);
1498 PMD_INIT_LOG(ERR, "Failed to handle fault event.");
1503 * PF interrupt handler triggered by NIC for handling specific interrupt.
1506 * Pointer to interrupt handle.
1508 * The address of parameter (struct rte_eth_dev *) regsitered before.
1514 fm10k_dev_interrupt_handler_pf(
1515 __rte_unused struct rte_intr_handle *handle,
1518 struct rte_eth_dev *dev = (struct rte_eth_dev *)param;
1519 struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
1520 uint32_t cause, status;
1522 if (hw->mac.type != fm10k_mac_pf)
1525 cause = FM10K_READ_REG(hw, FM10K_EICR);
1527 /* Handle PCI fault cases */
1528 if (cause & FM10K_EICR_FAULT_MASK) {
1529 PMD_INIT_LOG(ERR, "INT: find fault!");
1530 fm10k_dev_handle_fault(hw, cause);
1533 /* Handle switch up/down */
1534 if (cause & FM10K_EICR_SWITCHNOTREADY)
1535 PMD_INIT_LOG(ERR, "INT: Switch is not ready");
1537 if (cause & FM10K_EICR_SWITCHREADY)
1538 PMD_INIT_LOG(INFO, "INT: Switch is ready");
1540 /* Handle mailbox message */
1542 hw->mbx.ops.process(hw, &hw->mbx);
1543 fm10k_mbx_unlock(hw);
1545 /* Handle SRAM error */
1546 if (cause & FM10K_EICR_SRAMERROR) {
1547 PMD_INIT_LOG(ERR, "INT: SRAM error on PEP");
1549 status = FM10K_READ_REG(hw, FM10K_SRAM_IP);
1550 /* Write to clear pending bits */
1551 FM10K_WRITE_REG(hw, FM10K_SRAM_IP, status);
1553 /* Todo: print out error message after shared code updates */
1556 /* Clear these 3 events if having any */
1557 cause &= FM10K_EICR_SWITCHNOTREADY | FM10K_EICR_MAILBOX |
1558 FM10K_EICR_SWITCHREADY;
1560 FM10K_WRITE_REG(hw, FM10K_EICR, cause);
1562 /* Re-enable interrupt from device side */
1563 FM10K_WRITE_REG(hw, FM10K_ITR(0), FM10K_ITR_AUTOMASK |
1564 FM10K_ITR_MASK_CLEAR);
1565 /* Re-enable interrupt from host side */
1566 rte_intr_enable(&(dev->pci_dev->intr_handle));
1570 * VF interrupt handler triggered by NIC for handling specific interrupt.
1573 * Pointer to interrupt handle.
1575 * The address of parameter (struct rte_eth_dev *) regsitered before.
1581 fm10k_dev_interrupt_handler_vf(
1582 __rte_unused struct rte_intr_handle *handle,
1585 struct rte_eth_dev *dev = (struct rte_eth_dev *)param;
1586 struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
1588 if (hw->mac.type != fm10k_mac_vf)
1591 /* Handle mailbox message if lock is acquired */
1593 hw->mbx.ops.process(hw, &hw->mbx);
1594 fm10k_mbx_unlock(hw);
1596 /* Re-enable interrupt from device side */
1597 FM10K_WRITE_REG(hw, FM10K_VFITR(0), FM10K_ITR_AUTOMASK |
1598 FM10K_ITR_MASK_CLEAR);
1599 /* Re-enable interrupt from host side */
1600 rte_intr_enable(&(dev->pci_dev->intr_handle));
1603 /* Mailbox message handler in VF */
1604 static const struct fm10k_msg_data fm10k_msgdata_vf[] = {
1605 FM10K_TLV_MSG_TEST_HANDLER(fm10k_tlv_msg_test),
1606 FM10K_VF_MSG_MAC_VLAN_HANDLER(fm10k_msg_mac_vlan_vf),
1607 FM10K_VF_MSG_LPORT_STATE_HANDLER(fm10k_msg_lport_state_vf),
1608 FM10K_TLV_MSG_ERROR_HANDLER(fm10k_tlv_msg_error),
1611 /* Mailbox message handler in PF */
1612 static const struct fm10k_msg_data fm10k_msgdata_pf[] = {
1613 FM10K_PF_MSG_ERR_HANDLER(XCAST_MODES, fm10k_msg_err_pf),
1614 FM10K_PF_MSG_ERR_HANDLER(UPDATE_MAC_FWD_RULE, fm10k_msg_err_pf),
1615 FM10K_PF_MSG_LPORT_MAP_HANDLER(fm10k_msg_lport_map_pf),
1616 FM10K_PF_MSG_ERR_HANDLER(LPORT_CREATE, fm10k_msg_err_pf),
1617 FM10K_PF_MSG_ERR_HANDLER(LPORT_DELETE, fm10k_msg_err_pf),
1618 FM10K_PF_MSG_UPDATE_PVID_HANDLER(fm10k_msg_update_pvid_pf),
1619 FM10K_TLV_MSG_ERROR_HANDLER(fm10k_tlv_msg_error),
1623 fm10k_setup_mbx_service(struct fm10k_hw *hw)
1627 /* Initialize mailbox lock */
1628 fm10k_mbx_initlock(hw);
1630 /* Replace default message handler with new ones */
1631 if (hw->mac.type == fm10k_mac_pf)
1632 err = hw->mbx.ops.register_handlers(&hw->mbx, fm10k_msgdata_pf);
1634 err = hw->mbx.ops.register_handlers(&hw->mbx, fm10k_msgdata_vf);
1637 PMD_INIT_LOG(ERR, "Failed to register mailbox handler.err:%d",
1641 /* Connect to SM for PF device or PF for VF device */
1642 return hw->mbx.ops.connect(hw, &hw->mbx);
1646 fm10k_close_mbx_service(struct fm10k_hw *hw)
1648 /* Disconnect from SM for PF device or PF for VF device */
1649 hw->mbx.ops.disconnect(hw, &hw->mbx);
1652 static const struct eth_dev_ops fm10k_eth_dev_ops = {
1653 .dev_configure = fm10k_dev_configure,
1654 .dev_start = fm10k_dev_start,
1655 .dev_stop = fm10k_dev_stop,
1656 .dev_close = fm10k_dev_close,
1657 .stats_get = fm10k_stats_get,
1658 .stats_reset = fm10k_stats_reset,
1659 .link_update = fm10k_link_update,
1660 .dev_infos_get = fm10k_dev_infos_get,
1661 .vlan_filter_set = fm10k_vlan_filter_set,
1662 .rx_queue_start = fm10k_dev_rx_queue_start,
1663 .rx_queue_stop = fm10k_dev_rx_queue_stop,
1664 .tx_queue_start = fm10k_dev_tx_queue_start,
1665 .tx_queue_stop = fm10k_dev_tx_queue_stop,
1666 .rx_queue_setup = fm10k_rx_queue_setup,
1667 .rx_queue_release = fm10k_rx_queue_release,
1668 .tx_queue_setup = fm10k_tx_queue_setup,
1669 .tx_queue_release = fm10k_tx_queue_release,
1670 .reta_update = fm10k_reta_update,
1671 .reta_query = fm10k_reta_query,
1672 .rss_hash_update = fm10k_rss_hash_update,
1673 .rss_hash_conf_get = fm10k_rss_hash_conf_get,
1677 eth_fm10k_dev_init(struct rte_eth_dev *dev)
1679 struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
1682 PMD_INIT_FUNC_TRACE();
1684 dev->dev_ops = &fm10k_eth_dev_ops;
1685 dev->rx_pkt_burst = &fm10k_recv_pkts;
1686 dev->tx_pkt_burst = &fm10k_xmit_pkts;
1688 if (dev->data->scattered_rx)
1689 dev->rx_pkt_burst = &fm10k_recv_scattered_pkts;
1691 /* only initialize in the primary process */
1692 if (rte_eal_process_type() != RTE_PROC_PRIMARY)
1695 /* Vendor and Device ID need to be set before init of shared code */
1696 memset(hw, 0, sizeof(*hw));
1697 hw->device_id = dev->pci_dev->id.device_id;
1698 hw->vendor_id = dev->pci_dev->id.vendor_id;
1699 hw->subsystem_device_id = dev->pci_dev->id.subsystem_device_id;
1700 hw->subsystem_vendor_id = dev->pci_dev->id.subsystem_vendor_id;
1701 hw->revision_id = 0;
1702 hw->hw_addr = (void *)dev->pci_dev->mem_resource[0].addr;
1703 if (hw->hw_addr == NULL) {
1704 PMD_INIT_LOG(ERR, "Bad mem resource."
1705 " Try to blacklist unused devices.");
1709 /* Store fm10k_adapter pointer */
1710 hw->back = dev->data->dev_private;
1712 /* Initialize the shared code */
1713 diag = fm10k_init_shared_code(hw);
1714 if (diag != FM10K_SUCCESS) {
1715 PMD_INIT_LOG(ERR, "Shared code init failed: %d", diag);
1720 * Inialize bus info. Normally we would call fm10k_get_bus_info(), but
1721 * there is no way to get link status without reading BAR4. Until this
1722 * works, assume we have maximum bandwidth.
1723 * @todo - fix bus info
1725 hw->bus_caps.speed = fm10k_bus_speed_8000;
1726 hw->bus_caps.width = fm10k_bus_width_pcie_x8;
1727 hw->bus_caps.payload = fm10k_bus_payload_512;
1728 hw->bus.speed = fm10k_bus_speed_8000;
1729 hw->bus.width = fm10k_bus_width_pcie_x8;
1730 hw->bus.payload = fm10k_bus_payload_256;
1732 /* Initialize the hw */
1733 diag = fm10k_init_hw(hw);
1734 if (diag != FM10K_SUCCESS) {
1735 PMD_INIT_LOG(ERR, "Hardware init failed: %d", diag);
1739 /* Initialize MAC address(es) */
1740 dev->data->mac_addrs = rte_zmalloc("fm10k", ETHER_ADDR_LEN, 0);
1741 if (dev->data->mac_addrs == NULL) {
1742 PMD_INIT_LOG(ERR, "Cannot allocate memory for MAC addresses");
1746 diag = fm10k_read_mac_addr(hw);
1747 if (diag != FM10K_SUCCESS) {
1749 * TODO: remove special handling on VF. Need shared code to
1752 if (hw->mac.type == fm10k_mac_pf) {
1753 PMD_INIT_LOG(ERR, "Read MAC addr failed: %d", diag);
1756 /* Generate a random addr */
1757 eth_random_addr(hw->mac.addr);
1758 memcpy(hw->mac.perm_addr, hw->mac.addr, ETH_ALEN);
1762 ether_addr_copy((const struct ether_addr *)hw->mac.addr,
1763 &dev->data->mac_addrs[0]);
1765 /* Reset the hw statistics */
1766 fm10k_stats_reset(dev);
1769 diag = fm10k_reset_hw(hw);
1770 if (diag != FM10K_SUCCESS) {
1771 PMD_INIT_LOG(ERR, "Hardware reset failed: %d", diag);
1775 /* Setup mailbox service */
1776 diag = fm10k_setup_mbx_service(hw);
1777 if (diag != FM10K_SUCCESS) {
1778 PMD_INIT_LOG(ERR, "Failed to setup mailbox: %d", diag);
1782 /*PF/VF has different interrupt handling mechanism */
1783 if (hw->mac.type == fm10k_mac_pf) {
1784 /* register callback func to eal lib */
1785 rte_intr_callback_register(&(dev->pci_dev->intr_handle),
1786 fm10k_dev_interrupt_handler_pf, (void *)dev);
1788 /* enable MISC interrupt */
1789 fm10k_dev_enable_intr_pf(dev);
1791 rte_intr_callback_register(&(dev->pci_dev->intr_handle),
1792 fm10k_dev_interrupt_handler_vf, (void *)dev);
1794 fm10k_dev_enable_intr_vf(dev);
1798 * Below function will trigger operations on mailbox, acquire lock to
1799 * avoid race condition from interrupt handler. Operations on mailbox
1800 * FIFO will trigger interrupt to PF/SM, in which interrupt handler
1801 * will handle and generate an interrupt to our side. Then, FIFO in
1802 * mailbox will be touched.
1805 /* Enable port first */
1806 hw->mac.ops.update_lport_state(hw, 0, 0, 1);
1808 /* Update default vlan */
1809 hw->mac.ops.update_vlan(hw, hw->mac.default_vid, 0, true);
1812 * Add default mac/vlan filter. glort is assigned by SM for PF, while is
1813 * unused for VF. PF will assign correct glort for VF.
1815 hw->mac.ops.update_uc_addr(hw, hw->mac.dglort_map, hw->mac.addr,
1816 hw->mac.default_vid, 1, 0);
1818 /* Set unicast mode by default. App can change to other mode in other
1821 hw->mac.ops.update_xcast_mode(hw, hw->mac.dglort_map,
1822 FM10K_XCAST_MODE_MULTI);
1824 fm10k_mbx_unlock(hw);
1826 /* enable uio intr after callback registered */
1827 rte_intr_enable(&(dev->pci_dev->intr_handle));
1833 * The set of PCI devices this driver supports. This driver will enable both PF
1834 * and SRIOV-VF devices.
1836 static const struct rte_pci_id pci_id_fm10k_map[] = {
1837 #define RTE_PCI_DEV_ID_DECL_FM10K(vend, dev) { RTE_PCI_DEVICE(vend, dev) },
1838 #define RTE_PCI_DEV_ID_DECL_FM10KVF(vend, dev) { RTE_PCI_DEVICE(vend, dev) },
1839 #include "rte_pci_dev_ids.h"
1840 { .vendor_id = 0, /* sentinel */ },
1843 static struct eth_driver rte_pmd_fm10k = {
1845 .name = "rte_pmd_fm10k",
1846 .id_table = pci_id_fm10k_map,
1847 .drv_flags = RTE_PCI_DRV_NEED_MAPPING,
1849 .eth_dev_init = eth_fm10k_dev_init,
1850 .dev_private_size = sizeof(struct fm10k_adapter),
1854 * Driver initialization routine.
1855 * Invoked once at EAL init time.
1856 * Register itself as the [Poll Mode] Driver of PCI FM10K devices.
1859 rte_pmd_fm10k_init(__rte_unused const char *name,
1860 __rte_unused const char *params)
1862 PMD_INIT_FUNC_TRACE();
1863 rte_eth_driver_register(&rte_pmd_fm10k);
1867 static struct rte_driver rte_fm10k_driver = {
1869 .init = rte_pmd_fm10k_init,
1872 PMD_REGISTER_DRIVER(rte_fm10k_driver);