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