diff options
author | Kelvin Cheung <keguang.zhang@gmail.com> | 2012-06-20 15:05:32 -0400 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 2012-07-23 08:57:04 -0400 |
commit | 2fa36399e63c911134f28b6878aada9b395c4209 (patch) | |
tree | 929290ba3e73119e79d8a5a3392c8a65e86f37a6 | |
parent | 28a33cbc24e4256c143dce96c7d93bf423229f92 (diff) |
MIPS: Add CPU support for Loongson1B
Loongson 1B is a 32-bit SoC designed by Institute of Computing Technology
(ICT) and the Chinese Academy of Sciences (CAS), which implements the
MIPS32 release 2 instruction set.
[ralf@linux-mips.org: But which is not strictly a MIPS32 compliant device
which also is why it identifies itself with the Legacy Vendor ID in the
PrID register. When applying the patch I shoveled some code around to
keep things in alphabetical order and avoid forward declarations.]
Signed-off-by: Kelvin Cheung <keguang.zhang@gmail.com>
Cc: To: linux-mips@linux-mips.org
Cc: linux-kernel@vger.kernel.org
Cc: wuzhangjin@gmail.com
Cc: zhzhl555@gmail.com
Cc: Kelvin Cheung <keguang.zhang@gmail.com>
Patchwork: https://patchwork.linux-mips.org/patch/3976/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
-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 | ok = decode_config3(c); | ||
473 | if (ok) | ||
474 | ok = decode_config4(c); | ||
475 | |||
476 | mips_probe_watch_registers(c); | ||
477 | |||
478 | if (cpu_has_mips_r2) | ||
479 | c->core = read_c0_ebase() & 0x3ff; | ||
480 | } | ||
481 | |||
333 | #define R4K_OPTS (MIPS_CPU_TLB | MIPS_CPU_4KEX | MIPS_CPU_4K_CACHE \ | 482 | #define R4K_OPTS (MIPS_CPU_TLB | MIPS_CPU_4KEX | MIPS_CPU_4K_CACHE \ |
334 | | MIPS_CPU_COUNTER) | 483 | | MIPS_CPU_COUNTER) |
335 | 484 | ||
@@ -638,155 +787,19 @@ static inline void cpu_probe_legacy(struct cpuinfo_mips *c, unsigned int cpu) | |||
638 | MIPS_CPU_32FPR; | 787 | MIPS_CPU_32FPR; |
639 | c->tlbsize = 64; | 788 | c->tlbsize = 64; |
640 | break; | 789 | break; |
641 | } | 790 | case PRID_IMP_LOONGSON1: |
642 | } | 791 | decode_configs(c); |
643 | |||
644 | static char unknown_isa[] __cpuinitdata = KERN_ERR \ | ||
645 | "Unsupported ISA type, c0.config0: %d."; | ||
646 | 792 | ||
647 | static inline unsigned int decode_config0(struct cpuinfo_mips *c) | 793 | c->cputype = CPU_LOONGSON1; |
648 | { | ||
649 | unsigned int config0; | ||
650 | int isa; | ||
651 | 794 | ||
652 | config0 = read_c0_config(); | 795 | switch (c->processor_id & PRID_REV_MASK) { |
653 | 796 | case PRID_REV_LOONGSON1B: | |
654 | if (((config0 & MIPS_CONF_MT) >> 7) == 1) | 797 | __cpu_name[cpu] = "Loongson 1B"; |
655 | c->options |= MIPS_CPU_TLB; | ||
656 | isa = (config0 & MIPS_CONF_AT) >> 13; | ||
657 | switch (isa) { | ||
658 | case 0: | ||
659 | switch ((config0 & MIPS_CONF_AR) >> 10) { | ||
660 | case 0: | ||
661 | c->isa_level = MIPS_CPU_ISA_M32R1; | ||
662 | break; | ||
663 | case 1: | ||
664 | c->isa_level = MIPS_CPU_ISA_M32R2; | ||
665 | break; | 798 | break; |
666 | default: | ||
667 | goto unknown; | ||
668 | } | 799 | } |
669 | break; | ||
670 | case 2: | ||
671 | switch ((config0 & MIPS_CONF_AR) >> 10) { | ||
672 | case 0: | ||
673 | c->isa_level = MIPS_CPU_ISA_M64R1; | ||
674 | break; | ||
675 | case 1: | ||
676 | c->isa_level = MIPS_CPU_ISA_M64R2; | ||
677 | break; | ||
678 | default: | ||
679 | goto unknown; | ||
680 | } | ||
681 | break; | ||
682 | default: | ||
683 | goto unknown; | ||
684 | } | ||
685 | |||
686 | return config0 & MIPS_CONF_M; | ||
687 | |||
688 | unknown: | ||
689 | panic(unknown_isa, config0); | ||
690 | } | ||
691 | 800 | ||
692 | static inline unsigned int decode_config1(struct cpuinfo_mips *c) | 801 | break; |
693 | { | ||
694 | unsigned int config1; | ||
695 | |||
696 | config1 = read_c0_config1(); | ||
697 | |||
698 | if (config1 & MIPS_CONF1_MD) | ||
699 | c->ases |= MIPS_ASE_MDMX; | ||
700 | if (config1 & MIPS_CONF1_WR) | ||
701 | c->options |= MIPS_CPU_WATCH; | ||
702 | if (config1 & MIPS_CONF1_CA) | ||
703 | c->ases |= MIPS_ASE_MIPS16; | ||
704 | if (config1 & MIPS_CONF1_EP) | ||
705 | c->options |= MIPS_CPU_EJTAG; | ||
706 | if (config1 & MIPS_CONF1_FP) { | ||
707 | c->options |= MIPS_CPU_FPU; | ||
708 | c->options |= MIPS_CPU_32FPR; | ||
709 | } | 802 | } |
710 | if (cpu_has_tlb) | ||
711 | c->tlbsize = ((config1 & MIPS_CONF1_TLBS) >> 25) + 1; | ||
712 | |||
713 | return config1 & MIPS_CONF_M; | ||
714 | } | ||
715 | |||
716 | static inline unsigned int decode_config2(struct cpuinfo_mips *c) | ||
717 | { | ||
718 | unsigned int config2; | ||
719 | |||
720 | config2 = read_c0_config2(); | ||
721 | |||
722 | if (config2 & MIPS_CONF2_SL) | ||
723 | c->scache.flags &= ~MIPS_CACHE_NOT_PRESENT; | ||
724 | |||
725 | return config2 & MIPS_CONF_M; | ||
726 | } | ||
727 | |||
728 | static inline unsigned int decode_config3(struct cpuinfo_mips *c) | ||
729 | { | ||
730 | unsigned int config3; | ||
731 | |||
732 | config3 = read_c0_config3(); | ||
733 | |||
734 | if (config3 & MIPS_CONF3_SM) | ||
735 | c->ases |= MIPS_ASE_SMARTMIPS; | ||
736 | if (config3 & MIPS_CONF3_DSP) | ||
737 | c->ases |= MIPS_ASE_DSP; | ||
738 | if (config3 & MIPS_CONF3_VINT) | ||
739 | c->options |= MIPS_CPU_VINT; | ||
740 | if (config3 & MIPS_CONF3_VEIC) | ||
741 | c->options |= MIPS_CPU_VEIC; | ||
742 | if (config3 & MIPS_CONF3_MT) | ||
743 | c->ases |= MIPS_ASE_MIPSMT; | ||
744 | if (config3 & MIPS_CONF3_ULRI) | ||
745 | c->options |= MIPS_CPU_ULRI; | ||
746 | |||
747 | return config3 & MIPS_CONF_M; | ||
748 | } | ||
749 | |||
750 | static inline unsigned int decode_config4(struct cpuinfo_mips *c) | ||
751 | { | ||
752 | unsigned int config4; | ||
753 | |||
754 | config4 = read_c0_config4(); | ||
755 | |||
756 | if ((config4 & MIPS_CONF4_MMUEXTDEF) == MIPS_CONF4_MMUEXTDEF_MMUSIZEEXT | ||
757 | && cpu_has_tlb) | ||
758 | c->tlbsize += (config4 & MIPS_CONF4_MMUSIZEEXT) * 0x40; | ||
759 | |||
760 | c->kscratch_mask = (config4 >> 16) & 0xff; | ||
761 | |||
762 | return config4 & MIPS_CONF_M; | ||
763 | } | ||
764 | |||
765 | static void __cpuinit decode_configs(struct cpuinfo_mips *c) | ||
766 | { | ||
767 | int ok; | ||
768 | |||
769 | /* MIPS32 or MIPS64 compliant CPU. */ | ||
770 | c->options = MIPS_CPU_4KEX | MIPS_CPU_4K_CACHE | MIPS_CPU_COUNTER | | ||
771 | MIPS_CPU_DIVEC | MIPS_CPU_LLSC | MIPS_CPU_MCHECK; | ||
772 | |||
773 | c->scache.flags = MIPS_CACHE_NOT_PRESENT; | ||
774 | |||
775 | ok = decode_config0(c); /* Read Config registers. */ | ||
776 | BUG_ON(!ok); /* Arch spec violation! */ | ||
777 | if (ok) | ||
778 | ok = decode_config1(c); | ||
779 | if (ok) | ||
780 | ok = decode_config2(c); | ||
781 | if (ok) | ||
782 | ok = decode_config3(c); | ||
783 | if (ok) | ||
784 | ok = decode_config4(c); | ||
785 | |||
786 | mips_probe_watch_registers(c); | ||
787 | |||
788 | if (cpu_has_mips_r2) | ||
789 | c->core = read_c0_ebase() & 0x3ff; | ||
790 | } | 803 | } |
791 | 804 | ||
792 | static inline void cpu_probe_mips(struct cpuinfo_mips *c, unsigned int cpu) | 805 | static inline void cpu_probe_mips(struct cpuinfo_mips *c, unsigned int cpu) |
diff --git a/arch/mips/kernel/perf_event_mipsxx.c b/arch/mips/kernel/perf_event_mipsxx.c index eb5e394a4650..2f28d3b55687 100644 --- a/arch/mips/kernel/perf_event_mipsxx.c +++ b/arch/mips/kernel/perf_event_mipsxx.c | |||
@@ -1559,6 +1559,11 @@ init_hw_perf_events(void) | |||
1559 | mipspmu.general_event_map = &mipsxxcore_event_map; | 1559 | mipspmu.general_event_map = &mipsxxcore_event_map; |
1560 | mipspmu.cache_event_map = &mipsxxcore_cache_map; | 1560 | mipspmu.cache_event_map = &mipsxxcore_cache_map; |
1561 | break; | 1561 | break; |
1562 | case CPU_LOONGSON1: | ||
1563 | mipspmu.name = "mips/loongson1"; | ||
1564 | mipspmu.general_event_map = &mipsxxcore_event_map; | ||
1565 | mipspmu.cache_event_map = &mipsxxcore_cache_map; | ||
1566 | break; | ||
1562 | case CPU_CAVIUM_OCTEON: | 1567 | case CPU_CAVIUM_OCTEON: |
1563 | case CPU_CAVIUM_OCTEON_PLUS: | 1568 | case CPU_CAVIUM_OCTEON_PLUS: |
1564 | case CPU_CAVIUM_OCTEON2: | 1569 | case CPU_CAVIUM_OCTEON2: |
diff --git a/arch/mips/kernel/traps.c b/arch/mips/kernel/traps.c index c3c293543703..9be3df1fa8a4 100644 --- a/arch/mips/kernel/traps.c +++ b/arch/mips/kernel/traps.c | |||
@@ -1253,6 +1253,7 @@ static inline void parity_protection_init(void) | |||
1253 | 1253 | ||
1254 | case CPU_5KC: | 1254 | case CPU_5KC: |
1255 | case CPU_5KE: | 1255 | case CPU_5KE: |
1256 | case CPU_LOONGSON1: | ||
1256 | write_c0_ecc(0x80000000); | 1257 | write_c0_ecc(0x80000000); |
1257 | back_to_back_c0_hazard(); | 1258 | back_to_back_c0_hazard(); |
1258 | /* Set the PE bit (bit 31) in the c0_errctl register. */ | 1259 | /* Set the PE bit (bit 31) in the c0_errctl register. */ |
diff --git a/arch/mips/oprofile/common.c b/arch/mips/oprofile/common.c index b6e378211a2c..f80480a5a032 100644 --- a/arch/mips/oprofile/common.c +++ b/arch/mips/oprofile/common.c | |||
@@ -85,6 +85,7 @@ int __init oprofile_arch_init(struct oprofile_operations *ops) | |||
85 | case CPU_34K: | 85 | case CPU_34K: |
86 | case CPU_1004K: | 86 | case CPU_1004K: |
87 | case CPU_74K: | 87 | case CPU_74K: |
88 | case CPU_LOONGSON1: | ||
88 | case CPU_SB1: | 89 | case CPU_SB1: |
89 | case CPU_SB1A: | 90 | case CPU_SB1A: |
90 | case CPU_R10000: | 91 | case CPU_R10000: |
diff --git a/arch/mips/oprofile/op_model_mipsxx.c b/arch/mips/oprofile/op_model_mipsxx.c index 4d80a856048d..056da6224163 100644 --- a/arch/mips/oprofile/op_model_mipsxx.c +++ b/arch/mips/oprofile/op_model_mipsxx.c | |||
@@ -374,6 +374,10 @@ static int __init mipsxx_init(void) | |||
374 | op_model_mipsxx_ops.cpu_type = "mips/sb1"; | 374 | op_model_mipsxx_ops.cpu_type = "mips/sb1"; |
375 | break; | 375 | break; |
376 | 376 | ||
377 | case CPU_LOONGSON1: | ||
378 | op_model_mipsxx_ops.cpu_type = "mips/loongson1"; | ||
379 | break; | ||
380 | |||
377 | default: | 381 | default: |
378 | printk(KERN_ERR "Profiling unsupported for this CPU\n"); | 382 | printk(KERN_ERR "Profiling unsupported for this CPU\n"); |
379 | 383 | ||