• R
    Revert "ARM: 7304/1: ioremap: fix boundary check when reusing static mapping" · 97f10409
    Russell King 提交于
    This reverts commit 3c424f35.
    
    Joachim Eastwood reports:
    | "ARM: 7304/1: ioremap: fix boundary check when reusing static mapping"
    | Commit: 3c424f35 in Linus master
    |
    | Breaks booting on my custom AT91RM9200 board.
    | There isn't any error messages or anything that indicates what goes
    | wrong it just stops after; Uncompressing Linux... done, booting the
    | kernel.
    |
    | Reverting it makes my board boot again.
    
    and further debugging reveals:
    
    ioremap: pfn=fffff phys=fffff000 offset=400 size=1000
    ioremap: area c3ffdfc0: phys_addr=200000 pfn=200 size=4000
    ioremap: found: addr fef74000 => fed73000 => fed73400
    
    Clearly, an area for pfn 0x200, 16K can't ever satisfy a request for pfn
    0xfffff.  This happens because the changed if statement becomes:
    
                    if (0x00200 > 0xfffff ||
                        0xfffff000 + 0x400 + 0x1000-1 > 0x00200000 + 0x4000-1)
    and therefore:
                    if (0x00200 > 0xfffff ||
                        0x000003ff > 0x00203fff)
    
    The if condition fails, and so we _believe_ that the SRAM mapping fits
    our request.  Clearly that's totally bogus.
    
    Moreover, the original premise of the 'fix' patch was wrong:
    |    The condition checking boundaries of the requested and existing
    |    mappings didn't take in-page offset into consideration though,
    |    which lead to obscure and hard to debug problems when requested
    |    mapping crossed end of the static one.
    
    as the code immediately above this loop does:
    
            size = PAGE_ALIGN(offset + size);
    
    so 'size' already contains the requested offset into the page.
    
    So, revert the broken 'fix'.
    Acked-by: NNicolas Pitre <nico@linaro.org>
    97f10409
ioremap.c 9.8 KB