Skip to content

Commit

Permalink
x86: I/O APIC: Add a 64-bit variation of replace_pin_at_irq()
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Maciej W. Rozycki authored and Ingo Molnar committed Jul 10, 2008
1 parent c9076b6 commit 0b9f4f4
Showing 1 changed file with 21 additions and 1 deletion.
22 changes: 21 additions & 1 deletion arch/x86/kernel/io_apic_64.c
Original file line number Diff line number Diff line change
Expand Up @@ -373,6 +373,26 @@ static void add_pin_to_irq(unsigned int irq, int apic, int pin)
entry->pin = pin;
}

/*
* Reroute an IRQ to a different pin.
*/
static void __init replace_pin_at_irq(unsigned int irq,
int oldapic, int oldpin,
int newapic, int newpin)
{
struct irq_pin_list *entry = irq_2_pin + irq;

while (1) {
if (entry->apic == oldapic && entry->pin == oldpin) {
entry->apic = newapic;
entry->pin = newpin;
}
if (!entry->next)
break;
entry = irq_2_pin + entry->next;
}
}


#define DO_ACTION(name,R,ACTION, FINAL) \
\
Expand Down Expand Up @@ -1735,7 +1755,7 @@ static inline void __init check_timer(void)
/*
* legacy devices should be connected to IO APIC #0
*/
/* replace_pin_at_irq(0, apic1, pin1, apic2, pin2); */
replace_pin_at_irq(0, apic1, pin1, apic2, pin2);
setup_timer_IRQ0_pin(apic2, pin2, cfg->vector);
unmask_IO_APIC_irq(0);
enable_8259A_irq(0);
Expand Down

0 comments on commit 0b9f4f4

Please sign in to comment.