linux-acpi.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Yinghai Lu <yinghai@kernel.org>
To: Thomas Gleixner <tglx@linutronix.de>, Ingo Molnar <mingo@elte.hu>,
	"H. Peter Anvin" <hpa@zytor.com>, Tony Luck <tony.luck@intel.com>,
	Bjorn Helgaas <bhelgaas@google.com>,
	"Rafael J. Wysocki" <rjw@sisk.pl>
Cc: linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org,
	linux-acpi@vger.kernel.org, Yinghai Lu <yinghai@kernel.org>,
	Pavel Machek <pavel@ucw.cz>, Joerg Roedel <joro@8bytes.org>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	Sebastian Andrzej Siewior <sebastian@breakpoint.cc>
Subject: [PATCH v4 18/28] x86, irq: Add ioapic_gsi_to_irq
Date: Sat, 10 Aug 2013 19:48:04 -0700	[thread overview]
Message-ID: <1376189294-32022-19-git-send-email-yinghai@kernel.org> (raw)
In-Reply-To: <1376189294-32022-1-git-send-email-yinghai@kernel.org>

For hot add ioapic, irq_base is not equal to gsi_base.
We need a way to do mapping between gsi and irq.

Also remove irq_to_gsi() that is confusing, just use that array
directly as we only have one caller and it already check
input irq before use it.

Signed-off-by: Yinghai Lu <yinghai@kernel.org>
Cc: Pavel Machek <pavel@ucw.cz>
Cc: Joerg Roedel <joro@8bytes.org>
Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Cc: Sebastian Andrzej Siewior <sebastian@breakpoint.cc>
---
 arch/x86/include/asm/io_apic.h |  1 +
 arch/x86/kernel/acpi/boot.c    | 22 +++++-----------------
 arch/x86/kernel/apic/io_apic.c | 29 ++++++++++++++++++++++++++++-
 3 files changed, 34 insertions(+), 18 deletions(-)

diff --git a/arch/x86/include/asm/io_apic.h b/arch/x86/include/asm/io_apic.h
index 8181fd8..02ac411 100644
--- a/arch/x86/include/asm/io_apic.h
+++ b/arch/x86/include/asm/io_apic.h
@@ -180,6 +180,7 @@ struct mp_ioapic_gsi{
 };
 extern struct mp_ioapic_gsi  mp_gsi_routing[];
 extern u32 gsi_top;
+int ioapic_gsi_to_irq(u32 gsi);
 int mp_find_ioapic(u32 gsi);
 int mp_find_ioapic_pin(int ioapic, u32 gsi);
 void __init mp_register_ioapic(int id, u32 address, u32 gsi_base);
diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c
index 2627a81..5be15d1 100644
--- a/arch/x86/kernel/acpi/boot.c
+++ b/arch/x86/kernel/acpi/boot.c
@@ -112,6 +112,10 @@ static unsigned int gsi_to_irq(unsigned int gsi)
 		}
 	}
 
+#ifdef CONFIG_X86_IO_APIC
+	if (acpi_irq_model == ACPI_IRQ_MODEL_IOAPIC)
+		return ioapic_gsi_to_irq(gsi);
+#endif
 	/* Provide an identity mapping of gsi == irq
 	 * except on truly weird platforms that have
 	 * non isa irqs in the first 16 gsis.
@@ -124,22 +128,6 @@ static unsigned int gsi_to_irq(unsigned int 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_top)
-		gsi = irq;
-	else if (irq < (gsi_top + NR_IRQS_LEGACY))
-		gsi = irq - gsi_top;
-	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()
@@ -529,7 +517,7 @@ int acpi_isa_irq_to_gsi(unsigned isa_irq, u32 *gsi)
 {
 	if (isa_irq >= 16)
 		return -1;
-	*gsi = irq_to_gsi(isa_irq);
+	*gsi = isa_irq_to_gsi[isa_irq];
 	return 0;
 }
 
diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c
index cb272c9..8d087f1 100644
--- a/arch/x86/kernel/apic/io_apic.c
+++ b/arch/x86/kernel/apic/io_apic.c
@@ -1041,13 +1041,16 @@ static int pin_2_irq(int idx, int apic, int pin)
 
 	if (test_bit(bus, mp_bus_not_pci)) {
 		irq = mp_irqs[idx].srcbusirq;
-	} else {
+	} else if (gsi_cfg->gsi_base == gsi_cfg->irq_base) {
 		u32 gsi = gsi_cfg->gsi_base + pin;
 
 		if (gsi >= NR_IRQS_LEGACY)
 			irq = gsi;
 		else
 			irq = gsi_top + gsi;
+	} else {
+		/* hotadd ioapic */
+		irq = gsi_cfg->irq_base + pin;
 	}
 
 #ifdef CONFIG_X86_32
