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