Commit e9a2f8b5 authored by Ard Biesheuvel's avatar Ard Biesheuvel Committed by Russell King

ARM: 9011/1: centralize phys-to-virt conversion of DT/ATAGS address

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: default avatarLinus Walleij <linus.walleij@linaro.org>
Reviewed-by: default avatarLinus Walleij <linus.walleij@linaro.org>
Acked-by: default avatarNicolas Pitre <nico@fluxnic.net>
Signed-off-by: default avatarArd Biesheuvel <ardb@kernel.org>
Signed-off-by: default avatarRussell King <rmk+kernel@armlinux.org.uk>
parent 3650b228
...@@ -9,12 +9,12 @@ ...@@ -9,12 +9,12 @@
#ifdef CONFIG_OF #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); extern void __init arm_dt_init_cpu_maps(void);
#else /* CONFIG_OF */ #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; return NULL;
} }
......
...@@ -2,11 +2,11 @@ ...@@ -2,11 +2,11 @@
void convert_to_tag_list(struct tag *tags); void convert_to_tag_list(struct tag *tags);
#ifdef CONFIG_ATAGS #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); unsigned int machine_nr);
#else #else
static inline const struct machine_desc * __init __noreturn 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"); early_print("no ATAGS support: can't continue\n");
while (true); while (true);
......
...@@ -174,7 +174,7 @@ static void __init squash_mem_tags(struct tag *tag) ...@@ -174,7 +174,7 @@ static void __init squash_mem_tags(struct tag *tag)
} }
const struct machine_desc * __init 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; struct tag *tags = (struct tag *)&default_tags;
const struct machine_desc *mdesc = NULL, *p; const struct machine_desc *mdesc = NULL, *p;
...@@ -195,8 +195,8 @@ setup_machine_tags(phys_addr_t __atags_pointer, unsigned int machine_nr) ...@@ -195,8 +195,8 @@ setup_machine_tags(phys_addr_t __atags_pointer, unsigned int machine_nr)
if (!mdesc) if (!mdesc)
return NULL; return NULL;
if (__atags_pointer) if (atags_vaddr)
tags = phys_to_virt(__atags_pointer); tags = atags_vaddr;
else if (mdesc->atag_offset) else if (mdesc->atag_offset)
tags = (void *)(PAGE_OFFSET + mdesc->atag_offset); tags = (void *)(PAGE_OFFSET + mdesc->atag_offset);
......
...@@ -203,12 +203,12 @@ static const void * __init arch_get_next_mach(const char *const **match) ...@@ -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 * 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 * If a dtb was passed to the kernel in r2, then use it to choose the
* correct machine_desc and to setup the system. * 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; const struct machine_desc *mdesc, *mdesc_best = NULL;
...@@ -221,7 +221,7 @@ const struct machine_desc * __init setup_machine_fdt(unsigned int dt_phys) ...@@ -221,7 +221,7 @@ const struct machine_desc * __init setup_machine_fdt(unsigned int dt_phys)
mdesc_best = &__mach_desc_GENERIC_DT; mdesc_best = &__mach_desc_GENERIC_DT;
#endif #endif
if (!dt_phys || !early_init_dt_verify(phys_to_virt(dt_phys))) if (!dt_virt || !early_init_dt_verify(dt_virt))
return NULL; return NULL;
mdesc = of_flat_dt_match_machine(mdesc_best, arch_get_next_mach); mdesc = of_flat_dt_match_machine(mdesc_best, arch_get_next_mach);
......
...@@ -89,6 +89,7 @@ unsigned int cacheid __read_mostly; ...@@ -89,6 +89,7 @@ unsigned int cacheid __read_mostly;
EXPORT_SYMBOL(cacheid); EXPORT_SYMBOL(cacheid);
unsigned int __atags_pointer __initdata; unsigned int __atags_pointer __initdata;
void *atags_vaddr __initdata;
unsigned int system_rev; unsigned int system_rev;
EXPORT_SYMBOL(system_rev); EXPORT_SYMBOL(system_rev);
...@@ -1081,19 +1082,22 @@ void __init hyp_mode_check(void) ...@@ -1081,19 +1082,22 @@ void __init hyp_mode_check(void)
void __init setup_arch(char **cmdline_p) 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(); setup_processor();
mdesc = setup_machine_fdt(__atags_pointer); if (atags_vaddr)
mdesc = setup_machine_fdt(atags_vaddr);
if (!mdesc) if (!mdesc)
mdesc = setup_machine_tags(__atags_pointer, __machine_arch_type); mdesc = setup_machine_tags(atags_vaddr, __machine_arch_type);
if (!mdesc) { if (!mdesc) {
early_print("\nError: invalid dtb and unrecognized/unsupported machine ID\n"); early_print("\nError: invalid dtb and unrecognized/unsupported machine ID\n");
early_print(" r1=0x%08x, r2=0x%08x\n", __machine_arch_type, early_print(" r1=0x%08x, r2=0x%08x\n", __machine_arch_type,
__atags_pointer); __atags_pointer);
if (__atags_pointer) if (__atags_pointer)
early_print(" r2[]=%*ph\n", 16, early_print(" r2[]=%*ph\n", 16, atags_vaddr);
phys_to_virt(__atags_pointer));
dump_machine_table(); dump_machine_table();
} }
......
...@@ -1489,7 +1489,7 @@ static void __init map_lowmem(void) ...@@ -1489,7 +1489,7 @@ static void __init map_lowmem(void)
} }
#ifdef CONFIG_ARM_PV_FIXUP #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); typedef void pgtables_remap(long long offset, unsigned long pgd, void *bdata);
pgtables_remap lpae_pgtables_remap_asm; pgtables_remap lpae_pgtables_remap_asm;
...@@ -1520,7 +1520,7 @@ static void __init early_paging_init(const struct machine_desc *mdesc) ...@@ -1520,7 +1520,7 @@ static void __init early_paging_init(const struct machine_desc *mdesc)
*/ */
lpae_pgtables_remap = (pgtables_remap *)(unsigned long)__pa(lpae_pgtables_remap_asm); lpae_pgtables_remap = (pgtables_remap *)(unsigned long)__pa(lpae_pgtables_remap_asm);
pa_pgd = __pa(swapper_pg_dir); pa_pgd = __pa(swapper_pg_dir);
boot_data = __va(__atags_pointer); boot_data = atags_vaddr;
barrier(); barrier();
pr_info("Switching physical address space to 0x%08llx\n", pr_info("Switching physical address space to 0x%08llx\n",
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment