http://downloads.netgear.com/files/GPL/GPL_Source_V361j_DM111PSP_series_consumer_rele...
[bcm963xx.git] / kernel / linux / Documentation / DocBook / deviceiobook.tmpl
1 <!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook V3.1//EN"[]>
2
3 <book id="DoingIO">
4  <bookinfo>
5   <title>Bus-Independent Device Accesses</title>
6   
7   <authorgroup>
8    <author>
9     <firstname>Matthew</firstname>
10     <surname>Wilcox</surname>
11     <affiliation>
12      <address>
13       <email>matthew@wil.cx</email>
14      </address>
15     </affiliation>
16    </author>
17   </authorgroup>
18
19   <authorgroup>
20    <author>
21     <firstname>Alan</firstname>
22     <surname>Cox</surname>
23     <affiliation>
24      <address>
25       <email>alan@redhat.com</email>
26      </address>
27     </affiliation>
28    </author>
29   </authorgroup>
30
31   <copyright>
32    <year>2001</year>
33    <holder>Matthew Wilcox</holder>
34   </copyright>
35
36   <legalnotice>
37    <para>
38      This documentation is free software; you can redistribute
39      it and/or modify it under the terms of the GNU General Public
40      License as published by the Free Software Foundation; either
41      version 2 of the License, or (at your option) any later
42      version.
43    </para>
44       
45    <para>
46      This program is distributed in the hope that it will be
47      useful, but WITHOUT ANY WARRANTY; without even the implied
48      warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
49      See the GNU General Public License for more details.
50    </para>
51       
52    <para>
53      You should have received a copy of the GNU General Public
54      License along with this program; if not, write to the Free
55      Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
56      MA 02111-1307 USA
57    </para>
58       
59    <para>
60      For more details see the file COPYING in the source
61      distribution of Linux.
62    </para>
63   </legalnotice>
64  </bookinfo>
65
66 <toc></toc>
67
68   <chapter id="intro">
69       <title>Introduction</title>
70   <para>
71         Linux provides an API which abstracts performing IO across all busses
72         and devices, allowing device drivers to be written independently of
73         bus type.
74   </para>
75   </chapter>
76
77   <chapter id="bugs">
78      <title>Known Bugs And Assumptions</title>
79   <para>
80         None.   
81   </para>
82   </chapter>
83
84   <chapter id="mmio">
85     <title>Memory Mapped IO</title>
86     <sect1>
87       <title>Getting Access to the Device</title>
88       <para>
89         The most widely supported form of IO is memory mapped IO.
90         That is, a part of the CPU's address space is interpreted
91         not as accesses to memory, but as accesses to a device.  Some
92         architectures define devices to be at a fixed address, but most
93         have some method of discovering devices.  The PCI bus walk is a
94         good example of such a scheme.  This document does not cover how
95         to receive such an address, but assumes you are starting with one.
96         Physical addresses are of type unsigned long. 
97       </para>
98
99       <para>
100         This address should not be used directly.  Instead, to get an
101         address suitable for passing to the accessor functions described
102         below, you should call <function>ioremap</function>.
103         An address suitable for accessing the device will be returned to you.
104       </para>
105
106       <para>
107         After you've finished using the device (say, in your module's
108         exit routine), call <function>iounmap</function> in order to return
109         the address space to the kernel.  Most architectures allocate new
110         address space each time you call <function>ioremap</function>, and
111         they can run out unless you call <function>iounmap</function>.
112       </para>
113     </sect1>
114
115     <sect1>
116       <title>Accessing the device</title>
117       <para>
118         The part of the interface most used by drivers is reading and
119         writing memory-mapped registers on the device.  Linux provides
120         interfaces to read and write 8-bit, 16-bit, 32-bit and 64-bit
121         quantities.  Due to a historical accident, these are named byte,
122         word, long and quad accesses.  Both read and write accesses are
123         supported; there is no prefetch support at this time.
124       </para>
125
126       <para>
127         The functions are named <function>readb</function>,
128         <function>readw</function>, <function>readl</function>,
129         <function>readq</function>, <function>readb_relaxed</function>,
130         <function>readw_relaxed</function>, <function>readl_relaxed</function>,
131         <function>readq_relaxed</function>, <function>writeb</function>,
132         <function>writew</function>, <function>writel</function> and
133         <function>writeq</function>.
134       </para>
135
136       <para>
137         Some devices (such as framebuffers) would like to use larger
138         transfers than 8 bytes at a time.  For these devices, the
139         <function>memcpy_toio</function>, <function>memcpy_fromio</function>
140         and <function>memset_io</function> functions are provided.
141         Do not use memset or memcpy on IO addresses; they
142         are not guaranteed to copy data in order.
143       </para>
144
145       <para>
146         The read and write functions are defined to be ordered. That is the
147         compiler is not permitted to reorder the I/O sequence. When the 
148         ordering can be compiler optimised, you can use <function>
149         __readb</function> and friends to indicate the relaxed ordering. Use 
150         this with care. The <function>rmb</function> provides a read memory 
151         barrier. The <function>wmb</function> provides a write memory barrier.
152       </para>
153
154       <para>
155         While the basic functions are defined to be synchronous with respect
156         to each other and ordered with respect to each other the busses the
157         devices sit on may themselves have asynchronicity. In particular many
158         authors are burned by the fact that PCI bus writes are posted
159         asynchronously. A driver author must issue a read from the same
160         device to ensure that writes have occurred in the specific cases the
161         author cares. This kind of property cannot be hidden from driver
162         writers in the API.
163       </para>
164
165       <para>
166         PCI ordering rules also guarantee that PIO read responses arrive
167         after any outstanding DMA writes on that bus, since for some devices
168         the result of a <function>readb</function> call may signal to the
169         driver that a DMA transaction is complete.  In many cases, however,
170         the driver may want to indicate that the next
171         <function>readb</function> call has no relation to any previous DMA
172         writes performed by the device.  The driver can use
173         <function>readb_relaxed</function> for these cases, although only
174         some platforms will honor the relaxed semantics.
175       </para>
176     </sect1>
177
178     <sect1>
179       <title>ISA legacy functions</title>
180       <para>
181         On older kernels (2.2 and earlier) the ISA bus could be read or
182         written with these functions and without ioremap being used. This is
183         no longer true in Linux 2.4. A set of equivalent functions exist for
184         easy legacy driver porting. The functions available are prefixed
185         with 'isa_' and are <function>isa_readb</function>,
186         <function>isa_writeb</function>, <function>isa_readw</function>, 
187         <function>isa_writew</function>, <function>isa_readl</function>,
188         <function>isa_writel</function>, <function>isa_memcpy_fromio</function>
189         and <function>isa_memcpy_toio</function>
190       </para>
191       <para>
192         These functions should not be used in new drivers, and will
193         eventually be going away.
194       </para>
195     </sect1>
196
197   </chapter>
198
199   <chapter>
200     <title>Port Space Accesses</title>
201     <sect1>
202       <title>Port Space Explained</title>
203
204       <para>
205         Another form of IO commonly supported is Port Space.  This is a
206         range of addresses separate to the normal memory address space.
207         Access to these addresses is generally not as fast as accesses
208         to the memory mapped addresses, and it also has a potentially
209         smaller address space.
210       </para>
211
212       <para>
213         Unlike memory mapped IO, no preparation is required
214         to access port space.
215       </para>
216
217     </sect1>
218     <sect1>
219       <title>Accessing Port Space</title>
220       <para>
221         Accesses to this space are provided through a set of functions
222         which allow 8-bit, 16-bit and 32-bit accesses; also
223         known as byte, word and long.  These functions are
224         <function>inb</function>, <function>inw</function>,
225         <function>inl</function>, <function>outb</function>,
226         <function>outw</function> and <function>outl</function>.
227       </para>
228
229       <para>
230         Some variants are provided for these functions.  Some devices
231         require that accesses to their ports are slowed down.  This
232         functionality is provided by appending a <function>_p</function>
233         to the end of the function.  There are also equivalents to memcpy.
234         The <function>ins</function> and <function>outs</function>
235         functions copy bytes, words or longs to the given port.
236       </para>
237     </sect1>
238
239   </chapter>
240
241   <chapter id="pubfunctions">
242      <title>Public Functions Provided</title>
243 !Einclude/asm-i386/io.h
244   </chapter>
245
246 </book>