NVMe Management Interface (NVMe-MI) support¶
This libnvme project also includes support for the NVMe Management Interface (NVMe-MI), currently over a Management Component Transport (MCTP) protocol link. This MCTP link will typically use i2c/SMBus as the hardware transport, enabling out-of-band management and control over NVMe devices using a simple SMBus interface.
The MI interface is compiled into a separate shared object, libnvme-mi.so
.
Most of the MI API is transport-agnostic, except for the endpoint constructor
functions. Once an endpoint object (nvme_mi_ep_t
) is created, the generic
functions can be used to manage it.
When endpoints are created (through one of the transport-specific functions,
like nvme_mi_open_mctp()
), the endpoint hardware will be probed to
see if any device-specific workarounds (“quirks”) are required. This is
implemented as an Identify Controller command, requesting a small amount of
data on controller ID 0.
To suppress this probe, the LIBNVME_MI_PROBE_ENABLED
environment var can be
set. Values of 0
, false
and disabled
will disable the probe, and no
quirks will be applied. Other values, or an unset environment variable, will
enable the probe.
MCTP Transport¶
The MI API is generally transport-agnostic, but the only currently-supported
transport is MCTP, using the kernel AF_MCTP
socket interface.
MCTP endpoints are addressed by a (network-id, endpoint-id) pair. Endpoint
IDs (EIDs) are defined by the MCTP standard as an 8-bit value. Since the
address space is somewhat limited, the Linux AF_MCTP support allows for
separate MCTP “networks”, which provide separate address spaces. These networks
each have a unique unsigned int
as their ID.
The default Network ID is 1; unless you have configured otherwise, MCTP endpoints will appear on this network.
If compiled with D-Bus support, libnvme-mi
can query the system MCTP daemon
(”mctpd
”) to find attached NVMe devices, via the nvme_mi_scan_mctp()
function. Calling this will establish a nvme_root_t
object, populated
with the results of that scan. Use the nvme_mi_for_each_endpoint
macro
to iterate through the scanned endpoints.
Note that the MCTP daemon is provided separately, as part of the MCTP userspace
tools, at https://github.com/CodeConstruct/mctp . mctpd
is responsible for
discovery and enumeration for MCTP endpoints on the system, and will query
each for its protocol capabilities during enumeration. Consequently, NVMe-MI
endpoints will need to report support for NVMe-MI-over-MCTP (protocol 0x4) in
their supported protocols list (ie., as returned by the MCTP Get Message Type
Support command) in order to be discovered.