* [PATCH v2 0/3] Clean up ACPI core to prepare for running ACPI on ARM64 @ 2014-07-09 9:39 Hanjun Guo 2014-07-09 9:39 ` [PATCH v2 1/3] ACPI: ARM64 does not have a BIOS add config for BIOS table scan Hanjun Guo ` (3 more replies) 0 siblings, 4 replies; 13+ messages in thread From: Hanjun Guo @ 2014-07-09 9:39 UTC (permalink / raw) To: linux-arm-kernel This patch set have no function change for x86 and ia64 and just do some clean up to prepare for running ACPI on ARM64. This patch set is splited out from the patch set [1] "[PATCH v4 00/13] Enable ACPI on ARM64 in Kconfig" and hope it can be merged first before ARM64 ACPI core patches. [1]: https://lkml.org/lkml/2014/6/26/627 update from v1: 1. Drop "Make EC debugfs depend on X86 || IA64 in Kconfig"; 2. Rename ACPI_SCAN_BIOS_NOT_EFI to ACPI_LEGACY_TABLES_LOOKUP suggested by Rafael; 3. Rename ARCH_HAS_ACPI_PDC to ARCH_MIGHT_HAVE_ACPI_PDC suggested by Rafael; 4. Remove the help for ARCH_MIGHT_HAVE_ACPI_PDC because it can't be selected; 5. Rename acpi_arch_is_smp() to acpi_has_cpu_in_madt() to be more explicit and easy understanding. Graeme Gregory (2): ACPI: ARM64 does not have a BIOS add config for BIOS table scan. ACPI: Don't use acpi_lapic in ACPI core code Hanjun Guo (1): ACPI / processor: Introduce ARCH_HAS_ACPI_PDC arch/ia64/Kconfig | 2 + arch/ia64/include/asm/acpi.h | 5 + arch/x86/Kconfig | 2 + arch/x86/include/asm/acpi.h | 5 + drivers/acpi/Kconfig | 6 ++ drivers/acpi/Makefile | 1 + drivers/acpi/acpi_processor.c | 2 +- drivers/acpi/internal.h | 5 + drivers/acpi/osl.c | 4 +- drivers/acpi/processor_core.c | 198 --------------------------------------- drivers/acpi/processor_pdc.c | 206 +++++++++++++++++++++++++++++++++++++++++ 11 files changed, 236 insertions(+), 200 deletions(-) create mode 100644 drivers/acpi/processor_pdc.c -- 1.7.9.5 ^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH v2 1/3] ACPI: ARM64 does not have a BIOS add config for BIOS table scan. 2014-07-09 9:39 [PATCH v2 0/3] Clean up ACPI core to prepare for running ACPI on ARM64 Hanjun Guo @ 2014-07-09 9:39 ` Hanjun Guo 2014-07-16 23:37 ` H. Peter Anvin 2014-07-09 9:39 ` [PATCH v2 2/3] ACPI: Don't use acpi_lapic in ACPI core code Hanjun Guo ` (2 subsequent siblings) 3 siblings, 1 reply; 13+ messages in thread From: Hanjun Guo @ 2014-07-09 9:39 UTC (permalink / raw) To: linux-arm-kernel From: Graeme Gregory <graeme.gregory@linaro.org> With the addition of ARM64 that does not have a traditional BIOS to scan, add a config option which is selected on x86 and ia64 to do the traditional BIOS scanning for tables. Signed-off-by: Graeme Gregory <graeme.gregory@linaro.org> Signed-off-by: Hanjun Guo <hanjun.guo@linaro.org> --- arch/ia64/Kconfig | 1 + arch/x86/Kconfig | 1 + drivers/acpi/Kconfig | 3 +++ drivers/acpi/osl.c | 4 +++- 4 files changed, 8 insertions(+), 1 deletion(-) diff --git a/arch/ia64/Kconfig b/arch/ia64/Kconfig index 2f3abcf..c54bd7e 100644 --- a/arch/ia64/Kconfig +++ b/arch/ia64/Kconfig @@ -47,6 +47,7 @@ config IA64 select MODULES_USE_ELF_RELA select ARCH_USE_CMPXCHG_LOCKREF select HAVE_ARCH_AUDITSYSCALL + select ACPI_LEGACY_TABLES_LOOKUP if ACPI default y help The Itanium Processor Family is Intel's 64-bit successor to diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index a8f749e..6d9f1d8 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig @@ -131,6 +131,7 @@ config X86 select HAVE_CC_STACKPROTECTOR select GENERIC_CPU_AUTOPROBE select HAVE_ARCH_AUDITSYSCALL + select ACPI_LEGACY_TABLES_LOOKUP if ACPI config INSTRUCTION_DECODER def_bool y diff --git a/drivers/acpi/Kconfig b/drivers/acpi/Kconfig index a34a228..970524c 100644 --- a/drivers/acpi/Kconfig +++ b/drivers/acpi/Kconfig @@ -42,6 +42,9 @@ menuconfig ACPI if ACPI +config ACPI_LEGACY_TABLES_LOOKUP + bool + config ACPI_SLEEP bool depends on SUSPEND || HIBERNATION diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c index bad25b0..3abe9b2 100644 --- a/drivers/acpi/osl.c +++ b/drivers/acpi/osl.c @@ -259,12 +259,14 @@ acpi_physical_address __init acpi_os_get_root_pointer(void) "System description tables not found\n"); return 0; } - } else { + } else if (IS_ENABLED(CONFIG_ACPI_LEGACY_TABLES_LOOKUP)) { acpi_physical_address pa = 0; acpi_find_root_pointer(&pa); return pa; } + + return 0; } /* Must be called with 'acpi_ioremap_lock' or RCU read lock held. */ -- 1.7.9.5 ^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v2 1/3] ACPI: ARM64 does not have a BIOS add config for BIOS table scan. 2014-07-09 9:39 ` [PATCH v2 1/3] ACPI: ARM64 does not have a BIOS add config for BIOS table scan Hanjun Guo @ 2014-07-16 23:37 ` H. Peter Anvin 2014-07-16 23:46 ` Luck, Tony 0 siblings, 1 reply; 13+ messages in thread From: H. Peter Anvin @ 2014-07-16 23:37 UTC (permalink / raw) To: linux-arm-kernel On 07/09/2014 02:39 AM, Hanjun Guo wrote: > From: Graeme Gregory <graeme.gregory@linaro.org> > > With the addition of ARM64 that does not have a traditional BIOS to > scan, add a config option which is selected on x86 and ia64 to do > the traditional BIOS scanning for tables. > > Signed-off-by: Graeme Gregory <graeme.gregory@linaro.org> > Signed-off-by: Hanjun Guo <hanjun.guo@linaro.org> > --- > arch/ia64/Kconfig | 1 + > arch/x86/Kconfig | 1 + > drivers/acpi/Kconfig | 3 +++ > drivers/acpi/osl.c | 4 +++- > 4 files changed, 8 insertions(+), 1 deletion(-) > > diff --git a/arch/ia64/Kconfig b/arch/ia64/Kconfig > index 2f3abcf..c54bd7e 100644 > --- a/arch/ia64/Kconfig > +++ b/arch/ia64/Kconfig > @@ -47,6 +47,7 @@ config IA64 > select MODULES_USE_ELF_RELA > select ARCH_USE_CMPXCHG_LOCKREF > select HAVE_ARCH_AUDITSYSCALL > + select ACPI_LEGACY_TABLES_LOOKUP if ACPI > default y > help > The Itanium Processor Family is Intel's 64-bit successor to This shouldn't actually be set on IA64, should it? IA64 doesn't have BIOS, either, it has EFI/UEFI, like ARM64... -hpa ^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH v2 1/3] ACPI: ARM64 does not have a BIOS add config for BIOS table scan. 2014-07-16 23:37 ` H. Peter Anvin @ 2014-07-16 23:46 ` Luck, Tony 2014-07-16 23:49 ` H. Peter Anvin 0 siblings, 1 reply; 13+ messages in thread From: Luck, Tony @ 2014-07-16 23:46 UTC (permalink / raw) To: linux-arm-kernel > + select ACPI_LEGACY_TABLES_LOOKUP if ACPI > This shouldn't actually be set on IA64, should it? IA64 doesn't have > BIOS, either, it has EFI/UEFI, like ARM64... Which ACPI tables are in the "LEGACY" category affected by this option? -Tony ^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH v2 1/3] ACPI: ARM64 does not have a BIOS add config for BIOS table scan. 2014-07-16 23:46 ` Luck, Tony @ 2014-07-16 23:49 ` H. Peter Anvin 2014-07-17 3:18 ` Hanjun Guo 0 siblings, 1 reply; 13+ messages in thread From: H. Peter Anvin @ 2014-07-16 23:49 UTC (permalink / raw) To: linux-arm-kernel On 07/16/2014 04:46 PM, Luck, Tony wrote: >> + select ACPI_LEGACY_TABLES_LOOKUP if ACPI > >> This shouldn't actually be set on IA64, should it? IA64 doesn't have >> BIOS, either, it has EFI/UEFI, like ARM64... > > Which ACPI tables are in the "LEGACY" category affected by this option? > That's not what this is about... it is about how you find the root pointer. On a BIOS system it is found by scanning low memory. On an EFI system it is found by querying EFI for a specific UUID. -hpa ^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH v2 1/3] ACPI: ARM64 does not have a BIOS add config for BIOS table scan. 2014-07-16 23:49 ` H. Peter Anvin @ 2014-07-17 3:18 ` Hanjun Guo 2014-07-17 16:58 ` Luck, Tony 0 siblings, 1 reply; 13+ messages in thread From: Hanjun Guo @ 2014-07-17 3:18 UTC (permalink / raw) To: linux-arm-kernel On 2014-7-17 7:49, H. Peter Anvin wrote: > On 07/16/2014 04:46 PM, Luck, Tony wrote: >>> + select ACPI_LEGACY_TABLES_LOOKUP if ACPI >> >>> This shouldn't actually be set on IA64, should it? IA64 doesn't have >>> BIOS, either, it has EFI/UEFI, like ARM64... Yes, I agree with you, thanks for pointing this out. if I remember correctly, the EFI standard was introduced when IA64 came out. >> >> Which ACPI tables are in the "LEGACY" category affected by this option? >> > > That's not what this is about... it is about how you find the root pointer. > > On a BIOS system it is found by scanning low memory. On an EFI system > it is found by querying EFI for a specific UUID. Thanks for the explanation. Tony, if it is ok with you, I will modify the patch and will not select ACPI_LEGACY_TABLES_LOOKUP on IA64, I'm waiting for your final confirmation. Thanks Hanjun ^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH v2 1/3] ACPI: ARM64 does not have a BIOS add config for BIOS table scan. 2014-07-17 3:18 ` Hanjun Guo @ 2014-07-17 16:58 ` Luck, Tony 2014-07-18 9:22 ` Hanjun Guo 0 siblings, 1 reply; 13+ messages in thread From: Luck, Tony @ 2014-07-17 16:58 UTC (permalink / raw) To: linux-arm-kernel > Tony, if it is ok with you, I will modify the patch and will not select > ACPI_LEGACY_TABLES_LOOKUP on IA64, I'm waiting for your final confirmation. Confirmed. Thanks Peter for catching this. -Tony ^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH v2 1/3] ACPI: ARM64 does not have a BIOS add config for BIOS table scan. 2014-07-17 16:58 ` Luck, Tony @ 2014-07-18 9:22 ` Hanjun Guo 0 siblings, 0 replies; 13+ messages in thread From: Hanjun Guo @ 2014-07-18 9:22 UTC (permalink / raw) To: linux-arm-kernel On 2014-7-18 0:58, Luck, Tony wrote: >> Tony, if it is ok with you, I will modify the patch and will not select >> ACPI_LEGACY_TABLES_LOOKUP on IA64, I'm waiting for your final confirmation. > > Confirmed. Thanks Peter for catching this. Great, I will update the patch and send out soon. Thanks Hanjun ^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH v2 2/3] ACPI: Don't use acpi_lapic in ACPI core code 2014-07-09 9:39 [PATCH v2 0/3] Clean up ACPI core to prepare for running ACPI on ARM64 Hanjun Guo 2014-07-09 9:39 ` [PATCH v2 1/3] ACPI: ARM64 does not have a BIOS add config for BIOS table scan Hanjun Guo @ 2014-07-09 9:39 ` Hanjun Guo 2014-07-09 9:39 ` [PATCH v2 3/3] ACPI / processor: Introduce ARCH_HAS_ACPI_PDC Hanjun Guo 2014-07-16 23:32 ` [PATCH v2 0/3] Clean up ACPI core to prepare for running ACPI on ARM64 Rafael J. Wysocki 3 siblings, 0 replies; 13+ messages in thread From: Hanjun Guo @ 2014-07-09 9:39 UTC (permalink / raw) To: linux-arm-kernel From: Graeme Gregory <graeme.gregory@linaro.org> Now ARM64 support is being added to ACPI so architecture specific values can not be used in core ACPI code. Following on the patch "ACPI / processor: Check if LAPIC is present during initialization" which uses acpi_lapic in acpi_processor.c, on ARM64 platform, GIC is used instead of local APIC, so acpi_lapic is not a suitable value for ARM64. What is actually important at this point is if there is/are CPU entry/entries (Local APIC/SAPIC, GICC) in MADT, so introduce acpi_has_cpu_in_madt() to be arch specific and generic. Signed-off-by: Graeme Gregory <graeme.gregory@linaro.org> Signed-off-by: Hanjun Guo <hanjun.guo@linaro.org> --- arch/ia64/include/asm/acpi.h | 5 +++++ arch/x86/include/asm/acpi.h | 5 +++++ drivers/acpi/acpi_processor.c | 2 +- 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/arch/ia64/include/asm/acpi.h b/arch/ia64/include/asm/acpi.h index 75dc59a..a1d91ab 100644 --- a/arch/ia64/include/asm/acpi.h +++ b/arch/ia64/include/asm/acpi.h @@ -40,6 +40,11 @@ extern int acpi_lapic; #define acpi_noirq 0 /* ACPI always enabled on IA64 */ #define acpi_pci_disabled 0 /* ACPI PCI always enabled on IA64 */ #define acpi_strict 1 /* no ACPI spec workarounds on IA64 */ + +static inline bool acpi_has_cpu_in_madt(void) +{ + return !!acpi_lapic; +} #endif #define acpi_processor_cstate_check(x) (x) /* no idle limits on IA64 :) */ static inline void disable_acpi(void) { } diff --git a/arch/x86/include/asm/acpi.h b/arch/x86/include/asm/acpi.h index e06225e..0ab4f9f 100644 --- a/arch/x86/include/asm/acpi.h +++ b/arch/x86/include/asm/acpi.h @@ -121,6 +121,11 @@ static inline void arch_acpi_set_pdc_bits(u32 *buf) buf[2] &= ~(ACPI_PDC_C_C2C3_FFH); } +static inline bool acpi_has_cpu_in_madt(void) +{ + return !!acpi_lapic; +} + #else /* !CONFIG_ACPI */ #define acpi_lapic 0 diff --git a/drivers/acpi/acpi_processor.c b/drivers/acpi/acpi_processor.c index 1c08574..1fdf5e0 100644 --- a/drivers/acpi/acpi_processor.c +++ b/drivers/acpi/acpi_processor.c @@ -268,7 +268,7 @@ static int acpi_processor_get_info(struct acpi_device *device) pr->apic_id = apic_id; cpu_index = acpi_map_cpuid(pr->apic_id, pr->acpi_id); - if (!cpu0_initialized && !acpi_lapic) { + if (!cpu0_initialized && !acpi_has_cpu_in_madt()) { cpu0_initialized = 1; /* Handle UP system running SMP kernel, with no LAPIC in MADT */ if ((cpu_index == -1) && (num_online_cpus() == 1)) -- 1.7.9.5 ^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v2 3/3] ACPI / processor: Introduce ARCH_HAS_ACPI_PDC 2014-07-09 9:39 [PATCH v2 0/3] Clean up ACPI core to prepare for running ACPI on ARM64 Hanjun Guo 2014-07-09 9:39 ` [PATCH v2 1/3] ACPI: ARM64 does not have a BIOS add config for BIOS table scan Hanjun Guo 2014-07-09 9:39 ` [PATCH v2 2/3] ACPI: Don't use acpi_lapic in ACPI core code Hanjun Guo @ 2014-07-09 9:39 ` Hanjun Guo 2014-07-16 23:32 ` [PATCH v2 0/3] Clean up ACPI core to prepare for running ACPI on ARM64 Rafael J. Wysocki 3 siblings, 0 replies; 13+ messages in thread From: Hanjun Guo @ 2014-07-09 9:39 UTC (permalink / raw) To: linux-arm-kernel The use of _PDC is deprecated in ACPI 3.0 in favor of _OSC, as ARM platform is supported only in ACPI 5.0 or higher version, _PDC will not be used in ARM platform, so make Make _PDC only for platforms with Intel CPUs. Introduce ARCH_MIGHT_HAVE_ACPI_PDC and move _PDC related code in ACPI processor driver into a single file processor_pdc.c, make x86 and ia64 select it when ACPI is enabled. This patch also use pr_* to replace printk to fix the checkpatch warning and factor acpi_processor_alloc_pdc() a little bit to avoid duplicate pr_err() code. Suggested-by: Robert Richter <rric@kernel.org> Signed-off-by: Hanjun Guo <hanjun.guo@linaro.org> --- arch/ia64/Kconfig | 1 + arch/x86/Kconfig | 1 + drivers/acpi/Kconfig | 3 + drivers/acpi/Makefile | 1 + drivers/acpi/internal.h | 5 + drivers/acpi/processor_core.c | 198 --------------------------------------- drivers/acpi/processor_pdc.c | 206 +++++++++++++++++++++++++++++++++++++++++ 7 files changed, 217 insertions(+), 198 deletions(-) create mode 100644 drivers/acpi/processor_pdc.c diff --git a/arch/ia64/Kconfig b/arch/ia64/Kconfig index c54bd7e..2ca45d6 100644 --- a/arch/ia64/Kconfig +++ b/arch/ia64/Kconfig @@ -10,6 +10,7 @@ config IA64 select ARCH_MIGHT_HAVE_PC_SERIO select PCI if (!IA64_HP_SIM) select ACPI if (!IA64_HP_SIM) + select ARCH_MIGHT_HAVE_ACPI_PDC if ACPI select PM if (!IA64_HP_SIM) select HAVE_UNSTABLE_SCHED_CLOCK select HAVE_IDE diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 6d9f1d8..6fd5d66 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig @@ -21,6 +21,7 @@ config X86_64 ### Arch settings config X86 def_bool y + select ARCH_MIGHT_HAVE_ACPI_PDC if ACPI select ARCH_HAS_DEBUG_STRICT_USER_COPY_CHECKS select ARCH_MIGHT_HAVE_PC_PARPORT select ARCH_MIGHT_HAVE_PC_SERIO diff --git a/drivers/acpi/Kconfig b/drivers/acpi/Kconfig index 970524c..3f5f745 100644 --- a/drivers/acpi/Kconfig +++ b/drivers/acpi/Kconfig @@ -45,6 +45,9 @@ if ACPI config ACPI_LEGACY_TABLES_LOOKUP bool +config ARCH_MIGHT_HAVE_ACPI_PDC + bool + config ACPI_SLEEP bool depends on SUSPEND || HIBERNATION diff --git a/drivers/acpi/Makefile b/drivers/acpi/Makefile index ea55e01..505d4d7 100644 --- a/drivers/acpi/Makefile +++ b/drivers/acpi/Makefile @@ -36,6 +36,7 @@ acpi-y += scan.o acpi-y += resource.o acpi-y += acpi_processor.o acpi-y += processor_core.o +acpi-$(CONFIG_ARCH_MIGHT_HAVE_ACPI_PDC) += processor_pdc.o acpi-y += ec.o acpi-$(CONFIG_ACPI_DOCK) += dock.o acpi-y += pci_root.o pci_link.o pci_irq.o diff --git a/drivers/acpi/internal.h b/drivers/acpi/internal.h index 151f3e7..4c5cf77 100644 --- a/drivers/acpi/internal.h +++ b/drivers/acpi/internal.h @@ -106,7 +106,12 @@ int acpi_power_transition(struct acpi_device *device, int state); int acpi_device_update_power(struct acpi_device *device, int *state_p); int acpi_wakeup_device_init(void); + +#ifdef CONFIG_ARCH_MIGHT_HAVE_ACPI_PDC void acpi_early_processor_set_pdc(void); +#else +static inline void acpi_early_processor_set_pdc(void) {} +#endif /* -------------------------------------------------------------------------- Embedded Controller diff --git a/drivers/acpi/processor_core.c b/drivers/acpi/processor_core.c index 71e2065..00f48d1 100644 --- a/drivers/acpi/processor_core.c +++ b/drivers/acpi/processor_core.c @@ -4,17 +4,11 @@ * * Alex Chiang <achiang@hp.com> * - Unified x86/ia64 implementations - * Venkatesh Pallipadi <venkatesh.pallipadi@intel.com> - * - Added _PDC for platforms with Intel CPUs */ #include <linux/export.h> -#include <linux/dmi.h> -#include <linux/slab.h> #include <linux/acpi.h> #include <acpi/processor.h> -#include "internal.h" - #define _COMPONENT ACPI_PROCESSOR_COMPONENT ACPI_MODULE_NAME("processor_core"); @@ -208,195 +202,3 @@ int acpi_get_cpuid(acpi_handle handle, int type, u32 acpi_id) return acpi_map_cpuid(apic_id, acpi_id); } EXPORT_SYMBOL_GPL(acpi_get_cpuid); - -static bool __init 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) -{ - buf[0] = ACPI_PDC_REVISION_ID; - buf[1] = 1; - - /* Enable coordination with firmware's _TSD info */ - buf[2] = ACPI_PDC_SMP_T_SWCOORD; - - /* Twiddle arch-specific bits needed for _PDC */ - arch_acpi_set_pdc_bits(buf); -} - -static struct acpi_object_list *acpi_processor_alloc_pdc(void) -{ - struct acpi_object_list *obj_list; - union acpi_object *obj; - u32 *buf; - - /* allocate and initialize pdc. It will be used later. */ - obj_list = kmalloc(sizeof(struct acpi_object_list), GFP_KERNEL); - if (!obj_list) { - printk(KERN_ERR "Memory allocation error\n"); - return NULL; - } - - obj = kmalloc(sizeof(union acpi_object), GFP_KERNEL); - if (!obj) { - printk(KERN_ERR "Memory allocation error\n"); - kfree(obj_list); - return NULL; - } - - buf = kmalloc(12, GFP_KERNEL); - if (!buf) { - printk(KERN_ERR "Memory allocation error\n"); - kfree(obj); - kfree(obj_list); - return NULL; - } - - acpi_set_pdc_bits(buf); - - obj->type = ACPI_TYPE_BUFFER; - obj->buffer.length = 12; - obj->buffer.pointer = (u8 *) buf; - obj_list->count = 1; - obj_list->pointer = obj; - - return obj_list; -} - -/* - * _PDC is required for a BIOS-OS handshake for most of the newer - * ACPI processor features. - */ -static acpi_status -acpi_processor_eval_pdc(acpi_handle handle, struct acpi_object_list *pdc_in) -{ - acpi_status status = AE_OK; - - if (boot_option_idle_override == IDLE_NOMWAIT) { - /* - * If mwait is disabled for CPU C-states, the C2C3_FFH access - * mode will be disabled in the parameter of _PDC object. - * Of course C1_FFH access mode will also be disabled. - */ - union acpi_object *obj; - u32 *buffer = NULL; - - obj = pdc_in->pointer; - buffer = (u32 *)(obj->buffer.pointer); - buffer[2] &= ~(ACPI_PDC_C_C2C3_FFH | ACPI_PDC_C_C1_FFH); - - } - status = acpi_evaluate_object(handle, "_PDC", pdc_in, NULL); - - if (ACPI_FAILURE(status)) - ACPI_DEBUG_PRINT((ACPI_DB_INFO, - "Could not evaluate _PDC, using legacy perf. control.\n")); - - return status; -} - -void acpi_processor_set_pdc(acpi_handle handle) -{ - struct acpi_object_list *obj_list; - - if (arch_has_acpi_pdc() == false) - return; - - obj_list = acpi_processor_alloc_pdc(); - if (!obj_list) - return; - - acpi_processor_eval_pdc(handle, obj_list); - - kfree(obj_list->pointer->buffer.pointer); - kfree(obj_list->pointer); - kfree(obj_list); -} - -static acpi_status __init -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; -} - -#if defined(CONFIG_X86) || defined(CONFIG_IA64) -static int __init set_no_mwait(const struct dmi_system_id *id) -{ - pr_notice(PREFIX "%s detected - disabling mwait for CPU C-states\n", - id->ident); - boot_option_idle_override = IDLE_NOMWAIT; - return 0; -} - -static struct dmi_system_id processor_idle_dmi_table[] __initdata = { - { - set_no_mwait, "Extensa 5220", { - DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies LTD"), - DMI_MATCH(DMI_SYS_VENDOR, "Acer"), - DMI_MATCH(DMI_PRODUCT_VERSION, "0100"), - DMI_MATCH(DMI_BOARD_NAME, "Columbia") }, NULL}, - {}, -}; - -static void __init processor_dmi_check(void) -{ - /* - * Check whether the system is DMI table. If yes, OSPM - * should not use mwait for CPU-states. - */ - dmi_check_system(processor_idle_dmi_table); -} -#else -static inline void processor_dmi_check(void) {} -#endif - -void __init acpi_early_processor_set_pdc(void) -{ - processor_dmi_check(); - - acpi_walk_namespace(ACPI_TYPE_PROCESSOR, ACPI_ROOT_OBJECT, - ACPI_UINT32_MAX, - early_init_pdc, NULL, NULL, NULL); - acpi_get_devices(ACPI_PROCESSOR_DEVICE_HID, early_init_pdc, NULL, NULL); -} diff --git a/drivers/acpi/processor_pdc.c b/drivers/acpi/processor_pdc.c new file mode 100644 index 0000000..e5dd808 --- /dev/null +++ b/drivers/acpi/processor_pdc.c @@ -0,0 +1,206 @@ +/* + * Copyright (C) 2005 Intel Corporation + * Copyright (C) 2009 Hewlett-Packard Development Company, L.P. + * + * Venkatesh Pallipadi <venkatesh.pallipadi@intel.com> + * - Added _PDC for platforms with Intel CPUs + */ + +#define pr_fmt(fmt) "ACPI: " fmt + +#include <linux/dmi.h> +#include <linux/slab.h> +#include <linux/acpi.h> +#include <acpi/processor.h> + +#include "internal.h" + +#define _COMPONENT ACPI_PROCESSOR_COMPONENT +ACPI_MODULE_NAME("processor_pdc"); + +static bool __init 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) +{ + buf[0] = ACPI_PDC_REVISION_ID; + buf[1] = 1; + + /* Enable coordination with firmware's _TSD info */ + buf[2] = ACPI_PDC_SMP_T_SWCOORD; + + /* Twiddle arch-specific bits needed for _PDC */ + arch_acpi_set_pdc_bits(buf); +} + +static struct acpi_object_list *acpi_processor_alloc_pdc(void) +{ + struct acpi_object_list *obj_list; + union acpi_object *obj; + u32 *buf; + + /* allocate and initialize pdc. It will be used later. */ + obj_list = kmalloc(sizeof(struct acpi_object_list), GFP_KERNEL); + if (!obj_list) + goto out; + + obj = kmalloc(sizeof(union acpi_object), GFP_KERNEL); + if (!obj) { + kfree(obj_list); + goto out; + } + + buf = kmalloc(12, GFP_KERNEL); + if (!buf) { + kfree(obj); + kfree(obj_list); + goto out; + } + + acpi_set_pdc_bits(buf); + + obj->type = ACPI_TYPE_BUFFER; + obj->buffer.length = 12; + obj->buffer.pointer = (u8 *) buf; + obj_list->count = 1; + obj_list->pointer = obj; + + return obj_list; +out: + pr_err("Memory allocation error\n"); + return NULL; +} + +/* + * _PDC is required for a BIOS-OS handshake for most of the newer + * ACPI processor features. + */ +static acpi_status +acpi_processor_eval_pdc(acpi_handle handle, struct acpi_object_list *pdc_in) +{ + acpi_status status = AE_OK; + + if (boot_option_idle_override == IDLE_NOMWAIT) { + /* + * If mwait is disabled for CPU C-states, the C2C3_FFH access + * mode will be disabled in the parameter of _PDC object. + * Of course C1_FFH access mode will also be disabled. + */ + union acpi_object *obj; + u32 *buffer = NULL; + + obj = pdc_in->pointer; + buffer = (u32 *)(obj->buffer.pointer); + buffer[2] &= ~(ACPI_PDC_C_C2C3_FFH | ACPI_PDC_C_C1_FFH); + + } + status = acpi_evaluate_object(handle, "_PDC", pdc_in, NULL); + + if (ACPI_FAILURE(status)) + ACPI_DEBUG_PRINT((ACPI_DB_INFO, + "Could not evaluate _PDC, using legacy perf. control.\n")); + + return status; +} + +void acpi_processor_set_pdc(acpi_handle handle) +{ + struct acpi_object_list *obj_list; + + if (arch_has_acpi_pdc() == false) + return; + + obj_list = acpi_processor_alloc_pdc(); + if (!obj_list) + return; + + acpi_processor_eval_pdc(handle, obj_list); + + kfree(obj_list->pointer->buffer.pointer); + kfree(obj_list->pointer); + kfree(obj_list); +} + +static acpi_status __init +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; +} + +static int __init set_no_mwait(const struct dmi_system_id *id) +{ + pr_notice("%s detected - disabling mwait for CPU C-states\n", + id->ident); + boot_option_idle_override = IDLE_NOMWAIT; + return 0; +} + +static struct dmi_system_id processor_idle_dmi_table[] __initdata = { + { + set_no_mwait, "Extensa 5220", { + DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies LTD"), + DMI_MATCH(DMI_SYS_VENDOR, "Acer"), + DMI_MATCH(DMI_PRODUCT_VERSION, "0100"), + DMI_MATCH(DMI_BOARD_NAME, "Columbia") }, NULL}, + {}, +}; + +static void __init processor_dmi_check(void) +{ + /* + * Check whether the system is DMI table. If yes, OSPM + * should not use mwait for CPU-states. + */ + dmi_check_system(processor_idle_dmi_table); +} + +void __init acpi_early_processor_set_pdc(void) +{ + processor_dmi_check(); + + acpi_walk_namespace(ACPI_TYPE_PROCESSOR, ACPI_ROOT_OBJECT, + ACPI_UINT32_MAX, + early_init_pdc, NULL, NULL, NULL); + acpi_get_devices(ACPI_PROCESSOR_DEVICE_HID, early_init_pdc, NULL, NULL); +} -- 1.7.9.5 ^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v2 0/3] Clean up ACPI core to prepare for running ACPI on ARM64 2014-07-09 9:39 [PATCH v2 0/3] Clean up ACPI core to prepare for running ACPI on ARM64 Hanjun Guo ` (2 preceding siblings ...) 2014-07-09 9:39 ` [PATCH v2 3/3] ACPI / processor: Introduce ARCH_HAS_ACPI_PDC Hanjun Guo @ 2014-07-16 23:32 ` Rafael J. Wysocki 2014-07-16 23:28 ` Luck, Tony 3 siblings, 1 reply; 13+ messages in thread From: Rafael J. Wysocki @ 2014-07-16 23:32 UTC (permalink / raw) To: linux-arm-kernel On Wednesday, July 09, 2014 05:39:03 PM Hanjun Guo wrote: > This patch set have no function change for x86 and ia64 and > just do some clean up to prepare for running ACPI on ARM64. > > This patch set is splited out from the patch set [1] > "[PATCH v4 00/13] Enable ACPI on ARM64 in Kconfig" and hope it > can be merged first before ARM64 ACPI core patches. > > [1]: https://lkml.org/lkml/2014/6/26/627 > > update from v1: > 1. Drop "Make EC debugfs depend on X86 || IA64 in Kconfig"; > 2. Rename ACPI_SCAN_BIOS_NOT_EFI to ACPI_LEGACY_TABLES_LOOKUP > suggested by Rafael; > 3. Rename ARCH_HAS_ACPI_PDC to ARCH_MIGHT_HAVE_ACPI_PDC suggested by Rafael; > 4. Remove the help for ARCH_MIGHT_HAVE_ACPI_PDC because it can't be selected; > 5. Rename acpi_arch_is_smp() to acpi_has_cpu_in_madt() to be more > explicit and easy understanding. > > Graeme Gregory (2): > ACPI: ARM64 does not have a BIOS add config for BIOS table scan. > ACPI: Don't use acpi_lapic in ACPI core code > > Hanjun Guo (1): > ACPI / processor: Introduce ARCH_HAS_ACPI_PDC Are there any objections against this series from the x86 and ia64 maintainers? If not, I'll take it for 3.17. Rafael ^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH v2 0/3] Clean up ACPI core to prepare for running ACPI on ARM64 2014-07-16 23:32 ` [PATCH v2 0/3] Clean up ACPI core to prepare for running ACPI on ARM64 Rafael J. Wysocki @ 2014-07-16 23:28 ` Luck, Tony 2014-07-16 23:39 ` H. Peter Anvin 0 siblings, 1 reply; 13+ messages in thread From: Luck, Tony @ 2014-07-16 23:28 UTC (permalink / raw) To: linux-arm-kernel > Are there any objections against this series from the x86 and ia64 maintainers? I'll believe the claim of no functional changes for ia64 ... so no objections from me. -Tony ^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH v2 0/3] Clean up ACPI core to prepare for running ACPI on ARM64 2014-07-16 23:28 ` Luck, Tony @ 2014-07-16 23:39 ` H. Peter Anvin 0 siblings, 0 replies; 13+ messages in thread From: H. Peter Anvin @ 2014-07-16 23:39 UTC (permalink / raw) To: linux-arm-kernel On 07/16/2014 04:28 PM, Luck, Tony wrote: >> Are there any objections against this series from the x86 and ia64 maintainers? > > I'll believe the claim of no functional changes for ia64 ... so no objections from me. > > -Tony > No objection here, modulo the issue I just flagged (which is IA64-related, not x86, so Tony is the one who actually needs to decide it.) -hpa ^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2014-07-18 9:22 UTC | newest] Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2014-07-09 9:39 [PATCH v2 0/3] Clean up ACPI core to prepare for running ACPI on ARM64 Hanjun Guo 2014-07-09 9:39 ` [PATCH v2 1/3] ACPI: ARM64 does not have a BIOS add config for BIOS table scan Hanjun Guo 2014-07-16 23:37 ` H. Peter Anvin 2014-07-16 23:46 ` Luck, Tony 2014-07-16 23:49 ` H. Peter Anvin 2014-07-17 3:18 ` Hanjun Guo 2014-07-17 16:58 ` Luck, Tony 2014-07-18 9:22 ` Hanjun Guo 2014-07-09 9:39 ` [PATCH v2 2/3] ACPI: Don't use acpi_lapic in ACPI core code Hanjun Guo 2014-07-09 9:39 ` [PATCH v2 3/3] ACPI / processor: Introduce ARCH_HAS_ACPI_PDC Hanjun Guo 2014-07-16 23:32 ` [PATCH v2 0/3] Clean up ACPI core to prepare for running ACPI on ARM64 Rafael J. Wysocki 2014-07-16 23:28 ` Luck, Tony 2014-07-16 23:39 ` H. Peter Anvin
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).