1#include <drivers/mmio.h>
2#include <mem/address_range.h>
3#include <mem/nofail.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_DEFINE(mmio, .align = PAGE_1GB, .flags = ADDRESS_RANGE_DYNAMIC,
10 .size = MMIO_RANGE_SIZE);
11
12void mmio_init(void) {
13 mmio_vas_space = nofail(vas_from(&ADDRESS_RANGE(mmio)));
14}
15
16static inline cc_always_inline void *mmio_map_raw(paddr_t phys, size_t size,
17 bool cacheable) {
18 enforce(mmio_vas_space, UNINITIALIZED);
19 return vas_map(mmio_vas_space, phys, size,
20 .page_flags =
21 PAGE_WRITE | (cacheable ? PAGE_UNCACHABLE : 0));
22}
23
24void cc_mem_io *mmio_map(paddr_t phys, size_t size) {
25 return (void cc_mem_io *) mmio_map_raw(phys, size, false);
26}
27
28void *mmio_map_dma(paddr_t phys, size_t size) {
29 return mmio_map_raw(phys, size, true);
30}
31
32void mmio_unmap(void cc_mem_io *vaddr, size_t size) {
33 enforce(mmio_vas_space, UNINITIALIZED);
34 vas_unmap(vas: mmio_vas_space, vaddr: (void *) vaddr, len: size);
35}
36