#include "arch/devices/init.hpp" #include "kapi/acpi.hpp" #include "kapi/cpu.hpp" #include "kapi/devices.hpp" #include "arch/boot/boot.hpp" #include "arch/bus/isa.hpp" #include "arch/devices/legacy_pit.hpp" #include #include #include #include #include namespace arch::devices { namespace { constexpr auto pit_frequency_in_hz = std::uint32_t{100u}; auto get_acpi_root_pointer() -> kstd::observer_ptr<::acpi::rsdp const> { auto const & mbi = kapi::boot::bootstrap_information.mbi; auto system_description_pointer = static_cast<::acpi::rsdp const *>(nullptr); if (auto const & xsdp = mbi->maybe_acpi_xsdp()) { auto data = xsdp->pointer().data(); system_description_pointer = reinterpret_cast<::acpi::xsdp const *>(data); } else if (auto const & rsdp = mbi->maybe_acpi_rsdp()) { auto data = rsdp->pointer().data(); system_description_pointer = reinterpret_cast<::acpi::rsdp const *>(data); } return kstd::make_observer(system_description_pointer); } } // namespace auto init_acpi_devices() -> void { auto acpi_root_pointer = get_acpi_root_pointer(); if (acpi_root_pointer && acpi_root_pointer->validate()) { if (kapi::acpi::init(*acpi_root_pointer)) { kstd::println("[x86_64:DEV] ACPI subsystem initialized."); } } kapi::cpu::discover_topology(); } auto init_legacy_devices() -> void { kstd::println("[x86_64:DEV] Initializing ISA bus..."); auto isa_major_number = kapi::devices::allocate_major_number(); auto isa_bus = kstd::make_unique(isa_major_number); auto pit_major_number = kapi::devices::allocate_major_number(); auto pit = kstd::make_unique(pit_major_number, pit_frequency_in_hz); isa_bus->add_child(std::move(pit)); auto & root_bus = kapi::devices::get_root_bus(); root_bus.add_child(std::move(isa_bus)); } } // namespace arch::devices