| 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 | |
| 8 | static struct vas *mmio_vas_space = NULL; |
| 9 | ADDRESS_RANGE_DEFINE(mmio, .align = PAGE_1GB, .flags = ADDRESS_RANGE_DYNAMIC, |
| 10 | .size = MMIO_RANGE_SIZE); |
| 11 | |
| 12 | void mmio_init(void) { |
| 13 | mmio_vas_space = nofail(vas_from(&ADDRESS_RANGE(mmio))); |
| 14 | } |
| 15 | |
| 16 | static 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 | |
| 24 | void 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 | |
| 28 | void *mmio_map_dma(paddr_t phys, size_t size) { |
| 29 | return mmio_map_raw(phys, size, true); |
| 30 | } |
| 31 | |
| 32 | void 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 | |