summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Schwierzeck <daniel.schwierzeck@gmail.com>2015-01-14 21:44:13 +0100
committerDaniel Schwierzeck <daniel.schwierzeck@gmail.com>2015-01-21 14:02:49 +0100
commit5002d8cc54f5be2230c4ccf60448e8720444671c (patch)
tree43577b31b63ab80ea404ead84ed78d10035a8e1b
parent8cec725ad502c955c2e8088ae1afb4e06ef80cef (diff)
MIPS: bootm: prepare a flattened device tree for the kernel
Add the initial code to prepare a flattened device tree for the kernel like relocating the FDT blob and fixing up the /chosen and /memory nodes. The final hand over to the kernel is not yet implemented. After the community agreed on the MIPS boot interface for device trees, the corresponding code will be added. Signed-off-by: Daniel Schwierzeck <daniel.schwierzeck@gmail.com>
-rw-r--r--arch/mips/Kconfig11
-rw-r--r--arch/mips/lib/bootm.c38
2 files changed, 47 insertions, 2 deletions
diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig
index 9b3ecea377..363f5ac818 100644
--- a/arch/mips/Kconfig
+++ b/arch/mips/Kconfig
@@ -136,6 +136,17 @@ config MIPS_BOOT_ENV_LEGACY
address and size will be prepared as zero-terminated key/value list.
The address of the enviroment is stored in register $a2.
+config MIPS_BOOT_FDT
+ bool "Hand over a flattened device tree to Linux kernel (INCOMPLETE)"
+ default n
+ help
+ Enable this option if you want U-Boot to hand over a flattened
+ device tree to the kernel.
+
+ Note: the final hand over to the kernel is not yet implemented. After
+ the community agreed on the MIPS boot interface for device trees,
+ the corresponding code will be added.
+
endmenu
config SUPPORTS_BIG_ENDIAN
diff --git a/arch/mips/lib/bootm.c b/arch/mips/lib/bootm.c
index 7a98f15131..426f68a990 100644
--- a/arch/mips/lib/bootm.c
+++ b/arch/mips/lib/bootm.c
@@ -7,6 +7,7 @@
#include <common.h>
#include <image.h>
+#include <fdt_support.h>
#include <asm/addrspace.h>
DECLARE_GLOBAL_DATA_PTR;
@@ -72,9 +73,39 @@ static int boot_setup_linux(bootm_headers_t *images)
if (ret)
return ret;
+#if defined(CONFIG_MIPS_BOOT_FDT) && defined(CONFIG_OF_LIBFDT)
+ if (images->ft_len) {
+ boot_fdt_add_mem_rsv_regions(&images->lmb, images->ft_addr);
+
+ ret = boot_relocate_fdt(&images->lmb, &images->ft_addr,
+ &images->ft_len);
+ if (ret)
+ return ret;
+ }
+#endif
+
return 0;
}
+static void boot_setup_fdt(bootm_headers_t *images)
+{
+#if defined(CONFIG_MIPS_BOOT_FDT) && defined(CONFIG_OF_LIBFDT)
+ u64 mem_start = 0;
+ u64 mem_size = gd->ram_size;
+
+ debug("## setup FDT\n");
+
+ fdt_chosen(images->ft_addr, 1);
+ fdt_fixup_memory_banks(images->ft_addr, &mem_start, &mem_size, 1);
+ fdt_fixup_ethernet(images->ft_addr);
+ fdt_initrd(images->ft_addr, images->initrd_start, images->initrd_end, 1);
+
+#if defined(CONFIG_OF_BOARD_SETUP)
+ ft_board_setup(images->ft_addr, gd->bd);
+#endif
+#endif
+}
+
static void linux_cmdline_init(void)
{
linux_argc = 1;
@@ -168,7 +199,7 @@ static void linux_cmdline_append(bootm_headers_t *images)
static void boot_cmdline_linux(bootm_headers_t *images)
{
- if (mips_boot_cmdline_legacy) {
+ if (mips_boot_cmdline_legacy && !images->ft_len) {
linux_cmdline_legacy(images);
if (!mips_boot_env_legacy)
@@ -259,8 +290,11 @@ static void linux_env_legacy(bootm_headers_t *images)
static void boot_prep_linux(bootm_headers_t *images)
{
- if (mips_boot_env_legacy)
+ if (mips_boot_env_legacy && !images->ft_len)
linux_env_legacy(images);
+
+ if (images->ft_len)
+ boot_setup_fdt(images);
}
static void boot_jump_linux(bootm_headers_t *images)