diff --git a/Kernel/PCI/Definitions.h b/Kernel/PCI/Definitions.h index cb440a21a7..6d3d639af6 100644 --- a/Kernel/PCI/Definitions.h +++ b/Kernel/PCI/Definitions.h @@ -190,7 +190,6 @@ size_t get_BAR_space_size(Address, u8); void enable_bus_mastering(Address); void disable_bus_mastering(Address); -class Initializer; class Access; class MMIOAccess; class IOAccess; diff --git a/Kernel/PCI/Initializer.cpp b/Kernel/PCI/Initializer.cpp index f5efeaa65c..fac67a8cdb 100644 --- a/Kernel/PCI/Initializer.cpp +++ b/Kernel/PCI/Initializer.cpp @@ -36,36 +36,43 @@ namespace Kernel { namespace PCI { -static Initializer* s_pci_initializer; +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(); -Initializer& Initializer::the() +void initialize() { - if (s_pci_initializer == nullptr) { - s_pci_initializer = new Initializer(); - } - return *s_pci_initializer; + bool pci_mmio = kernel_command_line().lookup("pci_mmio").value_or("off") == "on"; + test_and_initialize(!pci_mmio); } -void Initializer::initialize_pci_mmio_access(PhysicalAddress mcfg) + +void initialize_pci_mmio_access(PhysicalAddress mcfg) { MMIOAccess::initialize(mcfg); detect_devices(); } -void Initializer::initialize_pci_io_access() + +void initialize_pci_io_access() { IOAccess::initialize(); detect_devices(); } -void Initializer::detect_devices() +void detect_devices() { enumerate_all([&](const Address& address, ID id) { - klog() << "PCI: device @ " << String::format("%w", address.seg()) << ":" << String::format("%b", address.bus()) << ":" << String::format("%b", address.slot()) << "." << String::format("%d", address.function()) << " [" << String::format("%w", id.vendor_id) << ":" << String::format("%w", id.device_id) << "]"; + klog() << "PCI: Device @ " << String::format("%w", address.seg()) << ":" << String::format("%b", address.bus()) << ":" << String::format("%b", address.slot()) << "." << String::format("%d", address.function()) << " [" << String::format("%w", id.vendor_id) << ":" << String::format("%w", id.device_id) << "]"; E1000NetworkAdapter::detect(address); RTL8139NetworkAdapter::detect(address); }); } -void Initializer::test_and_initialize(bool disable_pci_mmio) +void test_and_initialize(bool disable_pci_mmio) { if (disable_pci_mmio) { if (test_pci_io()) { @@ -96,18 +103,15 @@ void Initializer::test_and_initialize(bool disable_pci_mmio) } } } -Initializer::Initializer() -{ -} -bool Initializer::test_acpi() + +bool test_acpi() { if ((kernel_command_line().contains("noacpi")) || !ACPI::Parser::the().is_operable()) return false; - else - return true; + return true; } -bool Initializer::test_pci_io() +bool test_pci_io() { klog() << "Testing PCI via manual probing... "; u32 tmp = 0x80000000; @@ -122,28 +126,15 @@ bool Initializer::test_pci_io() return false; } -bool Initializer::test_pci_mmio() +bool test_pci_mmio() { return !ACPI::Parser::the().find_table("MCFG").is_null(); } -void Initializer::initialize_pci_mmio_access_after_test() +void initialize_pci_mmio_access_after_test() { initialize_pci_mmio_access(ACPI::Parser::the().find_table("MCFG")); } -void Initializer::dismiss() -{ - if (s_pci_initializer == nullptr) - return; - klog() << "PCI Subsystem Initializer dismissed."; - delete s_pci_initializer; - s_pci_initializer = nullptr; -} - -Initializer::~Initializer() -{ -} - } } diff --git a/Kernel/PCI/Initializer.h b/Kernel/PCI/Initializer.h index 8ce30781a1..a097e2010a 100644 --- a/Kernel/PCI/Initializer.h +++ b/Kernel/PCI/Initializer.h @@ -26,28 +26,10 @@ #pragma once -#include -#include -#include - namespace Kernel { +namespace PCI { -class PCI::Initializer { -public: - static PCI::Initializer& the(); - void initialize_pci_mmio_access(PhysicalAddress mcfg); - void initialize_pci_io_access(); - void test_and_initialize(bool disable_pci_mmio); - static void dismiss(); - -private: - void detect_devices(); - ~Initializer(); - Initializer(); - bool test_acpi(); - bool test_pci_io(); - bool test_pci_mmio(); - void initialize_pci_mmio_access_after_test(); -}; +void initialize(); } +} diff --git a/Kernel/init.cpp b/Kernel/init.cpp index d66b52a114..cb2fd15248 100644 --- a/Kernel/init.cpp +++ b/Kernel/init.cpp @@ -86,7 +86,6 @@ namespace Kernel { [[noreturn]] static void init_stage2(); static void setup_serial_debug(); static void setup_acpi(); -static void setup_pci(); static void setup_interrupts(); static void setup_time_management(); @@ -171,7 +170,7 @@ void init_stage2() // Sample test to see if the ACPI parser is working... klog() << "ACPI: HPET table @ " << ACPI::Parser::the().find_table("HPET"); - setup_pci(); + PCI::initialize(); if (kernel_command_line().contains("text_debug")) { dbg() << "Text mode enabled"; @@ -389,25 +388,6 @@ void setup_acpi() hang(); } -void setup_pci() -{ - if (!kernel_command_line().contains("pci_mmio")) { - PCI::Initializer::the().test_and_initialize(false); - PCI::Initializer::the().dismiss(); - return; - } - auto pci_mmio = kernel_command_line().get("pci_mmio"); - if (pci_mmio == "on") { - PCI::Initializer::the().test_and_initialize(false); - } else if (pci_mmio == "off") { - PCI::Initializer::the().test_and_initialize(true); - } else { - klog() << "pci_mmio boot argmuent has an invalid value."; - hang(); - } - PCI::Initializer::the().dismiss(); -} - void setup_interrupts() { InterruptManagement::initialize();