1#ifndef _ASM_IO_H
2#define _ASM_IO_H
3
4#include <linux/config.h>
5
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
39#ifdef SLOW_IO_BY_JUMPING
40#define __SLOW_DOWN_IO "\njmp 1f\n1:\tjmp 1f\n1:"
41#else
42#define __SLOW_DOWN_IO "\noutb %%al,$0x80"
43#endif
44
45#ifdef REALLY_SLOW_IO
46#define __FULL_SLOW_DOWN_IO __SLOW_DOWN_IO __SLOW_DOWN_IO __SLOW_DOWN_IO __SLOW_DOWN_IO
47#else
48#define __FULL_SLOW_DOWN_IO __SLOW_DOWN_IO
49#endif
50
51
52
53
54#define __OUT1(s,x) \
55extern inline void out##s(unsigned x value, unsigned short port) {
56
57#define __OUT2(s,s1,s2) \
58__asm__ __volatile__ ("out" #s " %" s1 "0,%" s2 "1"
59
60#define __OUT(s,s1,x) \
61__OUT1(s,x) __OUT2(s,s1,"w") : : "a" (value), "Nd" (port)); } \
62__OUT1(s##_p,x) __OUT2(s,s1,"w") __FULL_SLOW_DOWN_IO : : "a" (value), "Nd" (port));} \
63
64#define __IN1(s) \
65extern inline RETURN_TYPE in##s(unsigned short port) { RETURN_TYPE _v;
66
67#define __IN2(s,s1,s2) \
68__asm__ __volatile__ ("in" #s " %" s2 "1,%" s1 "0"
69
70#define __IN(s,s1,i...) \
71__IN1(s) __IN2(s,s1,"w") : "=a" (_v) : "Nd" (port) ,##i ); return _v; } \
72__IN1(s##_p) __IN2(s,s1,"w") __FULL_SLOW_DOWN_IO : "=a" (_v) : "Nd" (port) ,##i ); return _v; } \
73
74#define __INS(s) \
75extern inline void ins##s(unsigned short port, void * addr, unsigned long count) \
76{ __asm__ __volatile__ ("rep ; ins" #s \
77: "=D" (addr), "=c" (count) : "d" (port),"0" (addr),"1" (count)); }
78
79#define __OUTS(s) \
80extern inline void outs##s(unsigned short port, const void * addr, unsigned long count) \
81{ __asm__ __volatile__ ("rep ; outs" #s \
82: "=S" (addr), "=c" (count) : "d" (port),"0" (addr),"1" (count)); }
83
84#define RETURN_TYPE unsigned char
85__IN(b,"")
86#undef RETURN_TYPE
87#define RETURN_TYPE unsigned short
88__IN(w,"")
89#undef RETURN_TYPE
90#define RETURN_TYPE unsigned int
91__IN(l,"")
92#undef RETURN_TYPE
93
94__OUT(b,"b",char)
95__OUT(w,"w",short)
96__OUT(l,,int)
97
98__INS(b)
99__INS(w)
100__INS(l)
101
102__OUTS(b)
103__OUTS(w)
104__OUTS(l)
105
106#define IO_SPACE_LIMIT 0xffff
107
108#if defined(__KERNEL__) && __x86_64__
109
110#include <linux/vmalloc.h>
111
112#ifndef __i386__
113
114
115
116
117extern inline unsigned long virt_to_phys(volatile void * address)
118{
119 return __pa(address);
120}
121
122extern inline void * phys_to_virt(unsigned long address)
123{
124 return __va(address);
125}
126#endif
127
128
129
130
131#ifdef CONFIG_DISCONTIGMEM
132#include <asm/mmzone.h>
133#define page_to_phys(page) ((dma_addr_t)page_to_pfn(page) << PAGE_SHIFT)
134#else
135#define page_to_phys(page) ((page - mem_map) << PAGE_SHIFT)
136#endif
137
138#include <asm-generic/iomap.h>
139
140extern void __iomem *__ioremap(unsigned long offset, unsigned long size, unsigned long flags);
141
142extern inline void __iomem * ioremap (unsigned long offset, unsigned long size)
143{
144 return __ioremap(offset, size, 0);
145}
146
147
148
149
150
151
152extern void __iomem * ioremap_nocache (unsigned long offset, unsigned long size);
153extern void iounmap(volatile void __iomem *addr);
154
155
156
157
158#define isa_virt_to_bus virt_to_phys
159#define isa_page_to_bus page_to_phys
160#define isa_bus_to_virt phys_to_virt
161
162
163
164
165
166
167
168#define virt_to_bus virt_to_phys
169#define bus_to_virt phys_to_virt
170
171
172
173
174
175
176
177
178static inline __u8 __readb(const volatile void __iomem *addr)
179{
180 return *(__force volatile __u8 *)addr;
181}
182static inline __u16 __readw(const volatile void __iomem *addr)
183{
184 return *(__force volatile __u16 *)addr;
185}
186static inline __u32 __readl(const volatile void __iomem *addr)
187{
188 return *(__force volatile __u32 *)addr;
189}
190static inline __u64 __readq(const volatile void __iomem *addr)
191{
192 return *(__force volatile __u64 *)addr;
193}
194#define readb(x) __readb(x)
195#define readw(x) __readw(x)
196#define readl(x) __readl(x)
197#define readq(x) __readq(x)
198#define readb_relaxed(a) readb(a)
199#define readw_relaxed(a) readw(a)
200#define readl_relaxed(a) readl(a)
201#define readq_relaxed(a) readq(a)
202#define __raw_readb readb
203#define __raw_readw readw
204#define __raw_readl readl
205#define __raw_readq readq
206
207#define mmiowb()
208
209#ifdef CONFIG_UNORDERED_IO
210static inline void __writel(__u32 val, volatile void __iomem *addr)
211{
212 volatile __u32 __iomem *target = addr;
213 asm volatile("movnti %1,%0"
214 : "=m" (*target)
215 : "r" (val) : "memory");
216}
217
218static inline void __writeq(__u64 val, volatile void __iomem *addr)
219{
220 volatile __u64 __iomem *target = addr;
221 asm volatile("movnti %1,%0"
222 : "=m" (*target)
223 : "r" (val) : "memory");
224}
225#else
226static inline void __writel(__u32 b, volatile void __iomem *addr)
227{
228 *(__force volatile __u32 *)addr = b;
229}
230static inline void __writeq(__u64 b, volatile void __iomem *addr)
231{
232 *(__force volatile __u64 *)addr = b;
233}
234#endif
235static inline void __writeb(__u8 b, volatile void __iomem *addr)
236{
237 *(__force volatile __u8 *)addr = b;
238}
239static inline void __writew(__u16 b, volatile void __iomem *addr)
240{
241 *(__force volatile __u16 *)addr = b;
242}
243#define writeq(val,addr) __writeq((val),(addr))
244#define writel(val,addr) __writel((val),(addr))
245#define writew(val,addr) __writew((val),(addr))
246#define writeb(val,addr) __writeb((val),(addr))
247#define __raw_writeb writeb
248#define __raw_writew writew
249#define __raw_writel writel
250#define __raw_writeq writeq
251
252void __memcpy_fromio(void*,unsigned long,unsigned);
253void __memcpy_toio(unsigned long,const void*,unsigned);
254
255static inline void memcpy_fromio(void *to, const volatile void __iomem *from, unsigned len)
256{
257 __memcpy_fromio(to,(unsigned long)from,len);
258}
259static inline void memcpy_toio(volatile void __iomem *to, const void *from, unsigned len)
260{
261 __memcpy_toio((unsigned long)to,from,len);
262}
263
264void memset_io(volatile void __iomem *a, int b, size_t c);
265
266
267
268
269
270
271
272
273
274#define __ISA_IO_base ((char __iomem *)(PAGE_OFFSET))
275
276#define isa_readb(a) readb(__ISA_IO_base + (a))
277#define isa_readw(a) readw(__ISA_IO_base + (a))
278#define isa_readl(a) readl(__ISA_IO_base + (a))
279#define isa_writeb(b,a) writeb(b,__ISA_IO_base + (a))
280#define isa_writew(w,a) writew(w,__ISA_IO_base + (a))
281#define isa_writel(l,a) writel(l,__ISA_IO_base + (a))
282#define isa_memset_io(a,b,c) memset_io(__ISA_IO_base + (a),(b),(c))
283#define isa_memcpy_fromio(a,b,c) memcpy_fromio((a),__ISA_IO_base + (b),(c))
284#define isa_memcpy_toio(a,b,c) memcpy_toio(__ISA_IO_base + (a),(b),(c))
285
286
287
288
289
290
291#define eth_io_copy_and_sum(a,b,c,d) eth_copy_and_sum((a),(void *)(b),(c),(d))
292#define isa_eth_io_copy_and_sum(a,b,c,d) eth_copy_and_sum((a),(void *)(__ISA_IO_base + (b)),(c),(d))
293
294
295
296
297
298
299
300
301
302
303
304
305static inline int check_signature(void __iomem *io_addr,
306 const unsigned char *signature, int length)
307{
308 int retval = 0;
309 do {
310 if (readb(io_addr) != *signature)
311 goto out;
312 io_addr++;
313 signature++;
314 length--;
315 } while (length);
316 retval = 1;
317out:
318 return retval;
319}
320
321
322
323#define dma_cache_inv(_start,_size) do { } while (0)
324#define dma_cache_wback(_start,_size) do { } while (0)
325#define dma_cache_wback_inv(_start,_size) do { } while (0)
326
327#define flush_write_buffers()
328
329extern int iommu_bio_merge;
330#define BIO_VMERGE_BOUNDARY iommu_bio_merge
331
332#endif
333
334#endif
335