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 | ||
