diff options
Diffstat (limited to 'arch/mips/kernel/cpu-probe.c')
| -rw-r--r-- | arch/mips/kernel/cpu-probe.c | 45 | 
1 files changed, 42 insertions, 3 deletions
diff --git a/arch/mips/kernel/cpu-probe.c b/arch/mips/kernel/cpu-probe.c index d74f957c561e..e34b10be782e 100644 --- a/arch/mips/kernel/cpu-probe.c +++ b/arch/mips/kernel/cpu-probe.c @@ -54,6 +54,20 @@ static int __init dsp_disable(char *s)  __setup("nodsp", dsp_disable); +static int mips_htw_disabled; + +static int __init htw_disable(char *s) +{ +	mips_htw_disabled = 1; +	cpu_data[0].options &= ~MIPS_CPU_HTW; +	write_c0_pwctl(read_c0_pwctl() & +		       ~(1 << MIPS_PWCTL_PWEN_SHIFT)); + +	return 1; +} + +__setup("nohtw", htw_disable); +  static inline void check_errata(void)  {  	struct cpuinfo_mips *c = ¤t_cpu_data; @@ -130,14 +144,13 @@ static inline int __cpu_has_fpu(void)  static inline unsigned long cpu_get_msa_id(void)  { -	unsigned long status, conf5, msa_id; +	unsigned long status, msa_id;  	status = read_c0_status();  	__enable_fpu(FPU_64BIT); -	conf5 = read_c0_config5();  	enable_msa();  	msa_id = read_msa_ir(); -	write_c0_config5(conf5); +	disable_msa();  	write_c0_status(status);  	return msa_id;  } @@ -321,6 +334,9 @@ static inline unsigned int decode_config3(struct cpuinfo_mips *c)  		c->options |= MIPS_CPU_SEGMENTS;  	if (config3 & MIPS_CONF3_MSA)  		c->ases |= MIPS_ASE_MSA; +	/* Only tested on 32-bit cores */ +	if ((config3 & MIPS_CONF3_PW) && config_enabled(CONFIG_32BIT)) +		c->options |= MIPS_CPU_HTW;  	return config3 & MIPS_CONF_M;  } @@ -389,6 +405,8 @@ static inline unsigned int decode_config5(struct cpuinfo_mips *c)  	if (config5 & MIPS_CONF5_EVA)  		c->options |= MIPS_CPU_EVA; +	if (config5 & MIPS_CONF5_MRP) +		c->options |= MIPS_CPU_MAAR;  	return config5 & MIPS_CONF_M;  } @@ -421,6 +439,15 @@ static void decode_configs(struct cpuinfo_mips *c)  	mips_probe_watch_registers(c); +	if (cpu_has_rixi) { +		/* Enable the RIXI exceptions */ +		write_c0_pagegrain(read_c0_pagegrain() | PG_IEC); +		back_to_back_c0_hazard(); +		/* Verify the IEC bit is set */ +		if (read_c0_pagegrain() & PG_IEC) +			c->options |= MIPS_CPU_RIXIEX; +	} +  #ifndef CONFIG_MIPS_CPS  	if (cpu_has_mips_r2) {  		c->core = get_ebase_cpunum(); @@ -740,6 +767,12 @@ static inline void cpu_probe_legacy(struct cpuinfo_mips *c, unsigned int cpu)  			__cpu_name[cpu] = "ICT Loongson-3";  			set_elf_platform(cpu, "loongson3a");  			break; +		case PRID_REV_LOONGSON3B_R1: +		case PRID_REV_LOONGSON3B_R2: +			c->cputype = CPU_LOONGSON3; +			__cpu_name[cpu] = "ICT Loongson-3"; +			set_elf_platform(cpu, "loongson3b"); +			break;  		}  		set_isa(c, MIPS_CPU_ISA_III); @@ -1187,6 +1220,12 @@ void cpu_probe(void)  	if (mips_dsp_disabled)  		c->ases &= ~(MIPS_ASE_DSP | MIPS_ASE_DSP2P); +	if (mips_htw_disabled) { +		c->options &= ~MIPS_CPU_HTW; +		write_c0_pwctl(read_c0_pwctl() & +			       ~(1 << MIPS_PWCTL_PWEN_SHIFT)); +	} +  	if (c->options & MIPS_CPU_FPU) {  		c->fpu_id = cpu_get_fpu_id();  | 
