Skip to content

Commit

Permalink
x86, acpi/irq: Teach acpi_get_override_irq to take a gsi not an isa_irq
Browse files Browse the repository at this point in the history
In perverse acpi implementations the isa irqs are not identity mapped
to the first 16 gsi.  Furthermore at least the extended interrupt
resource capability may return gsi's and not isa irqs.  So since
what we get from acpi is a gsi teach acpi_get_overrride_irq to
operate on a gsi instead of an isa_irq.

Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
LKML-Reference: <1269936436-7039-2-git-send-email-ebiederm@xmission.com>
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
  • Loading branch information
Eric W. Biederman authored and H. Peter Anvin committed May 4, 2010
1 parent 2c2df84 commit 9a0a91b
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 11 deletions.
23 changes: 14 additions & 9 deletions arch/x86/kernel/apic/io_apic.c
Original file line number Diff line number Diff line change
Expand Up @@ -4082,22 +4082,27 @@ int __init io_apic_get_version(int ioapic)
return reg_01.bits.version;
}

int acpi_get_override_irq(int bus_irq, int *trigger, int *polarity)
int acpi_get_override_irq(u32 gsi, int *trigger, int *polarity)
{
int i;
int ioapic, pin, idx;

if (skip_ioapic_setup)
return -1;

for (i = 0; i < mp_irq_entries; i++)
if (mp_irqs[i].irqtype == mp_INT &&
mp_irqs[i].srcbusirq == bus_irq)
break;
if (i >= mp_irq_entries)
ioapic = mp_find_ioapic(gsi);
if (ioapic < 0)
return -1;

pin = mp_find_ioapic_pin(ioapic, gsi);
if (pin < 0)
return -1;

idx = find_irq_entry(ioapic, pin, mp_INT);
if (idx < 0)
return -1;

*trigger = irq_trigger(i);
*polarity = irq_polarity(i);
*trigger = irq_trigger(idx);
*polarity = irq_polarity(idx);
return 0;
}

Expand Down
4 changes: 2 additions & 2 deletions include/linux/acpi.h
Original file line number Diff line number Diff line change
Expand Up @@ -119,9 +119,9 @@ int acpi_gsi_to_irq (u32 gsi, unsigned int *irq);
int acpi_isa_irq_to_gsi (unsigned isa_irq, u32 *gsi);

#ifdef CONFIG_X86_IO_APIC
extern int acpi_get_override_irq(int bus_irq, int *trigger, int *polarity);
extern int acpi_get_override_irq(u32 gsi, int *trigger, int *polarity);
#else
#define acpi_get_override_irq(bus, trigger, polarity) (-1)
#define acpi_get_override_irq(gsi, trigger, polarity) (-1)
#endif
/*
* This function undoes the effect of one call to acpi_register_gsi().
Expand Down

0 comments on commit 9a0a91b

Please sign in to comment.