Kernel: Force PCI irq line usage when not using APIC

afaik PIC does not support MSI
This commit is contained in:
Bananymous 2024-07-23 09:08:00 +03:00
parent 539afb329a
commit cda0276d39
2 changed files with 11 additions and 11 deletions

View File

@ -29,7 +29,7 @@ namespace Kernel
private:
SpinLock m_lock;
uint16_t m_reserved_irqs { 0 };
uint16_t m_reserved_irqs { 1u << 2 };
friend class InterruptController;
};

View File

@ -362,7 +362,16 @@ namespace Kernel::PCI
BAN::ErrorOr<void> PCI::Device::reserve_irqs(uint8_t count)
{
if (m_offset_msi_x.has_value())
if (!InterruptController::get().is_using_apic())
{
if (count > 1)
{
dwarnln("PIC: could not allocate {} interrupts, (currently) only {} supported", count, 1);
return BAN::Error::from_errno(EFAULT);
}
enable_pin_interrupts();
}
else if (m_offset_msi_x.has_value())
{
uint16_t msg_ctrl = read_word(*m_offset_msi_x + 0x02);
if (count > (msg_ctrl & 0x7FF) + 1)
@ -387,15 +396,6 @@ namespace Kernel::PCI
write_word(*m_offset_msi + 0x02, msg_ctrl);
disable_pin_interrupts();
}
else if (!InterruptController::get().is_using_apic())
{
if (count > 1)
{
dwarnln("PIC: could not allocate {} interrupts, (currently) only {} supported", count, 1);
return BAN::Error::from_errno(EFAULT);
}
enable_pin_interrupts();
}
else
{
dwarnln("Could not reserve interrupt for PCI device. No MSI, MSI-X or interrupt line is used");