This source file includes following definitions.
- virt_to_phys
- phys_to_virt
1 #ifndef __ASM_MIPS_IO_H
2 #define __ASM_MIPS_IO_H
3
4 #include <asm/mipsconfig.h>
5 #include <asm/segment.h>
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38 #define __SLOW_DOWN_IO \
39 __asm__ __volatile__( \
40 "sb\t$0,0x80(%0)" \
41 : : "r" (PORT_BASE));
42
43 #ifdef REALLY_SLOW_IO
44 #define SLOW_DOWN_IO { __SLOW_DOWN_IO; __SLOW_DOWN_IO; __SLOW_DOWN_IO; __SLOW_DOWN_IO; }
45 #else
46 #define SLOW_DOWN_IO __SLOW_DOWN_IO
47 #endif
48
49
50
51
52
53 extern inline unsigned long virt_to_phys(volatile void * address)
54 {
55 return (unsigned long) address - KSEG0;
56 }
57
58 extern inline void * phys_to_virt(unsigned long address)
59 {
60 return (void *) address + KSEG0;
61 }
62
63
64
65
66
67 #define virt_to_bus virt_to_phys
68 #define bus_to_virt phys_to_virt
69
70
71
72
73
74
75
76 #define readb(addr) (*(volatile unsigned char *) (addr))
77 #define readw(addr) (*(volatile unsigned short *) (addr))
78 #define readl(addr) (*(volatile unsigned int *) (addr))
79
80 #define writeb(b,addr) ((*(volatile unsigned char *) (addr)) = (b))
81 #define writew(b,addr) ((*(volatile unsigned short *) (addr)) = (b))
82 #define writel(b,addr) ((*(volatile unsigned int *) (addr)) = (b))
83
84 #define memset_io(a,b,c) memset((void *)(a),(b),(c))
85 #define memcpy_fromio(a,b,c) memcpy((a),(void *)(b),(c))
86 #define memcpy_toio(a,b,c) memcpy((void *)(a),(b),(c))
87
88
89
90
91
92 #define eth_io_copy_and_sum(a,b,c,d) eth_copy_and_sum((a),(void *)(b),(c),(d))
93
94
95
96
97
98 #define __OUT1(s) \
99 extern inline void __out##s(unsigned int value, unsigned int port) {
100
101 #define __OUT2(m) \
102 __asm__ __volatile__ ("s" #m "\t%0,%1(%2)"
103
104 #define __OUT(m,s) \
105 __OUT1(s) __OUT2(m) : : "r" (value), "i" (0), "r" (PORT_BASE+port)); } \
106 __OUT1(s##c) __OUT2(m) : : "r" (value), "ir" (port), "r" (PORT_BASE)); } \
107 __OUT1(s##_p) __OUT2(m) : : "r" (value), "i" (0), "r" (PORT_BASE+port)); \
108 SLOW_DOWN_IO; } \
109 __OUT1(s##c_p) __OUT2(m) : : "r" (value), "ir" (port), "r" (PORT_BASE)); \
110 SLOW_DOWN_IO; }
111
112 #define __IN1(t,s) \
113 extern __inline__ t __in##s(unsigned int port) { t _v;
114
115
116
117
118 #define __IN2(m) \
119 __asm__ __volatile__ ("l" #m "u\t%0,%1(%2)\n\tnop"
120
121 #define __IN(t,m,s) \
122 __IN1(t,s) __IN2(m) : "=r" (_v) : "i" (0), "r" (PORT_BASE+port)); return _v; } \
123 __IN1(t,s##c) __IN2(m) : "=r" (_v) : "ir" (port), "r" (PORT_BASE)); return _v; } \
124 __IN1(t,s##_p) __IN2(m) : "=r" (_v) : "i" (0), "r" (PORT_BASE+port)); SLOW_DOWN_IO; return _v; } \
125 __IN1(t,s##c_p) __IN2(m) : "=r" (_v) : "ir" (port), "r" (PORT_BASE)); SLOW_DOWN_IO; return _v; }
126
127 #define __INS1(s) \
128 extern inline void __ins##s(unsigned int port, void * addr, unsigned long count) {
129
130 #define __INS2(m) \
131 __asm__ __volatile__ ( \
132 ".set\tnoreorder\n\t" \
133 ".set\tnoat\n" \
134 "1:\tl" #m "u\t$1,%4(%5)\n\t" \
135 "subu\t%1,1\n\t" \
136 "s" #m "\t$1,(%0)\n\t" \
137 "bne\t$0,%1,1b\n\t" \
138 "addiu\t%0,%6\n\t" \
139 ".set\tat\n\t" \
140 ".set\treorder"
141
142 #define __INS(m,s,i) \
143 __INS1(s) __INS2(m) \
144 : "=r" (addr), "=r" (count) \
145 : "0" (addr), "1" (count), "i" (0), "r" (PORT_BASE+port), "I" (i) \
146 : "$1");} \
147 __INS1(s##c) __INS2(m) \
148 : "=r" (addr), "=r" (count) \
149 : "0" (addr), "1" (count), "ir" (port), "r" (PORT_BASE), "I" (i) \
150 : "$1");}
151
152 #define __OUTS1(s) \
153 extern inline void __outs##s(unsigned int port, const void * addr, unsigned long count) {
154
155 #define __OUTS2(m) \
156 __asm__ __volatile__ ( \
157 ".set\tnoreorder\n\t" \
158 ".set\tnoat\n" \
159 "1:\tl" #m "u\t$1,(%0)\n\t" \
160 "subu\t%1,%1,1\n\t" \
161 "s" #m "\t$1,%4(%5)\n\t" \
162 "bne\t$0,%1,1b\n\t" \
163 "addiu\t%0,%0,%6\n\t" \
164 ".set\tat\n\t" \
165 ".set\treorder"
166
167 #define __OUTS(m,s,i) \
168 __OUTS1(s) __OUTS2(m) \
169 : "=r" (addr), "=r" (count) \
170 : "0" (addr), "1" (count), "i" (0), "r" (PORT_BASE+port), "I" (i) \
171 : "$1");} \
172 __OUTS1(s##c) __OUTS2(m) \
173 : "=r" (addr), "=r" (count) \
174 : "0" (addr), "1" (count), "ir" (port), "r" (PORT_BASE), "I" (i) \
175 : "$1");}
176
177 __IN(unsigned char,b,b)
178 __IN(unsigned short,h,w)
179 __IN(unsigned int,w,l)
180
181 __OUT(b,b)
182 __OUT(h,w)
183 __OUT(w,l)
184
185 __INS(b,b,1)
186 __INS(h,w,2)
187 __INS(w,l,4)
188
189 __OUTS(b,b,1)
190 __OUTS(h,w,2)
191 __OUTS(w,l,4)
192
193
194
195
196
197
198 #define outb(val,port) \
199 ((__builtin_constant_p((port)) && (port) < 32768) ? \
200 __outbc((val),(port)) : \
201 __outb((val),(port)))
202
203 #define inb(port) \
204 ((__builtin_constant_p((port)) && (port) < 32768) ? \
205 __inbc(port) : \
206 __inb(port))
207
208 #define outb_p(val,port) \
209 ((__builtin_constant_p((port)) && (port) < 32768) ? \
210 __outbc_p((val),(port)) : \
211 __outb_p((val),(port)))
212
213 #define inb_p(port) \
214 ((__builtin_constant_p((port)) && (port) < 32768) ? \
215 __inbc_p(port) : \
216 __inb_p(port))
217
218 #define outw(val,port) \
219 ((__builtin_constant_p((port)) && (port) < 32768) ? \
220 __outwc((val),(port)) : \
221 __outw((val),(port)))
222
223 #define inw(port) \
224 ((__builtin_constant_p((port)) && (port) < 32768) ? \
225 __inwc(port) : \
226 __inw(port))
227
228 #define outw_p(val,port) \
229 ((__builtin_constant_p((port)) && (port) < 32768) ? \
230 __outwc_p((val),(port)) : \
231 __outw_p((val),(port)))
232
233 #define inw_p(port) \
234 ((__builtin_constant_p((port)) && (port) < 32768) ? \
235 __inwc_p(port) : \
236 __inw_p(port))
237
238 #define outl(val,port) \
239 ((__builtin_constant_p((port)) && (port) < 32768) ? \
240 __outlc((val),(port)) : \
241 __outl((val),(port)))
242
243 #define inl(port) \
244 ((__builtin_constant_p((port)) && (port) < 32768) ? \
245 __inlc(port) : \
246 __inl(port))
247
248 #define outl_p(val,port) \
249 ((__builtin_constant_p((port)) && (port) < 32768) ? \
250 __outlc_p((val),(port)) : \
251 __outl_p((val),(port)))
252
253 #define inl_p(port) \
254 ((__builtin_constant_p((port)) && (port) < 32768) ? \
255 __inlc_p(port) : \
256 __inl_p(port))
257
258
259 #define outsb(port,addr,count) \
260 ((__builtin_constant_p((port)) && (port) < 32768) ? \
261 __outsbc((port),(addr),(count)) : \
262 __outsb ((port),(addr),(count)))
263
264 #define insb(port,addr,count) \
265 ((__builtin_constant_p((port)) && (port) < 32768) ? \
266 __insbc((port),(addr),(count)) : \
267 __insb((port),(addr),(count)))
268
269 #define outsw(port,addr,count) \
270 ((__builtin_constant_p((port)) && (port) < 32768) ? \
271 __outswc((port),(addr),(count)) : \
272 __outsw ((port),(addr),(count)))
273
274 #define insw(port,addr,count) \
275 ((__builtin_constant_p((port)) && (port) < 32768) ? \
276 __inswc((port),(addr),(count)) : \
277 __insw((port),(addr),(count)))
278
279 #define outsl(port,addr,count) \
280 ((__builtin_constant_p((port)) && (port) < 32768) ? \
281 __outslc((port),(addr),(count)) : \
282 __outsl ((port),(addr),(count)))
283
284 #define insl(port,addr,count) \
285 ((__builtin_constant_p((port)) && (port) < 32768) ? \
286 __inslc((port),(addr),(count)) : \
287 __insl((port),(addr),(count)))
288
289 #endif