diff options
Diffstat (limited to 'kernel/kapi/devices.cpp')
| -rw-r--r-- | kernel/kapi/devices.cpp | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/kernel/kapi/devices.cpp b/kernel/kapi/devices.cpp new file mode 100644 index 0000000..031f2c9 --- /dev/null +++ b/kernel/kapi/devices.cpp @@ -0,0 +1,87 @@ +#include "kapi/devices.hpp" + +#include "kapi/system.hpp" + +#include "kernel/devices/root_bus.hpp" + +#include <kstd/flat_map> +#include <kstd/memory> +#include <kstd/print> + +#include <atomic> +#include <cstddef> +#include <optional> +#include <string_view> +#include <utility> + +namespace kapi::devices +{ + + namespace + { + auto constinit next_major_number = std::atomic_size_t{1}; + auto constinit root_bus = std::optional<kernel::devices::root_bus>{}; + auto constinit device_tree = kstd::flat_map<std::pair<std::size_t, std::size_t>, kstd::observer_ptr<device>>{}; + } // namespace + + auto init() -> void + { + auto static is_initialized = std::atomic_flag{}; + if (is_initialized.test_and_set()) + { + return; + } + + auto & bus = root_bus.emplace(); + register_device(bus); + bus.init(); + } + + auto get_root_bus() -> bus & + { + if (!root_bus.has_value()) + { + kapi::system::panic("[OS:DEV] Root bus not initialized!"); + } + return *root_bus; + } + + auto allocate_major_number() -> std::size_t + { + return next_major_number++; + } + + auto register_device(device & device) -> bool + { + kstd::println("[OS:DEV] Registering device {}@{}:{}", device.name(), device.major(), device.minor()); + return device_tree.emplace(std::pair{device.major(), device.minor()}, &device).second; + } + + auto unregister_device(device &) -> bool + { + kstd::println("[OS:DEV] TODO: implement device deregistration"); + return false; + } + + auto find_device(std::size_t major, std::size_t minor) -> kstd::observer_ptr<device> + { + if (device_tree.contains(std::pair{major, minor})) + { + return device_tree.at(std::pair{major, minor}); + } + return nullptr; + } + + auto find_device(std::string_view name) -> kstd::observer_ptr<device> + { + for (auto const & [key, value] : device_tree) + { + if (value->name() == name) + { + return value; + } + } + return nullptr; + } + +} // namespace kapi::devices
\ No newline at end of file |
