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 //! Manages system resources that can be allocated to VMs and their devices. 6*bb4ee6a4SAndroid Build Coastguard Worker 7*bb4ee6a4SAndroid Build Coastguard Worker use remain::sorted; 8*bb4ee6a4SAndroid Build Coastguard Worker use serde::Deserialize; 9*bb4ee6a4SAndroid Build Coastguard Worker use serde::Serialize; 10*bb4ee6a4SAndroid Build Coastguard Worker use thiserror::Error; 11*bb4ee6a4SAndroid Build Coastguard Worker 12*bb4ee6a4SAndroid Build Coastguard Worker pub use crate::address_range::AddressRange; 13*bb4ee6a4SAndroid Build Coastguard Worker pub use crate::system_allocator::AllocOptions; 14*bb4ee6a4SAndroid Build Coastguard Worker pub use crate::system_allocator::MmioType; 15*bb4ee6a4SAndroid Build Coastguard Worker pub use crate::system_allocator::SystemAllocator; 16*bb4ee6a4SAndroid Build Coastguard Worker pub use crate::system_allocator::SystemAllocatorConfig; 17*bb4ee6a4SAndroid Build Coastguard Worker 18*bb4ee6a4SAndroid Build Coastguard Worker pub mod address_allocator; 19*bb4ee6a4SAndroid Build Coastguard Worker mod address_range; 20*bb4ee6a4SAndroid Build Coastguard Worker mod system_allocator; 21*bb4ee6a4SAndroid Build Coastguard Worker 22*bb4ee6a4SAndroid Build Coastguard Worker /// Used to tag SystemAllocator allocations. 23*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Debug, Eq, PartialEq, Hash, Copy, Clone, Serialize, Deserialize)] 24*bb4ee6a4SAndroid Build Coastguard Worker pub enum Alloc { 25*bb4ee6a4SAndroid Build Coastguard Worker /// An anonymous resource allocation. 26*bb4ee6a4SAndroid Build Coastguard Worker /// Should only be instantiated through `SystemAllocator::get_anon_alloc()`. 27*bb4ee6a4SAndroid Build Coastguard Worker /// Avoid using these. Instead, use / create a more descriptive Alloc variant. 28*bb4ee6a4SAndroid Build Coastguard Worker Anon(usize), 29*bb4ee6a4SAndroid Build Coastguard Worker /// A PCI BAR region with associated bus, device, function and bar numbers. 30*bb4ee6a4SAndroid Build Coastguard Worker PciBar { bus: u8, dev: u8, func: u8, bar: u8 }, 31*bb4ee6a4SAndroid Build Coastguard Worker /// GPU render node region. 32*bb4ee6a4SAndroid Build Coastguard Worker GpuRenderNode, 33*bb4ee6a4SAndroid Build Coastguard Worker /// Pmem device region with associated device index. 34*bb4ee6a4SAndroid Build Coastguard Worker PmemDevice(usize), 35*bb4ee6a4SAndroid Build Coastguard Worker /// pstore region. 36*bb4ee6a4SAndroid Build Coastguard Worker Pstore, 37*bb4ee6a4SAndroid Build Coastguard Worker /// A PCI bridge window with associated bus, dev, function. 38*bb4ee6a4SAndroid Build Coastguard Worker PciBridgeWindow { bus: u8, dev: u8, func: u8 }, 39*bb4ee6a4SAndroid Build Coastguard Worker /// A PCI bridge prefetch window with associated bus, dev, function. 40*bb4ee6a4SAndroid Build Coastguard Worker PciBridgePrefetchWindow { bus: u8, dev: u8, func: u8 }, 41*bb4ee6a4SAndroid Build Coastguard Worker /// File-backed memory mapping. 42*bb4ee6a4SAndroid Build Coastguard Worker FileBacked(u64), 43*bb4ee6a4SAndroid Build Coastguard Worker } 44*bb4ee6a4SAndroid Build Coastguard Worker 45*bb4ee6a4SAndroid Build Coastguard Worker #[sorted] 46*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Error, Debug, Eq, PartialEq)] 47*bb4ee6a4SAndroid Build Coastguard Worker pub enum Error { 48*bb4ee6a4SAndroid Build Coastguard Worker #[error("Allocation cannot have size of 0")] 49*bb4ee6a4SAndroid Build Coastguard Worker AllocSizeZero, 50*bb4ee6a4SAndroid Build Coastguard Worker #[error("Pool alignment must be a power of 2")] 51*bb4ee6a4SAndroid Build Coastguard Worker BadAlignment, 52*bb4ee6a4SAndroid Build Coastguard Worker #[error("Alloc does not exist: {0:?}")] 53*bb4ee6a4SAndroid Build Coastguard Worker BadAlloc(Alloc), 54*bb4ee6a4SAndroid Build Coastguard Worker #[error("Alloc already exists: {0:?}")] 55*bb4ee6a4SAndroid Build Coastguard Worker ExistingAlloc(Alloc), 56*bb4ee6a4SAndroid Build Coastguard Worker #[error("Invalid Alloc: {0:?}")] 57*bb4ee6a4SAndroid Build Coastguard Worker InvalidAlloc(Alloc), 58*bb4ee6a4SAndroid Build Coastguard Worker #[error("IO port out of range: {0}")] 59*bb4ee6a4SAndroid Build Coastguard Worker IOPortOutOfRange(AddressRange), 60*bb4ee6a4SAndroid Build Coastguard Worker #[error("Platform MMIO address range not specified")] 61*bb4ee6a4SAndroid Build Coastguard Worker MissingPlatformMMIOAddresses, 62*bb4ee6a4SAndroid Build Coastguard Worker #[error("No IO address range specified")] 63*bb4ee6a4SAndroid Build Coastguard Worker NoIoAllocator, 64*bb4ee6a4SAndroid Build Coastguard Worker #[error("Out of bounds")] 65*bb4ee6a4SAndroid Build Coastguard Worker OutOfBounds, 66*bb4ee6a4SAndroid Build Coastguard Worker #[error("Out of space")] 67*bb4ee6a4SAndroid Build Coastguard Worker OutOfSpace, 68*bb4ee6a4SAndroid Build Coastguard Worker #[error("base={base} + size={size} overflows")] 69*bb4ee6a4SAndroid Build Coastguard Worker PoolOverflow { base: u64, size: u64 }, 70*bb4ee6a4SAndroid Build Coastguard Worker #[error("Overlapping region {0}")] 71*bb4ee6a4SAndroid Build Coastguard Worker RegionOverlap(AddressRange), 72*bb4ee6a4SAndroid Build Coastguard Worker } 73*bb4ee6a4SAndroid Build Coastguard Worker 74*bb4ee6a4SAndroid Build Coastguard Worker pub type Result<T> = std::result::Result<T, Error>; 75