On Tue, May 10, 2005 at 04:14:51PM +0300, Pantelis Antoniou wrote: > Matt Porter wrote: > > On Tue, May 10, 2005 at 08:13:48AM -0400, Dan Malek wrote: > > > >>On May 10, 2005, at 7:17 AM, Pantelis Antoniou wrote: > >> > >> > >>>This patch replace iopa use with virt_to_phys. > >> > >>Not gonna work ..... > >> > >>When you map uncached on 8xx you get a new vmalloc() > >>space. The virt_to_xxx macros don't work on those addresses. > >>You need to use the dma_consistent() function, stash the > >>real physical address it returns and then use it where > >>appropriate. > > > > > > That and the use of virt_to_* and friends is deprecated by > > the DMA API. You'll never get that upstream even if it were > > a case where it did work. That's a good thing to know for > > anybody doing other drivers... > > > > -Matt > > > > > > OK then. > > What's the recommended function to call to go from a > virtual -> physical address, but without doing a cache > flush/invalidate?
There is no generic function to do that in a driver since no mainstream drivers in the kernel need to do it. Generally you can rework the driver such that you cache the DMA address as Dan suggested already. I don't know your exact usage, however, you can allocate memory with dma_alloc_noncoherent() that is cached on ppc32 NOT_CACHE_COHERENT prcoessors and stash the dma_addr_t/void * for later use. The other way is to kmalloc and dma_map_single() (stashing the same way) which is basically the same thing. Do you have a case where this doesn't work? -Matt