xref: /aosp_15_r20/external/crosvm/devices/src/pci/mod.rs (revision bb4ee6a4ae7042d18b07a98463b9c8b875e44b39)
1*bb4ee6a4SAndroid Build Coastguard Worker // Copyright 2018 The ChromiumOS Authors
2*bb4ee6a4SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*bb4ee6a4SAndroid Build Coastguard Worker // found in the LICENSE file.
4*bb4ee6a4SAndroid Build Coastguard Worker 
5*bb4ee6a4SAndroid Build Coastguard Worker //! Implements pci devices and busses.
6*bb4ee6a4SAndroid Build Coastguard Worker 
7*bb4ee6a4SAndroid Build Coastguard Worker mod acpi;
8*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(any(target_os = "android", target_os = "linux"))]
9*bb4ee6a4SAndroid Build Coastguard Worker mod coiommu;
10*bb4ee6a4SAndroid Build Coastguard Worker mod msi;
11*bb4ee6a4SAndroid Build Coastguard Worker mod msix;
12*bb4ee6a4SAndroid Build Coastguard Worker mod pci_address;
13*bb4ee6a4SAndroid Build Coastguard Worker mod pci_configuration;
14*bb4ee6a4SAndroid Build Coastguard Worker mod pci_device;
15*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(feature = "pci-hotplug")]
16*bb4ee6a4SAndroid Build Coastguard Worker mod pci_hotplug;
17*bb4ee6a4SAndroid Build Coastguard Worker mod pci_root;
18*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(any(target_os = "android", target_os = "linux"))]
19*bb4ee6a4SAndroid Build Coastguard Worker mod pcie;
20*bb4ee6a4SAndroid Build Coastguard Worker pub mod pm;
21*bb4ee6a4SAndroid Build Coastguard Worker mod pvpanic;
22*bb4ee6a4SAndroid Build Coastguard Worker mod stub;
23*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(any(target_os = "android", target_os = "linux"))]
24*bb4ee6a4SAndroid Build Coastguard Worker mod vfio_pci;
25*bb4ee6a4SAndroid Build Coastguard Worker 
26*bb4ee6a4SAndroid Build Coastguard Worker use libc::EINVAL;
27*bb4ee6a4SAndroid Build Coastguard Worker use serde::Deserialize;
28*bb4ee6a4SAndroid Build Coastguard Worker use serde::Serialize;
29*bb4ee6a4SAndroid Build Coastguard Worker 
30*bb4ee6a4SAndroid Build Coastguard Worker pub use self::acpi::GpeScope;
31*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(any(target_os = "android", target_os = "linux"))]
32*bb4ee6a4SAndroid Build Coastguard Worker pub use self::coiommu::CoIommuDev;
33*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(any(target_os = "android", target_os = "linux"))]
34*bb4ee6a4SAndroid Build Coastguard Worker pub use self::coiommu::CoIommuParameters;
35*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(any(target_os = "android", target_os = "linux"))]
36*bb4ee6a4SAndroid Build Coastguard Worker pub use self::coiommu::CoIommuUnpinPolicy;
37*bb4ee6a4SAndroid Build Coastguard Worker pub use self::msi::MsiConfig;
38*bb4ee6a4SAndroid Build Coastguard Worker pub use self::msix::MsixCap;
39*bb4ee6a4SAndroid Build Coastguard Worker pub use self::msix::MsixConfig;
40*bb4ee6a4SAndroid Build Coastguard Worker pub use self::msix::MsixStatus;
41*bb4ee6a4SAndroid Build Coastguard Worker pub use self::pci_address::Error as PciAddressError;
42*bb4ee6a4SAndroid Build Coastguard Worker pub use self::pci_address::PciAddress;
43*bb4ee6a4SAndroid Build Coastguard Worker pub use self::pci_configuration::PciBarConfiguration;
44*bb4ee6a4SAndroid Build Coastguard Worker pub use self::pci_configuration::PciBarIndex;
45*bb4ee6a4SAndroid Build Coastguard Worker pub use self::pci_configuration::PciBarPrefetchable;
46*bb4ee6a4SAndroid Build Coastguard Worker pub use self::pci_configuration::PciBarRegionType;
47*bb4ee6a4SAndroid Build Coastguard Worker pub use self::pci_configuration::PciBaseSystemPeripheralSubclass;
48*bb4ee6a4SAndroid Build Coastguard Worker pub use self::pci_configuration::PciCapability;
49*bb4ee6a4SAndroid Build Coastguard Worker pub use self::pci_configuration::PciCapabilityID;
50*bb4ee6a4SAndroid Build Coastguard Worker pub use self::pci_configuration::PciClassCode;
51*bb4ee6a4SAndroid Build Coastguard Worker pub use self::pci_configuration::PciConfiguration;
52*bb4ee6a4SAndroid Build Coastguard Worker pub use self::pci_configuration::PciDisplaySubclass;
53*bb4ee6a4SAndroid Build Coastguard Worker pub use self::pci_configuration::PciHeaderType;
54*bb4ee6a4SAndroid Build Coastguard Worker pub use self::pci_configuration::PciInputDeviceSubclass;
55*bb4ee6a4SAndroid Build Coastguard Worker pub use self::pci_configuration::PciMassStorageSubclass;
56*bb4ee6a4SAndroid Build Coastguard Worker pub use self::pci_configuration::PciMultimediaSubclass;
57*bb4ee6a4SAndroid Build Coastguard Worker pub use self::pci_configuration::PciNetworkControllerSubclass;
58*bb4ee6a4SAndroid Build Coastguard Worker pub use self::pci_configuration::PciProgrammingInterface;
59*bb4ee6a4SAndroid Build Coastguard Worker pub use self::pci_configuration::PciSerialBusSubClass;
60*bb4ee6a4SAndroid Build Coastguard Worker pub use self::pci_configuration::PciSimpleCommunicationControllerSubclass;
61*bb4ee6a4SAndroid Build Coastguard Worker pub use self::pci_configuration::PciSubclass;
62*bb4ee6a4SAndroid Build Coastguard Worker pub use self::pci_configuration::PciWirelessControllerSubclass;
63*bb4ee6a4SAndroid Build Coastguard Worker pub use self::pci_device::BarRange;
64*bb4ee6a4SAndroid Build Coastguard Worker pub use self::pci_device::Error as PciDeviceError;
65*bb4ee6a4SAndroid Build Coastguard Worker pub use self::pci_device::PciBus;
66*bb4ee6a4SAndroid Build Coastguard Worker pub use self::pci_device::PciDevice;
67*bb4ee6a4SAndroid Build Coastguard Worker pub use self::pci_device::PreferredIrq;
68*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(feature = "pci-hotplug")]
69*bb4ee6a4SAndroid Build Coastguard Worker pub use self::pci_hotplug::HotPluggable;
70*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(feature = "pci-hotplug")]
71*bb4ee6a4SAndroid Build Coastguard Worker pub use self::pci_hotplug::IntxParameter;
72*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(feature = "pci-hotplug")]
73*bb4ee6a4SAndroid Build Coastguard Worker pub use self::pci_hotplug::NetResourceCarrier;
74*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(feature = "pci-hotplug")]
75*bb4ee6a4SAndroid Build Coastguard Worker pub use self::pci_hotplug::ResourceCarrier;
76*bb4ee6a4SAndroid Build Coastguard Worker pub use self::pci_root::PciConfigIo;
77*bb4ee6a4SAndroid Build Coastguard Worker pub use self::pci_root::PciConfigMmio;
78*bb4ee6a4SAndroid Build Coastguard Worker pub use self::pci_root::PciMmioMapper;
79*bb4ee6a4SAndroid Build Coastguard Worker pub use self::pci_root::PciRoot;
80*bb4ee6a4SAndroid Build Coastguard Worker pub use self::pci_root::PciRootCommand;
81*bb4ee6a4SAndroid Build Coastguard Worker pub use self::pci_root::PciVirtualConfigMmio;
82*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(any(target_os = "android", target_os = "linux"))]
83*bb4ee6a4SAndroid Build Coastguard Worker pub use self::pcie::PciBridge;
84*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(any(target_os = "android", target_os = "linux"))]
85*bb4ee6a4SAndroid Build Coastguard Worker pub use self::pcie::PcieDownstreamPort;
86*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(any(target_os = "android", target_os = "linux"))]
87*bb4ee6a4SAndroid Build Coastguard Worker pub use self::pcie::PcieHostPort;
88*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(any(target_os = "android", target_os = "linux"))]
89*bb4ee6a4SAndroid Build Coastguard Worker pub use self::pcie::PcieRootPort;
90*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(any(target_os = "android", target_os = "linux"))]
91*bb4ee6a4SAndroid Build Coastguard Worker pub use self::pcie::PcieUpstreamPort;
92*bb4ee6a4SAndroid Build Coastguard Worker pub use self::pvpanic::PvPanicCode;
93*bb4ee6a4SAndroid Build Coastguard Worker pub use self::pvpanic::PvPanicPciDevice;
94*bb4ee6a4SAndroid Build Coastguard Worker pub use self::stub::StubPciDevice;
95*bb4ee6a4SAndroid Build Coastguard Worker pub use self::stub::StubPciParameters;
96*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(any(target_os = "android", target_os = "linux"))]
97*bb4ee6a4SAndroid Build Coastguard Worker pub use self::vfio_pci::VfioPciDevice;
98*bb4ee6a4SAndroid Build Coastguard Worker 
99*bb4ee6a4SAndroid Build Coastguard Worker /// PCI has four interrupt pins A->D.
100*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Copy, Clone, Ord, PartialOrd, PartialEq, Eq, Serialize, Deserialize)]
101*bb4ee6a4SAndroid Build Coastguard Worker pub enum PciInterruptPin {
102*bb4ee6a4SAndroid Build Coastguard Worker     IntA,
103*bb4ee6a4SAndroid Build Coastguard Worker     IntB,
104*bb4ee6a4SAndroid Build Coastguard Worker     IntC,
105*bb4ee6a4SAndroid Build Coastguard Worker     IntD,
106*bb4ee6a4SAndroid Build Coastguard Worker }
107*bb4ee6a4SAndroid Build Coastguard Worker 
108*bb4ee6a4SAndroid Build Coastguard Worker impl PciInterruptPin {
to_mask(self) -> u32109*bb4ee6a4SAndroid Build Coastguard Worker     pub fn to_mask(self) -> u32 {
110*bb4ee6a4SAndroid Build Coastguard Worker         self as u32
111*bb4ee6a4SAndroid Build Coastguard Worker     }
112*bb4ee6a4SAndroid Build Coastguard Worker }
113*bb4ee6a4SAndroid Build Coastguard Worker 
114*bb4ee6a4SAndroid Build Coastguard Worker // VCFG
115*bb4ee6a4SAndroid Build Coastguard Worker pub const PCI_VCFG_PM: usize = 0x0;
116*bb4ee6a4SAndroid Build Coastguard Worker pub const PCI_VCFG_DSM: usize = 0x1;
117*bb4ee6a4SAndroid Build Coastguard Worker pub const PCI_VCFG_NOTY: usize = 0x2;
118*bb4ee6a4SAndroid Build Coastguard Worker 
119*bb4ee6a4SAndroid Build Coastguard Worker pub const PCI_VENDOR_ID_INTEL: u16 = 0x8086;
120*bb4ee6a4SAndroid Build Coastguard Worker pub const PCI_VENDOR_ID_REDHAT: u16 = 0x1b36;
121*bb4ee6a4SAndroid Build Coastguard Worker 
122*bb4ee6a4SAndroid Build Coastguard Worker #[repr(u16)]
123*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Debug, Copy, Clone, PartialEq, Eq, Serialize, Deserialize)]
124*bb4ee6a4SAndroid Build Coastguard Worker pub enum CrosvmDeviceId {
125*bb4ee6a4SAndroid Build Coastguard Worker     Pit = 1,
126*bb4ee6a4SAndroid Build Coastguard Worker     Pic = 2,
127*bb4ee6a4SAndroid Build Coastguard Worker     Ioapic = 3,
128*bb4ee6a4SAndroid Build Coastguard Worker     Serial = 4,
129*bb4ee6a4SAndroid Build Coastguard Worker     Cmos = 5,
130*bb4ee6a4SAndroid Build Coastguard Worker     I8042 = 6,
131*bb4ee6a4SAndroid Build Coastguard Worker     Pl030 = 7,
132*bb4ee6a4SAndroid Build Coastguard Worker     ACPIPMResource = 8,
133*bb4ee6a4SAndroid Build Coastguard Worker     GoldfishBattery = 9,
134*bb4ee6a4SAndroid Build Coastguard Worker     DebugConsole = 10,
135*bb4ee6a4SAndroid Build Coastguard Worker     ProxyDevice = 11,
136*bb4ee6a4SAndroid Build Coastguard Worker     VfioPlatformDevice = 12,
137*bb4ee6a4SAndroid Build Coastguard Worker     DirectGsi = 13,
138*bb4ee6a4SAndroid Build Coastguard Worker     DirectIo = 14,
139*bb4ee6a4SAndroid Build Coastguard Worker     DirectMmio = 15,
140*bb4ee6a4SAndroid Build Coastguard Worker     UserspaceIrqChip = 16,
141*bb4ee6a4SAndroid Build Coastguard Worker     VmWatchdog = 17,
142*bb4ee6a4SAndroid Build Coastguard Worker     Pflash = 18,
143*bb4ee6a4SAndroid Build Coastguard Worker     VirtioMmio = 19,
144*bb4ee6a4SAndroid Build Coastguard Worker     AcAdapter = 20,
145*bb4ee6a4SAndroid Build Coastguard Worker     VirtualPmc = 21,
146*bb4ee6a4SAndroid Build Coastguard Worker     VirtCpufreq = 22,
147*bb4ee6a4SAndroid Build Coastguard Worker     FwCfg = 23,
148*bb4ee6a4SAndroid Build Coastguard Worker }
149*bb4ee6a4SAndroid Build Coastguard Worker 
150*bb4ee6a4SAndroid Build Coastguard Worker impl TryFrom<u16> for CrosvmDeviceId {
151*bb4ee6a4SAndroid Build Coastguard Worker     type Error = base::Error;
152*bb4ee6a4SAndroid Build Coastguard Worker 
try_from(value: u16) -> Result<Self, Self::Error>153*bb4ee6a4SAndroid Build Coastguard Worker     fn try_from(value: u16) -> Result<Self, Self::Error> {
154*bb4ee6a4SAndroid Build Coastguard Worker         match value {
155*bb4ee6a4SAndroid Build Coastguard Worker             1 => Ok(CrosvmDeviceId::Pit),
156*bb4ee6a4SAndroid Build Coastguard Worker             2 => Ok(CrosvmDeviceId::Pic),
157*bb4ee6a4SAndroid Build Coastguard Worker             3 => Ok(CrosvmDeviceId::Ioapic),
158*bb4ee6a4SAndroid Build Coastguard Worker             4 => Ok(CrosvmDeviceId::Serial),
159*bb4ee6a4SAndroid Build Coastguard Worker             5 => Ok(CrosvmDeviceId::Cmos),
160*bb4ee6a4SAndroid Build Coastguard Worker             6 => Ok(CrosvmDeviceId::I8042),
161*bb4ee6a4SAndroid Build Coastguard Worker             7 => Ok(CrosvmDeviceId::Pl030),
162*bb4ee6a4SAndroid Build Coastguard Worker             8 => Ok(CrosvmDeviceId::ACPIPMResource),
163*bb4ee6a4SAndroid Build Coastguard Worker             9 => Ok(CrosvmDeviceId::GoldfishBattery),
164*bb4ee6a4SAndroid Build Coastguard Worker             10 => Ok(CrosvmDeviceId::DebugConsole),
165*bb4ee6a4SAndroid Build Coastguard Worker             11 => Ok(CrosvmDeviceId::ProxyDevice),
166*bb4ee6a4SAndroid Build Coastguard Worker             12 => Ok(CrosvmDeviceId::VfioPlatformDevice),
167*bb4ee6a4SAndroid Build Coastguard Worker             13 => Ok(CrosvmDeviceId::DirectGsi),
168*bb4ee6a4SAndroid Build Coastguard Worker             14 => Ok(CrosvmDeviceId::DirectMmio),
169*bb4ee6a4SAndroid Build Coastguard Worker             15 => Ok(CrosvmDeviceId::DirectIo),
170*bb4ee6a4SAndroid Build Coastguard Worker             16 => Ok(CrosvmDeviceId::UserspaceIrqChip),
171*bb4ee6a4SAndroid Build Coastguard Worker             17 => Ok(CrosvmDeviceId::VmWatchdog),
172*bb4ee6a4SAndroid Build Coastguard Worker             18 => Ok(CrosvmDeviceId::Pflash),
173*bb4ee6a4SAndroid Build Coastguard Worker             19 => Ok(CrosvmDeviceId::VirtioMmio),
174*bb4ee6a4SAndroid Build Coastguard Worker             20 => Ok(CrosvmDeviceId::AcAdapter),
175*bb4ee6a4SAndroid Build Coastguard Worker             21 => Ok(CrosvmDeviceId::VirtualPmc),
176*bb4ee6a4SAndroid Build Coastguard Worker             _ => Err(base::Error::new(EINVAL)),
177*bb4ee6a4SAndroid Build Coastguard Worker         }
178*bb4ee6a4SAndroid Build Coastguard Worker     }
179*bb4ee6a4SAndroid Build Coastguard Worker }
180*bb4ee6a4SAndroid Build Coastguard Worker 
181*bb4ee6a4SAndroid Build Coastguard Worker /// A wrapper structure for pci device and vendor id.
182*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Debug, Copy, Clone, PartialEq, Eq, Serialize, Deserialize)]
183*bb4ee6a4SAndroid Build Coastguard Worker pub struct PciId {
184*bb4ee6a4SAndroid Build Coastguard Worker     vendor_id: u16,
185*bb4ee6a4SAndroid Build Coastguard Worker     device_id: u16,
186*bb4ee6a4SAndroid Build Coastguard Worker }
187*bb4ee6a4SAndroid Build Coastguard Worker 
188*bb4ee6a4SAndroid Build Coastguard Worker impl PciId {
new(vendor_id: u16, device_id: u16) -> Self189*bb4ee6a4SAndroid Build Coastguard Worker     pub fn new(vendor_id: u16, device_id: u16) -> Self {
190*bb4ee6a4SAndroid Build Coastguard Worker         Self {
191*bb4ee6a4SAndroid Build Coastguard Worker             vendor_id,
192*bb4ee6a4SAndroid Build Coastguard Worker             device_id,
193*bb4ee6a4SAndroid Build Coastguard Worker         }
194*bb4ee6a4SAndroid Build Coastguard Worker     }
195*bb4ee6a4SAndroid Build Coastguard Worker }
196*bb4ee6a4SAndroid Build Coastguard Worker 
197*bb4ee6a4SAndroid Build Coastguard Worker impl From<PciId> for u32 {
from(pci_id: PciId) -> Self198*bb4ee6a4SAndroid Build Coastguard Worker     fn from(pci_id: PciId) -> Self {
199*bb4ee6a4SAndroid Build Coastguard Worker         // vendor ID is the lower 16 bits and device id is the upper 16 bits
200*bb4ee6a4SAndroid Build Coastguard Worker         pci_id.vendor_id as u32 | (pci_id.device_id as u32) << 16
201*bb4ee6a4SAndroid Build Coastguard Worker     }
202*bb4ee6a4SAndroid Build Coastguard Worker }
203*bb4ee6a4SAndroid Build Coastguard Worker 
204*bb4ee6a4SAndroid Build Coastguard Worker impl From<u32> for PciId {
from(value: u32) -> Self205*bb4ee6a4SAndroid Build Coastguard Worker     fn from(value: u32) -> Self {
206*bb4ee6a4SAndroid Build Coastguard Worker         let vendor_id = (value & 0xFFFF) as u16;
207*bb4ee6a4SAndroid Build Coastguard Worker         let device_id = (value >> 16) as u16;
208*bb4ee6a4SAndroid Build Coastguard Worker         Self::new(vendor_id, device_id)
209*bb4ee6a4SAndroid Build Coastguard Worker     }
210*bb4ee6a4SAndroid Build Coastguard Worker }
211