#include "kapi/devices.hpp" #include "kapi/acpi.hpp" #include "kapi/boot.hpp" #include "arch/boot/boot.hpp" #include "arch/bus/isa.hpp" #include "arch/devices/legacy_pit.hpp" #include #include #include #include namespace kapi::devices { namespace { constexpr auto pit_frequency_in_hz = std::uint32_t{100u}; } auto init_platform_devices() -> void { auto const & mbi = boot::bootstrap_information.mbi; auto system_description_pointer = static_cast(nullptr); if (auto const & xsdp = mbi->maybe_acpi_xsdp()) { auto data = xsdp->pointer().data(); system_description_pointer = reinterpret_cast(data); } else if (auto const & rsdp = mbi->maybe_acpi_rsdp()) { auto data = rsdp->pointer().data(); system_description_pointer = reinterpret_cast(data); } if (system_description_pointer) { if (!kapi::acpi::init(*system_description_pointer)) { kstd::println(kstd::print_sink::stderr, "[x86_64:DEV] ACPI initialization failed. No tables loaded."); } } else { kstd::println(kstd::print_sink::stderr, "[x86_64:DEV] No ACPI RSDP found. Most devices will not be available."); } 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 = get_root_bus(); root_bus.add_child(std::move(isa_bus)); } } // namespace kapi::devices