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

* Re: [meta-arm] [PATCH] arm: additional workaround for qemuarm64-secureboot ZONE_DMA
  2021-05-20 10:04 [PATCH] arm: additional workaround for qemuarm64-secureboot ZONE_DMA Ross Burton
@ 2021-05-20 15:26 ` Jon Mason
  0 siblings, 0 replies; 2+ messages in thread
From: Jon Mason @ 2021-05-20 15:26 UTC (permalink / raw)
  To: Ross Burton; +Cc: meta-arm

On Thu, May 20, 2021 at 11:04:26AM +0100, Ross Burton wrote:
> 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>

Applied to master

Thanks,
Jon

> ---
>  .../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	[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.