diff options
Diffstat (limited to 'arch/arc/kernel/setup.c')
| -rw-r--r-- | arch/arc/kernel/setup.c | 65 | 
1 files changed, 43 insertions, 22 deletions
diff --git a/arch/arc/kernel/setup.c b/arch/arc/kernel/setup.c index 2c68bc7e6a7..119dddb752b 100644 --- a/arch/arc/kernel/setup.c +++ b/arch/arc/kernel/setup.c @@ -21,7 +21,6 @@  #include <asm/setup.h>  #include <asm/page.h>  #include <asm/irq.h> -#include <asm/prom.h>  #include <asm/unwind.h>  #include <asm/clk.h>  #include <asm/mach_desc.h> @@ -30,15 +29,17 @@  int running_on_hw = 1;	/* vs. on ISS */ -char __initdata command_line[COMMAND_LINE_SIZE]; -struct machine_desc *machine_desc; +/* Part of U-boot ABI: see head.S */ +int __initdata uboot_tag; +char __initdata *uboot_arg; + +const struct machine_desc *machine_desc;  struct task_struct *_current_task[NR_CPUS];	/* For stack switching */  struct cpuinfo_arc cpuinfo_arc700[NR_CPUS]; - -void read_arc_build_cfg_regs(void) +static void read_arc_build_cfg_regs(void)  {  	struct bcr_perip uncached_space;  	struct cpuinfo_arc *cpu = &cpuinfo_arc700[smp_processor_id()]; @@ -106,7 +107,7 @@ static const struct cpuinfo_data arc_cpu_tbl[] = {  	{ {0x00, NULL		} }  }; -char *arc_cpu_mumbojumbo(int cpu_id, char *buf, int len) +static char *arc_cpu_mumbojumbo(int cpu_id, char *buf, int len)  {  	int n = 0;  	struct cpuinfo_arc *cpu = &cpuinfo_arc700[cpu_id]; @@ -171,7 +172,7 @@ static const struct id_to_str mac_mul_nm[] = {  	{0x6, "Dual 16x16 and 32x16"}  }; -char *arc_extn_mumbojumbo(int cpu_id, char *buf, int len) +static char *arc_extn_mumbojumbo(int cpu_id, char *buf, int len)  {  	int n = 0;  	struct cpuinfo_arc *cpu = &cpuinfo_arc700[cpu_id]; @@ -234,7 +235,7 @@ char *arc_extn_mumbojumbo(int cpu_id, char *buf, int len)  	return buf;  } -void arc_chk_ccms(void) +static void arc_chk_ccms(void)  {  #if defined(CONFIG_ARC_HAS_DCCM) || defined(CONFIG_ARC_HAS_ICCM)  	struct cpuinfo_arc *cpu = &cpuinfo_arc700[smp_processor_id()]; @@ -269,7 +270,7 @@ void arc_chk_ccms(void)   * hardware has dedicated regs which need to be saved/restored on ctx-sw   * (Single Precision uses core regs), thus kernel is kind of oblivious to it   */ -void arc_chk_fpu(void) +static void arc_chk_fpu(void)  {  	struct cpuinfo_arc *cpu = &cpuinfo_arc700[smp_processor_id()]; @@ -313,19 +314,40 @@ void setup_processor(void)  	arc_chk_fpu();  } +static inline int is_kernel(unsigned long addr) +{ +	if (addr >= (unsigned long)_stext && addr <= (unsigned long)_end) +		return 1; +	return 0; +} +  void __init setup_arch(char **cmdline_p)  { -	/* This also populates @boot_command_line from /bootargs */ -	machine_desc = setup_machine_fdt(__dtb_start); -	if (!machine_desc) -		panic("Embedded DT invalid\n"); - -	/* Append any u-boot provided cmdline */ -#ifdef CONFIG_CMDLINE_UBOOT -	/* Add a whitespace seperator between the 2 cmdlines */ -	strlcat(boot_command_line, " ", COMMAND_LINE_SIZE); -	strlcat(boot_command_line, command_line, COMMAND_LINE_SIZE); -#endif +	/* 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"); + +		/* +		 * 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) { +			/* 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; @@ -346,8 +368,7 @@ void __init setup_arch(char **cmdline_p)  	setup_arch_memory();  	/* copy flat DT out of .init and then unflatten it */ -	copy_devtree(); -	unflatten_device_tree(); +	unflatten_and_copy_device_tree();  	/* Can be issue if someone passes cmd line arg "ro"  	 * But that is unlikely so keeping it as it is  | 