@@ -1473,6 +1476,30 @@ static void __init setup_IO_APIC_irqs(void)
 		__io_apic_setup_irqs(ioapic_idx);
 }
 
+int ioapic_gsi_to_irq(u32 gsi)
+{
+	int ioapic_idx = 0, irq = gsi;
+	struct mp_ioapic_gsi *gsi_cfg;
+
+	ioapic_idx = mp_find_ioapic(gsi);
+	if (ioapic_idx < 0)
+		return -1;
+
+	gsi_cfg = mp_ioapic_gsi_routing(ioapic_idx);
+	if (gsi_cfg->gsi_base == gsi_cfg->irq_base) {
+		if (gsi < NR_IRQS_LEGACY)
+			irq = gsi_top + gsi;
+	} else {
+		int pin = mp_find_ioapic_pin(ioapic_idx, gsi);
+
+		if (pin < 0)
+			return -1;
+		/* hotadd ioapic */
+		irq = gsi_cfg->irq_base + pin;
+	}
+
+	return irq;
+}
 /*
  * for the gsit that is not in first ioapic
  * but could not use acpi_register_gsi()
-- 
1.8.1.4

  parent reply	other threads:[~2013-08-11  2:48 UTC|newest]

Thread overview: 53+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-08-11  2:47 [PATCH v4 00/28] x86, irq: Support ioapic controller hotplug Yinghai Lu
2013-08-11  2:47 ` [PATCH v4 01/28] genirq: Split __irq_reserve_irqs from irq_alloc_descs Yinghai Lu
2013-08-11  2:47 ` [PATCH v4 02/28] genirq: Add irq_alloc_reserved_desc() Yinghai Lu
2013-08-11  2:47 ` [PATCH v4 03/28] genirq: Do not free unallocated irq descriptors Yinghai Lu
2013-08-11  2:47 ` [PATCH v4 04/28] x86, irq: Change irq_remap_modify_chip_defaults() to static Yinghai Lu
2013-08-11  2:47 ` [PATCH v4 05/28] x86, irq: Modify irq chip once for irq remapping Yinghai Lu
2013-08-11  2:47 ` [PATCH v4 06/28] x86, irq: Show MSI-X clearly in debug message Yinghai Lu
2013-08-11  2:47 ` [PATCH v4 07/28] x86, irq: Show MSI-X in /proc/interrupt Yinghai Lu
2013-08-11  2:47 ` [PATCH v4 08/28] x86, irq: Make dmar_msi/hpet_msi irq_chip name consistent Yinghai Lu
2013-08-11  2:47 ` [PATCH v4 09/28] ia64, irq: Add dummy create_irq_nr() Yinghai Lu
2013-08-11  2:47 ` [PATCH v4 10/28] iommu, irq: Allocate irq_desc for dmar_msi with local node Yinghai Lu
2013-08-11  2:47 ` [PATCH v4 11/28] x86, irq: Kill create_irq() Yinghai Lu
2013-08-11  2:47 ` [PATCH v4 12/28] x86, irq: Convert irq_2_pin list to generic list Yinghai Lu
2013-08-11  2:47 ` [PATCH v4 13/28] x86, irq: Add alloc_reserved_irq_and_cfg_at() Yinghai Lu
2013-08-11  2:48 ` [PATCH v4 14/28] x86, irq: Move down arch_early_irq_init() Yinghai Lu
2013-08-11  2:48 ` [PATCH v4 15/28] x86, irq: Split out alloc_ioapic_save_registers() Yinghai Lu
2013-08-11  2:48 ` [PATCH v4 16/28] xen, irq: Call irq_alloc_reserved_desc_at() at first Yinghai Lu
2013-08-11  2:48 ` [PATCH v4 17/28] x86, irq: Reserve irq range and alloc_reserved for booting path Yinghai Lu
2013-08-11  2:48 ` Yinghai Lu [this message]
2013-08-11  2:48 ` [PATCH v4 19/28] x86, irq: Add for_each_ioapic helper Yinghai Lu
2013-08-11  2:48 ` [PATCH v4 20/28] x86, irq: More strict checking about registering ioapic Yinghai Lu
2013-08-19  7:47   ` Lan Tianyu
2013-10-21 10:54   ` Yijing Wang
2013-08-11  2:48 ` [PATCH v4 21/28] x86, irq: Make mp_register_ioapic handle hot-added ioapic Yinghai Lu
2013-08-11  2:48 ` [PATCH v4 22/28] x86, irq: Add mp_unregister_ioapic to handle hot-remove ioapic Yinghai Lu
2013-08-11  2:48 ` [PATCH v4 23/28] x86, ioapic: Find usable ioapic id for 64bit Yinghai Lu
2013-08-11  2:48 ` [PATCH v4 24/28] x86: Move declaration for mp_register_ioapic() Yinghai Lu
2013-08-11  2:48 ` [PATCH v4 25/28] PCI, x86: Make ioapic hotplug support built-in Yinghai Lu
2013-10-01 16:00   ` Bjorn Helgaas
2013-10-01 17:42     ` Yinghai Lu
2013-08-11  2:48 ` [PATCH v4 26/28] PCI, x86, ACPI: Link acpi ioapic register to ioapic Yinghai Lu
2013-08-24  0:51   ` rui wang
2013-08-27  0:40     ` Yinghai Lu
2013-08-27  6:44       ` rui wang
2013-08-27  6:53         ` Yinghai Lu
2013-08-27 10:08           ` rui wang
2013-08-28  6:17             ` Yinghai Lu
2013-08-11  2:48 ` [PATCH v4 27/28] PCI, x86, ACPI: Enable ioapic hotplug support with acpi host bridge Yinghai Lu
2013-08-27 10:25   ` rui wang
2013-08-28  1:10     ` rui wang
2013-08-28  6:22     ` Yinghai Lu
2013-08-28  8:25       ` rui wang
2013-10-21 12:30   ` Yijing Wang
2013-08-11  2:48 ` [PATCH v4 28/28] PCI, x86, ACPI: get ioapic address from acpi device Yinghai Lu
2013-08-22 13:29   ` rui wang
2013-08-23 10:41     ` rui wang
2013-08-23 15:34       ` Lan Tianyu
2013-08-23 18:38         ` Yinghai Lu
2013-08-23 19:04           ` Yinghai Lu
2013-08-23 19:38             ` Yinghai Lu
2013-08-26 15:46               ` Lan Tianyu
2013-08-27  1:03                 ` Yinghai Lu
2013-08-27 14:56                   ` Lan Tianyu

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1376189294-32022-19-git-send-email-yinghai@kernel.org \
    --to=yinghai@kernel.org \
    --cc=bhelgaas@google.com \
    --cc=hpa@zytor.com \
    --cc=joro@8bytes.org \
    --cc=konrad.wilk@oracle.com \
    --cc=linux-acpi@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pci@vger.kernel.org \
    --cc=mingo@elte.hu \
    --cc=pavel@ucw.cz \
    --cc=rjw@sisk.pl \
    --cc=sebastian@breakpoint.cc \
    --cc=tglx@linutronix.de \
    --cc=tony.luck@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).