]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
5.4-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 17 May 2021 11:37:38 +0000 (13:37 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 17 May 2021 11:37:38 +0000 (13:37 +0200)
added patches:
arm-9011-1-centralize-phys-to-virt-conversion-of-dt-atags-address.patch
arm-9012-1-move-device-tree-mapping-out-of-linear-region.patch
arm-9020-1-mm-use-correct-section-size-macro-to-describe-the-fdt-virtual-address.patch
arm-9027-1-head.s-explicitly-map-dt-even-if-it-lives-in-the-first-physical-section.patch

queue-5.4/arm-9011-1-centralize-phys-to-virt-conversion-of-dt-atags-address.patch [new file with mode: 0644]
queue-5.4/arm-9012-1-move-device-tree-mapping-out-of-linear-region.patch [new file with mode: 0644]
queue-5.4/arm-9020-1-mm-use-correct-section-size-macro-to-describe-the-fdt-virtual-address.patch [new file with mode: 0644]
queue-5.4/arm-9027-1-head.s-explicitly-map-dt-even-if-it-lives-in-the-first-physical-section.patch [new file with mode: 0644]
queue-5.4/series

diff --git a/queue-5.4/arm-9011-1-centralize-phys-to-virt-conversion-of-dt-atags-address.patch b/queue-5.4/arm-9011-1-centralize-phys-to-virt-conversion-of-dt-atags-address.patch
new file mode 100644 (file)
index 0000000..a0b8c80
--- /dev/null
@@ -0,0 +1,172 @@
+From foo@baz Mon May 17 01:36:09 PM CEST 2021
+From: Florian Fainelli <f.fainelli@gmail.com>
+Date: Mon, 10 May 2021 06:33:18 -0700
+Subject: ARM: 9011/1: centralize phys-to-virt conversion of DT/ATAGS address
+To: stable@vger.kernel.org
+Cc: Ard Biesheuvel <ardb@kernel.org>, Linus Walleij <linus.walleij@linaro.org>, Nicolas Pitre <nico@fluxnic.net>, Russell King <rmk+kernel@armlinux.org.uk>, Florian Fainelli <f.fainelli@gmail.com>, Jonathan Corbet <corbet@lwn.net>, Russell King <linux@armlinux.org.uk>, Sasha Levin <sashal@kernel.org>, linux-doc@vger.kernel.org (open list:DOCUMENTATION), linux-kernel@vger.kernel.org (open list), linux-arm-kernel@lists.infradead.org (moderated list:ARM PORT), Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Message-ID: <20210510133321.1790243-2-f.fainelli@gmail.com>
+
+From: Ard Biesheuvel <ardb@kernel.org>
+
+commit e9a2f8b599d0bc22a1b13e69527246ac39c697b4 upstream
+
+Before moving the DT mapping out of the linear region, let's prepare
+for this change by removing all the phys-to-virt translations of the
+__atags_pointer variable, and perform this translation only once at
+setup time.
+
+Tested-by: Linus Walleij <linus.walleij@linaro.org>
+Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
+Acked-by: Nicolas Pitre <nico@fluxnic.net>
+Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
+Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
+Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ arch/arm/include/asm/prom.h   |    4 ++--
+ arch/arm/kernel/atags.h       |    4 ++--
+ arch/arm/kernel/atags_parse.c |    6 +++---
+ arch/arm/kernel/devtree.c     |    6 +++---
+ arch/arm/kernel/setup.c       |   14 +++++++++-----
+ arch/arm/mm/mmu.c             |    4 ++--
+ 6 files changed, 21 insertions(+), 17 deletions(-)
+
+--- a/arch/arm/include/asm/prom.h
++++ b/arch/arm/include/asm/prom.h
+@@ -9,12 +9,12 @@
+ #ifdef CONFIG_OF
+-extern const struct machine_desc *setup_machine_fdt(unsigned int dt_phys);
++extern const struct machine_desc *setup_machine_fdt(void *dt_virt);
+ extern void __init arm_dt_init_cpu_maps(void);
+ #else /* CONFIG_OF */
+-static inline const struct machine_desc *setup_machine_fdt(unsigned int dt_phys)
++static inline const struct machine_desc *setup_machine_fdt(void *dt_virt)
+ {
+       return NULL;
+ }
+--- a/arch/arm/kernel/atags.h
++++ b/arch/arm/kernel/atags.h
+@@ -2,11 +2,11 @@
+ void convert_to_tag_list(struct tag *tags);
+ #ifdef CONFIG_ATAGS
+-const struct machine_desc *setup_machine_tags(phys_addr_t __atags_pointer,
++const struct machine_desc *setup_machine_tags(void *__atags_vaddr,
+       unsigned int machine_nr);
+ #else
+ static inline const struct machine_desc * __init __noreturn
+-setup_machine_tags(phys_addr_t __atags_pointer, unsigned int machine_nr)
++setup_machine_tags(void *__atags_vaddr, unsigned int machine_nr)
+ {
+       early_print("no ATAGS support: can't continue\n");
+       while (true);
+--- a/arch/arm/kernel/atags_parse.c
++++ b/arch/arm/kernel/atags_parse.c
+@@ -176,7 +176,7 @@ static void __init squash_mem_tags(struc
+ }
+ const struct machine_desc * __init
+-setup_machine_tags(phys_addr_t __atags_pointer, unsigned int machine_nr)
++setup_machine_tags(void *atags_vaddr, unsigned int machine_nr)
+ {
+       struct tag *tags = (struct tag *)&default_tags;
+       const struct machine_desc *mdesc = NULL, *p;
+@@ -197,8 +197,8 @@ setup_machine_tags(phys_addr_t __atags_p
+       if (!mdesc)
+               return NULL;
+-      if (__atags_pointer)
+-              tags = phys_to_virt(__atags_pointer);
++      if (atags_vaddr)
++              tags = atags_vaddr;
+       else if (mdesc->atag_offset)
+               tags = (void *)(PAGE_OFFSET + mdesc->atag_offset);
+--- a/arch/arm/kernel/devtree.c
++++ b/arch/arm/kernel/devtree.c
+@@ -203,12 +203,12 @@ static const void * __init arch_get_next
+ /**
+  * setup_machine_fdt - Machine setup when an dtb was passed to the kernel
+- * @dt_phys: physical address of dt blob
++ * @dt_virt: virtual address of dt blob
+  *
+  * If a dtb was passed to the kernel in r2, then use it to choose the
+  * correct machine_desc and to setup the system.
+  */
+-const struct machine_desc * __init setup_machine_fdt(unsigned int dt_phys)
++const struct machine_desc * __init setup_machine_fdt(void *dt_virt)
+ {
+       const struct machine_desc *mdesc, *mdesc_best = NULL;
+@@ -221,7 +221,7 @@ const struct machine_desc * __init setup
+       mdesc_best = &__mach_desc_GENERIC_DT;
+ #endif
+-      if (!dt_phys || !early_init_dt_verify(phys_to_virt(dt_phys)))
++      if (!dt_virt || !early_init_dt_verify(dt_virt))
+               return NULL;
+       mdesc = of_flat_dt_match_machine(mdesc_best, arch_get_next_mach);
+--- a/arch/arm/kernel/setup.c
++++ b/arch/arm/kernel/setup.c
+@@ -89,6 +89,7 @@ unsigned int cacheid __read_mostly;
+ EXPORT_SYMBOL(cacheid);
+ unsigned int __atags_pointer __initdata;
++void *atags_vaddr __initdata;
+ unsigned int system_rev;
+ EXPORT_SYMBOL(system_rev);
+@@ -1075,19 +1076,22 @@ void __init hyp_mode_check(void)
+ void __init setup_arch(char **cmdline_p)
+ {
+-      const struct machine_desc *mdesc;
++      const struct machine_desc *mdesc = NULL;
++
++      if (__atags_pointer)
++              atags_vaddr = phys_to_virt(__atags_pointer);
+       setup_processor();
+-      mdesc = setup_machine_fdt(__atags_pointer);
++      if (atags_vaddr)
++              mdesc = setup_machine_fdt(atags_vaddr);
+       if (!mdesc)
+-              mdesc = setup_machine_tags(__atags_pointer, __machine_arch_type);
++              mdesc = setup_machine_tags(atags_vaddr, __machine_arch_type);
+       if (!mdesc) {
+               early_print("\nError: invalid dtb and unrecognized/unsupported machine ID\n");
+               early_print("  r1=0x%08x, r2=0x%08x\n", __machine_arch_type,
+                           __atags_pointer);
+               if (__atags_pointer)
+-                      early_print("  r2[]=%*ph\n", 16,
+-                                  phys_to_virt(__atags_pointer));
++                      early_print("  r2[]=%*ph\n", 16, atags_vaddr);
+               dump_machine_table();
+       }
+--- a/arch/arm/mm/mmu.c
++++ b/arch/arm/mm/mmu.c
+@@ -1512,7 +1512,7 @@ static void __init map_lowmem(void)
+ }
+ #ifdef CONFIG_ARM_PV_FIXUP
+-extern unsigned long __atags_pointer;
++extern void *atags_vaddr;
+ typedef void pgtables_remap(long long offset, unsigned long pgd, void *bdata);
+ pgtables_remap lpae_pgtables_remap_asm;
+@@ -1543,7 +1543,7 @@ static void __init early_paging_init(con
+        */
+       lpae_pgtables_remap = (pgtables_remap *)(unsigned long)__pa(lpae_pgtables_remap_asm);
+       pa_pgd = __pa(swapper_pg_dir);
+-      boot_data = __va(__atags_pointer);
++      boot_data = atags_vaddr;
+       barrier();
+       pr_info("Switching physical address space to 0x%08llx\n",
diff --git a/queue-5.4/arm-9012-1-move-device-tree-mapping-out-of-linear-region.patch b/queue-5.4/arm-9012-1-move-device-tree-mapping-out-of-linear-region.patch
new file mode 100644 (file)
index 0000000..c26627b
--- /dev/null
@@ -0,0 +1,245 @@
+From foo@baz Mon May 17 01:36:09 PM CEST 2021
+From: Florian Fainelli <f.fainelli@gmail.com>
+Date: Mon, 10 May 2021 06:33:19 -0700
+Subject: ARM: 9012/1: move device tree mapping out of linear region
+To: stable@vger.kernel.org
+Cc: Ard Biesheuvel <ardb@kernel.org>, Linus Walleij <linus.walleij@linaro.org>, Nicolas Pitre <nico@fluxnic.net>, Russell King <rmk+kernel@armlinux.org.uk>, Florian Fainelli <f.fainelli@gmail.com>, Jonathan Corbet <corbet@lwn.net>, Russell King <linux@armlinux.org.uk>, Sasha Levin <sashal@kernel.org>, linux-doc@vger.kernel.org (open list:DOCUMENTATION), linux-kernel@vger.kernel.org (open list), linux-arm-kernel@lists.infradead.org (moderated list:ARM PORT), Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Message-ID: <20210510133321.1790243-3-f.fainelli@gmail.com>
+
+From: Ard Biesheuvel <ardb@kernel.org>
+
+commit 7a1be318f5795cb66fa0dc86b3ace427fe68057f upstream
+
+On ARM, setting up the linear region is tricky, given the constraints
+around placement and alignment of the memblocks, and how the kernel
+itself as well as the DT are placed in physical memory.
+
+Let's simplify matters a bit, by moving the device tree mapping to the
+top of the address space, right between the end of the vmalloc region
+and the start of the the fixmap region, and create a read-only mapping
+for it that is independent of the size of the linear region, and how it
+is organized.
+
+Since this region was formerly used as a guard region, which will now be
+populated fully on LPAE builds by this read-only mapping (which will
+still be able to function as a guard region for stray writes), bump the
+start of the [underutilized] fixmap region by 512 KB as well, to ensure
+that there is always a proper guard region here. Doing so still leaves
+ample room for the fixmap space, even with NR_CPUS set to its maximum
+value of 32.
+
+Tested-by: Linus Walleij <linus.walleij@linaro.org>
+Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
+Reviewed-by: Nicolas Pitre <nico@fluxnic.net>
+Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
+Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
+Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ Documentation/arm/memory.rst  |    7 ++++++-
+ arch/arm/include/asm/fixmap.h |    2 +-
+ arch/arm/include/asm/memory.h |    5 +++++
+ arch/arm/kernel/head.S        |    5 ++---
+ arch/arm/kernel/setup.c       |   11 ++++++++---
+ arch/arm/mm/init.c            |    1 -
+ arch/arm/mm/mmu.c             |   20 ++++++++++++++------
+ arch/arm/mm/pv-fixup-asm.S    |    4 ++--
+ 8 files changed, 38 insertions(+), 17 deletions(-)
+
+--- a/Documentation/arm/memory.rst
++++ b/Documentation/arm/memory.rst
+@@ -45,9 +45,14 @@ fffe8000    fffeffff        DTCM mapping area for
+ fffe0000      fffe7fff        ITCM mapping area for platforms with
+                               ITCM mounted inside the CPU.
+-ffc00000      ffefffff        Fixmap mapping region.  Addresses provided
++ffc80000      ffefffff        Fixmap mapping region.  Addresses provided
+                               by fix_to_virt() will be located here.
++ffc00000      ffc7ffff        Guard region
++
++ff800000      ffbfffff        Permanent, fixed read-only mapping of the
++                              firmware provided DT blob
++
+ fee00000      feffffff        Mapping of PCI I/O space. This is a static
+                               mapping within the vmalloc space.
+--- a/arch/arm/include/asm/fixmap.h
++++ b/arch/arm/include/asm/fixmap.h
+@@ -2,7 +2,7 @@
+ #ifndef _ASM_FIXMAP_H
+ #define _ASM_FIXMAP_H
+-#define FIXADDR_START         0xffc00000UL
++#define FIXADDR_START         0xffc80000UL
+ #define FIXADDR_END           0xfff00000UL
+ #define FIXADDR_TOP           (FIXADDR_END - PAGE_SIZE)
+--- a/arch/arm/include/asm/memory.h
++++ b/arch/arm/include/asm/memory.h
+@@ -67,6 +67,10 @@
+  */
+ #define XIP_VIRT_ADDR(physaddr)  (MODULES_VADDR + ((physaddr) & 0x000fffff))
++#define FDT_FIXED_BASE                UL(0xff800000)
++#define FDT_FIXED_SIZE                (2 * PMD_SIZE)
++#define FDT_VIRT_ADDR(physaddr)       ((void *)(FDT_FIXED_BASE | (physaddr) % PMD_SIZE))
++
+ #if !defined(CONFIG_SMP) && !defined(CONFIG_ARM_LPAE)
+ /*
+  * Allow 16MB-aligned ioremap pages
+@@ -107,6 +111,7 @@ extern unsigned long vectors_base;
+ #define MODULES_VADDR         PAGE_OFFSET
+ #define XIP_VIRT_ADDR(physaddr)  (physaddr)
++#define FDT_VIRT_ADDR(physaddr)  ((void *)(physaddr))
+ #endif /* !CONFIG_MMU */
+--- a/arch/arm/kernel/head.S
++++ b/arch/arm/kernel/head.S
+@@ -275,9 +275,8 @@ __create_page_tables:
+        */
+       mov     r0, r2, lsr #SECTION_SHIFT
+       movs    r0, r0, lsl #SECTION_SHIFT
+-      subne   r3, r0, r8
+-      addne   r3, r3, #PAGE_OFFSET
+-      addne   r3, r4, r3, lsr #(SECTION_SHIFT - PMD_ORDER)
++      ldrne   r3, =FDT_FIXED_BASE >> (SECTION_SHIFT - PMD_ORDER)
++      addne   r3, r3, r4
+       orrne   r6, r7, r0
+       strne   r6, [r3], #1 << PMD_ORDER
+       addne   r6, r6, #1 << SECTION_SHIFT
+--- a/arch/arm/kernel/setup.c
++++ b/arch/arm/kernel/setup.c
+@@ -18,6 +18,7 @@
+ #include <linux/of_platform.h>
+ #include <linux/init.h>
+ #include <linux/kexec.h>
++#include <linux/libfdt.h>
+ #include <linux/of_fdt.h>
+ #include <linux/cpu.h>
+ #include <linux/interrupt.h>
+@@ -89,7 +90,6 @@ unsigned int cacheid __read_mostly;
+ EXPORT_SYMBOL(cacheid);
+ unsigned int __atags_pointer __initdata;
+-void *atags_vaddr __initdata;
+ unsigned int system_rev;
+ EXPORT_SYMBOL(system_rev);
+@@ -1077,13 +1077,18 @@ void __init hyp_mode_check(void)
+ void __init setup_arch(char **cmdline_p)
+ {
+       const struct machine_desc *mdesc = NULL;
++      void *atags_vaddr = NULL;
+       if (__atags_pointer)
+-              atags_vaddr = phys_to_virt(__atags_pointer);
++              atags_vaddr = FDT_VIRT_ADDR(__atags_pointer);
+       setup_processor();
+-      if (atags_vaddr)
++      if (atags_vaddr) {
+               mdesc = setup_machine_fdt(atags_vaddr);
++              if (mdesc)
++                      memblock_reserve(__atags_pointer,
++                                       fdt_totalsize(atags_vaddr));
++      }
+       if (!mdesc)
+               mdesc = setup_machine_tags(atags_vaddr, __machine_arch_type);
+       if (!mdesc) {
+--- a/arch/arm/mm/init.c
++++ b/arch/arm/mm/init.c
+@@ -274,7 +274,6 @@ void __init arm_memblock_init(const stru
+       if (mdesc->reserve)
+               mdesc->reserve();
+-      early_init_fdt_reserve_self();
+       early_init_fdt_scan_reserved_mem();
+       /* reserve memory for DMA contiguous allocations */
+--- a/arch/arm/mm/mmu.c
++++ b/arch/arm/mm/mmu.c
+@@ -39,6 +39,8 @@
+ #include "mm.h"
+ #include "tcm.h"
++extern unsigned long __atags_pointer;
++
+ /*
+  * empty_zero_page is a special page that is used for
+  * zero-initialized data and COW.
+@@ -962,7 +964,7 @@ static void __init create_mapping(struct
+               return;
+       }
+-      if ((md->type == MT_DEVICE || md->type == MT_ROM) &&
++      if (md->type == MT_DEVICE &&
+           md->virtual >= PAGE_OFFSET && md->virtual < FIXADDR_START &&
+           (md->virtual < VMALLOC_START || md->virtual >= VMALLOC_END)) {
+               pr_warn("BUG: mapping for 0x%08llx at 0x%08lx out of vmalloc space\n",
+@@ -1352,6 +1354,15 @@ static void __init devicemaps_init(const
+       for (addr = VMALLOC_START; addr < (FIXADDR_TOP & PMD_MASK); addr += PMD_SIZE)
+               pmd_clear(pmd_off_k(addr));
++      if (__atags_pointer) {
++              /* create a read-only mapping of the device tree */
++              map.pfn = __phys_to_pfn(__atags_pointer & SECTION_MASK);
++              map.virtual = FDT_FIXED_BASE;
++              map.length = FDT_FIXED_SIZE;
++              map.type = MT_ROM;
++              create_mapping(&map);
++      }
++
+       /*
+        * Map the kernel if it is XIP.
+        * It is always first in the modulearea.
+@@ -1512,8 +1523,7 @@ static void __init map_lowmem(void)
+ }
+ #ifdef CONFIG_ARM_PV_FIXUP
+-extern void *atags_vaddr;
+-typedef void pgtables_remap(long long offset, unsigned long pgd, void *bdata);
++typedef void pgtables_remap(long long offset, unsigned long pgd);
+ pgtables_remap lpae_pgtables_remap_asm;
+ /*
+@@ -1526,7 +1536,6 @@ static void __init early_paging_init(con
+       unsigned long pa_pgd;
+       unsigned int cr, ttbcr;
+       long long offset;
+-      void *boot_data;
+       if (!mdesc->pv_fixup)
+               return;
+@@ -1543,7 +1552,6 @@ static void __init early_paging_init(con
+        */
+       lpae_pgtables_remap = (pgtables_remap *)(unsigned long)__pa(lpae_pgtables_remap_asm);
+       pa_pgd = __pa(swapper_pg_dir);
+-      boot_data = atags_vaddr;
+       barrier();
+       pr_info("Switching physical address space to 0x%08llx\n",
+@@ -1579,7 +1587,7 @@ static void __init early_paging_init(con
+        * needs to be assembly.  It's fairly simple, as we're using the
+        * temporary tables setup by the initial assembly code.
+        */
+-      lpae_pgtables_remap(offset, pa_pgd, boot_data);
++      lpae_pgtables_remap(offset, pa_pgd);
+       /* Re-enable the caches and cacheable TLB walks */
+       asm volatile("mcr p15, 0, %0, c2, c0, 2" : : "r" (ttbcr));
+--- a/arch/arm/mm/pv-fixup-asm.S
++++ b/arch/arm/mm/pv-fixup-asm.S
+@@ -39,8 +39,8 @@ ENTRY(lpae_pgtables_remap_asm)
+       /* Update level 2 entries for the boot data */
+       add     r7, r2, #0x1000
+-      add     r7, r7, r3, lsr #SECTION_SHIFT - L2_ORDER
+-      bic     r7, r7, #(1 << L2_ORDER) - 1
++      movw    r3, #FDT_FIXED_BASE >> (SECTION_SHIFT - L2_ORDER)
++      add     r7, r7, r3
+       ldrd    r4, r5, [r7]
+       adds    r4, r4, r0
+       adc     r5, r5, r1
diff --git a/queue-5.4/arm-9020-1-mm-use-correct-section-size-macro-to-describe-the-fdt-virtual-address.patch b/queue-5.4/arm-9020-1-mm-use-correct-section-size-macro-to-describe-the-fdt-virtual-address.patch
new file mode 100644 (file)
index 0000000..a19ee3a
--- /dev/null
@@ -0,0 +1,70 @@
+From foo@baz Mon May 17 01:36:09 PM CEST 2021
+From: Florian Fainelli <f.fainelli@gmail.com>
+Date: Mon, 10 May 2021 06:33:20 -0700
+Subject: ARM: 9020/1: mm: use correct section size macro to describe the FDT virtual address
+To: stable@vger.kernel.org
+Cc: Ard Biesheuvel <ardb@kernel.org>, Joel Stanley <joel@jms.id.au>, Marek Szyprowski <m.szyprowski@samsung.com>, Russell King <rmk+kernel@armlinux.org.uk>, Florian Fainelli <f.fainelli@gmail.com>, Jonathan Corbet <corbet@lwn.net>, Russell King <linux@armlinux.org.uk>, Linus Walleij <linus.walleij@linaro.org>, Nicolas Pitre <nico@fluxnic.net>, Sasha Levin <sashal@kernel.org>, linux-doc@vger.kernel.org (open list:DOCUMENTATION), linux-kernel@vger.kernel.org (open list), linux-arm-kernel@lists.infradead.org (moderated list:ARM PORT), Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Message-ID: <20210510133321.1790243-4-f.fainelli@gmail.com>
+
+From: Ard Biesheuvel <ardb@kernel.org>
+
+commit fc2933c133744305236793025b00c2f7d258b687 upstream
+
+Commit
+
+  149a3ffe62b9dbc3 ("9012/1: move device tree mapping out of linear region")
+
+created a permanent, read-only section mapping of the device tree blob
+provided by the firmware, and added a set of macros to get the base and
+size of the virtually mapped FDT based on the physical address. However,
+while the mapping code uses the SECTION_SIZE macro correctly, the macros
+use PMD_SIZE instead, which means something entirely different on ARM when
+using short descriptors, and is therefore not the right quantity to use
+here. So replace PMD_SIZE with SECTION_SIZE. While at it, change the names
+of the macro and its parameter to clarify that it returns the virtual
+address of the start of the FDT, based on the physical address in memory.
+
+Tested-by: Joel Stanley <joel@jms.id.au>
+Tested-by: Marek Szyprowski <m.szyprowski@samsung.com>
+Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
+Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
+Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ arch/arm/include/asm/memory.h |    6 +++---
+ arch/arm/kernel/setup.c       |    2 +-
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+--- a/arch/arm/include/asm/memory.h
++++ b/arch/arm/include/asm/memory.h
+@@ -68,8 +68,8 @@
+ #define XIP_VIRT_ADDR(physaddr)  (MODULES_VADDR + ((physaddr) & 0x000fffff))
+ #define FDT_FIXED_BASE                UL(0xff800000)
+-#define FDT_FIXED_SIZE                (2 * PMD_SIZE)
+-#define FDT_VIRT_ADDR(physaddr)       ((void *)(FDT_FIXED_BASE | (physaddr) % PMD_SIZE))
++#define FDT_FIXED_SIZE                (2 * SECTION_SIZE)
++#define FDT_VIRT_BASE(physbase)       ((void *)(FDT_FIXED_BASE | (physbase) % SECTION_SIZE))
+ #if !defined(CONFIG_SMP) && !defined(CONFIG_ARM_LPAE)
+ /*
+@@ -111,7 +111,7 @@ extern unsigned long vectors_base;
+ #define MODULES_VADDR         PAGE_OFFSET
+ #define XIP_VIRT_ADDR(physaddr)  (physaddr)
+-#define FDT_VIRT_ADDR(physaddr)  ((void *)(physaddr))
++#define FDT_VIRT_BASE(physbase)  ((void *)(physbase))
+ #endif /* !CONFIG_MMU */
+--- a/arch/arm/kernel/setup.c
++++ b/arch/arm/kernel/setup.c
+@@ -1080,7 +1080,7 @@ void __init setup_arch(char **cmdline_p)
+       void *atags_vaddr = NULL;
+       if (__atags_pointer)
+-              atags_vaddr = FDT_VIRT_ADDR(__atags_pointer);
++              atags_vaddr = FDT_VIRT_BASE(__atags_pointer);
+       setup_processor();
+       if (atags_vaddr) {
diff --git a/queue-5.4/arm-9027-1-head.s-explicitly-map-dt-even-if-it-lives-in-the-first-physical-section.patch b/queue-5.4/arm-9027-1-head.s-explicitly-map-dt-even-if-it-lives-in-the-first-physical-section.patch
new file mode 100644 (file)
index 0000000..46ca838
--- /dev/null
@@ -0,0 +1,56 @@
+From foo@baz Mon May 17 01:36:09 PM CEST 2021
+From: Florian Fainelli <f.fainelli@gmail.com>
+Date: Mon, 10 May 2021 06:33:21 -0700
+Subject: ARM: 9027/1: head.S: explicitly map DT even if it lives in the first physical section
+To: stable@vger.kernel.org
+Cc: Ard Biesheuvel <ardb@kernel.org>, "kernelci.org bot" <bot@kernelci.org>, Linus Walleij <linus.walleij@linaro.org>, Russell King <rmk+kernel@armlinux.org.uk>, Florian Fainelli <f.fainelli@gmail.com>, Jonathan Corbet <corbet@lwn.net>, Russell King <linux@armlinux.org.uk>, Nicolas Pitre <nico@fluxnic.net>, Sasha Levin <sashal@kernel.org>, linux-doc@vger.kernel.org (open list:DOCUMENTATION), linux-kernel@vger.kernel.org (open list), linux-arm-kernel@lists.infradead.org (moderated list:ARM PORT), Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Message-ID: <20210510133321.1790243-5-f.fainelli@gmail.com>
+
+From: Ard Biesheuvel <ardb@kernel.org>
+
+commit 10fce53c0ef8f6e79115c3d9e0d7ea1338c3fa37 upstream
+
+The early ATAGS/DT mapping code uses SECTION_SHIFT to mask low order
+bits of R2, and decides that no ATAGS/DTB were provided if the resulting
+value is 0x0.
+
+This means that on systems where DRAM starts at 0x0 (such as Raspberry
+Pi), no explicit mapping of the DT will be created if R2 points into the
+first 1 MB section of memory. This was not a problem before, because the
+decompressed kernel is loaded at the base of DRAM and mapped using
+sections as well, and so as long as the DT is referenced via a virtual
+address that uses the same translation (the linear map, in this case),
+things work fine.
+
+However, commit 7a1be318f579 ("9012/1: move device tree mapping out of
+linear region") changes this, and now the DT is referenced via a virtual
+address that is disjoint from the linear mapping of DRAM, and so we need
+the early code to create the DT mapping unconditionally.
+
+So let's create the early DT mapping for any value of R2 != 0x0.
+
+Reported-by: "kernelci.org bot" <bot@kernelci.org>
+Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
+Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
+Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
+Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ arch/arm/kernel/head.S |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+--- a/arch/arm/kernel/head.S
++++ b/arch/arm/kernel/head.S
+@@ -274,10 +274,10 @@ __create_page_tables:
+        * We map 2 sections in case the ATAGs/DTB crosses a section boundary.
+        */
+       mov     r0, r2, lsr #SECTION_SHIFT
+-      movs    r0, r0, lsl #SECTION_SHIFT
++      cmp     r2, #0
+       ldrne   r3, =FDT_FIXED_BASE >> (SECTION_SHIFT - PMD_ORDER)
+       addne   r3, r3, r4
+-      orrne   r6, r7, r0
++      orrne   r6, r7, r0, lsl #SECTION_SHIFT
+       strne   r6, [r3], #1 << PMD_ORDER
+       addne   r6, r6, #1 << SECTION_SHIFT
+       strne   r6, [r3]
index 09d7accae41bd08b5c7fe406d2675d548f05f4b7..5ed5f691355447c23993bdeb5ce45ffca5719881 100644 (file)
@@ -129,3 +129,7 @@ mips-avoid-divu-in-__div64_32-is-result-would-be-zero.patch
 mips-avoid-handcoded-divu-in-__div64_32-altogether.patch
 thermal-core-fair-share-lock-the-thermal-zone-while-looping-over-instances.patch
 f2fs-fix-error-handling-in-f2fs_end_enable_verity.patch
+arm-9011-1-centralize-phys-to-virt-conversion-of-dt-atags-address.patch
+arm-9012-1-move-device-tree-mapping-out-of-linear-region.patch
+arm-9020-1-mm-use-correct-section-size-macro-to-describe-the-fdt-virtual-address.patch
+arm-9027-1-head.s-explicitly-map-dt-even-if-it-lives-in-the-first-physical-section.patch