xref: /linux/Documentation/networking/devlink/mlx5.rst (revision c36461825469a9ceee2346a2e89286c522525da7)
1.. SPDX-License-Identifier: GPL-2.0
2
3====================
4mlx5 devlink support
5====================
6
7This document describes the devlink features implemented by the ``mlx5``
8device driver.
9
10Parameters
11==========
12
13.. list-table:: Generic parameters implemented
14
15   * - Name
16     - Mode
17     - Validation
18     - Notes
19   * - ``enable_roce``
20     - driverinit
21     - Boolean
22     - If the device supports RoCE disablement, RoCE enablement state controls
23       device support for RoCE capability. Otherwise, the control occurs in the
24       driver stack. When RoCE is disabled at the driver level, only raw
25       ethernet QPs are supported.
26   * - ``io_eq_size``
27     - driverinit
28     - The range is between 64 and 4096.
29     -
30   * - ``event_eq_size``
31     - driverinit
32     - The range is between 64 and 4096.
33     -
34   * - ``max_macs``
35     - driverinit
36     - The range is between 1 and 2^31. Only power of 2 values are supported.
37     -
38   * - ``enable_sriov``
39     - permanent
40     - Boolean
41     - Applies to each physical function (PF) independently, if the device
42       supports it. Otherwise, it applies symmetrically to all PFs.
43   * - ``total_vfs``
44     - permanent
45     - The range is between 1 and a device-specific max.
46     - Applies to each physical function (PF) independently, if the device
47       supports it. Otherwise, it applies symmetrically to all PFs.
48   * - ``max_sfs``
49     - permanent
50     - The range is between 0 and a device-specific max.
51     - Applies to each physical function (PF) independently.
52
53Note: permanent parameters such as ``enable_sriov``, ``total_vfs`` and ``max_sfs``
54      require FW reset to take effect
55
56.. code-block:: bash
57
58   # setup parameters
59   devlink dev param set pci/0000:01:00.0 name enable_sriov value true cmode permanent
60   devlink dev param set pci/0000:01:00.0 name total_vfs value 8 cmode permanent
61
62   # Fw reset
63   devlink dev reload pci/0000:01:00.0 action fw_activate
64
65   # for PCI related config such as sriov PCI reset/rescan is required:
66   echo 1 >/sys/bus/pci/devices/0000:01:00.0/remove
67   echo 1 >/sys/bus/pci/rescan
68   grep ^ /sys/bus/pci/devices/0000:01:00.0/sriov_*
69
70   * - ``num_doorbells``
71     - driverinit
72     - This controls the number of channel doorbells used by the netdev. In all
73       cases, an additional doorbell is allocated and used for non-channel
74       communication (e.g. for PTP, HWS, etc.). Supported values are:
75
76       - 0: No channel-specific doorbells, use the global one for everything.
77       - [1, max_num_channels]: Spread netdev channels equally across these
78         doorbells.
79
80The ``mlx5`` driver also implements the following driver-specific
81parameters.
82
83.. list-table:: Driver-specific parameters implemented
84   :widths: 5 5 5 85
85
86   * - Name
87     - Type
88     - Mode
89     - Description
90   * - ``flow_steering_mode``
91     - string
92     - runtime
93     - Controls the flow steering mode of the driver
94
95       * ``dmfs`` Device managed flow steering. In DMFS mode, the HW
96         steering entities are created and managed through firmware.
97       * ``smfs`` Software managed flow steering. In SMFS mode, the HW
98         steering entities are created and manage through the driver without
99         firmware intervention.
100       * ``hmfs`` Hardware managed flow steering. In HMFS mode, the driver
101         is configuring steering rules directly to the HW using Work Queues with
102         a special new type of WQE (Work Queue Element).
103
104       SMFS mode is faster and provides better rule insertion rate compared to
105       default DMFS mode.
106   * - ``fdb_large_groups``
107     - u32
108     - driverinit
109     - Control the number of large groups (size > 1) in the FDB table.
110
111       * The default value is 15, and the range is between 1 and 1024.
112   * - ``esw_multiport``
113     - Boolean
114     - runtime
115     - Control MultiPort E-Switch shared fdb mode.
116
117       An experimental mode where a single E-Switch is used and all the vports
118       and physical ports on the NIC are connected to it.
119
120       An example is to send traffic from a VF that is created on PF0 to an
121       uplink that is natively associated with the uplink of PF1
122
123       Note: Future devices, ConnectX-8 and onward, will eventually have this
124       as the default to allow forwarding between all NIC ports in a single
125       E-switch environment and the dual E-switch mode will likely get
126       deprecated.
127
128       Default: disabled
129   * - ``esw_port_metadata``
130     - Boolean
131     - runtime
132     - When applicable, disabling eswitch metadata can increase packet rate up
133       to 20% depending on the use case and packet sizes.
134
135       Eswitch port metadata state controls whether to internally tag packets
136       with metadata. Metadata tagging must be enabled for multi-port RoCE,
137       failover between representors and stacked devices. By default metadata is
138       enabled on the supported devices in E-switch. Metadata is applicable only
139       for E-switch in switchdev mode and users may disable it when NONE of the
140       below use cases will be in use:
141       1. HCA is in Dual/multi-port RoCE mode.
142       2. VF/SF representor bonding (Usually used for Live migration)
143       3. Stacked devices
144
145       When metadata is disabled, the above use cases will fail to initialize if
146       users try to enable them.
147
148       Note: Setting this parameter does not take effect immediately. Setting
149       must happen in legacy mode and eswitch port metadata takes effect after
150       enabling switchdev mode.
151   * - ``hairpin_num_queues``
152     - u32
153     - driverinit
154     - We refer to a TC NIC rule that involves forwarding as "hairpin".
155       Hairpin queues are mlx5 hardware specific implementation for hardware
156       forwarding of such packets.
157
158       Control the number of hairpin queues.
159   * - ``hairpin_queue_size``
160     - u32
161     - driverinit
162     - Control the size (in packets) of the hairpin queues.
163   * - ``pcie_cong_inbound_high``
164     - u16
165     - driverinit
166     - High threshold configuration for PCIe congestion events. The firmware
167       will send an event once device side inbound PCIe traffic went
168       above the configured high threshold for a long enough period (at least
169       200ms).
170
171       See pci_bw_inbound_high ethtool stat.
172
173       Units are 0.01 %. Accepted values are in range [0, 10000].
174       pcie_cong_inbound_low < pcie_cong_inbound_high.
175       Default value: 9000 (Corresponds to 90%).
176   * - ``pcie_cong_inbound_low``
177     - u16
178     - driverinit
179     - Low threshold configuration for PCIe congestion events. The firmware
180       will send an event once device side inbound PCIe traffic went
181       below the configured low threshold, only after having been previously in
182       a congested state.
183
184       See pci_bw_inbound_low ethtool stat.
185
186       Units are 0.01 %. Accepted values are in range [0, 10000].
187       pcie_cong_inbound_low < pcie_cong_inbound_high.
188       Default value: 7500.
189   * - ``pcie_cong_outbound_high``
190     - u16
191     - driverinit
192     - High threshold configuration for PCIe congestion events. The firmware
193       will send an event once device side outbound PCIe traffic went
194       above the configured high threshold for a long enough period (at least
195       200ms).
196
197       See pci_bw_outbound_high ethtool stat.
198
199       Units are 0.01 %. Accepted values are in range [0, 10000].
200       pcie_cong_outbound_low < pcie_cong_outbound_high.
201       Default value: 9000 (Corresponds to 90%).
202   * - ``pcie_cong_outbound_low``
203     - u16
204     - driverinit
205     - Low threshold configuration for PCIe congestion events. The firmware
206       will send an event once device side outbound PCIe traffic went
207       below the configured low threshold, only after having been previously in
208       a congested state.
209
210       See pci_bw_outbound_low ethtool stat.
211
212       Units are 0.01 %. Accepted values are in range [0, 10000].
213       pcie_cong_outbound_low < pcie_cong_outbound_high.
214       Default value: 7500.
215
216   * - ``cqe_compress_type``
217     - string
218     - permanent
219     - Configure which mechanism/algorithm should be used by the NIC that will
220       affect the rate (aggressiveness) of compressed CQEs depending on PCIe bus
221       conditions and other internal NIC factors. This mode affects all queues
222       that enable compression.
223       * ``balanced`` : Merges fewer CQEs, resulting in a moderate compression ratio but maintaining a balance between bandwidth savings and performance
224       * ``aggressive`` : Merges more CQEs into a single entry, achieving a higher compression rate and maximizing performance, particularly under high traffic loads
225
226   * - ``swp_l4_csum_mode``
227     - string
228     - permanent
229     - Configure how the L4 checksum is calculated by the device when using
230       Software Parser (SWP) hints for header locations.
231
232       * ``default`` : Use the device's default checksum calculation
233         mode. The driver will discover during init whether or
234         full_csum or l4_only is in use. Setting this value explicitly
235         from userspace is not allowed, but some firmware versions may
236         return this value on param read.
237       * ``full_csum`` : Calculate full checksum including the pseudo-header
238       * ``l4_only`` : Calculate L4-only checksum, excluding the pseudo-header
239
240The ``mlx5`` driver supports reloading via ``DEVLINK_CMD_RELOAD``
241
242Info versions
243=============
244
245The ``mlx5`` driver reports the following versions
246
247.. list-table:: devlink info versions implemented
248   :widths: 5 5 90
249
250   * - Name
251     - Type
252     - Description
253   * - ``fw.psid``
254     - fixed
255     - Used to represent the board id of the device.
256   * - ``fw.version``
257     - stored, running
258     - Three digit major.minor.subminor firmware version number.
259
260Health reporters
261================
262
263tx reporter
264-----------
265The tx reporter is responsible for reporting and recovering of the following three error scenarios:
266
267- tx timeout
268    Report on kernel tx timeout detection.
269    Recover by searching lost interrupts.
270- tx error completion
271    Report on error tx completion.
272    Recover by flushing the tx queue and reset it.
273- tx PTP port timestamping CQ unhealthy
274    Report too many CQEs never delivered on port ts CQ.
275    Recover by flushing and re-creating all PTP channels.
276
277tx reporter also support on demand diagnose callback, on which it provides
278real time information of its send queues status.
279
280User commands examples:
281
282- Diagnose send queues status::
283
284    $ devlink health diagnose pci/0000:82:00.0 reporter tx
285
286.. note::
287   This command has valid output only when interface is up, otherwise the command has empty output.
288
289- Show number of tx errors indicated, number of recover flows ended successfully,
290  is autorecover enabled and graceful period from last recover::
291
292    $ devlink health show pci/0000:82:00.0 reporter tx
293
294rx reporter
295-----------
296The rx reporter is responsible for reporting and recovering of the following two error scenarios:
297
298- rx queues' initialization (population) timeout
299    Population of rx queues' descriptors on ring initialization is done
300    in napi context via triggering an irq. In case of a failure to get
301    the minimum amount of descriptors, a timeout would occur, and
302    descriptors could be recovered by polling the EQ (Event Queue).
303- rx completions with errors (reported by HW on interrupt context)
304    Report on rx completion error.
305    Recover (if needed) by flushing the related queue and reset it.
306
307rx reporter also supports on demand diagnose callback, on which it
308provides real time information of its receive queues' status.
309
310- Diagnose rx queues' status and corresponding completion queue::
311
312    $ devlink health diagnose pci/0000:82:00.0 reporter rx
313
314.. note::
315   This command has valid output only when interface is up. Otherwise, the command has empty output.
316
317- Show number of rx errors indicated, number of recover flows ended successfully,
318  is autorecover enabled, and graceful period from last recover::
319
320    $ devlink health show pci/0000:82:00.0 reporter rx
321
322fw reporter
323-----------
324The fw reporter implements `diagnose` and `dump` callbacks.
325It follows symptoms of fw error such as fw syndrome by triggering
326fw core dump and storing it into the dump buffer.
327The fw reporter diagnose command can be triggered any time by the user to check
328current fw status.
329
330User commands examples:
331
332- Check fw heath status::
333
334    $ devlink health diagnose pci/0000:82:00.0 reporter fw
335
336- Read FW core dump if already stored or trigger new one::
337
338    $ devlink health dump show pci/0000:82:00.0 reporter fw
339
340.. note::
341   This command can run only on the PF which has fw tracer ownership,
342   running it on other PF or any VF will return "Operation not permitted".
343
344fw fatal reporter
345-----------------
346The fw fatal reporter implements `dump` and `recover` callbacks.
347It follows fatal errors indications by CR-space dump and recover flow.
348The CR-space dump uses vsc interface which is valid even if the FW command
349interface is not functional, which is the case in most FW fatal errors.
350The recover function runs recover flow which reloads the driver and triggers fw
351reset if needed.
352On firmware error, the health buffer is dumped into the dmesg. The log
353level is derived from the error's severity (given in health buffer).
354
355User commands examples:
356
357- Run fw recover flow manually::
358
359    $ devlink health recover pci/0000:82:00.0 reporter fw_fatal
360
361- Read FW CR-space dump if already stored or trigger new one::
362
363    $ devlink health dump show pci/0000:82:00.1 reporter fw_fatal
364
365.. note::
366   This command can run only on PF.
367
368vnic reporter
369-------------
370The vnic reporter implements only the `diagnose` callback.
371It is responsible for querying the vnic diagnostic counters from fw and displaying
372them in realtime.
373
374Description of the vnic counters:
375
376- total_error_queues
377        number of queues in an error state due to
378        an async error or errored command.
379- send_queue_priority_update_flow
380        number of QP/SQ priority/SL update events.
381- cq_overrun
382        number of times CQ entered an error state due to an overflow.
383- async_eq_overrun
384        number of times an EQ mapped to async events was overrun.
385- comp_eq_overrun
386        number of times an EQ mapped to completion events was
387        overrun.
388- quota_exceeded_command
389        number of commands issued and failed due to quota exceeded.
390- invalid_command
391        number of commands issued and failed dues to any reason other than quota
392        exceeded.
393- nic_receive_steering_discard
394        number of packets that completed RX flow
395        steering but were discarded due to a mismatch in flow table.
396- generated_pkt_steering_fail
397	number of packets generated by the VNIC experiencing unexpected steering
398	failure (at any point in steering flow).
399- handled_pkt_steering_fail
400	number of packets handled by the VNIC experiencing unexpected steering
401	failure (at any point in steering flow owned by the VNIC, including the FDB
402	for the eswitch owner).
403- icm_consumption
404        amount of Interconnect Host Memory (ICM) consumed by the vnic in
405        granularity of 4KB. ICM is host memory allocated by SW upon HCA request
406        and is used for storing data structures that control HCA operation.
407- bar_uar_access
408        number of WRITE or READ access operations to the UAR on the PCIe BAR.
409- odp_local_triggered_page_fault
410        number of locally-triggered page-faults due to ODP.
411- odp_remote_triggered_page_fault
412        number of remotly-triggered page-faults due to ODP.
413
414User commands examples:
415
416- Diagnose PF/VF vnic counters::
417
418        $ devlink health diagnose pci/0000:82:00.1 reporter vnic
419
420- Diagnose representor vnic counters (performed by supplying devlink port of the
421  representor, which can be obtained via devlink port command)::
422
423        $ devlink health diagnose pci/0000:82:00.1/65537 reporter vnic
424
425.. note::
426   This command can run over all interfaces such as PF/VF and representor ports.
427
428Rates
429=====
430
431mlx5 devices can limit transmission of individual VFs or a group of them via
432the devlink-rate API in switchdev mode.
433
434User commands examples:
435
436- Print the existing rates::
437
438    $ devlink port function rate show
439
440- Set a max tx limit on traffic from VF0::
441
442    $ devlink port function rate set pci/0000:82:00.0/1 tx_max 10Gbit
443
444- Create a rate group with a max tx limit and add two VFs to it::
445
446    $ devlink port function rate add pci/0000:82:00.0/group1 tx_max 10Gbit
447    $ devlink port function rate set pci/0000:82:00.0/1 parent group1
448    $ devlink port function rate set pci/0000:82:00.0/2 parent group1
449
450- Same scenario, with a min guarantee of 20% of the bandwidth for the first VF::
451
452    $ devlink port function rate add pci/0000:82:00.0/group1 tx_max 10Gbit
453    $ devlink port function rate set pci/0000:82:00.0/1 parent group1 tx_share 2Gbit
454    $ devlink port function rate set pci/0000:82:00.0/2 parent group1
455
456- Cross-device scheduling::
457
458    $ devlink port function rate add pci/0000:82:00.0/group1 tx_max 10Gbit
459    $ devlink port function rate set pci/0000:82:00.1/32769 parent pci/0000:82:00.0/group1
460