OSDN Git Service

ARM: brcmstb: Enable ZONE_DMA for non 64-bit capable peripherals
authorAl Cooper <alcooperx@gmail.com>
Thu, 9 Mar 2017 18:51:18 +0000 (10:51 -0800)
committerFlorian Fainelli <f.fainelli@gmail.com>
Wed, 15 Mar 2017 21:57:25 +0000 (14:57 -0700)
commit3c51b9c7f1fae00c25f1e34da649a288e3fea1ae
tree33261020a6ed01535794a1d4c5fdfa47f107c860
parentc1ae3cfa0e89fa1a7ecc4c99031f5e9ae99d9201
ARM: brcmstb: Enable ZONE_DMA for non 64-bit capable peripherals

Some Host Controller hardware blocks, like the OHCI, EHCI and SDIO
controllers, have hardware blocks that are not capable of doing 64 bit
DMA. These host controllers fail on boards with >3GB of memory because
the memory above 3GB is located physically >= 0x100000000 and can only
be accessed using 64 DMA. The way Linux is currently configured for
BRCMSTB systems, the memory given to drivers for DMA through functions
like dma_alloc_coherent() comes from CMA memory and CMA memory is taken
from the top of physical memory. When these drivers get a DMA buffer
with an address >=0x100000000, they end up dropping the upper 32 bit of
the address causing the hardware to DMA to incorrect memory, typically
BMEM (custom memory carveout). This issue was discovered on a
BCM97449SSV_DDR4 system with 4GB or memory.

The fix is to enable CONFIG_ZONE_DMA. On ARM systems this makes sure
that all DMA memory is located within the first 32 bits of address
space.

Signed-off-by: Al Cooper <alcooperx@gmail.com>
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
arch/arm/mach-bcm/Kconfig