mirror of
https://chromium.googlesource.com/crosvm/crosvm
synced 2025-02-06 02:25:23 +00:00
devices: pci: define a PCI bar configuration struct
We want to support 64-bit BARs and some additional functionality is required. BUG=chromium:924405 TEST=compile Change-Id: I06aba41b6dfb9649437a417a32cb450d19d0d937 Reviewed-on: https://chromium-review.googlesource.com/1480740 Commit-Ready: ChromeOS CL Exonerator Bot <chromiumos-cl-exonerator@appspot.gserviceaccount.com> Tested-by: kokoro <noreply+kokoro@google.com> Tested-by: Gurchetan Singh <gurchetansingh@chromium.org> Reviewed-by: Daniel Verkamp <dverkamp@chromium.org>
This commit is contained in:
parent
8f4d7687ea
commit
948a3ab6b5
2 changed files with 77 additions and 2 deletions
|
@ -14,8 +14,8 @@ mod pci_root;
|
|||
|
||||
pub use self::ac97::Ac97Dev;
|
||||
pub use self::pci_configuration::{
|
||||
PciCapability, PciCapabilityID, PciClassCode, PciConfiguration, PciHeaderType,
|
||||
PciProgrammingInterface, PciSubclass,
|
||||
PciBarConfiguration, PciBarPrefetchable, PciBarRegionType, PciCapability, PciCapabilityID,
|
||||
PciClassCode, PciConfiguration, PciHeaderType, PciProgrammingInterface, PciSubclass,
|
||||
};
|
||||
pub use self::pci_device::Error as PciDeviceError;
|
||||
pub use self::pci_device::PciDevice;
|
||||
|
|
|
@ -172,6 +172,32 @@ pub struct PciConfiguration {
|
|||
last_capability: Option<(usize, usize)>,
|
||||
}
|
||||
|
||||
/// See pci_regs.h in kernel
|
||||
#[allow(dead_code)]
|
||||
#[derive(Copy, Clone)]
|
||||
pub enum PciBarRegionType {
|
||||
Memory32BitRegion = 0,
|
||||
IORegion = 0x01,
|
||||
Memory64BitRegion = 0x04,
|
||||
}
|
||||
|
||||
#[allow(dead_code)]
|
||||
#[derive(Copy, Clone)]
|
||||
pub enum PciBarPrefetchable {
|
||||
NotPrefetchable = 0,
|
||||
Prefetchable = 0x08,
|
||||
}
|
||||
|
||||
#[allow(dead_code)]
|
||||
#[derive(Copy, Clone)]
|
||||
pub struct PciBarConfiguration {
|
||||
addr: u64,
|
||||
size: u64,
|
||||
reg_idx: usize,
|
||||
region_type: PciBarRegionType,
|
||||
prefetchable: PciBarPrefetchable,
|
||||
}
|
||||
|
||||
impl PciConfiguration {
|
||||
pub fn new(
|
||||
vendor_id: u16,
|
||||
|
@ -369,6 +395,55 @@ impl PciConfiguration {
|
|||
}
|
||||
}
|
||||
|
||||
impl Default for PciBarConfiguration {
|
||||
fn default() -> Self {
|
||||
PciBarConfiguration {
|
||||
reg_idx: 0,
|
||||
addr: 0,
|
||||
size: 0,
|
||||
region_type: PciBarRegionType::Memory32BitRegion,
|
||||
prefetchable: PciBarPrefetchable::NotPrefetchable,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[allow(dead_code)]
|
||||
impl PciBarConfiguration {
|
||||
pub fn new(
|
||||
reg_idx: usize,
|
||||
size: u64,
|
||||
region_type: PciBarRegionType,
|
||||
prefetchable: PciBarPrefetchable,
|
||||
) -> Self {
|
||||
PciBarConfiguration {
|
||||
reg_idx,
|
||||
addr: 0,
|
||||
size,
|
||||
region_type,
|
||||
prefetchable,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn set_register_index(mut self, reg_idx: usize) -> Self {
|
||||
self.reg_idx = reg_idx;
|
||||
self
|
||||
}
|
||||
|
||||
pub fn set_address(mut self, addr: u64) -> Self {
|
||||
self.addr = addr;
|
||||
self
|
||||
}
|
||||
|
||||
pub fn set_size(mut self, size: u64) -> Self {
|
||||
self.size = size;
|
||||
self
|
||||
}
|
||||
|
||||
pub fn get_size(&self) -> u64 {
|
||||
self.size
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use data_model::DataInit;
|
||||
|
|
Loading…
Reference in a new issue