diff options
author | Maciej W. Rozycki <macro@linux-mips.org> | 2008-06-30 20:19:31 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-07-10 05:04:05 -0400 |
commit | 0b9f4f49e2abe787673de8f1f56f053fb30fec24 (patch) | |
tree | 1fc290c2f215ba28aa6c73bdd8ae4f6b39d901f7 /arch | |
parent | c9076b63191ec799ba6848ce5603fff109da57d2 (diff) |
x86: I/O APIC: Add a 64-bit variation of replace_pin_at_irq()
When an interrupt is rerouted to a different I/O APIC pin the relevant
entry of the irq_2_pin list should get updated accordingly so that
operations are performed on the correct redirection entry.
This is already done by the 32-bit variation of the code and here is a
complementing 64-bit implementation. Should make someone's decision less
tough when merging the two. ;)
Signed-off-by: Maciej W. Rozycki <macro@linux-mips.org>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/x86/kernel/io_apic_64.c | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/arch/x86/kernel/io_apic_64.c b/arch/x86/kernel/io_apic_64.c index f930885ac667..848411753c7c 100644 --- a/arch/x86/kernel/io_apic_64.c +++ b/arch/x86/kernel/io_apic_64.c | |||
@@ -373,6 +373,26 @@ static void add_pin_to_irq(unsigned int irq, int apic, int pin) | |||
373 | entry->pin = pin; | 373 | entry->pin = pin; |
374 | } | 374 | } |
375 | 375 | ||
376 | /* | ||
377 | * Reroute an IRQ to a different pin. | ||
378 | */ | ||
379 | static void __init replace_pin_at_irq(unsigned int irq, | ||
380 | int oldapic, int oldpin, | ||
381 | int newapic, int newpin) | ||
382 | { | ||
383 | struct irq_pin_list *entry = irq_2_pin + irq; | ||
384 | |||
385 | while (1) { | ||
386 | if (entry->apic == oldapic && entry->pin == oldpin) { | ||
387 | entry->apic = newapic; | ||
388 | entry->pin = newpin; | ||
389 | } | ||
390 | if (!entry->next) | ||
391 | break; | ||
392 | entry = irq_2_pin + entry->next; | ||
393 | } | ||
394 | } | ||
395 | |||
376 | 396 | ||
377 | #define DO_ACTION(name,R,ACTION, FINAL) \ | 397 | #define DO_ACTION(name,R,ACTION, FINAL) \ |
378 | \ | 398 | \ |
@@ -1735,7 +1755,7 @@ static inline void __init check_timer(void) | |||
1735 | /* | 1755 | /* |
1736 | * legacy devices should be connected to IO APIC #0 | 1756 | * legacy devices should be connected to IO APIC #0 |
1737 | */ | 1757 | */ |
1738 | /* replace_pin_at_irq(0, apic1, pin1, apic2, pin2); */ | 1758 | replace_pin_at_irq(0, apic1, pin1, apic2, pin2); |
1739 | setup_timer_IRQ0_pin(apic2, pin2, cfg->vector); | 1759 | setup_timer_IRQ0_pin(apic2, pin2, cfg->vector); |
1740 | unmask_IO_APIC_irq(0); | 1760 | unmask_IO_APIC_irq(0); |
1741 | enable_8259A_irq(0); | 1761 | enable_8259A_irq(0); |