[tip:x86/irq] x86, acpi/irq: Handle isa irqs that are not identity mapped to gsi's.

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: tip-bot for Eric W. Biederman
Date: Tuesday, May 4, 2010 - 7:10 pm

Commit-ID:  988856ee1623bd37e384105f7bb2b7fe44c009f6
Gitweb:     http://git.kernel.org/tip/988856ee1623bd37e384105f7bb2b7fe44c009f6
Author:     Eric W. Biederman <ebiederm@xmission.com>
AuthorDate: Tue, 30 Mar 2010 01:07:15 -0700
Committer:  H. Peter Anvin <hpa@zytor.com>
CommitDate: Tue, 4 May 2010 13:35:17 -0700

x86, acpi/irq: Handle isa irqs that are not identity mapped to gsi's.

ACPI irq source overrides are allowed for the 16 isa irqs and are
allowed to map any gsi to any isa irq.  A few motherboards have been
seen to take advantage of this and put the isa irqs on the 2nd or
3rd ioapic.  This causes some problems, most notably the fact
that we can not use any gsi < 16.

To correct this move the gsis that are not isa irqs and have
a gsi number < 16 into the linux irq space just past gsi_end.
This is what the es7000 platform is doing today.  Moving only the
low 16 gsis above the rest of the gsi's only penalizes weird
platforms, leaving sane acpi implementations with a 1-1 mapping
of gsis and irqs.

Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
LKML-Reference: <1269936436-7039-14-git-send-email-ebiederm@xmission.com>
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
---
 arch/x86/kernel/acpi/boot.c    |   57 +++++++++++++++++++++++++++++++++++++---
 arch/x86/kernel/apic/io_apic.c |    8 ++++-
 2 files changed, 59 insertions(+), 6 deletions(-)

diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c
index 07a63ce..325fbba 100644
--- a/arch/x86/kernel/acpi/boot.c
+++ b/arch/x86/kernel/acpi/boot.c
@@ -94,6 +94,53 @@ enum acpi_irq_model_id acpi_irq_model = ACPI_IRQ_MODEL_PIC;
 
 
 /*
+ * ISA irqs by default are the first 16 gsis but can be
+ * any gsi as specified by an interrupt source override.
+ */
+static u32 isa_irq_to_gsi[NR_IRQS_LEGACY] __read_mostly = {
+	0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
+};
+
+static unsigned int gsi_to_irq(unsigned int gsi)
+{
+	unsigned int irq = gsi + NR_IRQS_LEGACY;
+	unsigned int i;
+
+	for (i = 0; i < NR_IRQS_LEGACY; i++) {
+		if (isa_irq_to_gsi[i] == gsi) {
+			return i;
+		}
+	}
+
+	/* Provide an identity mapping of gsi == irq
+	 * except on truly weird platforms that have
+	 * non isa irqs in the first 16 gsis.
+	 */
+	if (gsi >= NR_IRQS_LEGACY)
+		irq = gsi;
+	else
+		irq = gsi_end + 1 + gsi;
+
+	return irq;
+}
+
+static u32 irq_to_gsi(int irq)
+{
+	unsigned int gsi;
+
+	if (irq < NR_IRQS_LEGACY)
+		gsi = isa_irq_to_gsi[irq];
+	else if (irq <= gsi_end)
+		gsi = irq;
+	else if (irq <= (gsi_end + NR_IRQS_LEGACY))
+		gsi = irq - gsi_end;
+	else
+		gsi = 0xffffffff;
+
+	return gsi;
+}
+
+/*
  * Temporarily use the virtual area starting from FIX_IO_APIC_BASE_END,
  * to map the target physical address. The problem is that set_fixmap()
  * provides a single page, and it is possible that the page is not
@@ -449,7 +496,7 @@ void __init acpi_pic_sci_set_trigger(unsigned int irq, u16 trigger)
 
 int acpi_gsi_to_irq(u32 gsi, unsigned int *irq)
 {
-	*irq = gsi;
+	*irq = gsi_to_irq(gsi);
 
 #ifdef CONFIG_X86_IO_APIC
 	if (acpi_irq_model == ACPI_IRQ_MODEL_IOAPIC)
@@ -463,7 +510,7 @@ int acpi_isa_irq_to_gsi(unsigned isa_irq, u32 *gsi)
 {
 	if (isa_irq >= 16)
 		return -1;
-	*gsi = isa_irq;
+	*gsi = irq_to_gsi(isa_irq);
 	return 0;
 }
 
@@ -491,7 +538,7 @@ int acpi_register_gsi(struct device *dev, u32 gsi, int trigger, int polarity)
 		plat_gsi = mp_register_gsi(dev, gsi, trigger, polarity);
 	}
 #endif
-	irq = plat_gsi;
+	irq = gsi_to_irq(plat_gsi);
 
 	return irq;
 }
@@ -933,6 +980,8 @@ void __init mp_override_legacy_irq(u8 bus_irq, u8 polarity, u8 trigger, u32 gsi)
 	mp_irq.dstirq = pin;	/* INTIN# */
 
 	save_mp_irq(&mp_irq);
