All of lore.kernel.org
 help / color / mirror / Atom feed
From: Alex Chiang <achiang@hp.com>
To: lenb@kernel.org
Cc: linux-acpi@vger.kernel.org, linux-kernel@vger.kernel.org,
	Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>
Subject: [PATCH v2 05/12] ACPI: processor: add internal processor_physically_present()
Date: Mon, 22 Feb 2010 12:11:29 -0700	[thread overview]
Message-ID: <20100222191129.19752.51057.stgit@bob.kio> (raw)
In-Reply-To: <20100222190145.19752.20978.stgit@bob.kio>

Detect if a processor is physically present before evaluating _PDC.

We want this because some BIOS will provide a _PDC even for processors
that are not present. These bogus _PDC methods then attempt to load
non-existent tables, which causes problems.

Avoid those bogus landmines.

Acked-by: Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>
Signed-off-by: Alex Chiang <achiang@hp.com>
---

 drivers/acpi/processor_core.c |   42 +++++++++++++++++++++++++++++++++++++++++
 1 files changed, 42 insertions(+), 0 deletions(-)

diff --git a/drivers/acpi/processor_core.c b/drivers/acpi/processor_core.c
index 9ae5cc2..f0c68c1 100644
--- a/drivers/acpi/processor_core.c
+++ b/drivers/acpi/processor_core.c
@@ -194,6 +194,45 @@ int acpi_get_cpuid(acpi_handle handle, int type, u32 acpi_id)
 EXPORT_SYMBOL_GPL(acpi_get_cpuid);
 #endif
 
+static bool processor_physically_present(acpi_handle handle)
+{
+	int cpuid, type;
+	u32 acpi_id;
+	acpi_status status;
+	acpi_object_type acpi_type;
+	unsigned long long tmp;
+	union acpi_object object = { 0 };
+	struct acpi_buffer buffer = { sizeof(union acpi_object), &object };
+
+	status = acpi_get_type(handle, &acpi_type);
+	if (ACPI_FAILURE(status))
+		return false;
+
+	switch (acpi_type) {
+	case ACPI_TYPE_PROCESSOR:
+		status = acpi_evaluate_object(handle, NULL, NULL, &buffer);
+		if (ACPI_FAILURE(status))
+			return false;
+		acpi_id = object.processor.proc_id;
+		break;
+	case ACPI_TYPE_DEVICE:
+		status = acpi_evaluate_integer(handle, "_UID", NULL, &tmp);
+		if (ACPI_FAILURE(status))
+			return false;
+		acpi_id = tmp;
+		break;
+	default:
+		return false;
+	}
+
+	type = (acpi_type == ACPI_TYPE_DEVICE) ? 1 : 0;
+	cpuid = acpi_get_cpuid(handle, type, acpi_id);
+
+	if (cpuid == -1)
+		return false;
+
+	return true;
+}
 
 static void acpi_set_pdc_bits(u32 *buf)
 {
@@ -335,6 +374,9 @@ static struct dmi_system_id __cpuinitdata early_pdc_optin_table[] = {
 static acpi_status
 early_init_pdc(acpi_handle handle, u32 lvl, void *context, void **rv)
 {
+	if (processor_physically_present(handle) == false)
+		return AE_OK;
+
 	acpi_processor_set_pdc(handle);
 	return AE_OK;
 }


  parent reply	other threads:[~2010-02-22 19:11 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-02-22 19:11 [PATCH v2 00/12] ACPI: processor driver vs. core Alex Chiang
2010-02-22 19:11 ` [PATCH v2 01/12] ACPI: processor: mv processor_core.c processor_driver.c Alex Chiang
2010-02-22 19:11 ` [PATCH v2 02/12] ACPI: processor: mv processor_pdc.c processor_core.c Alex Chiang
2010-02-22 19:11 ` [PATCH v2 03/12] ACPI: processor: export acpi_get_cpuid() Alex Chiang
2010-02-22 19:11 ` [PATCH v2 04/12] ACPI: processor: move acpi_get_cpuid into processor_core.c Alex Chiang
2010-02-22 19:11 ` Alex Chiang [this message]
2010-02-22 19:11 ` [PATCH v2 06/12] ACPI: processor: remove early _PDC optin quirks Alex Chiang
2010-02-22 19:11 ` [PATCH v2 07/12] ACPI: processor: driver doesn't need to evaluate _PDC Alex Chiang
2010-02-22 19:11 ` [PATCH v2 08/12] ACPI: processor: refactor internal map_lapic_id() Alex Chiang
2010-02-22 19:11 ` [PATCH v2 09/12] ACPI: processor: refactor internal map_x2apic_id() Alex Chiang
2010-02-22 19:11 ` [PATCH v2 10/12] ACPI: processor: refactor internal map_lsapic_id() Alex Chiang
2010-02-22 19:12 ` [PATCH v2 11/12] ACPI: processor: push file static MADT pointer into internal map_madt_entry() Alex Chiang
2010-02-22 19:12 ` [PATCH v2 12/12] ACPI: processor core: style and sparse cleanups Alex Chiang

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=20100222191129.19752.51057.stgit@bob.kio \
    --to=achiang@hp.com \
    --cc=lenb@kernel.org \
    --cc=linux-acpi@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=venkatesh.pallipadi@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 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.