nvme_resources/
lib.rs

1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT License.
3
4//! Resource definitions for NVMe controllers.
5//!
6//! [`NvmeControllerHandle`] configures the controller with its initial
7//! namespaces, MSI-X count, and queue limits. [`NvmeControllerRequest`] enables
8//! runtime namespace add/remove.
9
10#![forbid(unsafe_code)]
11
12use crate::fault::FaultConfiguration;
13use guid::Guid;
14use mesh::MeshPayload;
15use mesh::rpc::FailableRpc;
16use vm_resource::Resource;
17use vm_resource::ResourceId;
18use vm_resource::kind::DiskHandleKind;
19use vm_resource::kind::PciDeviceHandleKind;
20
21pub mod fault;
22
23/// A handle to an NVMe controller.
24#[derive(MeshPayload)]
25pub struct NvmeControllerHandle {
26    /// The subsystem ID to use when responding to controller identify queries.
27    pub subsystem_id: Guid,
28    /// The number of MSI-X interrupts to support.
29    pub msix_count: u16,
30    /// The number of IO queues to support.
31    pub max_io_queues: u16,
32    /// The initial set of namespaces.
33    pub namespaces: Vec<NamespaceDefinition>,
34    /// Runtime request channel for hot add/remove of namespaces.
35    pub requests: Option<mesh::Receiver<NvmeControllerRequest>>,
36}
37
38impl ResourceId<PciDeviceHandleKind> for NvmeControllerHandle {
39    const ID: &'static str = "nvme";
40}
41
42/// A runtime request to the NVMe controller.
43#[derive(MeshPayload)]
44pub enum NvmeControllerRequest {
45    /// Add a namespace.
46    AddNamespace(FailableRpc<NamespaceDefinition, ()>),
47    /// Remove a namespace by its NSID.
48    RemoveNamespace(FailableRpc<u32, ()>),
49}
50
51/// A handle to a NVMe fault controller.
52#[derive(MeshPayload)]
53pub struct NvmeFaultControllerHandle {
54    /// The subsystem ID to use when responding to controller identify queries.
55    pub subsystem_id: Guid,
56    /// The number of MSI-X interrupts to support.
57    pub msix_count: u16,
58    /// The number of IO queues to support.
59    pub max_io_queues: u16,
60    /// The initial set of namespaces.
61    pub namespaces: Vec<NamespaceDefinition>,
62    /// Configuration for the fault
63    pub fault_config: FaultConfiguration,
64    /// Enable TDISP testing on this device when presented by a TDISP host.
65    pub enable_tdisp_tests: bool,
66}
67
68impl ResourceId<PciDeviceHandleKind> for NvmeFaultControllerHandle {
69    const ID: &'static str = "nvme_fault";
70}
71
72/// A controller namespace definition.
73#[derive(MeshPayload)]
74pub struct NamespaceDefinition {
75    /// The namespace ID.
76    pub nsid: u32,
77    /// Whether the disk is read only.
78    pub read_only: bool,
79    /// The backing disk resource.
80    pub disk: Resource<DiskHandleKind>,
81}