diff mbox

[U-Boot,1/5] ARM: uniphier: set DTB file name to fdt_file environment

Message ID 1450342841-308-2-git-send-email-yamada.masahiro@socionext.com
State Accepted
Delegated to: Masahiro Yamada
Headers show

Commit Message

Masahiro Yamada Dec. 17, 2015, 9 a.m. UTC
When we want to boot Linux with a DTB file downloaded from a TFTP
server or somewhere, we need to know the file name to be downloaded.

Assume the U-Boot configuration is shared among some similar boards.
If they are similar enough, the difference only appears in device
trees.  The build procedure would be like this:

 - Board A:  make foo_common_defconfig && make DEVICE_TREE=foo_board_a
 - Board B:  make foo_common_defconfig && make DEVICE_TREE=foo_board_b
 - Board C:  make foo_common_defconfig && make DEVICE_TREE=foo_board_c

In this case, the U-Boot image contains nothing about the DTB file name
it is running with.  (CONFIG_DEFAULT_DEVICE_TREE is not helpful for this
purpose because it is painful to change it from "make menuconfig" for
each board.)

This commit allows to lookup the DTB file name based on the compatible
string and set it to "fdt_file" environment.  Then "tftpboot $fdt_file"
will download the file we want.

Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
---

 arch/arm/mach-uniphier/board_late_init.c | 35 ++++++++++++++++++++++++++++++++
 1 file changed, 35 insertions(+)
diff mbox

Patch

diff --git a/arch/arm/mach-uniphier/board_late_init.c b/arch/arm/mach-uniphier/board_late_init.c
index a7530eb..c2a3261 100644
--- a/arch/arm/mach-uniphier/board_late_init.c
+++ b/arch/arm/mach-uniphier/board_late_init.c
@@ -6,6 +6,7 @@ 
 
 #include <common.h>
 #include <spl.h>
+#include <libfdt.h>
 #include <nand.h>
 #include <linux/io.h>
 #include <../drivers/mtd/nand/denali.h>
@@ -25,6 +26,38 @@  static void nand_denali_wp_disable(void)
 #endif
 }
 
+struct uniphier_fdt_file {
+	const char *compatible;
+	const char *file_name;
+};
+
+static const struct uniphier_fdt_file uniphier_fdt_files[] = {
+	{ "socionext,ph1-ld4-ref", "uniphier-ph1-ld4-ref.dtb", },
+	{ "socionext,ph1-ld6b-ref", "uniphier-ph1-ld6b-ref.dtb", },
+	{ "socionext,ph1-ld10-ref", "uniphier-ph1-ld10-ref.dtb", },
+	{ "socionext,ph1-pro4-ref", "uniphier-ph1-pro4-ref.dtb", },
+	{ "socionext,ph1-pro5-4kbox", "uniphier-ph1-pro5-4kbox.dtb", },
+	{ "socionext,ph1-sld3-ref", "uniphier-ph1-sld3-ref.dtb", },
+	{ "socionext,ph1-sld8-ref", "uniphier-ph1-sld8-ref.dtb", },
+	{ "socionext,proxstream2-gentil", "uniphier-proxstream2-gentil.dtb", },
+	{ "socionext,proxstream2-vodka", "uniphier-proxstream2-vodka.dtb", },
+};
+
+static void uniphier_set_fdt_file(void)
+{
+	DECLARE_GLOBAL_DATA_PTR;
+	int i;
+
+	/* lookup DTB file name based on the compatible string */
+	for (i = 0; i < ARRAY_SIZE(uniphier_fdt_files); i++) {
+		if (!fdt_node_check_compatible(gd->fdt_blob, 0,
+					uniphier_fdt_files[i].compatible)) {
+			setenv("fdt_file", uniphier_fdt_files[i].file_name);
+			return;
+		}
+	}
+}
+
 int board_late_init(void)
 {
 	puts("MODE:  ");
@@ -48,5 +81,7 @@  int board_late_init(void)
 		return -1;
 	}
 
+	uniphier_set_fdt_file();
+
 	return 0;
 }