x86, acpi/irq: Teach acpi_get_override_irq to take a gsi not an isa_irq

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>
这个提交包含在:
Eric W. Biederman
2010-03-30 01:07:03 -07:00
提交者 H. Peter Anvin
父节点 2c2df8418a
当前提交 9a0a91bb56
修改 2 个文件,包含 16 行新增11 行删除

查看文件

@@ -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;
*trigger = irq_trigger(i);
*polarity = irq_polarity(i);
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(idx);
*polarity = irq_polarity(idx);
return 0;
}