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,
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,
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
disabled will disable the probe, and no
quirks will be applied. Other values, or an unset environment variable, will
enable the probe.
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
function. Calling this will establish a
nvme_root_t object, populated
with the results of that scan. Use the
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.