All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Ross Burton" <ross@burtonini.com>
To: meta-arm@lists.yoctoproject.org
Subject: [PATCH] arm: additional workaround for qemuarm64-secureboot ZONE_DMA
Date: Thu, 20 May 2021 11:04:26 +0100	[thread overview]
Message-ID: <20210520100426.1648115-1-ross.burton@arm.com> (raw)

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


             reply	other threads:[~2021-05-20 10:04 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-05-20 10:04 Ross Burton [this message]
2021-05-20 15:26 ` [meta-arm] [PATCH] arm: additional workaround for qemuarm64-secureboot ZONE_DMA Jon Mason

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210520100426.1648115-1-ross.burton@arm.com \
    --to=ross@burtonini.com \
    --cc=meta-arm@lists.yoctoproject.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.