All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jiang Liu <jiang.liu@linux.intel.com>
To: Benjamin Herrenschmidt <benh@kernel.crashing.org>,
	Thomas Gleixner <tglx@linutronix.de>,
	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>,
	x86@kernel.org, Jiang Liu <jiang.liu@linux.intel.com>,
	Grant Likely <grant.likely@linaro.org>,
	Prarit Bhargava <prarit@redhat.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>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	linux-kernel@vger.kernel.org, linux-pci@vger.kernel.org,
	linux-acpi@vger.kernel.org,
	Sebastian Andrzej Siewior <sebastian@breakpoint.cc>,
	Ingo Molnar <mingo@kernel.org>
Subject: [Patch V3 07/16] x86, ioapic: Find usable ioapic id for 64bit.
Date: Wed, 25 Jun 2014 16:40:38 +0800	[thread overview]
Message-ID: <1403685648-10103-8-git-send-email-jiang.liu@linux.intel.com> (raw)
In-Reply-To: <1403685648-10103-1-git-send-email-jiang.liu@linux.intel.com>

From: Yinghai Lu <yinghai@kernel.org>

Checking the id in register, if that is duplicated, will pick one and
update id register.

Signed-off-by: Yinghai Lu <yinghai@kernel.org>
Cc: Joerg Roedel <joro@8bytes.org>
Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Cc: Sebastian Andrzej Siewior <sebastian@breakpoint.cc>
Signed-off-by: Jiang Liu <jiang.liu@linux.intel.com>
---
 arch/x86/kernel/apic/io_apic.c |   38 +++++++++++++++++++++++++++++++++-----
 1 file changed, 33 insertions(+), 5 deletions(-)

diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c
index b7296d4ca0a1..a068bf558657 100644
--- a/arch/x86/kernel/apic/io_apic.c
+++ b/arch/x86/kernel/apic/io_apic.c
@@ -3570,26 +3570,54 @@ static int __init io_apic_get_unique_id(int ioapic, int apic_id)
 	return apic_id;
 }
 
-static u8 __init io_apic_unique_id(u8 id)
+static u8 io_apic_unique_id(int idx, u8 id)
 {
 	if ((boot_cpu_data.x86_vendor == X86_VENDOR_INTEL) &&
 	    !APIC_XAPIC(apic_version[boot_cpu_physical_apicid]))
-		return io_apic_get_unique_id(nr_ioapics, id);
+		return io_apic_get_unique_id(idx, id);
 	else
 		return id;
 }
 #else
-static u8 __init io_apic_unique_id(u8 id)
+static u8 io_apic_unique_id(int idx, u8 id)
 {
 	int i;
+	u8 new_id;
+	unsigned long flags;
 	DECLARE_BITMAP(used, 256);
+	union IO_APIC_reg_00 reg_00;
 
 	bitmap_zero(used, 256);
 	for_each_ioapic(i)
 		__set_bit(mpc_ioapic_id(i), used);
 	if (!test_bit(id, used))
 		return id;
-	return find_first_zero_bit(used, 256);
+
+	/* check register at first */
+	raw_spin_lock_irqsave(&ioapic_lock, flags);
+	reg_00.raw = io_apic_read(idx, 0);
+	raw_spin_unlock_irqrestore(&ioapic_lock, flags);
+	new_id = reg_00.bits.ID;
+	if (!test_bit(new_id, used)) {
+		apic_printk(APIC_VERBOSE, KERN_INFO
+			"IOAPIC[%d]: Using reg apic_id %d instead of %d\n",
+			 idx, new_id, id);
+		return new_id;
+	}
+
+	new_id = find_first_zero_bit(used, 256);
+	reg_00.bits.ID = new_id;
+	raw_spin_lock_irqsave(&ioapic_lock, flags);
+	io_apic_write(idx, 0, reg_00.raw);
+	reg_00.raw = io_apic_read(idx, 0);
+	raw_spin_unlock_irqrestore(&ioapic_lock, flags);
+
+	/* Sanity check */
+	if (reg_00.bits.ID != new_id)
+		pr_warn("IOAPIC[%d]: Unable to change apic_id to %d!\n",
+			idx, new_id);
+
+	return new_id;
 }
 #endif
 
