1 .. SPDX-License-Identifier: BSD-3-Clause
2 Copyright(c) 2014-2018 Chelsio Communications.
8 The CXGBE PMD (**librte_pmd_cxgbe**) provides poll mode driver support
9 for **Chelsio Terminator** 10/25/40/100 Gbps family of adapters. CXGBE PMD
10 has support for the latest Linux and FreeBSD operating systems.
12 CXGBEVF PMD provides poll mode driver support for SR-IOV Virtual functions
13 and has support for the latest Linux operating systems.
15 More information can be found at `Chelsio Communications Official Website
16 <http://www.chelsio.com>`_.
21 CXGBE and CXGBEVF PMD has support for:
23 - Multiple queues for TX and RX
24 - Receiver Side Steering (RSS)
25 Receiver Side Steering (RSS) on IPv4, IPv6, IPv4-TCP/UDP, IPv6-TCP/UDP.
26 For 4-tuple, enabling 'RSS on TCP' and 'RSS on TCP + UDP' is supported.
31 - Port hardware statistics
33 - Flow API - Support for both Wildcard (LE-TCAM) and Exact (HASH) match filters.
38 The Chelsio Terminator series of devices provide two/four ports but
39 expose a single PCI bus address, thus, librte_pmd_cxgbe registers
40 itself as a PCI driver that allocates one Ethernet device per detected
43 For this reason, one cannot whitelist/blacklist a single port without
44 whitelisting/blacklisting the other ports on the same device.
48 Supported Chelsio T5 NICs
49 -------------------------
52 - 10G NICs: T520-BT, T520-CR, T520-LL-CR, T520-SO-CR, T540-CR
53 - 40G NICs: T580-CR, T580-LP-CR, T580-SO-CR
54 - Other T5 NICs: T522-CR
58 Supported Chelsio T6 NICs
59 -------------------------
61 - 25G NICs: T6425-CR, T6225-CR, T6225-LL-CR, T6225-SO-CR
62 - 100G NICs: T62100-CR, T62100-LP-CR, T62100-SO-CR
64 Supported SR-IOV Chelsio NICs
65 -----------------------------
67 SR-IOV virtual functions are supported on all the Chelsio NICs listed
68 in :ref:`t5-nics` and :ref:`t6-nics`.
73 - Requires firmware version **1.23.4.0** and higher. Visit
74 `Chelsio Download Center <http://service.chelsio.com>`_ to get latest firmware
75 bundled with the latest Chelsio Unified Wire package.
77 For Linux, installing and loading the latest cxgb4 kernel driver from the
78 Chelsio Unified Wire package should get you the latest firmware. More
79 information can be obtained from the User Guide that is bundled with the
80 Chelsio Unified Wire package.
82 For FreeBSD, the latest firmware obtained from the Chelsio Unified Wire
83 package must be manually flashed via cxgbetool available in FreeBSD source
86 Instructions on how to manually flash the firmware are given in section
87 :ref:`linux-installation` for Linux and section :ref:`freebsd-installation`
90 Pre-Installation Configuration
91 ------------------------------
96 The following options can be modified in the ``.config`` file. Please note that
97 enabling debugging options may affect system performance.
99 - ``CONFIG_RTE_LIBRTE_CXGBE_PMD`` (default **y**)
101 Toggle compilation of librte_pmd_cxgbe driver.
105 This controls compilation of both CXGBE and CXGBEVF PMD.
110 The following ``devargs`` options can be enabled at runtime. They must
111 be passed as part of EAL arguments. For example,
113 .. code-block:: console
115 testpmd -w 02:00.4,keep_ovlan=1 -- -i
117 Common Runtime Options
118 ^^^^^^^^^^^^^^^^^^^^^^
120 - ``keep_ovlan`` (default **0**)
122 Toggle behavior to keep/strip outer VLAN in Q-in-Q packets. If
123 enabled, the outer VLAN tag is preserved in Q-in-Q packets. Otherwise,
124 the outer VLAN tag is stripped in Q-in-Q packets.
126 - ``tx_mode_latency`` (default **0**)
128 When set to 1, Tx doesn't wait for max number of packets to get
129 coalesced and sends the packets immediately at the end of the
130 current Tx burst. When set to 0, Tx waits across multiple Tx bursts
131 until the max number of packets have been coalesced. In this case,
132 Tx only sends the coalesced packets to hardware once the max
133 coalesce limit has been reached.
135 CXGBE VF Only Runtime Options
136 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
138 - ``force_link_up`` (default **0**)
140 When set to 1, CXGBEVF PMD always forces link as up for all VFs on
141 underlying Chelsio NICs. This enables multiple VFs on the same NIC
142 to send traffic to each other even when the physical link is down.
144 .. _driver-compilation:
146 Driver compilation and testing
147 ------------------------------
149 Refer to the document :ref:`compiling and testing a PMD for a NIC <pmd_build_and_test>`
155 .. _linux-installation:
160 Steps to manually install the latest firmware from the downloaded Chelsio
161 Unified Wire package for Linux operating system are as follows:
163 #. Load the kernel module:
165 .. code-block:: console
169 #. Use ifconfig to get the interface name assigned to Chelsio card:
171 .. code-block:: console
173 ifconfig -a | grep "00:07:43"
177 .. code-block:: console
179 p1p1 Link encap:Ethernet HWaddr 00:07:43:2D:EA:C0
180 p1p2 Link encap:Ethernet HWaddr 00:07:43:2D:EA:C8
184 .. code-block:: console
186 cd <path_to_uwire>/tools/cxgbtool
189 #. Use cxgbtool to load the firmware config file onto the card:
191 .. code-block:: console
193 cxgbtool p1p1 loadcfg <path_to_uwire>/src/network/firmware/t5-config.txt
195 #. Use cxgbtool to load the firmware image onto the card:
197 .. code-block:: console
199 cxgbtool p1p1 loadfw <path_to_uwire>/src/network/firmware/t5fw-*.bin
201 #. Unload and reload the kernel module:
203 .. code-block:: console
208 #. Verify with ethtool:
210 .. code-block:: console
212 ethtool -i p1p1 | grep "firmware"
216 .. code-block:: console
218 firmware-version: 1.23.4.0, TP 0.1.23.2
223 This section demonstrates how to launch **testpmd** with Chelsio
224 devices managed by librte_pmd_cxgbe in Linux operating system.
226 #. Load the kernel module:
228 .. code-block:: console
232 #. Get the PCI bus addresses of the interfaces bound to cxgb4 driver:
234 .. code-block:: console
240 .. code-block:: console
242 cxgb4 0000:02:00.4 p1p1: renamed from eth0
243 cxgb4 0000:02:00.4 p1p2: renamed from eth1
247 Both the interfaces of a Chelsio 2-port adapter are bound to the
248 same PCI bus address.
250 #. Unload the kernel module:
252 .. code-block:: console
254 modprobe -ar cxgb4 csiostor
258 Follow instructions available in the document
259 :ref:`compiling and testing a PMD for a NIC <pmd_build_and_test>`
264 Currently, CXGBE PMD only supports the binding of PF4 for Chelsio NICs.
268 .. code-block:: console
271 EAL: PCI device 0000:02:00.4 on NUMA socket -1
272 EAL: probe driver: 1425:5401 rte_cxgbe_pmd
273 EAL: PCI memory mapped at 0x7fd7c0200000
274 EAL: PCI memory mapped at 0x7fd77cdfd000
275 EAL: PCI memory mapped at 0x7fd7c10b7000
276 PMD: rte_cxgbe_pmd: fw: 1.23.4.0, TP: 0.1.23.2
277 PMD: rte_cxgbe_pmd: Coming up as MASTER: Initializing adapter
278 Interactive-mode selected
279 Configuring Port 0 (socket 0)
280 Port 0: 00:07:43:2D:EA:C0
281 Configuring Port 1 (socket 0)
282 Port 1: 00:07:43:2D:EA:C8
283 Checking link statuses...
284 PMD: rte_cxgbe_pmd: Port0: passive DA port module inserted
285 PMD: rte_cxgbe_pmd: Port1: passive DA port module inserted
286 Port 0 Link Up - speed 10000 Mbps - full-duplex
287 Port 1 Link Up - speed 10000 Mbps - full-duplex
293 Flow control pause TX/RX is disabled by default and can be enabled via
294 testpmd. Refer section :ref:`flow-control` for more details.
296 Configuring SR-IOV Virtual Functions
297 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
299 This section demonstrates how to enable SR-IOV virtual functions
300 on Chelsio NICs and demonstrates how to run testpmd with SR-IOV
303 #. Load the kernel module:
305 .. code-block:: console
309 #. Get the PCI bus addresses of the interfaces bound to cxgb4 driver:
311 .. code-block:: console
317 .. code-block:: console
319 cxgb4 0000:02:00.4 p1p1: renamed from eth0
320 cxgb4 0000:02:00.4 p1p2: renamed from eth1
324 Both the interfaces of a Chelsio 2-port adapter are bound to the
325 same PCI bus address.
327 #. Use ifconfig to get the interface name assigned to Chelsio card:
329 .. code-block:: console
331 ifconfig -a | grep "00:07:43"
335 .. code-block:: console
337 p1p1 Link encap:Ethernet HWaddr 00:07:43:2D:EA:C0
338 p1p2 Link encap:Ethernet HWaddr 00:07:43:2D:EA:C8
340 #. Bring up the interfaces:
342 .. code-block:: console
347 #. Instantiate SR-IOV Virtual Functions. PF0..3 can be used for
348 SR-IOV VFs. Multiple VFs can be instantiated on each of PF0..3.
349 To instantiate one SR-IOV VF on each PF0 and PF1:
351 .. code-block:: console
353 echo 1 > /sys/bus/pci/devices/0000\:02\:00.0/sriov_numvfs
354 echo 1 > /sys/bus/pci/devices/0000\:02\:00.1/sriov_numvfs
356 #. Get the PCI bus addresses of the virtual functions:
358 .. code-block:: console
360 lspci | grep -i "Chelsio" | grep -i "VF"
364 .. code-block:: console
366 02:01.0 Ethernet controller: Chelsio Communications Inc T540-CR Unified Wire Ethernet Controller [VF]
367 02:01.1 Ethernet controller: Chelsio Communications Inc T540-CR Unified Wire Ethernet Controller [VF]
371 Follow instructions available in the document
372 :ref:`compiling and testing a PMD for a NIC <pmd_build_and_test>`
373 to bind virtual functions and run testpmd.
377 .. code-block:: console
380 EAL: PCI device 0000:02:01.0 on NUMA socket 0
381 EAL: probe driver: 1425:5803 net_cxgbevf
382 PMD: rte_cxgbe_pmd: Firmware version: 1.23.4.0
383 PMD: rte_cxgbe_pmd: TP Microcode version: 0.1.23.2
384 PMD: rte_cxgbe_pmd: Chelsio rev 0
385 PMD: rte_cxgbe_pmd: No bootstrap loaded
386 PMD: rte_cxgbe_pmd: No Expansion ROM loaded
387 PMD: rte_cxgbe_pmd: 0000:02:01.0 Chelsio rev 0 1G/10GBASE-SFP
388 EAL: PCI device 0000:02:01.1 on NUMA socket 0
389 EAL: probe driver: 1425:5803 net_cxgbevf
390 PMD: rte_cxgbe_pmd: Firmware version: 1.23.4.0
391 PMD: rte_cxgbe_pmd: TP Microcode version: 0.1.23.2
392 PMD: rte_cxgbe_pmd: Chelsio rev 0
393 PMD: rte_cxgbe_pmd: No bootstrap loaded
394 PMD: rte_cxgbe_pmd: No Expansion ROM loaded
395 PMD: rte_cxgbe_pmd: 0000:02:01.1 Chelsio rev 0 1G/10GBASE-SFP
396 Configuring Port 0 (socket 0)
397 Port 0: 06:44:29:44:40:00
398 Configuring Port 1 (socket 0)
399 Port 1: 06:44:29:44:40:10
400 Checking link statuses...
407 .. _freebsd-installation:
412 Steps to manually install the latest firmware from the downloaded Chelsio
413 Unified Wire package for FreeBSD operating system are as follows:
415 #. Load the kernel module:
417 .. code-block:: console
421 #. Use dmesg to get the t5nex instance assigned to the Chelsio card:
423 .. code-block:: console
429 .. code-block:: console
431 t5nex0: <Chelsio T520-CR> irq 16 at device 0.4 on pci2
432 cxl0: <port 0> on t5nex0
433 cxl1: <port 1> on t5nex0
434 t5nex0: PCIe x8, 2 ports, 14 MSI-X interrupts, 31 eq, 13 iq
436 In the example above, a Chelsio T520-CR card is bound to a t5nex0 instance.
438 #. Install cxgbetool from FreeBSD source repository:
440 .. code-block:: console
442 cd <path_to_FreeBSD_source>/tools/tools/cxgbetool/
445 #. Use cxgbetool to load the firmware image onto the card:
447 .. code-block:: console
449 cxgbetool t5nex0 loadfw <path_to_uwire>/src/network/firmware/t5fw-*.bin
451 #. Unload and reload the kernel module:
453 .. code-block:: console
458 #. Verify with sysctl:
460 .. code-block:: console
462 sysctl -a | grep "t5nex" | grep "firmware"
466 .. code-block:: console
468 dev.t5nex.0.firmware_version: 1.23.4.0
473 This section demonstrates how to launch **testpmd** with Chelsio
474 devices managed by librte_pmd_cxgbe in FreeBSD operating system.
476 #. Change to DPDK source directory where the target has been compiled in
477 section :ref:`driver-compilation`:
479 .. code-block:: console
481 cd <DPDK-source-directory>
483 #. Copy the contigmem kernel module to /boot/kernel directory:
485 .. code-block:: console
487 cp x86_64-native-freebsd-clang/kmod/contigmem.ko /boot/kernel/
489 #. Add the following lines to /boot/loader.conf:
491 .. code-block:: console
493 # reserve 2 x 1G blocks of contiguous memory using contigmem driver
494 hw.contigmem.num_buffers=2
495 hw.contigmem.buffer_size=1073741824
496 # load contigmem module during boot process
499 The above lines load the contigmem kernel module during boot process and
500 allocate 2 x 1G blocks of contiguous memory to be used for DPDK later on.
501 This is to avoid issues with potential memory fragmentation during later
502 system up time, which may result in failure of allocating the contiguous
503 memory required for the contigmem kernel module.
505 #. Restart the system and ensure the contigmem module is loaded successfully:
507 .. code-block:: console
510 kldstat | grep "contigmem"
514 .. code-block:: console
516 2 1 0xffffffff817f1000 3118 contigmem.ko
518 #. Repeat step 1 to ensure that you are in the DPDK source directory.
520 #. Load the cxgbe kernel module:
522 .. code-block:: console
526 #. Get the PCI bus addresses of the interfaces bound to t5nex driver:
528 .. code-block:: console
530 pciconf -l | grep "t5nex"
534 .. code-block:: console
536 t5nex0@pci0:2:0:4: class=0x020000 card=0x00001425 chip=0x54011425 rev=0x00
538 In the above example, the t5nex0 is bound to 2:0:4 bus address.
542 Both the interfaces of a Chelsio 2-port adapter are bound to the
543 same PCI bus address.
545 #. Unload the kernel module:
547 .. code-block:: console
551 #. Set the PCI bus addresses to hw.nic_uio.bdfs kernel environment parameter:
553 .. code-block:: console
555 kenv hw.nic_uio.bdfs="2:0:4"
557 This automatically binds 2:0:4 to nic_uio kernel driver when it is loaded in
562 Currently, CXGBE PMD only supports the binding of PF4 for Chelsio NICs.
564 #. Load nic_uio kernel driver:
566 .. code-block:: console
568 kldload ./x86_64-native-freebsd-clang/kmod/nic_uio.ko
570 #. Start testpmd with basic parameters:
572 .. code-block:: console
574 ./x86_64-native-freebsd-clang/app/testpmd -l 0-3 -n 4 -w 0000:02:00.4 -- -i
578 .. code-block:: console
581 EAL: PCI device 0000:02:00.4 on NUMA socket 0
582 EAL: probe driver: 1425:5401 rte_cxgbe_pmd
583 EAL: PCI memory mapped at 0x8007ec000
584 EAL: PCI memory mapped at 0x842800000
585 EAL: PCI memory mapped at 0x80086c000
586 PMD: rte_cxgbe_pmd: fw: 1.23.4.0, TP: 0.1.23.2
587 PMD: rte_cxgbe_pmd: Coming up as MASTER: Initializing adapter
588 Interactive-mode selected
589 Configuring Port 0 (socket 0)
590 Port 0: 00:07:43:2D:EA:C0
591 Configuring Port 1 (socket 0)
592 Port 1: 00:07:43:2D:EA:C8
593 Checking link statuses...
594 PMD: rte_cxgbe_pmd: Port0: passive DA port module inserted
595 PMD: rte_cxgbe_pmd: Port1: passive DA port module inserted
596 Port 0 Link Up - speed 10000 Mbps - full-duplex
597 Port 1 Link Up - speed 10000 Mbps - full-duplex
603 Flow control pause TX/RX is disabled by default and can be enabled via
604 testpmd. Refer section :ref:`flow-control` for more details.
606 Sample Application Notes
607 ------------------------
611 Enable/Disable Flow Control
612 ~~~~~~~~~~~~~~~~~~~~~~~~~~~
614 Flow control pause TX/RX is disabled by default and can be enabled via
617 .. code-block:: console
619 testpmd> set flow_ctrl rx on tx on 0 0 0 0 mac_ctrl_frame_fwd off autoneg on 0
620 testpmd> set flow_ctrl rx on tx on 0 0 0 0 mac_ctrl_frame_fwd off autoneg on 1
622 To disable again, run:
624 .. code-block:: console
626 testpmd> set flow_ctrl rx off tx off 0 0 0 0 mac_ctrl_frame_fwd off autoneg off 0
627 testpmd> set flow_ctrl rx off tx off 0 0 0 0 mac_ctrl_frame_fwd off autoneg off 1
632 There are two ways to enable sending and receiving of jumbo frames via testpmd.
633 One method involves using the **mtu** command, which changes the mtu of an
634 individual port without having to stop the selected port. Another method
635 involves stopping all the ports first and then running **max-pkt-len** command
636 to configure the mtu of all the ports with a single command.
638 - To configure each port individually, run the mtu command as follows:
640 .. code-block:: console
642 testpmd> port config mtu 0 9000
643 testpmd> port config mtu 1 9000
645 - To configure all the ports at once, stop all the ports first and run the
646 max-pkt-len command as follows:
648 .. code-block:: console
650 testpmd> port stop all
651 testpmd> port config all max-pkt-len 9000