xref: /aosp_15_r20/external/crosvm/resources/src/lib.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 //! 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