[PATCH v2 1/2] ARM: centralize phys-to-virt conversion of DT/ATAGS address
Nicolas Pitre
nico at fluxnic.net
Wed Oct 7 11:28:46 EDT 2020
On Wed, 7 Oct 2020, Ard Biesheuvel wrote:
> 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 at linaro.org>
> Reviewed-by: Linus Walleij <linus.walleij at linaro.org>
> Signed-off-by: Ard Biesheuvel <ardb at kernel.org>
Acked-by: Nicolas Pitre <nico at fluxnic.net>
> ---
> 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(-)
>
> diff --git a/arch/arm/include/asm/prom.h b/arch/arm/include/asm/prom.h
> index 1e36c40533c1..402e3f34c7ed 100644
> --- 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;
> }
> diff --git a/arch/arm/kernel/atags.h b/arch/arm/kernel/atags.h
> index 067e12edc341..f2819c25b602 100644
> --- 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);
> diff --git a/arch/arm/kernel/atags_parse.c b/arch/arm/kernel/atags_parse.c
> index 6c12d9fe694e..373b61f9a4f0 100644
> --- a/arch/arm/kernel/atags_parse.c
> +++ b/arch/arm/kernel/atags_parse.c
> @@ -174,7 +174,7 @@ static void __init squash_mem_tags(struct tag *tag)
> }
>
> 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_pointer, unsigned int machine_nr)
> 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);
>
> diff --git a/arch/arm/kernel/devtree.c b/arch/arm/kernel/devtree.c
> index 39c978698406..4e09883c276d 100644
> --- a/arch/arm/kernel/devtree.c
> +++ b/arch/arm/kernel/devtree.c
> @@ -203,12 +203,12 @@ static const void * __init arch_get_next_mach(const char *const **match)
>
> /**
> * 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_machine_fdt(unsigned int dt_phys)
> 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);
> diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c
> index 5b1dcf1ad042..58e56e23a19a 100644
> --- a/arch/arm/kernel/setup.c
> +++ b/arch/arm/kernel/setup.c
> @@ -90,6 +90,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);
> @@ -1076,19 +1077,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();
> }
>
> diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c
> index c36f977b2ccb..0665a0dbd040 100644
> --- a/arch/arm/mm/mmu.c
> +++ b/arch/arm/mm/mmu.c
> @@ -1503,7 +1503,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;
>
> @@ -1534,7 +1534,7 @@ static void __init early_paging_init(const struct machine_desc *mdesc)
> */
> 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",
> --
> 2.17.1
>
>
More information about the linux-arm-kernel
mailing list