Эх сурвалжийг харах

ARC: explicit'ify uboot support

Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
Vineet Gupta 10 жил өмнө
parent
commit
036b2c5664

+ 12 - 0
arch/arc/Kconfig

@@ -388,6 +388,18 @@ config ARC_DBG_TLB_MISS_COUNT
 	  Counts number of I and D TLB Misses and exports them via Debugfs
 	  Counts number of I and D TLB Misses and exports them via Debugfs
 	  The counters can be cleared via Debugfs as well
 	  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
 config ARC_BUILTIN_DTB_NAME
 	string "Built in DTB"
 	string "Built in DTB"
 	help
 	help

+ 2 - 0
arch/arc/kernel/head.S

@@ -83,6 +83,7 @@ stext:
 	st.ab   0, [r5, 4]
 	st.ab   0, [r5, 4]
 1:
 1:
 
 
+#ifdef CONFIG_ARC_UBOOT_SUPPORT
 	; Uboot - kernel ABI
 	; Uboot - kernel ABI
 	;    r0 = [0] No uboot interaction, [1] cmdline in r2, [2] DTB in r2
 	;    r0 = [0] No uboot interaction, [1] cmdline in r2, [2] DTB in r2
 	;    r1 = magic number (board identity, unused as of now
 	;    r1 = magic number (board identity, unused as of now
@@ -90,6 +91,7 @@ stext:
 	; These are handled later in setup_arch()
 	; These are handled later in setup_arch()
 	st	r0, [@uboot_tag]
 	st	r0, [@uboot_tag]
 	st	r2, [@uboot_arg]
 	st	r2, [@uboot_arg]
+#endif
 
 
 	; setup "current" tsk and optionally cache it in dedicated r25
 	; setup "current" tsk and optionally cache it in dedicated r25
 	mov	r9, @init_task
 	mov	r9, @init_task

+ 4 - 1
arch/arc/kernel/setup.c

@@ -319,13 +319,16 @@ static inline int is_kernel(unsigned long addr)
 
 
 void __init setup_arch(char **cmdline_p)
 void __init setup_arch(char **cmdline_p)
 {
 {
+#ifdef CONFIG_ARC_UBOOT_SUPPORT
 	/* make sure that uboot passed pointer to cmdline/dtb is valid */
 	/* make sure that uboot passed pointer to cmdline/dtb is valid */
 	if (uboot_tag && is_kernel((unsigned long)uboot_arg))
 	if (uboot_tag && is_kernel((unsigned long)uboot_arg))
 		panic("Invalid uboot arg\n");
 		panic("Invalid uboot arg\n");
 
 
 	/* See if u-boot passed an external Device Tree blob */
 	/* See if u-boot passed an external Device Tree blob */
 	machine_desc = setup_machine_fdt(uboot_arg);	/* uboot_tag == 2 */
 	machine_desc = setup_machine_fdt(uboot_arg);	/* uboot_tag == 2 */
-	if (!machine_desc) {
+	if (!machine_desc)
+#endif
+	{
 		/* No, so try the embedded one */
 		/* No, so try the embedded one */
 		machine_desc = setup_machine_fdt(__dtb_start);
 		machine_desc = setup_machine_fdt(__dtb_start);
 		if (!machine_desc)
 		if (!machine_desc)