cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

cpu-probe.c (53200B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/*
      3 * Processor capabilities determination functions.
      4 *
      5 * Copyright (C) xxxx  the Anonymous
      6 * Copyright (C) 1994 - 2006 Ralf Baechle
      7 * Copyright (C) 2003, 2004  Maciej W. Rozycki
      8 * Copyright (C) 2001, 2004, 2011, 2012	 MIPS Technologies, Inc.
      9 */
     10#include <linux/init.h>
     11#include <linux/kernel.h>
     12#include <linux/ptrace.h>
     13#include <linux/smp.h>
     14#include <linux/stddef.h>
     15#include <linux/export.h>
     16
     17#include <asm/bugs.h>
     18#include <asm/cpu.h>
     19#include <asm/cpu-features.h>
     20#include <asm/cpu-type.h>
     21#include <asm/fpu.h>
     22#include <asm/mipsregs.h>
     23#include <asm/mipsmtregs.h>
     24#include <asm/msa.h>
     25#include <asm/watch.h>
     26#include <asm/elf.h>
     27#include <asm/pgtable-bits.h>
     28#include <asm/spram.h>
     29#include <asm/traps.h>
     30#include <linux/uaccess.h>
     31
     32#include "fpu-probe.h"
     33
     34#include <asm/mach-loongson64/cpucfg-emul.h>
     35
     36/* Hardware capabilities */
     37unsigned int elf_hwcap __read_mostly;
     38EXPORT_SYMBOL_GPL(elf_hwcap);
     39
     40static inline unsigned long cpu_get_msa_id(void)
     41{
     42	unsigned long status, msa_id;
     43
     44	status = read_c0_status();
     45	__enable_fpu(FPU_64BIT);
     46	enable_msa();
     47	msa_id = read_msa_ir();
     48	disable_msa();
     49	write_c0_status(status);
     50	return msa_id;
     51}
     52
     53static int mips_dsp_disabled;
     54
     55static int __init dsp_disable(char *s)
     56{
     57	cpu_data[0].ases &= ~(MIPS_ASE_DSP | MIPS_ASE_DSP2P);
     58	mips_dsp_disabled = 1;
     59
     60	return 1;
     61}
     62
     63__setup("nodsp", dsp_disable);
     64
     65static int mips_htw_disabled;
     66
     67static int __init htw_disable(char *s)
     68{
     69	mips_htw_disabled = 1;
     70	cpu_data[0].options &= ~MIPS_CPU_HTW;
     71	write_c0_pwctl(read_c0_pwctl() &
     72		       ~(1 << MIPS_PWCTL_PWEN_SHIFT));
     73
     74	return 1;
     75}
     76
     77__setup("nohtw", htw_disable);
     78
     79static int mips_ftlb_disabled;
     80static int mips_has_ftlb_configured;
     81
     82enum ftlb_flags {
     83	FTLB_EN		= 1 << 0,
     84	FTLB_SET_PROB	= 1 << 1,
     85};
     86
     87static int set_ftlb_enable(struct cpuinfo_mips *c, enum ftlb_flags flags);
     88
     89static int __init ftlb_disable(char *s)
     90{
     91	unsigned int config4, mmuextdef;
     92
     93	/*
     94	 * If the core hasn't done any FTLB configuration, there is nothing
     95	 * for us to do here.
     96	 */
     97	if (!mips_has_ftlb_configured)
     98		return 1;
     99
    100	/* Disable it in the boot cpu */
    101	if (set_ftlb_enable(&cpu_data[0], 0)) {
    102		pr_warn("Can't turn FTLB off\n");
    103		return 1;
    104	}
    105
    106	config4 = read_c0_config4();
    107
    108	/* Check that FTLB has been disabled */
    109	mmuextdef = config4 & MIPS_CONF4_MMUEXTDEF;
    110	/* MMUSIZEEXT == VTLB ON, FTLB OFF */
    111	if (mmuextdef == MIPS_CONF4_MMUEXTDEF_FTLBSIZEEXT) {
    112		/* This should never happen */
    113		pr_warn("FTLB could not be disabled!\n");
    114		return 1;
    115	}
    116
    117	mips_ftlb_disabled = 1;
    118	mips_has_ftlb_configured = 0;
    119
    120	/*
    121	 * noftlb is mainly used for debug purposes so print
    122	 * an informative message instead of using pr_debug()
    123	 */
    124	pr_info("FTLB has been disabled\n");
    125
    126	/*
    127	 * Some of these bits are duplicated in the decode_config4.
    128	 * MIPS_CONF4_MMUEXTDEF_MMUSIZEEXT is the only possible case
    129	 * once FTLB has been disabled so undo what decode_config4 did.
    130	 */
    131	cpu_data[0].tlbsize -= cpu_data[0].tlbsizeftlbways *
    132			       cpu_data[0].tlbsizeftlbsets;
    133	cpu_data[0].tlbsizeftlbsets = 0;
    134	cpu_data[0].tlbsizeftlbways = 0;
    135
    136	return 1;
    137}
    138
    139__setup("noftlb", ftlb_disable);
    140
    141/*
    142 * Check if the CPU has per tc perf counters
    143 */
    144static inline void cpu_set_mt_per_tc_perf(struct cpuinfo_mips *c)
    145{
    146	if (read_c0_config7() & MTI_CONF7_PTC)
    147		c->options |= MIPS_CPU_MT_PER_TC_PERF_COUNTERS;
    148}
    149
    150static inline void check_errata(void)
    151{
    152	struct cpuinfo_mips *c = &current_cpu_data;
    153
    154	switch (current_cpu_type()) {
    155	case CPU_34K:
    156		/*
    157		 * Erratum "RPS May Cause Incorrect Instruction Execution"
    158		 * This code only handles VPE0, any SMP/RTOS code
    159		 * making use of VPE1 will be responsible for that VPE.
    160		 */
    161		if ((c->processor_id & PRID_REV_MASK) <= PRID_REV_34K_V1_0_2)
    162			write_c0_config7(read_c0_config7() | MIPS_CONF7_RPS);
    163		break;
    164	default:
    165		break;
    166	}
    167}
    168
    169void __init check_bugs32(void)
    170{
    171	check_errata();
    172}
    173
    174/*
    175 * Probe whether cpu has config register by trying to play with
    176 * alternate cache bit and see whether it matters.
    177 * It's used by cpu_probe to distinguish between R3000A and R3081.
    178 */
    179static inline int cpu_has_confreg(void)
    180{
    181#ifdef CONFIG_CPU_R3000
    182	extern unsigned long r3k_cache_size(unsigned long);
    183	unsigned long size1, size2;
    184	unsigned long cfg = read_c0_conf();
    185
    186	size1 = r3k_cache_size(ST0_ISC);
    187	write_c0_conf(cfg ^ R30XX_CONF_AC);
    188	size2 = r3k_cache_size(ST0_ISC);
    189	write_c0_conf(cfg);
    190	return size1 != size2;
    191#else
    192	return 0;
    193#endif
    194}
    195
    196static inline void set_elf_platform(int cpu, const char *plat)
    197{
    198	if (cpu == 0)
    199		__elf_platform = plat;
    200}
    201
    202static inline void set_elf_base_platform(const char *plat)
    203{
    204	if (__elf_base_platform == NULL) {
    205		__elf_base_platform = plat;
    206	}
    207}
    208
    209static inline void cpu_probe_vmbits(struct cpuinfo_mips *c)
    210{
    211#ifdef __NEED_VMBITS_PROBE
    212	write_c0_entryhi(0x3fffffffffffe000ULL);
    213	back_to_back_c0_hazard();
    214	c->vmbits = fls64(read_c0_entryhi() & 0x3fffffffffffe000ULL);
    215#endif
    216}
    217
    218static void set_isa(struct cpuinfo_mips *c, unsigned int isa)
    219{
    220	switch (isa) {
    221	case MIPS_CPU_ISA_M64R5:
    222		c->isa_level |= MIPS_CPU_ISA_M32R5 | MIPS_CPU_ISA_M64R5;
    223		set_elf_base_platform("mips64r5");
    224		fallthrough;
    225	case MIPS_CPU_ISA_M64R2:
    226		c->isa_level |= MIPS_CPU_ISA_M32R2 | MIPS_CPU_ISA_M64R2;
    227		set_elf_base_platform("mips64r2");
    228		fallthrough;
    229	case MIPS_CPU_ISA_M64R1:
    230		c->isa_level |= MIPS_CPU_ISA_M32R1 | MIPS_CPU_ISA_M64R1;
    231		set_elf_base_platform("mips64");
    232		fallthrough;
    233	case MIPS_CPU_ISA_V:
    234		c->isa_level |= MIPS_CPU_ISA_V;
    235		set_elf_base_platform("mips5");
    236		fallthrough;
    237	case MIPS_CPU_ISA_IV:
    238		c->isa_level |= MIPS_CPU_ISA_IV;
    239		set_elf_base_platform("mips4");
    240		fallthrough;
    241	case MIPS_CPU_ISA_III:
    242		c->isa_level |= MIPS_CPU_ISA_II | MIPS_CPU_ISA_III;
    243		set_elf_base_platform("mips3");
    244		break;
    245
    246	/* R6 incompatible with everything else */
    247	case MIPS_CPU_ISA_M64R6:
    248		c->isa_level |= MIPS_CPU_ISA_M32R6 | MIPS_CPU_ISA_M64R6;
    249		set_elf_base_platform("mips64r6");
    250		fallthrough;
    251	case MIPS_CPU_ISA_M32R6:
    252		c->isa_level |= MIPS_CPU_ISA_M32R6;
    253		set_elf_base_platform("mips32r6");
    254		/* Break here so we don't add incompatible ISAs */
    255		break;
    256	case MIPS_CPU_ISA_M32R5:
    257		c->isa_level |= MIPS_CPU_ISA_M32R5;
    258		set_elf_base_platform("mips32r5");
    259		fallthrough;
    260	case MIPS_CPU_ISA_M32R2:
    261		c->isa_level |= MIPS_CPU_ISA_M32R2;
    262		set_elf_base_platform("mips32r2");
    263		fallthrough;
    264	case MIPS_CPU_ISA_M32R1:
    265		c->isa_level |= MIPS_CPU_ISA_M32R1;
    266		set_elf_base_platform("mips32");
    267		fallthrough;
    268	case MIPS_CPU_ISA_II:
    269		c->isa_level |= MIPS_CPU_ISA_II;
    270		set_elf_base_platform("mips2");
    271		break;
    272	}
    273}
    274
    275static char unknown_isa[] = KERN_ERR \
    276	"Unsupported ISA type, c0.config0: %d.";
    277
    278static unsigned int calculate_ftlb_probability(struct cpuinfo_mips *c)
    279{
    280
    281	unsigned int probability = c->tlbsize / c->tlbsizevtlb;
    282
    283	/*
    284	 * 0 = All TLBWR instructions go to FTLB
    285	 * 1 = 15:1: For every 16 TBLWR instructions, 15 go to the
    286	 * FTLB and 1 goes to the VTLB.
    287	 * 2 = 7:1: As above with 7:1 ratio.
    288	 * 3 = 3:1: As above with 3:1 ratio.
    289	 *
    290	 * Use the linear midpoint as the probability threshold.
    291	 */
    292	if (probability >= 12)
    293		return 1;
    294	else if (probability >= 6)
    295		return 2;
    296	else
    297		/*
    298		 * So FTLB is less than 4 times bigger than VTLB.
    299		 * A 3:1 ratio can still be useful though.
    300		 */
    301		return 3;
    302}
    303
    304static int set_ftlb_enable(struct cpuinfo_mips *c, enum ftlb_flags flags)
    305{
    306	unsigned int config;
    307
    308	/* It's implementation dependent how the FTLB can be enabled */
    309	switch (c->cputype) {
    310	case CPU_PROAPTIV:
    311	case CPU_P5600:
    312	case CPU_P6600:
    313		/* proAptiv & related cores use Config6 to enable the FTLB */
    314		config = read_c0_config6();
    315
    316		if (flags & FTLB_EN)
    317			config |= MTI_CONF6_FTLBEN;
    318		else
    319			config &= ~MTI_CONF6_FTLBEN;
    320
    321		if (flags & FTLB_SET_PROB) {
    322			config &= ~(3 << MTI_CONF6_FTLBP_SHIFT);
    323			config |= calculate_ftlb_probability(c)
    324				  << MTI_CONF6_FTLBP_SHIFT;
    325		}
    326
    327		write_c0_config6(config);
    328		back_to_back_c0_hazard();
    329		break;
    330	case CPU_I6400:
    331	case CPU_I6500:
    332		/* There's no way to disable the FTLB */
    333		if (!(flags & FTLB_EN))
    334			return 1;
    335		return 0;
    336	case CPU_LOONGSON64:
    337		/* Flush ITLB, DTLB, VTLB and FTLB */
    338		write_c0_diag(LOONGSON_DIAG_ITLB | LOONGSON_DIAG_DTLB |
    339			      LOONGSON_DIAG_VTLB | LOONGSON_DIAG_FTLB);
    340		/* Loongson-3 cores use Config6 to enable the FTLB */
    341		config = read_c0_config6();
    342		if (flags & FTLB_EN)
    343			/* Enable FTLB */
    344			write_c0_config6(config & ~LOONGSON_CONF6_FTLBDIS);
    345		else
    346			/* Disable FTLB */
    347			write_c0_config6(config | LOONGSON_CONF6_FTLBDIS);
    348		break;
    349	default:
    350		return 1;
    351	}
    352
    353	return 0;
    354}
    355
    356static int mm_config(struct cpuinfo_mips *c)
    357{
    358	unsigned int config0, update, mm;
    359
    360	config0 = read_c0_config();
    361	mm = config0 & MIPS_CONF_MM;
    362
    363	/*
    364	 * It's implementation dependent what type of write-merge is supported
    365	 * and whether it can be enabled/disabled. If it is settable lets make
    366	 * the merging allowed by default. Some platforms might have
    367	 * write-through caching unsupported. In this case just ignore the
    368	 * CP0.Config.MM bit field value.
    369	 */
    370	switch (c->cputype) {
    371	case CPU_24K:
    372	case CPU_34K:
    373	case CPU_74K:
    374	case CPU_P5600:
    375	case CPU_P6600:
    376		c->options |= MIPS_CPU_MM_FULL;
    377		update = MIPS_CONF_MM_FULL;
    378		break;
    379	case CPU_1004K:
    380	case CPU_1074K:
    381	case CPU_INTERAPTIV:
    382	case CPU_PROAPTIV:
    383		mm = 0;
    384		fallthrough;
    385	default:
    386		update = 0;
    387		break;
    388	}
    389
    390	if (update) {
    391		config0 = (config0 & ~MIPS_CONF_MM) | update;
    392		write_c0_config(config0);
    393	} else if (mm == MIPS_CONF_MM_SYSAD) {
    394		c->options |= MIPS_CPU_MM_SYSAD;
    395	} else if (mm == MIPS_CONF_MM_FULL) {
    396		c->options |= MIPS_CPU_MM_FULL;
    397	}
    398
    399	return 0;
    400}
    401
    402static inline unsigned int decode_config0(struct cpuinfo_mips *c)
    403{
    404	unsigned int config0;
    405	int isa, mt;
    406
    407	config0 = read_c0_config();
    408
    409	/*
    410	 * Look for Standard TLB or Dual VTLB and FTLB
    411	 */
    412	mt = config0 & MIPS_CONF_MT;
    413	if (mt == MIPS_CONF_MT_TLB)
    414		c->options |= MIPS_CPU_TLB;
    415	else if (mt == MIPS_CONF_MT_FTLB)
    416		c->options |= MIPS_CPU_TLB | MIPS_CPU_FTLB;
    417
    418	isa = (config0 & MIPS_CONF_AT) >> 13;
    419	switch (isa) {
    420	case 0:
    421		switch ((config0 & MIPS_CONF_AR) >> 10) {
    422		case 0:
    423			set_isa(c, MIPS_CPU_ISA_M32R1);
    424			break;
    425		case 1:
    426			set_isa(c, MIPS_CPU_ISA_M32R2);
    427			break;
    428		case 2:
    429			set_isa(c, MIPS_CPU_ISA_M32R6);
    430			break;
    431		default:
    432			goto unknown;
    433		}
    434		break;
    435	case 2:
    436		switch ((config0 & MIPS_CONF_AR) >> 10) {
    437		case 0:
    438			set_isa(c, MIPS_CPU_ISA_M64R1);
    439			break;
    440		case 1:
    441			set_isa(c, MIPS_CPU_ISA_M64R2);
    442			break;
    443		case 2:
    444			set_isa(c, MIPS_CPU_ISA_M64R6);
    445			break;
    446		default:
    447			goto unknown;
    448		}
    449		break;
    450	default:
    451		goto unknown;
    452	}
    453
    454	return config0 & MIPS_CONF_M;
    455
    456unknown:
    457	panic(unknown_isa, config0);
    458}
    459
    460static inline unsigned int decode_config1(struct cpuinfo_mips *c)
    461{
    462	unsigned int config1;
    463
    464	config1 = read_c0_config1();
    465
    466	if (config1 & MIPS_CONF1_MD)
    467		c->ases |= MIPS_ASE_MDMX;
    468	if (config1 & MIPS_CONF1_PC)
    469		c->options |= MIPS_CPU_PERF;
    470	if (config1 & MIPS_CONF1_WR)
    471		c->options |= MIPS_CPU_WATCH;
    472	if (config1 & MIPS_CONF1_CA)
    473		c->ases |= MIPS_ASE_MIPS16;
    474	if (config1 & MIPS_CONF1_EP)
    475		c->options |= MIPS_CPU_EJTAG;
    476	if (config1 & MIPS_CONF1_FP) {
    477		c->options |= MIPS_CPU_FPU;
    478		c->options |= MIPS_CPU_32FPR;
    479	}
    480	if (cpu_has_tlb) {
    481		c->tlbsize = ((config1 & MIPS_CONF1_TLBS) >> 25) + 1;
    482		c->tlbsizevtlb = c->tlbsize;
    483		c->tlbsizeftlbsets = 0;
    484	}
    485
    486	return config1 & MIPS_CONF_M;
    487}
    488
    489static inline unsigned int decode_config2(struct cpuinfo_mips *c)
    490{
    491	unsigned int config2;
    492
    493	config2 = read_c0_config2();
    494
    495	if (config2 & MIPS_CONF2_SL)
    496		c->scache.flags &= ~MIPS_CACHE_NOT_PRESENT;
    497
    498	return config2 & MIPS_CONF_M;
    499}
    500
    501static inline unsigned int decode_config3(struct cpuinfo_mips *c)
    502{
    503	unsigned int config3;
    504
    505	config3 = read_c0_config3();
    506
    507	if (config3 & MIPS_CONF3_SM) {
    508		c->ases |= MIPS_ASE_SMARTMIPS;
    509		c->options |= MIPS_CPU_RIXI | MIPS_CPU_CTXTC;
    510	}
    511	if (config3 & MIPS_CONF3_RXI)
    512		c->options |= MIPS_CPU_RIXI;
    513	if (config3 & MIPS_CONF3_CTXTC)
    514		c->options |= MIPS_CPU_CTXTC;
    515	if (config3 & MIPS_CONF3_DSP)
    516		c->ases |= MIPS_ASE_DSP;
    517	if (config3 & MIPS_CONF3_DSP2P) {
    518		c->ases |= MIPS_ASE_DSP2P;
    519		if (cpu_has_mips_r6)
    520			c->ases |= MIPS_ASE_DSP3;
    521	}
    522	if (config3 & MIPS_CONF3_VINT)
    523		c->options |= MIPS_CPU_VINT;
    524	if (config3 & MIPS_CONF3_VEIC)
    525		c->options |= MIPS_CPU_VEIC;
    526	if (config3 & MIPS_CONF3_LPA)
    527		c->options |= MIPS_CPU_LPA;
    528	if (config3 & MIPS_CONF3_MT)
    529		c->ases |= MIPS_ASE_MIPSMT;
    530	if (config3 & MIPS_CONF3_ULRI)
    531		c->options |= MIPS_CPU_ULRI;
    532	if (config3 & MIPS_CONF3_ISA)
    533		c->options |= MIPS_CPU_MICROMIPS;
    534	if (config3 & MIPS_CONF3_VZ)
    535		c->ases |= MIPS_ASE_VZ;
    536	if (config3 & MIPS_CONF3_SC)
    537		c->options |= MIPS_CPU_SEGMENTS;
    538	if (config3 & MIPS_CONF3_BI)
    539		c->options |= MIPS_CPU_BADINSTR;
    540	if (config3 & MIPS_CONF3_BP)
    541		c->options |= MIPS_CPU_BADINSTRP;
    542	if (config3 & MIPS_CONF3_MSA)
    543		c->ases |= MIPS_ASE_MSA;
    544	if (config3 & MIPS_CONF3_PW) {
    545		c->htw_seq = 0;
    546		c->options |= MIPS_CPU_HTW;
    547	}
    548	if (config3 & MIPS_CONF3_CDMM)
    549		c->options |= MIPS_CPU_CDMM;
    550	if (config3 & MIPS_CONF3_SP)
    551		c->options |= MIPS_CPU_SP;
    552
    553	return config3 & MIPS_CONF_M;
    554}
    555
    556static inline unsigned int decode_config4(struct cpuinfo_mips *c)
    557{
    558	unsigned int config4;
    559	unsigned int newcf4;
    560	unsigned int mmuextdef;
    561	unsigned int ftlb_page = MIPS_CONF4_FTLBPAGESIZE;
    562	unsigned long asid_mask;
    563
    564	config4 = read_c0_config4();
    565
    566	if (cpu_has_tlb) {
    567		if (((config4 & MIPS_CONF4_IE) >> 29) == 2)
    568			c->options |= MIPS_CPU_TLBINV;
    569
    570		/*
    571		 * R6 has dropped the MMUExtDef field from config4.
    572		 * On R6 the fields always describe the FTLB, and only if it is
    573		 * present according to Config.MT.
    574		 */
    575		if (!cpu_has_mips_r6)
    576			mmuextdef = config4 & MIPS_CONF4_MMUEXTDEF;
    577		else if (cpu_has_ftlb)
    578			mmuextdef = MIPS_CONF4_MMUEXTDEF_VTLBSIZEEXT;
    579		else
    580			mmuextdef = 0;
    581
    582		switch (mmuextdef) {
    583		case MIPS_CONF4_MMUEXTDEF_MMUSIZEEXT:
    584			c->tlbsize += (config4 & MIPS_CONF4_MMUSIZEEXT) * 0x40;
    585			c->tlbsizevtlb = c->tlbsize;
    586			break;
    587		case MIPS_CONF4_MMUEXTDEF_VTLBSIZEEXT:
    588			c->tlbsizevtlb +=
    589				((config4 & MIPS_CONF4_VTLBSIZEEXT) >>
    590				  MIPS_CONF4_VTLBSIZEEXT_SHIFT) * 0x40;
    591			c->tlbsize = c->tlbsizevtlb;
    592			ftlb_page = MIPS_CONF4_VFTLBPAGESIZE;
    593			fallthrough;
    594		case MIPS_CONF4_MMUEXTDEF_FTLBSIZEEXT:
    595			if (mips_ftlb_disabled)
    596				break;
    597			newcf4 = (config4 & ~ftlb_page) |
    598				(page_size_ftlb(mmuextdef) <<
    599				 MIPS_CONF4_FTLBPAGESIZE_SHIFT);
    600			write_c0_config4(newcf4);
    601			back_to_back_c0_hazard();
    602			config4 = read_c0_config4();
    603			if (config4 != newcf4) {
    604				pr_err("PAGE_SIZE 0x%lx is not supported by FTLB (config4=0x%x)\n",
    605				       PAGE_SIZE, config4);
    606				/* Switch FTLB off */
    607				set_ftlb_enable(c, 0);
    608				mips_ftlb_disabled = 1;
    609				break;
    610			}
    611			c->tlbsizeftlbsets = 1 <<
    612				((config4 & MIPS_CONF4_FTLBSETS) >>
    613				 MIPS_CONF4_FTLBSETS_SHIFT);
    614			c->tlbsizeftlbways = ((config4 & MIPS_CONF4_FTLBWAYS) >>
    615					      MIPS_CONF4_FTLBWAYS_SHIFT) + 2;
    616			c->tlbsize += c->tlbsizeftlbways * c->tlbsizeftlbsets;
    617			mips_has_ftlb_configured = 1;
    618			break;
    619		}
    620	}
    621
    622	c->kscratch_mask = (config4 & MIPS_CONF4_KSCREXIST)
    623				>> MIPS_CONF4_KSCREXIST_SHIFT;
    624
    625	asid_mask = MIPS_ENTRYHI_ASID;
    626	if (config4 & MIPS_CONF4_AE)
    627		asid_mask |= MIPS_ENTRYHI_ASIDX;
    628	set_cpu_asid_mask(c, asid_mask);
    629
    630	/*
    631	 * Warn if the computed ASID mask doesn't match the mask the kernel
    632	 * is built for. This may indicate either a serious problem or an
    633	 * easy optimisation opportunity, but either way should be addressed.
    634	 */
    635	WARN_ON(asid_mask != cpu_asid_mask(c));
    636
    637	return config4 & MIPS_CONF_M;
    638}
    639
    640static inline unsigned int decode_config5(struct cpuinfo_mips *c)
    641{
    642	unsigned int config5, max_mmid_width;
    643	unsigned long asid_mask;
    644
    645	config5 = read_c0_config5();
    646	config5 &= ~(MIPS_CONF5_UFR | MIPS_CONF5_UFE);
    647
    648	if (cpu_has_mips_r6) {
    649		if (!__builtin_constant_p(cpu_has_mmid) || cpu_has_mmid)
    650			config5 |= MIPS_CONF5_MI;
    651		else
    652			config5 &= ~MIPS_CONF5_MI;
    653	}
    654
    655	write_c0_config5(config5);
    656
    657	if (config5 & MIPS_CONF5_EVA)
    658		c->options |= MIPS_CPU_EVA;
    659	if (config5 & MIPS_CONF5_MRP)
    660		c->options |= MIPS_CPU_MAAR;
    661	if (config5 & MIPS_CONF5_LLB)
    662		c->options |= MIPS_CPU_RW_LLB;
    663	if (config5 & MIPS_CONF5_MVH)
    664		c->options |= MIPS_CPU_MVH;
    665	if (cpu_has_mips_r6 && (config5 & MIPS_CONF5_VP))
    666		c->options |= MIPS_CPU_VP;
    667	if (config5 & MIPS_CONF5_CA2)
    668		c->ases |= MIPS_ASE_MIPS16E2;
    669
    670	if (config5 & MIPS_CONF5_CRCP)
    671		elf_hwcap |= HWCAP_MIPS_CRC32;
    672
    673	if (cpu_has_mips_r6) {
    674		/* Ensure the write to config5 above takes effect */
    675		back_to_back_c0_hazard();
    676
    677		/* Check whether we successfully enabled MMID support */
    678		config5 = read_c0_config5();
    679		if (config5 & MIPS_CONF5_MI)
    680			c->options |= MIPS_CPU_MMID;
    681
    682		/*
    683		 * Warn if we've hardcoded cpu_has_mmid to a value unsuitable
    684		 * for the CPU we're running on, or if CPUs in an SMP system
    685		 * have inconsistent MMID support.
    686		 */
    687		WARN_ON(!!cpu_has_mmid != !!(config5 & MIPS_CONF5_MI));
    688
    689		if (cpu_has_mmid) {
    690			write_c0_memorymapid(~0ul);
    691			back_to_back_c0_hazard();
    692			asid_mask = read_c0_memorymapid();
    693
    694			/*
    695			 * We maintain a bitmap to track MMID allocation, and
    696			 * need a sensible upper bound on the size of that
    697			 * bitmap. The initial CPU with MMID support (I6500)
    698			 * supports 16 bit MMIDs, which gives us an 8KiB
    699			 * bitmap. The architecture recommends that hardware
    700			 * support 32 bit MMIDs, which would give us a 512MiB
    701			 * bitmap - that's too big in most cases.
    702			 *
    703			 * Cap MMID width at 16 bits for now & we can revisit
    704			 * this if & when hardware supports anything wider.
    705			 */
    706			max_mmid_width = 16;
    707			if (asid_mask > GENMASK(max_mmid_width - 1, 0)) {
    708				pr_info("Capping MMID width at %d bits",
    709					max_mmid_width);
    710				asid_mask = GENMASK(max_mmid_width - 1, 0);
    711			}
    712
    713			set_cpu_asid_mask(c, asid_mask);
    714		}
    715	}
    716
    717	return config5 & MIPS_CONF_M;
    718}
    719
    720static void decode_configs(struct cpuinfo_mips *c)
    721{
    722	int ok;
    723
    724	/* MIPS32 or MIPS64 compliant CPU.  */
    725	c->options = MIPS_CPU_4KEX | MIPS_CPU_4K_CACHE | MIPS_CPU_COUNTER |
    726		     MIPS_CPU_DIVEC | MIPS_CPU_LLSC | MIPS_CPU_MCHECK;
    727
    728	c->scache.flags = MIPS_CACHE_NOT_PRESENT;
    729
    730	/* Enable FTLB if present and not disabled */
    731	set_ftlb_enable(c, mips_ftlb_disabled ? 0 : FTLB_EN);
    732
    733	ok = decode_config0(c);			/* Read Config registers.  */
    734	BUG_ON(!ok);				/* Arch spec violation!	 */
    735	if (ok)
    736		ok = decode_config1(c);
    737	if (ok)
    738		ok = decode_config2(c);
    739	if (ok)
    740		ok = decode_config3(c);
    741	if (ok)
    742		ok = decode_config4(c);
    743	if (ok)
    744		ok = decode_config5(c);
    745
    746	/* Probe the EBase.WG bit */
    747	if (cpu_has_mips_r2_r6) {
    748		u64 ebase;
    749		unsigned int status;
    750
    751		/* {read,write}_c0_ebase_64() may be UNDEFINED prior to r6 */
    752		ebase = cpu_has_mips64r6 ? read_c0_ebase_64()
    753					 : (s32)read_c0_ebase();
    754		if (ebase & MIPS_EBASE_WG) {
    755			/* WG bit already set, we can avoid the clumsy probe */
    756			c->options |= MIPS_CPU_EBASE_WG;
    757		} else {
    758			/* Its UNDEFINED to change EBase while BEV=0 */
    759			status = read_c0_status();
    760			write_c0_status(status | ST0_BEV);
    761			irq_enable_hazard();
    762			/*
    763			 * On pre-r6 cores, this may well clobber the upper bits
    764			 * of EBase. This is hard to avoid without potentially
    765			 * hitting UNDEFINED dm*c0 behaviour if EBase is 32-bit.
    766			 */
    767			if (cpu_has_mips64r6)
    768				write_c0_ebase_64(ebase | MIPS_EBASE_WG);
    769			else
    770				write_c0_ebase(ebase | MIPS_EBASE_WG);
    771			back_to_back_c0_hazard();
    772			/* Restore BEV */
    773			write_c0_status(status);
    774			if (read_c0_ebase() & MIPS_EBASE_WG) {
    775				c->options |= MIPS_CPU_EBASE_WG;
    776				write_c0_ebase(ebase);
    777			}
    778		}
    779	}
    780
    781	/* configure the FTLB write probability */
    782	set_ftlb_enable(c, (mips_ftlb_disabled ? 0 : FTLB_EN) | FTLB_SET_PROB);
    783
    784	mips_probe_watch_registers(c);
    785
    786#ifndef CONFIG_MIPS_CPS
    787	if (cpu_has_mips_r2_r6) {
    788		unsigned int core;
    789
    790		core = get_ebase_cpunum();
    791		if (cpu_has_mipsmt)
    792			core >>= fls(core_nvpes()) - 1;
    793		cpu_set_core(c, core);
    794	}
    795#endif
    796}
    797
    798/*
    799 * Probe for certain guest capabilities by writing config bits and reading back.
    800 * Finally write back the original value.
    801 */
    802#define probe_gc0_config(name, maxconf, bits)				\
    803do {									\
    804	unsigned int tmp;						\
    805	tmp = read_gc0_##name();					\
    806	write_gc0_##name(tmp | (bits));					\
    807	back_to_back_c0_hazard();					\
    808	maxconf = read_gc0_##name();					\
    809	write_gc0_##name(tmp);						\
    810} while (0)
    811
    812/*
    813 * Probe for dynamic guest capabilities by changing certain config bits and
    814 * reading back to see if they change. Finally write back the original value.
    815 */
    816#define probe_gc0_config_dyn(name, maxconf, dynconf, bits)		\
    817do {									\
    818	maxconf = read_gc0_##name();					\
    819	write_gc0_##name(maxconf ^ (bits));				\
    820	back_to_back_c0_hazard();					\
    821	dynconf = maxconf ^ read_gc0_##name();				\
    822	write_gc0_##name(maxconf);					\
    823	maxconf |= dynconf;						\
    824} while (0)
    825
    826static inline unsigned int decode_guest_config0(struct cpuinfo_mips *c)
    827{
    828	unsigned int config0;
    829
    830	probe_gc0_config(config, config0, MIPS_CONF_M);
    831
    832	if (config0 & MIPS_CONF_M)
    833		c->guest.conf |= BIT(1);
    834	return config0 & MIPS_CONF_M;
    835}
    836
    837static inline unsigned int decode_guest_config1(struct cpuinfo_mips *c)
    838{
    839	unsigned int config1, config1_dyn;
    840
    841	probe_gc0_config_dyn(config1, config1, config1_dyn,
    842			     MIPS_CONF_M | MIPS_CONF1_PC | MIPS_CONF1_WR |
    843			     MIPS_CONF1_FP);
    844
    845	if (config1 & MIPS_CONF1_FP)
    846		c->guest.options |= MIPS_CPU_FPU;
    847	if (config1_dyn & MIPS_CONF1_FP)
    848		c->guest.options_dyn |= MIPS_CPU_FPU;
    849
    850	if (config1 & MIPS_CONF1_WR)
    851		c->guest.options |= MIPS_CPU_WATCH;
    852	if (config1_dyn & MIPS_CONF1_WR)
    853		c->guest.options_dyn |= MIPS_CPU_WATCH;
    854
    855	if (config1 & MIPS_CONF1_PC)
    856		c->guest.options |= MIPS_CPU_PERF;
    857	if (config1_dyn & MIPS_CONF1_PC)
    858		c->guest.options_dyn |= MIPS_CPU_PERF;
    859
    860	if (config1 & MIPS_CONF_M)
    861		c->guest.conf |= BIT(2);
    862	return config1 & MIPS_CONF_M;
    863}
    864
    865static inline unsigned int decode_guest_config2(struct cpuinfo_mips *c)
    866{
    867	unsigned int config2;
    868
    869	probe_gc0_config(config2, config2, MIPS_CONF_M);
    870
    871	if (config2 & MIPS_CONF_M)
    872		c->guest.conf |= BIT(3);
    873	return config2 & MIPS_CONF_M;
    874}
    875
    876static inline unsigned int decode_guest_config3(struct cpuinfo_mips *c)
    877{
    878	unsigned int config3, config3_dyn;
    879
    880	probe_gc0_config_dyn(config3, config3, config3_dyn,
    881			     MIPS_CONF_M | MIPS_CONF3_MSA | MIPS_CONF3_ULRI |
    882			     MIPS_CONF3_CTXTC);
    883
    884	if (config3 & MIPS_CONF3_CTXTC)
    885		c->guest.options |= MIPS_CPU_CTXTC;
    886	if (config3_dyn & MIPS_CONF3_CTXTC)
    887		c->guest.options_dyn |= MIPS_CPU_CTXTC;
    888
    889	if (config3 & MIPS_CONF3_PW)
    890		c->guest.options |= MIPS_CPU_HTW;
    891
    892	if (config3 & MIPS_CONF3_ULRI)
    893		c->guest.options |= MIPS_CPU_ULRI;
    894
    895	if (config3 & MIPS_CONF3_SC)
    896		c->guest.options |= MIPS_CPU_SEGMENTS;
    897
    898	if (config3 & MIPS_CONF3_BI)
    899		c->guest.options |= MIPS_CPU_BADINSTR;
    900	if (config3 & MIPS_CONF3_BP)
    901		c->guest.options |= MIPS_CPU_BADINSTRP;
    902
    903	if (config3 & MIPS_CONF3_MSA)
    904		c->guest.ases |= MIPS_ASE_MSA;
    905	if (config3_dyn & MIPS_CONF3_MSA)
    906		c->guest.ases_dyn |= MIPS_ASE_MSA;
    907
    908	if (config3 & MIPS_CONF_M)
    909		c->guest.conf |= BIT(4);
    910	return config3 & MIPS_CONF_M;
    911}
    912
    913static inline unsigned int decode_guest_config4(struct cpuinfo_mips *c)
    914{
    915	unsigned int config4;
    916
    917	probe_gc0_config(config4, config4,
    918			 MIPS_CONF_M | MIPS_CONF4_KSCREXIST);
    919
    920	c->guest.kscratch_mask = (config4 & MIPS_CONF4_KSCREXIST)
    921				>> MIPS_CONF4_KSCREXIST_SHIFT;
    922
    923	if (config4 & MIPS_CONF_M)
    924		c->guest.conf |= BIT(5);
    925	return config4 & MIPS_CONF_M;
    926}
    927
    928static inline unsigned int decode_guest_config5(struct cpuinfo_mips *c)
    929{
    930	unsigned int config5, config5_dyn;
    931
    932	probe_gc0_config_dyn(config5, config5, config5_dyn,
    933			 MIPS_CONF_M | MIPS_CONF5_MVH | MIPS_CONF5_MRP);
    934
    935	if (config5 & MIPS_CONF5_MRP)
    936		c->guest.options |= MIPS_CPU_MAAR;
    937	if (config5_dyn & MIPS_CONF5_MRP)
    938		c->guest.options_dyn |= MIPS_CPU_MAAR;
    939
    940	if (config5 & MIPS_CONF5_LLB)
    941		c->guest.options |= MIPS_CPU_RW_LLB;
    942
    943	if (config5 & MIPS_CONF5_MVH)
    944		c->guest.options |= MIPS_CPU_MVH;
    945
    946	if (config5 & MIPS_CONF_M)
    947		c->guest.conf |= BIT(6);
    948	return config5 & MIPS_CONF_M;
    949}
    950
    951static inline void decode_guest_configs(struct cpuinfo_mips *c)
    952{
    953	unsigned int ok;
    954
    955	ok = decode_guest_config0(c);
    956	if (ok)
    957		ok = decode_guest_config1(c);
    958	if (ok)
    959		ok = decode_guest_config2(c);
    960	if (ok)
    961		ok = decode_guest_config3(c);
    962	if (ok)
    963		ok = decode_guest_config4(c);
    964	if (ok)
    965		decode_guest_config5(c);
    966}
    967
    968static inline void cpu_probe_guestctl0(struct cpuinfo_mips *c)
    969{
    970	unsigned int guestctl0, temp;
    971
    972	guestctl0 = read_c0_guestctl0();
    973
    974	if (guestctl0 & MIPS_GCTL0_G0E)
    975		c->options |= MIPS_CPU_GUESTCTL0EXT;
    976	if (guestctl0 & MIPS_GCTL0_G1)
    977		c->options |= MIPS_CPU_GUESTCTL1;
    978	if (guestctl0 & MIPS_GCTL0_G2)
    979		c->options |= MIPS_CPU_GUESTCTL2;
    980	if (!(guestctl0 & MIPS_GCTL0_RAD)) {
    981		c->options |= MIPS_CPU_GUESTID;
    982
    983		/*
    984		 * Probe for Direct Root to Guest (DRG). Set GuestCtl1.RID = 0
    985		 * first, otherwise all data accesses will be fully virtualised
    986		 * as if they were performed by guest mode.
    987		 */
    988		write_c0_guestctl1(0);
    989		tlbw_use_hazard();
    990
    991		write_c0_guestctl0(guestctl0 | MIPS_GCTL0_DRG);
    992		back_to_back_c0_hazard();
    993		temp = read_c0_guestctl0();
    994
    995		if (temp & MIPS_GCTL0_DRG) {
    996			write_c0_guestctl0(guestctl0);
    997			c->options |= MIPS_CPU_DRG;
    998		}
    999	}
   1000}
   1001
   1002static inline void cpu_probe_guestctl1(struct cpuinfo_mips *c)
   1003{
   1004	if (cpu_has_guestid) {
   1005		/* determine the number of bits of GuestID available */
   1006		write_c0_guestctl1(MIPS_GCTL1_ID);
   1007		back_to_back_c0_hazard();
   1008		c->guestid_mask = (read_c0_guestctl1() & MIPS_GCTL1_ID)
   1009						>> MIPS_GCTL1_ID_SHIFT;
   1010		write_c0_guestctl1(0);
   1011	}
   1012}
   1013
   1014static inline void cpu_probe_gtoffset(struct cpuinfo_mips *c)
   1015{
   1016	/* determine the number of bits of GTOffset available */
   1017	write_c0_gtoffset(0xffffffff);
   1018	back_to_back_c0_hazard();
   1019	c->gtoffset_mask = read_c0_gtoffset();
   1020	write_c0_gtoffset(0);
   1021}
   1022
   1023static inline void cpu_probe_vz(struct cpuinfo_mips *c)
   1024{
   1025	cpu_probe_guestctl0(c);
   1026	if (cpu_has_guestctl1)
   1027		cpu_probe_guestctl1(c);
   1028
   1029	cpu_probe_gtoffset(c);
   1030
   1031	decode_guest_configs(c);
   1032}
   1033
   1034#define R4K_OPTS (MIPS_CPU_TLB | MIPS_CPU_4KEX | MIPS_CPU_4K_CACHE \
   1035		| MIPS_CPU_COUNTER)
   1036
   1037static inline void cpu_probe_legacy(struct cpuinfo_mips *c, unsigned int cpu)
   1038{
   1039	switch (c->processor_id & PRID_IMP_MASK) {
   1040	case PRID_IMP_R2000:
   1041		c->cputype = CPU_R2000;
   1042		__cpu_name[cpu] = "R2000";
   1043		c->fpu_msk31 |= FPU_CSR_CONDX | FPU_CSR_FS;
   1044		c->options = MIPS_CPU_TLB | MIPS_CPU_3K_CACHE |
   1045			     MIPS_CPU_NOFPUEX;
   1046		if (__cpu_has_fpu())
   1047			c->options |= MIPS_CPU_FPU;
   1048		c->tlbsize = 64;
   1049		break;
   1050	case PRID_IMP_R3000:
   1051		if ((c->processor_id & PRID_REV_MASK) == PRID_REV_R3000A) {
   1052			if (cpu_has_confreg()) {
   1053				c->cputype = CPU_R3081E;
   1054				__cpu_name[cpu] = "R3081";
   1055			} else {
   1056				c->cputype = CPU_R3000A;
   1057				__cpu_name[cpu] = "R3000A";
   1058			}
   1059		} else {
   1060			c->cputype = CPU_R3000;
   1061			__cpu_name[cpu] = "R3000";
   1062		}
   1063		c->fpu_msk31 |= FPU_CSR_CONDX | FPU_CSR_FS;
   1064		c->options = MIPS_CPU_TLB | MIPS_CPU_3K_CACHE |
   1065			     MIPS_CPU_NOFPUEX;
   1066		if (__cpu_has_fpu())
   1067			c->options |= MIPS_CPU_FPU;
   1068		c->tlbsize = 64;
   1069		break;
   1070	case PRID_IMP_R4000:
   1071		if (read_c0_config() & CONF_SC) {
   1072			if ((c->processor_id & PRID_REV_MASK) >=
   1073			    PRID_REV_R4400) {
   1074				c->cputype = CPU_R4400PC;
   1075				__cpu_name[cpu] = "R4400PC";
   1076			} else {
   1077				c->cputype = CPU_R4000PC;
   1078				__cpu_name[cpu] = "R4000PC";
   1079			}
   1080		} else {
   1081			int cca = read_c0_config() & CONF_CM_CMASK;
   1082			int mc;
   1083
   1084			/*
   1085			 * SC and MC versions can't be reliably told apart,
   1086			 * but only the latter support coherent caching
   1087			 * modes so assume the firmware has set the KSEG0
   1088			 * coherency attribute reasonably (if uncached, we
   1089			 * assume SC).
   1090			 */
   1091			switch (cca) {
   1092			case CONF_CM_CACHABLE_CE:
   1093			case CONF_CM_CACHABLE_COW:
   1094			case CONF_CM_CACHABLE_CUW:
   1095				mc = 1;
   1096				break;
   1097			default:
   1098				mc = 0;
   1099				break;
   1100			}
   1101			if ((c->processor_id & PRID_REV_MASK) >=
   1102			    PRID_REV_R4400) {
   1103				c->cputype = mc ? CPU_R4400MC : CPU_R4400SC;
   1104				__cpu_name[cpu] = mc ? "R4400MC" : "R4400SC";
   1105			} else {
   1106				c->cputype = mc ? CPU_R4000MC : CPU_R4000SC;
   1107				__cpu_name[cpu] = mc ? "R4000MC" : "R4000SC";
   1108			}
   1109		}
   1110
   1111		set_isa(c, MIPS_CPU_ISA_III);
   1112		c->fpu_msk31 |= FPU_CSR_CONDX;
   1113		c->options = R4K_OPTS | MIPS_CPU_FPU | MIPS_CPU_32FPR |
   1114			     MIPS_CPU_WATCH | MIPS_CPU_VCE |
   1115			     MIPS_CPU_LLSC;
   1116		c->tlbsize = 48;
   1117		break;
   1118	case PRID_IMP_VR41XX:
   1119		set_isa(c, MIPS_CPU_ISA_III);
   1120		c->fpu_msk31 |= FPU_CSR_CONDX;
   1121		c->options = R4K_OPTS;
   1122		c->tlbsize = 32;
   1123		switch (c->processor_id & 0xf0) {
   1124		case PRID_REV_VR4111:
   1125			c->cputype = CPU_VR4111;
   1126			__cpu_name[cpu] = "NEC VR4111";
   1127			break;
   1128		case PRID_REV_VR4121:
   1129			c->cputype = CPU_VR4121;
   1130			__cpu_name[cpu] = "NEC VR4121";
   1131			break;
   1132		case PRID_REV_VR4122:
   1133			if ((c->processor_id & 0xf) < 0x3) {
   1134				c->cputype = CPU_VR4122;
   1135				__cpu_name[cpu] = "NEC VR4122";
   1136			} else {
   1137				c->cputype = CPU_VR4181A;
   1138				__cpu_name[cpu] = "NEC VR4181A";
   1139			}
   1140			break;
   1141		case PRID_REV_VR4130:
   1142			if ((c->processor_id & 0xf) < 0x4) {
   1143				c->cputype = CPU_VR4131;
   1144				__cpu_name[cpu] = "NEC VR4131";
   1145			} else {
   1146				c->cputype = CPU_VR4133;
   1147				c->options |= MIPS_CPU_LLSC;
   1148				__cpu_name[cpu] = "NEC VR4133";
   1149			}
   1150			break;
   1151		default:
   1152			printk(KERN_INFO "Unexpected CPU of NEC VR4100 series\n");
   1153			c->cputype = CPU_VR41XX;
   1154			__cpu_name[cpu] = "NEC Vr41xx";
   1155			break;
   1156		}
   1157		break;
   1158	case PRID_IMP_R4300:
   1159		c->cputype = CPU_R4300;
   1160		__cpu_name[cpu] = "R4300";
   1161		set_isa(c, MIPS_CPU_ISA_III);
   1162		c->fpu_msk31 |= FPU_CSR_CONDX;
   1163		c->options = R4K_OPTS | MIPS_CPU_FPU | MIPS_CPU_32FPR |
   1164			     MIPS_CPU_LLSC;
   1165		c->tlbsize = 32;
   1166		break;
   1167	case PRID_IMP_R4600:
   1168		c->cputype = CPU_R4600;
   1169		__cpu_name[cpu] = "R4600";
   1170		set_isa(c, MIPS_CPU_ISA_III);
   1171		c->fpu_msk31 |= FPU_CSR_CONDX;
   1172		c->options = R4K_OPTS | MIPS_CPU_FPU | MIPS_CPU_32FPR |
   1173			     MIPS_CPU_LLSC;
   1174		c->tlbsize = 48;
   1175		break;
   1176	#if 0
   1177	case PRID_IMP_R4650:
   1178		/*
   1179		 * This processor doesn't have an MMU, so it's not
   1180		 * "real easy" to run Linux on it. It is left purely
   1181		 * for documentation.  Commented out because it shares
   1182		 * it's c0_prid id number with the TX3900.
   1183		 */
   1184		c->cputype = CPU_R4650;
   1185		__cpu_name[cpu] = "R4650";
   1186		set_isa(c, MIPS_CPU_ISA_III);
   1187		c->fpu_msk31 |= FPU_CSR_CONDX;
   1188		c->options = R4K_OPTS | MIPS_CPU_FPU | MIPS_CPU_LLSC;
   1189		c->tlbsize = 48;
   1190		break;
   1191	#endif
   1192	case PRID_IMP_R4700:
   1193		c->cputype = CPU_R4700;
   1194		__cpu_name[cpu] = "R4700";
   1195		set_isa(c, MIPS_CPU_ISA_III);
   1196		c->fpu_msk31 |= FPU_CSR_CONDX;
   1197		c->options = R4K_OPTS | MIPS_CPU_FPU | MIPS_CPU_32FPR |
   1198			     MIPS_CPU_LLSC;
   1199		c->tlbsize = 48;
   1200		break;
   1201	case PRID_IMP_TX49:
   1202		c->cputype = CPU_TX49XX;
   1203		__cpu_name[cpu] = "R49XX";
   1204		set_isa(c, MIPS_CPU_ISA_III);
   1205		c->fpu_msk31 |= FPU_CSR_CONDX;
   1206		c->options = R4K_OPTS | MIPS_CPU_LLSC;
   1207		if (!(c->processor_id & 0x08))
   1208			c->options |= MIPS_CPU_FPU | MIPS_CPU_32FPR;
   1209		c->tlbsize = 48;
   1210		break;
   1211	case PRID_IMP_R5000:
   1212		c->cputype = CPU_R5000;
   1213		__cpu_name[cpu] = "R5000";
   1214		set_isa(c, MIPS_CPU_ISA_IV);
   1215		c->options = R4K_OPTS | MIPS_CPU_FPU | MIPS_CPU_32FPR |
   1216			     MIPS_CPU_LLSC;
   1217		c->tlbsize = 48;
   1218		break;
   1219	case PRID_IMP_R5500:
   1220		c->cputype = CPU_R5500;
   1221		__cpu_name[cpu] = "R5500";
   1222		set_isa(c, MIPS_CPU_ISA_IV);
   1223		c->options = R4K_OPTS | MIPS_CPU_FPU | MIPS_CPU_32FPR |
   1224			     MIPS_CPU_WATCH | MIPS_CPU_LLSC;
   1225		c->tlbsize = 48;
   1226		break;
   1227	case PRID_IMP_NEVADA:
   1228		c->cputype = CPU_NEVADA;
   1229		__cpu_name[cpu] = "Nevada";
   1230		set_isa(c, MIPS_CPU_ISA_IV);
   1231		c->options = R4K_OPTS | MIPS_CPU_FPU | MIPS_CPU_32FPR |
   1232			     MIPS_CPU_DIVEC | MIPS_CPU_LLSC;
   1233		c->tlbsize = 48;
   1234		break;
   1235	case PRID_IMP_RM7000:
   1236		c->cputype = CPU_RM7000;
   1237		__cpu_name[cpu] = "RM7000";
   1238		set_isa(c, MIPS_CPU_ISA_IV);
   1239		c->options = R4K_OPTS | MIPS_CPU_FPU | MIPS_CPU_32FPR |
   1240			     MIPS_CPU_LLSC;
   1241		/*
   1242		 * Undocumented RM7000:	 Bit 29 in the info register of
   1243		 * the RM7000 v2.0 indicates if the TLB has 48 or 64
   1244		 * entries.
   1245		 *
   1246		 * 29	   1 =>	   64 entry JTLB
   1247		 *	   0 =>	   48 entry JTLB
   1248		 */
   1249		c->tlbsize = (read_c0_info() & (1 << 29)) ? 64 : 48;
   1250		break;
   1251	case PRID_IMP_R10000:
   1252		c->cputype = CPU_R10000;
   1253		__cpu_name[cpu] = "R10000";
   1254		set_isa(c, MIPS_CPU_ISA_IV);
   1255		c->options = MIPS_CPU_TLB | MIPS_CPU_4K_CACHE | MIPS_CPU_4KEX |
   1256			     MIPS_CPU_FPU | MIPS_CPU_32FPR |
   1257			     MIPS_CPU_COUNTER | MIPS_CPU_WATCH |
   1258			     MIPS_CPU_LLSC;
   1259		c->tlbsize = 64;
   1260		break;
   1261	case PRID_IMP_R12000:
   1262		c->cputype = CPU_R12000;
   1263		__cpu_name[cpu] = "R12000";
   1264		set_isa(c, MIPS_CPU_ISA_IV);
   1265		c->options = MIPS_CPU_TLB | MIPS_CPU_4K_CACHE | MIPS_CPU_4KEX |
   1266			     MIPS_CPU_FPU | MIPS_CPU_32FPR |
   1267			     MIPS_CPU_COUNTER | MIPS_CPU_WATCH |
   1268			     MIPS_CPU_LLSC;
   1269		c->tlbsize = 64;
   1270		write_c0_r10k_diag(read_c0_r10k_diag() | R10K_DIAG_E_GHIST);
   1271		break;
   1272	case PRID_IMP_R14000:
   1273		if (((c->processor_id >> 4) & 0x0f) > 2) {
   1274			c->cputype = CPU_R16000;
   1275			__cpu_name[cpu] = "R16000";
   1276		} else {
   1277			c->cputype = CPU_R14000;
   1278			__cpu_name[cpu] = "R14000";
   1279		}
   1280		set_isa(c, MIPS_CPU_ISA_IV);
   1281		c->options = MIPS_CPU_TLB | MIPS_CPU_4K_CACHE | MIPS_CPU_4KEX |
   1282			     MIPS_CPU_FPU | MIPS_CPU_32FPR |
   1283			     MIPS_CPU_COUNTER | MIPS_CPU_WATCH |
   1284			     MIPS_CPU_LLSC;
   1285		c->tlbsize = 64;
   1286		write_c0_r10k_diag(read_c0_r10k_diag() | R10K_DIAG_E_GHIST);
   1287		break;
   1288	case PRID_IMP_LOONGSON_64C:  /* Loongson-2/3 */
   1289		switch (c->processor_id & PRID_REV_MASK) {
   1290		case PRID_REV_LOONGSON2E:
   1291			c->cputype = CPU_LOONGSON2EF;
   1292			__cpu_name[cpu] = "ICT Loongson-2";
   1293			set_elf_platform(cpu, "loongson2e");
   1294			set_isa(c, MIPS_CPU_ISA_III);
   1295			c->fpu_msk31 |= FPU_CSR_CONDX;
   1296			break;
   1297		case PRID_REV_LOONGSON2F:
   1298			c->cputype = CPU_LOONGSON2EF;
   1299			__cpu_name[cpu] = "ICT Loongson-2";
   1300			set_elf_platform(cpu, "loongson2f");
   1301			set_isa(c, MIPS_CPU_ISA_III);
   1302			c->fpu_msk31 |= FPU_CSR_CONDX;
   1303			break;
   1304		case PRID_REV_LOONGSON3A_R1:
   1305			c->cputype = CPU_LOONGSON64;
   1306			__cpu_name[cpu] = "ICT Loongson-3";
   1307			set_elf_platform(cpu, "loongson3a");
   1308			set_isa(c, MIPS_CPU_ISA_M64R1);
   1309			c->ases |= (MIPS_ASE_LOONGSON_MMI | MIPS_ASE_LOONGSON_CAM |
   1310				MIPS_ASE_LOONGSON_EXT);
   1311			break;
   1312		case PRID_REV_LOONGSON3B_R1:
   1313		case PRID_REV_LOONGSON3B_R2:
   1314			c->cputype = CPU_LOONGSON64;
   1315			__cpu_name[cpu] = "ICT Loongson-3";
   1316			set_elf_platform(cpu, "loongson3b");
   1317			set_isa(c, MIPS_CPU_ISA_M64R1);
   1318			c->ases |= (MIPS_ASE_LOONGSON_MMI | MIPS_ASE_LOONGSON_CAM |
   1319				MIPS_ASE_LOONGSON_EXT);
   1320			break;
   1321		}
   1322
   1323		c->options = R4K_OPTS |
   1324			     MIPS_CPU_FPU | MIPS_CPU_LLSC |
   1325			     MIPS_CPU_32FPR;
   1326		c->tlbsize = 64;
   1327		set_cpu_asid_mask(c, MIPS_ENTRYHI_ASID);
   1328		c->writecombine = _CACHE_UNCACHED_ACCELERATED;
   1329		break;
   1330	case PRID_IMP_LOONGSON_32:  /* Loongson-1 */
   1331		decode_configs(c);
   1332
   1333		c->cputype = CPU_LOONGSON32;
   1334
   1335		switch (c->processor_id & PRID_REV_MASK) {
   1336		case PRID_REV_LOONGSON1B:
   1337			__cpu_name[cpu] = "Loongson 1B";
   1338			break;
   1339		}
   1340
   1341		break;
   1342	}
   1343}
   1344
   1345static inline void cpu_probe_mips(struct cpuinfo_mips *c, unsigned int cpu)
   1346{
   1347	c->writecombine = _CACHE_UNCACHED_ACCELERATED;
   1348	switch (c->processor_id & PRID_IMP_MASK) {
   1349	case PRID_IMP_QEMU_GENERIC:
   1350		c->writecombine = _CACHE_UNCACHED;
   1351		c->cputype = CPU_QEMU_GENERIC;
   1352		__cpu_name[cpu] = "MIPS GENERIC QEMU";
   1353		break;
   1354	case PRID_IMP_4KC:
   1355		c->cputype = CPU_4KC;
   1356		c->writecombine = _CACHE_UNCACHED;
   1357		__cpu_name[cpu] = "MIPS 4Kc";
   1358		break;
   1359	case PRID_IMP_4KEC:
   1360	case PRID_IMP_4KECR2:
   1361		c->cputype = CPU_4KEC;
   1362		c->writecombine = _CACHE_UNCACHED;
   1363		__cpu_name[cpu] = "MIPS 4KEc";
   1364		break;
   1365	case PRID_IMP_4KSC:
   1366	case PRID_IMP_4KSD:
   1367		c->cputype = CPU_4KSC;
   1368		c->writecombine = _CACHE_UNCACHED;
   1369		__cpu_name[cpu] = "MIPS 4KSc";
   1370		break;
   1371	case PRID_IMP_5KC:
   1372		c->cputype = CPU_5KC;
   1373		c->writecombine = _CACHE_UNCACHED;
   1374		__cpu_name[cpu] = "MIPS 5Kc";
   1375		break;
   1376	case PRID_IMP_5KE:
   1377		c->cputype = CPU_5KE;
   1378		c->writecombine = _CACHE_UNCACHED;
   1379		__cpu_name[cpu] = "MIPS 5KE";
   1380		break;
   1381	case PRID_IMP_20KC:
   1382		c->cputype = CPU_20KC;
   1383		c->writecombine = _CACHE_UNCACHED;
   1384		__cpu_name[cpu] = "MIPS 20Kc";
   1385		break;
   1386	case PRID_IMP_24K:
   1387		c->cputype = CPU_24K;
   1388		c->writecombine = _CACHE_UNCACHED;
   1389		__cpu_name[cpu] = "MIPS 24Kc";
   1390		break;
   1391	case PRID_IMP_24KE:
   1392		c->cputype = CPU_24K;
   1393		c->writecombine = _CACHE_UNCACHED;
   1394		__cpu_name[cpu] = "MIPS 24KEc";
   1395		break;
   1396	case PRID_IMP_25KF:
   1397		c->cputype = CPU_25KF;
   1398		c->writecombine = _CACHE_UNCACHED;
   1399		__cpu_name[cpu] = "MIPS 25Kc";
   1400		break;
   1401	case PRID_IMP_34K:
   1402		c->cputype = CPU_34K;
   1403		c->writecombine = _CACHE_UNCACHED;
   1404		__cpu_name[cpu] = "MIPS 34Kc";
   1405		cpu_set_mt_per_tc_perf(c);
   1406		break;
   1407	case PRID_IMP_74K:
   1408		c->cputype = CPU_74K;
   1409		c->writecombine = _CACHE_UNCACHED;
   1410		__cpu_name[cpu] = "MIPS 74Kc";
   1411		break;
   1412	case PRID_IMP_M14KC:
   1413		c->cputype = CPU_M14KC;
   1414		c->writecombine = _CACHE_UNCACHED;
   1415		__cpu_name[cpu] = "MIPS M14Kc";
   1416		break;
   1417	case PRID_IMP_M14KEC:
   1418		c->cputype = CPU_M14KEC;
   1419		c->writecombine = _CACHE_UNCACHED;
   1420		__cpu_name[cpu] = "MIPS M14KEc";
   1421		break;
   1422	case PRID_IMP_1004K:
   1423		c->cputype = CPU_1004K;
   1424		c->writecombine = _CACHE_UNCACHED;
   1425		__cpu_name[cpu] = "MIPS 1004Kc";
   1426		cpu_set_mt_per_tc_perf(c);
   1427		break;
   1428	case PRID_IMP_1074K:
   1429		c->cputype = CPU_1074K;
   1430		c->writecombine = _CACHE_UNCACHED;
   1431		__cpu_name[cpu] = "MIPS 1074Kc";
   1432		break;
   1433	case PRID_IMP_INTERAPTIV_UP:
   1434		c->cputype = CPU_INTERAPTIV;
   1435		__cpu_name[cpu] = "MIPS interAptiv";
   1436		cpu_set_mt_per_tc_perf(c);
   1437		break;
   1438	case PRID_IMP_INTERAPTIV_MP:
   1439		c->cputype = CPU_INTERAPTIV;
   1440		__cpu_name[cpu] = "MIPS interAptiv (multi)";
   1441		cpu_set_mt_per_tc_perf(c);
   1442		break;
   1443	case PRID_IMP_PROAPTIV_UP:
   1444		c->cputype = CPU_PROAPTIV;
   1445		__cpu_name[cpu] = "MIPS proAptiv";
   1446		break;
   1447	case PRID_IMP_PROAPTIV_MP:
   1448		c->cputype = CPU_PROAPTIV;
   1449		__cpu_name[cpu] = "MIPS proAptiv (multi)";
   1450		break;
   1451	case PRID_IMP_P5600:
   1452		c->cputype = CPU_P5600;
   1453		__cpu_name[cpu] = "MIPS P5600";
   1454		break;
   1455	case PRID_IMP_P6600:
   1456		c->cputype = CPU_P6600;
   1457		__cpu_name[cpu] = "MIPS P6600";
   1458		break;
   1459	case PRID_IMP_I6400:
   1460		c->cputype = CPU_I6400;
   1461		__cpu_name[cpu] = "MIPS I6400";
   1462		break;
   1463	case PRID_IMP_I6500:
   1464		c->cputype = CPU_I6500;
   1465		__cpu_name[cpu] = "MIPS I6500";
   1466		break;
   1467	case PRID_IMP_M5150:
   1468		c->cputype = CPU_M5150;
   1469		__cpu_name[cpu] = "MIPS M5150";
   1470		break;
   1471	case PRID_IMP_M6250:
   1472		c->cputype = CPU_M6250;
   1473		__cpu_name[cpu] = "MIPS M6250";
   1474		break;
   1475	}
   1476
   1477	decode_configs(c);
   1478
   1479	spram_config();
   1480
   1481	mm_config(c);
   1482
   1483	switch (__get_cpu_type(c->cputype)) {
   1484	case CPU_M5150:
   1485	case CPU_P5600:
   1486		set_isa(c, MIPS_CPU_ISA_M32R5);
   1487		break;
   1488	case CPU_I6500:
   1489		c->options |= MIPS_CPU_SHARED_FTLB_ENTRIES;
   1490		fallthrough;
   1491	case CPU_I6400:
   1492		c->options |= MIPS_CPU_SHARED_FTLB_RAM;
   1493		fallthrough;
   1494	default:
   1495		break;
   1496	}
   1497
   1498	/* Recent MIPS cores use the implementation-dependent ExcCode 16 for
   1499	 * cache/FTLB parity exceptions.
   1500	 */
   1501	switch (__get_cpu_type(c->cputype)) {
   1502	case CPU_PROAPTIV:
   1503	case CPU_P5600:
   1504	case CPU_P6600:
   1505	case CPU_I6400:
   1506	case CPU_I6500:
   1507		c->options |= MIPS_CPU_FTLBPAREX;
   1508		break;
   1509	}
   1510}
   1511
   1512static inline void cpu_probe_alchemy(struct cpuinfo_mips *c, unsigned int cpu)
   1513{
   1514	decode_configs(c);
   1515	switch (c->processor_id & PRID_IMP_MASK) {
   1516	case PRID_IMP_AU1_REV1:
   1517	case PRID_IMP_AU1_REV2:
   1518		c->cputype = CPU_ALCHEMY;
   1519		switch ((c->processor_id >> 24) & 0xff) {
   1520		case 0:
   1521			__cpu_name[cpu] = "Au1000";
   1522			break;
   1523		case 1:
   1524			__cpu_name[cpu] = "Au1500";
   1525			break;
   1526		case 2:
   1527			__cpu_name[cpu] = "Au1100";
   1528			break;
   1529		case 3:
   1530			__cpu_name[cpu] = "Au1550";
   1531			break;
   1532		case 4:
   1533			__cpu_name[cpu] = "Au1200";
   1534			if ((c->processor_id & PRID_REV_MASK) == 2)
   1535				__cpu_name[cpu] = "Au1250";
   1536			break;
   1537		case 5:
   1538			__cpu_name[cpu] = "Au1210";
   1539			break;
   1540		default:
   1541			__cpu_name[cpu] = "Au1xxx";
   1542			break;
   1543		}
   1544		break;
   1545	}
   1546}
   1547
   1548static inline void cpu_probe_sibyte(struct cpuinfo_mips *c, unsigned int cpu)
   1549{
   1550	decode_configs(c);
   1551
   1552	c->writecombine = _CACHE_UNCACHED_ACCELERATED;
   1553	switch (c->processor_id & PRID_IMP_MASK) {
   1554	case PRID_IMP_SB1:
   1555		c->cputype = CPU_SB1;
   1556		__cpu_name[cpu] = "SiByte SB1";
   1557		/* FPU in pass1 is known to have issues. */
   1558		if ((c->processor_id & PRID_REV_MASK) < 0x02)
   1559			c->options &= ~(MIPS_CPU_FPU | MIPS_CPU_32FPR);
   1560		break;
   1561	case PRID_IMP_SB1A:
   1562		c->cputype = CPU_SB1A;
   1563		__cpu_name[cpu] = "SiByte SB1A";
   1564		break;
   1565	}
   1566}
   1567
   1568static inline void cpu_probe_sandcraft(struct cpuinfo_mips *c, unsigned int cpu)
   1569{
   1570	decode_configs(c);
   1571	switch (c->processor_id & PRID_IMP_MASK) {
   1572	case PRID_IMP_SR71000:
   1573		c->cputype = CPU_SR71000;
   1574		__cpu_name[cpu] = "Sandcraft SR71000";
   1575		c->scache.ways = 8;
   1576		c->tlbsize = 64;
   1577		break;
   1578	}
   1579}
   1580
   1581static inline void cpu_probe_nxp(struct cpuinfo_mips *c, unsigned int cpu)
   1582{
   1583	decode_configs(c);
   1584	switch (c->processor_id & PRID_IMP_MASK) {
   1585	case PRID_IMP_PR4450:
   1586		c->cputype = CPU_PR4450;
   1587		__cpu_name[cpu] = "Philips PR4450";
   1588		set_isa(c, MIPS_CPU_ISA_M32R1);
   1589		break;
   1590	}
   1591}
   1592
   1593static inline void cpu_probe_broadcom(struct cpuinfo_mips *c, unsigned int cpu)
   1594{
   1595	decode_configs(c);
   1596	switch (c->processor_id & PRID_IMP_MASK) {
   1597	case PRID_IMP_BMIPS32_REV4:
   1598	case PRID_IMP_BMIPS32_REV8:
   1599		c->cputype = CPU_BMIPS32;
   1600		__cpu_name[cpu] = "Broadcom BMIPS32";
   1601		set_elf_platform(cpu, "bmips32");
   1602		break;
   1603	case PRID_IMP_BMIPS3300:
   1604	case PRID_IMP_BMIPS3300_ALT:
   1605	case PRID_IMP_BMIPS3300_BUG:
   1606		c->cputype = CPU_BMIPS3300;
   1607		__cpu_name[cpu] = "Broadcom BMIPS3300";
   1608		set_elf_platform(cpu, "bmips3300");
   1609		reserve_exception_space(0x400, VECTORSPACING * 64);
   1610		break;
   1611	case PRID_IMP_BMIPS43XX: {
   1612		int rev = c->processor_id & PRID_REV_MASK;
   1613
   1614		if (rev >= PRID_REV_BMIPS4380_LO &&
   1615				rev <= PRID_REV_BMIPS4380_HI) {
   1616			c->cputype = CPU_BMIPS4380;
   1617			__cpu_name[cpu] = "Broadcom BMIPS4380";
   1618			set_elf_platform(cpu, "bmips4380");
   1619			c->options |= MIPS_CPU_RIXI;
   1620			reserve_exception_space(0x400, VECTORSPACING * 64);
   1621		} else {
   1622			c->cputype = CPU_BMIPS4350;
   1623			__cpu_name[cpu] = "Broadcom BMIPS4350";
   1624			set_elf_platform(cpu, "bmips4350");
   1625		}
   1626		break;
   1627	}
   1628	case PRID_IMP_BMIPS5000:
   1629	case PRID_IMP_BMIPS5200:
   1630		c->cputype = CPU_BMIPS5000;
   1631		if ((c->processor_id & PRID_IMP_MASK) == PRID_IMP_BMIPS5200)
   1632			__cpu_name[cpu] = "Broadcom BMIPS5200";
   1633		else
   1634			__cpu_name[cpu] = "Broadcom BMIPS5000";
   1635		set_elf_platform(cpu, "bmips5000");
   1636		c->options |= MIPS_CPU_ULRI | MIPS_CPU_RIXI;
   1637		reserve_exception_space(0x1000, VECTORSPACING * 64);
   1638		break;
   1639	}
   1640}
   1641
   1642static inline void cpu_probe_cavium(struct cpuinfo_mips *c, unsigned int cpu)
   1643{
   1644	decode_configs(c);
   1645	switch (c->processor_id & PRID_IMP_MASK) {
   1646	case PRID_IMP_CAVIUM_CN38XX:
   1647	case PRID_IMP_CAVIUM_CN31XX:
   1648	case PRID_IMP_CAVIUM_CN30XX:
   1649		c->cputype = CPU_CAVIUM_OCTEON;
   1650		__cpu_name[cpu] = "Cavium Octeon";
   1651		goto platform;
   1652	case PRID_IMP_CAVIUM_CN58XX:
   1653	case PRID_IMP_CAVIUM_CN56XX:
   1654	case PRID_IMP_CAVIUM_CN50XX:
   1655	case PRID_IMP_CAVIUM_CN52XX:
   1656		c->cputype = CPU_CAVIUM_OCTEON_PLUS;
   1657		__cpu_name[cpu] = "Cavium Octeon+";
   1658platform:
   1659		set_elf_platform(cpu, "octeon");
   1660		break;
   1661	case PRID_IMP_CAVIUM_CN61XX:
   1662	case PRID_IMP_CAVIUM_CN63XX:
   1663	case PRID_IMP_CAVIUM_CN66XX:
   1664	case PRID_IMP_CAVIUM_CN68XX:
   1665	case PRID_IMP_CAVIUM_CNF71XX:
   1666		c->cputype = CPU_CAVIUM_OCTEON2;
   1667		__cpu_name[cpu] = "Cavium Octeon II";
   1668		set_elf_platform(cpu, "octeon2");
   1669		break;
   1670	case PRID_IMP_CAVIUM_CN70XX:
   1671	case PRID_IMP_CAVIUM_CN73XX:
   1672	case PRID_IMP_CAVIUM_CNF75XX:
   1673	case PRID_IMP_CAVIUM_CN78XX:
   1674		c->cputype = CPU_CAVIUM_OCTEON3;
   1675		__cpu_name[cpu] = "Cavium Octeon III";
   1676		set_elf_platform(cpu, "octeon3");
   1677		break;
   1678	default:
   1679		printk(KERN_INFO "Unknown Octeon chip!\n");
   1680		c->cputype = CPU_UNKNOWN;
   1681		break;
   1682	}
   1683}
   1684
   1685#ifdef CONFIG_CPU_LOONGSON64
   1686#include <loongson_regs.h>
   1687
   1688static inline void decode_cpucfg(struct cpuinfo_mips *c)
   1689{
   1690	u32 cfg1 = read_cpucfg(LOONGSON_CFG1);
   1691	u32 cfg2 = read_cpucfg(LOONGSON_CFG2);
   1692	u32 cfg3 = read_cpucfg(LOONGSON_CFG3);
   1693
   1694	if (cfg1 & LOONGSON_CFG1_MMI)
   1695		c->ases |= MIPS_ASE_LOONGSON_MMI;
   1696
   1697	if (cfg2 & LOONGSON_CFG2_LEXT1)
   1698		c->ases |= MIPS_ASE_LOONGSON_EXT;
   1699
   1700	if (cfg2 & LOONGSON_CFG2_LEXT2)
   1701		c->ases |= MIPS_ASE_LOONGSON_EXT2;
   1702
   1703	if (cfg2 & LOONGSON_CFG2_LSPW) {
   1704		c->options |= MIPS_CPU_LDPTE;
   1705		c->guest.options |= MIPS_CPU_LDPTE;
   1706	}
   1707
   1708	if (cfg3 & LOONGSON_CFG3_LCAMP)
   1709		c->ases |= MIPS_ASE_LOONGSON_CAM;
   1710}
   1711
   1712static inline void cpu_probe_loongson(struct cpuinfo_mips *c, unsigned int cpu)
   1713{
   1714	/* All Loongson processors covered here define ExcCode 16 as GSExc. */
   1715	c->options |= MIPS_CPU_GSEXCEX;
   1716
   1717	switch (c->processor_id & PRID_IMP_MASK) {
   1718	case PRID_IMP_LOONGSON_64R: /* Loongson-64 Reduced */
   1719		switch (c->processor_id & PRID_REV_MASK) {
   1720		case PRID_REV_LOONGSON2K_R1_0:
   1721		case PRID_REV_LOONGSON2K_R1_1:
   1722		case PRID_REV_LOONGSON2K_R1_2:
   1723		case PRID_REV_LOONGSON2K_R1_3:
   1724			c->cputype = CPU_LOONGSON64;
   1725			__cpu_name[cpu] = "Loongson-2K";
   1726			set_elf_platform(cpu, "gs264e");
   1727			set_isa(c, MIPS_CPU_ISA_M64R2);
   1728			break;
   1729		}
   1730		c->ases |= (MIPS_ASE_LOONGSON_MMI | MIPS_ASE_LOONGSON_EXT |
   1731				MIPS_ASE_LOONGSON_EXT2);
   1732		break;
   1733	case PRID_IMP_LOONGSON_64C:  /* Loongson-3 Classic */
   1734		switch (c->processor_id & PRID_REV_MASK) {
   1735		case PRID_REV_LOONGSON3A_R2_0:
   1736		case PRID_REV_LOONGSON3A_R2_1:
   1737			c->cputype = CPU_LOONGSON64;
   1738			__cpu_name[cpu] = "ICT Loongson-3";
   1739			set_elf_platform(cpu, "loongson3a");
   1740			set_isa(c, MIPS_CPU_ISA_M64R2);
   1741			break;
   1742		case PRID_REV_LOONGSON3A_R3_0:
   1743		case PRID_REV_LOONGSON3A_R3_1:
   1744			c->cputype = CPU_LOONGSON64;
   1745			__cpu_name[cpu] = "ICT Loongson-3";
   1746			set_elf_platform(cpu, "loongson3a");
   1747			set_isa(c, MIPS_CPU_ISA_M64R2);
   1748			break;
   1749		}
   1750		/*
   1751		 * Loongson-3 Classic did not implement MIPS standard TLBINV
   1752		 * but implemented TLBINVF and EHINV. As currently we're only
   1753		 * using these two features, enable MIPS_CPU_TLBINV as well.
   1754		 *
   1755		 * Also some early Loongson-3A2000 had wrong TLB type in Config
   1756		 * register, we correct it here.
   1757		 */
   1758		c->options |= MIPS_CPU_FTLB | MIPS_CPU_TLBINV | MIPS_CPU_LDPTE;
   1759		c->ases |= (MIPS_ASE_LOONGSON_MMI | MIPS_ASE_LOONGSON_CAM |
   1760			MIPS_ASE_LOONGSON_EXT | MIPS_ASE_LOONGSON_EXT2);
   1761		c->ases &= ~MIPS_ASE_VZ; /* VZ of Loongson-3A2000/3000 is incomplete */
   1762		break;
   1763	case PRID_IMP_LOONGSON_64G:
   1764		c->cputype = CPU_LOONGSON64;
   1765		__cpu_name[cpu] = "ICT Loongson-3";
   1766		set_elf_platform(cpu, "loongson3a");
   1767		set_isa(c, MIPS_CPU_ISA_M64R2);
   1768		decode_cpucfg(c);
   1769		break;
   1770	default:
   1771		panic("Unknown Loongson Processor ID!");
   1772		break;
   1773	}
   1774
   1775	decode_configs(c);
   1776}
   1777#else
   1778static inline void cpu_probe_loongson(struct cpuinfo_mips *c, unsigned int cpu) { }
   1779#endif
   1780
   1781static inline void cpu_probe_ingenic(struct cpuinfo_mips *c, unsigned int cpu)
   1782{
   1783	decode_configs(c);
   1784
   1785	/*
   1786	 * XBurst misses a config2 register, so config3 decode was skipped in
   1787	 * decode_configs().
   1788	 */
   1789	decode_config3(c);
   1790
   1791	/* XBurst does not implement the CP0 counter. */
   1792	c->options &= ~MIPS_CPU_COUNTER;
   1793	BUG_ON(__builtin_constant_p(cpu_has_counter) && cpu_has_counter);
   1794
   1795	/* XBurst has virtually tagged icache */
   1796	c->icache.flags |= MIPS_CACHE_VTAG;
   1797
   1798	switch (c->processor_id & PRID_IMP_MASK) {
   1799
   1800	/* XBurst®1 with MXU1.0/MXU1.1 SIMD ISA */
   1801	case PRID_IMP_XBURST_REV1:
   1802
   1803		/*
   1804		 * The XBurst core by default attempts to avoid branch target
   1805		 * buffer lookups by detecting & special casing loops. This
   1806		 * feature will cause BogoMIPS and lpj calculate in error.
   1807		 * Set cp0 config7 bit 4 to disable this feature.
   1808		 */
   1809		set_c0_config7(MIPS_CONF7_BTB_LOOP_EN);
   1810
   1811		switch (c->processor_id & PRID_COMP_MASK) {
   1812
   1813		/*
   1814		 * The config0 register in the XBurst CPUs with a processor ID of
   1815		 * PRID_COMP_INGENIC_D0 report themselves as MIPS32r2 compatible,
   1816		 * but they don't actually support this ISA.
   1817		 */
   1818		case PRID_COMP_INGENIC_D0:
   1819			c->isa_level &= ~MIPS_CPU_ISA_M32R2;
   1820
   1821			/* FPU is not properly detected on JZ4760(B). */
   1822			if (c->processor_id == 0x2ed0024f)
   1823				c->options |= MIPS_CPU_FPU;
   1824
   1825			fallthrough;
   1826
   1827		/*
   1828		 * The config0 register in the XBurst CPUs with a processor ID of
   1829		 * PRID_COMP_INGENIC_D0 or PRID_COMP_INGENIC_D1 has an abandoned
   1830		 * huge page tlb mode, this mode is not compatible with the MIPS
   1831		 * standard, it will cause tlbmiss and into an infinite loop
   1832		 * (line 21 in the tlb-funcs.S) when starting the init process.
   1833		 * After chip reset, the default is HPTLB mode, Write 0xa9000000
   1834		 * to cp0 register 5 sel 4 to switch back to VTLB mode to prevent
   1835		 * getting stuck.
   1836		 */
   1837		case PRID_COMP_INGENIC_D1:
   1838			write_c0_page_ctrl(XBURST_PAGECTRL_HPTLB_DIS);
   1839			break;
   1840
   1841		default:
   1842			break;
   1843		}
   1844		fallthrough;
   1845
   1846	/* XBurst®1 with MXU2.0 SIMD ISA */
   1847	case PRID_IMP_XBURST_REV2:
   1848		/* Ingenic uses the WA bit to achieve write-combine memory writes */
   1849		c->writecombine = _CACHE_CACHABLE_WA;
   1850		c->cputype = CPU_XBURST;
   1851		__cpu_name[cpu] = "Ingenic XBurst";
   1852		break;
   1853
   1854	/* XBurst®2 with MXU2.1 SIMD ISA */
   1855	case PRID_IMP_XBURST2:
   1856		c->cputype = CPU_XBURST;
   1857		__cpu_name[cpu] = "Ingenic XBurst II";
   1858		break;
   1859
   1860	default:
   1861		panic("Unknown Ingenic Processor ID!");
   1862		break;
   1863	}
   1864}
   1865
   1866#ifdef CONFIG_64BIT
   1867/* For use by uaccess.h */
   1868u64 __ua_limit;
   1869EXPORT_SYMBOL(__ua_limit);
   1870#endif
   1871
   1872const char *__cpu_name[NR_CPUS];
   1873const char *__elf_platform;
   1874const char *__elf_base_platform;
   1875
   1876void cpu_probe(void)
   1877{
   1878	struct cpuinfo_mips *c = &current_cpu_data;
   1879	unsigned int cpu = smp_processor_id();
   1880
   1881	/*
   1882	 * Set a default elf platform, cpu probe may later
   1883	 * overwrite it with a more precise value
   1884	 */
   1885	set_elf_platform(cpu, "mips");
   1886
   1887	c->processor_id = PRID_IMP_UNKNOWN;
   1888	c->fpu_id	= FPIR_IMP_NONE;
   1889	c->cputype	= CPU_UNKNOWN;
   1890	c->writecombine = _CACHE_UNCACHED;
   1891
   1892	c->fpu_csr31	= FPU_CSR_RN;
   1893	c->fpu_msk31	= FPU_CSR_RSVD | FPU_CSR_ABS2008 | FPU_CSR_NAN2008;
   1894
   1895	c->processor_id = read_c0_prid();
   1896	switch (c->processor_id & PRID_COMP_MASK) {
   1897	case PRID_COMP_LEGACY:
   1898		cpu_probe_legacy(c, cpu);
   1899		break;
   1900	case PRID_COMP_MIPS:
   1901		cpu_probe_mips(c, cpu);
   1902		break;
   1903	case PRID_COMP_ALCHEMY:
   1904		cpu_probe_alchemy(c, cpu);
   1905		break;
   1906	case PRID_COMP_SIBYTE:
   1907		cpu_probe_sibyte(c, cpu);
   1908		break;
   1909	case PRID_COMP_BROADCOM:
   1910		cpu_probe_broadcom(c, cpu);
   1911		break;
   1912	case PRID_COMP_SANDCRAFT:
   1913		cpu_probe_sandcraft(c, cpu);
   1914		break;
   1915	case PRID_COMP_NXP:
   1916		cpu_probe_nxp(c, cpu);
   1917		break;
   1918	case PRID_COMP_CAVIUM:
   1919		cpu_probe_cavium(c, cpu);
   1920		break;
   1921	case PRID_COMP_LOONGSON:
   1922		cpu_probe_loongson(c, cpu);
   1923		break;
   1924	case PRID_COMP_INGENIC_13:
   1925	case PRID_COMP_INGENIC_D0:
   1926	case PRID_COMP_INGENIC_D1:
   1927	case PRID_COMP_INGENIC_E1:
   1928		cpu_probe_ingenic(c, cpu);
   1929		break;
   1930	}
   1931
   1932	BUG_ON(!__cpu_name[cpu]);
   1933	BUG_ON(c->cputype == CPU_UNKNOWN);
   1934
   1935	/*
   1936	 * Platform code can force the cpu type to optimize code
   1937	 * generation. In that case be sure the cpu type is correctly
   1938	 * manually setup otherwise it could trigger some nasty bugs.
   1939	 */
   1940	BUG_ON(current_cpu_type() != c->cputype);
   1941
   1942	if (cpu_has_rixi) {
   1943		/* Enable the RIXI exceptions */
   1944		set_c0_pagegrain(PG_IEC);
   1945		back_to_back_c0_hazard();
   1946		/* Verify the IEC bit is set */
   1947		if (read_c0_pagegrain() & PG_IEC)
   1948			c->options |= MIPS_CPU_RIXIEX;
   1949	}
   1950
   1951	if (mips_fpu_disabled)
   1952		c->options &= ~MIPS_CPU_FPU;
   1953
   1954	if (mips_dsp_disabled)
   1955		c->ases &= ~(MIPS_ASE_DSP | MIPS_ASE_DSP2P);
   1956
   1957	if (mips_htw_disabled) {
   1958		c->options &= ~MIPS_CPU_HTW;
   1959		write_c0_pwctl(read_c0_pwctl() &
   1960			       ~(1 << MIPS_PWCTL_PWEN_SHIFT));
   1961	}
   1962
   1963	if (c->options & MIPS_CPU_FPU)
   1964		cpu_set_fpu_opts(c);
   1965	else
   1966		cpu_set_nofpu_opts(c);
   1967
   1968	if (cpu_has_mips_r2_r6) {
   1969		c->srsets = ((read_c0_srsctl() >> 26) & 0x0f) + 1;
   1970		/* R2 has Performance Counter Interrupt indicator */
   1971		c->options |= MIPS_CPU_PCI;
   1972	}
   1973	else
   1974		c->srsets = 1;
   1975
   1976	if (cpu_has_mips_r6)
   1977		elf_hwcap |= HWCAP_MIPS_R6;
   1978
   1979	if (cpu_has_msa) {
   1980		c->msa_id = cpu_get_msa_id();
   1981		WARN(c->msa_id & MSA_IR_WRPF,
   1982		     "Vector register partitioning unimplemented!");
   1983		elf_hwcap |= HWCAP_MIPS_MSA;
   1984	}
   1985
   1986	if (cpu_has_mips16)
   1987		elf_hwcap |= HWCAP_MIPS_MIPS16;
   1988
   1989	if (cpu_has_mdmx)
   1990		elf_hwcap |= HWCAP_MIPS_MDMX;
   1991
   1992	if (cpu_has_mips3d)
   1993		elf_hwcap |= HWCAP_MIPS_MIPS3D;
   1994
   1995	if (cpu_has_smartmips)
   1996		elf_hwcap |= HWCAP_MIPS_SMARTMIPS;
   1997
   1998	if (cpu_has_dsp)
   1999		elf_hwcap |= HWCAP_MIPS_DSP;
   2000
   2001	if (cpu_has_dsp2)
   2002		elf_hwcap |= HWCAP_MIPS_DSP2;
   2003
   2004	if (cpu_has_dsp3)
   2005		elf_hwcap |= HWCAP_MIPS_DSP3;
   2006
   2007	if (cpu_has_mips16e2)
   2008		elf_hwcap |= HWCAP_MIPS_MIPS16E2;
   2009
   2010	if (cpu_has_loongson_mmi)
   2011		elf_hwcap |= HWCAP_LOONGSON_MMI;
   2012
   2013	if (cpu_has_loongson_ext)
   2014		elf_hwcap |= HWCAP_LOONGSON_EXT;
   2015
   2016	if (cpu_has_loongson_ext2)
   2017		elf_hwcap |= HWCAP_LOONGSON_EXT2;
   2018
   2019	if (cpu_has_vz)
   2020		cpu_probe_vz(c);
   2021
   2022	cpu_probe_vmbits(c);
   2023
   2024	/* Synthesize CPUCFG data if running on Loongson processors;
   2025	 * no-op otherwise.
   2026	 *
   2027	 * This looks at previously probed features, so keep this at bottom.
   2028	 */
   2029	loongson3_cpucfg_synthesize_data(c);
   2030
   2031#ifdef CONFIG_64BIT
   2032	if (cpu == 0)
   2033		__ua_limit = ~((1ull << cpu_vmbits) - 1);
   2034#endif
   2035
   2036	reserve_exception_space(0, 0x1000);
   2037}
   2038
   2039void cpu_report(void)
   2040{
   2041	struct cpuinfo_mips *c = &current_cpu_data;
   2042
   2043	pr_info("CPU%d revision is: %08x (%s)\n",
   2044		smp_processor_id(), c->processor_id, cpu_name_string());
   2045	if (c->options & MIPS_CPU_FPU)
   2046		printk(KERN_INFO "FPU revision is: %08x\n", c->fpu_id);
   2047	if (cpu_has_msa)
   2048		pr_info("MSA revision is: %08x\n", c->msa_id);
   2049}
   2050
   2051void cpu_set_cluster(struct cpuinfo_mips *cpuinfo, unsigned int cluster)
   2052{
   2053	/* Ensure the core number fits in the field */
   2054	WARN_ON(cluster > (MIPS_GLOBALNUMBER_CLUSTER >>
   2055			   MIPS_GLOBALNUMBER_CLUSTER_SHF));
   2056
   2057	cpuinfo->globalnumber &= ~MIPS_GLOBALNUMBER_CLUSTER;
   2058	cpuinfo->globalnumber |= cluster << MIPS_GLOBALNUMBER_CLUSTER_SHF;
   2059}
   2060
   2061void cpu_set_core(struct cpuinfo_mips *cpuinfo, unsigned int core)
   2062{
   2063	/* Ensure the core number fits in the field */
   2064	WARN_ON(core > (MIPS_GLOBALNUMBER_CORE >> MIPS_GLOBALNUMBER_CORE_SHF));
   2065
   2066	cpuinfo->globalnumber &= ~MIPS_GLOBALNUMBER_CORE;
   2067	cpuinfo->globalnumber |= core << MIPS_GLOBALNUMBER_CORE_SHF;
   2068}
   2069
   2070void cpu_set_vpe_id(struct cpuinfo_mips *cpuinfo, unsigned int vpe)
   2071{
   2072	/* Ensure the VP(E) ID fits in the field */
   2073	WARN_ON(vpe > (MIPS_GLOBALNUMBER_VP >> MIPS_GLOBALNUMBER_VP_SHF));
   2074
   2075	/* Ensure we're not using VP(E)s without support */
   2076	WARN_ON(vpe && !IS_ENABLED(CONFIG_MIPS_MT_SMP) &&
   2077		!IS_ENABLED(CONFIG_CPU_MIPSR6));
   2078
   2079	cpuinfo->globalnumber &= ~MIPS_GLOBALNUMBER_VP;
   2080	cpuinfo->globalnumber |= vpe << MIPS_GLOBALNUMBER_VP_SHF;
   2081}