#include "kapi/devices.hpp" #include "kapi/system.hpp" #include "kernel/devices/root_bus.hpp" #include #include #include #include #include #include #include namespace kapi::devices { namespace { auto constinit next_major_number = std::atomic_size_t{0}; auto constinit root_bus = std::optional{}; auto constinit device_tree = kstd::flat_map, kstd::observer_ptr>{}; } // namespace auto init() -> void { auto static is_initialized = std::atomic_flag{}; if (is_initialized.test_and_set()) { return; } root_bus.emplace(); root_bus->init(); } auto get_root_bus() -> bus & { if (!root_bus.has_value()) { kapi::system::panic("[kernel:devices] Root bus not initialized!"); } return *root_bus; } auto allocate_major_number() -> std::size_t { return next_major_number++; } auto register_device(device & device) -> bool { return device_tree.emplace(std::pair{device.major(), device.minor()}, &device).second; } auto unregister_device(device &) -> bool { kstd::println("[kernel:devices] TODO: implement device deregistration"); return false; } } // namespace kapi::devices