diff options
Diffstat (limited to 'arch/mips/kernel/cpu-probe.c')
| -rw-r--r-- | arch/mips/kernel/cpu-probe.c | 53 | 
1 files changed, 41 insertions, 12 deletions
diff --git a/arch/mips/kernel/cpu-probe.c b/arch/mips/kernel/cpu-probe.c index f521cbf934e7..c54332697673 100644 --- a/arch/mips/kernel/cpu-probe.c +++ b/arch/mips/kernel/cpu-probe.c @@ -608,7 +608,7 @@ static int set_ftlb_enable(struct cpuinfo_mips *c, enum ftlb_flags flags)  		if (!(flags & FTLB_EN))  			return 1;  		return 0; -	case CPU_LOONGSON3: +	case CPU_LOONGSON64:  		/* Flush ITLB, DTLB, VTLB and FTLB */  		write_c0_diag(LOONGSON_DIAG_ITLB | LOONGSON_DIAG_DTLB |  			      LOONGSON_DIAG_VTLB | LOONGSON_DIAG_FTLB); @@ -1526,24 +1526,24 @@ static inline void cpu_probe_legacy(struct cpuinfo_mips *c, unsigned int cpu)  			     MIPS_CPU_LLSC | MIPS_CPU_BP_GHIST;  		c->tlbsize = 64;  		break; -	case PRID_IMP_LOONGSON_64:  /* Loongson-2/3 */ +	case PRID_IMP_LOONGSON_64C:  /* Loongson-2/3 */  		switch (c->processor_id & PRID_REV_MASK) {  		case PRID_REV_LOONGSON2E: -			c->cputype = CPU_LOONGSON2; +			c->cputype = CPU_LOONGSON2EF;  			__cpu_name[cpu] = "ICT Loongson-2";  			set_elf_platform(cpu, "loongson2e");  			set_isa(c, MIPS_CPU_ISA_III);  			c->fpu_msk31 |= FPU_CSR_CONDX;  			break;  		case PRID_REV_LOONGSON2F: -			c->cputype = CPU_LOONGSON2; +			c->cputype = CPU_LOONGSON2EF;  			__cpu_name[cpu] = "ICT Loongson-2";  			set_elf_platform(cpu, "loongson2f");  			set_isa(c, MIPS_CPU_ISA_III);  			c->fpu_msk31 |= FPU_CSR_CONDX;  			break;  		case PRID_REV_LOONGSON3A_R1: -			c->cputype = CPU_LOONGSON3; +			c->cputype = CPU_LOONGSON64;  			__cpu_name[cpu] = "ICT Loongson-3";  			set_elf_platform(cpu, "loongson3a");  			set_isa(c, MIPS_CPU_ISA_M64R1); @@ -1552,7 +1552,7 @@ static inline void cpu_probe_legacy(struct cpuinfo_mips *c, unsigned int cpu)  			break;  		case PRID_REV_LOONGSON3B_R1:  		case PRID_REV_LOONGSON3B_R2: -			c->cputype = CPU_LOONGSON3; +			c->cputype = CPU_LOONGSON64;  			__cpu_name[cpu] = "ICT Loongson-3";  			set_elf_platform(cpu, "loongson3b");  			set_isa(c, MIPS_CPU_ISA_M64R1); @@ -1565,12 +1565,13 @@ static inline void cpu_probe_legacy(struct cpuinfo_mips *c, unsigned int cpu)  			     MIPS_CPU_FPU | MIPS_CPU_LLSC |  			     MIPS_CPU_32FPR;  		c->tlbsize = 64; +		set_cpu_asid_mask(c, MIPS_ENTRYHI_ASID);  		c->writecombine = _CACHE_UNCACHED_ACCELERATED;  		break;  	case PRID_IMP_LOONGSON_32:  /* Loongson-1 */  		decode_configs(c); -		c->cputype = CPU_LOONGSON1; +		c->cputype = CPU_LOONGSON32;  		switch (c->processor_id & PRID_REV_MASK) {  		case PRID_REV_LOONGSON1B: @@ -1903,18 +1904,18 @@ platform:  static inline void cpu_probe_loongson(struct cpuinfo_mips *c, unsigned int cpu)  {  	switch (c->processor_id & PRID_IMP_MASK) { -	case PRID_IMP_LOONGSON_64:  /* Loongson-2/3 */ +	case PRID_IMP_LOONGSON_64C:  /* Loongson-2/3 */  		switch (c->processor_id & PRID_REV_MASK) {  		case PRID_REV_LOONGSON3A_R2_0:  		case PRID_REV_LOONGSON3A_R2_1: -			c->cputype = CPU_LOONGSON3; +			c->cputype = CPU_LOONGSON64;  			__cpu_name[cpu] = "ICT Loongson-3";  			set_elf_platform(cpu, "loongson3a");  			set_isa(c, MIPS_CPU_ISA_M64R2);  			break;  		case PRID_REV_LOONGSON3A_R3_0:  		case PRID_REV_LOONGSON3A_R3_1: -			c->cputype = CPU_LOONGSON3; +			c->cputype = CPU_LOONGSON64;  			__cpu_name[cpu] = "ICT Loongson-3";  			set_elf_platform(cpu, "loongson3a");  			set_isa(c, MIPS_CPU_ISA_M64R2); @@ -1927,6 +1928,17 @@ static inline void cpu_probe_loongson(struct cpuinfo_mips *c, unsigned int cpu)  		c->ases |= (MIPS_ASE_LOONGSON_MMI | MIPS_ASE_LOONGSON_CAM |  			MIPS_ASE_LOONGSON_EXT | MIPS_ASE_LOONGSON_EXT2);  		break; +	case PRID_IMP_LOONGSON_64G: +		c->cputype = CPU_LOONGSON64; +		__cpu_name[cpu] = "ICT Loongson-3"; +		set_elf_platform(cpu, "loongson3a"); +		set_isa(c, MIPS_CPU_ISA_M64R2); +		decode_configs(c); +		c->options |= MIPS_CPU_FTLB | MIPS_CPU_TLBINV | MIPS_CPU_LDPTE; +		c->writecombine = _CACHE_UNCACHED_ACCELERATED; +		c->ases |= (MIPS_ASE_LOONGSON_MMI | MIPS_ASE_LOONGSON_CAM | +			MIPS_ASE_LOONGSON_EXT | MIPS_ASE_LOONGSON_EXT2); +		break;  	default:  		panic("Unknown Loongson Processor ID!");  		break; @@ -1965,13 +1977,30 @@ static inline void cpu_probe_ingenic(struct cpuinfo_mips *c, unsigned int cpu)  		break;  	} +	switch (c->processor_id & PRID_COMP_MASK) {  	/* -	 * The config0 register in the Xburst CPUs with a processor ID of +	 * The config0 register in the XBurst CPUs with a processor ID of +	 * PRID_COMP_INGENIC_D1 has an abandoned huge page tlb mode, this +	 * mode is not compatible with the MIPS standard, it will cause +	 * tlbmiss and into an infinite loop (line 21 in the tlb-funcs.S) +	 * when starting the init process. After chip reset, the default +	 * is HPTLB mode, Write 0xa9000000 to cp0 register 5 sel 4 to +	 * switch back to VTLB mode to prevent getting stuck. +	 */ +	case PRID_COMP_INGENIC_D1: +		write_c0_page_ctrl(XBURST_PAGECTRL_HPTLB_DIS); +		break; +	/* +	 * The config0 register in the XBurst CPUs with a processor ID of  	 * PRID_COMP_INGENIC_D0 report themselves as MIPS32r2 compatible,  	 * but they don't actually support this ISA.  	 */ -	if ((c->processor_id & PRID_COMP_MASK) == PRID_COMP_INGENIC_D0) +	case PRID_COMP_INGENIC_D0:  		c->isa_level &= ~MIPS_CPU_ISA_M32R2; +		break; +	default: +		break; +	}  }  static inline void cpu_probe_netlogic(struct cpuinfo_mips *c, int cpu)  |