[efi] Add EFI image format and basic runtime environment
[people/sha0/gpxe.git] / src / include / gpxe / efi / efi_io.h
1 #ifndef _GPXE_EFI_IO_H
2 #define _GPXE_EFI_IO_H
3
4 /** @file
5  *
6  * gPXE I/O API for EFI
7  *
8  * EFI runs with flat physical addressing, so the various mappings
9  * between virtual addresses, I/O addresses and bus addresses are all
10  * no-ops.  I/O is handled using the EFI_CPU_IO_PROTOCOL.
11  */
12
13 #ifdef IOAPI_EFI
14 #define IOAPI_PREFIX_efi
15 #else
16 #define IOAPI_PREFIX_efi __efi_
17 #endif
18
19 extern unsigned long long efi_ioread ( volatile void *io_addr,
20                                        size_t size );
21 extern void efi_iowrite ( unsigned long long data, volatile void *io_addr,
22                           size_t size );
23 extern void efi_ioreads ( volatile void *io_addr, void *data,
24                           size_t size, unsigned int count );
25 extern void efi_iowrites ( volatile void *io_addr, const void *data,
26                           size_t size, unsigned int count );
27
28 /*
29  * Physical<->Bus and Bus<->I/O address mappings
30  *
31  * EFI runs with flat physical addressing, so these are all no-ops.
32  *
33  */
34
35 static inline __always_inline unsigned long
36 IOAPI_INLINE ( efi, phys_to_bus ) ( unsigned long phys_addr ) {
37         return phys_addr;
38 }
39
40 static inline __always_inline unsigned long
41 IOAPI_INLINE ( efi, bus_to_phys ) ( unsigned long bus_addr ) {
42         return bus_addr;
43 }
44
45 static inline __always_inline void *
46 IOAPI_INLINE ( efi, ioremap ) ( unsigned long bus_addr, size_t len __unused ) {
47         return ( ( void * ) bus_addr );
48 }
49
50 static inline __always_inline void
51 IOAPI_INLINE ( efi, iounmap ) ( volatile const void *io_addr __unused ) {
52         /* Nothing to do */
53 }
54
55 static inline __always_inline unsigned long
56 IOAPI_INLINE ( efi, io_to_bus ) ( volatile const void *io_addr ) {
57         return ( ( unsigned long ) io_addr );
58 }
59
60 /*
61  * I/O functions
62  *
63  */
64
65 static inline __always_inline uint8_t
66 IOAPI_INLINE ( efi, readb ) ( volatile uint8_t *io_addr ) {
67         return efi_ioread ( io_addr, sizeof ( *io_addr ) );
68 }
69
70 static inline __always_inline uint16_t
71 IOAPI_INLINE ( efi, readw ) ( volatile uint16_t *io_addr ) {
72         return efi_ioread ( io_addr, sizeof ( *io_addr ) );
73 }
74
75 static inline __always_inline uint32_t
76 IOAPI_INLINE ( efi, readl ) ( volatile uint32_t *io_addr ) {
77         return efi_ioread ( io_addr, sizeof ( *io_addr ) );
78 }
79
80 static inline __always_inline uint64_t
81 IOAPI_INLINE ( efi, readq ) ( volatile uint64_t *io_addr ) {
82         return efi_ioread ( io_addr, sizeof ( *io_addr ) );
83 }
84
85 static inline __always_inline void
86 IOAPI_INLINE ( efi, writeb ) ( uint8_t data, volatile uint8_t *io_addr ) {
87         efi_iowrite ( data, io_addr, sizeof ( *io_addr ) );
88 }
89
90 static inline __always_inline void
91 IOAPI_INLINE ( efi, writew ) ( uint16_t data, volatile uint16_t *io_addr ) {
92         efi_iowrite ( data, io_addr, sizeof ( *io_addr ) );
93 }
94
95 static inline __always_inline void
96 IOAPI_INLINE ( efi, writel ) ( uint32_t data, volatile uint32_t *io_addr ) {
97         efi_iowrite ( data, io_addr, sizeof ( *io_addr ) );
98 }
99
100 static inline __always_inline void
101 IOAPI_INLINE ( efi, writeq ) ( uint64_t data, volatile uint64_t *io_addr ) {
102         efi_iowrite ( data, io_addr, sizeof ( *io_addr ) );
103 }
104
105 static inline __always_inline uint8_t
106 IOAPI_INLINE ( efi, inb ) ( volatile uint8_t *io_addr ) {
107         return efi_ioread ( io_addr, sizeof ( *io_addr ) );
108 }
109
110 static inline __always_inline uint16_t
111 IOAPI_INLINE ( efi, inw ) ( volatile uint16_t *io_addr ) {
112         return efi_ioread ( io_addr, sizeof ( *io_addr ) );
113 }
114
115 static inline __always_inline uint32_t
116 IOAPI_INLINE ( efi, inl ) ( volatile uint32_t *io_addr ) {
117         return efi_ioread ( io_addr, sizeof ( *io_addr ) );
118 }
119
120 static inline __always_inline void
121 IOAPI_INLINE ( efi, outb ) ( uint8_t data, volatile uint8_t *io_addr ) {
122         efi_iowrite ( data, io_addr, sizeof ( *io_addr ) );
123 }
124
125 static inline __always_inline void
126 IOAPI_INLINE ( efi, outw ) ( uint16_t data, volatile uint16_t *io_addr ) {
127         efi_iowrite ( data, io_addr, sizeof ( *io_addr ) );
128 }
129
130 static inline __always_inline void
131 IOAPI_INLINE ( efi, outl ) ( uint32_t data, volatile uint32_t *io_addr ) {
132         efi_iowrite ( data, io_addr, sizeof ( *io_addr ) );
133 }
134
135 static inline __always_inline void
136 IOAPI_INLINE ( efi, insb ) ( volatile uint8_t *io_addr, uint8_t *data,
137                              unsigned int count ) {
138         efi_ioreads ( io_addr, data, sizeof ( *io_addr ), count );
139 }
140
141 static inline __always_inline void
142 IOAPI_INLINE ( efi, insw ) ( volatile uint16_t *io_addr, uint16_t *data,
143                              unsigned int count ) {
144         efi_ioreads ( io_addr, data, sizeof ( *io_addr ), count );
145 }
146
147 static inline __always_inline void
148 IOAPI_INLINE ( efi, insl ) ( volatile uint32_t *io_addr, uint32_t *data,
149                              unsigned int count ) {
150         efi_ioreads ( io_addr, data, sizeof ( *io_addr ), count );
151 }
152
153 static inline __always_inline void
154 IOAPI_INLINE ( efi, outsb ) ( volatile uint8_t *io_addr, const uint8_t *data,
155                               unsigned int count ) {
156         efi_iowrites ( io_addr, data, sizeof ( *io_addr ), count );
157 }
158
159 static inline __always_inline void
160 IOAPI_INLINE ( efi, outsw ) ( volatile uint16_t *io_addr, const uint16_t *data,
161                               unsigned int count ) {
162         efi_iowrites ( io_addr, data, sizeof ( *io_addr ), count );
163 }
164
165 static inline __always_inline void
166 IOAPI_INLINE ( efi, outsl ) ( volatile uint32_t *io_addr, const uint32_t *data,
167                               unsigned int count ) {
168         efi_iowrites ( io_addr, data, sizeof ( *io_addr ), count );
169 }
170
171 static inline __always_inline void
172 IOAPI_INLINE ( efi, mb ) ( void ) {
173         /* Do nothing; EFI readl()/writel() calls already act as
174          * memory barriers.
175          */
176 }
177
178 #endif /* _GPXE_EFI_IO_H */