+
+	isa_irq_to_gsi[bus_irq] = gsi;
 }
 
 void __init mp_config_acpi_legacy_irqs(void)
@@ -1086,7 +1135,7 @@ int mp_register_gsi(struct device *dev, u32 gsi, int trigger, int polarity)
 	set_io_apic_irq_attr(&irq_attr, ioapic, ioapic_pin,
 			     trigger == ACPI_EDGE_SENSITIVE ? 0 : 1,
 			     polarity == ACPI_ACTIVE_HIGH ? 0 : 1);
-	io_apic_set_pci_routing(dev, gsi, &irq_attr);
+	io_apic_set_pci_routing(dev, gsi_to_irq(gsi), &irq_attr);
 
 	return gsi;
 }
diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c
index 9f3f6ca..594827c 100644
--- a/arch/x86/kernel/apic/io_apic.c
+++ b/arch/x86/kernel/apic/io_apic.c
@@ -1037,7 +1037,11 @@ static int pin_2_irq(int idx, int apic, int pin)
                  */
 		if (ioapic_renumber_irq)
 			gsi = ioapic_renumber_irq(apic, gsi);
-		irq = gsi;
+
+		if (gsi >= NR_IRQS_LEGACY)
+			irq = gsi;
+		else
+			irq = gsi_end + 1 + gsi;
 	}
 
 #ifdef CONFIG_X86_32
