From: Greg Kroah-Hartman Date: Mon, 17 May 2021 11:37:58 +0000 (+0200) Subject: 5.10-stable patches X-Git-Tag: v5.4.120~26 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=79194573b20cfefcf1aff6213cb52f06018055d1;p=thirdparty%2Fkernel%2Fstable-queue.git 5.10-stable patches 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 --- diff --git a/queue-5.10/arm-9011-1-centralize-phys-to-virt-conversion-of-dt-atags-address.patch b/queue-5.10/arm-9011-1-centralize-phys-to-virt-conversion-of-dt-atags-address.patch new file mode 100644 index 00000000000..17238945325 --- /dev/null +++ b/queue-5.10/arm-9011-1-centralize-phys-to-virt-conversion-of-dt-atags-address.patch @@ -0,0 +1,172 @@ +From foo@baz Mon May 17 01:35:13 PM CEST 2021 +From: Florian Fainelli +Date: Mon, 10 May 2021 06:21:08 -0700 +Subject: ARM: 9011/1: centralize phys-to-virt conversion of DT/ATAGS address +To: stable@vger.kernel.org +Cc: Ard Biesheuvel , Linus Walleij , Nicolas Pitre , Russell King , Florian Fainelli , Jonathan Corbet , Russell King , Mike Rapoport , Andrew Morton , Nick Desaulniers , Joe Perches , Max Filippov , Tian Tao , 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 , Sasha Levin +Message-ID: <20210510132111.1690943-2-f.fainelli@gmail.com> + +From: Ard Biesheuvel + +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 +Reviewed-by: Linus Walleij +Acked-by: Nicolas Pitre +Signed-off-by: Ard Biesheuvel +Signed-off-by: Russell King +Signed-off-by: Florian Fainelli +Signed-off-by: Greg Kroah-Hartman +--- + 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 +@@ -174,7 +174,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; +@@ -195,8 +195,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); +@@ -1081,19 +1082,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 +@@ -1489,7 +1489,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; + +@@ -1520,7 +1520,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.10/arm-9012-1-move-device-tree-mapping-out-of-linear-region.patch b/queue-5.10/arm-9012-1-move-device-tree-mapping-out-of-linear-region.patch new file mode 100644 index 00000000000..b6b8fe31fb0 --- /dev/null +++ b/queue-5.10/arm-9012-1-move-device-tree-mapping-out-of-linear-region.patch @@ -0,0 +1,245 @@ +From foo@baz Mon May 17 01:35:13 PM CEST 2021 +From: Florian Fainelli +Date: Mon, 10 May 2021 06:21:09 -0700 +Subject: ARM: 9012/1: move device tree mapping out of linear region +To: stable@vger.kernel.org +Cc: Ard Biesheuvel , Linus Walleij , Nicolas Pitre , Russell King , Florian Fainelli , Jonathan Corbet , Russell King , Mike Rapoport , Andrew Morton , Nick Desaulniers , Joe Perches , Max Filippov , Tian Tao , 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 , Sasha Levin +Message-ID: <20210510132111.1690943-3-f.fainelli@gmail.com> + +From: Ard Biesheuvel + +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 +Reviewed-by: Linus Walleij +Reviewed-by: Nicolas Pitre +Signed-off-by: Ard Biesheuvel +Signed-off-by: Russell King +Signed-off-by: Florian Fainelli +Signed-off-by: Greg Kroah-Hartman +--- + 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 + #include + #include ++#include + #include + #include + #include +@@ -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); +@@ -1083,13 +1083,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 +@@ -223,7 +223,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. +@@ -946,7 +948,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", +@@ -1333,6 +1335,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. +@@ -1489,8 +1500,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; + + /* +@@ -1503,7 +1513,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; +@@ -1520,7 +1529,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", +@@ -1556,7 +1564,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.10/arm-9020-1-mm-use-correct-section-size-macro-to-describe-the-fdt-virtual-address.patch b/queue-5.10/arm-9020-1-mm-use-correct-section-size-macro-to-describe-the-fdt-virtual-address.patch new file mode 100644 index 00000000000..ab215e35c84 --- /dev/null +++ b/queue-5.10/arm-9020-1-mm-use-correct-section-size-macro-to-describe-the-fdt-virtual-address.patch @@ -0,0 +1,70 @@ +From foo@baz Mon May 17 01:35:13 PM CEST 2021 +From: Florian Fainelli +Date: Mon, 10 May 2021 06:21:10 -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 , Joel Stanley , Marek Szyprowski , Russell King , Florian Fainelli , Jonathan Corbet , Russell King , Nicolas Pitre , Linus Walleij , Mike Rapoport , Andrew Morton , Nick Desaulniers , Joe Perches , Max Filippov , Tian Tao , 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 , Sasha Levin +Message-ID: <20210510132111.1690943-4-f.fainelli@gmail.com> + +From: Ard Biesheuvel + +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 +Tested-by: Marek Szyprowski +Signed-off-by: Ard Biesheuvel +Signed-off-by: Russell King +Signed-off-by: Florian Fainelli +Signed-off-by: Greg Kroah-Hartman +--- + 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 +@@ -1086,7 +1086,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.10/arm-9027-1-head.s-explicitly-map-dt-even-if-it-lives-in-the-first-physical-section.patch b/queue-5.10/arm-9027-1-head.s-explicitly-map-dt-even-if-it-lives-in-the-first-physical-section.patch new file mode 100644 index 00000000000..551b2f1e396 --- /dev/null +++ b/queue-5.10/arm-9027-1-head.s-explicitly-map-dt-even-if-it-lives-in-the-first-physical-section.patch @@ -0,0 +1,56 @@ +From foo@baz Mon May 17 01:35:13 PM CEST 2021 +From: Florian Fainelli +Date: Mon, 10 May 2021 06:21:11 -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 , "kernelci.org bot" , Linus Walleij , Russell King , Florian Fainelli , Jonathan Corbet , Russell King , Nicolas Pitre , Mike Rapoport , Andrew Morton , Nick Desaulniers , Joe Perches , Max Filippov , Tian Tao , 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 , Sasha Levin +Message-ID: <20210510132111.1690943-5-f.fainelli@gmail.com> + +From: Ard Biesheuvel + +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" +Reviewed-by: Linus Walleij +Signed-off-by: Ard Biesheuvel +Signed-off-by: Russell King +Signed-off-by: Florian Fainelli +Signed-off-by: Greg Kroah-Hartman +--- + 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] diff --git a/queue-5.10/series b/queue-5.10/series index 998de26fc0a..1bd6f327086 100644 --- a/queue-5.10/series +++ b/queue-5.10/series @@ -268,3 +268,7 @@ mips-avoid-divu-in-__div64_32-is-result-would-be-zero.patch mips-avoid-handcoded-divu-in-__div64_32-altogether.patch clocksource-drivers-timer-ti-dm-prepare-to-handle-dra7-timer-wrap-issue.patch clocksource-drivers-timer-ti-dm-handle-dra7-timer-wrap-errata-i940.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