cvs commit: src/share/man/man9 bus_dma.9
John-Mark Gurney
gurney_j at resnet.uoregon.edu
Wed Aug 11 18:28:58 PDT 2004
Thomas Moestl wrote this message on Thu, Aug 12, 2004 at 03:10 +0200:
> On Wed, 2004/08/11 at 08:04:58 -0700, John-Mark Gurney wrote:
> Hmmm. It seems to me that the text the new reference points to is
> wrong, or at least ambiguous:
>
> bus_dmamap_sync() is the method used to ensure that CPU and
> device DMA access to shared memory is coherent. For example,
> the CPU might be used to setup the contents of a buffer that is
> to be DMA'ed into a device. To ensure that the data are visible
> via the device's mapping of that memory, the buffer must be
> loaded and a dma sync operation of BUS_DMASYNC_PREREAD must be
> performed. Additional sync operations must be performed after
> every CPU write to this memory if additional DMA reads are to be
> performed. Conversely, for the DMA write case, the buffer must
> be loaded, and a dma sync operation of BUS_DMASYNC_PREWRITE must
> be performed. The CPU will only be able to see the results of
> this DMA write once the DMA has completed and a
> BUS_DMASYNC_POSTWRITE operation has been performed.
>
> When the CPU sets up data to be DMAed into the device from memory, it
> needs to use a PREWRITE, not POSTREAD, sync before starting the DMA
We aren't NetBSD... :) it needs to be a _PREREAD since the device
is _reading_ from the cpu's memory... check sys/i386/i386/busdma_machdep.c
function _bus_dmamap_sync which does bounce buffering...
> operation. Likewise, after DMAing data out of the device and into
> memory, a POSTREAD is required. This is quickly evident when looking
and here the device is _writing_ to the cpu's memory, and hence a
_POSTWRITE...
> into the busdma implementations, for example the way the i386 one
> deals with bounce buffers on syncs.
> The best way to memorize the flags (and probably their origin) is to
> imagine a disk controller; a write to disk will need the *WRITE flags
> (but it reads from memory), and vice versa.
>
> NetBSD has a nice clarification:
> Synchronization operations are expressed from the perspective of
> the host RAM, e.g., a device -> memory operation is a READ and a
> memory -> device operation is a WRITE.
>
> I think that something of that variety is required, since there are
> always the two opposite meanings of "reading from" and "reading into".
Personally, if I am memory, a device _reads_ me, I don't _read_ a
device, it's the device that does the work, not me... the memory isn't
active in dma... it's a passive receiver of requests...
--
John-Mark Gurney Voice: +1 415 225 5579
"All that I will do, has been done, All that I have, has not."
More information about the cvs-src
mailing list