diff options
Diffstat (limited to 'arch/mips/kernel')
-rw-r--r-- | arch/mips/kernel/cevt-r4k.c | 2 | ||||
-rw-r--r-- | arch/mips/kernel/cpu-probe.c | 11 | ||||
-rw-r--r-- | arch/mips/kernel/traps.c | 7 |
3 files changed, 17 insertions, 3 deletions
diff --git a/arch/mips/kernel/cevt-r4k.c b/arch/mips/kernel/cevt-r4k.c index b469ad05d520..0b2450ceb13f 100644 --- a/arch/mips/kernel/cevt-r4k.c +++ b/arch/mips/kernel/cevt-r4k.c | |||
@@ -97,7 +97,7 @@ void mips_event_handler(struct clock_event_device *dev) | |||
97 | */ | 97 | */ |
98 | static int c0_compare_int_pending(void) | 98 | static int c0_compare_int_pending(void) |
99 | { | 99 | { |
100 | return (read_c0_cause() >> cp0_compare_irq) & 0x100; | 100 | return (read_c0_cause() >> cp0_compare_irq_shift) & (1ul << CAUSEB_IP); |
101 | } | 101 | } |
102 | 102 | ||
103 | /* | 103 | /* |
diff --git a/arch/mips/kernel/cpu-probe.c b/arch/mips/kernel/cpu-probe.c index 80e202eca056..758ad426c57f 100644 --- a/arch/mips/kernel/cpu-probe.c +++ b/arch/mips/kernel/cpu-probe.c | |||
@@ -284,6 +284,15 @@ static inline int __cpu_has_fpu(void) | |||
284 | return ((cpu_get_fpu_id() & 0xff00) != FPIR_IMP_NONE); | 284 | return ((cpu_get_fpu_id() & 0xff00) != FPIR_IMP_NONE); |
285 | } | 285 | } |
286 | 286 | ||
287 | static inline void cpu_probe_vmbits(struct cpuinfo_mips *c) | ||
288 | { | ||
289 | #ifdef __NEED_VMBITS_PROBE | ||
290 | write_c0_entryhi(0x3fffffffffffe000ULL); | ||
291 | back_to_back_c0_hazard(); | ||
292 | c->vmbits = fls64(read_c0_entryhi() & 0x3fffffffffffe000ULL); | ||
293 | #endif | ||
294 | } | ||
295 | |||
287 | #define R4K_OPTS (MIPS_CPU_TLB | MIPS_CPU_4KEX | MIPS_CPU_4K_CACHE \ | 296 | #define R4K_OPTS (MIPS_CPU_TLB | MIPS_CPU_4KEX | MIPS_CPU_4K_CACHE \ |
288 | | MIPS_CPU_COUNTER) | 297 | | MIPS_CPU_COUNTER) |
289 | 298 | ||
@@ -969,6 +978,8 @@ __cpuinit void cpu_probe(void) | |||
969 | c->srsets = ((read_c0_srsctl() >> 26) & 0x0f) + 1; | 978 | c->srsets = ((read_c0_srsctl() >> 26) & 0x0f) + 1; |
970 | else | 979 | else |
971 | c->srsets = 1; | 980 | c->srsets = 1; |
981 | |||
982 | cpu_probe_vmbits(c); | ||
972 | } | 983 | } |
973 | 984 | ||
974 | __cpuinit void cpu_report(void) | 985 | __cpuinit void cpu_report(void) |
diff --git a/arch/mips/kernel/traps.c b/arch/mips/kernel/traps.c index 308e43460864..31b204b26ba0 100644 --- a/arch/mips/kernel/traps.c +++ b/arch/mips/kernel/traps.c | |||
@@ -1403,6 +1403,7 @@ extern void flush_tlb_handlers(void); | |||
1403 | * Timer interrupt | 1403 | * Timer interrupt |
1404 | */ | 1404 | */ |
1405 | int cp0_compare_irq; | 1405 | int cp0_compare_irq; |
1406 | int cp0_compare_irq_shift; | ||
1406 | 1407 | ||
1407 | /* | 1408 | /* |
1408 | * Performance counter IRQ or -1 if shared with timer | 1409 | * Performance counter IRQ or -1 if shared with timer |
@@ -1493,12 +1494,14 @@ void __cpuinit per_cpu_trap_init(void) | |||
1493 | * o read IntCtl.IPPCI to determine the performance counter interrupt | 1494 | * o read IntCtl.IPPCI to determine the performance counter interrupt |
1494 | */ | 1495 | */ |
1495 | if (cpu_has_mips_r2) { | 1496 | if (cpu_has_mips_r2) { |
1496 | cp0_compare_irq = (read_c0_intctl() >> 29) & 7; | 1497 | cp0_compare_irq_shift = CAUSEB_TI - CAUSEB_IP; |
1497 | cp0_perfcount_irq = (read_c0_intctl() >> 26) & 7; | 1498 | cp0_compare_irq = (read_c0_intctl() >> INTCTLB_IPTI) & 7; |
1499 | cp0_perfcount_irq = (read_c0_intctl() >> INTCTLB_IPPCI) & 7; | ||
1498 | if (cp0_perfcount_irq == cp0_compare_irq) | 1500 | if (cp0_perfcount_irq == cp0_compare_irq) |
1499 | cp0_perfcount_irq = -1; | 1501 | cp0_perfcount_irq = -1; |
1500 | } else { | 1502 | } else { |
1501 | cp0_compare_irq = CP0_LEGACY_COMPARE_IRQ; | 1503 | cp0_compare_irq = CP0_LEGACY_COMPARE_IRQ; |
1504 | cp0_compare_irq_shift = cp0_compare_irq; | ||
1502 | cp0_perfcount_irq = -1; | 1505 | cp0_perfcount_irq = -1; |
1503 | } | 1506 | } |
1504 | 1507 | ||