aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorMaciej W. Rozycki <macro@linux-mips.org>2008-06-30 20:19:31 -0400
committerIngo Molnar <mingo@elte.hu>2008-07-10 05:04:05 -0400
commit0b9f4f49e2abe787673de8f1f56f053fb30fec24 (patch)
tree1fc290c2f215ba28aa6c73bdd8ae4f6b39d901f7 /arch
parentc9076b63191ec799ba6848ce5603fff109da57d2 (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.c22
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 */
379static 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);