ACPI patches for release onto Linux-2.6.21-rc4
Subsystems (3)
The following ACPI patches for release onto Linux-2.6.21-rc4. Thanks for your review,
-Len
PATCH 1/9 ACPI: Add support to parse 2nd MADT
When a BIOS bug presents multiple APIC/MADTs,
Linux currently uses the 1st and ignores the 2nd.
But some machines work better if we use the 2nd.
http://bugzilla.kernel.org/show_bug.cgi?id=7465
Add a warning and boot parameter "acpi_apic_instance=2" to allow parsing the 2nd.
No change to default behaviour in this patch.
--- Documentation/kernel-parameters.txt | 6 ++++ drivers/acpi/tables.c | 57 +++++++++++++++++++++++++++++++--- 2 files changed, 58 insertions(+), 5 deletions(-)
Documentation/kernel-parameters.txt +6 -0
@@ -138,6 +138,12 @@ and is between 256 and 4096 characters. It is defined in the file See also Documentation/pm.txt, pci=noacpi + acpi_apic_instance= [ACPI, IOAPIC] + Format: <int> + 2: use 2nd APIC table, if available + 1,0: use 1st APIC table + default: 0 + acpi_sleep= [HW,ACPI] Sleep options Format: { s3_bios, s3_mode } See Documentation/power/video.txt
drivers/acpi/tables.c +52 -5
92 lines not on this page · raw message
Signature · 1 line
1.5.0.3.382.g34572
PATCH 2/9 ACPI: resolve HP nx6125 S3 immediate wakeup regression
From: Alexey Starikovskiy <[email protected]>
Moving disable GPEs from enter_sleep up into sleep_prepare fixed the disabled SCI on S4 on Acer laptops.
However, it caused an immediate S3 resume on the HP nx6125. Apparently, on the HP, a GPE was getting re-enabled after the prepare, but before the enter.
Close that window by restoring the GPE disable on enter. This is redundant in most cases, but closes this window, where S3 and S4 paths differ.
--- drivers/acpi/hardware/hwsleep.c | 5 +++++ 1 files changed, 5 insertions(+), 0 deletions(-)
drivers/acpi/hardware/hwsleep.c +5 -0
@@ -300,6 +300,11 @@ acpi_status asmlinkage acpi_enter_sleep_state(u8 sleep_state)/* * 2) Enable all wakeup GPEs */ + status =acpi_hw_disable_all_gpes (); +if (ACPI_FAILURE (status)) { +return_ACPI_STATUS (status); + } + acpi_gbl_system_awake_and_running = FALSE; status =acpi_hw_enable_all_wakeup_gpes ();
Signature · 1 line
1.5.0.3.382.g34572
PATCH 3/9 sony-laptop: MAINTAINERS fix entry, add L: and W:
From: Mattia Dongili <[email protected]>
--- MAINTAINERS | 5 ++--- 1 files changed, 2 insertions(+), 3 deletions(-)
MAINTAINERS +2 -3
@@ -3066,11 +3066,10 @@ L: [email protected] S: Maintained SONY VAIO CONTROL DEVICE DRIVER -P: Stelian Pop -M: [email protected] P: Mattia Dongili M: [email protected] -W: http://popies.net/sonypi/ +L: [email protected] +W: http://www.linux.it/~malattia/wiki/index.php/Sony_drivers S: Maintained SOUND
Signature · 1 line
1.5.0.3.382.g34572
PATCH 4/9 ACPICA: revert "acpi_serialize" changes
This reverts 977a6226feae3e2c10a4d8227625ff0f04b49239 and reverts 1ba753acb372c2955a4843302e92e49ce82e2fea and updates acpi_ev_queue_notify_request()
to restore the previous implementation of the "acpi_serialize" workaround.
http://bugzilla.kernel.org/show_bug.cgi?id=8171
--- drivers/acpi/events/evmisc.c | 8 ++- drivers/acpi/events/evregion.c | 15 ++++-- drivers/acpi/events/evxface.c | 6 ++- drivers/acpi/executer/excreate.c | 5 ++- drivers/acpi/executer/exsystem.c | 30 ++++++++--- drivers/acpi/executer/exutils.c | 104 +++++++------------------------------ drivers/acpi/namespace/nseval.c | 11 +++- drivers/acpi/namespace/nsinit.c | 7 ++- drivers/acpi/namespace/nsxfeval.c | 11 +++-- include/acpi/acinterp.h | 6 +-- 10 files changed, 90 insertions(+), 113 deletions(-)
drivers/acpi/events/evmisc.c +6 -2
@@ -196,11 +196,15 @@ acpi_ev_queue_notify_request(struct acpi_namespace_node * node, notify_info->notify.value = (u16 ) notify_value; notify_info->notify.handler_obj = handler_obj; -acpi_ex_relinquish_interpreter (); +acpi_ex_exit_interpreter ();acpi_ev_notify_dispatch (notify_info); -acpi_ex_reacquire_interpreter (); + status =acpi_ex_enter_interpreter (); +if (ACPI_FAILURE (status)) { +return_ACPI_STATUS (status); + } + }if (!handler_obj) {
drivers/acpi/events/evregion.c +11 -4
@@ -291,6 +291,7 @@ acpi_ev_address_space_dispatch(union acpi_operand_object *region_obj, u32 bit_width, acpi_integer * value) { acpi_status status; +acpi_status status2;acpi_adr_space_handler handler;acpi_adr_space_setup region_setup;union acpi_operand_object *handler_desc;
@@ -344,7 +345,7 @@ acpi_ev_address_space_dispatch(union acpi_operand_object *region_obj,* setup will potentially execute control methods * (e.g., _REG method for this region) */ -acpi_ex_relinquish_interpreter (); +acpi_ex_exit_interpreter (); status = region_setup(region_obj, ACPI_REGION_ACTIVATE, handler_desc->address_space.context,
@@ -352,7 +353,10 @@ acpi_ev_address_space_dispatch(union acpi_operand_object *region_obj,/* Re-enter the interpreter */ -acpi_ex_reacquire_interpreter (); + status2 =acpi_ex_enter_interpreter (); +if (ACPI_FAILURE (status2)) { +return_ACPI_STATUS (status2); + }/* Check for failure of the Region Setup */
@@ -405,7 +409,7 @@ acpi_ev_address_space_dispatch(union acpi_operand_object *region_obj,* exit the interpreter because the handler *might* block -- we don't * know what it will do, so we can't hold the lock on the intepreter. */ -acpi_ex_relinquish_interpreter (); +acpi_ex_exit_interpreter (); }/* Call the handler */
@@ -426,7 +430,10 @@ acpi_ev_address_space_dispatch(union acpi_operand_object *region_obj,* We just returned from a non-default handler, we must re-enter the * interpreter */ -acpi_ex_reacquire_interpreter (); + status2 =acpi_ex_enter_interpreter (); +if (ACPI_FAILURE (status2)) { +return_ACPI_STATUS (status2); + } }return_ACPI_STATUS (status);
drivers/acpi/events/evxface.c +4 -2
@@ -768,9 +768,11 @@ acpi_status acpi_acquire_global_lock(u16 timeout, u32 * handle)return (AE_BAD_PARAMETER ); } -/* Must lock interpreter to prevent race conditions */ + status =acpi_ex_enter_interpreter (); +if (ACPI_FAILURE (status)) { +return (status); + } -acpi_ex_enter_interpreter (); status =acpi_ev_acquire_global_lock (timeout);acpi_ex_exit_interpreter ();
drivers/acpi/executer/excreate.c +4 -1
@@ -583,7 +583,10 @@ acpi_ex_create_method(u8 * aml_start,* Get the sync_level. If method is serialized, a mutex will be * created for this method when it is parsed. */ -if (method_flags &AML_METHOD_SERIALIZED ) { +if (acpi_gbl_all_methods_serialized) { + obj_desc->method.sync_level =0 ; + obj_desc->method.method_flags |=AML_METHOD_SERIALIZED ; + }else if (method_flags &AML_METHOD_SERIALIZED ) {/* * ACPI 1.0: sync_level = 0 * ACPI 2.0: sync_level = sync_level in method declaration
drivers/acpi/executer/exsystem.c +23 -7
@@ -66,6 +66,7 @@ ACPI_MODULE_NAME("exsystem")acpi_status acpi_ex_system_wait_semaphore (acpi_semaphore semaphore,u16 timeout) {acpi_status status; +acpi_status status2;ACPI_FUNCTION_TRACE (ex_system_wait_semaphore);
@@ -78,7 +79,7 @@ acpi_status acpi_ex_system_wait_semaphore(acpi_semaphore semaphore, u16 timeout)/* We must wait, so unlock the interpreter */ -acpi_ex_relinquish_interpreter (); +acpi_ex_exit_interpreter (); status =acpi_os_wait_semaphore (semaphore,1 , timeout);
@@ -88,7 +89,13 @@ acpi_status acpi_ex_system_wait_semaphore(acpi_semaphore semaphore, u16 timeout)/* Reacquire the interpreter */ -acpi_ex_reacquire_interpreter (); + status2 =acpi_ex_enter_interpreter (); +if (ACPI_FAILURE (status2)) { + +/* Report fatal error, could not acquire interpreter */ + +return_ACPI_STATUS (status2); + } }return_ACPI_STATUS (status);
@@ -112,6 +119,7 @@ acpi_status acpi_ex_system_wait_semaphore(acpi_semaphore semaphore, u16 timeout)acpi_status acpi_ex_system_wait_mutex (acpi_mutex mutex,u16 timeout) {acpi_status status; +acpi_status status2;ACPI_FUNCTION_TRACE (ex_system_wait_mutex);
@@ -124,7 +132,7 @@ acpi_status acpi_ex_system_wait_mutex(acpi_mutex mutex, u16 timeout)/* We must wait, so unlock the interpreter */ -acpi_ex_relinquish_interpreter (); +acpi_ex_exit_interpreter (); status =acpi_os_acquire_mutex (mutex, timeout);
@@ -134,7 +142,13 @@ acpi_status acpi_ex_system_wait_mutex(acpi_mutex mutex, u16 timeout)/* Reacquire the interpreter */ -acpi_ex_reacquire_interpreter (); + status2 =acpi_ex_enter_interpreter (); +if (ACPI_FAILURE (status2)) { + +/* Report fatal error, could not acquire interpreter */ + +return_ACPI_STATUS (status2); + } }return_ACPI_STATUS (status);
@@ -195,18 +209,20 @@ acpi_status acpi_ex_system_do_stall(u32 how_long)acpi_status acpi_ex_system_do_suspend (acpi_integer how_long) { +acpi_status status; +ACPI_FUNCTION_ENTRY ();/* Since this thread will sleep, we must release the interpreter */ -acpi_ex_relinquish_interpreter (); +acpi_ex_exit_interpreter ();acpi_os_sleep (how_long);/* And now we must get the interpreter again */ -acpi_ex_reacquire_interpreter (); -return (AE_OK ); + status =acpi_ex_enter_interpreter (); +return (status); }/*******************************************************************************
drivers/acpi/executer/exutils.c +20 -84
140 lines not on this page · raw message
drivers/acpi/namespace/nseval.c +9 -2
@@ -154,7 +154,11 @@ acpi_status acpi_ns_evaluate(struct acpi_evaluate_info *info)* Execute the method via the interpreter. The interpreter is locked * here before calling into the AML parser */ -acpi_ex_enter_interpreter (); + status =acpi_ex_enter_interpreter (); +if (ACPI_FAILURE (status)) { +return_ACPI_STATUS (status); + } + status =acpi_ps_execute_method (info);acpi_ex_exit_interpreter (); }else {
@@ -178,7 +182,10 @@ acpi_status acpi_ns_evaluate(struct acpi_evaluate_info *info)* resolution, we must lock it because we could access an opregion. * The opregion access code assumes that the interpreter is locked. */ -acpi_ex_enter_interpreter (); + status =acpi_ex_enter_interpreter (); +if (ACPI_FAILURE (status)) { +return_ACPI_STATUS (status); + }/* Function has a strange interface */
drivers/acpi/namespace/nsinit.c +5 -2
@@ -214,7 +214,7 @@ acpi_ns_init_one_object(acpi_handle obj_handle, u32 level, void *context, void **return_value) { acpi_object_type type; -acpi_status status =AE_OK ; +acpi_status status;struct acpi_init_walk_info *info = (struct acpi_init_walk_info *)context; struct acpi_namespace_node *node =
@@ -268,7 +268,10 @@ acpi_ns_init_one_object(acpi_handle obj_handle,/* * Must lock the interpreter before executing AML code */ -acpi_ex_enter_interpreter (); + status =acpi_ex_enter_interpreter (); +if (ACPI_FAILURE (status)) { +return (status); + }/* * Each of these types can contain executable AML code within the
drivers/acpi/namespace/nsxfeval.c +7 -4
@@ -170,6 +170,7 @@ acpi_evaluate_object(acpi_handle handle, struct acpi_buffer *return_buffer) {acpi_status status; +acpi_status status2;struct acpi_evaluate_info *info;acpi_size buffer_space_needed;u32 i;
@@ -328,12 +329,14 @@ acpi_evaluate_object(acpi_handle handle,* Delete the internal return object. NOTE: Interpreter must be * locked to avoid race condition. */ -acpi_ex_enter_interpreter (); + status2 =acpi_ex_enter_interpreter (); +if (ACPI_SUCCESS (status2)) { -/* Remove one reference on the return object (should delete it) */ +/* Remove one reference on the return object (should delete it) */ -acpi_ut_remove_reference (info->return_object); -acpi_ex_exit_interpreter (); +acpi_ut_remove_reference (info->return_object); +acpi_ex_exit_interpreter (); + } } cleanup:
include/acpi/acinterp.h +1 -5
@@ -446,14 +446,10 @@ acpi_ex_copy_integer_to_buffer_field(union acpi_operand_object *source_desc,/* * exutils - interpreter/scanner utilities */ -void acpi_ex_enter_interpreter (void ); +acpi_status acpi_ex_enter_interpreter (void );void acpi_ex_exit_interpreter (void ); -void acpi_ex_reacquire_interpreter (void ); - -void acpi_ex_relinquish_interpreter (void ); -void acpi_ex_truncate_for32bit_table (union acpi_operand_object *obj_desc);u8 acpi_ex_acquire_global_lock (u32 rule);
Signature · 1 line
1.5.0.3.382.g34572
PATCH 5/9 ACPI: parse 2nd MADT by default
http://bugzilla.kernel.org/show_bug.cgi?id=7465
--- Documentation/kernel-parameters.txt | 2 +- drivers/acpi/tables.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
Documentation/kernel-parameters.txt +1 -1
@@ -142,7 +142,7 @@ and is between 256 and 4096 characters. It is defined in the file Format: <int> 2: use 2nd APIC table, if available 1,0: use 1st APIC table - default: 0 + default: 2 acpi_sleep= [HW,ACPI] Sleep options Format: { s3_bios, s3_mode }
drivers/acpi/tables.c +1 -1
@@ -42,7 +42,7 @@ static char *mps_inti_flags_trigger[] = { "dfl", "edge", "res", "level" };static struct acpi_table_desc initial_tables[ACPI_MAX_TABLES ]__initdata ; -static int acpi_apic_instance__initdata ; +static int acpi_apic_instance__initdata =2 ;void acpi_table_print_madt_entry (struct acpi_subtable_header *header) {
Signature · 1 line
1.5.0.3.382.g34572
PATCH 6/9 ACPI: ibm-acpi: allow module to load when acpi notifiers can't be set (v2)
From: Henrique de Moraes Holschuh <[email protected]>
This patch allows for ibm-acpi to coexist (with diminished functionality) with other drivers like ACPI_BAY. ibm-acpi will simply disable the functions it is not able to register ACPI notifiers for.
--- drivers/acpi/ibm_acpi.c | 19 ++++++++++++++++--- 1 files changed, 16 insertions(+), 3 deletions(-)
drivers/acpi/ibm_acpi.c +16 -3
@@ -2507,7 +2507,7 @@ static int __init setup_notify(struct ibm_struct *ibm) ret =acpi_bus_get_device (*ibm->handle, &ibm->device);if (ret <0 ) {printk (IBM_ERR "%s device not present\n" , ibm->name); -return 0 ; +return -ENODEV ; }acpi_driver_data (ibm->device) = ibm;
@@ -2516,8 +2516,13 @@ static int __init setup_notify(struct ibm_struct *ibm) status =acpi_install_notify_handler (*ibm->handle, ibm->type, dispatch_notify, ibm);if (ACPI_FAILURE (status)) { -printk (IBM_ERR "acpi_install_notify_handler(%s) failed: %d\n" , - ibm->name, status); +if (status ==AE_ALREADY_EXISTS ) { +printk (IBM_NOTICE "another device driver is already handling %s events\n" , + ibm->name); + }else { +printk (IBM_ERR "acpi_install_notify_handler(%s) failed: %d\n" , + ibm->name, status); + }return -ENODEV ; } ibm->notify_installed =1 ;
@@ -2553,6 +2558,8 @@ static int __init register_driver(struct ibm_struct *ibm)return ret; } +static void ibm_exit (struct ibm_struct *ibm); +static int __init ibm_init (struct ibm_struct *ibm) {int ret;
@@ -2594,6 +2601,12 @@ static int __init ibm_init(struct ibm_struct *ibm)if (ibm->notify) { ret =setup_notify (ibm); +if (ret == -ENODEV ) { +printk (IBM_NOTICE "disabling subdriver %s\n" , + ibm->name); +ibm_exit (ibm); +return 0 ; + }if (ret <0 )return ret; }
Signature · 1 line
1.5.0.3.382.g34572
PATCH 7/9 ACPI: Only use IPI on known broken machines (AMD, Dothan/BaniasPentium M)
From: Thomas Renninger <[email protected]>
Use IPI for blacklisted CPUs, add parameter IPI vs LAPIC
Currently, Linux disables lapic timer for all machines with C2 and higher C-state support.
According to Intel only specific Intel models (Banias/Dothan) are broken in respect of not waking up from C2 with lapic.
However, I am not sure about the naming of the parameter and how it could/should get integrated into the dyntick part (CONFIG_GENERIC_CLOCKEVENTS). There, a more fine grained check (TSC still running?, ..) is needed? Does this make sense (always use CLOCK_EVT_NOTIFY_BROADCAST_ON, but use OFF if forced by use_ipi=0:
clockevents_notify(use_ipi ? CLOCK_EVT_NOTIFY_BROADCAST_ON :CLOCK_EVT_NOTIFY_BROADCAST_OFF, &pr->id);
--- drivers/acpi/processor_idle.c | 38 +++++++++++++++++++++++++++++--------- 1 files changed, 29 insertions(+), 9 deletions(-)
drivers/acpi/processor_idle.c +29 -9
@@ -89,6 +89,12 @@ module_param(nocst, uint, 0000);static unsigned int bm_history__read_mostly = (HZ >=800 ?0xFFFFFFFF : ((1U << (HZ /25 )) -1 ));module_param (bm_history, uint,0644 ); + +static unsigned use_ipi =2 ; +module_param (use_ipi, uint,0644 ); +MODULE_PARM_DESC (use_ipi,"IPI (vs. LAPIC) irqs for not waking up from C2/C3" +" machines. 0=apic, 1=ipi, 2=auto\n" ); +/* -------------------------------------------------------------------------- Power Management -------------------------------------------------------------------------- */
@@ -260,9 +266,8 @@ static void acpi_cstate_enter(struct acpi_processor_cx *cstate)/* * Some BIOS implementations switch to C3 in the published C2 state. -* This seems to be a common problem on AMD boxen, but other vendors -* are affected too. We pick the most conservative approach: we assume -* that the local APIC stops in both C2 and C3. +* This seems to be a common problem on AMD boxen and Intel Dothan/Banias +* Pentium M machines. */ static void acpi_timer_check_state (int state,struct acpi_processor *pr,struct acpi_processor_cx *cx)
@@ -276,8 +281,17 @@ static void acpi_timer_check_state(int state, struct acpi_processor *pr,if (pwr->timer_broadcast_on_state < state)return ; -if (cx->type >=ACPI_STATE_C2 ) - pr->power.timer_broadcast_on_state = state; +if (cx->type >=ACPI_STATE_C2 ) { +if (boot_cpu_data.x86_vendor ==X86_VENDOR_AMD ) + pr->power.timer_broadcast_on_state = state; +else if ((boot_cpu_data.x86_vendor ==X86_VENDOR_INTEL && + boot_cpu_data.x86 ==6 ) && + (boot_cpu_data.x86_model ==13 || + boot_cpu_data.x86_model ==9 )) + { + pr->power.timer_broadcast_on_state = state; + } + } }static void acpi_propagate_timer_broadcast (struct acpi_processor *pr)
@@ -292,10 +306,16 @@ static void acpi_propagate_timer_broadcast(struct acpi_processor *pr)#else cpumask_t mask =cpumask_of_cpu (pr->id); -if (pr->power.timer_broadcast_on_state <INT_MAX ) +if (use_ipi ==0 )on_each_cpu (switch_APIC_timer_to_ipi, &mask,1 ,1 ); -else +else if (use_ipi ==1 )on_each_cpu (switch_ipi_to_APIC_timer, &mask,1 ,1 ); +else { +if (pr->power.timer_broadcast_on_state <INT_MAX ) +on_each_cpu (switch_APIC_timer_to_ipi, &mask,1 ,1 ); +else +on_each_cpu (switch_ipi_to_APIC_timer, &mask,1 ,1 ); + }#endif }
@@ -1013,13 +1033,13 @@ static int acpi_processor_power_verify(struct acpi_processor *pr)case ACPI_STATE_C2 :acpi_processor_power_verify_c2 (cx); -if (cx->valid) +if (cx->valid && use_ipi !=0 && use_ipi !=1 )acpi_timer_check_state (i, pr, cx);break ;case ACPI_STATE_C3 :acpi_processor_power_verify_c3 (pr, cx); -if (cx->valid) +if (cx->valid && use_ipi !=0 && use_ipi !=1 )acpi_timer_check_state (i, pr, cx);break ; }
Signature · 1 line
1.5.0.3.382.g34572
PATCH 8/9 ACPI: IA64: fix allnoconfig build
The evils of Kconfig's select bite us once again... ia64/Kconfig selects ACPI, which depends on PM. But select ignores dependencies, allnoconfig chooses CONFIG_PM=n, and thus the menu of sub-options under ACPI vanish, which breaks the build.
Manually select PM along with ACPI for now. Some day, we should delete them both, or fix select.
--- arch/ia64/Kconfig | 1 + 1 files changed, 1 insertions(+), 0 deletions(-)
arch/ia64/Kconfig +1 -0
@@ -13,6 +13,7 @@ config IA64 bool select PCI if (!IA64_HP_SIM) select ACPI if (!IA64_HP_SIM) + select PM if (!IA64_HP_SIM) default y help The Itanium Processor Family is Intel's 64-bit successor to
Signature · 1 line
1.5.0.3.382.g34572
PATCH 9/9 ACPI: IA64: fix %ll build warnings
acpi_integer is 64-bits on all platforms, and so was defined as a u64.
i386 and x86_64 define u64 as unsigned long long.
ia64 defines u64 as long.
While these are all 64-bits, the kernel build warns about formating a "long" with %ll:
drivers/ata/libata-acpi.c:176: warning: long long unsigned int format, acpi_integer arg (arg 5)
So skip using "u64" and define acpi_integer as "unsigned long long" to make gcc happy with %ll.
--- include/acpi/actypes.h | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-)
include/acpi/actypes.h +1 -1
@@ -344,7 +344,7 @@ typedef u32 acpi_integer;/* 64-bit integers */ -typedef u64 acpi_integer ; +typedef unsigned long long acpi_integer ;#define ACPI_INTEGER_MAX ACPI_UINT64_MAX#define ACPI_INTEGER_BIT_SIZE 64#define ACPI_MAX_DECIMAL_DIGITS 20/* 2^64 = 18,446,744,073,709,551,616 */
Signature · 1 line
1.5.0.3.382.g34572