• Robin Murphy's avatar
    of: fix DMA mask generation · ee7b1f31
    Robin Murphy authored
    Historically, DMA masks have suffered some ambiguity between whether
    they represent the range of physical memory a device can access, or the
    address bits a device is capable of driving, particularly since on many
    platforms the two are equivalent. Whilst there are some stragglers left
    (dma_max_pfn(), I'm looking at you...), the majority of DMA code has
    been cleaned up to follow the latter definition, not least since it is
    the only one which makes sense once IOMMUs are involved.
    
    In this respect, of_dma_configure() has always done the wrong thing in
    how it generates initial masks based on "dma-ranges". Although rounding
    down did not affect the TI Keystone platform where dma_addr + size is
    already a power of two, in any other case it results in a mask which is
    at best unnecessarily constrained and at worst unusable.
    
    BCM2837 illustrates the problem nicely, where we have a DMA base of 3GB
    and a size of 1GB - 16MB, giving dma_addr + size = 0xff000000 and a
    resultant mask of 0x7fffffff, which is then insufficient to even cover
    the necessary offset, effectively making all DMA addresses out-of-range.
    This has been hidden until now (mostly because we don't yet prevent
    drivers from simply overwriting this initial mask later upon probe), but
    due to recent changes elsewhere now shows up as USB being broken on
    Raspberry Pi 3.
    
    Make it right by rounding up instead of down, such that the mask
    correctly correctly describes all possisble bits the device needs to
    emit.
    
    Fixes: 9a6d7298 ("of: Calculate device DMA masks based on DT dma-range size")
    Reported-by: default avatarStefan Wahren <stefan.wahren@i2se.com>
    Reported-by: default avatarAndreas Färber <afaerber@suse.de>
    Reported-by: default avatarHans Verkuil <hverkuil@xs4all.nl>
    Signed-off-by: default avatarRobin Murphy <robin.murphy@arm.com>
    Acked-by: default avatarRob Herring <robh@kernel.org>
    Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
    ee7b1f31
device.c 8.19 KB