• T
    arm: plat-orion: fix address decoding when > 4GB is used · 217bef3d
    Thomas Petazzoni 提交于
    During the system initialization, the orion_setup_cpu_mbus_target()
    function reads the SDRAM address decoding registers to find out how
    many chip-selects of SDRAM have been enabled, and builds a small array
    with one entry per chip-select. This array is then used by device
    drivers (XOR, Ethernet, etc.) to configure their own address decoding
    windows to the SDRAM.
    
    However, devices can only access the first 32 bits of the physical
    memory. Even though LPAE is not supported for now, some Marvell boards
    are now showing up with 8 GB of RAM, configured using two SDRAM
    address decoding windows: the first covering the first 4 GB, the
    second covering the last 4 GB. The array built by
    orion_setup_cpu_mbus_target() has therefore two entries, and device
    drivers try to set up two address decoding windows to the
    SDRAM. However, in the device registers for the address decoding, the
    base address is only 32 bits, so those two windows overlap each other,
    and the devices do not work at all.
    
    This patch makes sure that the array built by
    orion_setup_cpu_mbus_target() only contains the SDRAM decoding windows
    that correspond to the first 4 GB of the memory. To do that, it
    ignores the SDRAM decoding windows for which the 4 low-order bits are
    not zero (the 4 low-order bits of the base register are used to store
    bits 32:35 of the base address, so they actually indicate whether the
    base address is above 4 GB).
    
    This patch allows the newly introduced armada-xp-gp board to properly
    operate when it is mounted with more than 4 GB of RAM. Without that,
    all devices doing DMA (for example XOR and Ethernet) do not work at
    all.
    Signed-off-by: NThomas Petazzoni <thomas.petazzoni@free-electrons.com>
    Tested-by: NEzequiel Garcia <ezequiel.garcia@free-electrons.com>
    Signed-off-by: NJason Cooper <jason@lakedaemon.net>
    217bef3d
addr-map.c 4.2 KB