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}