diff options
Diffstat (limited to 'arch')
-rw-r--r-- | arch/mips/Kconfig | 11 | ||||
-rw-r--r-- | arch/mips/lib/bootm.c | 38 |
2 files changed, 47 insertions, 2 deletions
diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig index 9b3ecea..363f5ac 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 7a98f15..426f68a 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) |