summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Kernel/CommandLine.cpp5
-rw-r--r--Kernel/CommandLine.h1
-rw-r--r--Kernel/Storage/AHCIController.cpp7
3 files changed, 13 insertions, 0 deletions
diff --git a/Kernel/CommandLine.cpp b/Kernel/CommandLine.cpp
index 4294b97c9c..f050efbe05 100644
--- a/Kernel/CommandLine.cpp
+++ b/Kernel/CommandLine.cpp
@@ -113,6 +113,11 @@ UNMAP_AFTER_INIT bool CommandLine::is_mmio_enabled() const
return lookup("pci_mmio").value_or("off") == "on";
}
+UNMAP_AFTER_INIT bool CommandLine::is_forcing_irq_11_for_ahci() const
+{
+ return lookup("force_ahci_irq_11").value_or("off") == "on";
+}
+
UNMAP_AFTER_INIT bool CommandLine::is_legacy_time_enabled() const
{
return lookup("time").value_or("modern") == "legacy";
diff --git a/Kernel/CommandLine.h b/Kernel/CommandLine.h
index 91e553026e..657618700f 100644
--- a/Kernel/CommandLine.h
+++ b/Kernel/CommandLine.h
@@ -73,6 +73,7 @@ public:
[[nodiscard]] bool is_vmmouse_enabled() const;
[[nodiscard]] bool is_mmio_enabled() const;
[[nodiscard]] bool is_legacy_time_enabled() const;
+ [[nodiscard]] bool is_forcing_irq_11_for_ahci() const;
[[nodiscard]] bool is_text_mode() const;
[[nodiscard]] bool is_force_pio() const;
[[nodiscard]] AcpiFeatureLevel acpi_feature_level() const;
diff --git a/Kernel/Storage/AHCIController.cpp b/Kernel/Storage/AHCIController.cpp
index 626e35053d..69c205d2c8 100644
--- a/Kernel/Storage/AHCIController.cpp
+++ b/Kernel/Storage/AHCIController.cpp
@@ -172,6 +172,13 @@ void AHCIController::initialize()
hba().control_regs.ghc = 0x80000000; // Ensure that HBA knows we are AHCI aware.
PCI::enable_interrupt_line(pci_address());
PCI::enable_bus_mastering(pci_address());
+
+ // FIXME: This is a hack for VMWare (and possibly other hardware) that set
+ // the IRQ line to 7 or other weird value. Find a better way to set this
+ // with balancing IRQ sharing in mind.
+ if (kernel_command_line().is_forcing_irq_11_for_ahci())
+ PCI::set_interrupt_line(pci_address(), 11);
+
enable_global_interrupts();
m_handlers.append(AHCIPortHandler::create(*this, PCI::get_interrupt_line(pci_address()),
AHCI::MaskedBitField((volatile u32&)(hba().control_regs.pi))));