1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 07:48:11 +00:00

Kernel: Simplify PCI::initialize()

Choosing between I/O and MMIO is not as difficult as we were making it.
This commit is contained in:
Andreas Kling 2020-04-08 18:06:08 +02:00
parent e171c25a67
commit 66f7c8e0e8
2 changed files with 23 additions and 41 deletions

View file

@ -38,17 +38,31 @@ namespace PCI {
static void initialize_pci_mmio_access(PhysicalAddress mcfg);
static void initialize_pci_io_access();
static void test_and_initialize(bool disable_pci_mmio);
static void detect_devices();
static bool test_acpi();
static bool test_pci_io();
static bool test_pci_mmio();
static void initialize_pci_mmio_access_after_test();
static Access::Type detect_optimal_access_type(bool mmio_allowed)
{
if (mmio_allowed && test_acpi() && test_pci_mmio())
return Access::Type::MMIO;
if (test_pci_io())
return Access::Type::IO;
klog() << "No PCI bus access method detected!";
hang();
}
void initialize()
{
bool pci_mmio = kernel_command_line().lookup("pci_mmio").value_or("off") == "on";
test_and_initialize(!pci_mmio);
bool mmio_allowed = kernel_command_line().lookup("pci_mmio").value_or("off") == "on";
if (detect_optimal_access_type(mmio_allowed) == Access::Type::MMIO)
initialize_pci_mmio_access(ACPI::Parser::the().find_table("MCFG"));
else
initialize_pci_io_access();
}
void initialize_pci_mmio_access(PhysicalAddress mcfg)
@ -72,38 +86,6 @@ void detect_devices()
});
}
void test_and_initialize(bool disable_pci_mmio)
{
if (disable_pci_mmio) {
if (test_pci_io()) {
initialize_pci_io_access();
} else {
klog() << "No PCI Bus Access Method Detected, Halt!";
ASSERT_NOT_REACHED(); // NO PCI Access ?!
}
return;
}
if (test_acpi()) {
if (test_pci_mmio()) {
initialize_pci_mmio_access_after_test();
} else {
if (test_pci_io()) {
initialize_pci_io_access();
} else {
klog() << "No PCI Bus Access Method Detected, Halt!";
ASSERT_NOT_REACHED(); // NO PCI Access ?!
}
}
} else {
if (test_pci_io()) {
initialize_pci_io_access();
} else {
klog() << "No PCI Bus Access Method Detected, Halt!";
ASSERT_NOT_REACHED(); // NO PCI Access ?!
}
}
}
bool test_acpi()
{
if ((kernel_command_line().contains("noacpi")) || !ACPI::Parser::the().is_operable())
@ -131,10 +113,5 @@ bool test_pci_mmio()
return !ACPI::Parser::the().find_table("MCFG").is_null();
}
void initialize_pci_mmio_access_after_test()
{
initialize_pci_mmio_access(ACPI::Parser::the().find_table("MCFG"));
}
}
}