Commit fdb8c58a authored by Len Brown's avatar Len Brown

Merge branches 'apei', 'battery-mwh-fix', 'bugzilla-10807', 'bugzilla-14736',...

Merge branches 'apei', 'battery-mwh-fix', 'bugzilla-10807', 'bugzilla-14736', 'bugzilla-14679', 'bugzilla-16396', 'launchpad-613381' and 'misc' into release
...@@ -61,7 +61,7 @@ struct cstate_entry { ...@@ -61,7 +61,7 @@ struct cstate_entry {
unsigned int ecx; unsigned int ecx;
} states[ACPI_PROCESSOR_MAX_POWER]; } states[ACPI_PROCESSOR_MAX_POWER];
}; };
static struct cstate_entry *cpu_cstate_entry; /* per CPU ptr */ static struct cstate_entry __percpu *cpu_cstate_entry; /* per CPU ptr */
static short mwait_supported[ACPI_PROCESSOR_MAX_POWER]; static short mwait_supported[ACPI_PROCESSOR_MAX_POWER];
......
...@@ -105,7 +105,7 @@ config ACPI_EC_DEBUGFS ...@@ -105,7 +105,7 @@ config ACPI_EC_DEBUGFS
Be aware that using this interface can confuse your Embedded Be aware that using this interface can confuse your Embedded
Controller in a way that a normal reboot is not enough. You then Controller in a way that a normal reboot is not enough. You then
have to power of your system, and remove the laptop battery for have to power off your system, and remove the laptop battery for
some seconds. some seconds.
An Embedded Controller typically is available on laptops and reads An Embedded Controller typically is available on laptops and reads
sensor values like battery state and temperature. sensor values like battery state and temperature.
......
...@@ -382,31 +382,32 @@ static void acpi_pad_remove_sysfs(struct acpi_device *device) ...@@ -382,31 +382,32 @@ static void acpi_pad_remove_sysfs(struct acpi_device *device)
device_remove_file(&device->dev, &dev_attr_rrtime); device_remove_file(&device->dev, &dev_attr_rrtime);
} }
/* Query firmware how many CPUs should be idle */ /*
static int acpi_pad_pur(acpi_handle handle, int *num_cpus) * Query firmware how many CPUs should be idle
* return -1 on failure
*/
static int acpi_pad_pur(acpi_handle handle)
{ {
struct acpi_buffer buffer = {ACPI_ALLOCATE_BUFFER, NULL}; struct acpi_buffer buffer = {ACPI_ALLOCATE_BUFFER, NULL};
union acpi_object *package; union acpi_object *package;
int rev, num, ret = -EINVAL; int num = -1;
if (ACPI_FAILURE(acpi_evaluate_object(handle, "_PUR", NULL, &buffer))) if (ACPI_FAILURE(acpi_evaluate_object(handle, "_PUR", NULL, &buffer)))
return -EINVAL; return num;
if (!buffer.length || !buffer.pointer) if (!buffer.length || !buffer.pointer)
return -EINVAL; return num;
package = buffer.pointer; package = buffer.pointer;
if (package->type != ACPI_TYPE_PACKAGE || package->package.count != 2)
goto out; if (package->type == ACPI_TYPE_PACKAGE &&
rev = package->package.elements[0].integer.value; package->package.count == 2 &&
package->package.elements[0].integer.value == 1) /* rev 1 */
num = package->package.elements[1].integer.value; num = package->package.elements[1].integer.value;
if (rev != 1 || num < 0)
goto out;
*num_cpus = num;
ret = 0;
out:
kfree(buffer.pointer); kfree(buffer.pointer);
return ret; return num;
} }
/* Notify firmware how many CPUs are idle */ /* Notify firmware how many CPUs are idle */
...@@ -433,7 +434,8 @@ static void acpi_pad_handle_notify(acpi_handle handle) ...@@ -433,7 +434,8 @@ static void acpi_pad_handle_notify(acpi_handle handle)
uint32_t idle_cpus; uint32_t idle_cpus;
mutex_lock(&isolated_cpus_lock); mutex_lock(&isolated_cpus_lock);
if (acpi_pad_pur(handle, &num_cpus)) { num_cpus = acpi_pad_pur(handle);
if (num_cpus < 0) {
mutex_unlock(&isolated_cpus_lock); mutex_unlock(&isolated_cpus_lock);
return; return;
} }
......
...@@ -854,6 +854,7 @@ struct acpi_bit_register_info { ...@@ -854,6 +854,7 @@ struct acpi_bit_register_info {
ACPI_BITMASK_POWER_BUTTON_STATUS | \ ACPI_BITMASK_POWER_BUTTON_STATUS | \
ACPI_BITMASK_SLEEP_BUTTON_STATUS | \ ACPI_BITMASK_SLEEP_BUTTON_STATUS | \
ACPI_BITMASK_RT_CLOCK_STATUS | \ ACPI_BITMASK_RT_CLOCK_STATUS | \
ACPI_BITMASK_PCIEXP_WAKE_DISABLE | \
ACPI_BITMASK_WAKE_STATUS) ACPI_BITMASK_WAKE_STATUS)
#define ACPI_BITMASK_TIMER_ENABLE 0x0001 #define ACPI_BITMASK_TIMER_ENABLE 0x0001
......
...@@ -109,7 +109,7 @@ void acpi_ex_enter_interpreter(void) ...@@ -109,7 +109,7 @@ void acpi_ex_enter_interpreter(void)
* *
* DESCRIPTION: Reacquire the interpreter execution region from within the * DESCRIPTION: Reacquire the interpreter execution region from within the
* interpreter code. Failure to enter the interpreter region is a * interpreter code. Failure to enter the interpreter region is a
* fatal system error. Used in conjuction with * fatal system error. Used in conjunction with
* relinquish_interpreter * relinquish_interpreter
* *
******************************************************************************/ ******************************************************************************/
......
...@@ -149,7 +149,7 @@ acpi_rs_move_data(void *destination, void *source, u16 item_count, u8 move_type) ...@@ -149,7 +149,7 @@ acpi_rs_move_data(void *destination, void *source, u16 item_count, u8 move_type)
/* /*
* 16-, 32-, and 64-bit cases must use the move macros that perform * 16-, 32-, and 64-bit cases must use the move macros that perform
* endian conversion and/or accomodate hardware that cannot perform * endian conversion and/or accommodate hardware that cannot perform
* misaligned memory transfers * misaligned memory transfers
*/ */
case ACPI_RSC_MOVE16: case ACPI_RSC_MOVE16:
......
...@@ -34,6 +34,6 @@ config ACPI_APEI_ERST_DEBUG ...@@ -34,6 +34,6 @@ config ACPI_APEI_ERST_DEBUG
depends on ACPI_APEI depends on ACPI_APEI
help help
ERST is a way provided by APEI to save and retrieve hardware ERST is a way provided by APEI to save and retrieve hardware
error infomation to and from a persistent store. Enable this error information to and from a persistent store. Enable this
if you want to debugging and testing the ERST kernel support if you want to debugging and testing the ERST kernel support
and firmware implementation. and firmware implementation.
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* APEI Error Record Serialization Table debug support * APEI Error Record Serialization Table debug support
* *
* ERST is a way provided by APEI to save and retrieve hardware error * ERST is a way provided by APEI to save and retrieve hardware error
* infomation to and from a persistent store. This file provide the * information to and from a persistent store. This file provide the
* debugging/testing support for ERST kernel support and firmware * debugging/testing support for ERST kernel support and firmware
* implementation. * implementation.
* *
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* APEI Error Record Serialization Table support * APEI Error Record Serialization Table support
* *
* ERST is a way provided by APEI to save and retrieve hardware error * ERST is a way provided by APEI to save and retrieve hardware error
* infomation to and from a persistent store. * information to and from a persistent store.
* *
* For more information about ERST, please refer to ACPI Specification * For more information about ERST, please refer to ACPI Specification
* version 4.0, section 17.4. * version 4.0, section 17.4.
...@@ -266,13 +266,30 @@ static int erst_exec_move_data(struct apei_exec_context *ctx, ...@@ -266,13 +266,30 @@ static int erst_exec_move_data(struct apei_exec_context *ctx,
{ {
int rc; int rc;
u64 offset; u64 offset;
void *src, *dst;
/* ioremap does not work in interrupt context */
if (in_interrupt()) {
pr_warning(ERST_PFX
"MOVE_DATA can not be used in interrupt context");
return -EBUSY;
}
rc = __apei_exec_read_register(entry, &offset); rc = __apei_exec_read_register(entry, &offset);
if (rc) if (rc)
return rc; return rc;
memmove((void *)ctx->dst_base + offset,
(void *)ctx->src_base + offset, src = ioremap(ctx->src_base + offset, ctx->var2);
ctx->var2); if (!src)
return -ENOMEM;
dst = ioremap(ctx->dst_base + offset, ctx->var2);
if (!dst)
return -ENOMEM;
memmove(dst, src, ctx->var2);
iounmap(src);
iounmap(dst);
return 0; return 0;
} }
......
...@@ -273,7 +273,6 @@ static enum power_supply_property energy_battery_props[] = { ...@@ -273,7 +273,6 @@ static enum power_supply_property energy_battery_props[] = {
POWER_SUPPLY_PROP_CYCLE_COUNT, POWER_SUPPLY_PROP_CYCLE_COUNT,
POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN, POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN,
POWER_SUPPLY_PROP_VOLTAGE_NOW, POWER_SUPPLY_PROP_VOLTAGE_NOW,
POWER_SUPPLY_PROP_CURRENT_NOW,
POWER_SUPPLY_PROP_POWER_NOW, POWER_SUPPLY_PROP_POWER_NOW,
POWER_SUPPLY_PROP_ENERGY_FULL_DESIGN, POWER_SUPPLY_PROP_ENERGY_FULL_DESIGN,
POWER_SUPPLY_PROP_ENERGY_FULL, POWER_SUPPLY_PROP_ENERGY_FULL,
......
...@@ -183,6 +183,8 @@ static int __init dmi_disable_osi_vista(const struct dmi_system_id *d) ...@@ -183,6 +183,8 @@ static int __init dmi_disable_osi_vista(const struct dmi_system_id *d)
{ {
printk(KERN_NOTICE PREFIX "DMI detected: %s\n", d->ident); printk(KERN_NOTICE PREFIX "DMI detected: %s\n", d->ident);
acpi_osi_setup("!Windows 2006"); acpi_osi_setup("!Windows 2006");
acpi_osi_setup("!Windows 2006 SP1");
acpi_osi_setup("!Windows 2006 SP2");
return 0; return 0;
} }
static int __init dmi_disable_osi_win7(const struct dmi_system_id *d) static int __init dmi_disable_osi_win7(const struct dmi_system_id *d)
...@@ -226,6 +228,14 @@ static struct dmi_system_id acpi_osi_dmi_table[] __initdata = { ...@@ -226,6 +228,14 @@ static struct dmi_system_id acpi_osi_dmi_table[] __initdata = {
}, },
}, },
{ {
.callback = dmi_disable_osi_vista,
.ident = "Toshiba Satellite L355",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
DMI_MATCH(DMI_PRODUCT_VERSION, "Satellite L355"),
},
},
{
.callback = dmi_disable_osi_win7, .callback = dmi_disable_osi_win7,
.ident = "ASUS K50IJ", .ident = "ASUS K50IJ",
.matches = { .matches = {
...@@ -233,6 +243,14 @@ static struct dmi_system_id acpi_osi_dmi_table[] __initdata = { ...@@ -233,6 +243,14 @@ static struct dmi_system_id acpi_osi_dmi_table[] __initdata = {
DMI_MATCH(DMI_PRODUCT_NAME, "K50IJ"), DMI_MATCH(DMI_PRODUCT_NAME, "K50IJ"),
}, },
}, },
{
.callback = dmi_disable_osi_vista,
.ident = "Toshiba P305D",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
DMI_MATCH(DMI_PRODUCT_NAME, "Satellite P305D"),
},
},
/* /*
* BIOS invocation of _OSI(Linux) is almost always a BIOS bug. * BIOS invocation of _OSI(Linux) is almost always a BIOS bug.
......
...@@ -55,7 +55,7 @@ EXPORT_SYMBOL(acpi_root_dir); ...@@ -55,7 +55,7 @@ EXPORT_SYMBOL(acpi_root_dir);
static int set_power_nocheck(const struct dmi_system_id *id) static int set_power_nocheck(const struct dmi_system_id *id)
{ {
printk(KERN_NOTICE PREFIX "%s detected - " printk(KERN_NOTICE PREFIX "%s detected - "
"disable power check in power transistion\n", id->ident); "disable power check in power transition\n", id->ident);
acpi_power_nocheck = 1; acpi_power_nocheck = 1;
return 0; return 0;
} }
...@@ -80,23 +80,15 @@ static int set_copy_dsdt(const struct dmi_system_id *id) ...@@ -80,23 +80,15 @@ static int set_copy_dsdt(const struct dmi_system_id *id)
static struct dmi_system_id dsdt_dmi_table[] __initdata = { static struct dmi_system_id dsdt_dmi_table[] __initdata = {
/* /*
* Insyde BIOS on some TOSHIBA machines corrupt the DSDT. * Invoke DSDT corruption work-around on all Toshiba Satellite.
* https://bugzilla.kernel.org/show_bug.cgi?id=14679 * https://bugzilla.kernel.org/show_bug.cgi?id=14679
*/ */
{ {
.callback = set_copy_dsdt, .callback = set_copy_dsdt,
.ident = "TOSHIBA Satellite A505", .ident = "TOSHIBA Satellite",
.matches = { .matches = {
DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
DMI_MATCH(DMI_PRODUCT_NAME, "Satellite A505"), DMI_MATCH(DMI_PRODUCT_NAME, "Satellite"),
},
},
{
.callback = set_copy_dsdt,
.ident = "TOSHIBA Satellite L505D",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
DMI_MATCH(DMI_PRODUCT_NAME, "Satellite L505D"),
}, },
}, },
{} {}
...@@ -1027,7 +1019,7 @@ static int __init acpi_init(void) ...@@ -1027,7 +1019,7 @@ static int __init acpi_init(void)
/* /*
* If the laptop falls into the DMI check table, the power state check * If the laptop falls into the DMI check table, the power state check
* will be disabled in the course of device power transistion. * will be disabled in the course of device power transition.
*/ */
dmi_check_system(power_nocheck_dmi_table); dmi_check_system(power_nocheck_dmi_table);
......
...@@ -369,7 +369,9 @@ static void __exit acpi_fan_exit(void) ...@@ -369,7 +369,9 @@ static void __exit acpi_fan_exit(void)
acpi_bus_unregister_driver(&acpi_fan_driver); acpi_bus_unregister_driver(&acpi_fan_driver);
#ifdef CONFIG_ACPI_PROCFS
remove_proc_entry(ACPI_FAN_CLASS, acpi_root_dir); remove_proc_entry(ACPI_FAN_CLASS, acpi_root_dir);
#endif
return; return;
} }
......
...@@ -28,12 +28,6 @@ static int set_no_mwait(const struct dmi_system_id *id) ...@@ -28,12 +28,6 @@ static int set_no_mwait(const struct dmi_system_id *id)
} }
static struct dmi_system_id __cpuinitdata processor_idle_dmi_table[] = { static struct dmi_system_id __cpuinitdata processor_idle_dmi_table[] = {
{
set_no_mwait, "IFL91 board", {
DMI_MATCH(DMI_BIOS_VENDOR, "COMPAL"),
DMI_MATCH(DMI_SYS_VENDOR, "ZEPTO"),
DMI_MATCH(DMI_PRODUCT_VERSION, "3215W"),
DMI_MATCH(DMI_BOARD_NAME, "IFL91") }, NULL},
{ {
set_no_mwait, "Extensa 5220", { set_no_mwait, "Extensa 5220", {
DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies LTD"), DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies LTD"),
......
...@@ -447,8 +447,8 @@ int acpi_processor_notify_smm(struct module *calling_module) ...@@ -447,8 +447,8 @@ int acpi_processor_notify_smm(struct module *calling_module)
if (!try_module_get(calling_module)) if (!try_module_get(calling_module))
return -EINVAL; return -EINVAL;
/* is_done is set to negative if an error occured, /* is_done is set to negative if an error occurred,
* and to postitive if _no_ error occured, but SMM * and to postitive if _no_ error occurred, but SMM
* was already notified. This avoids double notification * was already notified. This avoids double notification
* which might lead to unexpected results... * which might lead to unexpected results...
*/ */
......
...@@ -363,6 +363,12 @@ static int __init init_old_suspend_ordering(const struct dmi_system_id *d) ...@@ -363,6 +363,12 @@ static int __init init_old_suspend_ordering(const struct dmi_system_id *d)
return 0; return 0;
} }
static int __init init_nvs_nosave(const struct dmi_system_id *d)
{
acpi_nvs_nosave();
return 0;
}
static struct dmi_system_id __initdata acpisleep_dmi_table[] = { static struct dmi_system_id __initdata acpisleep_dmi_table[] = {
{ {
.callback = init_old_suspend_ordering, .callback = init_old_suspend_ordering,
...@@ -397,6 +403,22 @@ static struct dmi_system_id __initdata acpisleep_dmi_table[] = { ...@@ -397,6 +403,22 @@ static struct dmi_system_id __initdata acpisleep_dmi_table[] = {
DMI_MATCH(DMI_BOARD_NAME, "CF51-2L"), DMI_MATCH(DMI_BOARD_NAME, "CF51-2L"),
}, },
}, },
{
.callback = init_nvs_nosave,
.ident = "Sony Vaio VGN-SR11M",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"),
DMI_MATCH(DMI_PRODUCT_NAME, "VGN-SR11M"),
},
},
{
.callback = init_nvs_nosave,
.ident = "Everex StepNote Series",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "Everex Systems, Inc."),
DMI_MATCH(DMI_PRODUCT_NAME, "Everex StepNote Series"),
},
},
{}, {},
}; };
#endif /* CONFIG_SUSPEND */ #endif /* CONFIG_SUSPEND */
......
...@@ -100,7 +100,7 @@ static const struct acpi_dlevel acpi_debug_levels[] = { ...@@ -100,7 +100,7 @@ static const struct acpi_dlevel acpi_debug_levels[] = {
ACPI_DEBUG_INIT(ACPI_LV_EVENTS), ACPI_DEBUG_INIT(ACPI_LV_EVENTS),
}; };
static int param_get_debug_layer(char *buffer, struct kernel_param *kp) static int param_get_debug_layer(char *buffer, const struct kernel_param *kp)
{ {
int result = 0; int result = 0;
int i; int i;
...@@ -128,7 +128,7 @@ static int param_get_debug_layer(char *buffer, struct kernel_param *kp) ...@@ -128,7 +128,7 @@ static int param_get_debug_layer(char *buffer, struct kernel_param *kp)
return result; return result;
} }
static int param_get_debug_level(char *buffer, struct kernel_param *kp) static int param_get_debug_level(char *buffer, const struct kernel_param *kp)
{ {
int result = 0; int result = 0;
int i; int i;
...@@ -149,10 +149,18 @@ static int param_get_debug_level(char *buffer, struct kernel_param *kp) ...@@ -149,10 +149,18 @@ static int param_get_debug_level(char *buffer, struct kernel_param *kp)
return result; return result;
} }
module_param_call(debug_layer, param_set_uint, param_get_debug_layer, static struct kernel_param_ops param_ops_debug_layer = {
&acpi_dbg_layer, 0644); .set = param_set_uint,
module_param_call(debug_level, param_set_uint, param_get_debug_level, .get = param_get_debug_layer,
&acpi_dbg_level, 0644); };
static struct kernel_param_ops param_ops_debug_level = {
.set = param_set_uint,
.get = param_get_debug_level,
};
module_param_cb(debug_layer, &param_ops_debug_layer, &acpi_dbg_layer, 0644);
module_param_cb(debug_level, &param_ops_debug_level, &acpi_dbg_level, 0644);
static char trace_method_name[6]; static char trace_method_name[6];
module_param_string(trace_method_name, trace_method_name, 6, 0644); module_param_string(trace_method_name, trace_method_name, 6, 0644);
......
...@@ -59,8 +59,8 @@ acpi_backlight_cap_match(acpi_handle handle, u32 level, void *context, ...@@ -59,8 +59,8 @@ acpi_backlight_cap_match(acpi_handle handle, u32 level, void *context,
"support\n")); "support\n"));
*cap |= ACPI_VIDEO_BACKLIGHT; *cap |= ACPI_VIDEO_BACKLIGHT;
if (ACPI_FAILURE(acpi_get_handle(handle, "_BQC", &h_dummy))) if (ACPI_FAILURE(acpi_get_handle(handle, "_BQC", &h_dummy)))
printk(KERN_WARNING FW_BUG PREFIX "ACPI brightness " printk(KERN_WARNING FW_BUG PREFIX "No _BQC method, "
"control misses _BQC function\n"); "cannot determine initial brightness\n");
/* We have backlight support, no need to scan further */ /* We have backlight support, no need to scan further */
return AE_CTRL_TERMINATE; return AE_CTRL_TERMINATE;
} }
......
...@@ -55,7 +55,7 @@ ...@@ -55,7 +55,7 @@
extern u8 acpi_gbl_permanent_mmap; extern u8 acpi_gbl_permanent_mmap;
/* /*
* Globals that are publically available, allowing for * Globals that are publicly available, allowing for
* run time configuration * run time configuration
*/ */
extern u32 acpi_dbg_level; extern u32 acpi_dbg_level;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment