.\"	$NetBSD: 5.me,v 1.1 1998/07/15 00:34:54 thorpej Exp $
.\"
.\" Copyright (c) 1998 Jason R. Thorpe.
.\" All rights reserved.
.\"
.\" Redistribution and use in source and binary forms, with or without
.\" modification, are permitted provided that the following conditions
.\" are met:
.\" 1. Redistributions of source code must retain the above copyright
.\"    notice, this list of conditions and the following disclaimer.
.\" 2. Redistributions in binary form must reproduce the above copyright
.\"    notice, this list of conditions and the following disclaimer in the
.\"    documentation and/or other materials provided with the distribution.
.\" 3. All advertising materials mentioning features or use of this software
.\"    must display the following acknowledgements:
.\"	This product includes software developed for the NetBSD Project
.\"	by Jason R. Thorpe.
.\" 4. The name of the author may not be used to endorse or promote products
.\"    derived from this software without specific prior written permission.
.\"
.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
.\" IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
.\" BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
.\" LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
.\" AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
.\" OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
.sh 1 "Conclusions"
.pp
The \fIbus_dma\fR interface was introduced into the NetBSD kernel
at development version 1.2G, just before the release cycle for NetBSD 1.3
began.  When the code was committed to the NetBSD master sources, several
drivers, mostly for SCSI controllers, were converted to the interface at
the same time.  (All of these drivers had been previously converted to
use the \fIbus_space\fR interface.)  Not only did these drivers provide
an example of the correct use of \fIbus_dma\fR, but they provided
functionality that had
not previously existed in the NetBSD kernel: support for bus mastering ISA
devices in PCs with more than 16MB of RAM.
.pp
The first real test of the interface on the Alpha platform came by
installing a bus mastering ISA device (an Adaptec 1542 SCSI controller)
in an AXPpci33 computer.  After addressing a small bug in the Alpha
implementation of \fIbus_dmamap_load\fR(), the device worked flawlessly.
.pp
When converting device drivers to use the new interface, developers
discovered that a fair amount of mostly-similar code could be removed
from each driver converted.  The code in question was the loop that
built the software scatter-gather list.  In some cases, the drivers
performed noticeably better, due to the fact that the implementation
of this loop within \fIbus_dmamap_load()\fR is more efficient and
supports segment concatenation.
.pp
Most of the machine-independent drivers that use DMA have been converted
to the new interface, and more platforms have implemented the
necessary back-ends.  The results have been very encouraging.  Nearly
every device/platform combination that has been tested has worked without
additional modifications to the device driver.  The few exceptions to this
have generally been to handle differences in host and device byte-order,
and are not directly related to DMA.
.pp
The \fIbus_dma\fR interface has also paved the way for additional
machine-independent bus autoconfiguration frameworks, such as for VME.
Eventually, this will help support PCI-to-VME bridges, and allow
Sun, Motorola, and Intel systems to share common VME device drivers.
.pp
We have found the \fIbus_dma\fR interface to be a major architectural
benefit in the NetBSD kernel, greatly simplifying the process of porting
the kernel to new platforms, and making portable device driver development
considerably easier.  In short, the abstraction has delivered what it was
designed to deliver: a means of supporting a wide range of platforms with
maximum code reuse.
