Commit a004393f authored by Ard Biesheuvel's avatar Ard Biesheuvel Committed by Will Deacon

arm64: idreg-override: use early FDT mapping in ID map

Instead of calling into the kernel to map the FDT into the kernel page
tables before even calling start_kernel(), let's switch to the initial,
temporary mapping of the device tree that has been added to the ID map.
Signed-off-by: default avatarArd Biesheuvel <ardb@kernel.org>
Link: https://lore.kernel.org/r/20220624150651.1358849-16-ardb@kernel.orgSigned-off-by: default avatarWill Deacon <will@kernel.org>
parent f70b3a23
...@@ -472,6 +472,7 @@ SYM_FUNC_START_LOCAL(__primary_switched) ...@@ -472,6 +472,7 @@ SYM_FUNC_START_LOCAL(__primary_switched)
#endif #endif
mov x0, x21 // pass FDT address in x0 mov x0, x21 // pass FDT address in x0
bl early_fdt_map // Try mapping the FDT early bl early_fdt_map // Try mapping the FDT early
mov x0, x22 // pass FDT address in x0
bl init_feature_override // Parse cpu feature overrides bl init_feature_override // Parse cpu feature overrides
#ifdef CONFIG_RANDOMIZE_BASE #ifdef CONFIG_RANDOMIZE_BASE
tst x23, ~(MIN_KIMG_ALIGN - 1) // already running randomized? tst x23, ~(MIN_KIMG_ALIGN - 1) // already running randomized?
......
...@@ -201,16 +201,11 @@ static __init void __parse_cmdline(const char *cmdline, bool parse_aliases) ...@@ -201,16 +201,11 @@ static __init void __parse_cmdline(const char *cmdline, bool parse_aliases)
} while (1); } while (1);
} }
static __init const u8 *get_bootargs_cmdline(void) static __init const u8 *get_bootargs_cmdline(const void *fdt)
{ {
const u8 *prop; const u8 *prop;
void *fdt;
int node; int node;
fdt = get_early_fdt_ptr();
if (!fdt)
return NULL;
node = fdt_path_offset(fdt, "/chosen"); node = fdt_path_offset(fdt, "/chosen");
if (node < 0) if (node < 0)
return NULL; return NULL;
...@@ -222,9 +217,9 @@ static __init const u8 *get_bootargs_cmdline(void) ...@@ -222,9 +217,9 @@ static __init const u8 *get_bootargs_cmdline(void)
return strlen(prop) ? prop : NULL; return strlen(prop) ? prop : NULL;
} }
static __init void parse_cmdline(void) static __init void parse_cmdline(const void *fdt)
{ {
const u8 *prop = get_bootargs_cmdline(); const u8 *prop = get_bootargs_cmdline(fdt);
if (IS_ENABLED(CONFIG_CMDLINE_FORCE) || !prop) if (IS_ENABLED(CONFIG_CMDLINE_FORCE) || !prop)
__parse_cmdline(CONFIG_CMDLINE, true); __parse_cmdline(CONFIG_CMDLINE, true);
...@@ -234,9 +229,9 @@ static __init void parse_cmdline(void) ...@@ -234,9 +229,9 @@ static __init void parse_cmdline(void)
} }
/* Keep checkers quiet */ /* Keep checkers quiet */
void init_feature_override(void); void init_feature_override(const void *fdt);
asmlinkage void __init init_feature_override(void) asmlinkage void __init init_feature_override(const void *fdt)
{ {
int i; int i;
...@@ -247,7 +242,7 @@ asmlinkage void __init init_feature_override(void) ...@@ -247,7 +242,7 @@ asmlinkage void __init init_feature_override(void)
} }
} }
parse_cmdline(); parse_cmdline(fdt);
for (i = 0; i < ARRAY_SIZE(regs); i++) { for (i = 0; i < ARRAY_SIZE(regs); i++) {
if (regs[i]->override) if (regs[i]->override)
......
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