All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] arm: additional workaround for qemuarm64-secureboot ZONE_DMA
@ 2021-05-20 10:04 Ross Burton
  2021-05-20 15:26 ` [meta-arm] " Jon Mason
  0 siblings, 1 reply; 2+ messages in thread
From: Ross Burton @ 2021-05-20 10:04 UTC (permalink / raw)
  To: meta-arm

From: Jon Mason <jon.mason@arm.com>

Reverting additional ZONE_DMA patch 2281df0b0226610e235f49ed75bf6ad57cb04762
which was added in v5.10.37

Change-Id: I3700b95247a4224f4b56a403bc3dc10dde7dd5b5
Signed-off-by: Jon Mason <jon.mason@arm.com>
---
 .../linux/linux-yocto/zone_dma_revert.patch   | 96 ++++++++++++++++++-
 1 file changed, 94 insertions(+), 2 deletions(-)

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 1295416..8659d08 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 <jon.mason@arm.com>
 
+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
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2021-05-20 15:26 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-05-20 10:04 [PATCH] arm: additional workaround for qemuarm64-secureboot ZONE_DMA Ross Burton
2021-05-20 15:26 ` [meta-arm] " Jon Mason

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.