use std::io;
use std::ops::Range;
use crate::regions::Permissions;
pub struct PciIommu<'a> {
pub(crate) internal: &'a dyn PciIommuInternal,
}
impl PciIommu<'_> {
pub fn alignment(&self) -> usize {
self.internal.alignment()
}
pub fn valid_iova_ranges(&self) -> &[Range<u64>] {
self.internal.valid_iova_ranges()
}
pub fn max_num_mappings(&self) -> u32 {
self.internal.max_num_mappings()
}
pub unsafe fn map(
&self,
iova: u64,
length: usize,
address: *const u8,
device_permissions: Permissions,
) -> io::Result<()> {
unsafe { self.internal.map(iova, length, address, device_permissions) }
}
pub fn unmap(&self, iova: u64, size: usize) -> io::Result<()> {
self.internal.unmap(iova, size)
}
}
pub(crate) trait PciIommuInternal {
fn alignment(&self) -> usize;
fn valid_iova_ranges(&self) -> &[Range<u64>];
fn max_num_mappings(&self) -> u32;
unsafe fn map(
&self,
iova: u64,
length: usize,
address: *const u8,
device_permissions: Permissions,
) -> io::Result<()>;
fn unmap(&self, iova: u64, length: usize) -> io::Result<()>;
}