diff options
author | Ralf Baechle <ralf@linux-mips.org> | 2007-10-11 18:46:09 -0400 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 2007-10-11 18:46:09 -0400 |
commit | 91a2fcc88634663e9e13dcdfad0e4a860e64aeee (patch) | |
tree | a86b936f1057207d46e5a07ed826052ff640869a /arch/mips/mipssim/sim_time.c | |
parent | 90b02340dcc6ce00bf22c48f4865915f5989e5e4 (diff) |
[MIPS] Consolidate all variants of MIPS cp0 timer interrupt handlers.
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
Diffstat (limited to 'arch/mips/mipssim/sim_time.c')
-rw-r--r-- | arch/mips/mipssim/sim_time.c | 72 |
1 files changed, 0 insertions, 72 deletions
diff --git a/arch/mips/mipssim/sim_time.c b/arch/mips/mipssim/sim_time.c index 9a355e77952f..3625f7d49035 100644 --- a/arch/mips/mipssim/sim_time.c +++ b/arch/mips/mipssim/sim_time.c | |||
@@ -23,77 +23,6 @@ | |||
23 | 23 | ||
24 | unsigned long cpu_khz; | 24 | unsigned long cpu_khz; |
25 | 25 | ||
26 | irqreturn_t sim_timer_interrupt(int irq, void *dev_id) | ||
27 | { | ||
28 | #ifdef CONFIG_SMP | ||
29 | int cpu = smp_processor_id(); | ||
30 | |||
31 | /* | ||
32 | * CPU 0 handles the global timer interrupt job | ||
33 | * resets count/compare registers to trigger next timer int. | ||
34 | */ | ||
35 | #ifndef CONFIG_MIPS_MT_SMTC | ||
36 | if (cpu == 0) { | ||
37 | timer_interrupt(irq, dev_id); | ||
38 | } else { | ||
39 | /* Everyone else needs to reset the timer int here as | ||
40 | ll_local_timer_interrupt doesn't */ | ||
41 | /* | ||
42 | * FIXME: need to cope with counter underflow. | ||
43 | * More support needs to be added to kernel/time for | ||
44 | * counter/timer interrupts on multiple CPU's | ||
45 | */ | ||
46 | write_c0_compare (read_c0_count() + ( mips_hpt_frequency/HZ)); | ||
47 | } | ||
48 | #else /* SMTC */ | ||
49 | /* | ||
50 | * In SMTC system, one Count/Compare set exists per VPE. | ||
51 | * Which TC within a VPE gets the interrupt is essentially | ||
52 | * random - we only know that it shouldn't be one with | ||
53 | * IXMT set. Whichever TC gets the interrupt needs to | ||
54 | * send special interprocessor interrupts to the other | ||
55 | * TCs to make sure that they schedule, etc. | ||
56 | * | ||
57 | * That code is specific to the SMTC kernel, not to | ||
58 | * the simulation platform, so it's invoked from | ||
59 | * the general MIPS timer_interrupt routine. | ||
60 | * | ||
61 | * We have a problem in that the interrupt vector code | ||
62 | * had to turn off the timer IM bit to avoid redundant | ||
63 | * entries, but we may never get to mips_cpu_irq_end | ||
64 | * to turn it back on again if the scheduler gets | ||
65 | * involved. So we clear the pending timer here, | ||
66 | * and re-enable the mask... | ||
67 | */ | ||
68 | |||
69 | int vpflags = dvpe(); | ||
70 | write_c0_compare (read_c0_count() - 1); | ||
71 | clear_c0_cause(0x100 << cp0_compare_irq); | ||
72 | set_c0_status(0x100 << cp0_compare_irq); | ||
73 | irq_enable_hazard(); | ||
74 | evpe(vpflags); | ||
75 | |||
76 | if (cpu_data[cpu].vpe_id == 0) | ||
77 | timer_interrupt(irq, dev_id); | ||
78 | else | ||
79 | write_c0_compare (read_c0_count() + ( mips_hpt_frequency/HZ)); | ||
80 | smtc_timer_broadcast(cpu_data[cpu].vpe_id); | ||
81 | |||
82 | #endif /* CONFIG_MIPS_MT_SMTC */ | ||
83 | |||
84 | /* | ||
85 | * every CPU should do profiling and process accounting | ||
86 | */ | ||
87 | local_timer_interrupt (irq, dev_id); | ||
88 | |||
89 | return IRQ_HANDLED; | ||
90 | #else | ||
91 | return timer_interrupt (irq, dev_id); | ||
92 | #endif | ||
93 | } | ||
94 | |||
95 | |||
96 | |||
97 | /* | 26 | /* |
98 | * Estimate CPU frequency. Sets mips_hpt_frequency as a side-effect | 27 | * Estimate CPU frequency. Sets mips_hpt_frequency as a side-effect |
99 | */ | 28 | */ |
@@ -185,7 +114,6 @@ void __init plat_timer_setup(struct irqaction *irq) | |||
185 | } | 114 | } |
186 | 115 | ||
187 | /* we are using the cpu counter for timer interrupts */ | 116 | /* we are using the cpu counter for timer interrupts */ |
188 | irq->handler = sim_timer_interrupt; | ||
189 | setup_irq(mips_cpu_timer_irq, irq); | 117 | setup_irq(mips_cpu_timer_irq, irq); |
190 | 118 | ||
191 | #ifdef CONFIG_SMP | 119 | #ifdef CONFIG_SMP |