Some 64-bit SoC have IP cores whose DMA capability is limited to 32-bits only. To handles such cases introduced DMA_32_BIT_ONLY as well as add the code to make sure that malloc pool (which will be used for DMA buffers) is accessible using 32-bit address. Signed-off-by: Andrey Smirnov <andrew.smirnov@xxxxxxxxx> --- arch/arm/cpu/Kconfig | 3 +++ arch/arm/cpu/start.c | 23 +++++++++++++++++++++++ drivers/mci/Kconfig | 1 + drivers/net/Kconfig | 1 + 4 files changed, 28 insertions(+) diff --git a/arch/arm/cpu/Kconfig b/arch/arm/cpu/Kconfig index 2359c56b3..d9f68d9d0 100644 --- a/arch/arm/cpu/Kconfig +++ b/arch/arm/cpu/Kconfig @@ -3,6 +3,9 @@ comment "Processor Type" config PHYS_ADDR_T_64BIT bool +config DMA_32_BIT_ONLY + bool + config CPU_32 bool select HAS_MODULES diff --git a/arch/arm/cpu/start.c b/arch/arm/cpu/start.c index 898f7ae19..3fc322d52 100644 --- a/arch/arm/cpu/start.c +++ b/arch/arm/cpu/start.c @@ -203,6 +203,29 @@ __noreturn void barebox_non_pbl_start(unsigned long membase, } } + if (IS_ENABLED(CONFIG_DMA_32_BIT_ONLY) && + /* If membase is past 4GiB there's nothing we can do */ + !WARN_ON(membase > U32_MAX)) { + /* + * Using SZ_4G against unsigned long will produce + * warning when compiling for 32-bit machines, so we + * defined the constant below so we can compare + * against U32_MAX instead. + */ + const unsigned long __malloc_end = malloc_end - 1; + + if (__malloc_end > U32_MAX) { + /* + * Some ARMv8 SoCs use IP blocks that are + * only do DMA transfers in first 4GiB of + * address space. To avoid allocating bad + * DMA buffers we move our malloc pool to + * reside within that region. + */ + malloc_end = U32_MAX + 1; + } + } + /* * Maximum malloc space is the Kconfig value if given * or 1GB. diff --git a/drivers/mci/Kconfig b/drivers/mci/Kconfig index 954f957bc..0687841a7 100644 --- a/drivers/mci/Kconfig +++ b/drivers/mci/Kconfig @@ -83,6 +83,7 @@ config MCI_IMX config MCI_IMX_ESDHC bool "i.MX esdhc" depends on ARCH_IMX + select DMA_32_BIT_ONLY if PHYS_ADDR_T_64BIT help Enable this entry to add support to read and write SD cards on a Freescale i.MX25/35/51 based system. diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig index b633a3ac4..a1679d8f6 100644 --- a/drivers/net/Kconfig +++ b/drivers/net/Kconfig @@ -135,6 +135,7 @@ config DRIVER_NET_FEC_IMX bool "i.MX FEC Ethernet driver" depends on ARCH_HAS_FEC_IMX select PHYLIB + select DMA_32_BIT_ONLY if PHYS_ADDR_T_64BIT config DRIVER_NET_GIANFAR bool "Gianfar Ethernet" -- 2.17.1 _______________________________________________ barebox mailing list barebox@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/barebox