Revision: linuxbios@linuxbios.org--devel/freebios--devel--2.0--patch-51
[coreboot.git] / src / arch / i386 / include / arch / io.h
1 #ifndef _ASM_IO_H
2 #define _ASM_IO_H
3
4 #include <stdint.h>
5
6 /*
7  * This file contains the definitions for the x86 IO instructions
8  * inb/inw/inl/outb/outw/outl and the "string versions" of the same
9  * (insb/insw/insl/outsb/outsw/outsl). You can also use "pausing"
10  * versions of the single-IO instructions (inb_p/inw_p/..).
11  */
12 #if defined( __ROMCC__ ) && !defined (__GNUC__) 
13 static inline void outb(uint8_t value, uint16_t port)
14 {
15         __builtin_outb(value, port);
16 }
17
18 static inline void outw(uint16_t value, uint16_t port)
19 {
20         __builtin_outw(value, port);
21 }
22
23 static inline void outl(uint32_t value, uint16_t port)
24 {
25         __builtin_outl(value, port);
26 }
27
28
29 static inline uint8_t inb(uint16_t port)
30 {
31         return __builtin_inb(port);
32 }
33
34
35 static inline uint16_t inw(uint16_t port)
36 {
37         return __builtin_inw(port);
38 }
39
40 static inline uint32_t inl(uint16_t port)
41 {
42         return __builtin_inl(port);
43 }
44 #else
45
46 static inline void outb(uint8_t value, uint16_t port)
47 {
48         __asm__ __volatile__ ("outb %b0, %w1" : : "a" (value), "Nd" (port));
49 }
50
51 static inline void outw(uint16_t value, uint16_t port)
52 {
53         __asm__ __volatile__ ("outw %w0, %w1" : : "a" (value), "Nd" (port));
54 }
55
56 static inline void outl(uint32_t value, uint16_t port)
57 {
58         __asm__ __volatile__ ("outl %0, %w1" : : "a" (value), "Nd" (port));
59 }
60
61 static inline uint8_t inb(uint16_t port)
62 {
63         uint8_t value;
64         __asm__ __volatile__ ("inb %w1, %b0" : "=a"(value) : "Nd" (port));
65         return value;
66 }
67
68 static inline uint16_t inw(uint16_t port)
69 {
70         uint16_t value;
71         __asm__ __volatile__ ("inw %w1, %w0" : "=a"(value) : "Nd" (port));
72         return value;
73 }
74
75 static inline uint32_t inl(uint16_t port)
76 {
77         uint32_t value;
78         __asm__ __volatile__ ("inl %w1, %0" : "=a"(value) : "Nd" (port));
79         return value;
80 }
81
82 #endif /* __ROMCC__ && !__GNUC__*/
83
84 static inline void outsb(uint16_t port, const void *addr, unsigned long count)
85 {
86         __asm__ __volatile__ (
87                 "cld ; rep ; outsb " 
88                 : "=S" (addr), "=c" (count)
89                 : "d"(port), "0"(addr), "1" (count)
90                 );
91 }
92
93 static inline void outsw(uint16_t port, const void *addr, unsigned long count)
94 {
95         __asm__ __volatile__ (
96                 "cld ; rep ; outsw " 
97                 : "=S" (addr), "=c" (count)
98                 : "d"(port), "0"(addr), "1" (count)
99                 );
100 }
101
102 static inline void outsl(uint16_t port, const void *addr, unsigned long count)
103 {
104         __asm__ __volatile__ (
105                 "cld ; rep ; outsl " 
106                 : "=S" (addr), "=c" (count)
107                 : "d"(port), "0"(addr), "1" (count)
108                 );
109 }
110
111
112 static inline void insb(uint16_t port, void *addr, unsigned long count)
113 {
114         __asm__ __volatile__ (
115                 "cld ; rep ; insb " 
116                 : "=D" (addr), "=c" (count)
117                 : "d"(port), "0"(addr), "1" (count)
118                 );
119 }
120
121 static inline void insw(uint16_t port, void *addr, unsigned long count)
122 {
123         __asm__ __volatile__ (
124                 "cld ; rep ; insw " 
125                 : "=D" (addr), "=c" (count)
126                 : "d"(port), "0"(addr), "1" (count)
127                 );
128 }
129
130 static inline void insl(uint16_t port, void *addr, unsigned long count)
131 {
132         __asm__ __volatile__ (
133                 "cld ; rep ; insl " 
134                 : "=D" (addr), "=c" (count)
135                 : "d"(port), "0"(addr), "1" (count)
136                 );
137 }
138
139 static inline void writeb(uint8_t b, volatile void *addr)
140 {
141         *(volatile uint8_t *) addr = b;
142 }
143
144 static inline void writew(uint16_t b, volatile void *addr)
145 {
146         *(volatile uint16_t *) addr = b;
147 }
148
149 static inline void writel(uint32_t b, volatile void *addr)
150 {
151         *(volatile uint32_t *) addr = b;
152 }
153
154 static inline uint8_t readb(const volatile void *addr)
155 {
156         return *(volatile uint8_t *) addr;
157 }
158
159 static inline uint16_t readw(const volatile void *addr)
160 {
161         return *(volatile uint16_t *) addr;
162 }
163
164 static inline uint32_t readl(const volatile void *addr)
165 {
166         return *(volatile uint32_t *) addr;
167 }
168
169 #endif
170