Enable bus mastering

This commit is contained in:
Jeremy Soller 2016-10-08 20:36:21 -06:00
parent f624a5e322
commit 4544f9039a
2 changed files with 17 additions and 0 deletions

View file

@ -108,6 +108,12 @@ fn main() {
}
if let Some(ref args) = driver.command {
// Enable bus mastering
unsafe {
let cmd = pci.read(bus.num, dev.num, func.num, 0x04);
pci.write(bus.num, dev.num, func.num, 0x04, cmd | 4);
}
let mut args = args.iter();
if let Some(program) = args.next() {
let mut command = Command::new(program);

View file

@ -34,6 +34,17 @@ impl Pci {
: "={eax}"(value) : "{eax}"(address) : "dx" : "intel", "volatile");
value
}
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
pub unsafe fn write(&self, bus: u8, dev: u8, func: u8, offset: u8, value: u32) {
let address = 0x80000000 | ((bus as u32) << 16) | ((dev as u32) << 11) | ((func as u32) << 8) | ((offset as u32) & 0xFC);
asm!("mov dx, 0xCF8
out dx, eax"
: : "{eax}"(address) : "dx" : "intel", "volatile");
asm!("mov dx, 0xCFC
out dx, eax"
: : "{eax}"(value) : "dx" : "intel", "volatile");
}
}
pub struct PciIter<'pci> {