diff options
Diffstat (limited to 'arch/mips/kernel/smtc.c')
-rw-r--r-- | arch/mips/kernel/smtc.c | 15 |
1 files changed, 7 insertions, 8 deletions
diff --git a/arch/mips/kernel/smtc.c b/arch/mips/kernel/smtc.c index 31d22f3121c9..75a4fd709841 100644 --- a/arch/mips/kernel/smtc.c +++ b/arch/mips/kernel/smtc.c | |||
@@ -34,6 +34,7 @@ | |||
34 | #include <asm/hardirq.h> | 34 | #include <asm/hardirq.h> |
35 | #include <asm/hazards.h> | 35 | #include <asm/hazards.h> |
36 | #include <asm/irq.h> | 36 | #include <asm/irq.h> |
37 | #include <asm/idle.h> | ||
37 | #include <asm/mmu_context.h> | 38 | #include <asm/mmu_context.h> |
38 | #include <asm/mipsregs.h> | 39 | #include <asm/mipsregs.h> |
39 | #include <asm/cacheflush.h> | 40 | #include <asm/cacheflush.h> |
@@ -111,7 +112,7 @@ static int vpe0limit; | |||
111 | static int ipibuffers; | 112 | static int ipibuffers; |
112 | static int nostlb; | 113 | static int nostlb; |
113 | static int asidmask; | 114 | static int asidmask; |
114 | unsigned int smtc_asid_mask = 0xff; | 115 | unsigned long smtc_asid_mask = 0xff; |
115 | 116 | ||
116 | static int __init vpe0tcs(char *str) | 117 | static int __init vpe0tcs(char *str) |
117 | { | 118 | { |
@@ -858,7 +859,6 @@ void smtc_send_ipi(int cpu, int type, unsigned int action) | |||
858 | unsigned long flags; | 859 | unsigned long flags; |
859 | int mtflags; | 860 | int mtflags; |
860 | unsigned long tcrestart; | 861 | unsigned long tcrestart; |
861 | extern void r4k_wait_irqoff(void), __pastwait(void); | ||
862 | int set_resched_flag = (type == LINUX_SMP_IPI && | 862 | int set_resched_flag = (type == LINUX_SMP_IPI && |
863 | action == SMP_RESCHEDULE_YOURSELF); | 863 | action == SMP_RESCHEDULE_YOURSELF); |
864 | 864 | ||
@@ -914,8 +914,7 @@ void smtc_send_ipi(int cpu, int type, unsigned int action) | |||
914 | */ | 914 | */ |
915 | if (cpu_wait == r4k_wait_irqoff) { | 915 | if (cpu_wait == r4k_wait_irqoff) { |
916 | tcrestart = read_tc_c0_tcrestart(); | 916 | tcrestart = read_tc_c0_tcrestart(); |
917 | if (tcrestart >= (unsigned long)r4k_wait_irqoff | 917 | if (address_is_in_r4k_wait_irqoff(tcrestart)) { |
918 | && tcrestart < (unsigned long)__pastwait) { | ||
919 | write_tc_c0_tcrestart(__pastwait); | 918 | write_tc_c0_tcrestart(__pastwait); |
920 | tcstatus &= ~TCSTATUS_IXMT; | 919 | tcstatus &= ~TCSTATUS_IXMT; |
921 | write_tc_c0_tcstatus(tcstatus); | 920 | write_tc_c0_tcstatus(tcstatus); |
@@ -1395,7 +1394,7 @@ void smtc_get_new_mmu_context(struct mm_struct *mm, unsigned long cpu) | |||
1395 | asid = asid_cache(cpu); | 1394 | asid = asid_cache(cpu); |
1396 | 1395 | ||
1397 | do { | 1396 | do { |
1398 | if (!ASID_MASK(ASID_INC(asid))) { | 1397 | if (!((asid += ASID_INC) & ASID_MASK) ) { |
1399 | if (cpu_has_vtag_icache) | 1398 | if (cpu_has_vtag_icache) |
1400 | flush_icache_all(); | 1399 | flush_icache_all(); |
1401 | /* Traverse all online CPUs (hack requires contiguous range) */ | 1400 | /* Traverse all online CPUs (hack requires contiguous range) */ |
@@ -1414,7 +1413,7 @@ void smtc_get_new_mmu_context(struct mm_struct *mm, unsigned long cpu) | |||
1414 | mips_ihb(); | 1413 | mips_ihb(); |
1415 | } | 1414 | } |
1416 | tcstat = read_tc_c0_tcstatus(); | 1415 | tcstat = read_tc_c0_tcstatus(); |
1417 | smtc_live_asid[tlb][ASID_MASK(tcstat)] |= (asiduse)(0x1 << i); | 1416 | smtc_live_asid[tlb][(tcstat & ASID_MASK)] |= (asiduse)(0x1 << i); |
1418 | if (!prevhalt) | 1417 | if (!prevhalt) |
1419 | write_tc_c0_tchalt(0); | 1418 | write_tc_c0_tchalt(0); |
1420 | } | 1419 | } |
@@ -1423,7 +1422,7 @@ void smtc_get_new_mmu_context(struct mm_struct *mm, unsigned long cpu) | |||
1423 | asid = ASID_FIRST_VERSION; | 1422 | asid = ASID_FIRST_VERSION; |
1424 | local_flush_tlb_all(); /* start new asid cycle */ | 1423 | local_flush_tlb_all(); /* start new asid cycle */ |
1425 | } | 1424 | } |
1426 | } while (smtc_live_asid[tlb][ASID_MASK(asid)]); | 1425 | } while (smtc_live_asid[tlb][(asid & ASID_MASK)]); |
1427 | 1426 | ||
1428 | /* | 1427 | /* |
1429 | * SMTC shares the TLB within VPEs and possibly across all VPEs. | 1428 | * SMTC shares the TLB within VPEs and possibly across all VPEs. |
@@ -1461,7 +1460,7 @@ void smtc_flush_tlb_asid(unsigned long asid) | |||
1461 | tlb_read(); | 1460 | tlb_read(); |
1462 | ehb(); | 1461 | ehb(); |
1463 | ehi = read_c0_entryhi(); | 1462 | ehi = read_c0_entryhi(); |
1464 | if (ASID_MASK(ehi) == asid) { | 1463 | if ((ehi & ASID_MASK) == asid) { |
1465 | /* | 1464 | /* |
1466 | * Invalidate only entries with specified ASID, | 1465 | * Invalidate only entries with specified ASID, |
1467 | * makiing sure all entries differ. | 1466 | * makiing sure all entries differ. |