• N
    arm64: mm: Set ZONE_DMA size based on devicetree's dma-ranges · 8424ecdd
    Nicolas Saenz Julienne 提交于
    We recently introduced a 1 GB sized ZONE_DMA to cater for platforms
    incorporating masters that can address less than 32 bits of DMA, in
    particular the Raspberry Pi 4, which has 4 or 8 GB of DRAM, but has
    peripherals that can only address up to 1 GB (and its PCIe host
    bridge can only access the bottom 3 GB)
    
    The DMA layer also needs to be able to allocate memory that is
    guaranteed to meet those DMA constraints, for bounce buffering as well
    as allocating the backing for consistent mappings. This is why the 1 GB
    ZONE_DMA was introduced recently. Unfortunately, it turns out the having
    a 1 GB ZONE_DMA as well as a ZONE_DMA32 causes problems with kdump, and
    potentially in other places where allocations cannot cross zone
    boundaries. Therefore, we should avoid having two separate DMA zones
    when possible.
    
    So, with the help of of_dma_get_max_cpu_address() get the topmost
    physical address accessible to all DMA masters in system and use that
    information to fine-tune ZONE_DMA's size. In the absence of addressing
    limited masters ZONE_DMA will span the whole 32-bit address space,
    otherwise, in the case of the Raspberry Pi 4 it'll only span the 30-bit
    address space, and have ZONE_DMA32 cover the rest of the 32-bit address
    space.
    Signed-off-by: NNicolas Saenz Julienne <nsaenzjulienne@suse.de>
    Link: https://lore.kernel.org/r/20201119175400.9995-6-nsaenzjulienne@suse.deSigned-off-by: NCatalin Marinas <catalin.marinas@arm.com>
    8424ecdd
init.c 15.4 KB