Subject: Re: On the subject of bus_dma(9) (fwd)
To: None <tech-kern@netbsd.org>
From: Matthew Jacob <mjacob@feral.com>
List: tech-kern
Date: 03/07/2001 10:51:33
>
> [ Eduardo said he sent a response on this subject to the list, but I didn't
> see it nor is it in the archives, so I'm taking the liberty of forwarding a
> slightly trimmed version ]
>
> ...
>
> As I said- *I* don't care which one of either. I just want it to be
> clearer. Hopefully Eduardo can weigh in and we can come to closure on
> this and move on.
>
> O.K. You asked for it.
>
> 1) The man page does not say any of this. You could argue that
> it is documented in the bus_dma* paper, but very few people ever
> read that. So the man page should describe the interface
> unambiguously, which it doesn't.
>
> 2) A hint to how to map memory in to the CPU does not handle
> mapping the memory into the dma engine.
That's correct- or there's an assumption that COHERENT means for both CPU and
Device at the same time. In which case the peer-peer DMA case can't work
because you need to map things into CPU's virtual address space to give the
COHERENT hint.
>
> 3) The assumption that bus_dmamap_sync() will always work
> with no other support needed is flawed.
'flawed' is possibly too strong a word- and I don't think now that this is
what was intended. What apparently has been intended is that if
bus_dmamap_sync doesn't work, you should use bounce buffers. I think we hope
to avoid that.
>
> 4) The example for the use of bus_dmamap_load_raw() and
> bus_dmamem_mmap() demonstrates how the interface is broken.
> If the memory needs to be mapped into the dma engine
> coherently, by the time bus_dmamem_mmap() is called,
> it is much too late to map it in coherently.
Well, yes. I'm *really* confused by how the description of bus_dmamap_load_raw
got into the man page. It's just plain different from what Jason says this
interface should be.
>
> 5) If you change the definition of bus_dmamem_alloc()
> so it does imply that the memory is DMA coherent, you also
> need a method to allocate streaming dma memory if you will
> use streaming access instead.
I think documenting this as:
If you want to allocate memory that can be mapped without
the BUS_DMA_COHERENT, use malloc(9) and perform the usual
bus_dma_map and bus_dma_load functions. Note that you may
not be able to, in all cases, create a completely byte-coherent
view of this memory whilst it is mapped for device and CPU
access at the same time.
>
> So, maybe we should be passing the BUS_DMA_COHERENT flag
> in to bus_dmamem_alloc() instead of bus_dmamem_map() or
> bus_dmamap_load().
I certainly would support the last.
-matt