diff --git a/kernel/src/drivers/block/mod.rs b/kernel/src/drivers/block/mod.rs index bbcee0a..c2f9aeb 100644 --- a/kernel/src/drivers/block/mod.rs +++ b/kernel/src/drivers/block/mod.rs @@ -1 +1,2 @@ pub mod virtio_blk; +pub mod ahci; \ No newline at end of file diff --git a/kernel/src/drivers/bus/pci.rs b/kernel/src/drivers/bus/pci.rs index e46c7d0..9985d0d 100644 --- a/kernel/src/drivers/bus/pci.rs +++ b/kernel/src/drivers/bus/pci.rs @@ -1,4 +1,5 @@ use crate::drivers::net::*; +use crate::drivers::block::*; use crate::drivers::{Driver, DRIVERS, NET_DRIVERS}; use alloc::collections::BTreeMap; use alloc::string::String; @@ -129,7 +130,7 @@ impl PciTag { // linux/drivers/pci/probe.c pci_read_bases // return (addr, len) pub unsafe fn get_bar_mem(&self, bar_number: u32) -> Option<(usize, usize)> { - assert!(bar_number <= 4); + assert!(bar_number <= 6); let bar = PCI_BAR0 + 4 * bar_number; let mut base_lo = self.read(bar, 4); self.write(bar, 0xffffffff); @@ -298,6 +299,14 @@ pub fn init_driver(name: String, vid: u32, did: u32, tag: PciTag) { .lock() .insert(tag, ixgbe::ixgbe_init(name, irq, addr, len)); } + } else if did == 0x2922 { + // 82801IR/IO/IH (ICH9R/DO/DH) 6 port SATA Controller [AHCI mode] + if let Some((addr, len)) = unsafe { tag.get_bar_mem(5) } { + let irq = unsafe { tag.enable() }; + PCI_DRIVERS + .lock() + .insert(tag, ahci::ahci_init(irq, addr, len)); + } } } }