• Phil Elwell's avatar
    staging: vc04_services: Fix bulk cache maintenance · ff92b9e3
    Phil Elwell authored
    vchiq_arm supports transfers less than one page and at arbitrary
    alignment, using the dma-mapping API to perform its cache maintenance
    (even though the VPU drives the DMA hardware). Read (DMA_FROM_DEVICE)
    operations use cache invalidation for speed, falling back to
    clean+invalidate on partial cache lines, with writes (DMA_TO_DEVICE)
    using flushes.
    
    If a read transfer has ends which aren't page-aligned, performing cache
    maintenance as if they were whole pages can lead to memory corruption
    since the partial cache lines at the ends (and any cache lines before or
    after the transfer area) will be invalidated. This bug was masked until
    the disabling of the cache flush in flush_dcache_page().
    
    Honouring the requested transfer start- and end-points prevents the
    corruption.
    
    Fixes: cf9caf19 ("staging: vc04_services: Replace dmac_map_area with dmac_map_sg")
    Signed-off-by: default avatarPhil Elwell <phil@raspberrypi.org>
    Cc: stable <stable@vger.kernel.org> # 4.10
    Reported-by: default avatarStefan Wahren <stefan.wahren@i2se.com>
    Tested-by: default avatarStefan Wahren <stefan.wahren@i2se.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    ff92b9e3
vchiq_2835_arm.c 16.9 KB