@@ -3855,7 +3883,7 @@ void __init mp_register_ioapic(int id, u32 address, u32 gsi_base,
 		return;
 	}
 
-	ioapics[idx].mp_config.apicid = io_apic_unique_id(id);
+	ioapics[idx].mp_config.apicid = io_apic_unique_id(idx, id);
 	ioapics[idx].mp_config.apicver = io_apic_get_version(idx);
 
 	/*
-- 
1.7.10.4

  parent reply	other threads:[~2014-06-25  8:40 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-06-25  8:40 [Patch V3 00/16] Enable support of IOAPIC hotplug on x86 platforms Jiang Liu
2014-06-25  8:40 ` [Patch V3 01/16] x86, irq, ACPI: Protect acpi_pci_irq_enable() from reentrance Jiang Liu
2014-06-25  8:40 ` [Patch V3 02/16] ACPI: Make map_mat_entry handle x2apic entry Jiang Liu
2014-06-25  8:40 ` [Patch V3 03/16] ACPI: Correct return value of acpi_dev_resource_address_space() Jiang Liu
2014-06-25  8:40 ` [Patch V3 04/16] x86, PCI, ACPI: Kill private function resource_to_addr() Jiang Liu
2014-06-25  8:40 ` [Patch V3 05/16] ACPI: Move acpi_get_cpuid() to separated file Jiang Liu
2014-06-25  8:40 ` [Patch V3 06/16] x86, irq: Split out alloc_ioapic_save_registers() Jiang Liu
2014-06-25  8:40 ` Jiang Liu [this message]
2014-06-25  8:40 ` [Patch V3 08/16] ACPI, ioapic: Add acpi_get_ioapic_id() Jiang Liu
2014-06-25  8:40 ` [Patch V3 09/16] x86, irq: Remove __init marker for functions will be used by IOAPIC hotplug Jiang Liu
2014-06-25  8:40 ` [Patch V3 10/16] x86, irq: Refine mp_register_ioapic() to prepare for " Jiang Liu
2014-06-25  8:40 ` [Patch V3 11/16] x86, irq, ACPI: Introduce a rwsem to protect IOAPIC operations from hotplug Jiang Liu
2014-06-25  8:40 ` [Patch V3 12/16] x86, irq, ACPI: Implement interface to support ACPI based IOAPIC hot-addition Jiang Liu
2014-06-25  8:40 ` [Patch V3 13/16] x86, irq, ACPI: Implement interface to support ACPI based IOAPIC hot-removal Jiang Liu
2014-06-25  8:40 ` [Patch V3 14/16] x86, irq: Introduce helper to check whether an IOAPIC has been registered Jiang Liu
2014-06-25  8:40 ` [Patch V3 15/16] PCI: Remove PCI ioapic driver Jiang Liu
2014-06-25  8:40 ` [Patch V3 16/16] x86, irq, ACPI: Implement ACPI driver to support IOAPIC hotplug Jiang Liu
2014-06-25 14:44 ` [Patch V3 00/16] Enable support of IOAPIC hotplug on x86 platforms Konrad Rzeszutek Wilk
2014-06-27 14:43   ` Jiang Liu
2014-07-14 17:26 ` Konrad Rzeszutek Wilk
2014-07-14 19:41   ` Konrad Rzeszutek Wilk
2014-07-15 15:27     ` Jiang Liu
2014-07-15 16:10       ` Konrad Rzeszutek Wilk
2014-07-16  3:01         ` Jiang Liu
2014-07-16 13:33           ` Konrad Rzeszutek Wilk

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=1403685648-10103-8-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=linux-acpi@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pci@vger.kernel.org \
    --cc=mingo@kernel.org \
    --cc=mingo@redhat.com \
    --cc=prarit@redhat.com \
    --cc=rdunlap@infradead.org \
    --cc=rjw@rjwysocki.net \
    --cc=sebastian@breakpoint.cc \
    --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.