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:
parent
e171c25a67
commit
66f7c8e0e8
2 changed files with 23 additions and 41 deletions
|
@ -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"));
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue