diff options
author | David S. Miller <davem@davemloft.net> | 2006-06-20 04:20:00 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2006-06-20 04:20:00 -0400 |
commit | fd0504c3217d6d1bc8f33f53fb536299cae8feda (patch) | |
tree | 4379f5376358d1f54fc183f458614f289ed6d326 /arch/sparc64/kernel/entry.S | |
parent | 3185d4d2873a46ca1620d784013f285522091aa0 (diff) |
[SPARC64]: Send all device interrupts via one PIL.
This is the first in a series of cleanups that will hopefully
allow a seamless attempt at using the generic IRQ handling
infrastructure in the Linux kernel.
Define PIL_DEVICE_IRQ and vector all device interrupts through
there.
Get rid of the ugly pil0_dummy_{bucket,desc}, instead vector
the timer interrupt directly to a specific handler since the
timer interrupt is the only event that will be signaled on
PIL 14.
The irq_worklist is now in the per-cpu trap_block[].
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'arch/sparc64/kernel/entry.S')
-rw-r--r-- | arch/sparc64/kernel/entry.S | 11 |
1 files changed, 4 insertions, 7 deletions
diff --git a/arch/sparc64/kernel/entry.S b/arch/sparc64/kernel/entry.S index 6d0b3ed77a02..c87365e59e71 100644 --- a/arch/sparc64/kernel/entry.S +++ b/arch/sparc64/kernel/entry.S | |||
@@ -22,6 +22,7 @@ | |||
22 | #include <asm/estate.h> | 22 | #include <asm/estate.h> |
23 | #include <asm/auxio.h> | 23 | #include <asm/auxio.h> |
24 | #include <asm/sfafsr.h> | 24 | #include <asm/sfafsr.h> |
25 | #include <asm/pil.h> | ||
25 | 26 | ||
26 | #define curptr g6 | 27 | #define curptr g6 |
27 | 28 | ||
@@ -434,17 +435,13 @@ do_ivec: | |||
434 | sllx %g3, 5, %g3 | 435 | sllx %g3, 5, %g3 |
435 | or %g2, %lo(ivector_table), %g2 | 436 | or %g2, %lo(ivector_table), %g2 |
436 | add %g2, %g3, %g3 | 437 | add %g2, %g3, %g3 |
437 | ldub [%g3 + 0x04], %g4 /* pil */ | ||
438 | mov 1, %g2 | ||
439 | sllx %g2, %g4, %g2 | ||
440 | sllx %g4, 2, %g4 | ||
441 | 438 | ||
442 | TRAP_LOAD_IRQ_WORK(%g6, %g1) | 439 | TRAP_LOAD_IRQ_WORK(%g6, %g1) |
443 | 440 | ||
444 | lduw [%g6 + %g4], %g5 /* g5 = irq_work(cpu, pil) */ | 441 | lduw [%g6], %g5 /* g5 = irq_work(cpu) */ |
445 | stw %g5, [%g3 + 0x00] /* bucket->irq_chain = g5 */ | 442 | stw %g5, [%g3 + 0x00] /* bucket->irq_chain = g5 */ |
446 | stw %g3, [%g6 + %g4] /* irq_work(cpu, pil) = bucket */ | 443 | stw %g3, [%g6] /* irq_work(cpu) = bucket */ |
447 | wr %g2, 0x0, %set_softint | 444 | wr %g0, 1 << PIL_DEVICE_IRQ, %set_softint |
448 | retry | 445 | retry |
449 | do_ivec_xcall: | 446 | do_ivec_xcall: |
450 | mov 0x50, %g1 | 447 | mov 0x50, %g1 |