From: hanjun.guo@linaro.org (Hanjun Guo)
To: linux-arm-kernel@lists.infradead.org
Subject: [patch v11 14/23] ACPI / processor: Make it possible to get CPU hardware ID via GICC
Date: Tue, 24 Mar 2015 22:02:47 +0800 [thread overview]
Message-ID: <1427205776-5060-15-git-send-email-hanjun.guo@linaro.org> (raw)
In-Reply-To: <1427205776-5060-1-git-send-email-hanjun.guo@linaro.org>
Introduce a new function map_gicc_mpidr() to allow MPIDRs to be obtained
from the GICC Structure introduced by ACPI 5.1, since MPIDR for ARM64 is
64-bit, so typedef u64 for phys_cpuid_t.
The ARM architecture defines the MPIDR register as the CPU hardware
identifier. This patch adds the code infrastructure to retrieve the MPIDR
values from the ARM ACPI GICC structure in order to look-up the kernel CPU
hardware ids required by the ACPI core code to identify CPUs.
CC: Rafael J. Wysocki <rjw@rjwysocki.net>
CC: Catalin Marinas <catalin.marinas@arm.com>
CC: Will Deacon <will.deacon@arm.com>
Tested-by: Suravee Suthikulpanit <Suravee.Suthikulpanit@amd.com>
Tested-by: Yijing Wang <wangyijing@huawei.com>
Tested-by: Mark Langsdorf <mlangsdo@redhat.com>
Tested-by: Jon Masters <jcm@redhat.com>
Tested-by: Timur Tabi <timur@codeaurora.org>
Tested-by: Robert Richter <rrichter@cavium.com>
Acked-by: Robert Richter <rrichter@cavium.com>
Acked-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Acked-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Reviewed-by: Grant Likely <grant.likely@linaro.org>
Signed-off-by: Hanjun Guo <hanjun.guo@linaro.org>
---
arch/arm64/include/asm/acpi.h | 12 ++++++++++++
drivers/acpi/processor_core.c | 30 ++++++++++++++++++++++++++++++
2 files changed, 42 insertions(+)
diff --git a/arch/arm64/include/asm/acpi.h b/arch/arm64/include/asm/acpi.h
index 9719921..eea0bc3 100644
--- a/arch/arm64/include/asm/acpi.h
+++ b/arch/arm64/include/asm/acpi.h
@@ -13,6 +13,8 @@
#define _ASM_ACPI_H
#include <linux/mm.h>
+#include <asm/cputype.h>
+#include <asm/smp_plat.h>
/* Basic configuration for ACPI */
#ifdef CONFIG_ACPI
@@ -27,6 +29,9 @@ static inline void __iomem *acpi_os_ioremap(acpi_physical_address phys,
}
#define acpi_os_ioremap acpi_os_ioremap
+typedef u64 phys_cpuid_t;
+#define PHYS_CPUID_INVALID INVALID_HWID
+
#define acpi_strict 1 /* No out-of-spec workarounds on ARM64 */
extern int acpi_disabled;
extern int acpi_noirq;
@@ -59,6 +64,13 @@ static inline void enable_acpi(void)
}
/*
+ * The ACPI processor driver for ACPI core code needs this macro
+ * to find out this cpu was already mapped (mapping from CPU hardware
+ * ID to CPU logical ID) or not.
+ */
+#define cpu_physical_id(cpu) cpu_logical_map(cpu)
+
+/*
* It's used from ACPI core in kdump to boot UP system with SMP kernel,
* with this check the ACPI core will not override the CPU index
* obtained from GICC with 0 and not print some error message as well.
diff --git a/drivers/acpi/processor_core.c b/drivers/acpi/processor_core.c
index 51cc299..b1ec78b 100644
--- a/drivers/acpi/processor_core.c
+++ b/drivers/acpi/processor_core.c
@@ -83,6 +83,31 @@ static int map_lsapic_id(struct acpi_subtable_header *entry,
return 0;
}
+/*
+ * Retrieve the ARM CPU physical identifier (MPIDR)
+ */
+static int map_gicc_mpidr(struct acpi_subtable_header *entry,
+ int device_declaration, u32 acpi_id, phys_cpuid_t *mpidr)
+{
+ struct acpi_madt_generic_interrupt *gicc =
+ container_of(entry, struct acpi_madt_generic_interrupt, header);
+
+ if (!(gicc->flags & ACPI_MADT_ENABLED))
+ return -ENODEV;
+
+ /* device_declaration means Device object in DSDT, in the
+ * GIC interrupt model, logical processors are required to
+ * have a Processor Device object in the DSDT, so we should
+ * check device_declaration here
+ */
+ if (device_declaration && (gicc->uid == acpi_id)) {
+ *mpidr = gicc->arm_mpidr;
+ return 0;
+ }
+
+ return -EINVAL;
+}
+
static phys_cpuid_t map_madt_entry(int type, u32 acpi_id)
{
unsigned long madt_end, entry;
@@ -111,6 +136,9 @@ static phys_cpuid_t map_madt_entry(int type, u32 acpi_id)
} else if (header->type == ACPI_MADT_TYPE_LOCAL_SAPIC) {
if (!map_lsapic_id(header, type, acpi_id, &phys_id))
break;
+ } else if (header->type == ACPI_MADT_TYPE_GENERIC_INTERRUPT) {
+ if (!map_gicc_mpidr(header, type, acpi_id, &phys_id))
+ break;
}
entry += header->length;
}
@@ -143,6 +171,8 @@ static phys_cpuid_t map_mat_entry(acpi_handle handle, int type, u32 acpi_id)
map_lsapic_id(header, type, acpi_id, &phys_id);
else if (header->type == ACPI_MADT_TYPE_LOCAL_X2APIC)
map_x2apic_id(header, type, acpi_id, &phys_id);
+ else if (header->type == ACPI_MADT_TYPE_GENERIC_INTERRUPT)
+ map_gicc_mpidr(header, type, acpi_id, &phys_id);
exit:
kfree(buffer.pointer);
--
1.9.1
next prev parent reply other threads:[~2015-03-24 14:02 UTC|newest]
Thread overview: 59+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-03-24 14:02 [patch v11 00/23] Introduce ACPI for ARM64 based on ACPI 5.1 Hanjun Guo
2015-03-24 14:02 ` [patch v11 01/23] ACPI / table: Use pr_debug() instead of pr_info() for MADT table scanning Hanjun Guo
2015-03-24 14:02 ` [patch v11 02/23] ACPI: add arm64 to the platforms that use ioremap Hanjun Guo
2015-03-25 16:43 ` Catalin Marinas
2015-03-24 14:02 ` [patch v11 03/23] ARM64: allow late use of early_ioremap Hanjun Guo
2015-03-25 16:43 ` Catalin Marinas
2015-03-24 14:02 ` [patch v11 04/23] ARM64 / ACPI: Get RSDP and ACPI boot-time tables Hanjun Guo
2015-03-25 16:44 ` Catalin Marinas
2015-03-24 14:02 ` [patch v11 05/23] ACPI: fix acpi_os_ioremap for arm64 Hanjun Guo
2015-03-25 16:50 ` Catalin Marinas
2015-03-24 14:02 ` [patch v11 06/23] ACPI / sleep: Introduce CONFIG_ACPI_SYSTEM_POWER_STATES_SUPPORT Hanjun Guo
2015-03-24 14:02 ` [patch v11 07/23] ARM64 / ACPI: Introduce PCI stub functions for ACPI Hanjun Guo
2015-03-25 16:50 ` Catalin Marinas
2015-03-24 14:02 ` [patch v11 08/23] ARM64 / ACPI: Introduce early_param "acpi=" to enable/disable ACPI Hanjun Guo
2015-03-25 16:57 ` Catalin Marinas
2015-03-24 14:02 ` [patch v11 09/23] ARM64 / ACPI: If we chose to boot from acpi then disable FDT Hanjun Guo
2015-03-25 17:00 ` Catalin Marinas
2015-03-26 10:57 ` Lorenzo Pieralisi
2015-03-24 14:02 ` [patch v11 10/23] ARM64 / ACPI: Get PSCI flags in FADT for PSCI init Hanjun Guo
2015-03-25 17:01 ` Catalin Marinas
2015-03-24 14:02 ` [patch v11 11/23] ACPI / table: Print GIC information when MADT is parsed Hanjun Guo
2015-03-24 14:02 ` [patch v11 12/23] ARM64 / ACPI: Parse MADT for SMP initialization Hanjun Guo
2015-03-25 17:17 ` Catalin Marinas
2015-03-26 15:15 ` Will Deacon
2015-03-26 19:48 ` Hanjun Guo
2015-03-26 21:12 ` Will Deacon
2015-03-26 23:01 ` Hanjun Guo
2015-03-24 14:02 ` [patch v11 13/23] ACPI / processor: Introduce phys_cpuid_t for CPU hardware ID Hanjun Guo
2015-03-25 17:21 ` Catalin Marinas
2015-03-26 3:49 ` Hanjun Guo
2015-03-26 15:13 ` Will Deacon
2015-03-27 13:40 ` Hanjun Guo
2015-03-30 13:58 ` Catalin Marinas
2015-03-31 1:49 ` Hanjun Guo
2015-03-24 14:02 ` Hanjun Guo [this message]
2015-03-25 17:25 ` [patch v11 14/23] ACPI / processor: Make it possible to get CPU hardware ID via GICC Catalin Marinas
2015-03-24 14:02 ` [patch v11 15/23] ARM64 / ACPI: Introduce ACPI_IRQ_MODEL_GIC and register device's gsi Hanjun Guo
2015-03-24 14:02 ` [patch v11 16/23] irqchip: Add GICv2 specific ACPI boot support Hanjun Guo
2015-03-25 17:27 ` Catalin Marinas
2015-03-24 14:02 ` [patch v11 17/23] clocksource / arch_timer: Parse GTDT to initialize arch timer Hanjun Guo
2015-03-25 17:28 ` Catalin Marinas
2015-03-24 14:02 ` [patch v11 18/23] ARM64 / ACPI: Select ACPI_REDUCED_HARDWARE_ONLY if ACPI is enabled on ARM64 Hanjun Guo
2015-03-25 17:29 ` Catalin Marinas
2015-03-24 14:02 ` [patch v11 19/23] XEN / ACPI: Make XEN ACPI depend on X86 Hanjun Guo
2015-03-24 15:30 ` Boris Ostrovsky
2015-03-24 17:24 ` Stefano Stabellini
2015-03-25 11:51 ` Will Deacon
2015-03-25 15:38 ` Stefano Stabellini
2015-03-24 14:02 ` [patch v11 20/23] ARM64 / ACPI: Enable ARM64 in Kconfig Hanjun Guo
2015-03-25 17:29 ` Catalin Marinas
2015-03-24 14:02 ` [patch v11 21/23] Documentation: ACPI for ARM64 Hanjun Guo
2015-03-25 17:30 ` Catalin Marinas
2015-03-24 14:02 ` [patch v11 22/23] ARM64 / ACPI: additions of ACPI documentation for arm64 Hanjun Guo
2015-03-24 14:02 ` [patch v11 23/23] ARM64 / ACPI: Don't unflatten device tree if acpi=force is passed Hanjun Guo
2015-03-25 17:31 ` Catalin Marinas
2015-03-24 23:04 ` [patch v11 00/23] Introduce ACPI for ARM64 based on ACPI 5.1 Rafael J. Wysocki
2015-03-25 12:55 ` Hanjun Guo
2015-03-25 3:53 ` Ming Lei
2015-03-30 16:49 ` Timur Tabi
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=1427205776-5060-15-git-send-email-hanjun.guo@linaro.org \
--to=hanjun.guo@linaro.org \
--cc=linux-arm-kernel@lists.infradead.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 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).