ARC: explicit'ify uboot support
authorVineet Gupta <vgupta@synopsys.com>
Mon, 9 Mar 2015 14:10:09 +0000 (19:40 +0530)
committerVineet Gupta <vgupta@synopsys.com>
Fri, 19 Jun 2015 12:39:27 +0000 (18:09 +0530)
Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
arch/arc/Kconfig
arch/arc/kernel/head.S
arch/arc/kernel/setup.c

index 824065a94b37b66fbff9d6a6bc21945bb78c6745..b52f7eba6765a6948efe75dcc3a5464e27ecfb99 100644 (file)
@@ -388,6 +388,18 @@ config ARC_DBG_TLB_MISS_COUNT
          Counts number of I and D TLB Misses and exports them via Debugfs
          The counters can be cleared via Debugfs as well
 
+config ARC_UBOOT_SUPPORT
+       bool "Support uboot arg Handling"
+       default n
+       help
+         ARC Linux by default checks for uboot provided args as pointers to
+         external cmdline or DTB. This however breaks in absence of uboot,
+         when booting from Metaware debugger directly, as the registers are
+         not zeroed out on reset by mdb and/or ARCv2 based cores. The bogus
+         registers look like uboot args to kernel which then chokes.
+         So only enable the uboot arg checking/processing if users are sure
+         of uboot being in play.
+
 config ARC_BUILTIN_DTB_NAME
        string "Built in DTB"
        help
index b0e8666fdccc755ac11763a3bf0b6594f4ed628a..64a92e0b1e53cd1fb2e165954c9ced846ea48040 100644 (file)
@@ -83,6 +83,7 @@ stext:
        st.ab   0, [r5, 4]
 1:
 
+#ifdef CONFIG_ARC_UBOOT_SUPPORT
        ; Uboot - kernel ABI
        ;    r0 = [0] No uboot interaction, [1] cmdline in r2, [2] DTB in r2
        ;    r1 = magic number (board identity, unused as of now
@@ -90,6 +91,7 @@ stext:
        ; These are handled later in setup_arch()
        st      r0, [@uboot_tag]
        st      r2, [@uboot_arg]
+#endif
 
        ; setup "current" tsk and optionally cache it in dedicated r25
        mov     r9, @init_task
index 5086c75681b561e13c2db3c44124c235a000dc4b..c6e8b72ff29303a9a87e7e88202c7c4a03e9df58 100644 (file)
@@ -319,13 +319,16 @@ static inline int is_kernel(unsigned long addr)
 
 void __init setup_arch(char **cmdline_p)
 {
+#ifdef CONFIG_ARC_UBOOT_SUPPORT
        /* 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) {
+       if (!machine_desc)
+#endif
+       {
                /* No, so try the embedded one */
                machine_desc = setup_machine_fdt(__dtb_start);
                if (!machine_desc)