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 | 7bcf7717b6a047c272410d0cd00213185fe6b99d (patch) | |
tree | 81c5d6bbc2130815713e22bb5408ea80b6e1c499 /arch/mips/sibyte | |
parent | 91a2fcc88634663e9e13dcdfad0e4a860e64aeee (diff) |
[MIPS] Implement clockevents for R4000-style cp0 count/compare interrupt
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
Diffstat (limited to 'arch/mips/sibyte')
-rw-r--r-- | arch/mips/sibyte/Kconfig | 12 | ||||
-rw-r--r-- | arch/mips/sibyte/bcm1480/irq.c | 13 | ||||
-rw-r--r-- | arch/mips/sibyte/sb1250/irq.c | 50 | ||||
-rw-r--r-- | arch/mips/sibyte/sb1250/time.c | 12 |
4 files changed, 55 insertions, 32 deletions
diff --git a/arch/mips/sibyte/Kconfig b/arch/mips/sibyte/Kconfig index 841b301c99f0..e8fb880272bd 100644 --- a/arch/mips/sibyte/Kconfig +++ b/arch/mips/sibyte/Kconfig | |||
@@ -1,6 +1,7 @@ | |||
1 | config SIBYTE_SB1250 | 1 | config SIBYTE_SB1250 |
2 | bool | 2 | bool |
3 | select HW_HAS_PCI | 3 | select HW_HAS_PCI |
4 | select IRQ_CPU | ||
4 | select SIBYTE_ENABLE_LDT_IF_PCI | 5 | select SIBYTE_ENABLE_LDT_IF_PCI |
5 | select SIBYTE_HAS_ZBUS_PROFILING | 6 | select SIBYTE_HAS_ZBUS_PROFILING |
6 | select SIBYTE_SB1xxx_SOC | 7 | select SIBYTE_SB1xxx_SOC |
@@ -8,6 +9,7 @@ config SIBYTE_SB1250 | |||
8 | 9 | ||
9 | config SIBYTE_BCM1120 | 10 | config SIBYTE_BCM1120 |
10 | bool | 11 | bool |
12 | select IRQ_CPU | ||
11 | select SIBYTE_BCM112X | 13 | select SIBYTE_BCM112X |
12 | select SIBYTE_HAS_ZBUS_PROFILING | 14 | select SIBYTE_HAS_ZBUS_PROFILING |
13 | select SIBYTE_SB1xxx_SOC | 15 | select SIBYTE_SB1xxx_SOC |
@@ -15,6 +17,7 @@ config SIBYTE_BCM1120 | |||
15 | config SIBYTE_BCM1125 | 17 | config SIBYTE_BCM1125 |
16 | bool | 18 | bool |
17 | select HW_HAS_PCI | 19 | select HW_HAS_PCI |
20 | select IRQ_CPU | ||
18 | select SIBYTE_BCM112X | 21 | select SIBYTE_BCM112X |
19 | select SIBYTE_HAS_ZBUS_PROFILING | 22 | select SIBYTE_HAS_ZBUS_PROFILING |
20 | select SIBYTE_SB1xxx_SOC | 23 | select SIBYTE_SB1xxx_SOC |
@@ -22,6 +25,7 @@ config SIBYTE_BCM1125 | |||
22 | config SIBYTE_BCM1125H | 25 | config SIBYTE_BCM1125H |
23 | bool | 26 | bool |
24 | select HW_HAS_PCI | 27 | select HW_HAS_PCI |
28 | select IRQ_CPU | ||
25 | select SIBYTE_BCM112X | 29 | select SIBYTE_BCM112X |
26 | select SIBYTE_ENABLE_LDT_IF_PCI | 30 | select SIBYTE_ENABLE_LDT_IF_PCI |
27 | select SIBYTE_HAS_ZBUS_PROFILING | 31 | select SIBYTE_HAS_ZBUS_PROFILING |
@@ -29,12 +33,14 @@ config SIBYTE_BCM1125H | |||
29 | 33 | ||
30 | config SIBYTE_BCM112X | 34 | config SIBYTE_BCM112X |
31 | bool | 35 | bool |
36 | select IRQ_CPU | ||
32 | select SIBYTE_SB1xxx_SOC | 37 | select SIBYTE_SB1xxx_SOC |
33 | select SIBYTE_HAS_ZBUS_PROFILING | 38 | select SIBYTE_HAS_ZBUS_PROFILING |
34 | 39 | ||
35 | config SIBYTE_BCM1x80 | 40 | config SIBYTE_BCM1x80 |
36 | bool | 41 | bool |
37 | select HW_HAS_PCI | 42 | select HW_HAS_PCI |
43 | select IRQ_CPU | ||
38 | select SIBYTE_HAS_ZBUS_PROFILING | 44 | select SIBYTE_HAS_ZBUS_PROFILING |
39 | select SIBYTE_SB1xxx_SOC | 45 | select SIBYTE_SB1xxx_SOC |
40 | select SYS_SUPPORTS_SMP | 46 | select SYS_SUPPORTS_SMP |
@@ -42,6 +48,7 @@ config SIBYTE_BCM1x80 | |||
42 | config SIBYTE_BCM1x55 | 48 | config SIBYTE_BCM1x55 |
43 | bool | 49 | bool |
44 | select HW_HAS_PCI | 50 | select HW_HAS_PCI |
51 | select IRQ_CPU | ||
45 | select SIBYTE_SB1xxx_SOC | 52 | select SIBYTE_SB1xxx_SOC |
46 | select SIBYTE_HAS_ZBUS_PROFILING | 53 | select SIBYTE_HAS_ZBUS_PROFILING |
47 | select SYS_SUPPORTS_SMP | 54 | select SYS_SUPPORTS_SMP |
@@ -49,6 +56,7 @@ config SIBYTE_BCM1x55 | |||
49 | config SIBYTE_SB1xxx_SOC | 56 | config SIBYTE_SB1xxx_SOC |
50 | bool | 57 | bool |
51 | select DMA_COHERENT | 58 | select DMA_COHERENT |
59 | select IRQ_CPU | ||
52 | select SIBYTE_CFE | 60 | select SIBYTE_CFE |
53 | select SWAP_IO_SPACE | 61 | select SWAP_IO_SPACE |
54 | select SYS_SUPPORTS_32BIT_KERNEL | 62 | select SYS_SUPPORTS_32BIT_KERNEL |
@@ -166,10 +174,6 @@ config SIBYTE_BW_TRACE | |||
166 | buffer activity. Raw buffer data is dumped to console, and | 174 | buffer activity. Raw buffer data is dumped to console, and |
167 | must be processed off-line. | 175 | must be processed off-line. |
168 | 176 | ||
169 | config SIBYTE_SB1250_PROF | ||
170 | bool "Support for SB1/SOC profiling - SB1/SCD perf counters" | ||
171 | depends on SIBYTE_SB1xxx_SOC | ||
172 | |||
173 | config SIBYTE_TBPROF | 177 | config SIBYTE_TBPROF |
174 | tristate "Support for ZBbus profiling" | 178 | tristate "Support for ZBbus profiling" |
175 | depends on SIBYTE_HAS_ZBUS_PROFILING | 179 | depends on SIBYTE_HAS_ZBUS_PROFILING |
diff --git a/arch/mips/sibyte/bcm1480/irq.c b/arch/mips/sibyte/bcm1480/irq.c index e729b5f30264..cf979dbb282d 100644 --- a/arch/mips/sibyte/bcm1480/irq.c +++ b/arch/mips/sibyte/bcm1480/irq.c | |||
@@ -450,7 +450,6 @@ static void bcm1480_kgdb_interrupt(void) | |||
450 | 450 | ||
451 | #endif /* CONFIG_KGDB */ | 451 | #endif /* CONFIG_KGDB */ |
452 | 452 | ||
453 | extern void bcm1480_timer_interrupt(void); | ||
454 | extern void bcm1480_mailbox_interrupt(void); | 453 | extern void bcm1480_mailbox_interrupt(void); |
455 | 454 | ||
456 | asmlinkage void plat_irq_dispatch(void) | 455 | asmlinkage void plat_irq_dispatch(void) |
@@ -470,8 +469,16 @@ asmlinkage void plat_irq_dispatch(void) | |||
470 | else | 469 | else |
471 | #endif | 470 | #endif |
472 | 471 | ||
473 | if (pending & CAUSEF_IP4) | 472 | if (pending & CAUSEF_IP4) { |
474 | bcm1480_timer_interrupt(); | 473 | int cpu = smp_processor_id(); |
474 | int irq = K_BCM1480_INT_TIMER_0 + cpu; | ||
475 | |||
476 | /* Reset the timer */ | ||
477 | __raw_writeq(M_SCD_TIMER_ENABLE|M_SCD_TIMER_MODE_CONTINUOUS, | ||
478 | IOADDR(A_SCD_TIMER_REGISTER(cpu, R_SCD_TIMER_CFG))); | ||
479 | |||
480 | do_IRQ(irq); | ||
481 | } | ||
475 | 482 | ||
476 | #ifdef CONFIG_SMP | 483 | #ifdef CONFIG_SMP |
477 | else if (pending & CAUSEF_IP3) | 484 | else if (pending & CAUSEF_IP3) |
diff --git a/arch/mips/sibyte/sb1250/irq.c b/arch/mips/sibyte/sb1250/irq.c index ad593a6c20be..6a4cc84194a9 100644 --- a/arch/mips/sibyte/sb1250/irq.c +++ b/arch/mips/sibyte/sb1250/irq.c | |||
@@ -28,6 +28,7 @@ | |||
28 | #include <asm/errno.h> | 28 | #include <asm/errno.h> |
29 | #include <asm/signal.h> | 29 | #include <asm/signal.h> |
30 | #include <asm/system.h> | 30 | #include <asm/system.h> |
31 | #include <asm/time.h> | ||
31 | #include <asm/io.h> | 32 | #include <asm/io.h> |
32 | 33 | ||
33 | #include <asm/sibyte/sb1250_regs.h> | 34 | #include <asm/sibyte/sb1250_regs.h> |
@@ -399,18 +400,45 @@ static void sb1250_kgdb_interrupt(void) | |||
399 | 400 | ||
400 | #endif /* CONFIG_KGDB */ | 401 | #endif /* CONFIG_KGDB */ |
401 | 402 | ||
402 | extern void sb1250_timer_interrupt(void); | 403 | static inline void sb1250_timer_interrupt(void) |
404 | { | ||
405 | int cpu = smp_processor_id(); | ||
406 | int irq = K_INT_TIMER_0 + cpu; | ||
407 | |||
408 | irq_enter(); | ||
409 | kstat_this_cpu.irqs[irq]++; | ||
410 | |||
411 | write_seqlock(&xtime_lock); | ||
412 | |||
413 | /* ACK interrupt */ | ||
414 | ____raw_writeq(M_SCD_TIMER_ENABLE | M_SCD_TIMER_MODE_CONTINUOUS, | ||
415 | IOADDR(A_SCD_TIMER_REGISTER(cpu, R_SCD_TIMER_CFG))); | ||
416 | |||
417 | /* | ||
418 | * call the generic timer interrupt handling | ||
419 | */ | ||
420 | do_timer(1); | ||
421 | |||
422 | write_sequnlock(&xtime_lock); | ||
423 | |||
424 | /* | ||
425 | * In UP mode, we call local_timer_interrupt() to do profiling | ||
426 | * and process accouting. | ||
427 | * | ||
428 | * In SMP mode, local_timer_interrupt() is invoked by appropriate | ||
429 | * low-level local timer interrupt handler. | ||
430 | */ | ||
431 | local_timer_interrupt(irq); | ||
432 | |||
433 | irq_exit(); | ||
434 | } | ||
435 | |||
403 | extern void sb1250_mailbox_interrupt(void); | 436 | extern void sb1250_mailbox_interrupt(void); |
404 | 437 | ||
405 | asmlinkage void plat_irq_dispatch(void) | 438 | asmlinkage void plat_irq_dispatch(void) |
406 | { | 439 | { |
407 | unsigned int pending; | 440 | unsigned int pending; |
408 | 441 | ||
409 | #ifdef CONFIG_SIBYTE_SB1250_PROF | ||
410 | /* Set compare to count to silence count/compare timer interrupts */ | ||
411 | write_c0_compare(read_c0_count()); | ||
412 | #endif | ||
413 | |||
414 | /* | 442 | /* |
415 | * What a pain. We have to be really careful saving the upper 32 bits | 443 | * What a pain. We have to be really careful saving the upper 32 bits |
416 | * of any * register across function calls if we don't want them | 444 | * of any * register across function calls if we don't want them |
@@ -423,13 +451,9 @@ asmlinkage void plat_irq_dispatch(void) | |||
423 | 451 | ||
424 | pending = read_c0_cause() & read_c0_status() & ST0_IM; | 452 | pending = read_c0_cause() & read_c0_status() & ST0_IM; |
425 | 453 | ||
426 | #ifdef CONFIG_SIBYTE_SB1250_PROF | 454 | if (pending & CAUSEF_IP7) /* CPU performance counter interrupt */ |
427 | if (pending & CAUSEF_IP7) /* Cpu performance counter interrupt */ | 455 | do_IRQ(MIPS_CPU_IRQ_BASE + 7); |
428 | sbprof_cpu_intr(); | 456 | else if (pending & CAUSEF_IP4) |
429 | else | ||
430 | #endif | ||
431 | |||
432 | if (pending & CAUSEF_IP4) | ||
433 | sb1250_timer_interrupt(); | 457 | sb1250_timer_interrupt(); |
434 | 458 | ||
435 | #ifdef CONFIG_SMP | 459 | #ifdef CONFIG_SMP |
diff --git a/arch/mips/sibyte/sb1250/time.c b/arch/mips/sibyte/sb1250/time.c index 5bb83cd4c113..eb177075e9c0 100644 --- a/arch/mips/sibyte/sb1250/time.c +++ b/arch/mips/sibyte/sb1250/time.c | |||
@@ -116,18 +116,6 @@ void sb1250_time_init(void) | |||
116 | */ | 116 | */ |
117 | } | 117 | } |
118 | 118 | ||
119 | void sb1250_timer_interrupt(void) | ||
120 | { | ||
121 | int cpu = smp_processor_id(); | ||
122 | int irq = K_INT_TIMER_0 + cpu; | ||
123 | |||
124 | /* ACK interrupt */ | ||
125 | ____raw_writeq(M_SCD_TIMER_ENABLE | M_SCD_TIMER_MODE_CONTINUOUS, | ||
126 | IOADDR(A_SCD_TIMER_REGISTER(cpu, R_SCD_TIMER_CFG))); | ||
127 | |||
128 | ll_timer_interrupt(irq); | ||
129 | } | ||
130 | |||
131 | /* | 119 | /* |
132 | * The HPT is free running from SB1250_HPT_VALUE down to 0 then starts over | 120 | * The HPT is free running from SB1250_HPT_VALUE down to 0 then starts over |
133 | * again. | 121 | * again. |