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 = ¤t_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 = ¤t_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 = ¤t_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}