aboutsummaryrefslogtreecommitdiffstats
path: root/meta/recipes-bsp/u-boot/u-boot/0004-MIPS-bootm-rework-and-fix-broken-bootm-code.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta/recipes-bsp/u-boot/u-boot/0004-MIPS-bootm-rework-and-fix-broken-bootm-code.patch')
-rw-r--r--meta/recipes-bsp/u-boot/u-boot/0004-MIPS-bootm-rework-and-fix-broken-bootm-code.patch254
1 files changed, 254 insertions, 0 deletions
diff --git a/meta/recipes-bsp/u-boot/u-boot/0004-MIPS-bootm-rework-and-fix-broken-bootm-code.patch b/meta/recipes-bsp/u-boot/u-boot/0004-MIPS-bootm-rework-and-fix-broken-bootm-code.patch
new file mode 100644
index 0000000000..5692c6056c
--- /dev/null
+++ b/meta/recipes-bsp/u-boot/u-boot/0004-MIPS-bootm-rework-and-fix-broken-bootm-code.patch
@@ -0,0 +1,254 @@
+From da9d99765476b10fe0a75140a2d4c1f284ffc333 Mon Sep 17 00:00:00 2001
+From: Daniel Schwierzeck <daniel.schwierzeck@gmail.com>
+Date: Sun, 1 Nov 2015 17:36:14 +0100
+Subject: [PATCH 4/6] MIPS: bootm: rework and fix broken bootm code
+Organization: O.S. Systems Software LTDA.
+
+The move to 'generic board' as well as changes in the generic
+bootm code broke the boot of FIT uImage's. Especially uImage's
+with additional initramfs images or FDT's do not work anymore.
+
+Refactor the bootm code to work again with the generic bootm code.
+
+Always relocate ramdisk and FDT in step 'bootm prep' because the
+generic bootm code does this only for legacy uImage's.
+
+Move the step 'bootm cmdline' to 'bootm prep' because the Linux
+kernel parameters rd_start and rd_size have to be initialized after
+the relocation of the ramdisk.
+
+Furthermore support the step 'bootm fake'.
+
+Upstream-Status: Backport [2016.01]
+
+Signed-off-by: Daniel Schwierzeck <daniel.schwierzeck@gmail.com>
+Reviewed-by: Tom Rini <trini@konsulko.com>
+Reviewed-by: Simon Glass <sjg@chromium.org>
+---
+ arch/mips/lib/bootm.c | 163 ++++++++++++++++++++++++--------------------------
+ 1 file changed, 78 insertions(+), 85 deletions(-)
+
+diff --git a/arch/mips/lib/bootm.c b/arch/mips/lib/bootm.c
+index 9c647aa..a7eddd3 100644
+--- a/arch/mips/lib/bootm.c
++++ b/arch/mips/lib/bootm.c
+@@ -21,18 +21,6 @@ DECLARE_GLOBAL_DATA_PTR;
+ #define mips_boot_malta 0
+ #endif
+
+-#if defined(CONFIG_MIPS_BOOT_CMDLINE_LEGACY)
+-#define mips_boot_cmdline_legacy 1
+-#else
+-#define mips_boot_cmdline_legacy 0
+-#endif
+-
+-#if defined(CONFIG_MIPS_BOOT_ENV_LEGACY)
+-#define mips_boot_env_legacy 1
+-#else
+-#define mips_boot_env_legacy 0
+-#endif
+-
+ static int linux_argc;
+ static char **linux_argv;
+ static char *linux_argp;
+@@ -62,50 +50,6 @@ void arch_lmb_reserve(struct lmb *lmb)
+ lmb_reserve(lmb, sp, CONFIG_SYS_SDRAM_BASE + gd->ram_size - sp);
+ }
+
+-static int boot_setup_linux(bootm_headers_t *images)
+-{
+- int ret;
+- ulong rd_len;
+-
+- rd_len = images->rd_end - images->rd_start;
+- ret = boot_ramdisk_high(&images->lmb, images->rd_start,
+- rd_len, &images->initrd_start, &images->initrd_end);
+- 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);
+- 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);
+-
+-#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;
+@@ -197,18 +141,6 @@ static void linux_cmdline_append(bootm_headers_t *images)
+ }
+ }
+
+-static void boot_cmdline_linux(bootm_headers_t *images)
+-{
+- if (mips_boot_cmdline_legacy && !images->ft_len) {
+- linux_cmdline_legacy(images);
+-
+- if (!mips_boot_env_legacy)
+- linux_cmdline_append(images);
+-
+- linux_cmdline_dump();
+- }
+-}
+-
+ static void linux_env_init(void)
+ {
+ linux_env = (char **)(((ulong) linux_argp + 15) & ~15);
+@@ -288,13 +220,81 @@ static void linux_env_legacy(bootm_headers_t *images)
+ }
+ }
+
++static int boot_reloc_ramdisk(bootm_headers_t *images)
++{
++ ulong rd_len = images->rd_end - images->rd_start;
++
++ /*
++ * In case of legacy uImage's, relocation of ramdisk is already done
++ * by do_bootm_states() and should not repeated in 'bootm prep'.
++ */
++ if (images->state & BOOTM_STATE_RAMDISK) {
++ debug("## Ramdisk already relocated\n");
++ return 0;
++ }
++
++ return boot_ramdisk_high(&images->lmb, images->rd_start,
++ rd_len, &images->initrd_start, &images->initrd_end);
++}
++
++static int boot_reloc_fdt(bootm_headers_t *images)
++{
++ /*
++ * In case of legacy uImage's, relocation of FDT is already done
++ * by do_bootm_states() and should not repeated in 'bootm prep'.
++ */
++ if (images->state & BOOTM_STATE_FDT) {
++ debug("## FDT already relocated\n");
++ return 0;
++ }
++
++#if CONFIG_IS_ENABLED(MIPS_BOOT_FDT) && CONFIG_IS_ENABLED(OF_LIBFDT)
++ boot_fdt_add_mem_rsv_regions(&images->lmb, images->ft_addr);
++ return boot_relocate_fdt(&images->lmb, &images->ft_addr,
++ &images->ft_len);
++#else
++ return 0;
++#endif
++}
++
++int arch_fixup_memory_node(void *blob)
++{
++#if CONFIG_IS_ENABLED(MIPS_BOOT_FDT) && CONFIG_IS_ENABLED(OF_LIBFDT)
++ u64 mem_start = 0;
++ u64 mem_size = gd->ram_size;
++
++ return fdt_fixup_memory_banks(blob, &mem_start, &mem_size, 1);
++#else
++ return 0;
++#endif
++}
++
++static int boot_setup_fdt(bootm_headers_t *images)
++{
++ return image_setup_libfdt(images, images->ft_addr, images->ft_len,
++ &images->lmb);
++}
++
+ static void boot_prep_linux(bootm_headers_t *images)
+ {
+- if (mips_boot_env_legacy && !images->ft_len)
+- linux_env_legacy(images);
++ boot_reloc_ramdisk(images);
+
+- if (images->ft_len)
++ if (CONFIG_IS_ENABLED(MIPS_BOOT_FDT) && images->ft_len) {
++ boot_reloc_fdt(images);
+ boot_setup_fdt(images);
++ } else {
++ if (CONFIG_IS_ENABLED(CONFIG_MIPS_BOOT_ENV_LEGACY))
++ linux_env_legacy(images);
++
++ if (CONFIG_IS_ENABLED(MIPS_BOOT_CMDLINE_LEGACY)) {
++ linux_cmdline_legacy(images);
++
++ if (!CONFIG_IS_ENABLED(CONFIG_MIPS_BOOT_ENV_LEGACY))
++ linux_cmdline_append(images);
++
++ linux_cmdline_dump();
++ }
++ }
+ }
+
+ static void boot_jump_linux(bootm_headers_t *images)
+@@ -327,35 +327,28 @@ static void boot_jump_linux(bootm_headers_t *images)
+ int do_bootm_linux(int flag, int argc, char * const argv[],
+ bootm_headers_t *images)
+ {
+- int ret;
+-
+ /* No need for those on MIPS */
+ if (flag & BOOTM_STATE_OS_BD_T)
+ return -1;
+
+- if (flag & BOOTM_STATE_OS_CMDLINE) {
+- boot_cmdline_linux(images);
++ /*
++ * Cmdline init has been moved to 'bootm prep' because it has to be
++ * done after relocation of ramdisk to always pass correct values
++ * for rd_start and rd_size to Linux kernel.
++ */
++ if (flag & BOOTM_STATE_OS_CMDLINE)
+ return 0;
+- }
+
+ if (flag & BOOTM_STATE_OS_PREP) {
+ boot_prep_linux(images);
+ return 0;
+ }
+
+- if (flag & BOOTM_STATE_OS_GO) {
++ if (flag & (BOOTM_STATE_OS_GO | BOOTM_STATE_OS_FAKE_GO)) {
+ boot_jump_linux(images);
+ return 0;
+ }
+
+- ret = boot_setup_linux(images);
+- if (ret)
+- return ret;
+-
+- boot_cmdline_linux(images);
+- boot_prep_linux(images);
+- boot_jump_linux(images);
+-
+ /* does not return */
+ return 1;
+ }
+--
+2.6.2
+