aboutsummaryrefslogtreecommitdiff
path: root/kernel/src/devices/storage/management.cpp
diff options
context:
space:
mode:
authorLukas Oesch <lukas.oesch@ost.ch>2026-06-10 10:40:46 +0200
committerLukas Oesch <lukas.oesch@ost.ch>2026-06-10 10:40:46 +0200
commit33abd5cf264cb9e34121082105b0bc17b3cf7a36 (patch)
tree36b15d53fea04f4f9d9af817100f7ad013bd9b5c /kernel/src/devices/storage/management.cpp
parentd01caf1c4aef3c89c68b9d1cc9fe56445f0860b5 (diff)
parent7e27130c342b7299a1d2188a7192a7f17b5ac2ad (diff)
downloadkernel-33abd5cf264cb9e34121082105b0bc17b3cf7a36.tar.xz
kernel-33abd5cf264cb9e34121082105b0bc17b3cf7a36.zip
Merge branch 'develop-BA-FS26' into 'develop'HEADdevelop
Merge of BA-FS26 branch into develop See merge request teachos/kernel!49
Diffstat (limited to 'kernel/src/devices/storage/management.cpp')
-rw-r--r--kernel/src/devices/storage/management.cpp95
1 files changed, 95 insertions, 0 deletions
diff --git a/kernel/src/devices/storage/management.cpp b/kernel/src/devices/storage/management.cpp
new file mode 100644
index 0000000..06efc27
--- /dev/null
+++ b/kernel/src/devices/storage/management.cpp
@@ -0,0 +1,95 @@
+#include <kernel/devices/storage/management.hpp>
+
+#include <kernel/devices/storage/controller.hpp>
+#include <kernel/devices/storage/ram_disk/controller.hpp>
+
+#include <kapi/boot_modules.hpp>
+#include <kapi/devices/device.hpp>
+#include <kapi/system.hpp>
+
+#include <kstd/memory>
+#include <kstd/vector>
+
+#include <algorithm>
+#include <cstddef>
+#include <optional>
+#include <ranges>
+
+namespace
+{
+ constexpr size_t static minors_per_device = 16;
+ constexpr size_t static start_major = 1;
+ constinit size_t static next_free_major = start_major;
+
+ constinit auto static storage_management = std::optional<kernel::devices::storage::management>{};
+} // namespace
+
+namespace kernel::devices::storage
+{
+ auto management::init() -> void
+ {
+ if (storage_management)
+ {
+ kapi::system::panic("[DEVICES] Storage management has already been initialized.");
+ }
+ storage_management.emplace(management{});
+
+ auto ram_disk_controller = kstd::make_shared<ram_disk::controller>(&kapi::boot_modules::get_boot_module_registry());
+ storage_management->add_controller(ram_disk_controller);
+
+ std::ranges::for_each(storage_management->m_controllers, [](auto controller) { controller->probe(); });
+ }
+
+ auto management::get() -> management &
+ {
+ if (!storage_management)
+ {
+ kapi::system::panic("[DEVICES] Storage management has not been initialized.");
+ }
+
+ return *storage_management;
+ }
+
+ auto management::add_controller(kstd::shared_ptr<controller> const & controller) -> void
+ {
+ controller->set_ids(next_free_major++, minors_per_device);
+ m_controllers.push_back(controller);
+ }
+
+ auto management::all_controllers() const -> kstd::vector<kstd::shared_ptr<controller>> const &
+ {
+ return m_controllers;
+ }
+
+ auto management::device_by_major_minor(size_t major, size_t minor) -> kstd::shared_ptr<kapi::devices::device>
+ {
+ auto found = std::ranges::find_if(m_controllers, [=](auto const & controller) {
+ if (controller != nullptr && controller->major() == major)
+ {
+ return controller->device_by_minor(minor) != nullptr;
+ }
+ return false;
+ });
+
+ if (found != std::ranges::cend(m_controllers))
+ {
+ return found->get()->device_by_minor(minor);
+ }
+
+ return nullptr;
+ }
+
+ auto management::determine_boot_device() -> kstd::shared_ptr<kapi::devices::device>
+ {
+ return device_by_major_minor(start_major, 0);
+ }
+} // namespace kernel::devices::storage
+
+namespace kernel::tests::devices::storage::management
+{
+ auto deinit() -> void
+ {
+ storage_management.reset();
+ next_free_major = start_major;
+ }
+} // namespace kernel::tests::devices::storage::management