diff --git a/meta-arm/recipes-kernel/linux/linux-yocto/zone_dma_revert.patch b/meta-arm/recipes-kernel/linux/linux-yocto/zone_dma_revert.patch index 12954162..8659d08e 100644 --- a/meta-arm/recipes-kernel/linux/linux-yocto/zone_dma_revert.patch +++ b/meta-arm/recipes-kernel/linux/linux-yocto/zone_dma_revert.patch @@ -3,8 +3,22 @@ Revert ZONE_DMA patches Upstream-Status: Inappropriate Signed-off-by: Jon Mason +diff --git a/arch/arm64/include/asm/processor.h b/arch/arm64/include/asm/processor.h +index fce8cbecd6bc..a884d7773989 100644 +--- a/arch/arm64/include/asm/processor.h ++++ b/arch/arm64/include/asm/processor.h +@@ -96,7 +96,8 @@ + #endif /* CONFIG_ARM64_FORCE_52BIT */ + + extern phys_addr_t arm64_dma_phys_limit; +-#define ARCH_LOW_ADDRESS_LIMIT (arm64_dma_phys_limit - 1) ++extern phys_addr_t arm64_dma32_phys_limit; ++#define ARCH_LOW_ADDRESS_LIMIT ((arm64_dma_phys_limit ? : arm64_dma32_phys_limit) - 1) + + struct debug_info { + #ifdef CONFIG_HAVE_HW_BREAKPOINT diff --git a/arch/arm64/mm/init.c b/arch/arm64/mm/init.c -index 916e0547fdcc..7fbb9c85af8a 100644 +index a985d292e820..7fbb9c85af8a 100644 --- a/arch/arm64/mm/init.c +++ b/arch/arm64/mm/init.c @@ -29,7 +29,6 @@ @@ -24,12 +38,41 @@ index 916e0547fdcc..7fbb9c85af8a 100644 /* * We need to be able to catch inadvertent references to memstart_addr * that occur (potentially in generic code) before arm64_memblock_init() -@@ -187,13 +188,9 @@ static phys_addr_t __init max_zone_phys(unsigned int zone_bits) +@@ -53,13 +54,13 @@ s64 memstart_addr __ro_after_init = -1; + EXPORT_SYMBOL(memstart_addr); + + /* +- * If the corresponding config options are enabled, we create both ZONE_DMA +- * and ZONE_DMA32. By default ZONE_DMA covers the 32-bit addressable memory +- * unless restricted on specific platforms (e.g. 30-bit on Raspberry Pi 4). +- * In such case, ZONE_DMA32 covers the rest of the 32-bit addressable memory, +- * otherwise it is empty. ++ * We create both ZONE_DMA and ZONE_DMA32. ZONE_DMA covers the first 1G of ++ * memory as some devices, namely the Raspberry Pi 4, have peripherals with ++ * this limited view of the memory. ZONE_DMA32 will cover the rest of the 32 ++ * bit addressable memory area. + */ + phys_addr_t arm64_dma_phys_limit __ro_after_init; ++phys_addr_t arm64_dma32_phys_limit __ro_after_init; + + #ifdef CONFIG_KEXEC_CORE + /* +@@ -84,7 +85,7 @@ static void __init reserve_crashkernel(void) + + if (crash_base == 0) { + /* Current arm64 boot protocol requires 2MB alignment */ +- crash_base = memblock_find_in_range(0, arm64_dma_phys_limit, ++ crash_base = memblock_find_in_range(0, arm64_dma32_phys_limit, + crash_size, SZ_2M); + if (crash_base == 0) { + pr_warn("cannot allocate crashkernel (size:0x%llx)\n", +@@ -187,24 +188,15 @@ static phys_addr_t __init max_zone_phys(unsigned int zone_bits) static void __init zone_sizes_init(unsigned long min, unsigned long max) { unsigned long max_zone_pfns[MAX_NR_ZONES] = {0}; - unsigned int __maybe_unused acpi_zone_dma_bits; - unsigned int __maybe_unused dt_zone_dma_bits; +- phys_addr_t __maybe_unused dma32_phys_limit = max_zone_phys(32); #ifdef CONFIG_ZONE_DMA - acpi_zone_dma_bits = fls64(acpi_iort_dma_get_max_cpu_address()); @@ -39,6 +82,55 @@ index 916e0547fdcc..7fbb9c85af8a 100644 arm64_dma_phys_limit = max_zone_phys(zone_dma_bits); max_zone_pfns[ZONE_DMA] = PFN_DOWN(arm64_dma_phys_limit); #endif + #ifdef CONFIG_ZONE_DMA32 +- max_zone_pfns[ZONE_DMA32] = PFN_DOWN(dma32_phys_limit); +- if (!arm64_dma_phys_limit) +- arm64_dma_phys_limit = dma32_phys_limit; ++ max_zone_pfns[ZONE_DMA32] = PFN_DOWN(arm64_dma32_phys_limit); + #endif +- if (!arm64_dma_phys_limit) +- arm64_dma_phys_limit = PHYS_MASK + 1; + max_zone_pfns[ZONE_NORMAL] = max; + + free_area_init(max_zone_pfns); +@@ -398,9 +390,16 @@ void __init arm64_memblock_init(void) + + early_init_fdt_scan_reserved_mem(); + ++ if (IS_ENABLED(CONFIG_ZONE_DMA32)) ++ arm64_dma32_phys_limit = max_zone_phys(32); ++ else ++ arm64_dma32_phys_limit = PHYS_MASK + 1; ++ + reserve_elfcorehdr(); + + high_memory = __va(memblock_end_of_DRAM() - 1) + 1; ++ ++ dma_contiguous_reserve(arm64_dma32_phys_limit); + } + + void __init bootmem_init(void) +@@ -435,11 +434,6 @@ void __init bootmem_init(void) + sparse_init(); + zone_sizes_init(min, max); + +- /* +- * Reserve the CMA area after arm64_dma_phys_limit was initialised. +- */ +- dma_contiguous_reserve(arm64_dma_phys_limit); +- + /* + * request_standard_resources() depends on crashkernel's memory being + * reserved, so do it here. +@@ -522,7 +516,7 @@ static void __init free_unused_memmap(void) + void __init mem_init(void) + { + if (swiotlb_force == SWIOTLB_FORCE || +- max_pfn > PFN_DOWN(arm64_dma_phys_limit)) ++ max_pfn > PFN_DOWN(arm64_dma_phys_limit ? : arm64_dma32_phys_limit)) + swiotlb_init(1); + else + swiotlb_force = SWIOTLB_NO_FORCE; diff --git a/drivers/acpi/arm64/iort.c b/drivers/acpi/arm64/iort.c index 2494138a6905..94f34109695c 100644 --- a/drivers/acpi/arm64/iort.c