[prev in list] [next in list] [prev in thread] [next in thread] 

List:       linux-mips
Subject:    Re: fix oops in dma_unmap_page on not coherent mips platforms
From:       Atsushi Nemoto <anemo () mba ! ocn ! ne ! jp>
Date:       2008-12-26 15:07:13
Message-ID: 20081227.000713.72709048.anemo () mba ! ocn ! ne ! jp
[Download RAW message or body]

On Fri, 28 Nov 2008 08:52:58 +0100, Jan Nikitenko <jan.nikitenko@gmail.com> wrote:
> dma_cache_wback_inv() expects virtual address, but physical was provided
> due to translation via plat_dma_addr_to_phys().
> If replaced with dma_addr_to_virt(), page fault oops from dma_unmap_page()
> is gone on au1550 platform.
> 
> Signed-off-by: Jan Nikitenko <jan.nikitenko@gmail.com>
> ---
>  arch/mips/mm/dma-default.c |    2 +-
>   1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/arch/mips/mm/dma-default.c b/arch/mips/mm/dma-default.c
> index 5b98d0e..5f336c1 100644
> --- a/arch/mips/mm/dma-default.c
> +++ b/arch/mips/mm/dma-default.c
> @@ -222,7 +222,7 @@ void dma_unmap_page(struct device *dev, dma_addr_t dma_address, size_t size,
>  	if (!plat_device_is_coherent(dev) && direction != DMA_TO_DEVICE) {
>  		unsigned long addr;
>  
> -		addr = plat_dma_addr_to_phys(dma_address);
> +		addr = dma_addr_to_virt(dma_address);
>  		dma_cache_wback_inv(addr, size);
>  	}

Acked-by: Atsushi Nemoto <anemo@mba.ocn.ne.jp>

I'm also wondering why dma_map_page and dma_unmap_page are using
dma_cache_wback_inv instead of __dma_sync.  They also lack special
r10000 handling.  Hmm...

---
Atsushi Nemoto

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic