diff options
Diffstat (limited to 'arch/mips/kernel/traps.c')
| -rw-r--r-- | arch/mips/kernel/traps.c | 17 | 
1 files changed, 11 insertions, 6 deletions
diff --git a/arch/mips/kernel/traps.c b/arch/mips/kernel/traps.c index cfdaaa4cffc..2d0c2a277f5 100644 --- a/arch/mips/kernel/traps.c +++ b/arch/mips/kernel/traps.c @@ -15,6 +15,7 @@  #include <linux/compiler.h>  #include <linux/init.h>  #include <linux/kernel.h> +#include <linux/module.h>  #include <linux/mm.h>  #include <linux/sched.h>  #include <linux/smp.h> @@ -91,7 +92,7 @@ void (*board_nmi_handler_setup)(void);  void (*board_ejtag_handler_setup)(void);  void (*board_bind_eic_interrupt)(int irq, int regset);  void (*board_ebase_setup)(void); - +void __cpuinitdata(*board_cache_error_setup)(void);  static void show_raw_backtrace(unsigned long reg29)  { @@ -1490,7 +1491,6 @@ void *set_vi_handler(int n, vi_handler_t addr)  	return set_vi_srs_handler(n, addr, 0);  } -extern void cpu_cache_init(void);  extern void tlb_init(void);  extern void flush_tlb_handlers(void); @@ -1517,7 +1517,7 @@ static int __init ulri_disable(char *s)  }  __setup("noulri", ulri_disable); -void __cpuinit per_cpu_trap_init(void) +void __cpuinit per_cpu_trap_init(bool is_boot_cpu)  {  	unsigned int cpu = smp_processor_id();  	unsigned int status_set = ST0_CU0; @@ -1616,7 +1616,9 @@ void __cpuinit per_cpu_trap_init(void)  #ifdef CONFIG_MIPS_MT_SMTC  	if (bootTC) {  #endif /* CONFIG_MIPS_MT_SMTC */ -		cpu_cache_init(); +		/* Boot CPU's cache setup in setup_arch(). */ +		if (!is_boot_cpu) +			cpu_cache_init();  		tlb_init();  #ifdef CONFIG_MIPS_MT_SMTC  	} else if (!secondaryTC) { @@ -1632,7 +1634,7 @@ void __cpuinit per_cpu_trap_init(void)  }  /* Install CPU exception handler */ -void __init set_handler(unsigned long offset, void *addr, unsigned long size) +void __cpuinit set_handler(unsigned long offset, void *addr, unsigned long size)  {  	memcpy((void *)(ebase + offset), addr, size);  	local_flush_icache_range(ebase + offset, ebase + offset + size); @@ -1693,7 +1695,7 @@ void __init trap_init(void)  	if (board_ebase_setup)  		board_ebase_setup(); -	per_cpu_trap_init(); +	per_cpu_trap_init(true);  	/*  	 * Copy the generic exception handlers to their final destination. @@ -1797,6 +1799,9 @@ void __init trap_init(void)  	set_except_vector(26, handle_dsp); +	if (board_cache_error_setup) +		board_cache_error_setup(); +  	if (cpu_has_vce)  		/* Special exception: R4[04]00 uses also the divec space. */  		memcpy((void *)(ebase + 0x180), &except_vec3_r4000, 0x100);  |