45bc690ad2b62f69a5b3b5635aa1a70e686dc5f6
[deb_dpdk.git] / doc / guides / nics / thunderx.rst
1 ..  BSD LICENSE
2     Copyright (C) Cavium, Inc. 2016.
3     All rights reserved.
4
5     Redistribution and use in source and binary forms, with or without
6     modification, are permitted provided that the following conditions
7     are met:
8
9     * Redistributions of source code must retain the above copyright
10     notice, this list of conditions and the following disclaimer.
11     * Redistributions in binary form must reproduce the above copyright
12     notice, this list of conditions and the following disclaimer in
13     the documentation and/or other materials provided with the
14     distribution.
15     * Neither the name of Cavium, Inc nor the names of its
16     contributors may be used to endorse or promote products derived
17     from this software without specific prior written permission.
18
19     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20     "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21     LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22     A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23     OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24     SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25     LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26     DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27     THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28     (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29     OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
31 ThunderX NICVF Poll Mode Driver
32 ===============================
33
34 The ThunderX NICVF PMD (**librte_pmd_thunderx_nicvf**) provides poll mode driver
35 support for the inbuilt NIC found in the **Cavium ThunderX** SoC family
36 as well as their virtual functions (VF) in SR-IOV context.
37
38 More information can be found at `Cavium, Inc Official Website
39 <http://www.cavium.com/ThunderX_ARM_Processors.html>`_.
40
41 Features
42 --------
43
44 Features of the ThunderX PMD are:
45
46 - Multiple queues for TX and RX
47 - Receive Side Scaling (RSS)
48 - Packet type information
49 - Checksum offload
50 - Promiscuous mode
51 - Multicast mode
52 - Port hardware statistics
53 - Jumbo frames
54 - Link state information
55 - Scattered and gather for TX and RX
56 - VLAN stripping
57 - SR-IOV VF
58 - NUMA support
59 - Multi queue set support (up to 96 queues (12 queue sets)) per port
60
61 Supported ThunderX SoCs
62 -----------------------
63 - CN88xx
64 - CN81xx
65 - CN83xx
66
67 Prerequisites
68 -------------
69 - Follow the DPDK :ref:`Getting Started Guide for Linux <linux_gsg>` to setup the basic DPDK environment.
70
71 Pre-Installation Configuration
72 ------------------------------
73
74 Config File Options
75 ~~~~~~~~~~~~~~~~~~~
76
77 The following options can be modified in the ``config`` file.
78 Please note that enabling debugging options may affect system performance.
79
80 - ``CONFIG_RTE_LIBRTE_THUNDERX_NICVF_PMD`` (default ``y``)
81
82   Toggle compilation of the ``librte_pmd_thunderx_nicvf`` driver.
83
84 - ``CONFIG_RTE_LIBRTE_THUNDERX_NICVF_DEBUG_INIT`` (default ``n``)
85
86   Toggle display of initialization related messages.
87
88 - ``CONFIG_RTE_LIBRTE_THUNDERX_NICVF_DEBUG_RX`` (default ``n``)
89
90   Toggle display of receive fast path run-time message
91
92 - ``CONFIG_RTE_LIBRTE_THUNDERX_NICVF_DEBUG_TX`` (default ``n``)
93
94   Toggle display of transmit fast path run-time message
95
96 - ``CONFIG_RTE_LIBRTE_THUNDERX_NICVF_DEBUG_DRIVER`` (default ``n``)
97
98   Toggle display of generic debugging messages
99
100 - ``CONFIG_RTE_LIBRTE_THUNDERX_NICVF_DEBUG_MBOX`` (default ``n``)
101
102   Toggle display of PF mailbox related run-time check messages
103
104 Driver compilation and testing
105 ------------------------------
106
107 Refer to the document :ref:`compiling and testing a PMD for a NIC <pmd_build_and_test>`
108 for details.
109
110 To compile the ThunderX NICVF PMD for Linux arm64 gcc,
111 use arm64-thunderx-linuxapp-gcc as target.
112
113 Linux
114 -----
115
116 SR-IOV: Prerequisites and sample Application Notes
117 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
118
119 Current ThunderX NIC PF/VF kernel modules maps each physical Ethernet port
120 automatically to virtual function (VF) and presented them as PCIe-like SR-IOV device.
121 This section provides instructions to configure SR-IOV with Linux OS.
122
123 #. Verify PF devices capabilities using ``lspci``:
124
125    .. code-block:: console
126
127       lspci -vvv
128
129    Example output:
130
131    .. code-block:: console
132
133       0002:01:00.0 Ethernet controller: Cavium Networks Device a01e (rev 01)
134       ...
135       Capabilities: [100 v1] Alternative Routing-ID Interpretation (ARI)
136       ...
137       Capabilities: [180 v1] Single Root I/O Virtualization (SR-IOV)
138       ...
139       Kernel driver in use: thunder-nic
140       ...
141
142    .. note::
143
144       Unless ``thunder-nic`` driver is in use make sure your kernel config includes ``CONFIG_THUNDER_NIC_PF`` setting.
145
146 #. Verify VF devices capabilities and drivers using ``lspci``:
147
148    .. code-block:: console
149
150       lspci -vvv
151
152    Example output:
153
154    .. code-block:: console
155
156       0002:01:00.1 Ethernet controller: Cavium Networks Device 0011 (rev 01)
157       ...
158       Capabilities: [100 v1] Alternative Routing-ID Interpretation (ARI)
159       ...
160       Kernel driver in use: thunder-nicvf
161       ...
162
163       0002:01:00.2 Ethernet controller: Cavium Networks Device 0011 (rev 01)
164       ...
165       Capabilities: [100 v1] Alternative Routing-ID Interpretation (ARI)
166       ...
167       Kernel driver in use: thunder-nicvf
168       ...
169
170    .. note::
171
172       Unless ``thunder-nicvf`` driver is in use make sure your kernel config includes ``CONFIG_THUNDER_NIC_VF`` setting.
173
174 #. Pass VF device to VM context (PCIe Passthrough):
175
176    The VF devices may be passed through to the guest VM using qemu or
177    virt-manager or virsh etc.
178
179    Example qemu guest launch command:
180
181    .. code-block:: console
182
183       sudo qemu-system-aarch64 -name vm1 \
184       -machine virt,gic_version=3,accel=kvm,usb=off \
185       -cpu host -m 4096 \
186       -smp 4,sockets=1,cores=8,threads=1 \
187       -nographic -nodefaults \
188       -kernel <kernel image> \
189       -append "root=/dev/vda console=ttyAMA0 rw hugepagesz=512M hugepages=3" \
190       -device vfio-pci,host=0002:01:00.1 \
191       -drive file=<rootfs.ext3>,if=none,id=disk1,format=raw  \
192       -device virtio-blk-device,scsi=off,drive=disk1,id=virtio-disk1,bootindex=1 \
193       -netdev tap,id=net0,ifname=tap0,script=/etc/qemu-ifup_thunder \
194       -device virtio-net-device,netdev=net0 \
195       -serial stdio \
196       -mem-path /dev/huge
197
198 #. Enable **VFIO-NOIOMMU** mode (optional):
199
200    .. code-block:: console
201
202       echo 1 > /sys/module/vfio/parameters/enable_unsafe_noiommu_mode
203
204    .. note::
205
206       **VFIO-NOIOMMU** is required only when running in VM context and should not be enabled otherwise.
207
208 #. Running testpmd:
209
210    Follow instructions available in the document
211    :ref:`compiling and testing a PMD for a NIC <pmd_build_and_test>`
212    to run testpmd.
213
214    Example output:
215
216    .. code-block:: console
217
218       ./arm64-thunderx-linuxapp-gcc/app/testpmd -l 0-3 -n 4 -w 0002:01:00.2 \
219         -- -i --disable-hw-vlan-filter --disable-crc-strip --no-flush-rx \
220         --port-topology=loop
221
222       ...
223
224       PMD: rte_nicvf_pmd_init(): librte_pmd_thunderx nicvf version 1.0
225
226       ...
227       EAL:   probe driver: 177d:11 rte_nicvf_pmd
228       EAL:   using IOMMU type 1 (Type 1)
229       EAL:   PCI memory mapped at 0x3ffade50000
230       EAL: Trying to map BAR 4 that contains the MSI-X table.
231            Trying offsets: 0x40000000000:0x0000, 0x10000:0x1f0000
232       EAL:   PCI memory mapped at 0x3ffadc60000
233       PMD: nicvf_eth_dev_init(): nicvf: device (177d:11) 2:1:0:2
234       PMD: nicvf_eth_dev_init(): node=0 vf=1 mode=tns-bypass sqs=false
235            loopback_supported=true
236       PMD: nicvf_eth_dev_init(): Port 0 (177d:11) mac=a6:c6:d9:17:78:01
237       Interactive-mode selected
238       Configuring Port 0 (socket 0)
239       ...
240
241       PMD: nicvf_dev_configure(): Configured ethdev port0 hwcap=0x0
242       Port 0: A6:C6:D9:17:78:01
243       Checking link statuses...
244       Port 0 Link Up - speed 10000 Mbps - full-duplex
245       Done
246       testpmd>
247
248 Multiple Queue Set per DPDK port configuration
249 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
250
251 There are two types of VFs:
252
253 - Primary VF
254 - Secondary VF
255
256 Each port consists of a primary VF and n secondary VF(s). Each VF provides 8 Tx/Rx queues to a port.
257 When a given port is configured to use more than 8 queues, it requires one (or more) secondary VF.
258 Each secondary VF adds 8 additional queues to the queue set.
259
260 During PMD driver initialization, the primary VF's are enumerated by checking the
261 specific flag (see sqs message in DPDK boot log - sqs indicates secondary queue set).
262 They are at the beginning of VF list (the remain ones are secondary VF's).
263
264 The primary VFs are used as master queue sets. Secondary VFs provide
265 additional queue sets for primary ones. If a port is configured for more then
266 8 queues than it will request for additional queues from secondary VFs.
267
268 Secondary VFs cannot be shared between primary VFs.
269
270 Primary VFs are present on the beginning of the 'Network devices using kernel
271 driver' list, secondary VFs are on the remaining on the remaining part of the list.
272
273    .. note::
274
275       The VNIC driver in the multiqueue setup works differently than other drivers like `ixgbe`.
276       We need to bind separately each specific queue set device with the ``usertools/dpdk-devbind.py`` utility.
277
278    .. note::
279
280       Depending on the hardware used, the kernel driver sets a threshold ``vf_id``. VFs that try to attached with an id below or equal to
281       this boundary are considered primary VFs. VFs that try to attach with an id above this boundary are considered secondary VFs.
282
283
284 Example device binding
285 ~~~~~~~~~~~~~~~~~~~~~~
286
287 If a system has three interfaces, a total of 18 VF devices will be created
288 on a non-NUMA machine.
289
290    .. note::
291
292       NUMA systems have 12 VFs per port and non-NUMA 6 VFs per port.
293
294    .. code-block:: console
295
296       # usertools/dpdk-devbind.py --status
297
298       Network devices using DPDK-compatible driver
299       ============================================
300       <none>
301
302       Network devices using kernel driver
303       ===================================
304       0000:01:10.0 'Device a026' if= drv=thunder-BGX unused=vfio-pci,uio_pci_generic
305       0000:01:10.1 'Device a026' if= drv=thunder-BGX unused=vfio-pci,uio_pci_generic
306       0002:01:00.0 'Device a01e' if= drv=thunder-nic unused=vfio-pci,uio_pci_generic
307       0002:01:00.1 'Device 0011' if=eth0 drv=thunder-nicvf unused=vfio-pci,uio_pci_generic
308       0002:01:00.2 'Device 0011' if=eth1 drv=thunder-nicvf unused=vfio-pci,uio_pci_generic
309       0002:01:00.3 'Device 0011' if=eth2 drv=thunder-nicvf unused=vfio-pci,uio_pci_generic
310       0002:01:00.4 'Device 0011' if= drv=thunder-nicvf unused=vfio-pci,uio_pci_generic
311       0002:01:00.5 'Device 0011' if= drv=thunder-nicvf unused=vfio-pci,uio_pci_generic
312       0002:01:00.6 'Device 0011' if= drv=thunder-nicvf unused=vfio-pci,uio_pci_generic
313       0002:01:00.7 'Device 0011' if= drv=thunder-nicvf unused=vfio-pci,uio_pci_generic
314       0002:01:01.0 'Device 0011' if= drv=thunder-nicvf unused=vfio-pci,uio_pci_generic
315       0002:01:01.1 'Device 0011' if= drv=thunder-nicvf unused=vfio-pci,uio_pci_generic
316       0002:01:01.2 'Device 0011' if= drv=thunder-nicvf unused=vfio-pci,uio_pci_generic
317       0002:01:01.3 'Device 0011' if= drv=thunder-nicvf unused=vfio-pci,uio_pci_generic
318       0002:01:01.4 'Device 0011' if= drv=thunder-nicvf unused=vfio-pci,uio_pci_generic
319       0002:01:01.5 'Device 0011' if= drv=thunder-nicvf unused=vfio-pci,uio_pci_generic
320       0002:01:01.6 'Device 0011' if= drv=thunder-nicvf unused=vfio-pci,uio_pci_generic
321       0002:01:01.7 'Device 0011' if= drv=thunder-nicvf unused=vfio-pci,uio_pci_generic
322       0002:01:02.0 'Device 0011' if= drv=thunder-nicvf unused=vfio-pci,uio_pci_generic
323       0002:01:02.1 'Device 0011' if= drv=thunder-nicvf unused=vfio-pci,uio_pci_generic
324       0002:01:02.2 'Device 0011' if= drv=thunder-nicvf unused=vfio-pci,uio_pci_generic
325
326       Other network devices
327       =====================
328       0002:00:03.0 'Device a01f' unused=vfio-pci,uio_pci_generic
329
330
331 We want to bind two physical interfaces with 24 queues each device, we attach two primary VFs
332 and four secondary queues. In our example we choose two 10G interfaces eth1 (0002:01:00.2) and eth2 (0002:01:00.3).
333 We will choose four secondary queue sets from the ending of the list (0002:01:01.7-0002:01:02.2).
334
335
336 #. Bind two primary VFs to the ``vfio-pci`` driver:
337
338    .. code-block:: console
339
340       usertools/dpdk-devbind.py -b vfio-pci 0002:01:00.2
341       usertools/dpdk-devbind.py -b vfio-pci 0002:01:00.3
342
343 #. Bind four primary VFs to the ``vfio-pci`` driver:
344
345    .. code-block:: console
346
347       usertools/dpdk-devbind.py -b vfio-pci 0002:01:01.7
348       usertools/dpdk-devbind.py -b vfio-pci 0002:01:02.0
349       usertools/dpdk-devbind.py -b vfio-pci 0002:01:02.1
350       usertools/dpdk-devbind.py -b vfio-pci 0002:01:02.2
351
352 The nicvf thunderx driver will make use of attached secondary VFs automatically during the interface configuration stage.
353
354 Limitations
355 -----------
356
357 CRC striping
358 ~~~~~~~~~~~~
359
360 The ThunderX SoC family NICs strip the CRC for every packets coming into the
361 host interface. So, CRC will be stripped even when the
362 ``rxmode.hw_strip_crc`` member is set to 0 in ``struct rte_eth_conf``.
363
364 Maximum packet length
365 ~~~~~~~~~~~~~~~~~~~~~
366
367 The ThunderX SoC family NICs support a maximum of a 9K jumbo frame. The value
368 is fixed and cannot be changed. So, even when the ``rxmode.max_rx_pkt_len``
369 member of ``struct rte_eth_conf`` is set to a value lower than 9200, frames
370 up to 9200 bytes can still reach the host interface.
371
372 Maximum packet segments
373 ~~~~~~~~~~~~~~~~~~~~~~~
374
375 The ThunderX SoC family NICs support up to 12 segments per packet when working
376 in scatter/gather mode. So, setting MTU will result with ``EINVAL`` when the
377 frame size does not fit in the maximum number of segments.