Subject: Re: On the subject of bus_dma(9)
To: Jason R Thorpe <thorpej@zembu.com>
From: Matthew Jacob <mjacob@feral.com>
List: tech-kern
Date: 03/07/2001 10:21:42
> On Wed, Mar 07, 2001 at 08:55:33AM -0800, Matthew Jacob wrote:
> 
>  > I provided input on this, and there were many things you didn't agree with.
>  > One of them was the Solaris DDI DMA model differences which, btw, handles this
>  > stuff fine.
> 
> Where is the documentation on this interface that I can read?

Section 9, Solaris


> 
>  > >  > 3. Therefore, bus_dmamem_alloc'd memory must be assumed to be for
>  > >  > BUS_DMA_COHERENT purposes because there may be no way to 'change'
>  > >  > the identity of the memory alloc'd in bus_dmamem_alloc (it might be
>  > >  > from a pool that *can't* be made byte-coherent).
>  > > 
>  > > bus_dmamem_alloc() for a particular bus_dma_tag_t *should never* allocate
>  > > from memory which can not be made to DTRT for a particular bus.  All this
>  > > does it point to a bug in the sparc64 bus_dmamem_alloc() routines.
>  > 
>  > No - this is inflammatory, and you should be ashamed for saying it.
> 
> What?  Nonsense.  If the memory returned by a bus_dmamem_alloc()
> can't be DMA map'd in a coherent fashion *and* `sync' operations
> can't work on that memory region, then I am 100% correct in saying
> that bus_dmamem_alloc() failed to allocate "DMA safe memory" (which
> is what the manual page documents it as allocating).
> 
> Let me clarify -- by definition of what bus_dmamem_alloc() is, it MUST
> return memory for which at least one of the following statements is true:
> 
> 	(1) The memory is DMA coherent.
> 
> 	(2) Sync operations ensure that the device sees the correct
> 	    version of the page.
> 
> If neither of those are true for a region that bus_dmamem_alloc() returns,
> then the region is *not* "DMA safe memory", and therefore bus_dmamem_alloc()
> is buggy.

"Nonsense" isn't a technical term :-).

"Sync operations" don't work for this platform in this way (it's not "Sync"
for the CPU in this case, it's "Sync for the device", therefore
bus_dmamem_alloc must return memory which is DMA coherent. We're in agreement
on this *if* we don't change the spec to give a hint earlier.

> 
>  > And, btw, just because you haven't handled peer-peer- you might at least
>  > document the issue.
> 
> Well, "peer-peer" needs to be better-defined, as well.  If you're talking
> about DMA'ing into a host memory region that another device accesses, then
> "DMA safe memory" should pretty well take care of it.  If you're talking
> about DMA'ing into a memory region that is present in *bus space* (e.g.
> a frame grabber DMA'ing into the frame buffer on a graphics adapter), that's
> a whole different issue (and a fairly complicated one).
> 
>  > So- please reconsider letting me update the man page with some clarifications.
> 
> Once I collect all the clarifications that need to be made (I kind of have
> a running list going), I'll be happy to make the updates.

Sooner rather than later. There are far, far, too many issues that just fall
on the floor.

-matt