]> Pileus Git - ~andy/linux/blobdiff - arch/arc/kernel/setup.c
ARC: [cmdline] support External Device Trees from u-boot
[~andy/linux] / arch / arc / kernel / setup.c
index ffb60b4f6f860bb72517bb0ef09ffb10954e28af..119dddb752b2892ff81a7ab7ce43011eef056b35 100644 (file)
@@ -323,22 +323,31 @@ static inline int is_kernel(unsigned long addr)
 
 void __init setup_arch(char **cmdline_p)
 {
+       /* make sure that uboot passed pointer to cmdline/dtb is valid */
+       if (uboot_tag && is_kernel((unsigned long)uboot_arg))
+               panic("Invalid uboot arg\n");
+
+       /* See if u-boot passed an external Device Tree blob */
+       machine_desc = setup_machine_fdt(uboot_arg);    /* uboot_tag == 2 */
+       if (!machine_desc) {
+               /* No, so try the embedded one */
                machine_desc = setup_machine_fdt(__dtb_start);
                if (!machine_desc)
                        panic("Embedded DT invalid\n");
 
                /*
-                * Append uboot cmdline to embedded DT cmdline.
+                * If we are here, it is established that @uboot_arg didn't
+                * point to DT blob. Instead if u-boot says it is cmdline,
+                * Appent to embedded DT cmdline.
                 * setup_machine_fdt() would have populated @boot_command_line
                 */
                if (uboot_tag == 1) {
-                       BUG_ON(is_kernel(unsigned long)uboot_arg);
-
                        /* Ensure a whitespace between the 2 cmdlines */
                        strlcat(boot_command_line, " ", COMMAND_LINE_SIZE);
                        strlcat(boot_command_line, uboot_arg,
                                COMMAND_LINE_SIZE);
                }
+       }
 
        /* Save unparsed command line copy for /proc/cmdline */
        *cmdline_p = boot_command_line;