At Fri, 22 Aug 2008 11:41:31 +0200, Thomas Bogendoerfer wrote: > > On Fri, Aug 22, 2008 at 08:07:44AM +0200, Takashi Iwai wrote: > > I don't think that this must work for *every* platform, too, and it's > > not expected from the driver. The systems without uncached memory > > access can simply return an error from dma_mmap_coherent() call, so > > that the driver can disable the mmap. That'd be enough. > > true, I've used snd_pcm_indirect for HAL2 driver, which works even on > SGI IP28 machines. > > > Now, how to handle these exceptions: a question comes into my mind > > again -- how does the framebuffer handle these as well? > > most framebuffers have a dedicated set of video memory and this memory is > just mmaped uncached either via TLB/MMU (MIPS) or rules inside > the system (PARISC uses IO space memory, which is always uncached). > The code which does this mmaping is in drivers/video/fbmem.c plus > fb_pgprotect out of an include/asm header file. Thanks. These are the files I already looked at, and pgprot fiddling is already in my last patches (and apparently they not enough). > For framebuffers without dedicated video memory the memory is mmaped > write through or uncached. A driver, which uses this, is > drivers/video/gbefb.c. So, adding a code like below to dma_mmap_coherent() for MIPS? static inline pgprot_t pgprot_mmap(pgprot_t _prot) { unsigned long prot = pgprot_val(_prot) & ~_CACHE_MASK; #ifdef CONFIG_SGI_IP32 #ifdef CONFIG_CPU_R10000 prot = prot | _CACHE_UNCACHED_ACCELERATED; #else prot = prot | _CACHE_CACHABLE_NO_WA; #endif #else prot = prot | _CACHE_UNCACHED; #endif return __pgprot(prot); } dma_mmap_coherent() { ... vma->vm_page_prot = pgprot_mmap(vma->vm_page_prot); ... remap_pfn_range(...); } thanks, Takashi