2009/12/7 Ralf Baechle <ralf@xxxxxxxxxxxxxx>
hi Ralf,
is it using dma_alloc_coherent()? i see the this funtion in arch/mips/mm/dma_default.c, it also invork the
__get_free_pages() and return the dma_addr by plat_map_dma_mem()->virt_to_phy() , see include/asm-mips/mach-genric/dma-coherent.h. so i think, i see use __get_free_pages() alloce buffer for DMA.
in my puzzle, if i run
dma_vaddr =(char*) __get_free_pages(GFP_KERNEL, order);
dma_phy = virt_to_phy(dma_vaddr);
if the result is:
dma_vaddr = 0x801b00000;
dma_phy = 0x1b00000;
so i should write 0x1b00000 to my DMA Base register or wirte (0x1b000000 | 0xa0000000) to DMA?
2. If my system have HIGHMEM, so i alloc highmem pages by :
page = alloc_pages(__GFP_HIGHMEM, order);
phy = page_to_phys(page);
how i write this highmem phy addr to DMA base register?
Best,
Figo.zhang
On Mon, Dec 07, 2009 at 08:55:12PM +0800, figo zhang wrote:You probably don't want to use GFP_DMA - unless your hardware has DMA
> I am writing a driver for MIPS32. i wirte this code for DMA addr:
>
> dma_vaddr =(char*) __get_free_pages(GFP_KERNEL|
> GFP_DMA, order);
restrictions such as the ISA's bus's 16MB limit.
> dma_phy = virt_to_phy(dma_vaddr);
Ouch. Don't. See Documentation/DMA-API.txt for how to do it.
hi Ralf,
is it using dma_alloc_coherent()? i see the this funtion in arch/mips/mm/dma_default.c, it also invork the
__get_free_pages() and return the dma_addr by plat_map_dma_mem()->virt_to_phy() , see include/asm-mips/mach-genric/dma-coherent.h. so i think, i see use __get_free_pages() alloce buffer for DMA.
It's only happens to work on some systems.
> i write dma_phy to DMA base register, but why it cannot work? it should
> write Kseg1 space to DMA register?
> I remember that it is ok for ARM/X86 .
in my puzzle, if i run
dma_vaddr =(char*) __get_free_pages(GFP_KERNEL, order);
dma_phy = virt_to_phy(dma_vaddr);
if the result is:
dma_vaddr = 0x801b00000;
dma_phy = 0x1b00000;
so i should write 0x1b00000 to my DMA Base register or wirte (0x1b000000 | 0xa0000000) to DMA?
2. If my system have HIGHMEM, so i alloc highmem pages by :
page = alloc_pages(__GFP_HIGHMEM, order);
phy = page_to_phys(page);
how i write this highmem phy addr to DMA base register?
Best,
Figo.zhang
Ralf