ACPI and power management fixes and cleanups for 3.14-rc1
- ACPI device hotplug fix preventing ACPI drivers from binding to device objects that acpi_bus_trim() has been called for and the devices represented by them may not be operational. - Recent cpufreq changes related to the "boost" (turbo) feature broke the acpi-cpufreq error code path causing a NULL pointer dereference to occur on some systems. Fix from Konrad Rzeszutek Wilk. - The log level of a CPU initialization error message added recently needs to be reduced, because the particular BIOS issue indicated by it turns out to be widespread and doesn't really matter for the majority of systems having it. From Jiang Liu. - The regulator API needs to be told to stay away from things on systems with ACPI BIOSes or it may conflict with the BIOS' own handling of voltage regulators. Fix from Mark Brown that works around a 3.13 regression in lm90 on PCs occuring if the regulator API is enabled. - Prevent the Exynos4 devfreq driver from being built on multiplatform, because it depends on things that aren't available during such builds. From Sachin Kamat. - Upstream ACPICA doesn't use the bool type as defined in the kernel, so modify the kernel's ACPICA code to follow the upstream in that respect (only one variable definition is affected) to reduce divergences between the two. From Lv Zheng. - Make the ACPI device PM code use ACPI_COMPANION() instead of its own routine doing the same thing (and invokng ACPI_COMPANION() in the process). - Modify some routines in the ACPI processor driver to follow the common convention and return negative integers on errors. From Hanjun Guo. / -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (GNU/Linux) iQIcBAABCAAGBQJS6mQLAAoJEILEb/54YlRxc6sP/0tYmO8qOF0XwHhA9AQKlcVG DZxui1pEbhXM3lftwqvVnma1hOKY1T014+JFxldCjvV9hyxdxTvcdvhKRxrj/eAk DY7p2TK3N0eBScpMQLv/nKMjS20Z0bxz3QNxhC0S3eOYk5QPN3aUhsqG2iu6aFxJ FzOOV5mQGhGT6a3LmXvjNROXjJN4dibMmGvl+bJ/8Y5zJUUvAOWmxphqjaIZm7WC Lh4a8wUfxfmq8Mj1DDI/qk/aWP8QTBDYiG8C8XjEa1pj9oHjsrCHNogSrfRHRwa1 sDW/6EjSbLYnKuUDeoA61wXyVvlvR22uTTswDwbJ2mt18WTcmbvPP6Znh7m3oiF2 aUDoh/8KvYGRhDBZm+wf6TjD/KdcIQdOptNl6irCMsHkYNDK/n7f++Blkjy/xmea UsF6l4XkIbqJCWWsTwO2VjB0p0QPRS49s/YtUxjETqCjdhNKnAQr2wfBH5/fcD6c yJPkCGOlqcPQAPOrWyabAuStDfFUEUoFkZ/kbZov2xUIXyJFv5gfj1boZ3Ekqhmd klcOmsvVP8QZLF82iFIhDdgWLNCRPESNfJpN0mLpg2sYMWQtK+r1OnSKpbVNW0Jn 6Ea23WSm0ZEd0QX8tYLjf/iUsIUjn48gJuXG+CDlTtkQtLNdr1VTQd5ZeKm2kcOg +82EVRoeZi+sqx4YrEQi =VBdN -----END PGP SIGNATURE----- Merge tag 'pm+acpi-3.14-rc1-2' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm Pull ACPI and power management fixes and cleanups from Rafael Wysocki: - ACPI device hotplug fix preventing ACPI drivers from binding to device objects that acpi_bus_trim() has been called for and the devices represented by them may not be operational. - Recent cpufreq changes related to the "boost" (turbo) feature broke the acpi-cpufreq error code path causing a NULL pointer dereference to occur on some systems. Fix from Konrad Rzeszutek Wilk. - The log level of a CPU initialization error message added recently needs to be reduced, because the particular BIOS issue indicated by it turns out to be widespread and doesn't really matter for the majority of systems having it. From Jiang Liu. - The regulator API needs to be told to stay away from things on systems with ACPI BIOSes or it may conflict with the BIOS' own handling of voltage regulators. Fix from Mark Brown that works around a 3.13 regression in lm90 on PCs occuring if the regulator API is enabled. - Prevent the Exynos4 devfreq driver from being built on multiplatform, because it depends on things that aren't available during such builds. From Sachin Kamat. - Upstream ACPICA doesn't use the bool type as defined in the kernel, so modify the kernel's ACPICA code to follow the upstream in that respect (only one variable definition is affected) to reduce divergences between the two. From Lv Zheng. - Make the ACPI device PM code use ACPI_COMPANION() instead of its own routine doing the same thing (and invokng ACPI_COMPANION() in the process). - Modify some routines in the ACPI processor driver to follow the common convention and return negative integers on errors. From Hanjun Guo. * tag 'pm+acpi-3.14-rc1-2' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm: ACPI / scan: Clear match_driver flag in acpi_bus_trim() ACPI / init: Flag use of ACPI and ACPI idioms for power supplies to regulator API acpi-cpufreq: De-register CPU notifier and free struct msr on error. ACPICA: Remove bool usage from ACPICA. PM / devfreq: Disable Exynos4 driver build on multiplatform ACPI / PM: Use ACPI_COMPANION() to get ACPI companions of devices ACPI / scan: reduce log level of "ACPI: \_PR_.CPU4: failed to get CPU APIC ID" ACPI / processor: Return specific error value when mapping lapic id
This commit is contained in:
Коммит
b890eb4ecc
|
@ -261,7 +261,7 @@ static int acpi_processor_get_info(struct acpi_device *device)
|
|||
|
||||
apic_id = acpi_get_apicid(pr->handle, device_declaration, pr->acpi_id);
|
||||
if (apic_id < 0) {
|
||||
acpi_handle_err(pr->handle, "failed to get CPU APIC ID.\n");
|
||||
acpi_handle_debug(pr->handle, "failed to get CPU APIC ID.\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
pr->apic_id = apic_id;
|
||||
|
|
|
@ -108,7 +108,7 @@ u8 ACPI_INIT_GLOBAL(acpi_gbl_use_default_register_widths, TRUE);
|
|||
/*
|
||||
* Optionally enable output from the AML Debug Object.
|
||||
*/
|
||||
bool ACPI_INIT_GLOBAL(acpi_gbl_enable_aml_debug_object, FALSE);
|
||||
u8 ACPI_INIT_GLOBAL(acpi_gbl_enable_aml_debug_object, FALSE);
|
||||
|
||||
/*
|
||||
* Optionally copy the entire DSDT to local memory (instead of simply
|
||||
|
|
|
@ -33,6 +33,7 @@
|
|||
#include <linux/proc_fs.h>
|
||||
#include <linux/acpi.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/regulator/machine.h>
|
||||
#ifdef CONFIG_X86
|
||||
#include <asm/mpspec.h>
|
||||
#endif
|
||||
|
@ -509,6 +510,14 @@ void __init acpi_early_init(void)
|
|||
goto error0;
|
||||
}
|
||||
|
||||
/*
|
||||
* If the system is using ACPI then we can be reasonably
|
||||
* confident that any regulators are managed by the firmware
|
||||
* so tell the regulator core it has everything it needs to
|
||||
* know.
|
||||
*/
|
||||
regulator_has_full_constraints();
|
||||
|
||||
return;
|
||||
|
||||
error0:
|
||||
|
|
|
@ -726,18 +726,6 @@ int acpi_pm_device_sleep_wake(struct device *dev, bool enable)
|
|||
}
|
||||
#endif /* CONFIG_PM_SLEEP */
|
||||
|
||||
/**
|
||||
* acpi_dev_pm_get_node - Get ACPI device node for the given physical device.
|
||||
* @dev: Device to get the ACPI node for.
|
||||
*/
|
||||
struct acpi_device *acpi_dev_pm_get_node(struct device *dev)
|
||||
{
|
||||
acpi_handle handle = ACPI_HANDLE(dev);
|
||||
struct acpi_device *adev;
|
||||
|
||||
return handle && !acpi_bus_get_device(handle, &adev) ? adev : NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* acpi_dev_pm_low_power - Put ACPI device into a low-power state.
|
||||
* @dev: Device to put into a low-power state.
|
||||
|
@ -778,7 +766,7 @@ static int acpi_dev_pm_full_power(struct acpi_device *adev)
|
|||
*/
|
||||
int acpi_dev_runtime_suspend(struct device *dev)
|
||||
{
|
||||
struct acpi_device *adev = acpi_dev_pm_get_node(dev);
|
||||
struct acpi_device *adev = ACPI_COMPANION(dev);
|
||||
bool remote_wakeup;
|
||||
int error;
|
||||
|
||||
|
@ -809,7 +797,7 @@ EXPORT_SYMBOL_GPL(acpi_dev_runtime_suspend);
|
|||
*/
|
||||
int acpi_dev_runtime_resume(struct device *dev)
|
||||
{
|
||||
struct acpi_device *adev = acpi_dev_pm_get_node(dev);
|
||||
struct acpi_device *adev = ACPI_COMPANION(dev);
|
||||
int error;
|
||||
|
||||
if (!adev)
|
||||
|
@ -862,7 +850,7 @@ EXPORT_SYMBOL_GPL(acpi_subsys_runtime_resume);
|
|||
*/
|
||||
int acpi_dev_suspend_late(struct device *dev)
|
||||
{
|
||||
struct acpi_device *adev = acpi_dev_pm_get_node(dev);
|
||||
struct acpi_device *adev = ACPI_COMPANION(dev);
|
||||
u32 target_state;
|
||||
bool wakeup;
|
||||
int error;
|
||||
|
@ -894,7 +882,7 @@ EXPORT_SYMBOL_GPL(acpi_dev_suspend_late);
|
|||
*/
|
||||
int acpi_dev_resume_early(struct device *dev)
|
||||
{
|
||||
struct acpi_device *adev = acpi_dev_pm_get_node(dev);
|
||||
struct acpi_device *adev = ACPI_COMPANION(dev);
|
||||
int error;
|
||||
|
||||
if (!adev)
|
||||
|
@ -985,7 +973,7 @@ static struct dev_pm_domain acpi_general_pm_domain = {
|
|||
*/
|
||||
int acpi_dev_pm_attach(struct device *dev, bool power_on)
|
||||
{
|
||||
struct acpi_device *adev = acpi_dev_pm_get_node(dev);
|
||||
struct acpi_device *adev = ACPI_COMPANION(dev);
|
||||
|
||||
if (!adev)
|
||||
return -ENODEV;
|
||||
|
@ -1017,7 +1005,7 @@ EXPORT_SYMBOL_GPL(acpi_dev_pm_attach);
|
|||
*/
|
||||
void acpi_dev_pm_detach(struct device *dev, bool power_off)
|
||||
{
|
||||
struct acpi_device *adev = acpi_dev_pm_get_node(dev);
|
||||
struct acpi_device *adev = ACPI_COMPANION(dev);
|
||||
|
||||
if (adev && dev->pm_domain == &acpi_general_pm_domain) {
|
||||
dev->pm_domain = NULL;
|
||||
|
|
|
@ -44,13 +44,13 @@ static int map_lapic_id(struct acpi_subtable_header *entry,
|
|||
(struct acpi_madt_local_apic *)entry;
|
||||
|
||||
if (!(lapic->lapic_flags & ACPI_MADT_ENABLED))
|
||||
return 0;
|
||||
return -ENODEV;
|
||||
|
||||
if (lapic->processor_id != acpi_id)
|
||||
return 0;
|
||||
return -EINVAL;
|
||||
|
||||
*apic_id = lapic->id;
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int map_x2apic_id(struct acpi_subtable_header *entry,
|
||||
|
@ -60,14 +60,14 @@ static int map_x2apic_id(struct acpi_subtable_header *entry,
|
|||
(struct acpi_madt_local_x2apic *)entry;
|
||||
|
||||
if (!(apic->lapic_flags & ACPI_MADT_ENABLED))
|
||||
return 0;
|
||||
return -ENODEV;
|
||||
|
||||
if (device_declaration && (apic->uid == acpi_id)) {
|
||||
*apic_id = apic->local_apic_id;
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 0;
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static int map_lsapic_id(struct acpi_subtable_header *entry,
|
||||
|
@ -77,16 +77,16 @@ static int map_lsapic_id(struct acpi_subtable_header *entry,
|
|||
(struct acpi_madt_local_sapic *)entry;
|
||||
|
||||
if (!(lsapic->lapic_flags & ACPI_MADT_ENABLED))
|
||||
return 0;
|
||||
return -ENODEV;
|
||||
|
||||
if (device_declaration) {
|
||||
if ((entry->length < 16) || (lsapic->uid != acpi_id))
|
||||
return 0;
|
||||
return -EINVAL;
|
||||
} else if (lsapic->processor_id != acpi_id)
|
||||
return 0;
|
||||
return -EINVAL;
|
||||
|
||||
*apic_id = (lsapic->id << 8) | lsapic->eid;
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int map_madt_entry(int type, u32 acpi_id)
|
||||
|
@ -116,13 +116,13 @@ static int map_madt_entry(int type, u32 acpi_id)
|
|||
struct acpi_subtable_header *header =
|
||||
(struct acpi_subtable_header *)entry;
|
||||
if (header->type == ACPI_MADT_TYPE_LOCAL_APIC) {
|
||||
if (map_lapic_id(header, acpi_id, &apic_id))
|
||||
if (!map_lapic_id(header, acpi_id, &apic_id))
|
||||
break;
|
||||
} else if (header->type == ACPI_MADT_TYPE_LOCAL_X2APIC) {
|
||||
if (map_x2apic_id(header, type, acpi_id, &apic_id))
|
||||
if (!map_x2apic_id(header, type, acpi_id, &apic_id))
|
||||
break;
|
||||
} else if (header->type == ACPI_MADT_TYPE_LOCAL_SAPIC) {
|
||||
if (map_lsapic_id(header, type, acpi_id, &apic_id))
|
||||
if (!map_lsapic_id(header, type, acpi_id, &apic_id))
|
||||
break;
|
||||
}
|
||||
entry += header->length;
|
||||
|
|
|
@ -2105,6 +2105,7 @@ void acpi_bus_trim(struct acpi_device *adev)
|
|||
list_for_each_entry_reverse(child, &adev->children, node)
|
||||
acpi_bus_trim(child);
|
||||
|
||||
adev->flags.match_driver = false;
|
||||
if (handler) {
|
||||
if (handler->detach)
|
||||
handler->detach(adev);
|
||||
|
|
|
@ -226,7 +226,7 @@ module_param_call(trace_state, param_set_trace_state, param_get_trace_state,
|
|||
/* /sys/modules/acpi/parameters/aml_debug_output */
|
||||
|
||||
module_param_named(aml_debug_output, acpi_gbl_enable_aml_debug_object,
|
||||
bool, 0644);
|
||||
byte, 0644);
|
||||
MODULE_PARM_DESC(aml_debug_output,
|
||||
"To enable/disable the ACPI Debug Object output.");
|
||||
|
||||
|
|
|
@ -919,7 +919,7 @@ static void __init acpi_cpufreq_boost_init(void)
|
|||
}
|
||||
}
|
||||
|
||||
static void __exit acpi_cpufreq_boost_exit(void)
|
||||
static void acpi_cpufreq_boost_exit(void)
|
||||
{
|
||||
if (msrs) {
|
||||
unregister_cpu_notifier(&boost_nb);
|
||||
|
@ -969,9 +969,10 @@ static int __init acpi_cpufreq_init(void)
|
|||
acpi_cpufreq_boost_init();
|
||||
|
||||
ret = cpufreq_register_driver(&acpi_cpufreq_driver);
|
||||
if (ret)
|
||||
if (ret) {
|
||||
free_acpi_perf_data();
|
||||
|
||||
acpi_cpufreq_boost_exit();
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
@ -67,7 +67,7 @@ comment "DEVFREQ Drivers"
|
|||
|
||||
config ARM_EXYNOS4_BUS_DEVFREQ
|
||||
bool "ARM Exynos4210/4212/4412 Memory Bus DEVFREQ Driver"
|
||||
depends on CPU_EXYNOS4210 || SOC_EXYNOS4212 || SOC_EXYNOS4412
|
||||
depends on (CPU_EXYNOS4210 || SOC_EXYNOS4212 || SOC_EXYNOS4412) && !ARCH_MULTIPLATFORM
|
||||
select ARCH_HAS_OPP
|
||||
select DEVFREQ_GOV_SIMPLE_ONDEMAND
|
||||
help
|
||||
|
|
|
@ -77,7 +77,7 @@ extern u8 acpi_gbl_create_osi_method;
|
|||
extern u8 acpi_gbl_disable_auto_repair;
|
||||
extern u8 acpi_gbl_disable_ssdt_table_load;
|
||||
extern u8 acpi_gbl_do_not_use_xsdt;
|
||||
extern bool acpi_gbl_enable_aml_debug_object;
|
||||
extern u8 acpi_gbl_enable_aml_debug_object;
|
||||
extern u8 acpi_gbl_enable_interpreter_slack;
|
||||
extern u32 acpi_gbl_trace_flags;
|
||||
extern acpi_name acpi_gbl_trace_method_name;
|
||||
|
|
Загрузка…
Ссылка в новой задаче