[Zion][Denali] Move to MSI for AHCI devices.

This will allow us to properly do interrupts for XHCI devices in the
future.

Also move PCI device header parsing to a shared library.

Get rid of the old irq register format which supplied an irq number and
instead pass the appropriate irq number back out to the caller.
This commit is contained in:
Drew Galbraith 2025-05-05 23:13:59 -07:00
parent c645405ca8
commit f26fd73116
21 changed files with 371 additions and 124 deletions

View file

@ -258,6 +258,7 @@ pub const kZionPortSend: u64 = 81;
pub const kZionPortRecv: u64 = 82;
pub const kZionPortPoll: u64 = 83;
pub const kZionIrqRegister: u64 = 88;
pub const kZionMsiIrqRegister: u64 = 89;
pub const kZionEndpointCreate: u64 = 96;
pub const kZionEndpointSend: u64 = 97;
pub const kZionEndpointRecv: u64 = 98;
@ -478,6 +479,12 @@ pub struct ZIrqRegisterReq {
}
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct ZMsiIrqRegisterReq {
pub irq_num: *mut u64,
pub port_cap: *mut z_cap_t,
}
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct ZEndpointCreateReq {
pub endpoint_cap: *mut z_cap_t,
}

View file

@ -120,6 +120,12 @@ impl<T> AsRef<T> for MemoryRegion {
}
}
impl<T> AsMut<T> for MemoryRegion {
fn as_mut(&mut self) -> &mut T {
unsafe { (self.virt_addr as *mut T).as_mut().unwrap() }
}
}
impl Drop for MemoryRegion {
fn drop(&mut self) {
// FIXME: We shouldn't have to do this manual adjustment.

View file

@ -310,16 +310,17 @@ pub fn port_poll(
Ok((num_bytes, num_caps))
}
pub fn register_irq(irq_num: u64) -> Result<Capability, ZError> {
pub fn register_msi_irq() -> Result<(Capability, u64), ZError> {
let mut irq_num: u64 = 0;
let mut port_cap: z_cap_t = 0;
syscall(
zion::kZionIrqRegister,
&zion::ZIrqRegisterReq {
irq_num,
zion::kZionMsiIrqRegister,
&zion::ZMsiIrqRegisterReq {
irq_num: &mut irq_num as *mut u64,
port_cap: &mut port_cap,
},
)?;
Ok(Capability::take(port_cap))
Ok((Capability::take(port_cap), irq_num))
}
pub fn endpoint_create() -> Result<Capability, ZError> {