1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Processor capabilities determination functions.
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.
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>
19 #include <asm/cpu-features.h>
20 #include <asm/cpu-type.h>
22 #include <asm/mipsregs.h>
23 #include <asm/mipsmtregs.h>
25 #include <asm/watch.h>
27 #include <asm/pgtable-bits.h>
28 #include <asm/spram.h>
29 #include <asm/traps.h>
30 #include <linux/uaccess.h>
32 #include "fpu-probe.h"
34 #include <asm/mach-loongson64/cpucfg-emul.h>
36 /* Hardware capabilities */
37 unsigned int elf_hwcap __read_mostly
;
38 EXPORT_SYMBOL_GPL(elf_hwcap
);
40 static inline unsigned long cpu_get_msa_id(void)
42 unsigned long status
, msa_id
;
44 status
= read_c0_status();
45 __enable_fpu(FPU_64BIT
);
47 msa_id
= read_msa_ir();
49 write_c0_status(status
);
53 static int mips_dsp_disabled
;
55 static int __init
dsp_disable(char *s
)
57 cpu_data
[0].ases
&= ~(MIPS_ASE_DSP
| MIPS_ASE_DSP2P
);
58 mips_dsp_disabled
= 1;
63 __setup("nodsp", dsp_disable
);
65 static int mips_htw_disabled
;
67 static int __init
htw_disable(char *s
)
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
));
77 __setup("nohtw", htw_disable
);
79 static int mips_ftlb_disabled
;
80 static int mips_has_ftlb_configured
;
84 FTLB_SET_PROB
= 1 << 1,
87 static int set_ftlb_enable(struct cpuinfo_mips
*c
, enum ftlb_flags flags
);
89 static int __init
ftlb_disable(char *s
)
91 unsigned int config4
, mmuextdef
;
94 * If the core hasn't done any FTLB configuration, there is nothing
97 if (!mips_has_ftlb_configured
)
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");
106 config4
= read_c0_config4();
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");
117 mips_ftlb_disabled
= 1;
118 mips_has_ftlb_configured
= 0;
121 * noftlb is mainly used for debug purposes so print
122 * an informative message instead of using pr_debug()
124 pr_info("FTLB has been disabled\n");
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.
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;
139 __setup("noftlb", ftlb_disable
);
142 * Check if the CPU has per tc perf counters
144 static inline void cpu_set_mt_per_tc_perf(struct cpuinfo_mips
*c
)
146 if (read_c0_config7() & MTI_CONF7_PTC
)
147 c
->options
|= MIPS_CPU_MT_PER_TC_PERF_COUNTERS
;
150 static inline void check_errata(void)
152 struct cpuinfo_mips
*c
= ¤t_cpu_data
;
154 switch (current_cpu_type()) {
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.
161 if ((c
->processor_id
& PRID_REV_MASK
) <= PRID_REV_34K_V1_0_2
)
162 write_c0_config7(read_c0_config7() | MIPS_CONF7_RPS
);
169 void __init
check_bugs32(void)
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.
179 static inline int cpu_has_confreg(void)
181 #ifdef CONFIG_CPU_R3000
182 unsigned long size1
, size2
;
183 unsigned long cfg
= read_c0_conf();
185 size1
= r3k_cache_size(ST0_ISC
);
186 write_c0_conf(cfg
^ R30XX_CONF_AC
);
187 size2
= r3k_cache_size(ST0_ISC
);
189 return size1
!= size2
;
195 static inline void set_elf_platform(int cpu
, const char *plat
)
198 __elf_platform
= plat
;
201 static inline void set_elf_base_platform(const char *plat
)
203 if (__elf_base_platform
== NULL
) {
204 __elf_base_platform
= plat
;
208 static inline void cpu_probe_vmbits(struct cpuinfo_mips
*c
)
210 #ifdef __NEED_VMBITS_PROBE
211 write_c0_entryhi(0x3fffffffffffe000ULL
);
212 back_to_back_c0_hazard();
213 c
->vmbits
= fls64(read_c0_entryhi() & 0x3fffffffffffe000ULL
);
217 static void set_isa(struct cpuinfo_mips
*c
, unsigned int isa
)
220 case MIPS_CPU_ISA_M64R5
:
221 c
->isa_level
|= MIPS_CPU_ISA_M32R5
| MIPS_CPU_ISA_M64R5
;
222 set_elf_base_platform("mips64r5");
224 case MIPS_CPU_ISA_M64R2
:
225 c
->isa_level
|= MIPS_CPU_ISA_M32R2
| MIPS_CPU_ISA_M64R2
;
226 set_elf_base_platform("mips64r2");
228 case MIPS_CPU_ISA_M64R1
:
229 c
->isa_level
|= MIPS_CPU_ISA_M32R1
| MIPS_CPU_ISA_M64R1
;
230 set_elf_base_platform("mips64");
233 c
->isa_level
|= MIPS_CPU_ISA_V
;
234 set_elf_base_platform("mips5");
236 case MIPS_CPU_ISA_IV
:
237 c
->isa_level
|= MIPS_CPU_ISA_IV
;
238 set_elf_base_platform("mips4");
240 case MIPS_CPU_ISA_III
:
241 c
->isa_level
|= MIPS_CPU_ISA_II
| MIPS_CPU_ISA_III
;
242 set_elf_base_platform("mips3");
245 /* R6 incompatible with everything else */
246 case MIPS_CPU_ISA_M64R6
:
247 c
->isa_level
|= MIPS_CPU_ISA_M32R6
| MIPS_CPU_ISA_M64R6
;
248 set_elf_base_platform("mips64r6");
250 case MIPS_CPU_ISA_M32R6
:
251 c
->isa_level
|= MIPS_CPU_ISA_M32R6
;
252 set_elf_base_platform("mips32r6");
253 /* Break here so we don't add incompatible ISAs */
255 case MIPS_CPU_ISA_M32R5
:
256 c
->isa_level
|= MIPS_CPU_ISA_M32R5
;
257 set_elf_base_platform("mips32r5");
259 case MIPS_CPU_ISA_M32R2
:
260 c
->isa_level
|= MIPS_CPU_ISA_M32R2
;
261 set_elf_base_platform("mips32r2");
263 case MIPS_CPU_ISA_M32R1
:
264 c
->isa_level
|= MIPS_CPU_ISA_M32R1
;
265 set_elf_base_platform("mips32");
267 case MIPS_CPU_ISA_II
:
268 c
->isa_level
|= MIPS_CPU_ISA_II
;
269 set_elf_base_platform("mips2");
274 static char unknown_isa
[] = KERN_ERR \
275 "Unsupported ISA type, c0.config0: %d.";
277 static unsigned int calculate_ftlb_probability(struct cpuinfo_mips
*c
)
280 unsigned int probability
= c
->tlbsize
/ c
->tlbsizevtlb
;
283 * 0 = All TLBWR instructions go to FTLB
284 * 1 = 15:1: For every 16 TBLWR instructions, 15 go to the
285 * FTLB and 1 goes to the VTLB.
286 * 2 = 7:1: As above with 7:1 ratio.
287 * 3 = 3:1: As above with 3:1 ratio.
289 * Use the linear midpoint as the probability threshold.
291 if (probability
>= 12)
293 else if (probability
>= 6)
297 * So FTLB is less than 4 times bigger than VTLB.
298 * A 3:1 ratio can still be useful though.
303 static int set_ftlb_enable(struct cpuinfo_mips
*c
, enum ftlb_flags flags
)
307 /* It's implementation dependent how the FTLB can be enabled */
308 switch (c
->cputype
) {
312 /* proAptiv & related cores use Config6 to enable the FTLB */
313 config
= read_c0_config6();
316 config
|= MTI_CONF6_FTLBEN
;
318 config
&= ~MTI_CONF6_FTLBEN
;
320 if (flags
& FTLB_SET_PROB
) {
321 config
&= ~(3 << MTI_CONF6_FTLBP_SHIFT
);
322 config
|= calculate_ftlb_probability(c
)
323 << MTI_CONF6_FTLBP_SHIFT
;
326 write_c0_config6(config
);
327 back_to_back_c0_hazard();
331 /* There's no way to disable the FTLB */
332 if (!(flags
& FTLB_EN
))
336 /* Flush ITLB, DTLB, VTLB and FTLB */
337 write_c0_diag(LOONGSON_DIAG_ITLB
| LOONGSON_DIAG_DTLB
|
338 LOONGSON_DIAG_VTLB
| LOONGSON_DIAG_FTLB
);
339 /* Loongson-3 cores use Config6 to enable the FTLB */
340 config
= read_c0_config6();
343 write_c0_config6(config
& ~LOONGSON_CONF6_FTLBDIS
);
346 write_c0_config6(config
| LOONGSON_CONF6_FTLBDIS
);
355 static int mm_config(struct cpuinfo_mips
*c
)
357 unsigned int config0
, update
, mm
;
359 config0
= read_c0_config();
360 mm
= config0
& MIPS_CONF_MM
;
363 * It's implementation dependent what type of write-merge is supported
364 * and whether it can be enabled/disabled. If it is settable lets make
365 * the merging allowed by default. Some platforms might have
366 * write-through caching unsupported. In this case just ignore the
367 * CP0.Config.MM bit field value.
369 switch (c
->cputype
) {
375 c
->options
|= MIPS_CPU_MM_FULL
;
376 update
= MIPS_CONF_MM_FULL
;
390 config0
= (config0
& ~MIPS_CONF_MM
) | update
;
391 write_c0_config(config0
);
392 } else if (mm
== MIPS_CONF_MM_SYSAD
) {
393 c
->options
|= MIPS_CPU_MM_SYSAD
;
394 } else if (mm
== MIPS_CONF_MM_FULL
) {
395 c
->options
|= MIPS_CPU_MM_FULL
;
401 static inline unsigned int decode_config0(struct cpuinfo_mips
*c
)
403 unsigned int config0
;
406 config0
= read_c0_config();
409 * Look for Standard TLB or Dual VTLB and FTLB
411 mt
= config0
& MIPS_CONF_MT
;
412 if (mt
== MIPS_CONF_MT_TLB
)
413 c
->options
|= MIPS_CPU_TLB
;
414 else if (mt
== MIPS_CONF_MT_FTLB
)
415 c
->options
|= MIPS_CPU_TLB
| MIPS_CPU_FTLB
;
417 isa
= (config0
& MIPS_CONF_AT
) >> 13;
420 switch ((config0
& MIPS_CONF_AR
) >> 10) {
422 set_isa(c
, MIPS_CPU_ISA_M32R1
);
425 set_isa(c
, MIPS_CPU_ISA_M32R2
);
428 set_isa(c
, MIPS_CPU_ISA_M32R6
);
435 switch ((config0
& MIPS_CONF_AR
) >> 10) {
437 set_isa(c
, MIPS_CPU_ISA_M64R1
);
440 set_isa(c
, MIPS_CPU_ISA_M64R2
);
443 set_isa(c
, MIPS_CPU_ISA_M64R6
);
453 return config0
& MIPS_CONF_M
;
456 panic(unknown_isa
, config0
);
459 static inline unsigned int decode_config1(struct cpuinfo_mips
*c
)
461 unsigned int config1
;
463 config1
= read_c0_config1();
465 if (config1
& MIPS_CONF1_MD
)
466 c
->ases
|= MIPS_ASE_MDMX
;
467 if (config1
& MIPS_CONF1_PC
)
468 c
->options
|= MIPS_CPU_PERF
;
469 if (config1
& MIPS_CONF1_WR
)
470 c
->options
|= MIPS_CPU_WATCH
;
471 if (config1
& MIPS_CONF1_CA
)
472 c
->ases
|= MIPS_ASE_MIPS16
;
473 if (config1
& MIPS_CONF1_EP
)
474 c
->options
|= MIPS_CPU_EJTAG
;
475 if (config1
& MIPS_CONF1_FP
) {
476 c
->options
|= MIPS_CPU_FPU
;
477 c
->options
|= MIPS_CPU_32FPR
;
480 c
->tlbsize
= ((config1
& MIPS_CONF1_TLBS
) >> 25) + 1;
481 c
->tlbsizevtlb
= c
->tlbsize
;
482 c
->tlbsizeftlbsets
= 0;
485 return config1
& MIPS_CONF_M
;
488 static inline unsigned int decode_config2(struct cpuinfo_mips
*c
)
490 unsigned int config2
;
492 config2
= read_c0_config2();
494 if (config2
& MIPS_CONF2_SL
)
495 c
->scache
.flags
&= ~MIPS_CACHE_NOT_PRESENT
;
497 return config2
& MIPS_CONF_M
;
500 static inline unsigned int decode_config3(struct cpuinfo_mips
*c
)
502 unsigned int config3
;
504 config3
= read_c0_config3();
506 if (config3
& MIPS_CONF3_SM
) {
507 c
->ases
|= MIPS_ASE_SMARTMIPS
;
508 c
->options
|= MIPS_CPU_RIXI
| MIPS_CPU_CTXTC
;
510 if (config3
& MIPS_CONF3_RXI
)
511 c
->options
|= MIPS_CPU_RIXI
;
512 if (config3
& MIPS_CONF3_CTXTC
)
513 c
->options
|= MIPS_CPU_CTXTC
;
514 if (config3
& MIPS_CONF3_DSP
)
515 c
->ases
|= MIPS_ASE_DSP
;
516 if (config3
& MIPS_CONF3_DSP2P
) {
517 c
->ases
|= MIPS_ASE_DSP2P
;
519 c
->ases
|= MIPS_ASE_DSP3
;
521 if (config3
& MIPS_CONF3_VINT
)
522 c
->options
|= MIPS_CPU_VINT
;
523 if (config3
& MIPS_CONF3_VEIC
)
524 c
->options
|= MIPS_CPU_VEIC
;
525 if (config3
& MIPS_CONF3_LPA
)
526 c
->options
|= MIPS_CPU_LPA
;
527 if (config3
& MIPS_CONF3_MT
)
528 c
->ases
|= MIPS_ASE_MIPSMT
;
529 if (config3
& MIPS_CONF3_ULRI
)
530 c
->options
|= MIPS_CPU_ULRI
;
531 if (config3
& MIPS_CONF3_ISA
)
532 c
->options
|= MIPS_CPU_MICROMIPS
;
533 if (config3
& MIPS_CONF3_VZ
)
534 c
->ases
|= MIPS_ASE_VZ
;
535 if (config3
& MIPS_CONF3_SC
)
536 c
->options
|= MIPS_CPU_SEGMENTS
;
537 if (config3
& MIPS_CONF3_BI
)
538 c
->options
|= MIPS_CPU_BADINSTR
;
539 if (config3
& MIPS_CONF3_BP
)
540 c
->options
|= MIPS_CPU_BADINSTRP
;
541 if (config3
& MIPS_CONF3_MSA
)
542 c
->ases
|= MIPS_ASE_MSA
;
543 if (config3
& MIPS_CONF3_PW
) {
545 c
->options
|= MIPS_CPU_HTW
;
547 if (config3
& MIPS_CONF3_CDMM
)
548 c
->options
|= MIPS_CPU_CDMM
;
549 if (config3
& MIPS_CONF3_SP
)
550 c
->options
|= MIPS_CPU_SP
;
552 return config3
& MIPS_CONF_M
;
555 static inline unsigned int decode_config4(struct cpuinfo_mips
*c
)
557 unsigned int config4
;
559 unsigned int mmuextdef
;
560 unsigned int ftlb_page
= MIPS_CONF4_FTLBPAGESIZE
;
561 unsigned long asid_mask
;
563 config4
= read_c0_config4();
566 if (((config4
& MIPS_CONF4_IE
) >> 29) == 2)
567 c
->options
|= MIPS_CPU_TLBINV
;
570 * R6 has dropped the MMUExtDef field from config4.
571 * On R6 the fields always describe the FTLB, and only if it is
572 * present according to Config.MT.
574 if (!cpu_has_mips_r6
)
575 mmuextdef
= config4
& MIPS_CONF4_MMUEXTDEF
;
576 else if (cpu_has_ftlb
)
577 mmuextdef
= MIPS_CONF4_MMUEXTDEF_VTLBSIZEEXT
;
582 case MIPS_CONF4_MMUEXTDEF_MMUSIZEEXT
:
583 c
->tlbsize
+= (config4
& MIPS_CONF4_MMUSIZEEXT
) * 0x40;
584 c
->tlbsizevtlb
= c
->tlbsize
;
586 case MIPS_CONF4_MMUEXTDEF_VTLBSIZEEXT
:
588 ((config4
& MIPS_CONF4_VTLBSIZEEXT
) >>
589 MIPS_CONF4_VTLBSIZEEXT_SHIFT
) * 0x40;
590 c
->tlbsize
= c
->tlbsizevtlb
;
591 ftlb_page
= MIPS_CONF4_VFTLBPAGESIZE
;
593 case MIPS_CONF4_MMUEXTDEF_FTLBSIZEEXT
:
594 if (mips_ftlb_disabled
)
596 newcf4
= (config4
& ~ftlb_page
) |
597 (page_size_ftlb(mmuextdef
) <<
598 MIPS_CONF4_FTLBPAGESIZE_SHIFT
);
599 write_c0_config4(newcf4
);
600 back_to_back_c0_hazard();
601 config4
= read_c0_config4();
602 if (config4
!= newcf4
) {
603 pr_err("PAGE_SIZE 0x%lx is not supported by FTLB (config4=0x%x)\n",
605 /* Switch FTLB off */
606 set_ftlb_enable(c
, 0);
607 mips_ftlb_disabled
= 1;
610 c
->tlbsizeftlbsets
= 1 <<
611 ((config4
& MIPS_CONF4_FTLBSETS
) >>
612 MIPS_CONF4_FTLBSETS_SHIFT
);
613 c
->tlbsizeftlbways
= ((config4
& MIPS_CONF4_FTLBWAYS
) >>
614 MIPS_CONF4_FTLBWAYS_SHIFT
) + 2;
615 c
->tlbsize
+= c
->tlbsizeftlbways
* c
->tlbsizeftlbsets
;
616 mips_has_ftlb_configured
= 1;
621 c
->kscratch_mask
= (config4
& MIPS_CONF4_KSCREXIST
)
622 >> MIPS_CONF4_KSCREXIST_SHIFT
;
624 asid_mask
= MIPS_ENTRYHI_ASID
;
625 if (config4
& MIPS_CONF4_AE
)
626 asid_mask
|= MIPS_ENTRYHI_ASIDX
;
627 set_cpu_asid_mask(c
, asid_mask
);
630 * Warn if the computed ASID mask doesn't match the mask the kernel
631 * is built for. This may indicate either a serious problem or an
632 * easy optimisation opportunity, but either way should be addressed.
634 WARN_ON(asid_mask
!= cpu_asid_mask(c
));
636 return config4
& MIPS_CONF_M
;
639 static inline unsigned int decode_config5(struct cpuinfo_mips
*c
)
641 unsigned int config5
, max_mmid_width
;
642 unsigned long asid_mask
;
644 config5
= read_c0_config5();
645 config5
&= ~(MIPS_CONF5_UFR
| MIPS_CONF5_UFE
);
647 if (cpu_has_mips_r6
) {
648 if (!__builtin_constant_p(cpu_has_mmid
) || cpu_has_mmid
)
649 config5
|= MIPS_CONF5_MI
;
651 config5
&= ~MIPS_CONF5_MI
;
654 write_c0_config5(config5
);
656 if (config5
& MIPS_CONF5_EVA
)
657 c
->options
|= MIPS_CPU_EVA
;
658 if (config5
& MIPS_CONF5_MRP
)
659 c
->options
|= MIPS_CPU_MAAR
;
660 if (config5
& MIPS_CONF5_LLB
)
661 c
->options
|= MIPS_CPU_RW_LLB
;
662 if (config5
& MIPS_CONF5_MVH
)
663 c
->options
|= MIPS_CPU_MVH
;
664 if (cpu_has_mips_r6
&& (config5
& MIPS_CONF5_VP
))
665 c
->options
|= MIPS_CPU_VP
;
666 if (config5
& MIPS_CONF5_CA2
)
667 c
->ases
|= MIPS_ASE_MIPS16E2
;
669 if (config5
& MIPS_CONF5_CRCP
)
670 elf_hwcap
|= HWCAP_MIPS_CRC32
;
672 if (cpu_has_mips_r6
) {
673 /* Ensure the write to config5 above takes effect */
674 back_to_back_c0_hazard();
676 /* Check whether we successfully enabled MMID support */
677 config5
= read_c0_config5();
678 if (config5
& MIPS_CONF5_MI
)
679 c
->options
|= MIPS_CPU_MMID
;
682 * Warn if we've hardcoded cpu_has_mmid to a value unsuitable
683 * for the CPU we're running on, or if CPUs in an SMP system
684 * have inconsistent MMID support.
686 WARN_ON(!!cpu_has_mmid
!= !!(config5
& MIPS_CONF5_MI
));
689 write_c0_memorymapid(~0ul);
690 back_to_back_c0_hazard();
691 asid_mask
= read_c0_memorymapid();
694 * We maintain a bitmap to track MMID allocation, and
695 * need a sensible upper bound on the size of that
696 * bitmap. The initial CPU with MMID support (I6500)
697 * supports 16 bit MMIDs, which gives us an 8KiB
698 * bitmap. The architecture recommends that hardware
699 * support 32 bit MMIDs, which would give us a 512MiB
700 * bitmap - that's too big in most cases.
702 * Cap MMID width at 16 bits for now & we can revisit
703 * this if & when hardware supports anything wider.
706 if (asid_mask
> GENMASK(max_mmid_width
- 1, 0)) {
707 pr_info("Capping MMID width at %d bits",
709 asid_mask
= GENMASK(max_mmid_width
- 1, 0);
712 set_cpu_asid_mask(c
, asid_mask
);
716 return config5
& MIPS_CONF_M
;
719 static void decode_configs(struct cpuinfo_mips
*c
)
723 /* MIPS32 or MIPS64 compliant CPU. */
724 c
->options
= MIPS_CPU_4KEX
| MIPS_CPU_4K_CACHE
| MIPS_CPU_COUNTER
|
725 MIPS_CPU_DIVEC
| MIPS_CPU_LLSC
| MIPS_CPU_MCHECK
;
727 c
->scache
.flags
= MIPS_CACHE_NOT_PRESENT
;
729 /* Enable FTLB if present and not disabled */
730 set_ftlb_enable(c
, mips_ftlb_disabled
? 0 : FTLB_EN
);
732 ok
= decode_config0(c
); /* Read Config registers. */
733 BUG_ON(!ok
); /* Arch spec violation! */
735 ok
= decode_config1(c
);
737 ok
= decode_config2(c
);
739 ok
= decode_config3(c
);
741 ok
= decode_config4(c
);
743 ok
= decode_config5(c
);
745 /* Probe the EBase.WG bit */
746 if (cpu_has_mips_r2_r6
) {
750 /* {read,write}_c0_ebase_64() may be UNDEFINED prior to r6 */
751 ebase
= cpu_has_mips64r6
? read_c0_ebase_64()
752 : (s32
)read_c0_ebase();
753 if (ebase
& MIPS_EBASE_WG
) {
754 /* WG bit already set, we can avoid the clumsy probe */
755 c
->options
|= MIPS_CPU_EBASE_WG
;
757 /* Its UNDEFINED to change EBase while BEV=0 */
758 status
= read_c0_status();
759 write_c0_status(status
| ST0_BEV
);
762 * On pre-r6 cores, this may well clobber the upper bits
763 * of EBase. This is hard to avoid without potentially
764 * hitting UNDEFINED dm*c0 behaviour if EBase is 32-bit.
766 if (cpu_has_mips64r6
)
767 write_c0_ebase_64(ebase
| MIPS_EBASE_WG
);
769 write_c0_ebase(ebase
| MIPS_EBASE_WG
);
770 back_to_back_c0_hazard();
772 write_c0_status(status
);
773 if (read_c0_ebase() & MIPS_EBASE_WG
) {
774 c
->options
|= MIPS_CPU_EBASE_WG
;
775 write_c0_ebase(ebase
);
780 /* configure the FTLB write probability */
781 set_ftlb_enable(c
, (mips_ftlb_disabled
? 0 : FTLB_EN
) | FTLB_SET_PROB
);
783 mips_probe_watch_registers(c
);
785 #ifndef CONFIG_MIPS_CPS
786 if (cpu_has_mips_r2_r6
) {
789 core
= get_ebase_cpunum();
791 core
>>= fls(core_nvpes()) - 1;
792 cpu_set_core(c
, core
);
798 * Probe for certain guest capabilities by writing config bits and reading back.
799 * Finally write back the original value.
801 #define probe_gc0_config(name, maxconf, bits) \
804 tmp = read_gc0_##name(); \
805 write_gc0_##name(tmp | (bits)); \
806 back_to_back_c0_hazard(); \
807 maxconf = read_gc0_##name(); \
808 write_gc0_##name(tmp); \
812 * Probe for dynamic guest capabilities by changing certain config bits and
813 * reading back to see if they change. Finally write back the original value.
815 #define probe_gc0_config_dyn(name, maxconf, dynconf, bits) \
817 maxconf = read_gc0_##name(); \
818 write_gc0_##name(maxconf ^ (bits)); \
819 back_to_back_c0_hazard(); \
820 dynconf = maxconf ^ read_gc0_##name(); \
821 write_gc0_##name(maxconf); \
822 maxconf |= dynconf; \
825 static inline unsigned int decode_guest_config0(struct cpuinfo_mips
*c
)
827 unsigned int config0
;
829 probe_gc0_config(config
, config0
, MIPS_CONF_M
);
831 if (config0
& MIPS_CONF_M
)
832 c
->guest
.conf
|= BIT(1);
833 return config0
& MIPS_CONF_M
;
836 static inline unsigned int decode_guest_config1(struct cpuinfo_mips
*c
)
838 unsigned int config1
, config1_dyn
;
840 probe_gc0_config_dyn(config1
, config1
, config1_dyn
,
841 MIPS_CONF_M
| MIPS_CONF1_PC
| MIPS_CONF1_WR
|
844 if (config1
& MIPS_CONF1_FP
)
845 c
->guest
.options
|= MIPS_CPU_FPU
;
846 if (config1_dyn
& MIPS_CONF1_FP
)
847 c
->guest
.options_dyn
|= MIPS_CPU_FPU
;
849 if (config1
& MIPS_CONF1_WR
)
850 c
->guest
.options
|= MIPS_CPU_WATCH
;
851 if (config1_dyn
& MIPS_CONF1_WR
)
852 c
->guest
.options_dyn
|= MIPS_CPU_WATCH
;
854 if (config1
& MIPS_CONF1_PC
)
855 c
->guest
.options
|= MIPS_CPU_PERF
;
856 if (config1_dyn
& MIPS_CONF1_PC
)
857 c
->guest
.options_dyn
|= MIPS_CPU_PERF
;
859 if (config1
& MIPS_CONF_M
)
860 c
->guest
.conf
|= BIT(2);
861 return config1
& MIPS_CONF_M
;
864 static inline unsigned int decode_guest_config2(struct cpuinfo_mips
*c
)
866 unsigned int config2
;
868 probe_gc0_config(config2
, config2
, MIPS_CONF_M
);
870 if (config2
& MIPS_CONF_M
)
871 c
->guest
.conf
|= BIT(3);
872 return config2
& MIPS_CONF_M
;
875 static inline unsigned int decode_guest_config3(struct cpuinfo_mips
*c
)
877 unsigned int config3
, config3_dyn
;
879 probe_gc0_config_dyn(config3
, config3
, config3_dyn
,
880 MIPS_CONF_M
| MIPS_CONF3_MSA
| MIPS_CONF3_ULRI
|
883 if (config3
& MIPS_CONF3_CTXTC
)
884 c
->guest
.options
|= MIPS_CPU_CTXTC
;
885 if (config3_dyn
& MIPS_CONF3_CTXTC
)
886 c
->guest
.options_dyn
|= MIPS_CPU_CTXTC
;
888 if (config3
& MIPS_CONF3_PW
)
889 c
->guest
.options
|= MIPS_CPU_HTW
;
891 if (config3
& MIPS_CONF3_ULRI
)
892 c
->guest
.options
|= MIPS_CPU_ULRI
;
894 if (config3
& MIPS_CONF3_SC
)
895 c
->guest
.options
|= MIPS_CPU_SEGMENTS
;
897 if (config3
& MIPS_CONF3_BI
)
898 c
->guest
.options
|= MIPS_CPU_BADINSTR
;
899 if (config3
& MIPS_CONF3_BP
)
900 c
->guest
.options
|= MIPS_CPU_BADINSTRP
;
902 if (config3
& MIPS_CONF3_MSA
)
903 c
->guest
.ases
|= MIPS_ASE_MSA
;
904 if (config3_dyn
& MIPS_CONF3_MSA
)
905 c
->guest
.ases_dyn
|= MIPS_ASE_MSA
;
907 if (config3
& MIPS_CONF_M
)
908 c
->guest
.conf
|= BIT(4);
909 return config3
& MIPS_CONF_M
;
912 static inline unsigned int decode_guest_config4(struct cpuinfo_mips
*c
)
914 unsigned int config4
;
916 probe_gc0_config(config4
, config4
,
917 MIPS_CONF_M
| MIPS_CONF4_KSCREXIST
);
919 c
->guest
.kscratch_mask
= (config4
& MIPS_CONF4_KSCREXIST
)
920 >> MIPS_CONF4_KSCREXIST_SHIFT
;
922 if (config4
& MIPS_CONF_M
)
923 c
->guest
.conf
|= BIT(5);
924 return config4
& MIPS_CONF_M
;
927 static inline unsigned int decode_guest_config5(struct cpuinfo_mips
*c
)
929 unsigned int config5
, config5_dyn
;
931 probe_gc0_config_dyn(config5
, config5
, config5_dyn
,
932 MIPS_CONF_M
| MIPS_CONF5_MVH
| MIPS_CONF5_MRP
);
934 if (config5
& MIPS_CONF5_MRP
)
935 c
->guest
.options
|= MIPS_CPU_MAAR
;
936 if (config5_dyn
& MIPS_CONF5_MRP
)
937 c
->guest
.options_dyn
|= MIPS_CPU_MAAR
;
939 if (config5
& MIPS_CONF5_LLB
)
940 c
->guest
.options
|= MIPS_CPU_RW_LLB
;
942 if (config5
& MIPS_CONF5_MVH
)
943 c
->guest
.options
|= MIPS_CPU_MVH
;
945 if (config5
& MIPS_CONF_M
)
946 c
->guest
.conf
|= BIT(6);
947 return config5
& MIPS_CONF_M
;
950 static inline void decode_guest_configs(struct cpuinfo_mips
*c
)
954 ok
= decode_guest_config0(c
);
956 ok
= decode_guest_config1(c
);
958 ok
= decode_guest_config2(c
);
960 ok
= decode_guest_config3(c
);
962 ok
= decode_guest_config4(c
);
964 decode_guest_config5(c
);
967 static inline void cpu_probe_guestctl0(struct cpuinfo_mips
*c
)
969 unsigned int guestctl0
, temp
;
971 guestctl0
= read_c0_guestctl0();
973 if (guestctl0
& MIPS_GCTL0_G0E
)
974 c
->options
|= MIPS_CPU_GUESTCTL0EXT
;
975 if (guestctl0
& MIPS_GCTL0_G1
)
976 c
->options
|= MIPS_CPU_GUESTCTL1
;
977 if (guestctl0
& MIPS_GCTL0_G2
)
978 c
->options
|= MIPS_CPU_GUESTCTL2
;
979 if (!(guestctl0
& MIPS_GCTL0_RAD
)) {
980 c
->options
|= MIPS_CPU_GUESTID
;
983 * Probe for Direct Root to Guest (DRG). Set GuestCtl1.RID = 0
984 * first, otherwise all data accesses will be fully virtualised
985 * as if they were performed by guest mode.
987 write_c0_guestctl1(0);
990 write_c0_guestctl0(guestctl0
| MIPS_GCTL0_DRG
);
991 back_to_back_c0_hazard();
992 temp
= read_c0_guestctl0();
994 if (temp
& MIPS_GCTL0_DRG
) {
995 write_c0_guestctl0(guestctl0
);
996 c
->options
|= MIPS_CPU_DRG
;
1001 static inline void cpu_probe_guestctl1(struct cpuinfo_mips
*c
)
1003 if (cpu_has_guestid
) {
1004 /* determine the number of bits of GuestID available */
1005 write_c0_guestctl1(MIPS_GCTL1_ID
);
1006 back_to_back_c0_hazard();
1007 c
->guestid_mask
= (read_c0_guestctl1() & MIPS_GCTL1_ID
)
1008 >> MIPS_GCTL1_ID_SHIFT
;
1009 write_c0_guestctl1(0);
1013 static inline void cpu_probe_gtoffset(struct cpuinfo_mips
*c
)
1015 /* determine the number of bits of GTOffset available */
1016 write_c0_gtoffset(0xffffffff);
1017 back_to_back_c0_hazard();
1018 c
->gtoffset_mask
= read_c0_gtoffset();
1019 write_c0_gtoffset(0);
1022 static inline void cpu_probe_vz(struct cpuinfo_mips
*c
)
1024 cpu_probe_guestctl0(c
);
1025 if (cpu_has_guestctl1
)
1026 cpu_probe_guestctl1(c
);
1028 cpu_probe_gtoffset(c
);
1030 decode_guest_configs(c
);
1033 #define R4K_OPTS (MIPS_CPU_TLB | MIPS_CPU_4KEX | MIPS_CPU_4K_CACHE \
1036 static inline void cpu_probe_legacy(struct cpuinfo_mips
*c
, unsigned int cpu
)
1038 switch (c
->processor_id
& PRID_IMP_MASK
) {
1039 case PRID_IMP_R2000
:
1040 c
->cputype
= CPU_R2000
;
1041 __cpu_name
[cpu
] = "R2000";
1042 c
->fpu_msk31
|= FPU_CSR_CONDX
| FPU_CSR_FS
;
1043 c
->options
= MIPS_CPU_TLB
| MIPS_CPU_3K_CACHE
|
1045 if (__cpu_has_fpu())
1046 c
->options
|= MIPS_CPU_FPU
;
1049 case PRID_IMP_R3000
:
1050 if ((c
->processor_id
& PRID_REV_MASK
) == PRID_REV_R3000A
) {
1051 if (cpu_has_confreg()) {
1052 c
->cputype
= CPU_R3081E
;
1053 __cpu_name
[cpu
] = "R3081";
1055 c
->cputype
= CPU_R3000A
;
1056 __cpu_name
[cpu
] = "R3000A";
1059 c
->cputype
= CPU_R3000
;
1060 __cpu_name
[cpu
] = "R3000";
1062 c
->fpu_msk31
|= FPU_CSR_CONDX
| FPU_CSR_FS
;
1063 c
->options
= MIPS_CPU_TLB
| MIPS_CPU_3K_CACHE
|
1065 if (__cpu_has_fpu())
1066 c
->options
|= MIPS_CPU_FPU
;
1069 case PRID_IMP_R4000
:
1070 if (read_c0_config() & CONF_SC
) {
1071 if ((c
->processor_id
& PRID_REV_MASK
) >=
1073 c
->cputype
= CPU_R4400PC
;
1074 __cpu_name
[cpu
] = "R4400PC";
1076 c
->cputype
= CPU_R4000PC
;
1077 __cpu_name
[cpu
] = "R4000PC";
1080 int cca
= read_c0_config() & CONF_CM_CMASK
;
1084 * SC and MC versions can't be reliably told apart,
1085 * but only the latter support coherent caching
1086 * modes so assume the firmware has set the KSEG0
1087 * coherency attribute reasonably (if uncached, we
1091 case CONF_CM_CACHABLE_CE
:
1092 case CONF_CM_CACHABLE_COW
:
1093 case CONF_CM_CACHABLE_CUW
:
1100 if ((c
->processor_id
& PRID_REV_MASK
) >=
1102 c
->cputype
= mc
? CPU_R4400MC
: CPU_R4400SC
;
1103 __cpu_name
[cpu
] = mc
? "R4400MC" : "R4400SC";
1105 c
->cputype
= mc
? CPU_R4000MC
: CPU_R4000SC
;
1106 __cpu_name
[cpu
] = mc
? "R4000MC" : "R4000SC";
1110 set_isa(c
, MIPS_CPU_ISA_III
);
1111 c
->fpu_msk31
|= FPU_CSR_CONDX
;
1112 c
->options
= R4K_OPTS
| MIPS_CPU_FPU
| MIPS_CPU_32FPR
|
1113 MIPS_CPU_WATCH
| MIPS_CPU_VCE
|
1117 case PRID_IMP_R4300
:
1118 c
->cputype
= CPU_R4300
;
1119 __cpu_name
[cpu
] = "R4300";
1120 set_isa(c
, MIPS_CPU_ISA_III
);
1121 c
->fpu_msk31
|= FPU_CSR_CONDX
;
1122 c
->options
= R4K_OPTS
| MIPS_CPU_FPU
| MIPS_CPU_32FPR
|
1126 case PRID_IMP_R4600
:
1127 c
->cputype
= CPU_R4600
;
1128 __cpu_name
[cpu
] = "R4600";
1129 set_isa(c
, MIPS_CPU_ISA_III
);
1130 c
->fpu_msk31
|= FPU_CSR_CONDX
;
1131 c
->options
= R4K_OPTS
| MIPS_CPU_FPU
| MIPS_CPU_32FPR
|
1136 case PRID_IMP_R4650
:
1138 * This processor doesn't have an MMU, so it's not
1139 * "real easy" to run Linux on it. It is left purely
1140 * for documentation. Commented out because it shares
1141 * its c0_prid id number with the TX3900.
1143 c
->cputype
= CPU_R4650
;
1144 __cpu_name
[cpu
] = "R4650";
1145 set_isa(c
, MIPS_CPU_ISA_III
);
1146 c
->fpu_msk31
|= FPU_CSR_CONDX
;
1147 c
->options
= R4K_OPTS
| MIPS_CPU_FPU
| MIPS_CPU_LLSC
;
1151 case PRID_IMP_R4700
:
1152 c
->cputype
= CPU_R4700
;
1153 __cpu_name
[cpu
] = "R4700";
1154 set_isa(c
, MIPS_CPU_ISA_III
);
1155 c
->fpu_msk31
|= FPU_CSR_CONDX
;
1156 c
->options
= R4K_OPTS
| MIPS_CPU_FPU
| MIPS_CPU_32FPR
|
1161 c
->cputype
= CPU_TX49XX
;
1162 __cpu_name
[cpu
] = "R49XX";
1163 set_isa(c
, MIPS_CPU_ISA_III
);
1164 c
->fpu_msk31
|= FPU_CSR_CONDX
;
1165 c
->options
= R4K_OPTS
| MIPS_CPU_LLSC
;
1166 if (!(c
->processor_id
& 0x08))
1167 c
->options
|= MIPS_CPU_FPU
| MIPS_CPU_32FPR
;
1170 case PRID_IMP_R5000
:
1171 c
->cputype
= CPU_R5000
;
1172 __cpu_name
[cpu
] = "R5000";
1173 set_isa(c
, MIPS_CPU_ISA_IV
);
1174 c
->options
= R4K_OPTS
| MIPS_CPU_FPU
| MIPS_CPU_32FPR
|
1178 case PRID_IMP_R5500
:
1179 c
->cputype
= CPU_R5500
;
1180 __cpu_name
[cpu
] = "R5500";
1181 set_isa(c
, MIPS_CPU_ISA_IV
);
1182 c
->options
= R4K_OPTS
| MIPS_CPU_FPU
| MIPS_CPU_32FPR
|
1183 MIPS_CPU_WATCH
| MIPS_CPU_LLSC
;
1186 case PRID_IMP_NEVADA
:
1187 c
->cputype
= CPU_NEVADA
;
1188 __cpu_name
[cpu
] = "Nevada";
1189 set_isa(c
, MIPS_CPU_ISA_IV
);
1190 c
->options
= R4K_OPTS
| MIPS_CPU_FPU
| MIPS_CPU_32FPR
|
1191 MIPS_CPU_DIVEC
| MIPS_CPU_LLSC
;
1194 case PRID_IMP_RM7000
:
1195 c
->cputype
= CPU_RM7000
;
1196 __cpu_name
[cpu
] = "RM7000";
1197 set_isa(c
, MIPS_CPU_ISA_IV
);
1198 c
->options
= R4K_OPTS
| MIPS_CPU_FPU
| MIPS_CPU_32FPR
|
1201 * Undocumented RM7000: Bit 29 in the info register of
1202 * the RM7000 v2.0 indicates if the TLB has 48 or 64
1205 * 29 1 => 64 entry JTLB
1206 * 0 => 48 entry JTLB
1208 c
->tlbsize
= (read_c0_info() & (1 << 29)) ? 64 : 48;
1210 case PRID_IMP_R10000
:
1211 c
->cputype
= CPU_R10000
;
1212 __cpu_name
[cpu
] = "R10000";
1213 set_isa(c
, MIPS_CPU_ISA_IV
);
1214 c
->options
= MIPS_CPU_TLB
| MIPS_CPU_4K_CACHE
| MIPS_CPU_4KEX
|
1215 MIPS_CPU_FPU
| MIPS_CPU_32FPR
|
1216 MIPS_CPU_COUNTER
| MIPS_CPU_WATCH
|
1220 case PRID_IMP_R12000
:
1221 c
->cputype
= CPU_R12000
;
1222 __cpu_name
[cpu
] = "R12000";
1223 set_isa(c
, MIPS_CPU_ISA_IV
);
1224 c
->options
= MIPS_CPU_TLB
| MIPS_CPU_4K_CACHE
| MIPS_CPU_4KEX
|
1225 MIPS_CPU_FPU
| MIPS_CPU_32FPR
|
1226 MIPS_CPU_COUNTER
| MIPS_CPU_WATCH
|
1229 write_c0_r10k_diag(read_c0_r10k_diag() | R10K_DIAG_E_GHIST
);
1231 case PRID_IMP_R14000
:
1232 if (((c
->processor_id
>> 4) & 0x0f) > 2) {
1233 c
->cputype
= CPU_R16000
;
1234 __cpu_name
[cpu
] = "R16000";
1236 c
->cputype
= CPU_R14000
;
1237 __cpu_name
[cpu
] = "R14000";
1239 set_isa(c
, MIPS_CPU_ISA_IV
);
1240 c
->options
= MIPS_CPU_TLB
| MIPS_CPU_4K_CACHE
| MIPS_CPU_4KEX
|
1241 MIPS_CPU_FPU
| MIPS_CPU_32FPR
|
1242 MIPS_CPU_COUNTER
| MIPS_CPU_WATCH
|
1245 write_c0_r10k_diag(read_c0_r10k_diag() | R10K_DIAG_E_GHIST
);
1247 case PRID_IMP_LOONGSON_64C
: /* Loongson-2/3 */
1248 switch (c
->processor_id
& PRID_REV_MASK
) {
1249 case PRID_REV_LOONGSON2E
:
1250 c
->cputype
= CPU_LOONGSON2EF
;
1251 __cpu_name
[cpu
] = "ICT Loongson-2";
1252 set_elf_platform(cpu
, "loongson2e");
1253 set_isa(c
, MIPS_CPU_ISA_III
);
1254 c
->fpu_msk31
|= FPU_CSR_CONDX
;
1256 case PRID_REV_LOONGSON2F
:
1257 c
->cputype
= CPU_LOONGSON2EF
;
1258 __cpu_name
[cpu
] = "ICT Loongson-2";
1259 set_elf_platform(cpu
, "loongson2f");
1260 set_isa(c
, MIPS_CPU_ISA_III
);
1261 c
->fpu_msk31
|= FPU_CSR_CONDX
;
1263 case PRID_REV_LOONGSON3A_R1
:
1264 c
->cputype
= CPU_LOONGSON64
;
1265 __cpu_name
[cpu
] = "ICT Loongson-3";
1266 set_elf_platform(cpu
, "loongson3a");
1267 set_isa(c
, MIPS_CPU_ISA_M64R1
);
1268 c
->ases
|= (MIPS_ASE_LOONGSON_MMI
| MIPS_ASE_LOONGSON_CAM
|
1269 MIPS_ASE_LOONGSON_EXT
);
1271 case PRID_REV_LOONGSON3B_R1
:
1272 case PRID_REV_LOONGSON3B_R2
:
1273 c
->cputype
= CPU_LOONGSON64
;
1274 __cpu_name
[cpu
] = "ICT Loongson-3";
1275 set_elf_platform(cpu
, "loongson3b");
1276 set_isa(c
, MIPS_CPU_ISA_M64R1
);
1277 c
->ases
|= (MIPS_ASE_LOONGSON_MMI
| MIPS_ASE_LOONGSON_CAM
|
1278 MIPS_ASE_LOONGSON_EXT
);
1282 c
->options
= R4K_OPTS
|
1283 MIPS_CPU_FPU
| MIPS_CPU_LLSC
|
1286 set_cpu_asid_mask(c
, MIPS_ENTRYHI_ASID
);
1287 c
->writecombine
= _CACHE_UNCACHED_ACCELERATED
;
1289 case PRID_IMP_LOONGSON_32
: /* Loongson-1 */
1292 c
->cputype
= CPU_LOONGSON32
;
1294 switch (c
->processor_id
& PRID_REV_MASK
) {
1295 case PRID_REV_LOONGSON1B
:
1296 __cpu_name
[cpu
] = "Loongson 1B";
1304 static inline void cpu_probe_mips(struct cpuinfo_mips
*c
, unsigned int cpu
)
1306 c
->writecombine
= _CACHE_UNCACHED_ACCELERATED
;
1307 switch (c
->processor_id
& PRID_IMP_MASK
) {
1308 case PRID_IMP_QEMU_GENERIC
:
1309 c
->writecombine
= _CACHE_UNCACHED
;
1310 c
->cputype
= CPU_QEMU_GENERIC
;
1311 __cpu_name
[cpu
] = "MIPS GENERIC QEMU";
1314 c
->cputype
= CPU_4KC
;
1315 c
->writecombine
= _CACHE_UNCACHED
;
1316 __cpu_name
[cpu
] = "MIPS 4Kc";
1319 case PRID_IMP_4KECR2
:
1320 c
->cputype
= CPU_4KEC
;
1321 c
->writecombine
= _CACHE_UNCACHED
;
1322 __cpu_name
[cpu
] = "MIPS 4KEc";
1326 c
->cputype
= CPU_4KSC
;
1327 c
->writecombine
= _CACHE_UNCACHED
;
1328 __cpu_name
[cpu
] = "MIPS 4KSc";
1331 c
->cputype
= CPU_5KC
;
1332 c
->writecombine
= _CACHE_UNCACHED
;
1333 __cpu_name
[cpu
] = "MIPS 5Kc";
1336 c
->cputype
= CPU_5KE
;
1337 c
->writecombine
= _CACHE_UNCACHED
;
1338 __cpu_name
[cpu
] = "MIPS 5KE";
1341 c
->cputype
= CPU_20KC
;
1342 c
->writecombine
= _CACHE_UNCACHED
;
1343 __cpu_name
[cpu
] = "MIPS 20Kc";
1346 c
->cputype
= CPU_24K
;
1347 c
->writecombine
= _CACHE_UNCACHED
;
1348 __cpu_name
[cpu
] = "MIPS 24Kc";
1351 c
->cputype
= CPU_24K
;
1352 c
->writecombine
= _CACHE_UNCACHED
;
1353 __cpu_name
[cpu
] = "MIPS 24KEc";
1356 c
->cputype
= CPU_25KF
;
1357 c
->writecombine
= _CACHE_UNCACHED
;
1358 __cpu_name
[cpu
] = "MIPS 25Kc";
1361 c
->cputype
= CPU_34K
;
1362 c
->writecombine
= _CACHE_UNCACHED
;
1363 __cpu_name
[cpu
] = "MIPS 34Kc";
1364 cpu_set_mt_per_tc_perf(c
);
1367 c
->cputype
= CPU_74K
;
1368 c
->writecombine
= _CACHE_UNCACHED
;
1369 __cpu_name
[cpu
] = "MIPS 74Kc";
1371 case PRID_IMP_M14KC
:
1372 c
->cputype
= CPU_M14KC
;
1373 c
->writecombine
= _CACHE_UNCACHED
;
1374 __cpu_name
[cpu
] = "MIPS M14Kc";
1376 case PRID_IMP_M14KEC
:
1377 c
->cputype
= CPU_M14KEC
;
1378 c
->writecombine
= _CACHE_UNCACHED
;
1379 __cpu_name
[cpu
] = "MIPS M14KEc";
1381 case PRID_IMP_1004K
:
1382 c
->cputype
= CPU_1004K
;
1383 c
->writecombine
= _CACHE_UNCACHED
;
1384 __cpu_name
[cpu
] = "MIPS 1004Kc";
1385 cpu_set_mt_per_tc_perf(c
);
1387 case PRID_IMP_1074K
:
1388 c
->cputype
= CPU_1074K
;
1389 c
->writecombine
= _CACHE_UNCACHED
;
1390 __cpu_name
[cpu
] = "MIPS 1074Kc";
1392 case PRID_IMP_INTERAPTIV_UP
:
1393 c
->cputype
= CPU_INTERAPTIV
;
1394 __cpu_name
[cpu
] = "MIPS interAptiv";
1395 cpu_set_mt_per_tc_perf(c
);
1397 case PRID_IMP_INTERAPTIV_MP
:
1398 c
->cputype
= CPU_INTERAPTIV
;
1399 __cpu_name
[cpu
] = "MIPS interAptiv (multi)";
1400 cpu_set_mt_per_tc_perf(c
);
1402 case PRID_IMP_PROAPTIV_UP
:
1403 c
->cputype
= CPU_PROAPTIV
;
1404 __cpu_name
[cpu
] = "MIPS proAptiv";
1406 case PRID_IMP_PROAPTIV_MP
:
1407 c
->cputype
= CPU_PROAPTIV
;
1408 __cpu_name
[cpu
] = "MIPS proAptiv (multi)";
1410 case PRID_IMP_P5600
:
1411 c
->cputype
= CPU_P5600
;
1412 __cpu_name
[cpu
] = "MIPS P5600";
1414 case PRID_IMP_P6600
:
1415 c
->cputype
= CPU_P6600
;
1416 __cpu_name
[cpu
] = "MIPS P6600";
1418 case PRID_IMP_I6400
:
1419 c
->cputype
= CPU_I6400
;
1420 __cpu_name
[cpu
] = "MIPS I6400";
1422 case PRID_IMP_I6500
:
1423 c
->cputype
= CPU_I6500
;
1424 __cpu_name
[cpu
] = "MIPS I6500";
1426 case PRID_IMP_M5150
:
1427 c
->cputype
= CPU_M5150
;
1428 __cpu_name
[cpu
] = "MIPS M5150";
1430 case PRID_IMP_M6250
:
1431 c
->cputype
= CPU_M6250
;
1432 __cpu_name
[cpu
] = "MIPS M6250";
1442 switch (__get_cpu_type(c
->cputype
)) {
1445 set_isa(c
, MIPS_CPU_ISA_M32R5
);
1448 c
->options
|= MIPS_CPU_SHARED_FTLB_ENTRIES
;
1451 c
->options
|= MIPS_CPU_SHARED_FTLB_RAM
;
1457 /* Recent MIPS cores use the implementation-dependent ExcCode 16 for
1458 * cache/FTLB parity exceptions.
1460 switch (__get_cpu_type(c
->cputype
)) {
1466 c
->options
|= MIPS_CPU_FTLBPAREX
;
1471 static inline void cpu_probe_alchemy(struct cpuinfo_mips
*c
, unsigned int cpu
)
1474 switch (c
->processor_id
& PRID_IMP_MASK
) {
1475 case PRID_IMP_AU1_REV1
:
1476 case PRID_IMP_AU1_REV2
:
1477 c
->cputype
= CPU_ALCHEMY
;
1478 switch ((c
->processor_id
>> 24) & 0xff) {
1480 __cpu_name
[cpu
] = "Au1000";
1483 __cpu_name
[cpu
] = "Au1500";
1486 __cpu_name
[cpu
] = "Au1100";
1489 __cpu_name
[cpu
] = "Au1550";
1492 __cpu_name
[cpu
] = "Au1200";
1493 if ((c
->processor_id
& PRID_REV_MASK
) == 2)
1494 __cpu_name
[cpu
] = "Au1250";
1497 __cpu_name
[cpu
] = "Au1210";
1500 __cpu_name
[cpu
] = "Au1xxx";
1504 case PRID_IMP_NETLOGIC_AU13XX
:
1505 c
->cputype
= CPU_ALCHEMY
;
1506 __cpu_name
[cpu
] = "Au1300";
1511 static inline void cpu_probe_sibyte(struct cpuinfo_mips
*c
, unsigned int cpu
)
1515 c
->writecombine
= _CACHE_UNCACHED_ACCELERATED
;
1516 switch (c
->processor_id
& PRID_IMP_MASK
) {
1518 c
->cputype
= CPU_SB1
;
1519 __cpu_name
[cpu
] = "SiByte SB1";
1520 /* FPU in pass1 is known to have issues. */
1521 if ((c
->processor_id
& PRID_REV_MASK
) < 0x02)
1522 c
->options
&= ~(MIPS_CPU_FPU
| MIPS_CPU_32FPR
);
1525 c
->cputype
= CPU_SB1A
;
1526 __cpu_name
[cpu
] = "SiByte SB1A";
1531 static inline void cpu_probe_sandcraft(struct cpuinfo_mips
*c
, unsigned int cpu
)
1534 switch (c
->processor_id
& PRID_IMP_MASK
) {
1535 case PRID_IMP_SR71000
:
1536 c
->cputype
= CPU_SR71000
;
1537 __cpu_name
[cpu
] = "Sandcraft SR71000";
1544 static inline void cpu_probe_nxp(struct cpuinfo_mips
*c
, unsigned int cpu
)
1547 switch (c
->processor_id
& PRID_IMP_MASK
) {
1548 case PRID_IMP_PR4450
:
1549 c
->cputype
= CPU_PR4450
;
1550 __cpu_name
[cpu
] = "Philips PR4450";
1551 set_isa(c
, MIPS_CPU_ISA_M32R1
);
1556 static inline void cpu_probe_broadcom(struct cpuinfo_mips
*c
, unsigned int cpu
)
1559 switch (c
->processor_id
& PRID_IMP_MASK
) {
1560 case PRID_IMP_BMIPS32_REV4
:
1561 case PRID_IMP_BMIPS32_REV8
:
1562 c
->cputype
= CPU_BMIPS32
;
1563 __cpu_name
[cpu
] = "Broadcom BMIPS32";
1564 set_elf_platform(cpu
, "bmips32");
1566 case PRID_IMP_BMIPS3300
:
1567 case PRID_IMP_BMIPS3300_ALT
:
1568 case PRID_IMP_BMIPS3300_BUG
:
1569 c
->cputype
= CPU_BMIPS3300
;
1570 __cpu_name
[cpu
] = "Broadcom BMIPS3300";
1571 set_elf_platform(cpu
, "bmips3300");
1572 reserve_exception_space(0x400, VECTORSPACING
* 64);
1574 case PRID_IMP_BMIPS43XX
: {
1575 int rev
= c
->processor_id
& PRID_REV_MASK
;
1577 if (rev
>= PRID_REV_BMIPS4380_LO
&&
1578 rev
<= PRID_REV_BMIPS4380_HI
) {
1579 c
->cputype
= CPU_BMIPS4380
;
1580 __cpu_name
[cpu
] = "Broadcom BMIPS4380";
1581 set_elf_platform(cpu
, "bmips4380");
1582 c
->options
|= MIPS_CPU_RIXI
;
1583 reserve_exception_space(0x400, VECTORSPACING
* 64);
1585 c
->cputype
= CPU_BMIPS4350
;
1586 __cpu_name
[cpu
] = "Broadcom BMIPS4350";
1587 set_elf_platform(cpu
, "bmips4350");
1591 case PRID_IMP_BMIPS5000
:
1592 case PRID_IMP_BMIPS5200
:
1593 c
->cputype
= CPU_BMIPS5000
;
1594 if ((c
->processor_id
& PRID_IMP_MASK
) == PRID_IMP_BMIPS5200
)
1595 __cpu_name
[cpu
] = "Broadcom BMIPS5200";
1597 __cpu_name
[cpu
] = "Broadcom BMIPS5000";
1598 set_elf_platform(cpu
, "bmips5000");
1599 c
->options
|= MIPS_CPU_ULRI
| MIPS_CPU_RIXI
;
1600 reserve_exception_space(0x1000, VECTORSPACING
* 64);
1605 static inline void cpu_probe_cavium(struct cpuinfo_mips
*c
, unsigned int cpu
)
1608 /* Octeon has different cache interface */
1609 c
->options
&= ~MIPS_CPU_4K_CACHE
;
1610 switch (c
->processor_id
& PRID_IMP_MASK
) {
1611 case PRID_IMP_CAVIUM_CN38XX
:
1612 case PRID_IMP_CAVIUM_CN31XX
:
1613 case PRID_IMP_CAVIUM_CN30XX
:
1614 c
->cputype
= CPU_CAVIUM_OCTEON
;
1615 __cpu_name
[cpu
] = "Cavium Octeon";
1617 case PRID_IMP_CAVIUM_CN58XX
:
1618 case PRID_IMP_CAVIUM_CN56XX
:
1619 case PRID_IMP_CAVIUM_CN50XX
:
1620 case PRID_IMP_CAVIUM_CN52XX
:
1621 c
->cputype
= CPU_CAVIUM_OCTEON_PLUS
;
1622 __cpu_name
[cpu
] = "Cavium Octeon+";
1624 set_elf_platform(cpu
, "octeon");
1626 case PRID_IMP_CAVIUM_CN61XX
:
1627 case PRID_IMP_CAVIUM_CN63XX
:
1628 case PRID_IMP_CAVIUM_CN66XX
:
1629 case PRID_IMP_CAVIUM_CN68XX
:
1630 case PRID_IMP_CAVIUM_CNF71XX
:
1631 c
->cputype
= CPU_CAVIUM_OCTEON2
;
1632 __cpu_name
[cpu
] = "Cavium Octeon II";
1633 set_elf_platform(cpu
, "octeon2");
1635 case PRID_IMP_CAVIUM_CN70XX
:
1636 case PRID_IMP_CAVIUM_CN73XX
:
1637 case PRID_IMP_CAVIUM_CNF75XX
:
1638 case PRID_IMP_CAVIUM_CN78XX
:
1639 c
->cputype
= CPU_CAVIUM_OCTEON3
;
1640 __cpu_name
[cpu
] = "Cavium Octeon III";
1641 set_elf_platform(cpu
, "octeon3");
1644 printk(KERN_INFO
"Unknown Octeon chip!\n");
1645 c
->cputype
= CPU_UNKNOWN
;
1650 #ifdef CONFIG_CPU_LOONGSON64
1651 #include <loongson_regs.h>
1653 static inline void decode_cpucfg(struct cpuinfo_mips
*c
)
1655 u32 cfg1
= read_cpucfg(LOONGSON_CFG1
);
1656 u32 cfg2
= read_cpucfg(LOONGSON_CFG2
);
1657 u32 cfg3
= read_cpucfg(LOONGSON_CFG3
);
1659 if (cfg1
& LOONGSON_CFG1_MMI
)
1660 c
->ases
|= MIPS_ASE_LOONGSON_MMI
;
1662 if (cfg2
& LOONGSON_CFG2_LEXT1
)
1663 c
->ases
|= MIPS_ASE_LOONGSON_EXT
;
1665 if (cfg2
& LOONGSON_CFG2_LEXT2
)
1666 c
->ases
|= MIPS_ASE_LOONGSON_EXT2
;
1668 if (cfg2
& LOONGSON_CFG2_LSPW
) {
1669 c
->options
|= MIPS_CPU_LDPTE
;
1670 c
->guest
.options
|= MIPS_CPU_LDPTE
;
1673 if (cfg3
& LOONGSON_CFG3_LCAMP
)
1674 c
->ases
|= MIPS_ASE_LOONGSON_CAM
;
1677 static inline void cpu_probe_loongson(struct cpuinfo_mips
*c
, unsigned int cpu
)
1679 c
->cputype
= CPU_LOONGSON64
;
1681 /* All Loongson processors covered here define ExcCode 16 as GSExc. */
1683 c
->options
|= MIPS_CPU_GSEXCEX
;
1685 switch (c
->processor_id
& PRID_IMP_MASK
) {
1686 case PRID_IMP_LOONGSON_64R
: /* Loongson-64 Reduced */
1687 switch (c
->processor_id
& PRID_REV_MASK
) {
1688 case PRID_REV_LOONGSON2K_R1_0
:
1689 case PRID_REV_LOONGSON2K_R1_1
:
1690 case PRID_REV_LOONGSON2K_R1_2
:
1691 case PRID_REV_LOONGSON2K_R1_3
:
1692 __cpu_name
[cpu
] = "Loongson-2K";
1693 set_elf_platform(cpu
, "gs264e");
1694 set_isa(c
, MIPS_CPU_ISA_M64R2
);
1697 c
->ases
|= (MIPS_ASE_LOONGSON_MMI
| MIPS_ASE_LOONGSON_EXT
|
1698 MIPS_ASE_LOONGSON_EXT2
);
1700 case PRID_IMP_LOONGSON_64C
: /* Loongson-3 Classic */
1701 switch (c
->processor_id
& PRID_REV_MASK
) {
1702 case PRID_REV_LOONGSON3A_R2_0
:
1703 case PRID_REV_LOONGSON3A_R2_1
:
1704 __cpu_name
[cpu
] = "ICT Loongson-3";
1705 set_elf_platform(cpu
, "loongson3a");
1706 set_isa(c
, MIPS_CPU_ISA_M64R2
);
1708 case PRID_REV_LOONGSON3A_R3_0
:
1709 case PRID_REV_LOONGSON3A_R3_1
:
1710 __cpu_name
[cpu
] = "ICT Loongson-3";
1711 set_elf_platform(cpu
, "loongson3a");
1712 set_isa(c
, MIPS_CPU_ISA_M64R2
);
1716 * Loongson-3 Classic did not implement MIPS standard TLBINV
1717 * but implemented TLBINVF and EHINV. As currently we're only
1718 * using these two features, enable MIPS_CPU_TLBINV as well.
1720 * Also some early Loongson-3A2000 had wrong TLB type in Config
1721 * register, we correct it here.
1723 c
->options
|= MIPS_CPU_FTLB
| MIPS_CPU_TLBINV
| MIPS_CPU_LDPTE
;
1724 c
->ases
|= (MIPS_ASE_LOONGSON_MMI
| MIPS_ASE_LOONGSON_CAM
|
1725 MIPS_ASE_LOONGSON_EXT
| MIPS_ASE_LOONGSON_EXT2
);
1726 c
->ases
&= ~MIPS_ASE_VZ
; /* VZ of Loongson-3A2000/3000 is incomplete */
1727 change_c0_config6(LOONGSON_CONF6_EXTIMER
| LOONGSON_CONF6_INTIMER
,
1728 LOONGSON_CONF6_INTIMER
);
1730 case PRID_IMP_LOONGSON_64G
:
1731 __cpu_name
[cpu
] = "ICT Loongson-3";
1732 set_elf_platform(cpu
, "loongson3a");
1733 set_isa(c
, MIPS_CPU_ISA_M64R2
);
1735 change_c0_config6(LOONGSON_CONF6_EXTIMER
| LOONGSON_CONF6_INTIMER
,
1736 LOONGSON_CONF6_INTIMER
);
1739 panic("Unknown Loongson Processor ID!");
1744 static inline void cpu_probe_loongson(struct cpuinfo_mips
*c
, unsigned int cpu
) { }
1747 static inline void cpu_probe_ingenic(struct cpuinfo_mips
*c
, unsigned int cpu
)
1752 * XBurst misses a config2 register, so config3 decode was skipped in
1757 /* XBurst does not implement the CP0 counter. */
1758 c
->options
&= ~MIPS_CPU_COUNTER
;
1759 BUG_ON(__builtin_constant_p(cpu_has_counter
) && cpu_has_counter
);
1761 /* XBurst has virtually tagged icache */
1762 c
->icache
.flags
|= MIPS_CACHE_VTAG
;
1764 switch (c
->processor_id
& PRID_IMP_MASK
) {
1766 /* XBurst®1 with MXU1.0/MXU1.1 SIMD ISA */
1767 case PRID_IMP_XBURST_REV1
:
1770 * The XBurst core by default attempts to avoid branch target
1771 * buffer lookups by detecting & special casing loops. This
1772 * feature will cause BogoMIPS and lpj calculate in error.
1773 * Set cp0 config7 bit 4 to disable this feature.
1775 set_c0_config7(MIPS_CONF7_BTB_LOOP_EN
);
1777 switch (c
->processor_id
& PRID_COMP_MASK
) {
1780 * The config0 register in the XBurst CPUs with a processor ID of
1781 * PRID_COMP_INGENIC_D0 report themselves as MIPS32r2 compatible,
1782 * but they don't actually support this ISA.
1784 case PRID_COMP_INGENIC_D0
:
1785 c
->isa_level
&= ~MIPS_CPU_ISA_M32R2
;
1787 /* FPU is not properly detected on JZ4760(B). */
1788 if (c
->processor_id
== 0x2ed0024f)
1789 c
->options
|= MIPS_CPU_FPU
;
1794 * The config0 register in the XBurst CPUs with a processor ID of
1795 * PRID_COMP_INGENIC_D0 or PRID_COMP_INGENIC_D1 has an abandoned
1796 * huge page tlb mode, this mode is not compatible with the MIPS
1797 * standard, it will cause tlbmiss and into an infinite loop
1798 * (line 21 in the tlb-funcs.S) when starting the init process.
1799 * After chip reset, the default is HPTLB mode, Write 0xa9000000
1800 * to cp0 register 5 sel 4 to switch back to VTLB mode to prevent
1803 case PRID_COMP_INGENIC_D1
:
1804 write_c0_page_ctrl(XBURST_PAGECTRL_HPTLB_DIS
);
1812 /* XBurst®1 with MXU2.0 SIMD ISA */
1813 case PRID_IMP_XBURST_REV2
:
1814 /* Ingenic uses the WA bit to achieve write-combine memory writes */
1815 c
->writecombine
= _CACHE_CACHABLE_WA
;
1816 c
->cputype
= CPU_XBURST
;
1817 __cpu_name
[cpu
] = "Ingenic XBurst";
1820 /* XBurst®2 with MXU2.1 SIMD ISA */
1821 case PRID_IMP_XBURST2
:
1822 c
->cputype
= CPU_XBURST
;
1823 __cpu_name
[cpu
] = "Ingenic XBurst II";
1827 panic("Unknown Ingenic Processor ID!");
1833 /* For use by uaccess.h */
1835 EXPORT_SYMBOL(__ua_limit
);
1838 const char *__cpu_name
[NR_CPUS
];
1839 const char *__elf_platform
;
1840 const char *__elf_base_platform
;
1842 void cpu_probe(void)
1844 struct cpuinfo_mips
*c
= ¤t_cpu_data
;
1845 unsigned int cpu
= smp_processor_id();
1848 * Set a default elf platform, cpu probe may later
1849 * overwrite it with a more precise value
1851 set_elf_platform(cpu
, "mips");
1853 c
->processor_id
= PRID_IMP_UNKNOWN
;
1854 c
->fpu_id
= FPIR_IMP_NONE
;
1855 c
->cputype
= CPU_UNKNOWN
;
1856 c
->writecombine
= _CACHE_UNCACHED
;
1858 c
->fpu_csr31
= FPU_CSR_RN
;
1859 c
->fpu_msk31
= FPU_CSR_RSVD
| FPU_CSR_ABS2008
| FPU_CSR_NAN2008
;
1861 c
->processor_id
= read_c0_prid();
1862 switch (c
->processor_id
& PRID_COMP_MASK
) {
1863 case PRID_COMP_LEGACY
:
1864 cpu_probe_legacy(c
, cpu
);
1866 case PRID_COMP_MIPS
:
1867 cpu_probe_mips(c
, cpu
);
1869 case PRID_COMP_ALCHEMY
:
1870 case PRID_COMP_NETLOGIC
:
1871 cpu_probe_alchemy(c
, cpu
);
1873 case PRID_COMP_SIBYTE
:
1874 cpu_probe_sibyte(c
, cpu
);
1876 case PRID_COMP_BROADCOM
:
1877 cpu_probe_broadcom(c
, cpu
);
1879 case PRID_COMP_SANDCRAFT
:
1880 cpu_probe_sandcraft(c
, cpu
);
1883 cpu_probe_nxp(c
, cpu
);
1885 case PRID_COMP_CAVIUM
:
1886 cpu_probe_cavium(c
, cpu
);
1888 case PRID_COMP_LOONGSON
:
1889 cpu_probe_loongson(c
, cpu
);
1891 case PRID_COMP_INGENIC_13
:
1892 case PRID_COMP_INGENIC_D0
:
1893 case PRID_COMP_INGENIC_D1
:
1894 case PRID_COMP_INGENIC_E1
:
1895 cpu_probe_ingenic(c
, cpu
);
1899 BUG_ON(!__cpu_name
[cpu
]);
1900 BUG_ON(c
->cputype
== CPU_UNKNOWN
);
1903 * Platform code can force the cpu type to optimize code
1904 * generation. In that case be sure the cpu type is correctly
1905 * manually setup otherwise it could trigger some nasty bugs.
1907 BUG_ON(current_cpu_type() != c
->cputype
);
1910 /* Enable the RIXI exceptions */
1911 set_c0_pagegrain(PG_IEC
);
1912 back_to_back_c0_hazard();
1913 /* Verify the IEC bit is set */
1914 if (read_c0_pagegrain() & PG_IEC
)
1915 c
->options
|= MIPS_CPU_RIXIEX
;
1918 if (mips_fpu_disabled
)
1919 c
->options
&= ~MIPS_CPU_FPU
;
1921 if (mips_dsp_disabled
)
1922 c
->ases
&= ~(MIPS_ASE_DSP
| MIPS_ASE_DSP2P
);
1924 if (mips_htw_disabled
) {
1925 c
->options
&= ~MIPS_CPU_HTW
;
1926 write_c0_pwctl(read_c0_pwctl() &
1927 ~(1 << MIPS_PWCTL_PWEN_SHIFT
));
1930 if (c
->options
& MIPS_CPU_FPU
)
1931 cpu_set_fpu_opts(c
);
1933 cpu_set_nofpu_opts(c
);
1935 if (cpu_has_mips_r2_r6
) {
1936 c
->srsets
= ((read_c0_srsctl() >> 26) & 0x0f) + 1;
1937 /* R2 has Performance Counter Interrupt indicator */
1938 c
->options
|= MIPS_CPU_PCI
;
1943 if (cpu_has_mips_r6
)
1944 elf_hwcap
|= HWCAP_MIPS_R6
;
1947 c
->msa_id
= cpu_get_msa_id();
1948 WARN(c
->msa_id
& MSA_IR_WRPF
,
1949 "Vector register partitioning unimplemented!");
1950 elf_hwcap
|= HWCAP_MIPS_MSA
;
1954 elf_hwcap
|= HWCAP_MIPS_MIPS16
;
1957 elf_hwcap
|= HWCAP_MIPS_MDMX
;
1960 elf_hwcap
|= HWCAP_MIPS_MIPS3D
;
1962 if (cpu_has_smartmips
)
1963 elf_hwcap
|= HWCAP_MIPS_SMARTMIPS
;
1966 elf_hwcap
|= HWCAP_MIPS_DSP
;
1969 elf_hwcap
|= HWCAP_MIPS_DSP2
;
1972 elf_hwcap
|= HWCAP_MIPS_DSP3
;
1974 if (cpu_has_mips16e2
)
1975 elf_hwcap
|= HWCAP_MIPS_MIPS16E2
;
1977 if (cpu_has_loongson_mmi
)
1978 elf_hwcap
|= HWCAP_LOONGSON_MMI
;
1980 if (cpu_has_loongson_ext
)
1981 elf_hwcap
|= HWCAP_LOONGSON_EXT
;
1983 if (cpu_has_loongson_ext2
)
1984 elf_hwcap
|= HWCAP_LOONGSON_EXT2
;
1989 cpu_probe_vmbits(c
);
1991 /* Synthesize CPUCFG data if running on Loongson processors;
1994 * This looks at previously probed features, so keep this at bottom.
1996 loongson3_cpucfg_synthesize_data(c
);
2000 __ua_limit
= ~((1ull << cpu_vmbits
) - 1);
2003 reserve_exception_space(0, 0x1000);
2006 void cpu_report(void)
2008 struct cpuinfo_mips
*c
= ¤t_cpu_data
;
2010 pr_info("CPU%d revision is: %08x (%s)\n",
2011 smp_processor_id(), c
->processor_id
, cpu_name_string());
2012 if (c
->options
& MIPS_CPU_FPU
)
2013 printk(KERN_INFO
"FPU revision is: %08x\n", c
->fpu_id
);
2015 pr_info("MSA revision is: %08x\n", c
->msa_id
);
2018 void cpu_set_cluster(struct cpuinfo_mips
*cpuinfo
, unsigned int cluster
)
2020 /* Ensure the core number fits in the field */
2021 WARN_ON(cluster
> (MIPS_GLOBALNUMBER_CLUSTER
>>
2022 MIPS_GLOBALNUMBER_CLUSTER_SHF
));
2024 cpuinfo
->globalnumber
&= ~MIPS_GLOBALNUMBER_CLUSTER
;
2025 cpuinfo
->globalnumber
|= cluster
<< MIPS_GLOBALNUMBER_CLUSTER_SHF
;
2028 void cpu_set_core(struct cpuinfo_mips
*cpuinfo
, unsigned int core
)
2030 /* Ensure the core number fits in the field */
2031 WARN_ON(core
> (MIPS_GLOBALNUMBER_CORE
>> MIPS_GLOBALNUMBER_CORE_SHF
));
2033 cpuinfo
->globalnumber
&= ~MIPS_GLOBALNUMBER_CORE
;
2034 cpuinfo
->globalnumber
|= core
<< MIPS_GLOBALNUMBER_CORE_SHF
;
2037 void cpu_set_vpe_id(struct cpuinfo_mips
*cpuinfo
, unsigned int vpe
)
2039 /* Ensure the VP(E) ID fits in the field */
2040 WARN_ON(vpe
> (MIPS_GLOBALNUMBER_VP
>> MIPS_GLOBALNUMBER_VP_SHF
));
2042 /* Ensure we're not using VP(E)s without support */
2043 WARN_ON(vpe
&& !IS_ENABLED(CONFIG_MIPS_MT_SMP
) &&
2044 !IS_ENABLED(CONFIG_CPU_MIPSR6
));
2046 cpuinfo
->globalnumber
&= ~MIPS_GLOBALNUMBER_VP
;
2047 cpuinfo
->globalnumber
|= vpe
<< MIPS_GLOBALNUMBER_VP_SHF
;