Finalize arg, env, aux migration (1/3) (CXX) (BB)
[akaros.git] / kern / include / mmio.h
1 /* Generic I/O port emulation, based on MN10300 code
2  *
3  * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved.
4  * Written by David Howells (dhowells@redhat.com)
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public Licence
8  * as published by the Free Software Foundation; either version
9  * 2 of the Licence, or (at your option) any later version.
10  *
11  * Modified for Akaros (mostly just trimmed down and change b->8, w->16, etc).
12  * Arches can't override these either.  I'm undecided about void* vs uintptr_t
13  * for the addr parameter.
14  */
15
16 #ifndef ROS_KERN_MMIO_H
17 #define ROS_KERN_MMIO_H
18
19 #include <sys/types.h>
20 #include <endian.h>
21
22 #define __iomem
23 #define __force
24
25 /*
26  * __raw_{read,write}{8,16,32,64}() access memory in native endianness.
27  *
28  * On some architectures memory mapped IO needs to be accessed differently.
29  * On the simple architectures, we just read/write the memory location
30  * directly.
31  */
32 static inline uint8_t __raw_read8(const volatile void __iomem *addr)
33 {
34         return *(const volatile uint8_t __force *)addr;
35 }
36
37 static inline uint16_t __raw_read16(const volatile void __iomem *addr)
38 {
39         return *(const volatile uint16_t __force *)addr;
40 }
41
42 static inline uint32_t __raw_read32(const volatile void __iomem *addr)
43 {
44         return *(const volatile uint32_t __force *)addr;
45 }
46
47 static inline uint64_t __raw_read64(const volatile void __iomem *addr)
48 {
49         return *(const volatile uint64_t __force *)addr;
50 }
51
52 static inline void __raw_write8(uint8_t value, volatile void __iomem *addr)
53 {
54         *(volatile uint8_t __force *)addr = value;
55 }
56
57 static inline void __raw_write16(uint16_t value, volatile void __iomem *addr)
58 {
59         *(volatile uint16_t __force *)addr = value;
60 }
61
62 static inline void __raw_write32(uint32_t value, volatile void __iomem *addr)
63 {
64         *(volatile uint32_t __force *)addr = value;
65 }
66
67 static inline void __raw_write64(uint64_t value, volatile void __iomem *addr)
68 {
69         *(volatile uint64_t __force *)addr = value;
70 }
71
72 /*
73  * {read,write}{8,16,32,64}() access little endian memory and return result in
74  * native endianness.
75  */
76 static inline uint8_t read8(const volatile void __iomem *addr)
77 {
78         return __raw_read8(addr);
79 }
80
81 static inline uint16_t read16(const volatile void __iomem *addr)
82 {
83         return le16_to_cpu(__raw_read16(addr));
84 }
85
86 static inline uint32_t read32(const volatile void __iomem *addr)
87 {
88         return le32_to_cpu(__raw_read32(addr));
89 }
90
91 static inline uint64_t read64(const volatile void __iomem *addr)
92 {
93         return le64_to_cpu(__raw_read64(addr));
94 }
95
96 static inline void write8(uint8_t value, volatile void __iomem *addr)
97 {
98         __raw_write8(value, addr);
99 }
100
101 static inline void write16(uint16_t value, volatile void __iomem *addr)
102 {
103         __raw_write16(cpu_to_le16(value), addr);
104 }
105
106 static inline void write32(uint32_t value, volatile void __iomem *addr)
107 {
108         __raw_write32(cpu_to_le32(value), addr);
109 }
110
111 static inline void write64(uint64_t value, volatile void __iomem *addr)
112 {
113         __raw_write64(cpu_to_le64(value), addr);
114 }
115
116 #endif /* ROS_KERN_MMIO_H */