File: /usr/src/linux/include/asm-arm/io.h

1     /*
2      *  linux/include/asm-arm/io.h
3      *
4      *  Copyright (C) 1996-2000 Russell King
5      *
6      * This program is free software; you can redistribute it and/or modify
7      * it under the terms of the GNU General Public License version 2 as
8      * published by the Free Software Foundation.
9      *
10      * Modifications:
11      *  16-Sep-1996	RMK	Inlined the inx/outx functions & optimised for both
12      *			constant addresses and variable addresses.
13      *  04-Dec-1997	RMK	Moved a lot of this stuff to the new architecture
14      *			specific IO header files.
15      *  27-Mar-1999	PJB	Second parameter of memcpy_toio is const..
16      *  04-Apr-1999	PJB	Added check_signature.
17      *  12-Dec-1999	RMK	More cleanups
18      *  18-Jun-2000 RMK	Removed virt_to_* and friends definitions
19      */
20     #ifndef __ASM_ARM_IO_H
21     #define __ASM_ARM_IO_H
22     
23     #ifdef __KERNEL__
24     
25     #include <linux/types.h>
26     #include <asm/memory.h>
27     #include <asm/arch/hardware.h>
28     
29     /*
30      * Generic virtual read/write.  Note that we don't support half-word
31      * read/writes.  We define __arch_*[bl] here, and leave __arch_*w
32      * to the architecture specific code.
33      */
34     #define __arch_getb(a)			(*(volatile unsigned char *)(a))
35     #define __arch_getl(a)			(*(volatile unsigned int  *)(a))
36     
37     #define __arch_putb(v,a)		(*(volatile unsigned char *)(a) = (v))
38     #define __arch_putl(v,a)		(*(volatile unsigned int  *)(a) = (v))
39     
40     extern void __raw_writesb(unsigned int addr, void *data, int bytelen);
41     extern void __raw_writesw(unsigned int addr, void *data, int wordlen);
42     extern void __raw_writesl(unsigned int addr, void *data, int longlen);
43     
44     extern void __raw_readsb(unsigned int addr, void *data, int bytelen);
45     extern void __raw_readsw(unsigned int addr, void *data, int wordlen);
46     extern void __raw_readsl(unsigned int addr, void *data, int longlen);
47     
48     #define __raw_writeb(v,a)		__arch_putb(v,a)
49     #define __raw_writew(v,a)		__arch_putw(v,a)
50     #define __raw_writel(v,a)		__arch_putl(v,a)
51     
52     #define __raw_readb(a)			__arch_getb(a)
53     #define __raw_readw(a)			__arch_getw(a)
54     #define __raw_readl(a)			__arch_getl(a)
55     
56     /*
57      * The compiler seems to be incapable of optimising constants
58      * properly.  Spell it out to the compiler in some cases.
59      * These are only valid for small values of "off" (< 1<<12)
60      */
61     #define __raw_base_writeb(val,base,off)	__arch_base_putb(val,base,off)
62     #define __raw_base_writew(val,base,off)	__arch_base_putw(val,base,off)
63     #define __raw_base_writel(val,base,off)	__arch_base_putl(val,base,off)
64     
65     #define __raw_base_readb(base,off)	__arch_base_getb(base,off)
66     #define __raw_base_readw(base,off)	__arch_base_getw(base,off)
67     #define __raw_base_readl(base,off)	__arch_base_getl(base,off)
68     
69     /*
70      * Now, pick up the machine-defined IO definitions
71      */
72     #include <asm/arch/io.h>
73     
74     /*
75      * IO definitions.  We define {out,in,outs,ins}[bwl] if __io is
76      * defined by the machine.  Otherwise, these definitions are left
77      * for the machine specific header files to pick up.
78      */
79     #ifdef __io
80     #define outb(v,p)			__raw_writeb(v,__io(p))
81     #define outw(v,p)			__raw_writew(v,__io(p))
82     #define outl(v,p)			__raw_writel(v,__io(p))
83     
84     #define inb(p)				__raw_readb(__io(p))
85     #define inw(p)				__raw_readw(__io(p))
86     #define inl(p)				__raw_readl(__io(p))
87     
88     #define outsb(p,d,l)			__raw_writesb(__io(p),d,l)
89     #define outsw(p,d,l)			__raw_writesw(__io(p),d,l)
90     #define outsl(p,d,l)			__raw_writesl(__io(p),d,l)
91     
92     #define insb(p,d,l)			__raw_readsb(__io(p),d,l)
93     #define insw(p,d,l)			__raw_readsw(__io(p),d,l)
94     #define insl(p,d,l)			__raw_readsl(__io(p),d,l)
95     #endif
96     
97     #define outb_p(val,port)		outb((val),(port))
98     #define outw_p(val,port)		outw((val),(port))
99     #define outl_p(val,port)		outl((val),(port))
100     #define inb_p(port)			inb((port))
101     #define inw_p(port)			inw((port))
102     #define inl_p(port)			inl((port))
103     
104     #define outsb_p(port,from,len)		outsb(port,from,len)
105     #define outsw_p(port,from,len)		outsw(port,from,len)
106     #define outsl_p(port,from,len)		outsl(port,from,len)
107     #define insb_p(port,to,len)		insb(port,to,len)
108     #define insw_p(port,to,len)		insw(port,to,len)
109     #define insl_p(port,to,len)		insl(port,to,len)
110     
111     /*
112      * ioremap and friends.
113      *
114      * ioremap takes a PCI memory address, as specified in
115      * linux/Documentation/IO-mapping.txt.  If you want a
116      * physical address, use __ioremap instead.
117      */
118     extern void * __ioremap(unsigned long offset, size_t size, unsigned long flags);
119     extern void __iounmap(void *addr);
120     
121     /*
122      * Generic ioremap support.
123      *
124      * Define:
125      *  iomem_valid_addr(off,size)
126      *  iomem_to_phys(off)
127      */
128     #ifdef iomem_valid_addr
129     #define __arch_ioremap(off,sz,nocache)				\
130      ({								\
131     	unsigned long _off = (off), _size = (sz);		\
132     	void *_ret = (void *)0;					\
133     	if (iomem_valid_addr(_off, _size))			\
134     		_ret = __ioremap(iomem_to_phys(_off),_size,0);	\
135     	_ret;							\
136      })
137     
138     #define __arch_iounmap __iounmap
139     #endif
140     
141     #define ioremap(off,sz)			__arch_ioremap((off),(sz),0)
142     #define ioremap_nocache(off,sz)		__arch_ioremap((off),(sz),1)
143     #define iounmap(_addr)			__arch_iounmap(_addr)
144     
145     /*
146      * DMA-consistent mapping functions.  These allocate/free a region of
147      * uncached, unwrite-buffered mapped memory space for use with DMA
148      * devices.  This is the "generic" version.  The PCI specific version
149      * is in pci.h
150      */
151     extern void *consistent_alloc(int gfp, size_t size, dma_addr_t *handle);
152     extern void consistent_free(void *vaddr, size_t size, dma_addr_t handle);
153     extern void consistent_sync(void *vaddr, size_t size, int rw);
154     
155     /*
156      * String version of IO memory access ops:
157      */
158     extern void _memcpy_fromio(void *, unsigned long, size_t);
159     extern void _memcpy_toio(unsigned long, const void *, size_t);
160     extern void _memset_io(unsigned long, int, size_t);
161     
162     extern void __readwrite_bug(const char *fn);
163     
164     /*
165      * If this architecture has PCI memory IO, then define the read/write
166      * macros.  These should only be used with the cookie passed from
167      * ioremap.
168      */
169     #ifdef __mem_pci
170     
171     #define readb(addr)			__raw_readb(__mem_pci(addr))
172     #define readw(addr)			__raw_readw(__mem_pci(addr))
173     #define readl(addr)			__raw_readl(__mem_pci(addr))
174     #define writeb(val,addr)		__raw_writeb(val,__mem_pci(addr))
175     #define writew(val,addr)		__raw_writew(val,__mem_pci(addr))
176     #define writel(val,addr)		__raw_writel(val,__mem_pci(addr))
177     
178     #define memset_io(a,b,c)		_memset_io(__mem_pci(a),(b),(c))
179     #define memcpy_fromio(a,b,c)		_memcpy_fromio((a),__mem_pci(b),(c))
180     #define memcpy_toio(a,b,c)		_memcpy_toio(__mem_pci(a),(b),(c))
181     
182     #define eth_io_copy_and_sum(a,b,c,d) \
183     				eth_copy_and_sum((a),__mem_pci(b),(c),(d))
184     
185     static inline int
186     check_signature(unsigned long io_addr, const unsigned char *signature,
187     		int length)
188     {
189     	int retval = 0;
190     	do {
191     		if (readb(io_addr) != *signature)
192     			goto out;
193     		io_addr++;
194     		signature++;
195     		length--;
196     	} while (length);
197     	retval = 1;
198     out:
199     	return retval;
200     }
201     
202     #elif !defined(readb)
203     
204     #define readb(addr)			(__readwrite_bug("readb"),0)
205     #define readw(addr)			(__readwrite_bug("readw"),0)
206     #define readl(addr)			(__readwrite_bug("readl"),0)
207     #define writeb(v,addr)			__readwrite_bug("writeb")
208     #define writew(v,addr)			__readwrite_bug("writew")
209     #define writel(v,addr)			__readwrite_bug("writel")
210     
211     #define eth_io_copy_and_sum(a,b,c,d)	__readwrite_bug("eth_io_copy_and_sum")
212     
213     #define check_signature(io,sig,len)	(0)
214     
215     #endif	/* __mem_pci */
216     
217     /*
218      * remap a physical address `phys' of size `size' with page protection `prot'
219      * into virtual address `from'
220      */
221     #define io_remap_page_range(from,phys,size,prot) \
222     		remap_page_range(from,phys,size,prot)
223     
224     
225     /*
226      * If this architecture has ISA IO, then define the isa_read/isa_write
227      * macros.
228      */
229     #ifdef __mem_isa
230     
231     #define isa_readb(addr)			__raw_readb(__mem_isa(addr))
232     #define isa_readw(addr)			__raw_readw(__mem_isa(addr))
233     #define isa_readl(addr)			__raw_readl(__mem_isa(addr))
234     #define isa_writeb(val,addr)		__raw_writeb(val,__mem_isa(addr))
235     #define isa_writew(val,addr)		__raw_writew(val,__mem_isa(addr))
236     #define isa_writel(val,addr)		__raw_writel(val,__mem_isa(addr))
237     #define isa_memset_io(a,b,c)		_memset_io(__mem_isa(a),(b),(c))
238     #define isa_memcpy_fromio(a,b,c)	_memcpy_fromio((a),__mem_isa(b),(c))
239     #define isa_memcpy_toio(a,b,c)		_memcpy_toio(__mem_isa((a)),(b),(c))
240     
241     #define isa_eth_io_copy_and_sum(a,b,c,d) \
242     				eth_copy_and_sum((a),__mem_isa(b),(c),(d))
243     
244     static inline int
245     isa_check_signature(unsigned long io_addr, const unsigned char *signature,
246     		    int length)
247     {
248     	int retval = 0;
249     	do {
250     		if (isa_readb(io_addr) != *signature)
251     			goto out;
252     		io_addr++;
253     		signature++;
254     		length--;
255     	} while (length);
256     	retval = 1;
257     out:
258     	return retval;
259     }
260     
261     #else	/* __mem_isa */
262     
263     #define isa_readb(addr)			(__readwrite_bug("isa_readb"),0)
264     #define isa_readw(addr)			(__readwrite_bug("isa_readw"),0)
265     #define isa_readl(addr)			(__readwrite_bug("isa_readl"),0)
266     #define isa_writeb(val,addr)		__readwrite_bug("isa_writeb")
267     #define isa_writew(val,addr)		__readwrite_bug("isa_writew")
268     #define isa_writel(val,addr)		__readwrite_bug("isa_writel")
269     #define isa_memset_io(a,b,c)		__readwrite_bug("isa_memset_io")
270     #define isa_memcpy_fromio(a,b,c)	__readwrite_bug("isa_memcpy_fromio")
271     #define isa_memcpy_toio(a,b,c)		__readwrite_bug("isa_memcpy_toio")
272     
273     #define isa_eth_io_copy_and_sum(a,b,c,d) \
274     				__readwrite_bug("isa_eth_io_copy_and_sum")
275     
276     #define isa_check_signature(io,sig,len)	(0)
277     
278     #endif	/* __mem_isa */
279     #endif	/* __KERNEL__ */
280     #endif	/* __ASM_ARM_IO_H */
281