From: Jiang Liu <jiang.liu@linux.intel.com>
To: Benjamin Herrenschmidt <benh@kernel.crashing.org>,
Thomas Gleixner <tglx@linutronix.de>,
Grant Likely <grant.likely@linaro.org>,
Ingo Molnar <mingo@redhat.com>, "H. Peter Anvin" <hpa@zytor.com>,
"Rafael J. Wysocki" <rjw@rjwysocki.net>,
Bjorn Helgaas <bhelgaas@google.com>,
Randy Dunlap <rdunlap@infradead.org>,
Yinghai Lu <yinghai@kernel.org>, Len Brown <len.brown@intel.com>,
Pavel Machek <pavel@ucw.cz>,
x86@kernel.org, Jiang Liu <jiang.liu@linux.intel.com>
Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
Andrew Morton <akpm@linux-foundation.org>,
Tony Luck <tony.luck@intel.com>, Joerg Roedel <joro@8bytes.org>,
Paul Gortmaker <paul.gortmaker@windriver.com>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
linux-kernel@vger.kernel.org, linux-pci@vger.kernel.org,
linux-acpi@vger.kernel.org, Ingo Molnar <mingo@kernel.org>,
linux-pm@vger.kernel.org
Subject: [RFC Patch V2 12/16] x86, irq, ACPI: implement interface to support ACPI based IOAPIC hot-addition
Date: Tue, 17 Jun 2014 13:29:51 +0800 [thread overview]
Message-ID: <1402982995-13747-13-git-send-email-jiang.liu@linux.intel.com> (raw)
In-Reply-To: <1402982995-13747-1-git-send-email-jiang.liu@linux.intel.com>
Implement acpi_register_ioapic() and enhance mp_register_ioapic()
to support ACPI based IOAPIC hot-addition.
Signed-off-by: Jiang Liu <jiang.liu@linux.intel.com>
---
arch/x86/kernel/acpi/boot.c | 37 +++++++++++++++++++++++++++++++++++--
arch/x86/kernel/apic/io_apic.c | 27 ++++++++++++++++++++++++---
2 files changed, 59 insertions(+), 5 deletions(-)
diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c
index 120b573f1e96..85caf3221cde 100644
--- a/arch/x86/kernel/acpi/boot.c
+++ b/arch/x86/kernel/acpi/boot.c
@@ -768,8 +768,41 @@ EXPORT_SYMBOL(acpi_unmap_lsapic);
int acpi_register_ioapic(acpi_handle handle, u64 phys_addr, u32 gsi_base)
{
- /* TBD */
- return -EINVAL;
+ int ret = -ENOSYS;
+#ifdef CONFIG_ACPI_HOTPLUG_IOAPIC
+ int ioapic_id;
+ u64 addr;
+ struct ioapic_domain_cfg cfg = {
+ .type = IOAPIC_DOMAIN_DYNAMIC,
+ .ops = &acpi_irqdomain_ops,
+ };
+
+ ioapic_id = acpi_get_ioapic_id(handle, gsi_base, &addr);
+ if (ioapic_id >= 0) {
+ if (addr != phys_addr) {
+ acpi_handle_warn(handle,
+ "IOAPIC physical address doesn't match.\n");
+ return -EINVAL;
+ }
+ } else {
+ unsigned long long uid;
+ acpi_status status;
+
+ status = acpi_evaluate_integer(handle, METHOD_NAME__UID,
+ NULL, &uid);
+ if (ACPI_FAILURE(status)) {
+ acpi_handle_warn(handle, "failed to get IOAPIC ID.\n");
+ return -EINVAL;
+ }
+ ioapic_id = (int)uid;
+ }
+
+ down_write(&acpi_ioapic_rwsem);
+ ret = mp_register_ioapic(ioapic_id, phys_addr, gsi_base, &cfg);
+ up_write(&acpi_ioapic_rwsem);
+#endif
+
+ return ret;
}
EXPORT_SYMBOL(acpi_register_ioapic);
diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c
index e1cce02e9f55..d26fd3ac1b4b 100644
--- a/arch/x86/kernel/apic/io_apic.c
+++ b/arch/x86/kernel/apic/io_apic.c
@@ -3842,7 +3842,13 @@ static int bad_ioapic_register(int idx)
static int find_free_ioapic_entry(void)
{
- return nr_ioapics;
+ int idx;
+
+ for (idx = 0; idx < MAX_IO_APICS; idx++)
+ if (ioapics[idx].nr_registers == 0)
+ return idx;
+
+ return MAX_IO_APICS;
}
int mp_register_ioapic(int id, u32 address, u32 gsi_base,
@@ -3858,8 +3864,15 @@ int mp_register_ioapic(int id, u32 address, u32 gsi_base,
}
for_each_ioapic(ioapic)
if (ioapics[ioapic].mp_config.apicaddr == address) {
- pr_warn("address 0x%x conflicts with IOAPIC%d\n",
- address, ioapic);
+ /*
+ * IOAPIC unit may also be visible in PCI scope.
+ * When ioapic PCI driver's probe() is called,
+ * the IOAPIC unit may have already been initialized
+ * at boot time.
+ */
+ if (!ioapic_initialized)
+ pr_warn("address 0x%x conflicts with IOAPIC%d\n",
+ address, ioapic);
return -EEXIST;
}
@@ -3909,6 +3922,14 @@ int mp_register_ioapic(int id, u32 address, u32 gsi_base,
ioapics[idx].irqdomain = NULL;
ioapics[idx].irqdomain_cfg = *cfg;
+ if (ioapic_initialized) {
+ if (mp_irqdomain_create(idx)) {
+ clear_fixmap(FIX_IO_APIC_BASE_0 + idx);
+ return -ENOMEM;
+ }
+ alloc_ioapic_saved_registers(idx);
+ }
+
if (gsi_cfg->gsi_end >= gsi_top)
gsi_top = gsi_cfg->gsi_end + 1;
if (nr_ioapics <= idx)
--
1.7.10.4
next prev parent reply other threads:[~2014-06-17 5:29 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-06-17 5:29 [RFC Patch V2 00/16] Enable support of IOAPIC hotplug on x86 platforms Jiang Liu
2014-06-17 5:29 ` [RFC Patch V2 01/16] x86, irq: Split out alloc_ioapic_save_registers() Jiang Liu
2014-06-17 5:29 ` [RFC Patch V2 02/16] x86, ioapic: Find usable ioapic id for 64bit Jiang Liu
2014-06-17 5:29 ` [RFC Patch V2 03/16] ACPI, x86/PCI: Move resource_to_addr() to acpi generic Jiang Liu
2014-06-17 16:05 ` Bjorn Helgaas
2014-06-18 16:30 ` [RFC Patch V2] x86/PCI/ACPI: kill private function resource_to_addr() Jiang Liu
2014-07-02 22:30 ` Bjorn Helgaas
2014-06-17 5:29 ` [RFC Patch V2 04/16] ACPI: Make map_mat_entry handle x2apic entry Jiang Liu
2014-06-17 5:29 ` [RFC Patch V2 05/16] ACPI: Move acpi_get_cpuid() to separated file Jiang Liu
2014-06-17 5:29 ` [RFC Patch V2 06/16] ACPI, ioapic: Add acpi_get_ioapic_id() Jiang Liu
2014-06-17 5:29 ` [RFC Patch V2 07/16] x86, irq, ACPI: protect acpi_pci_irq_enable() from reentrance Jiang Liu
2014-06-17 5:29 ` [RFC Patch V2 08/16] PCI: kill wrong warning message in pcieport driver Jiang Liu
2014-06-17 16:11 ` Bjorn Helgaas
2014-06-18 5:56 ` [Patch] PCI/portdrv: Remove warning about invalid IRQ Jiang Liu
2014-07-02 21:25 ` Bjorn Helgaas
2014-06-17 5:29 ` [RFC Patch V2 09/16] x86, irq: remove __init marker for functions will be used by IOAPIC hotplug Jiang Liu
2014-06-17 5:29 ` [RFC Patch V2 10/16] x86, irq: refine mp_register_ioapic() to prepare for " Jiang Liu
2014-06-17 5:29 ` [RFC Patch V2 11/16] x86, irq, ACPI: introduce a rwsem to protect IOAPIC operations from hotplug Jiang Liu
2014-06-17 5:29 ` Jiang Liu [this message]
2014-06-17 5:29 ` [RFC Patch V2 13/16] x86, irq, ACPI: implement interface to support ACPI based IOAPIC hot-removal Jiang Liu
2014-06-17 5:29 ` [RFC Patch V2 14/16] x86, irq: introduce helper to check whether an IOAPIC has been registered Jiang Liu
2014-06-17 5:29 ` [RFC Patch V2 15/16] pci, ioapic: kill ioapic PCI driver Jiang Liu
2014-06-17 16:49 ` Bjorn Helgaas
2014-06-20 8:47 ` Jiang Liu
2014-06-20 8:58 ` Jiang Liu
2014-06-17 5:29 ` [RFC Patch V2 16/16] x86, irq, ACPI: implement ACPI driver to support IOAPIC hotplug Jiang Liu
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=1402982995-13747-13-git-send-email-jiang.liu@linux.intel.com \
--to=jiang.liu@linux.intel.com \
--cc=akpm@linux-foundation.org \
--cc=benh@kernel.crashing.org \
--cc=bhelgaas@google.com \
--cc=grant.likely@linaro.org \
--cc=gregkh@linuxfoundation.org \
--cc=hpa@zytor.com \
--cc=joro@8bytes.org \
--cc=konrad.wilk@oracle.com \
--cc=len.brown@intel.com \
--cc=linux-acpi@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=mingo@kernel.org \
--cc=mingo@redhat.com \
--cc=paul.gortmaker@windriver.com \
--cc=pavel@ucw.cz \
--cc=rdunlap@infradead.org \
--cc=rjw@rjwysocki.net \
--cc=tglx@linutronix.de \
--cc=tony.luck@intel.com \
--cc=x86@kernel.org \
--cc=yinghai@kernel.org \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.