| 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 | |
| 8 | static struct vas *mmio_vas_space = NULL; |
| 9 | ADDRESS_RANGE_DECLARE(mmio, .align = PAGE_1GB, .flags = ADDRESS_RANGE_DYNAMIC, |
| 10 | .size = MMIO_RANGE_SIZE); |
| 11 | |
| 12 | void mmio_init() { |
| 13 | mmio_vas_space = alloc_or_die(vas_from(&ADDRESS_RANGE(mmio))); |
| 14 | } |
| 15 | |
| 16 | void *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 | |
| 22 | void mmio_unmap(void *vaddr, size_t size) { |
| 23 | kassert(mmio_vas_space); |
| 24 | vas_unmap(vas: mmio_vas_space, vaddr, len: size); |
| 25 | } |
| 26 | |