use std::fmt::Debug;
use std::io;
use std::os::unix::io::RawFd;
use crate::config::PciConfig;
use crate::interrupts::{PciInterruptKind, PciInterrupts};
use crate::iommu::PciIommu;
use crate::regions::{OwningPciRegion, Permissions, RegionIdentifier};
pub(crate) use private::Sealed;
mod private {
pub trait Sealed {}
}
pub trait PciDevice: Debug + Send + Sync + Sealed {
fn config(&self) -> PciConfig;
fn bar(&self, index: usize) -> Option<OwningPciRegion>;
fn rom(&self) -> Option<OwningPciRegion>;
fn iommu(&self) -> PciIommu;
fn interrupts(&self) -> PciInterrupts;
fn reset(&self) -> io::Result<()>;
}
pub(crate) trait PciDeviceInternal: Debug + Send + Sync {
fn region_map(
&self,
identifier: RegionIdentifier,
offset: u64,
len: usize,
permissions: Permissions,
) -> io::Result<*mut u8>;
unsafe fn region_unmap(&self, identifier: RegionIdentifier, address: *mut u8, length: usize);
fn interrupts_max(&self, kind: PciInterruptKind) -> usize;
fn interrupts_enable(&self, kind: PciInterruptKind, eventfds: &[RawFd]) -> io::Result<()>;
fn interrupts_disable(&self, kind: PciInterruptKind) -> io::Result<()>;
}