Re: Dma addr should use Kuseg1 for MIPS32?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 





2009/12/7 Ralf Baechle <ralf@xxxxxxxxxxxxxx>
On Mon, Dec 07, 2009 at 08:55:12PM +0800, figo zhang wrote:

> 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);

You probably don't want to use GFP_DMA - unless your hardware has DMA
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.

> 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 .

It's only happens to work on some systems.

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


[Index of Archives]     [Linux MIPS Home]     [LKML Archive]     [Linux ARM Kernel]     [Linux ARM]     [Linux]     [Git]     [Yosemite News]     [Linux SCSI]     [Linux Hams]

  Powered by Linux