pci_resources/
lib.rs

1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT License.
3
4//! Resource definitions for PCI devices.
5
6#![forbid(unsafe_code)]
7
8use chipset_device::mmio::RegisterMmioIntercept;
9use chipset_device_resources::ErasedChipsetDevice;
10use chipset_device_resources::ResolvedChipsetDevice;
11use guestmem::DoorbellRegistration;
12use guestmem::GuestMemory;
13use guestmem::MemoryMapper;
14use pci_core::msi::RegisterMsi;
15use std::sync::Arc;
16use vm_resource::CanResolveTo;
17use vm_resource::kind::PciDeviceHandleKind;
18use vmcore::vm_task::VmTaskDriverSource;
19
20impl CanResolveTo<ResolvedPciDevice> for PciDeviceHandleKind {
21    type Input<'a> = ResolvePciDeviceHandleParams<'a>;
22}
23
24/// A resolved PCI device.
25pub struct ResolvedPciDevice(pub ErasedChipsetDevice);
26
27impl<T: Into<ResolvedChipsetDevice>> From<T> for ResolvedPciDevice {
28    fn from(value: T) -> Self {
29        Self(value.into().0)
30    }
31}
32
33/// Parameters used when resolving a resource with kind [`PciDeviceHandleKind`].
34pub struct ResolvePciDeviceHandleParams<'a> {
35    /// The target for MSI interrupts.
36    pub register_msi: &'a mut dyn RegisterMsi,
37    /// An object with which to register MMIO regions.
38    pub register_mmio: &'a mut (dyn RegisterMmioIntercept + Send),
39    /// The VM's task driver source.
40    pub driver_source: &'a VmTaskDriverSource,
41    /// The VM's guest memory.
42    pub guest_memory: &'a GuestMemory,
43    /// An object with which to register doorbell regions.
44    pub doorbell_registration: Option<Arc<dyn DoorbellRegistration>>,
45    /// An object with which to register shared memory regions.
46    pub shared_mem_mapper: Option<&'a dyn MemoryMapper>,
47}