Skip to content

Commit 6b32655

Browse files
pci: fix write
Signed-off-by: Andy-Python-Programmer <[email protected]>
1 parent b179742 commit 6b32655

File tree

1 file changed

+17
-4
lines changed
  • src/aero_kernel/src/drivers

1 file changed

+17
-4
lines changed

src/aero_kernel/src/drivers/pci.rs

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -598,17 +598,30 @@ impl PciHeader {
598598
}
599599

600600
unsafe fn write<T>(&self, offset: u32, value: u32) {
601+
let current = self.read::<u32>(offset);
602+
601603
let bus = self.bus() as u32;
602604
let device = self.device() as u32;
603605
let func = self.function() as u32;
606+
604607
let address = (bus << 16) | (device << 11) | (func << 8) | (offset & 0xFC) | 0x80000000;
608+
let noffset = (offset & 0b11) * 8;
605609

606610
io::outl(PCI_CONFIG_ADDRESS_PORT, address);
607-
608611
match core::mem::size_of::<T>() {
609-
1 => io::outb(PCI_CONFIG_DATA_PORT, value as u8), // u8
610-
2 => io::outw(PCI_CONFIG_DATA_PORT, value as u16), // u16
611-
4 => io::outl(PCI_CONFIG_DATA_PORT, value), // u32
612+
1 => {
613+
let mask = !(0xffu32 << offset);
614+
let value = (current & mask) | ((value & 0xff) << offset);
615+
io::outl(PCI_CONFIG_DATA_PORT, value)
616+
} // u8
617+
618+
2 => {
619+
let mask = !(0xffffu32 << noffset);
620+
let value = (current & mask) | ((value & 0xffff) << noffset);
621+
io::outl(PCI_CONFIG_DATA_PORT, value)
622+
} // u16
623+
624+
4 => io::outl(PCI_CONFIG_DATA_PORT, value), // u32
612625
width => unreachable!("unknown PCI write width: `{}`", width),
613626
}
614627
}

0 commit comments

Comments
 (0)