Commit a6304e69 authored by Jeremy Soller's avatar Jeremy Soller

Enable bus mastering

parent 2cadfb86
...@@ -108,6 +108,12 @@ fn main() { ...@@ -108,6 +108,12 @@ fn main() {
} }
if let Some(ref args) = driver.command { 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(); let mut args = args.iter();
if let Some(program) = args.next() { if let Some(program) = args.next() {
let mut command = Command::new(program); let mut command = Command::new(program);
......
...@@ -34,6 +34,17 @@ impl Pci { ...@@ -34,6 +34,17 @@ impl Pci {
: "={eax}"(value) : "{eax}"(address) : "dx" : "intel", "volatile"); : "={eax}"(value) : "{eax}"(address) : "dx" : "intel", "volatile");
value 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> { pub struct PciIter<'pci> {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment