diff options
| -rw-r--r-- | arch/mips/include/asm/cpu.h | 3 | ||||
| -rw-r--r-- | arch/mips/include/asm/module.h | 2 | ||||
| -rw-r--r-- | arch/mips/kernel/cpu-probe.c | 299 | ||||
| -rw-r--r-- | arch/mips/kernel/perf_event_mipsxx.c | 5 | ||||
| -rw-r--r-- | arch/mips/kernel/traps.c | 1 | ||||
| -rw-r--r-- | arch/mips/oprofile/common.c | 1 | ||||
| -rw-r--r-- | arch/mips/oprofile/op_model_mipsxx.c | 4 |
7 files changed, 171 insertions, 144 deletions
diff --git a/arch/mips/include/asm/cpu.h b/arch/mips/include/asm/cpu.h index 95e40c1e8ed1..f21b7c04e95a 100644 --- a/arch/mips/include/asm/cpu.h +++ b/arch/mips/include/asm/cpu.h | |||
| @@ -197,6 +197,7 @@ | |||
| 197 | #define PRID_REV_VR4181A 0x0070 /* Same as VR4122 */ | 197 | #define PRID_REV_VR4181A 0x0070 /* Same as VR4122 */ |
| 198 | #define PRID_REV_VR4130 0x0080 | 198 | #define PRID_REV_VR4130 0x0080 |
| 199 | #define PRID_REV_34K_V1_0_2 0x0022 | 199 | #define PRID_REV_34K_V1_0_2 0x0022 |
| 200 | #define PRID_REV_LOONGSON1B 0x0020 | ||
| 200 | #define PRID_REV_LOONGSON2E 0x0002 | 201 | #define PRID_REV_LOONGSON2E 0x0002 |
| 201 | #define PRID_REV_LOONGSON2F 0x0003 | 202 | #define PRID_REV_LOONGSON2F 0x0003 |
| 202 | 203 | ||
| @@ -261,7 +262,7 @@ enum cpu_type_enum { | |||
| 261 | */ | 262 | */ |
| 262 | CPU_4KC, CPU_4KEC, CPU_4KSC, CPU_24K, CPU_34K, CPU_1004K, CPU_74K, | 263 | CPU_4KC, CPU_4KEC, CPU_4KSC, CPU_24K, CPU_34K, CPU_1004K, CPU_74K, |
| 263 | CPU_ALCHEMY, CPU_PR4450, CPU_BMIPS32, CPU_BMIPS3300, CPU_BMIPS4350, | 264 | CPU_ALCHEMY, CPU_PR4450, CPU_BMIPS32, CPU_BMIPS3300, CPU_BMIPS4350, |
| 264 | CPU_BMIPS4380, CPU_BMIPS5000, CPU_JZRISC, CPU_M14KC, | 265 | CPU_BMIPS4380, CPU_BMIPS5000, CPU_JZRISC, CPU_LOONGSON1, CPU_M14KC, |
| 265 | 266 | ||
| 266 | /* | 267 | /* |
| 267 | * MIPS64 class processors | 268 | * MIPS64 class processors |
diff --git a/arch/mips/include/asm/module.h b/arch/mips/include/asm/module.h index 530008048c62..7531ecd654d6 100644 --- a/arch/mips/include/asm/module.h +++ b/arch/mips/include/asm/module.h | |||
| @@ -117,6 +117,8 @@ search_module_dbetables(unsigned long addr) | |||
| 117 | #define MODULE_PROC_FAMILY "RM9000 " | 117 | #define MODULE_PROC_FAMILY "RM9000 " |
| 118 | #elif defined CONFIG_CPU_SB1 | 118 | #elif defined CONFIG_CPU_SB1 |
| 119 | #define MODULE_PROC_FAMILY "SB1 " | 119 | #define MODULE_PROC_FAMILY "SB1 " |
| 120 | #elif defined CONFIG_CPU_LOONGSON1 | ||
| 121 | #define MODULE_PROC_FAMILY "LOONGSON1 " | ||
| 120 | #elif defined CONFIG_CPU_LOONGSON2 | 122 | #elif defined CONFIG_CPU_LOONGSON2 |
| 121 | #define MODULE_PROC_FAMILY "LOONGSON2 " | 123 | #define MODULE_PROC_FAMILY "LOONGSON2 " |
| 122 | #elif defined CONFIG_CPU_CAVIUM_OCTEON | 124 | #elif defined CONFIG_CPU_CAVIUM_OCTEON |
diff --git a/arch/mips/kernel/cpu-probe.c b/arch/mips/kernel/cpu-probe.c index f4630e1082ab..1b51046191e8 100644 --- a/arch/mips/kernel/cpu-probe.c +++ b/arch/mips/kernel/cpu-probe.c | |||
| @@ -190,6 +190,7 @@ void __init check_wait(void) | |||
| 190 | case CPU_CAVIUM_OCTEON_PLUS: | 190 | case CPU_CAVIUM_OCTEON_PLUS: |
| 191 | case CPU_CAVIUM_OCTEON2: | 191 | case CPU_CAVIUM_OCTEON2: |
| 192 | case CPU_JZRISC: | 192 | case CPU_JZRISC: |
| 193 | case CPU_LOONGSON1: | ||
| 193 | case CPU_XLR: | 194 | case CPU_XLR: |
| 194 | case CPU_XLP: | 195 | case CPU_XLP: |
| 195 | cpu_wait = r4k_wait; | 196 | cpu_wait = r4k_wait; |
| @@ -330,6 +331,154 @@ static inline void cpu_probe_vmbits(struct cpuinfo_mips *c) | |||
| 330 | #endif | 331 | #endif |
| 331 | } | 332 | } |
| 332 | 333 | ||
| 334 | static char unknown_isa[] __cpuinitdata = KERN_ERR \ | ||
| 335 | "Unsupported ISA type, c0.config0: %d."; | ||
| 336 | |||
| 337 | static inline unsigned int decode_config0(struct cpuinfo_mips *c) | ||
| 338 | { | ||
| 339 | unsigned int config0; | ||
| 340 | int isa; | ||
| 341 | |||
| 342 | config0 = read_c0_config(); | ||
| 343 | |||
| 344 | if (((config0 & MIPS_CONF_MT) >> 7) == 1) | ||
| 345 | c->options |= MIPS_CPU_TLB; | ||
| 346 | isa = (config0 & MIPS_CONF_AT) >> 13; | ||
| 347 | switch (isa) { | ||
| 348 | case 0: | ||
| 349 | switch ((config0 & MIPS_CONF_AR) >> 10) { | ||
| 350 | case 0: | ||
| 351 | c->isa_level = MIPS_CPU_ISA_M32R1; | ||
| 352 | break; | ||
| 353 | case 1: | ||
| 354 | c->isa_level = MIPS_CPU_ISA_M32R2; | ||
| 355 | break; | ||
| 356 | default: | ||
| 357 | goto unknown; | ||
| 358 | } | ||
| 359 | break; | ||
| 360 | case 2: | ||
| 361 | switch ((config0 & MIPS_CONF_AR) >> 10) { | ||
| 362 | case 0: | ||
| 363 | c->isa_level = MIPS_CPU_ISA_M64R1; | ||
| 364 | break; | ||
| 365 | case 1: | ||
| 366 | c->isa_level = MIPS_CPU_ISA_M64R2; | ||
| 367 | break; | ||
| 368 | default: | ||
| 369 | goto unknown; | ||
| 370 | } | ||
| 371 | break; | ||
| 372 | default: | ||
| 373 | goto unknown; | ||
| 374 | } | ||
| 375 | |||
| 376 | return config0 & MIPS_CONF_M; | ||
| 377 | |||
| 378 | unknown: | ||
| 379 | panic(unknown_isa, config0); | ||
| 380 | } | ||
| 381 | |||
| 382 | static inline unsigned int decode_config1(struct cpuinfo_mips *c) | ||
| 383 | { | ||
| 384 | unsigned int config1; | ||
| 385 | |||
| 386 | config1 = read_c0_config1(); | ||
| 387 | |||
| 388 | if (config1 & MIPS_CONF1_MD) | ||
| 389 | c->ases |= MIPS_ASE_MDMX; | ||
| 390 | if (config1 & MIPS_CONF1_WR) | ||
| 391 | c->options |= MIPS_CPU_WATCH; | ||
| 392 | if (config1 & MIPS_CONF1_CA) | ||
| 393 | c->ases |= MIPS_ASE_MIPS16; | ||
| 394 | if (config1 & MIPS_CONF1_EP) | ||
| 395 | c->options |= MIPS_CPU_EJTAG; | ||
| 396 | if (config1 & MIPS_CONF1_FP) { | ||
| 397 | c->options |= MIPS_CPU_FPU; | ||
| 398 | c->options |= MIPS_CPU_32FPR; | ||
| 399 | } | ||
| 400 | if (cpu_has_tlb) | ||
| 401 | c->tlbsize = ((config1 & MIPS_CONF1_TLBS) >> 25) + 1; | ||
| 402 | |||
| 403 | return config1 & MIPS_CONF_M; | ||
| 404 | } | ||
| 405 | |||
| 406 | static inline unsigned int decode_config2(struct cpuinfo_mips *c) | ||
| 407 | { | ||
| 408 | unsigned int config2; | ||
| 409 | |||
| 410 | config2 = read_c0_config2(); | ||
| 411 | |||
| 412 | if (config2 & MIPS_CONF2_SL) | ||
| 413 | c->scache.flags &= ~MIPS_CACHE_NOT_PRESENT; | ||
| 414 | |||
| 415 | return config2 & MIPS_CONF_M; | ||
| 416 | } | ||
| 417 | |||
| 418 | static inline unsigned int decode_config3(struct cpuinfo_mips *c) | ||
| 419 | { | ||
| 420 | unsigned int config3; | ||
| 421 | |||
| 422 | config3 = read_c0_config3(); | ||
| 423 | |||
| 424 | if (config3 & MIPS_CONF3_SM) | ||
| 425 | c->ases |= MIPS_ASE_SMARTMIPS; | ||
| 426 | if (config3 & MIPS_CONF3_DSP) | ||
| 427 | c->ases |= MIPS_ASE_DSP; | ||
| 428 | if (config3 & MIPS_CONF3_VINT) | ||
| 429 | c->options |= MIPS_CPU_VINT; | ||
| 430 | if (config3 & MIPS_CONF3_VEIC) | ||
| 431 | c->options |= MIPS_CPU_VEIC; | ||
| 432 | if (config3 & MIPS_CONF3_MT) | ||
| 433 | c->ases |= MIPS_ASE_MIPSMT; | ||
| 434 | if (config3 & MIPS_CONF3_ULRI) | ||
| 435 | c->options |= MIPS_CPU_ULRI; | ||
| 436 | |||
| 437 | return config3 & MIPS_CONF_M; | ||
| 438 | } | ||
| 439 | |||
| 440 | static inline unsigned int decode_config4(struct cpuinfo_mips *c) | ||
| 441 | { | ||
| 442 | unsigned int config4; | ||
| 443 | |||
| 444 | config4 = read_c0_config4(); | ||
| 445 | |||
| 446 | if ((config4 & MIPS_CONF4_MMUEXTDEF) == MIPS_CONF4_MMUEXTDEF_MMUSIZEEXT | ||
| 447 | && cpu_has_tlb) | ||
| 448 | c->tlbsize += (config4 & MIPS_CONF4_MMUSIZEEXT) * 0x40; | ||
| 449 | |||
| 450 | c->kscratch_mask = (config4 >> 16) & 0xff; | ||
| 451 | |||
| 452 | return config4 & MIPS_CONF_M; | ||
| 453 | } | ||
| 454 | |||
| 455 | static void __cpuinit decode_configs(struct cpuinfo_mips *c) | ||
| 456 | { | ||
| 457 | int ok; | ||
| 458 | |||
| 459 | /* MIPS32 or MIPS64 compliant CPU. */ | ||
| 460 | c->options = MIPS_CPU_4KEX | MIPS_CPU_4K_CACHE | MIPS_CPU_COUNTER | | ||
| 461 | MIPS_CPU_DIVEC | MIPS_CPU_LLSC | MIPS_CPU_MCHECK; | ||
| 462 | |||
| 463 | c->scache.flags = MIPS_CACHE_NOT_PRESENT; | ||
| 464 | |||
| 465 | ok = decode_config0(c); /* Read Config registers. */ | ||
| 466 | BUG_ON(!ok); /* Arch spec violation! */ | ||
| 467 | if (ok) | ||
| 468 | ok = decode_config1(c); | ||
| 469 | if (ok) | ||
| 470 | ok = decode_config2(c); | ||
| 471 | if (ok) | ||
| 472 | |||
