correct use of bus_dmamap_sync
John Baldwin
jhb at freebsd.org
Tue Oct 25 10:31:24 PDT 2005
On Tuesday 25 October 2005 09:15 am, Dinesh Nair wrote:
> i came across this message
> http://lists.freebsd.org/pipermail/freebsd-current/2004-December/044395.htm
>l
>
> and while it explains the use of bus_dmamap_sync, i'm still a little
> confused on it's usage. i'm trying to port over a driver from freebsd 5.x
> to freebsd 4.x, and it uses dma mapped addresses extensively.
>
> i've been trying to figure out the best places to use bus_dmamap_sync when
> reading/writing to a dma mapped address space. however, i cant seem to get
> the gist of this, either from the mailing list discussions or the man page.
>
> i've got two buffers, one for read, and one for write. both have been set
> up with calls to bus_dma_tag_create, bus_dmamem_alloc and bus_dmamap_load.
>
> the buffers, which are used in the calls to bus_dmamem_alloc and
> bus_dmamap_load are,
>
> int *readbuf;
> int *writebuf;
>
> (must i malloc space for them before passing them into those functions, or
> will the call to bus_dmamem_alloc do it for me ?)
bus_dmamem_alloc() will do it for you.
> also, i'm on FreeBSD 4.11 right now, and i notice the definitions of
> BUS_DMASYNC_* has changed from an enum (0-3) in 4.x to a typedef in 5.x in
> machine/bus_dma.h
>
> the pseudo code for the read and write, called during an interrupt cycle,
> are:
>
> rx_func()
> {
> POSITION A
bus_dmamap_sync(PREREAD);
> while(there_is_some_data) {
> memcpy(somebuf, readbuf)
> }
> POSITION B
bus_dmamap_sync(POSTREAD);
> }
>
> tx_func()
> {
> POSITION C
bus_dmamap_sync(PREWRITE);
> while(there_is_some_data) {
> memcpy(writebuf, somebuf)
> }
> POSITION D
bus_dmamap_sync(POSTWRITE);
> }
>
> the question is, what op should i use for bus_dmamap_sync in positions A,
> B, C and D ?
>
> any assistance would be gladly appreciated, as i'm seeing some really weird
> symptoms on this device, where data written out is being immediately read
> in. i'm guessing this has to do with my wrong usage of bus_dmamap_sync().
Probably not as the sync()'s don't really do anything with memory allocated
via bus_dmamem_alloc(). The operations are named from the CPU's perspective,
thus when you send data to your device, that is a WRITE operation (even
though your device is doing a DMA to read data), and when you get data back
from your device, that is a READ operation (even though your device is doing
a DMA to write the data into the buffer).
--
John Baldwin <jhb at FreeBSD.org> <>< http://www.FreeBSD.org/~jhb/
"Power Users Use the Power to Serve" = http://www.FreeBSD.org
More information about the freebsd-hackers
mailing list