fdt_check_header(__dtb_start) will always success because kernel provided a dummy dtb here, thus fdt passed from firmware will never be taken. Fix by trying to utilise __dtb_start only when CONFIG_BUILTIN_DTB is enabled. Fixes: 5f346a6e5970 ("LoongArch: Allow device trees be built into the kernel") Cc: stable@xxxxxxxxxxxxxxx Signed-off-by: Jiaxun Yang <jiaxun.yang@xxxxxxxxxxx> --- arch/loongarch/kernel/setup.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/arch/loongarch/kernel/setup.c b/arch/loongarch/kernel/setup.c index 60e0fe97f61a..ea6d5db6c878 100644 --- a/arch/loongarch/kernel/setup.c +++ b/arch/loongarch/kernel/setup.c @@ -275,16 +275,18 @@ static void __init arch_reserve_crashkernel(void) static void __init fdt_setup(void) { #ifdef CONFIG_OF_EARLY_FLATTREE - void *fdt_pointer; + void *fdt_pointer = NULL; /* ACPI-based systems do not require parsing fdt */ if (acpi_os_get_root_pointer()) return; +#ifdef CONFIG_BUILTIN_DTB /* Prefer to use built-in dtb, checking its legality first. */ if (!fdt_check_header(__dtb_start)) fdt_pointer = __dtb_start; - else +#endif + if (!fdt_pointer) fdt_pointer = efi_fdt_pointer(); /* Fallback to firmware dtb */ if (!fdt_pointer || fdt_check_header(fdt_pointer)) -- 2.43.0