of/fdt: run soc memory setup when early_init_dt_scan_memory fails
commit2a12187d58
upstream. If memory has been found early_init_dt_scan_memory now returns 1. If it hasn't found any memory it will return 0, allowing other memory setup mechanisms to carry on. Previously early_init_dt_scan_memory always returned 0 without distinguishing between any kind of memory setup being done or not. Any code path after the early_init_dt_scan memory call in the ramips plat_mem_setup code wouldn't be executed anymore. Making early_init_dt_scan_memory the only way to initialize the memory. Some boards, including my mt7621 based Cudy X6 board, depend on memory initialization being done via the soc_info.mem_detect function pointer. Those wouldn't be able to obtain memory and panic the kernel during early bootup with the message "early_init_dt_alloc_memory_arch: Failed to allocate 12416 bytes align=0x40". Fixes:1f012283e9
("of/fdt: Rework early_init_dt_scan_memory() to call directly") Cc: stable@vger.kernel.org Signed-off-by: Andreas Rammhold <andreas@rammhold.de> Link: https://lore.kernel.org/r/20221223112748.2935235-1-andreas@rammhold.de Signed-off-by: Rob Herring <robh@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
1ce70a9ef9
commit
04836fc5b7
|
@ -64,7 +64,7 @@ void __init plat_mem_setup(void)
|
||||||
dtb = get_fdt();
|
dtb = get_fdt();
|
||||||
__dt_setup_arch(dtb);
|
__dt_setup_arch(dtb);
|
||||||
|
|
||||||
if (!early_init_dt_scan_memory())
|
if (early_init_dt_scan_memory())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (soc_info.mem_detect)
|
if (soc_info.mem_detect)
|
||||||
|
|
|
@ -1106,7 +1106,7 @@ u64 __init dt_mem_next_cell(int s, const __be32 **cellp)
|
||||||
*/
|
*/
|
||||||
int __init early_init_dt_scan_memory(void)
|
int __init early_init_dt_scan_memory(void)
|
||||||
{
|
{
|
||||||
int node;
|
int node, found_memory = 0;
|
||||||
const void *fdt = initial_boot_params;
|
const void *fdt = initial_boot_params;
|
||||||
|
|
||||||
fdt_for_each_subnode(node, fdt, 0) {
|
fdt_for_each_subnode(node, fdt, 0) {
|
||||||
|
@ -1146,6 +1146,8 @@ int __init early_init_dt_scan_memory(void)
|
||||||
|
|
||||||
early_init_dt_add_memory_arch(base, size);
|
early_init_dt_add_memory_arch(base, size);
|
||||||
|
|
||||||
|
found_memory = 1;
|
||||||
|
|
||||||
if (!hotpluggable)
|
if (!hotpluggable)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
@ -1154,7 +1156,7 @@ int __init early_init_dt_scan_memory(void)
|
||||||
base, base + size);
|
base, base + size);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return found_memory;
|
||||||
}
|
}
|
||||||
|
|
||||||
int __init early_init_dt_scan_chosen(char *cmdline)
|
int __init early_init_dt_scan_chosen(char *cmdline)
|
||||||
|
|
Loading…
Reference in New Issue