cvs commit: src/share/man/man9 bus_dma.9

Ruslan Ermilov ru at FreeBSD.org
Wed Mar 1 23:21:25 PST 2006


On Wed, Mar 01, 2006 at 04:50:39PM -0700, Scott Long wrote:
> John-Mark Gurney wrote:
> >Ruslan Ermilov wrote this message on Thu, Mar 02, 2006 at 01:26 +0200:
> >
> >>On Tue, Feb 28, 2006 at 07:58:57PM +0000, John-Mark Gurney wrote:
> >>
> >>>jmg         2006-02-28 19:58:57 UTC
> >>>
> >>> FreeBSD src repository
> >>>
> >>> Modified files:
> >>>   share/man/man9       bus_dma.9 
> >>> Log:
> >>> update examples to use the correct terms that was never updated when the
> >>> earlier descriptions were gone over...
> >>> 
> >>> MFC after:      3 days
> >>> 
> >>> Revision  Changes    Path
> >>> 1.32      +3 -3      src/share/man/man9/bus_dma.9
> >>>
> >>
> >>Not enough of fixing: "DMA read" and "DMA write" are also entangled here.
> >
> >
> >Nope...  WRITE == DMA read...  Read the descriptions of the flags
> >very carefully...  If you aren't confused, you don't understand it..
> >The reason you're confused is the reason why everyone gets it wrong,
> >and no one ever gets it correct the first time trying to figure out
> >which one to use...
> >
> 
WRITE == DMA write, it's not THAT confusing, please see below.  :-)

> Think of it from the perspective of the driver doing an operation.  If 
> the driver is reading a block off the disk, then you want to use the
                ^^^^^^^
> PREREAD/POSTREAD operations.
  ^^^^^^^^^^^^^^^^
> 
Correct.  So driver tells a device to "read directly into memory", a
DMA read operation.  Similarly for writes.  A CPU "writes directly
into device memory", a DMA write operation.

> Likewise for writes.  It is done this way
> for clarity in the driver.  I can't imagine how many bugs we'd have if
> write == read in the driver sources.
> 
Yes, that fits my understanding of how things work, and that's what
we have clarified in the manpage not so long ago:

: All operations specified below are performed from the host mem-
: ory point of view, where a read implies data coming from the
                             ^^^^                     ^^^^^^^^
: device to the host memory, and a write implies data going from
  ^^^^^^^^^^^^^^^^^^^^^^^^^        ^^^^^                    ^^^^
: the host memory to the device.  Alternately, the operations can
  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
: be thought of in terms of driver operations, where reading a
: network packet or storage sector corresponds to a read operation
: in bus_dma.
: 
: BUS_DMASYNC_PREREAD    Perform any synchronization required
:                        prior to an update of host memory by the
:                        DMA read operation.
: 
: BUS_DMASYNC_PREWRITE   Perform any synchronization required
:                        after an update of host memory by the CPU
:                        and prior to DMA write operations.
: 
: BUS_DMASYNC_POSTREAD   Perform any synchronization required
:                        after DMA read operations and prior to
:                        CPU access to host memory.
: 
: BUS_DMASYNC_POSTWRITE  Perform any synchronization required
:                        after DMA write operations.

However, the text that John-Mark has correctly changed now looks
like this:

: 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.

That's DMA write.

: 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_PREWRITE must be
                                     ^^^^^^^^^^^^^^^^^^^^ OK!
: performed.  Additional sync operations must be performed after
: every CPU write to this memory if additional DMA reads are to be
                                               ^^^^^^^^^ should be "write"
: performed.  Conversely, for the DMA write case, the buffer must
                                      ^^^^^ should be "read"
: be loaded, and a dma sync operation of BUS_DMASYNC_PREREAD must
                                         ^^^^^^^^^^^^^^^^^^^ OK!
: be performed.  The CPU will only be able to see the results of
: this DMA write once the DMA has completed and a
           ^^^^^ should be "read"
: BUS_DMASYNC_POSTREAD operation has been performed.
  ^^^^^^^^^^^^^^^^^^^^ OK!


Cheers,
-- 
Ruslan Ermilov
ru at FreeBSD.org
FreeBSD committer
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 187 bytes
Desc: not available
Url : http://lists.freebsd.org/pipermail/cvs-src/attachments/20060302/af1c11b0/attachment-0001.bin


More information about the cvs-src mailing list