• Chen-Yu Tsai's avatar
    ARM: dma-api: fix max_pfn off-by-one error in __dma_supported() · f3cc4e1d
    Chen-Yu Tsai authored
    max_pfn, as set in arch/arm/mm/init.c:
    
        static void __init find_limits(unsigned long *min,
    				   unsigned long *max_low,
    				   unsigned long *max_high)
        {
    	    *max_low = PFN_DOWN(memblock_get_current_limit());
    	    *min = PFN_UP(memblock_start_of_DRAM());
    	    *max_high = PFN_DOWN(memblock_end_of_DRAM());
        }
    
    with memblock_end_of_DRAM() pointing to the next byte after DRAM.  As
    such, max_pfn points to the PFN after the end of DRAM.
    
    Thus when using max_pfn to check DMA masks, we should subtract one when
    checking DMA ranges against it.
    
    Commit 8bf1268f ("ARM: dma-api: fix off-by-one error in
    __dma_supported()") fixed the same issue, but missed this spot.
    
    This issue was found while working on the sun4i-csi v4l2 driver on the
    Allwinner R40 SoC.  On Allwinner SoCs, DRAM is offset at 0x40000000, and
    we are starting to use of_dma_configure() with the "dma-ranges" property
    in the device tree to have the DMA API handle the offset.
    
    In this particular instance, dma-ranges was set to the same range as the
    actual available (2 GiB) DRAM.  The following error appeared when the
    driver attempted to allocate a buffer:
    
        sun4i-csi 1c09000.csi: Coherent DMA mask 0x7fffffff (pfn 0x40000-0xc0000)
        covers a smaller range of system memory than the DMA zone pfn 0x0-0xc0001
        sun4i-csi 1c09000.csi: dma_alloc_coherent of size 307200 failed
    
    Fixing the off-by-one error makes things work.
    
    Link: http://lkml.kernel.org/r/20191224030239.5656-1-wens@kernel.org
    Fixes: 11a5aa32 ("ARM: dma-mapping: check DMA mask against available memory")
    Fixes: 9f28cde0 ("ARM: another fix for the DMA mapping checks")
    Fixes: ab746573 ("ARM: dma-mapping: allow larger DMA mask than supported")
    Signed-off-by: default avatarChen-Yu Tsai <wens@csie.org>
    Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
    Cc: Russell King <linux@armlinux.org.uk>
    Cc: Robin Murphy <robin.murphy@arm.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    f3cc4e1d
dma-mapping.c 62.2 KB