Commit 5f346a6e authored by Binbin Zhou's avatar Binbin Zhou Committed by Huacai Chen
Browse files

LoongArch: Allow device trees be built into the kernel



During the upstream progress of those DT-based drivers, DT properties
are changed a lot so very different from those in existing bootloaders.
It is inevitably that some existing systems do not provide a standard,
canonical device tree to the kernel at boot time. So let's provide a
device tree table in the kernel, keyed by the dts filename, containing
the relevant DTBs.

We can use the built-in dts files as references. Each SoC has only one
built-in dts file which describes all possible device information of
that SoC, so the dts files are good examples during development.

And as a reference, our built-in dts file only enables the most basic
bootable combinations (so it is generic enough), acts as an alternative
in case the dts in the bootloader is unexpected.

Signed-off-by: default avatarBinbin Zhou <zhoubinbin@loongson.cn>
Signed-off-by: default avatarHuacai Chen <chenhuacai@loongson.cn>
parent db8ce240
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -4,6 +4,7 @@ obj-y += net/
obj-y += vdso/

obj-$(CONFIG_KVM) += kvm/
obj-$(CONFIG_BUILTIN_DTB) += boot/dts/

# for cleaning
subdir- += boot
+18 −0
Original line number Diff line number Diff line
@@ -375,6 +375,24 @@ config CMDLINE_FORCE

endchoice

config BUILTIN_DTB
	bool "Enable built-in dtb in kernel"
	depends on OF
	help
	  Some existing systems do not provide a canonical device tree to
	  the kernel at boot time. Let's provide a device tree table in the
	  kernel, keyed by the dts filename, containing the relevant DTBs.

	  Built-in DTBs are generic enough and can be used as references.

config BUILTIN_DTB_NAME
	string "Source file for built-in dtb"
	depends on BUILTIN_DTB
	help
	  Base name (without suffix, relative to arch/loongarch/boot/dts/)
	  for the DTS file that will be used to produce the DTB linked into
	  the kernel.

config DMI
	bool "Enable DMI scanning"
	select DMI_SCAN_MACHINE_NON_EFI_FALLBACK
+2 −1
Original line number Diff line number Diff line
@@ -6,6 +6,7 @@
boot	:= arch/loongarch/boot

KBUILD_DEFCONFIG := loongson3_defconfig
KBUILD_DTBS      := dtbs

image-name-y			:= vmlinux
image-name-$(CONFIG_EFI_ZBOOT)	:= vmlinuz
@@ -144,7 +145,7 @@ endif

vdso-install-y += arch/loongarch/vdso/vdso.so.dbg

all:	$(notdir $(KBUILD_IMAGE))
all:	$(notdir $(KBUILD_IMAGE)) $(KBUILD_DTBS)

vmlinuz.efi: vmlinux.efi

+1 −2
Original line number Diff line number Diff line
# SPDX-License-Identifier: GPL-2.0-only
dtstree	:= $(srctree)/$(src)

dtb-y := $(patsubst $(dtstree)/%.dts,%.dtb, $(wildcard $(dtstree)/*.dts))
obj-$(CONFIG_BUILTIN_DTB)	+= $(addsuffix .dtb.o, $(CONFIG_BUILTIN_DTB_NAME))
+9 −3
Original line number Diff line number Diff line
@@ -295,8 +295,12 @@ static void __init fdt_setup(void)
	if (acpi_os_get_root_pointer())
		return;

	/* Look for a device tree configuration table entry */
	fdt_pointer = efi_fdt_pointer();
	/* Prefer to use built-in dtb, checking its legality first. */
	if (!fdt_check_header(__dtb_start))
		fdt_pointer = __dtb_start;
	else
		fdt_pointer = efi_fdt_pointer(); /* Fallback to firmware dtb */

	if (!fdt_pointer || fdt_check_header(fdt_pointer))
		return;

@@ -330,7 +334,9 @@ static void __init bootcmdline_init(char **cmdline_p)
		if (boot_command_line[0])
			strlcat(boot_command_line, " ", COMMAND_LINE_SIZE);

		if (!strstr(boot_command_line, init_command_line))
			strlcat(boot_command_line, init_command_line, COMMAND_LINE_SIZE);

		goto out;
	}
#endif