The kernels built for the Vcore III linux kernel have different
expectation in the way the data were passed.

Unlike with yamon, the command line is expected to be a single string
passed in argv[1]. An other expectation is that the arguments are located
in the cached address space.

However, like yamon, they expect that rd_start and rd_size was passed by
the bootloader in the command line of the kernel, and besides that it
also wait for the root=/dev/ram0.

Signed-off-by: Gregory CLEMENT <gregory.clem...@bootlin.com>
---
 arch/mips/lib/bootm.c | 62 +++++++++++++++++++++++++++++--------------
 1 file changed, 42 insertions(+), 20 deletions(-)

diff --git a/arch/mips/lib/bootm.c b/arch/mips/lib/bootm.c
index deca5189e3..417f5ce452 100644
--- a/arch/mips/lib/bootm.c
+++ b/arch/mips/lib/bootm.c
@@ -44,22 +44,38 @@ void arch_lmb_reserve(struct lmb *lmb)
        lmb_reserve(lmb, sp, gd->ram_top - sp);
 }
 
-static void linux_cmdline_init(void)
+static void linux_cmdline_init(int vcoreiii)
 {
+       if (!vcoreiii) {
+               linux_argv = (char **)UNCACHED_SDRAM(gd->bd->bi_boot_params);
+               linux_argp = (char *)(linux_argv + LINUX_MAX_ARGS);
+       } else {
+               /*
+                * Vcore III linux kernels expect arguments in the cached
+                * address space. They also expect the command line being a
+                * single string in the first argument
+                */
+               linux_argv = (char **)(gd->bd->bi_boot_params);
+               linux_argp = (char *)(linux_argv + LINUX_MAX_ARGS);
+               linux_argv[1] = linux_argp;
+       }
        linux_argc = 1;
-       linux_argv = (char **)UNCACHED_SDRAM(gd->bd->bi_boot_params);
        linux_argv[0] = 0;
-       linux_argp = (char *)(linux_argv + LINUX_MAX_ARGS);
 }
 
-static void linux_cmdline_set(const char *value, size_t len)
+static void linux_cmdline_set(const char *value, size_t len, int vcoreiii)
 {
-       linux_argv[linux_argc] = linux_argp;
        memcpy(linux_argp, value, len);
-       linux_argp[len] = 0;
-
+       if (!vcoreiii)  {
+               linux_argv[linux_argc] = linux_argp;
+               linux_argp[len] = 0;
+               linux_argc++;
+       } else {
+               linux_argp[len] = ' ';
+               linux_argp[len + 1] = 0;
+               linux_argc = 2;
+       }
        linux_argp += len + 1;
-       linux_argc++;
 }
 
 static void linux_cmdline_dump(void)
@@ -73,12 +89,10 @@ static void linux_cmdline_dump(void)
                debug("   arg %03d: %s\n", i, linux_argv[i]);
 }
 
-static void linux_cmdline_legacy(bootm_headers_t *images)
+static void linux_cmdline_legacy(bootm_headers_t *images, int vcoreiii)
 {
        const char *bootargs, *next, *quote;
-
-       linux_cmdline_init();
-
+       linux_cmdline_init(vcoreiii);
        bootargs = env_get("bootargs");
        if (!bootargs)
                return;
@@ -104,7 +118,7 @@ static void linux_cmdline_legacy(bootm_headers_t *images)
                if (!next)
                        next = bootargs + strlen(bootargs);
 
-               linux_cmdline_set(bootargs, next - bootargs);
+               linux_cmdline_set(bootargs, next - bootargs, vcoreiii);
 
                if (*next)
                        next++;
@@ -113,7 +127,7 @@ static void linux_cmdline_legacy(bootm_headers_t *images)
        }
 }
 
-static void linux_cmdline_append(bootm_headers_t *images)
+static void linux_cmdline_append(bootm_headers_t *images, int vcoreiii)
 {
        char buf[24];
        ulong mem, rd_start, rd_size;
@@ -121,7 +135,7 @@ static void linux_cmdline_append(bootm_headers_t *images)
        /* append mem */
        mem = gd->ram_size >> 20;
        sprintf(buf, "mem=%luM", mem);
-       linux_cmdline_set(buf, strlen(buf));
+       linux_cmdline_set(buf, strlen(buf), vcoreiii);
 
        /* append rd_start and rd_size */
        rd_start = images->initrd_start;
@@ -129,9 +143,13 @@ static void linux_cmdline_append(bootm_headers_t *images)
 
        if (rd_size) {
                sprintf(buf, "rd_start=0x%08lX", rd_start);
-               linux_cmdline_set(buf, strlen(buf));
+               linux_cmdline_set(buf, strlen(buf), vcoreiii);
                sprintf(buf, "rd_size=0x%lX", rd_size);
-               linux_cmdline_set(buf, strlen(buf));
+               linux_cmdline_set(buf, strlen(buf), vcoreiii);
+               if (vcoreiii) {
+                       sprintf(buf, "root=/dev/ram0");
+                       linux_cmdline_set(buf, strlen(buf), vcoreiii);
+               }
        }
 }
 
@@ -276,11 +294,15 @@ static void boot_prep_linux(bootm_headers_t *images)
                boot_reloc_fdt(images);
                boot_setup_fdt(images);
        } else {
-               if (CONFIG_IS_ENABLED(MIPS_BOOT_CMDLINE_LEGACY)) {
-                       linux_cmdline_legacy(images);
+               if (CONFIG_IS_ENABLED(SOC_VCOREIII)) {
+                       linux_cmdline_legacy(images, 1);
+                       linux_cmdline_append(images, 1);
+                       linux_cmdline_dump();
+               } else if (CONFIG_IS_ENABLED(MIPS_BOOT_CMDLINE_LEGACY)) {
+                       linux_cmdline_legacy(images, 0);
 
                        if (!CONFIG_IS_ENABLED(MIPS_BOOT_ENV_LEGACY))
-                               linux_cmdline_append(images);
+                               linux_cmdline_append(images, 0);
 
                        linux_cmdline_dump();
                }
-- 
2.19.0

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot

Reply via email to