1#include <drivers/mmio.h>
2#include <mem/address_range.h>
3#include <mem/alloc_or_die.h>
4#include <mem/page.h>
5#include <mem/vas.h>
6#include <mem/vmm.h>
7
8static struct vas *mmio_vas_space = NULL;
9ADDRESS_RANGE_DECLARE(mmio, .align = PAGE_1GB, .flags = ADDRESS_RANGE_DYNAMIC,
10 .size = MMIO_RANGE_SIZE);
11
12void mmio_init() {
13 mmio_vas_space = alloc_or_die(vas_from(&ADDRESS_RANGE(mmio)));
14}
15
16void *mmio_map(paddr_t phys, size_t size) {
17 kassert(mmio_vas_space);
18 return vas_map(vas: mmio_vas_space, paddr: phys, len: size, PAGE_WRITE | PAGE_UNCACHABLE,
19 vflags: VMM_FLAG_NONE);
20}
21
22void mmio_unmap(void *vaddr, size_t size) {
23 kassert(mmio_vas_space);
24 vas_unmap(vas: mmio_vas_space, vaddr, len: size);
25}
26