• Paul Burton's avatar
    MIPS: Make (UN)CAC_ADDR() PHYS_OFFSET-agnostic · 0d0e1477
    Paul Burton authored
    Converting an address between cached & uncached (typically addresses in
    (c)kseg0 & (c)kseg1 or 2 xkphys regions) should not depend upon
    PHYS_OFFSET in any way - we're converting from a virtual address in one
    unmapped region to a virtual address in another unmapped region.
    
    For some reason our CAC_ADDR() & UNCAC_ADDR() macros make use of
    PAGE_OFFSET, which typically includes PHYS_OFFSET. This means that
    platforms with a non-zero PHYS_OFFSET typically have to workaround
    miscalculation by these 2 macros by also defining UNCAC_BASE to a value
    that isn't really correct.
    
    It appears that an attempt has previously been made to address this with
    commit 3f4579252aa1 ("MIPS: make CAC_ADDR and UNCAC_ADDR account for
    PHYS_OFFSET") which was later undone by commit ed3ce16c ("Revert
    "MIPS: make CAC_ADDR and UNCAC_ADDR account for PHYS_OFFSET"") which
    also introduced the ar7 workaround. That attempt at a fix was roughly
    equivalent, but essentially caused the CAC_ADDR() & UNCAC_ADDR() macros
    to cancel out PHYS_OFFSET by adding & then subtracting it again. In his
    revert Leonid is correct that using PHYS_OFFSET makes no sense in the
    context of these macros, but appears to have missed its inclusion via
    PAGE_OFFSET which means PHYS_OFFSET actually had an effect after the
    revert rather than before it.
    
    Here we fix this by modifying CAC_ADDR() & UNCAC_ADDR() to stop using
    PAGE_OFFSET (& thus PHYS_OFFSET), instead using __pa() & __va() along
    with UNCAC_BASE.
    
    For UNCAC_ADDR(), __pa() will convert a cached address to a physical
    address which we can simply use as an offset from UNCAC_BASE to obtain
    an address in the uncached region.
    
    For CAC_ADDR() we can undo the effect of UNCAC_ADDR() by subtracting
    UNCAC_BASE and using __va() on the result.
    
    With this change made, remove definitions of UNCAC_BASE from the ar7 &
    pic32 platforms which appear to have defined them only to workaround
    this problem.
    Signed-off-by: default avatarPaul Burton <paul.burton@mips.com>
    References: 3f4579252aa1 ("MIPS: make CAC_ADDR and UNCAC_ADDR account for PHYS_OFFSET")
    References: ed3ce16c ("Revert "MIPS: make CAC_ADDR and UNCAC_ADDR account for PHYS_OFFSET"")
    Patchwork: https://patchwork.linux-mips.org/patch/20046/
    Cc: Florian Fainelli <f.fainelli@gmail.com>
    Cc: James Hogan <jhogan@kernel.org>
    Cc: Ralf Baechle <ralf@linux-mips.org>
    Cc: linux-mips@linux-mips.org
    Cc: Vladimir Kondratiev <vladimir.kondratiev@intel.com>
    0d0e1477
dma-noncoherent.c 5.19 KB