Sync usage with man page.
[netbsd-mini2440.git] / share / doc / papers / bus_dma / 4.me
blob376aebc9cdddcfcd3f522b639c6bb33b673918d4
1 .\"     $NetBSD: 4.me,v 1.1 1998/07/15 00:34:54 thorpej Exp $
2 .\"
3 .\" Copyright (c) 1998 Jason R. Thorpe.
4 .\" All rights reserved.
5 .\"
6 .\" Redistribution and use in source and binary forms, with or without
7 .\" modification, are permitted provided that the following conditions
8 .\" are met:
9 .\" 1. Redistributions of source code must retain the above copyright
10 .\"    notice, this list of conditions and the following disclaimer.
11 .\" 2. Redistributions in binary form must reproduce the above copyright
12 .\"    notice, this list of conditions and the following disclaimer in the
13 .\"    documentation and/or other materials provided with the distribution.
14 .\" 3. All advertising materials mentioning features or use of this software
15 .\"    must display the following acknowledgements:
16 .\"     This product includes software developed for the NetBSD Project
17 .\"     by Jason R. Thorpe.
18 .\" 4. The name of the author may not be used to endorse or promote products
19 .\"    derived from this software without specific prior written permission.
20 .\"
21 .\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
22 .\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
23 .\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
24 .\" IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
25 .\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
26 .\" BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
27 .\" LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
28 .\" AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
29 .\" OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 .\" SUCH DAMAGE.
32 .\"
33 .sh 1 "Implementation of \fIbus_dma\fB in NetBSD/alpha and NetBSD/i386"
34 .pp
35 This section is a description of the \fIbus_dma\fR implementation in
36 two NetBSD ports, NetBSD/alpha and NetBSD/i386.  It is presented as
37 a side-by-side comparison in order to give the reader a better feel
38 for the types of details that are being abstracted by the interface.
39 .sh 2 "Platform requirements"
40 .pp
41 NetBSD/alpha currently supports six implementations of the PCI bus, each
42 of which implement DMA differently.
43 In order to understand the design approach for NetBSD/alpha's
44 fairly complex \fIbus_dma\fR implementation, it is necessary to
45 understand the differences between the bus adapters.  While some of
46 these adapters have similar descriptions and features, the software
47 interface to each one is quite different.  (In addition to PCI,
48 NetBSD/alpha also supports two TurboChannel DMA implementations on
49 the DEC 3000 models.  For simplicity's sake, we will limit
50 the discussion to the PCI and related busses.)
51 .pp
52 The first PCI implementation to be supported by NetBSD/alpha was
53 the DECchip 21071/21072 (APECS)\*#.
54 It is designed
55 to be used with the DECchip 21064 (EV4) and 21064A (EV45) processors.
56 Systems in which this PCI host
57 bus adapter is found include the AlphaStation 200, AlphaStation 400,
58 and AlphaPC 64 systems, as well as some AlphaVME systems.
59 The APECS supports up to two DMA windows, which may be configured for
60 direct-mapped or scatter-gather-mapped operation, and uses host RAM for
61 scatter-gather page tables.
62 .(d
63 .pp
64 \*# Digital Equipment Corporation,
65 .ul
66 DECchip 21071 and DECchip 21072 Core Logic Chipsets Data Sheet,
67 DEC order number EC-QAEMA-TE, November 1994.
68 .)d
69 .pp
70 The second PCI implementation to be supported by NetBSD/alpha was
71 the built-in I/O controller found on the DECchip 21066\*# and DECchip 21068
72 family of Low Cost Alpha (LCA) processors.  This processor family was used
73 in the AXPpci33 and Multia AXP systems, as well as some AlphaVME
74 systems.  The LCA supports up to two DMA windows, which may be configured
75 for direct-mapped or scatter-gather-mapped operation, and uses host
76 RAM for scatter-gather page tables.
77 .(d
78 .pp
79 \*# Digital Equipment Corporation,
80 .ul
81 DECchip 21066 Alpha AXP Microprocessor Data Sheet,
82 DEC order number EC-N0617-72, May 1994.
83 .)d
84 .pp
85 The third PCI implementation to be supported by NetBSD/alpha was
86 the DECchip 21171 (ALCOR)\*#, 21172 (ALCOR2), and 21174 (Pyxis)\**.
87 .(f
88 \**While these chipsets are somewhat different from one another, the
89 software interface is similar enough that they share a common device
90 driver in the NetBSD/alpha kernel.
91 .)f
92 These PCI host bus adapters are found in systems based on the
93 DECchip 21164 (EV5), 21164A (EV56), and 21164PC (PCA56) processors,
94 including the AlphaStation 500, AlphaStation 600, and AlphaPC 164,
95 and Digital Personal Workstation.  The ALCOR, ALCOR2, and Pyxis
96 support up to four DMA windows, which may be configured for direct-mapped
97 or scatter-gather-mapped operation, and uses host RAM for scatter-gather
98 page tables.
99 .(d
101 \*# Digital Equipment Corporation,
103 DECchip 21171 Core Logic Chipset Technical Reference Manual,
104 DEC order number EC-QE18B-TE, September 1995.
107 The fourth PCI implementation to be supported by NetBSD/alpha was
108 the Digital DWLPA/DWLPB\*#.  This is a TurboLaser-to-PCI\** bridge found on
109 AlphaServer 8200 and 8400 systems.  The bridge is connected to the TurboLaser
110 system bus via a KFTIA (internal) or KFTHA (external) I/O adapter.  The
111 former supports one built-in and one external DWLPx.  The latter supports up
112 to four external DWLPxs.  Multiple I/O adapters may be present
113 on the TurboLaser system bus.  Each DWLPx supports up to four primary PCI
114 busses and has three DMA windows which may be configured for
115 direct-mapped or scatter-gather-mapped DMA.  These three windows are
116 shared by all PCI busses attached to the DWLPx.  The DWLPx does not use
117 host RAM for scatter-gather page tables.  Instead, the DWLPx uses on-board
118 SRAM, which must be shared by all PCI busses attached to the DWLPx.
119 This is because the store-and-forward architecture of these systems
120 would cause latency on DMA page table access to be too high.  The DWLPA
121 has 32K of page table SRAM and the DWLPB has 128K.  Since the DWLPx can
122 snoop access to the page table SRAM, no explicit scatter-gather TLB
123 invalidation is necessary on this PCI implementation.
125 \**"TurboLaser" is the name of the system bus on the AlphaServer 8200
126 and 8400 systems.
130 \*# Digital Equipment Corporation,
132 DWLPA and DWLPB PCI Adapter Technical Manual,
133 DEC order number EK-DWLPX-TM, July 1996.
136 The fifth PCI implementation to be supported by NetBSD/alpha was
137 the A12C PCI bus on the Avalon A12 Scalable Parallel Processor\*#.  This
138 PCI bus is a secondary I/O bus\**, has only a single PCI slot in
139 mezzanine form-factor, and is used solely for Ethernet I/O.
142 \*# H. Ross Harvey,
144 Avalon A12 Parallel Supercomputer Theory of Operation,
145 Avalon Computer Systems, Inc., October 1997.
148 \**The primary I/O bus on the A12 is a crossbar, which is used to
149 communicate with other nodes in the parallel processor.
151 This PCI bus is not able to directly access host RAM.  Instead, devices
152 DMA to and from a 128K SRAM buffer.  This is, in essence, a hardware
153 implementation of DMA bouncing.  This is not considered a limitation
154 of the architecture given the target application of the A12 system
155 (parallel computation applications which communicate via MPI\**
156 over the crossbar).
158 \**MPI, or the Message Passing Interface, is a standardized API for
159 passing data and control within a parallel program.
162 The sixth PCI implementation to be supported by NetBSD/alpha was
163 the MCPCIA MCBUS-to-PCI bridge found on the AlphaServer 4100 (Rawhide)
164 systems.  The Rawhide architecture is made up of a "horse" (the
165 central backplane) and two "saddles" (primary PCI bus adapters on
166 either side of the backplane).  The saddles may also contain EISA
167 bus adapters.  Each MCPCIA has four DMA windows which may be configured
168 for direct-mapped or scatter-gather-mapped operation, and uses host
169 RAM for scatter-gather page tables.
171 In sharp contrast to the Alpha, the i386 platform has a very simple
172 PCI implementation; the PCI bus is capable of addressing the entire
173 32-bit physical address space of the PC architecture, and, in general,
174 all PCI host bus adapters are software compatible.  The i386 platform
175 also has WYSIWYG DMA, so no window translations are necessary.  The
176 i386 platform, however, must contend with DMA bouncing on the ISA bus,
177 due to ISA's 24-bit address limitation and lack of scatter-gather-mapped
178 DMA.
179 .sh 2 "Data structures"
181 The DMA tags used by NetBSD/alpha and NetBSD/i386 are very similar.  Both
182 contain thirteen function pointers for the thirteen functional methods in
183 the \fIbus_dma\fR interface.  The NetBSD/alpha DMA tag, however, also has
184 a function pointer used to obtain the DMA tag for children of the primary
185 I/O bus and an opaque cookie to be interpreted by the low-level
186 implementation of these methods.
188 The opaque cookie used by NetBSD/alpha's DMA tag is a pointer to the
189 chipset's statically-allocated state information.  This state information
190 includes one or more \fIalpha_sgmap\fR structures.  The \fIalpha_sgmap\fR
191 contains all of the state information for a single DMA window to perform
192 scatter-gather-mapped DMA, including pointers to the scatter-gather
193 page table, the \fIextent map\fR\** that manages the page table, and the
194 DMA window base.
196 \**An \fIextent map\fR is a data structure which manages an arbitrary
197 number range, providing several resource allocation primitives.  NetBSD
198 has a general-purpose extent map manager which is used by several kernel
199 subsystems.
202 The DMA map structure contains all of the parameters used to create
203 the map.  (This is a fairly standard practice among all current
204 implementations of the \fIbus_dma\fR interface.)  In addition to
205 the creation parameters, the two implementations contain additional
206 state variables specific to their particular DMA quirks.  For example,
207 the NetBSD/alpha DMA map contains several state variables
208 related to scatter-gather-mapped DMA.  The i386 port's DMA map,
209 on the other hand, contains a pointer to a map-specific cookie.  This
210 cookie holds state information for ISA DMA bouncing.  This state is stored
211 in a separate cookie because DMA bouncing is far less common on the i386
212 then scatter-gather-mapped DMA is on the Alpha, since the Alpha must
213 also do scatter-gather-mapped DMA for PCI if the system has a large
214 amount of physical memory.
216 In both the NetBSD/alpha and NetBSD/i386 \fIbus_dma\fR implementations,
217 the DMA segment structure contains only the public members defined
218 by the interface.
219 .sh 2 "Code structure"
221 Both the NetBSD/alpha and NetBSD/i386 \fIbus_dma\fR implementations
222 use a simple inheritance scheme for code reuse.  This is achieved
223 by allowing the chipset- or bus-specific code layers (i.e. the "master"
224 layers) to assemble the DMA tag.  When the tag is assembled, the master
225 layer inserts its own methods in the function pointer slots where special
226 handling at that layer is required.  For those methods which do not require
227 special handling, the slots are initialized with pointers to common code.
229 The Alpha \fIbus_dma\fR code is broken down into four basic categories:
230 chipset-specific code, code that implements common direct-mapped
231 operations, code that implements common scatter-gather-mapped operations,
232 and code that implements operations common to both direct-mapped and
233 scatter-gather-mapped DMA.  Some of the common functions are not
234 called directly via the tag's function switch.  These functions
235 are helper functions, and are for use only by chipset front-ends.
236 An example of such a helper is the set of common direct-mapped
237 DMA load functions.  These functions take all of the same arguments
238 as the interface-defined methods, plus an extra argument: the DMA
239 window's base DMA address.
241 The i386 \fIbus_dma\fR implementation, on the other hand, is broken down
242 into three basic categories: common implementations of \fIbus_dma\fR
243 methods, common helper functions, and ISA DMA front-ends\**.
245 \**ISA is currently the only bus supported by NetBSD/i386 with
246 special DMA requirements.  This may change in future versions of the
247 system.
249 All of the common interface methods may be called directly from the
250 DMA tag's function switch.  Both the PCI and EISA DMA tags use
251 this feature; they provide no bus-specific DMA methods.  The ISA DMA
252 front-ends provide support for DMA bouncing if the system has more
253 than 16MB of physical memory.  If the system has 16MB of physical
254 memory or less, no DMA bouncing is required, and the ISA DMA front-ends
255 simply redirect the \fIbus_dma\fR function calls to the common
256 implementation.
257 .sh 2 "Autoconfiguration"
259 The NetBSD kernel's autoconfiguration system employs a depth-first traversal
260 of the nodes (devices) in the device tree.  This process is started
261 by machine-dependent code telling the machine-independent
262 autoconfiguration framework that it has "found" the root "bus".  In the
263 two platforms described here, this root bus, called \fImainbus\fR, is a
264 virtual device; it does not directly correspond to any physical bus in
265 the system.  The device driver for \fImainbus\fR is implemented in
266 machine-dependent code.  This driver's responsibility is to configure
267 the primary I/O bus or busses.
269 In NetBSD/alpha, the chipset which implements the primary I/O bus
270 is considered to be the primary I/O bus by the \fImainbus\fR layer.
271 Platform-specific code specifies the name of the chipset, and the
272 \fImainbus\fR driver configures it by "finding" it.  When the chipset's
273 device driver is attached, it initializes its DMA windows and data
274 structures.  Once this is complete, it "finds" the primary PCI bus or busses
275 logically attached to the chipset, and passes the DMA tag for these busses
276 down to the PCI bus device driver.  This driver in turn finds and configures
277 each device on the PCI bus, and so on.
279 In the event that the PCI bus driver encounters a PCI-to-PCI bridge (PPB),
280 the DMA tag is passed unchanged to the PPB device driver, which in turn
281 passes it to the secondary PCI bus instance attached to the other
282 side of the bridge.  However, intervention by machine-dependent code
283 is required if the PCI bus driver encounters a bridge to a different bus
284 type, such as EISA or ISA; this bus may require a different DMA tag.
285 For this reason, all PCI-to-<other bus> bridge (PCxB) drivers are
286 implemented in machine-dependent code.  While the PCxB drivers could
287 be implemented in machine-independent code using machine-dependent
288 hooks to obtain DMA tags, this is not done as the secondary bus may
289 require special machine-dependent interrupt setup and routing.  Once all
290 of the call-backs to handle the machine-dependent bus transition details
291 were implemented, the amount of code that would be shared would hardly be
292 worth the effort.
294 When a device driver is associated with a particular hardware device
295 that the bus driver has found, it is given several pieces of information
296 needed to initialize and communicate with the device.  One of these
297 pieces of information is the DMA tag.  If the driver wishes to perform
298 DMA, it must remember this tag, which, as noted previously, is used in
299 every call to the \fIbus_dma\fR interface.
301 While the procedure for configuring busses and devices is essentially
302 identical to the NetBSD/alpha case, NetBSD/i386 configures the primary
303 I/O busses quite differently.  The PC platform was designed from the
304 ground up around the ISA bus.  EISA and PCI are, in many ways, very
305 similar to ISA from a device driver's perspective.  All three have the
306 concept of I/O-mapped\** and memory-mapped space.  The hardware and firmware
307 in PCs typically map these busses in such a way that initialization of
308 the bus's adapter by operating system software is not necessary.  For
309 this reason, it is possible to consider PCI, EISA, and ISA to all be
310 primary I/O busses, from the autoconfiguration perspective.
312 \**I/O-mapped space is accessed with special instructions on Intel
313 processors.
316 The NetBSD/i386 \fImainbus\fR driver configures the primary I/O busses
317 in order of descending priority: PCI first, then EISA, and finally, ISA.
318 The \fImainbus\fR driver has direct access to each bus's DMA tags, and
319 passes them down to the I/O bus directly.  In the case of EISA and ISA,
320 the \fImainbus\fR layer only attempts to configure these busses if they
321 were not found during the PCI bus configuration phase; NetBSD/i386, as
322 a matter of correctness, identifies PCI-to-EISA (PCEB) and PCI-to-ISA (PCIB)
323 bridges, and assigns autoconfiguration nodes in the device tree to them.
324 The EISA and ISA busses are logically attached to these nodes, in a way
325 very similar to that of NetBSD/alpha.  The bridge drivers also have direct
326 access to the bus's DMA tags, and pass them down to the I/O bus accordingly.
327 .sh 2 "Example of underlying operation"
329 This subsection describes the operation of the machine-dependent code
330 which implements the \fIbus_dma\fR interface as used by a device driver
331 for a hypothetical DES encryption card.  While this is not the 
332 original application of \fIbus_dma\fR, it provides an example which is much
333 easier to understand; the application for which the interface was developed
334 is a high-performance hierarchical mass storage system, the details of which
335 are overwhelming.
337 Not all of the details of a NetBSD device driver will be described here,
338 but rather only those details which are important within the scope of DMA.
340 For the purpose of our example, the card comes in both PCI and ISA
341 models.  Since we describe two platforms, there are four permutations
342 of actual examples.  They will be tagged with the following indicators:
345 [Alpha/ISA]
346 [Alpha/PCI]
347 [i386/ISA]
348 [i386/PCI]
352 We will assume that the \fB[i386/ISA]\fR platform has more than 16MB
353 of RAM, so transfers might have to be bounced if DMA-safe memory is not
354 used explicitly.  We will also assume that the direct-mapped DMA window
355 on the \fB[Alpha/PCI]\fR platform is capable of addressing all of system
356 RAM.
358 Please note that in the description of map synchronization, only cases
359 which require special handing will be described.  In both the
360 \fB[Alpha/ISA]\fR and \fB[Alpha/PCI]\fR cases, all synchronizations
361 cause the CPU's write buffer to be drained using the Alpha's \fImb\fR\*#
362 instruction.  All synchronizations in the \fB[i386/PCI]\fR case are
363 no-ops, as are synchronizations of DMA-safe memory in the \fB[i386/ISA]\fR
364 case.
367 \*# Richard L. Sites and Richard T. Witek,
369 Alpha AXP Architecture Reference Manual, Second Edition,
370 Digital Press, 1995.
372 .sh 3 "Hardware overview"
374 The card is a bus master,
375 and operates by reading a fixed-length command block via DMA.  There are
376 three commands: \fBSET KEY\fR, \fBENCRYPT\fR, and \fBDECRYPT\fR.  Commands
377 are initiated by filling in the command block, and writing the DMA address
378 of the command block to the card's \fIdmaAddr\fR register.  The command
379 block contains 6 32-bit words: \fIcbCommand\fR, \fIcbStatus\fR,
380 \fIcbInAddr\fR, \fIcbInCount\fR, \fIcbOutAddr\fR, and \fIcbOutCount\fR.
381 The \fIcbInAddr\fR and \fIcbOutAddr\fR members are the DMA addresses of
382 software scatter-gather lists used by the card's DMA engine.  The
383 \fIcbInCount\fR and \fIcbOutCount\fR members are the number of
384 scatter-gather entries in their respective lists.  Each scatter-gather
385 entry contains a DMA address and a length, both 32-bit
386 words.
388 When the card processes a request, it reads the command block via DMA.
389 It then examines the command block to determine which action to take.
390 In the case of all three supported commands, it reads the input
391 scatter-gather list at DMA address \fIcbInAddr\fR for length
392 \fIcbInCount * 8\fR.  It then switches the input to the appropriate
393 processing engine.  In the case of the \fBSET KEY\fR command, the
394 scatter-gather list is used to DMA the DES key into SRAM located
395 on the card.  For all other commands, the input is directed at the
396 pipelined DES engine, switched into either encrypt or decrypt mode.  The
397 DES engine then reads the output scatter-gather list specified by
398 \fIcbOutAddr\fR for \fIcbOutCount * 8\fR bytes.  Once the DES engine
399 has all of the DMA addresses, it then begins the cycle of
400 input-process-output until all data has been consumed.  Once any command
401 is finished, a status word is written to \fIcbStatus\fR, and an interrupt
402 is delivered to the host.  The driver software must read this word to
403 determine if the command completed successfully.
404 .sh 3 "Device driver overview"
406 The device driver for this DES card provides \fIopen()\fR, \fIclose()\fR,
407 and \fIioctl()\fR entry points.  The driver uses DMA to the user
408 address space for high performance.  When a user issues a request via the
409 ioctl corresponding to the requested operation, the driver places it
410 on a work queue.  The \fIioctl()\fR system call returns immediately,
411 allowing the application to run or block via \fIsigsuspend()\fR.  If
412 the card is currently idle, the driver immediately issues the command
413 to the card.  When the job is finished, the card interrupts, and the
414 driver notifies the user that the request has completed via the
415 \fBSIGIO\fR signal.  If there are more jobs on the work queue, the
416 next job is removed from the queue and started, until there are no
417 more jobs.
418 .sh 3 "Driver initialization"
420 When the driver instance is created (attached), it must create and initialize
421 the data structures necessary for operation.  This driver uses multiple
422 DMA maps: one for the control structures (control block and scatter-gather
423 lists), and many for data submitted by user requests.  The data maps are
424 kept in the driver job queue entries, which are created when jobs are
425 submitted.
427 Next the driver must allocate DMA-safe memory for the control structures.
428 The driver will allocate three pages of memory via \fIbus_dmamem_alloc\fR().
429 For simplicity, the driver will request a single memory segment.
430 For all platforms and busses in this example, this operation simply calls
431 a function in the virtual memory system that allocates memory with
432 the requested constraints.  In the \fB[i386/ISA]\fR case, the ISA layer
433 inserts itself into the call graph to specify a range of 0 - 16MB.
434 All other cases simply specify the entire present physical memory range.
436 A small piece of this memory will be used for the command block.  The rest
437 of the memory will be divided evenly between the two scatter-gather lists.
438 This memory is then mapped into kernel virtual address space using
439 \fIbus_dmamem_map()\fR with the \fBBUS_DMA_COHERENT\fR flag, and the
440 kernel pointers to the three structures are initialized.  When the memory
441 is mapped on the i386, the \fBBUS_DMA_COHERENT\fR flag causes the
442 cache-inhibit bits to be set in the PTEs.  No special handing of this
443 flag is required on the Alpha.  However, in the Alpha case, since there
444 is only a single segment, the memory is mapped via the Alpha's
445 direct-mapped kernel segment; no use of kernel virtual address space is
446 required.
448 Finally, the driver loads the control structure DMA map by passing the
449 kernel virtual address of the memory to \fIbus_dmamap_load()\fR.  To
450 make it easier to start transactions, the driver caches the DMA addresses
451 of the various control structures (by adding their offsets to the memory's
452 DMA address).  In all cases, the underlying load function steps through
453 each page in the virtual address range, extracting the physical address
454 from the pmap module and compacting the segments where possible.  Since
455 the memory was allocated as a single segment, it maps to a single DMA
456 segment.
457 .sh 3 "Example transaction"
459 Let's suppose that the user has already set the key, and now wishes to
460 use it to encrypt a data buffer.  The calling program packages up the
461 request, providing a pointer to the input buffer, output buffer, and
462 status word, all in user space, and issues the "encrypt buffer" ioctl.
464 Upon entry into the kernel, the driver locks the user's buffer
465 to prevent the data from being paged out
466 while the DMA is in progress.  A job queue entry is allocated, and
467 two DMA maps are created for the job queue entry, one for the input buffer
468 and one for the output buffer.  In all cases, this allocates the standard
469 DMA map structure.  In the \fB[i386/ISA]\fR case, an ISA DMA cookie for
470 each map is also allocated.
472 Once the queue entry has been allocated, it must be initialized.  The first
473 step in this process is to load the DMA maps for the input and output
474 buffers.  Since this process is essentially identical for input and output,
475 only the actions for the input buffer's map are described here.
477 On \fB[Alpha/PCI]\fR and \fB[i386/PCI]\fR, the underlying code traverses
478 the user's buffer, extracting the physical addresses for each page.  For
479 \fB[Alpha/PCI]\fR, the DMA window base is added to this address.  The
480 address and length of the segment are placed into the map's DMA segment
481 list.  Segments are concatenated when possible.
483 On \fB[Alpha/ISA]\fR, a very similar process occurs.  However, rather than
484 placing the physical addresses into the map's segment list, some
485 scatter-gather-mapped DMA address space is allocated and the addresses
486 placed into the corresponding page table entries.  Once this process is
487 complete, a single DMA segment is placed in the map's segment list,
488 indicating the beginning of the scatter-gather-mapped area.
490 The \fB[i386/ISA]\fR case also traverses the user's buffer, but twice.
491 In the first pass, the buffer is checked to ensure that it does not
492 have any pages above the 16MB threshold.  If it does not, then the
493 procedure is identical to the
494 \fB[i386/PCI]\fR case.  However, for the sake of example, the buffer has
495 pages outside the threshold so the transfer must be bounced.  At this
496 point, a bounce buffer is allocated.  Since we are still in the process's
497 context, this allocation may block.  A pointer to the bounce buffer is
498 stored in the ISA DMA cookie, and the physical address of the bounce buffer
499 is placed in the map's segment list.
501 The next order of business is to enqueue or begin the transfer.  To keep
502 the example simple, we will assume that no other transfers are pending.
503 The first step in this process is to initialize the control block with
504 the cached DMA addresses of the card's scatter-gather lists.  These
505 lists are also initialized with the contents of the DMA maps' segment list.
506 Before we tell the card to begin transferring data, we must synchronize
507 the DMA maps.
509 The first map to be synchronized is the input buffer map.  This is a
510 \fBPREWRITE\fR operation.  In the \fB[i386/ISA]\fR case, the user's buffer
511 is copied from the user's address space into the bounce buffer\**.
513 \**This is not currently implemented, as it required substantial changes
514 to the virtual memory system.  This is because the \fIcopyin()\fR and
515 \fIcopyout()\fR functions only operate on the current process's context,
516 which may not be available at the time of the bounce.  Those changes to
517 the virtual memory system have now been made, so support for bouncing to
518 and from user space will appear in a future release of NetBSD.  Support
519 for bouncing from kernel space is currently supported, however.
521 The next map to be synchronized is the output buffer map.  This is a
522 \fBPREREAD\fR operation.
523 Finally, the control map is synchronized.  Since the status will be
524 read back from the control block after the transaction is complete,
525 this synchronization is a \fBPREREAD|PREWRITE\fR.
527 At this point the DMA transaction may occur.  The card is started by
528 writing the cached DMA address of the control block into the card's
529 \fIdmaAddr\fR register.  The driver returns to user space, and the
530 process waits for the signal indicating that the transaction has
531 completed.
533 Once the transaction has completed, the card interrupts the host.  The
534 interrupt handler is now responsible for finishing the DMA sequence
535 and notifying the requesting process that the operation is complete.
537 The first task to perform is to synchronize the input buffer map.  This
538 is a \fBPOSTWRITE\fR.  Next we synchronize the output buffer map.  This
539 is a \fBPOSTREAD\fR.  In the \fB[i386/ISA]\fR case, the contents of the
540 output bounce buffer are copied to the user's buffer\**.
541 Finally, we synchronize the control map.  This is a \fBPOSTREAD|POSTWRITE\fR.
543 \**The same caveat applies here as to the \fB[i386/ISA]\fR
544 \fBPREWRITE\fR case for the input map.
547 Now that the DMA maps have been synchronized, they must be unloaded.
548 In the \fB[Alpha/PCI]\fR and \fB[i386/PCI]\fR cases, there are no resources
549 to be freed; the mapping is simply marked invalid.  In the \fB[Alpha/ISA]\fR
550 case, the scatter-gather-mapped DMA resources are released.  In the
551 \fB[i386/ISA]\fR case, the bounce buffer is freed.
553 Since the user's buffer is no longer in use, it is unlocked by the device
554 driver.  Now the process may be signaled that I/O has completed.  The
555 last task to perform is to destroy the input and output buffer DMA maps
556 and the job queue entry.