blob: 71a4d2e8cc91929724a0a197ef71a5232b673e09 [file] [log] [blame]
// Copyright 2018 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//! Manages system resources that can be allocated to VMs and their devices.
extern crate base;
#[cfg(feature = "wl-dmabuf")]
extern crate gpu_buffer;
extern crate libc;
extern crate msg_socket;
use msg_socket::MsgOnSocket;
use std::fmt::Display;
pub use crate::address_allocator::AddressAllocator;
pub use crate::gpu_allocator::{
GpuAllocatorError, GpuMemoryAllocator, GpuMemoryDesc, GpuMemoryPlaneDesc,
};
pub use crate::system_allocator::{MmioType, SystemAllocator};
mod address_allocator;
mod gpu_allocator;
mod system_allocator;
/// Used to tag SystemAllocator allocations.
#[derive(Debug, Eq, PartialEq, Hash, MsgOnSocket, Copy, Clone)]
pub enum Alloc {
/// An anonymous resource allocation.
/// Should only be instantiated through `SystemAllocator::get_anon_alloc()`.
/// Avoid using these. Instead, use / create a more descriptive Alloc variant.
Anon(usize),
/// A PCI BAR region with associated bus, device, function and bar numbers.
PciBar { bus: u8, dev: u8, func: u8, bar: u8 },
/// GPU render node region.
GpuRenderNode,
/// Pmem device region with associated device index.
PmemDevice(usize),
/// pstore region.
Pstore,
}
#[derive(Debug, Eq, PartialEq)]
pub enum Error {
AllocSizeZero,
BadAlignment,
CreateGpuAllocator(GpuAllocatorError),
ExistingAlloc(Alloc),
InvalidAlloc(Alloc),
MissingHighMMIOAddresses,
MissingLowMMIOAddresses,
NoIoAllocator,
OutOfSpace,
OutOfBounds,
PoolOverflow { base: u64, size: u64 },
PoolSizeZero,
RegionOverlap { base: u64, size: u64 },
BadAlloc(Alloc),
}
pub type Result<T> = std::result::Result<T, Error>;
impl Display for Error {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
use self::Error::*;
match self {
AllocSizeZero => write!(f, "Allocation cannot have size of 0"),
BadAlignment => write!(f, "Pool alignment must be a power of 2"),
CreateGpuAllocator(e) => write!(f, "Failed to create GPU allocator: {:?}", e),
ExistingAlloc(tag) => write!(f, "Alloc already exists: {:?}", tag),
InvalidAlloc(tag) => write!(f, "Invalid Alloc: {:?}", tag),
MissingHighMMIOAddresses => write!(f, "High MMIO address range not specified"),
MissingLowMMIOAddresses => write!(f, "Low MMIO address range not specified"),
NoIoAllocator => write!(f, "No IO address range specified"),
OutOfSpace => write!(f, "Out of space"),
OutOfBounds => write!(f, "Out of bounds"),
PoolOverflow { base, size } => write!(f, "base={} + size={} overflows", base, size),
PoolSizeZero => write!(f, "Pool cannot have size of 0"),
RegionOverlap { base, size } => {
write!(f, "Overlapping region base={} size={}", base, size)
}
BadAlloc(tag) => write!(f, "Alloc does not exists: {:?}", tag),
}
}
}