@@ -3852,7 +3856,7 @@ void __init probe_nr_irqs_gsi(void)
 {
 	int nr;
 
-	nr = gsi_end + 1;
+	nr = gsi_end + 1 + NR_IRQS_LEGACY;
 	if (nr > nr_irqs_gsi)
 		nr_irqs_gsi = nr;
 
--
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
[PATCH 00/10] x86/irq, Yinghai Lu, (Sun Mar 21, 6:36 pm)
[PATCH 02/10] x86: fix out of order of gsi - full, Yinghai Lu, (Sun Mar 21, 6:36 pm)
[PATCH 10/10] x86: remove arch_probe_nr_irqs, Yinghai Lu, (Sun Mar 21, 6:36 pm)
Re: [PATCH 02/10] x86: fix out of order of gsi - full, Thomas Gleixner, (Mon Mar 22, 4:14 am)
Re: [PATCH 05/10] x86: use vector_desc instead of vector_irq, Thomas Gleixner, (Mon Mar 22, 6:58 am)
Re: [PATCH 05/10] x86: use vector_desc instead of vector_irq, Eric W. Biederman, (Mon Mar 22, 7:04 am)
Re: [PATCH 05/10] x86: use vector_desc instead of vector_irq, Thomas Gleixner, (Mon Mar 22, 7:16 am)
Re: [PATCH 02/10] x86: fix out of order of gsi - full, Yinghai Lu, (Mon Mar 22, 12:45 pm)
Re: [PATCH 02/10] x86: fix out of order of gsi - full, Eric W. Biederman, (Mon Mar 29, 6:40 am)
Re: [PATCH 02/10] x86: fix out of order of gsi - full, H. Peter Anvin, (Mon Mar 29, 10:57 am)
[PATCH 0/14] Start coping gsis &lt; 16 that are not isa irqs., Eric W. Biederman, (Mon Mar 29, 4:19 pm)
[PATCH 01/14] x86 acpi/irq: Introduce apci_isa_irq_to_gsi, Eric W. Biederman, (Mon Mar 29, 4:20 pm)
[PATCH 02/14] x86 acpi/irq: Teach acpi_get_override_irq to ..., Eric W. Biederman, (Mon Mar 29, 4:20 pm)
[PATCH 04/14] x86 acpi/irq: Fix acpi_sci_ioapic_setup so i ..., Eric W. Biederman, (Mon Mar 29, 4:20 pm)
[PATCH 05/14] x86 acpi/irq: Generalize mp_config_acpi_lega ..., Eric W. Biederman, (Mon Mar 29, 4:20 pm)
[PATCH 06/14] x86 ioapic: Only export mp_find_ioapic and m ..., Eric W. Biederman, (Mon Mar 29, 4:20 pm)
[PATCH 07/14] x86 ioapic: Fix the types of gsi values, Eric W. Biederman, (Mon Mar 29, 4:20 pm)
[PATCH 08/14] x86 ioapic: Teach mp_register_ioapic to comp ..., Eric W. Biederman, (Mon Mar 29, 4:20 pm)
[PATCH 09/14] x86 ioapic: In mpparse use mp_register_ioapic, Eric W. Biederman, (Mon Mar 29, 4:20 pm)
[PATCH 10/14] x86 ioapic: Move nr_ioapic_registers calcula ..., Eric W. Biederman, (Mon Mar 29, 4:20 pm)
[PATCH 11/14] x86 ioapic: Optimize pin_2_irq, Eric W. Biederman, (Mon Mar 29, 4:20 pm)
[PATCH 12/14] x86 ioapic: Simplify probe_nr_irqs_gsi., Eric W. Biederman, (Mon Mar 29, 4:20 pm)
[PATCH 13/14] x86 acpi/irq: Handle isa irqs that are not i ..., Eric W. Biederman, (Mon Mar 29, 4:20 pm)
[PATCH 14/14] x86 irq: Kill io_apic_renumber_irq, Eric W. Biederman, (Mon Mar 29, 4:20 pm)
Re: [PATCH 12/14] x86 ioapic: Simplify probe_nr_irqs_gsi., Eric W. Biederman, (Mon Mar 29, 9:43 pm)
Re: [PATCH 12/14] x86 ioapic: Simplify probe_nr_irqs_gsi., Eric W. Biederman, (Mon Mar 29, 10:41 pm)
[PATCH 01/15] x86 acpi/irq: Introduce apci_isa_irq_to_gsi, Eric W. Biederman, (Tue Mar 30, 1:07 am)
[PATCH 02/15] x86 acpi/irq: Teach acpi_get_override_irq to ..., Eric W. Biederman, (Tue Mar 30, 1:07 am)
[PATCH 04/15] x86 acpi/irq: Fix acpi_sci_ioapic_setup so i ..., Eric W. Biederman, (Tue Mar 30, 1:07 am)
[PATCH 05/15] x86 acpi/irq: Generalize mp_config_acpi_lega ..., Eric W. Biederman, (Tue Mar 30, 1:07 am)
[PATCH 06/15] x86 ioapic: Only export mp_find_ioapic and m ..., Eric W. Biederman, (Tue Mar 30, 1:07 am)
[PATCH 07/15] x86 ioapic: Fix io_apic_redir_entries to ret ..., Eric W. Biederman, (Tue Mar 30, 1:07 am)
[PATCH 08/15] x86 ioapic: Fix the types of gsi values, Eric W. Biederman, (Tue Mar 30, 1:07 am)
[PATCH 09/15] x86 ioapic: Teach mp_register_ioapic to comp ..., Eric W. Biederman, (Tue Mar 30, 1:07 am)
[PATCH 10/15] x86 ioapic: In mpparse use mp_register_ioapic, Eric W. Biederman, (Tue Mar 30, 1:07 am)
[PATCH 11/15] x86 ioapic: Move nr_ioapic_registers calcula ..., Eric W. Biederman, (Tue Mar 30, 1:07 am)
[PATCH 12/15] x86 ioapic: Optimize pin_2_irq, Eric W. Biederman, (Tue Mar 30, 1:07 am)
[PATCH 13/15] x86 ioapic: Simplify probe_nr_irqs_gsi., Eric W. Biederman, (Tue Mar 30, 1:07 am)
[PATCH 14/15] x86 acpi/irq: Handle isa irqs that are not i ..., Eric W. Biederman, (Tue Mar 30, 1:07 am)
[PATCH 15/15] x86 irq: Kill io_apic_renumber_irq, Eric W. Biederman, (Tue Mar 30, 1:07 am)
[tip:x86/irq] x86, acpi/irq: Introduce apci_isa_irq_to_gsi, tip-bot for Eric W. ..., (Tue May 4, 7:06 pm)
[tip:x86/irq] x86, acpi/irq: Teach acpi_get_override_irq t ..., tip-bot for Eric W. ..., (Tue May 4, 7:07 pm)
[tip:x86/irq] x86, acpi/irq: pci device dev-&gt;irq is an isa ..., tip-bot for Eric W. ..., (Tue May 4, 7:07 pm)
[tip:x86/irq] x86, acpi/irq: Fix acpi_sci_ioapic_setup so ..., tip-bot for Eric W. ..., (Tue May 4, 7:07 pm)
[tip:x86/irq] x86, acpi/irq: Generalize mp_config_acpi_leg ..., tip-bot for Eric W. ..., (Tue May 4, 7:07 pm)
[tip:x86/irq] x86, ioapic: Only export mp_find_ioapic and ..., tip-bot for Eric W. ..., (Tue May 4, 7:08 pm)
[tip:x86/irq] x86, ioapic: Fix io_apic_redir_entries to re ..., tip-bot for Eric W. ..., (Tue May 4, 7:08 pm)
[tip:x86/irq] x86, ioapic: Fix the types of gsi values, tip-bot for Eric W. ..., (Tue May 4, 7:08 pm)
[tip:x86/irq] x86, ioapic: Teach mp_register_ioapic to com ..., tip-bot for Eric W. ..., (Tue May 4, 7:09 pm)
[tip:x86/irq] x86, ioapic: In mpparse use mp_register_ioapic, tip-bot for Eric W. ..., (Tue May 4, 7:09 pm)
[tip:x86/irq] x86, ioapic: Move nr_ioapic_registers calcul ..., tip-bot for Eric W. ..., (Tue May 4, 7:09 pm)
[tip:x86/irq] x86, ioapic: Optimize pin_2_irq, tip-bot for Eric W. ..., (Tue May 4, 7:09 pm)
[tip:x86/irq] x86, ioapic: Simplify probe_nr_irqs_gsi., tip-bot for Eric W. ..., (Tue May 4, 7:10 pm)
[tip:x86/irq] x86, acpi/irq: Handle isa irqs that are not ..., tip-bot for Eric W. ..., (Tue May 4, 7:10 pm)
[tip:x86/irq] x86, irq: Kill io_apic_renumber_irq, tip-bot for Eric W. ..., (Tue May 4, 7:10 pm)
[PATCH] x86 acpi/irq: Fix harmless typo., Eric W. Biederman, (Wed May 5, 1:53 am)
Re: [PATCH] x86 acpi/irq: Fix harmless typo., Ingo Molnar, (Wed May 5, 1:58 am)
Re: [tip:x86/irq] x86, acpi/irq: Handle isa irqs that are ..., Eric W. Biederman, (Wed May 5, 2:32 am)
[PATCH] x86 acpi/irq: Define gsi_end when X86_IO_APIC is ..., Eric W. Biederman, (Wed May 5, 1:22 pm)
[tip:x86/irq] x86, acpi/irq: Define gsi_end when X86_IO_AP ..., tip-bot for Eric W. ..., (Thu May 6, 3:07 am)