aboutsummaryrefslogtreecommitdiff
path: root/kernel/kapi/memory.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/kapi/memory.cpp')
-rw-r--r--kernel/kapi/memory.cpp25
1 files changed, 25 insertions, 0 deletions
diff --git a/kernel/kapi/memory.cpp b/kernel/kapi/memory.cpp
index 06a3165..b224c50 100644
--- a/kernel/kapi/memory.cpp
+++ b/kernel/kapi/memory.cpp
@@ -3,6 +3,7 @@
#include "kapi/system.hpp"
#include "kernel/memory/bitmap_allocator.hpp"
+#include "kernel/memory/mmio_allocator.hpp"
#include <kstd/print>
#include <kstd/units>
@@ -63,6 +64,7 @@ namespace kapi::memory
constinit bad_frame_allocator bad_frame_allocator::instance{};
constinit bad_page_mapper bad_page_mapper::instance{};
auto constinit allocator = std::optional<kernel::memory::bitmap_frame_allocator>{};
+ auto constinit mmio_allocator = std::optional<kernel::memory::mmio_allocator>{};
} // namespace
constinit auto static active_frame_allocator = static_cast<frame_allocator *>(&bad_frame_allocator::instance);
@@ -147,4 +149,27 @@ namespace kapi::memory
kstd::println("[OS:MEM] Physical memory manager initialized.");
}
+ auto init_mmio(linear_address base, std::size_t page_count) -> void
+ {
+ mmio_allocator.emplace(base, page_count);
+ }
+
+ auto allocate_mmio_region(std::size_t page_count) -> linear_address
+ {
+ auto region = mmio_allocator->allocate(page_count);
+ return region;
+ }
+
+ auto map_mmio_region(linear_address base, physical_address hw_base, page_mapper::flags flags) -> std::byte *
+ {
+ auto start_page = page::containing(base);
+ auto start_frame = frame::containing(hw_base);
+ return map(start_page, start_frame, flags | page_mapper::flags::uncached);
+ }
+
+ auto release_mmio_region(linear_address base) -> void
+ {
+ mmio_allocator->release(base);
+ }
+
} // namespace kapi::memory