]> git.sur5r.net Git - u-boot/commitdiff
ARM: uniphier: set DTB file name to fdt_file environment
authorMasahiro Yamada <yamada.masahiro@socionext.com>
Thu, 17 Dec 2015 09:00:37 +0000 (18:00 +0900)
committerMasahiro Yamada <yamada.masahiro@socionext.com>
Tue, 22 Dec 2015 15:08:56 +0000 (00:08 +0900)
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

index a7530eb23b5292fe8a59abc1b2b6d67ffb415e31..c2a32618acc7c607fa8ef60e4ff35a0987f4f8bf 100644 (file)
@@ -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;
 }