221 lines
6.9 KiB
ReStructuredText
221 lines
6.9 KiB
ReStructuredText
.. SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
|
|
|
============
|
|
Devlink Info
|
|
============
|
|
|
|
The ``devlink-info`` mechanism enables device drivers to report device
|
|
(hardware and firmware) information in a standard, extensible fashion.
|
|
|
|
The original motivation for the ``devlink-info`` API was twofold:
|
|
|
|
- making it possible to automate device and firmware management in a fleet
|
|
of machines in a vendor-independent fashion (see also
|
|
:ref:`Documentation/networking/devlink/devlink-flash.rst <devlink_flash>`);
|
|
- name the per component FW versions (as opposed to the crowded ethtool
|
|
version string).
|
|
|
|
``devlink-info`` supports reporting multiple types of objects. Reporting driver
|
|
versions is generally discouraged - here, and via any other Linux API.
|
|
|
|
.. list-table:: List of top level info objects
|
|
:widths: 5 95
|
|
|
|
* - Name
|
|
- Description
|
|
* - ``driver``
|
|
- Name of the currently used device driver, also available through sysfs.
|
|
|
|
* - ``serial_number``
|
|
- Serial number of the device.
|
|
|
|
This is usually the serial number of the ASIC, also often available
|
|
in PCI config space of the device in the *Device Serial Number*
|
|
capability.
|
|
|
|
The serial number should be unique per physical device.
|
|
Sometimes the serial number of the device is only 48 bits long (the
|
|
length of the Ethernet MAC address), and since PCI DSN is 64 bits long
|
|
devices pad or encode additional information into the serial number.
|
|
One example is adding port ID or PCI interface ID in the extra two bytes.
|
|
Drivers should make sure to strip or normalize any such padding
|
|
or interface ID, and report only the part of the serial number
|
|
which uniquely identifies the hardware. In other words serial number
|
|
reported for two ports of the same device or on two hosts of
|
|
a multi-host device should be identical.
|
|
|
|
* - ``board.serial_number``
|
|
- Board serial number of the device.
|
|
|
|
This is usually the serial number of the board, often available in
|
|
PCI *Vital Product Data*.
|
|
|
|
* - ``fixed``
|
|
- Group for hardware identifiers, and versions of components
|
|
which are not field-updatable.
|
|
|
|
Versions in this section identify the device design. For example,
|
|
component identifiers or the board version reported in the PCI VPD.
|
|
Data in ``devlink-info`` should be broken into the smallest logical
|
|
components, e.g. PCI VPD may concatenate various information
|
|
to form the Part Number string, while in ``devlink-info`` all parts
|
|
should be reported as separate items.
|
|
|
|
This group must not contain any frequently changing identifiers,
|
|
such as serial numbers. See
|
|
:ref:`Documentation/networking/devlink/devlink-flash.rst <devlink_flash>`
|
|
to understand why.
|
|
|
|
* - ``running``
|
|
- Group for information about currently running software/firmware.
|
|
These versions often only update after a reboot, sometimes device reset.
|
|
|
|
* - ``stored``
|
|
- Group for software/firmware versions in device flash.
|
|
|
|
Stored values must update to reflect changes in the flash even
|
|
if reboot has not yet occurred. If device is not capable of updating
|
|
``stored`` versions when new software is flashed, it must not report
|
|
them.
|
|
|
|
Each version can be reported at most once in each version group. Firmware
|
|
components stored on the flash should feature in both the ``running`` and
|
|
``stored`` sections, if device is capable of reporting ``stored`` versions
|
|
(see :ref:`Documentation/networking/devlink/devlink-flash.rst <devlink_flash>`).
|
|
In case software/firmware components are loaded from the disk (e.g.
|
|
``/lib/firmware``) only the running version should be reported via
|
|
the kernel API.
|
|
|
|
Generic Versions
|
|
================
|
|
|
|
It is expected that drivers use the following generic names for exporting
|
|
version information. If a generic name for a given component doesn't exist yet,
|
|
driver authors should consult existing driver-specific versions and attempt
|
|
reuse. As last resort, if a component is truly unique, using driver-specific
|
|
names is allowed, but these should be documented in the driver-specific file.
|
|
|
|
All versions should try to use the following terminology:
|
|
|
|
.. list-table:: List of common version suffixes
|
|
:widths: 10 90
|
|
|
|
* - Name
|
|
- Description
|
|
* - ``id``, ``revision``
|
|
- Identifiers of designs and revision, mostly used for hardware versions.
|
|
|
|
* - ``api``
|
|
- Version of API between components. API items are usually of limited
|
|
value to the user, and can be inferred from other versions by the vendor,
|
|
so adding API versions is generally discouraged as noise.
|
|
|
|
* - ``bundle_id``
|
|
- Identifier of a distribution package which was flashed onto the device.
|
|
This is an attribute of a firmware package which covers multiple versions
|
|
for ease of managing firmware images (see
|
|
:ref:`Documentation/networking/devlink/devlink-flash.rst <devlink_flash>`).
|
|
|
|
``bundle_id`` can appear in both ``running`` and ``stored`` versions,
|
|
but it must not be reported if any of the components covered by the
|
|
``bundle_id`` was changed and no longer matches the version from
|
|
the bundle.
|
|
|
|
board.id
|
|
--------
|
|
|
|
Unique identifier of the board design.
|
|
|
|
board.rev
|
|
---------
|
|
|
|
Board design revision.
|
|
|
|
asic.id
|
|
-------
|
|
|
|
ASIC design identifier.
|
|
|
|
asic.rev
|
|
--------
|
|
|
|
ASIC design revision/stepping.
|
|
|
|
board.manufacture
|
|
-----------------
|
|
|
|
An identifier of the company or the facility which produced the part.
|
|
|
|
board.part_number
|
|
-----------------
|
|
|
|
Part number of the board and its components.
|
|
|
|
fw
|
|
--
|
|
|
|
Overall firmware version, often representing the collection of
|
|
fw.mgmt, fw.app, etc.
|
|
|
|
fw.mgmt
|
|
-------
|
|
|
|
Control unit firmware version. This firmware is responsible for house
|
|
keeping tasks, PHY control etc. but not the packet-by-packet data path
|
|
operation.
|
|
|
|
fw.mgmt.api
|
|
-----------
|
|
|
|
Firmware interface specification version of the software interfaces between
|
|
driver and firmware.
|
|
|
|
fw.app
|
|
------
|
|
|
|
Data path microcode controlling high-speed packet processing.
|
|
|
|
fw.undi
|
|
-------
|
|
|
|
UNDI software, may include the UEFI driver, firmware or both.
|
|
|
|
fw.ncsi
|
|
-------
|
|
|
|
Version of the software responsible for supporting/handling the
|
|
Network Controller Sideband Interface.
|
|
|
|
fw.psid
|
|
-------
|
|
|
|
Unique identifier of the firmware parameter set. These are usually
|
|
parameters of a particular board, defined at manufacturing time.
|
|
|
|
fw.roce
|
|
-------
|
|
|
|
RoCE firmware version which is responsible for handling roce
|
|
management.
|
|
|
|
fw.bundle_id
|
|
------------
|
|
|
|
Unique identifier of the entire firmware bundle.
|
|
|
|
fw.bootloader
|
|
-------------
|
|
|
|
Version of the bootloader.
|
|
|
|
Future work
|
|
===========
|
|
|
|
The following extensions could be useful:
|
|
|
|
- on-disk firmware file names - drivers list the file names of firmware they
|
|
may need to load onto devices via the ``MODULE_FIRMWARE()`` macro. These,
|
|
however, are per module, rather than per device. It'd be useful to list
|
|
the names of firmware files the driver will try to load for a given device,
|
|
in order of priority.
|