| From foo@baz Mon May 17 01:35:13 PM CEST 2021 |
| From: Florian Fainelli <f.fainelli@gmail.com> |
| 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 <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>, Mike Rapoport <rppt@kernel.org>, Andrew Morton <akpm@linux-foundation.org>, Nick Desaulniers <ndesaulniers@google.com>, Joe Perches <joe@perches.com>, Max Filippov <jcmvbkbc@gmail.com>, Tian Tao <tiantao6@hisilicon.com>, 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>, Sasha Levin <sashal@kernel.org> |
| Message-ID: <20210510132111.1690943-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 |
| @@ -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", |