Kernel/PCI: Add small access spinlock to each HostController

Prepare to remove biglock on PCI::Access in a future commit, so we can
ensure we only lock a spinlock on a precise PCI HostController if needed
instead of the entire subsystem.
This commit is contained in:
Liav A
2023-12-15 19:25:09 +02:00
committed by Andrew Kaster
parent 0bab9a9313
commit 6014ce0552
8 changed files with 119 additions and 63 deletions

View File

@@ -41,42 +41,42 @@ NonnullOwnPtr<VolumeManagementDevice> VolumeManagementDevice::must_create(PCI::D
return adopt_own_if_nonnull(new (nothrow) VolumeManagementDevice(domain, start_address)).release_nonnull();
}
void VolumeManagementDevice::write8_field(BusNumber bus, DeviceNumber device, FunctionNumber function, u32 field, u8 value)
void VolumeManagementDevice::write8_field_locked(BusNumber bus, DeviceNumber device, FunctionNumber function, u32 field, u8 value)
{
SpinlockLocker locker(m_config_lock);
// Note: We must write then read to ensure completion before returning.
MemoryBackedHostBridge::write8_field(bus, device, function, field, value);
MemoryBackedHostBridge::read8_field(bus, device, function, field);
MemoryBackedHostBridge::write8_field_locked(bus, device, function, field, value);
MemoryBackedHostBridge::read8_field_locked(bus, device, function, field);
}
void VolumeManagementDevice::write16_field(BusNumber bus, DeviceNumber device, FunctionNumber function, u32 field, u16 value)
void VolumeManagementDevice::write16_field_locked(BusNumber bus, DeviceNumber device, FunctionNumber function, u32 field, u16 value)
{
SpinlockLocker locker(m_config_lock);
// Note: We must write then read to ensure completion before returning.
MemoryBackedHostBridge::write16_field(bus, device, function, field, value);
MemoryBackedHostBridge::read16_field(bus, device, function, field);
MemoryBackedHostBridge::write16_field_locked(bus, device, function, field, value);
MemoryBackedHostBridge::read16_field_locked(bus, device, function, field);
}
void VolumeManagementDevice::write32_field(BusNumber bus, DeviceNumber device, FunctionNumber function, u32 field, u32 value)
void VolumeManagementDevice::write32_field_locked(BusNumber bus, DeviceNumber device, FunctionNumber function, u32 field, u32 value)
{
SpinlockLocker locker(m_config_lock);
// Note: We must write then read to ensure completion before returning.
MemoryBackedHostBridge::write32_field(bus, device, function, field, value);
MemoryBackedHostBridge::read32_field(bus, device, function, field);
MemoryBackedHostBridge::write32_field_locked(bus, device, function, field, value);
MemoryBackedHostBridge::read32_field_locked(bus, device, function, field);
}
u8 VolumeManagementDevice::read8_field(BusNumber bus, DeviceNumber device, FunctionNumber function, u32 field)
u8 VolumeManagementDevice::read8_field_locked(BusNumber bus, DeviceNumber device, FunctionNumber function, u32 field)
{
SpinlockLocker locker(m_config_lock);
return MemoryBackedHostBridge::read8_field(bus, device, function, field);
return MemoryBackedHostBridge::read8_field_locked(bus, device, function, field);
}
u16 VolumeManagementDevice::read16_field(BusNumber bus, DeviceNumber device, FunctionNumber function, u32 field)
u16 VolumeManagementDevice::read16_field_locked(BusNumber bus, DeviceNumber device, FunctionNumber function, u32 field)
{
SpinlockLocker locker(m_config_lock);
return MemoryBackedHostBridge::read16_field(bus, device, function, field);
return MemoryBackedHostBridge::read16_field_locked(bus, device, function, field);
}
u32 VolumeManagementDevice::read32_field(BusNumber bus, DeviceNumber device, FunctionNumber function, u32 field)
u32 VolumeManagementDevice::read32_field_locked(BusNumber bus, DeviceNumber device, FunctionNumber function, u32 field)
{
SpinlockLocker locker(m_config_lock);
return MemoryBackedHostBridge::read32_field(bus, device, function, field);
return MemoryBackedHostBridge::read32_field_locked(bus, device, function, field);
}
VolumeManagementDevice::VolumeManagementDevice(PCI::Domain const& domain, PhysicalAddress start_address)