mlx5: add environment variables section to documentation
[dpdk.git] / doc / guides / nics / mlx5.rst
1 ..  BSD LICENSE
2     Copyright 2015 6WIND S.A.
3
4     Redistribution and use in source and binary forms, with or without
5     modification, are permitted provided that the following conditions
6     are met:
7
8     * Redistributions of source code must retain the above copyright
9     notice, this list of conditions and the following disclaimer.
10     * Redistributions in binary form must reproduce the above copyright
11     notice, this list of conditions and the following disclaimer in
12     the documentation and/or other materials provided with the
13     distribution.
14     * Neither the name of 6WIND S.A. nor the names of its
15     contributors may be used to endorse or promote products derived
16     from this software without specific prior written permission.
17
18     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19     "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20     LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21     A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22     OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23     SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24     LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25     DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26     THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27     (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28     OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
30 MLX5 poll mode driver
31 =====================
32
33 The MLX5 poll mode driver library (**librte_pmd_mlx5**) provides support for
34 **Mellanox ConnectX-4 EN** and **Mellanox ConnectX-4 Lx EN** families of
35 10/25/40/50/100 Gb/s adapters as well as their virtual functions (VF) in
36 SR-IOV context.
37
38 Information and documentation about these adapters can be found on the
39 `Mellanox website <http://www.mellanox.com>`__. Help is also provided by the
40 `Mellanox community <http://community.mellanox.com/welcome>`__.
41
42 There is also a `section dedicated to this poll mode driver
43 <http://www.mellanox.com/page/products_dyn?product_family=209&mtag=pmd_for_dpdk>`__.
44
45 .. note::
46
47    Due to external dependencies, this driver is disabled by default. It must
48    be enabled manually by setting ``CONFIG_RTE_LIBRTE_MLX5_PMD=y`` and
49    recompiling DPDK.
50
51 .. warning::
52
53    ``CONFIG_RTE_BUILD_COMBINE_LIBS`` with ``CONFIG_RTE_BUILD_SHARED_LIB``
54    is not supported and thus the compilation will fail with this configuration.
55
56 Implementation details
57 ----------------------
58
59 Besides its dependency on libibverbs (that implies libmlx5 and associated
60 kernel support), librte_pmd_mlx5 relies heavily on system calls for control
61 operations such as querying/updating the MTU and flow control parameters.
62
63 For security reasons and robustness, this driver only deals with virtual
64 memory addresses. The way resources allocations are handled by the kernel
65 combined with hardware specifications that allow it to handle virtual memory
66 addresses directly ensure that DPDK applications cannot access random
67 physical memory (or memory that does not belong to the current process).
68
69 This capability allows the PMD to coexist with kernel network interfaces
70 which remain functional, although they stop receiving unicast packets as
71 long as they share the same MAC address.
72
73 Enabling librte_pmd_mlx5 causes DPDK applications to be linked against
74 libibverbs.
75
76 Features
77 --------
78
79 - Multiple TX and RX queues.
80 - Support for scattered TX and RX frames.
81 - IPv4, TCPv4 and UDPv4 RSS on any number of queues.
82 - Several RSS hash keys, one for each flow type.
83 - Support for multiple MAC addresses.
84 - VLAN filtering.
85 - Promiscuous mode.
86
87 Limitations
88 -----------
89
90 - IPv6 and inner VXLAN RSS are not supported yet.
91 - Port statistics through software counters only.
92 - No allmulticast mode.
93 - Hardware checksum offloads are not supported yet.
94
95 Configuration
96 -------------
97
98 Compilation options
99 ~~~~~~~~~~~~~~~~~~~
100
101 These options can be modified in the ``.config`` file.
102
103 - ``CONFIG_RTE_LIBRTE_MLX5_PMD`` (default **n**)
104
105   Toggle compilation of librte_pmd_mlx5 itself.
106
107 - ``CONFIG_RTE_LIBRTE_MLX5_DEBUG`` (default **n**)
108
109   Toggle debugging code and stricter compilation flags. Enabling this option
110   adds additional run-time checks and debugging messages at the cost of
111   lower performance.
112
113 - ``CONFIG_RTE_LIBRTE_MLX5_SGE_WR_N`` (default **4**)
114
115   Number of scatter/gather elements (SGEs) per work request (WR). Lowering
116   this number improves performance but also limits the ability to receive
117   scattered packets (packets that do not fit a single mbuf). The default
118   value is a safe tradeoff.
119
120 - ``CONFIG_RTE_LIBRTE_MLX5_MAX_INLINE`` (default **0**)
121
122   Amount of data to be inlined during TX operations. Improves latency but
123   lowers throughput.
124
125 - ``CONFIG_RTE_LIBRTE_MLX5_TX_MP_CACHE`` (default **8**)
126
127   Maximum number of cached memory pools (MPs) per TX queue. Each MP from
128   which buffers are to be transmitted must be associated to memory regions
129   (MRs). This is a slow operation that must be cached.
130
131   This value is always 1 for RX queues since they use a single MP.
132
133 Environment variables
134 ~~~~~~~~~~~~~~~~~~~~~
135
136 - ``MLX5_ENABLE_CQE_COMPRESSION``
137
138   A nonzero value lets ConnectX-4 return smaller completion entries to
139   improve performance when PCI backpressure is detected. It is most useful
140   for scenarios involving heavy traffic on many queues.
141
142   Since the additional software logic necessary to handle this mode can
143   lower performance when there is no backpressure, it is not enabled by
144   default.
145
146 Run-time configuration
147 ~~~~~~~~~~~~~~~~~~~~~~
148
149 - librte_pmd_mlx5 brings kernel network interfaces up during initialization
150   because it is affected by their state. Forcing them down prevents packets
151   reception.
152
153 - **ethtool** operations on related kernel interfaces also affect the PMD.
154
155 Prerequisites
156 -------------
157
158 This driver relies on external libraries and kernel drivers for resources
159 allocations and initialization. The following dependencies are not part of
160 DPDK and must be installed separately:
161
162 - **libibverbs**
163
164   User space Verbs framework used by librte_pmd_mlx5. This library provides
165   a generic interface between the kernel and low-level user space drivers
166   such as libmlx5.
167
168   It allows slow and privileged operations (context initialization, hardware
169   resources allocations) to be managed by the kernel and fast operations to
170   never leave user space.
171
172 - **libmlx5**
173
174   Low-level user space driver library for Mellanox ConnectX-4 devices,
175   it is automatically loaded by libibverbs.
176
177   This library basically implements send/receive calls to the hardware
178   queues.
179
180 - **Kernel modules** (mlnx-ofed-kernel)
181
182   They provide the kernel-side Verbs API and low level device drivers that
183   manage actual hardware initialization and resources sharing with user
184   space processes.
185
186   Unlike most other PMDs, these modules must remain loaded and bound to
187   their devices:
188
189   - mlx5_core: hardware driver managing Mellanox ConnectX-4 devices and
190     related Ethernet kernel network devices.
191   - mlx5_ib: InifiniBand device driver.
192   - ib_uverbs: user space driver for Verbs (entry point for libibverbs).
193
194 - **Firmware update**
195
196   Mellanox OFED releases include firmware updates for ConnectX-4 adapters.
197
198   Because each release provides new features, these updates must be applied to
199   match the kernel modules and libraries they come with.
200
201 .. note::
202
203    Both libraries are BSD and GPL licensed. Linux kernel modules are GPL
204    licensed.
205
206 Currently supported by DPDK:
207
208 - Mellanox OFED **3.1**.
209 - Minimum firmware version:
210   - ConnectX-4: **12.12.0780**.
211   - ConnectX-4 Lx: **14.12.0780**.
212
213 Getting Mellanox OFED
214 ~~~~~~~~~~~~~~~~~~~~~
215
216 While these libraries and kernel modules are available on OpenFabrics
217 Alliance's `website <https://www.openfabrics.org/>`__ and provided by package
218 managers on most distributions, this PMD requires Ethernet extensions that
219 may not be supported at the moment (this is a work in progress).
220
221 `Mellanox OFED
222 <http://www.mellanox.com/page/products_dyn?product_family=26&mtag=linux>`__
223 includes the necessary support and should be used in the meantime. For DPDK,
224 only libibverbs, libmlx5, mlnx-ofed-kernel packages and firmware updates are
225 required from that distribution.
226
227 .. note::
228
229    Several versions of Mellanox OFED are available. Installing the version
230    this DPDK release was developed and tested against is strongly
231    recommended. Please check the `prerequisites`_.
232
233 Usage example
234 -------------
235
236 This section demonstrates how to launch **testpmd** with Mellanox ConnectX-4
237 devices managed by librte_pmd_mlx5.
238
239 #. Load the kernel modules:
240
241    .. code-block:: console
242
243       modprobe -a ib_uverbs mlx5_core mlx5_ib
244
245    .. note::
246
247       User space I/O kernel modules (uio and igb_uio) are not used and do
248       not have to be loaded.
249
250 #. Make sure Ethernet interfaces are in working order and linked to kernel
251    verbs. Related sysfs entries should be present:
252
253    .. code-block:: console
254
255       ls -d /sys/class/net/*/device/infiniband_verbs/uverbs* | cut -d / -f 5
256
257    Example output:
258
259    .. code-block:: console
260
261       eth30
262       eth31
263       eth32
264       eth33
265
266 #. Optionally, retrieve their PCI bus addresses for whitelisting:
267
268    .. code-block:: console
269
270       {
271           for intf in eth2 eth3 eth4 eth5;
272           do
273               (cd "/sys/class/net/${intf}/device/" && pwd -P);
274           done;
275       } |
276       sed -n 's,.*/\(.*\),-w \1,p'
277
278    Example output:
279
280    .. code-block:: console
281
282       -w 0000:05:00.1
283       -w 0000:06:00.0
284       -w 0000:06:00.1
285       -w 0000:05:00.0
286
287 #. Request huge pages:
288
289    .. code-block:: console
290
291       echo 1024 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages/nr_hugepages
292
293 #. Start testpmd with basic parameters:
294
295    .. code-block:: console
296
297       testpmd -c 0xff00 -n 4 -w 05:00.0 -w 05:00.1 -w 06:00.0 -w 06:00.1 -- --rxq=2 --txq=2 -i
298
299    Example output:
300
301    .. code-block:: console
302
303       [...]
304       EAL: PCI device 0000:05:00.0 on NUMA socket 0
305       EAL:   probe driver: 15b3:1013 librte_pmd_mlx5
306       PMD: librte_pmd_mlx5: PCI information matches, using device "mlx5_0" (VF: false)
307       PMD: librte_pmd_mlx5: 1 port(s) detected
308       PMD: librte_pmd_mlx5: port 1 MAC address is e4:1d:2d:e7:0c:fe
309       EAL: PCI device 0000:05:00.1 on NUMA socket 0
310       EAL:   probe driver: 15b3:1013 librte_pmd_mlx5
311       PMD: librte_pmd_mlx5: PCI information matches, using device "mlx5_1" (VF: false)
312       PMD: librte_pmd_mlx5: 1 port(s) detected
313       PMD: librte_pmd_mlx5: port 1 MAC address is e4:1d:2d:e7:0c:ff
314       EAL: PCI device 0000:06:00.0 on NUMA socket 0
315       EAL:   probe driver: 15b3:1013 librte_pmd_mlx5
316       PMD: librte_pmd_mlx5: PCI information matches, using device "mlx5_2" (VF: false)
317       PMD: librte_pmd_mlx5: 1 port(s) detected
318       PMD: librte_pmd_mlx5: port 1 MAC address is e4:1d:2d:e7:0c:fa
319       EAL: PCI device 0000:06:00.1 on NUMA socket 0
320       EAL:   probe driver: 15b3:1013 librte_pmd_mlx5
321       PMD: librte_pmd_mlx5: PCI information matches, using device "mlx5_3" (VF: false)
322       PMD: librte_pmd_mlx5: 1 port(s) detected
323       PMD: librte_pmd_mlx5: port 1 MAC address is e4:1d:2d:e7:0c:fb
324       Interactive-mode selected
325       Configuring Port 0 (socket 0)
326       PMD: librte_pmd_mlx5: 0x8cba80: TX queues number update: 0 -> 2
327       PMD: librte_pmd_mlx5: 0x8cba80: RX queues number update: 0 -> 2
328       Port 0: E4:1D:2D:E7:0C:FE
329       Configuring Port 1 (socket 0)
330       PMD: librte_pmd_mlx5: 0x8ccac8: TX queues number update: 0 -> 2
331       PMD: librte_pmd_mlx5: 0x8ccac8: RX queues number update: 0 -> 2
332       Port 1: E4:1D:2D:E7:0C:FF
333       Configuring Port 2 (socket 0)
334       PMD: librte_pmd_mlx5: 0x8cdb10: TX queues number update: 0 -> 2
335       PMD: librte_pmd_mlx5: 0x8cdb10: RX queues number update: 0 -> 2
336       Port 2: E4:1D:2D:E7:0C:FA
337       Configuring Port 3 (socket 0)
338       PMD: librte_pmd_mlx5: 0x8ceb58: TX queues number update: 0 -> 2
339       PMD: librte_pmd_mlx5: 0x8ceb58: RX queues number update: 0 -> 2
340       Port 3: E4:1D:2D:E7:0C:FB
341       Checking link statuses...
342       Port 0 Link Up - speed 40000 Mbps - full-duplex
343       Port 1 Link Up - speed 40000 Mbps - full-duplex
344       Port 2 Link Up - speed 10000 Mbps - full-duplex
345       Port 3 Link Up - speed 10000 Mbps - full-duplex
346       Done
347       testpmd>