1/* @title: MMIO */
2#pragma once
3#include <mem/page.h>
4#include <stddef.h>
5#include <stdint.h>
6#include <types/types.h>
7
8#define MMIO_RANGE_SIZE ((uintptr_t) PAGE_1GB * 64ULL)
9void *mmio_map(paddr_t phys, size_t size);
10void mmio_unmap(void *vaddr, size_t size);
11void mmio_init();
12
13static inline void mmio_write_64(void *address, uint64_t value) {
14 asm volatile("movq %0, (%1)" : : "r"(value), "r"(address) : "memory");
15}
16
17static inline void mmio_write_32(void *address, uint32_t value) {
18 asm volatile("movl %0, (%1)" : : "r"(value), "r"(address) : "memory");
19}
20
21static inline void mmio_write_16(void *address, uint16_t value) {
22 asm volatile("movw %0, (%1)" : : "r"(value), "r"(address) : "memory");
23}
24
25static inline void mmio_write_8(void *address, uint8_t value) {
26 asm volatile("movb %0, (%1)" : : "r"(value), "r"(address) : "memory");
27}
28
29static inline uint64_t mmio_read_64(void *address) {
30 uint64_t value;
31 asm volatile("movq (%1), %0" : "=r"(value) : "r"(address) : "memory");
32 return value;
33}
34
35static inline uint32_t mmio_read_32(void *address) {
36 uint32_t value;
37 asm volatile("movl (%1), %0" : "=r"(value) : "r"(address) : "memory");
38 return value;
39}
40
41static inline uint16_t mmio_read_16(void *address) {
42 uint16_t value;
43 asm volatile("movw (%1), %0" : "=r"(value) : "r"(address) : "memory");
44 return value;
45}
46
47static inline uint8_t mmio_read_8(void *address) {
48 uint8_t value;
49 asm volatile("movb (%1), %0" : "=r"(value) : "r"(address) : "memory");
50 return value;
51}
52