Use a big-lock for kernel sychronization instead of fine-grained locking
This commit is contained in:
@@ -16,114 +16,76 @@ static const struct pci_driver_info pci_driver_infos[] = {
|
||||
{.class = 0x0C, .subclass = 0x03, .init = &pci_xhci_init},
|
||||
};
|
||||
|
||||
static spin_lock_t pci_lock = SPIN_LOCK_INIT;
|
||||
|
||||
uint32_t pci_read32(uint8_t bus, uint8_t slot, uint8_t func, uint8_t offset) {
|
||||
uint64_t fpci;
|
||||
|
||||
uint32_t addr = (uint32_t)((uint32_t)bus << 16) |
|
||||
((uint32_t)slot << 11) |
|
||||
((uint32_t)func << 8) |
|
||||
(offset & 0xFC) |
|
||||
((uint32_t)0x80000000);
|
||||
|
||||
spin_lock(&pci_lock, &fpci);
|
||||
|
||||
outl(PCI_CONFIG_ADDR, addr);
|
||||
uint32_t r = inl(PCI_CONFIG_DATA);
|
||||
|
||||
spin_unlock(&pci_lock, fpci);
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
void pci_write32(uint8_t bus, uint8_t slot, uint8_t func, uint8_t offset, uint32_t value) {
|
||||
uint64_t fpci;
|
||||
|
||||
uint32_t addr = (uint32_t)((uint32_t)bus << 16) |
|
||||
((uint32_t)slot << 11) |
|
||||
((uint32_t)func << 8) |
|
||||
(offset & 0xFC) |
|
||||
((uint32_t)0x80000000);
|
||||
|
||||
spin_lock(&pci_lock, &fpci);
|
||||
|
||||
outl(PCI_CONFIG_ADDR, addr);
|
||||
outl(PCI_CONFIG_DATA, value);
|
||||
|
||||
spin_unlock(&pci_lock, fpci);
|
||||
}
|
||||
|
||||
uint16_t pci_read16(uint8_t bus, uint8_t slot, uint8_t func, uint8_t offset) {
|
||||
uint64_t fpci;
|
||||
|
||||
uint32_t addr = (uint32_t)((uint32_t)bus << 16) |
|
||||
((uint32_t)slot << 11) |
|
||||
((uint32_t)func << 8) |
|
||||
(offset & 0xFC) |
|
||||
((uint32_t)0x80000000);
|
||||
|
||||
spin_lock(&pci_lock, &fpci);
|
||||
|
||||
outl(PCI_CONFIG_ADDR, addr);
|
||||
uint16_t r = inw(PCI_CONFIG_DATA + (offset & 2));
|
||||
|
||||
spin_unlock(&pci_lock, fpci);
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
void pci_write16(uint8_t bus, uint8_t slot, uint8_t func, uint8_t offset, uint16_t value) {
|
||||
uint64_t fpci;
|
||||
|
||||
uint32_t addr = (uint32_t)((uint32_t)bus << 16) |
|
||||
((uint32_t)slot << 11) |
|
||||
((uint32_t)func << 8) |
|
||||
(offset & 0xFC) |
|
||||
((uint32_t)0x80000000);
|
||||
|
||||
spin_lock(&pci_lock, &fpci);
|
||||
|
||||
outl(PCI_CONFIG_ADDR, addr);
|
||||
outw(PCI_CONFIG_DATA + (offset & 2), value);
|
||||
|
||||
spin_unlock(&pci_lock, fpci);
|
||||
}
|
||||
|
||||
uint8_t pci_read8(uint8_t bus, uint8_t slot, uint8_t func, uint8_t offset) {
|
||||
uint64_t fpci;
|
||||
|
||||
uint32_t addr = (uint32_t)((uint32_t)bus << 16) |
|
||||
((uint32_t)slot << 11) |
|
||||
((uint32_t)func << 8) |
|
||||
(offset & 0xFC) |
|
||||
((uint32_t)0x80000000);
|
||||
|
||||
spin_lock(&pci_lock, &fpci);
|
||||
|
||||
outl(PCI_CONFIG_ADDR, addr);
|
||||
uint8_t r = inb(PCI_CONFIG_DATA + (offset & 3));
|
||||
|
||||
spin_unlock(&pci_lock, fpci);
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
void pci_write8(uint8_t bus, uint8_t slot, uint8_t func, uint8_t offset, uint8_t value) {
|
||||
uint64_t fpci;
|
||||
|
||||
uint32_t addr = (uint32_t)((uint32_t)bus << 16) |
|
||||
((uint32_t)slot << 11) |
|
||||
((uint32_t)func << 8) |
|
||||
(offset & 0xFC) |
|
||||
((uint32_t)0x80000000);
|
||||
|
||||
spin_lock(&pci_lock, &fpci);
|
||||
|
||||
outl(PCI_CONFIG_ADDR, addr);
|
||||
outb(PCI_CONFIG_DATA + (offset & 3), value);
|
||||
|
||||
spin_unlock(&pci_lock, fpci);
|
||||
}
|
||||
|
||||
uint8_t pci_find_cap(uint8_t bus, uint8_t slot, uint8_t func, uint8_t cap_id) {
|
||||
|
||||
Reference in New Issue
Block a user