diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-05-20 12:45:38 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-05-20 12:45:38 -0400 |
commit | 04afb40593f9a3007e5ea817d009529ef10fb685 (patch) | |
tree | de5a16c2b1e5f2d97a7c2eccea4677719817f282 | |
parent | 7f06a8b26aba1dc03b42272dc0089a800372c575 (diff) | |
parent | cce4f632db200aef147c59084437168174b23f11 (diff) |
Merge branch 'acpica' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6
* 'acpica' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6: (22 commits)
ACPI: fix early DSDT dmi check warnings on ia64
ACPICA: Update version to 20100428.
ACPICA: Update/clarify some parameter names associated with acpi_handle
ACPICA: Rename acpi_ex_system_do_suspend->acpi_ex_system_do_sleep
ACPICA: Prevent possible allocation overrun during object copy
ACPICA: Split large file, evgpeblk
ACPICA: Add GPE support for dynamically loaded ACPI tables
ACPICA: Clarify/rename some root table descriptor fields
ACPICA: Update version to 20100331.
ACPICA: Minimize the differences between linux GPE code and ACPICA code base
ACPI: add boot option acpi=copy_dsdt to fix corrupt DSDT
ACPICA: Update DSDT copy/detection.
ACPICA: Add subsystem option to force copy of DSDT to local memory
ACPICA: Add detection of corrupted/replaced DSDT
ACPICA: Add write support for DataTable operation regions
ACPICA: Fix for acpi_reallocate_root_table for incorrect root table copy
ACPICA: Update comments/headers, no functional change
ACPICA: Update version to 20100304
ACPICA: Fix for possible fault in acpi_ex_release_mutex
ACPICA: Standardize integer output for ACPICA warnings/errors
...
80 files changed, 2143 insertions, 1424 deletions
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt index b9b0d7989f4e..b12bacd252fc 100644 --- a/Documentation/kernel-parameters.txt +++ b/Documentation/kernel-parameters.txt | |||
@@ -152,6 +152,7 @@ and is between 256 and 4096 characters. It is defined in the file | |||
152 | strict -- Be less tolerant of platforms that are not | 152 | strict -- Be less tolerant of platforms that are not |
153 | strictly ACPI specification compliant. | 153 | strictly ACPI specification compliant. |
154 | rsdt -- prefer RSDT over (default) XSDT | 154 | rsdt -- prefer RSDT over (default) XSDT |
155 | copy_dsdt -- copy DSDT to memory | ||
155 | 156 | ||
156 | See also Documentation/power/pm.txt, pci=noacpi | 157 | See also Documentation/power/pm.txt, pci=noacpi |
157 | 158 | ||
diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c index 9a5ed58f09dc..488be461a380 100644 --- a/arch/x86/kernel/acpi/boot.c +++ b/arch/x86/kernel/acpi/boot.c | |||
@@ -1613,6 +1613,10 @@ static int __init parse_acpi(char *arg) | |||
1613 | /* "acpi=noirq" disables ACPI interrupt routing */ | 1613 | /* "acpi=noirq" disables ACPI interrupt routing */ |
1614 | else if (strcmp(arg, "noirq") == 0) { | 1614 | else if (strcmp(arg, "noirq") == 0) { |
1615 | acpi_noirq_set(); | 1615 | acpi_noirq_set(); |
1616 | } | ||
1617 | /* "acpi=copy_dsdt" copys DSDT */ | ||
1618 | else if (strcmp(arg, "copy_dsdt") == 0) { | ||
1619 | acpi_gbl_copy_dsdt_locally = 1; | ||
1616 | } else { | 1620 | } else { |
1617 | /* Core will printk when we return error. */ | 1621 | /* Core will printk when we return error. */ |
1618 | return -EINVAL; | 1622 | return -EINVAL; |
diff --git a/drivers/acpi/acpica/Makefile b/drivers/acpi/acpica/Makefile index 7423052ece5a..d93cc06f4bf8 100644 --- a/drivers/acpi/acpica/Makefile +++ b/drivers/acpi/acpica/Makefile | |||
@@ -14,12 +14,12 @@ acpi-y := dsfield.o dsmthdat.o dsopcode.o dswexec.o dswscope.o \ | |||
14 | 14 | ||
15 | acpi-y += evevent.o evregion.o evsci.o evxfevnt.o \ | 15 | acpi-y += evevent.o evregion.o evsci.o evxfevnt.o \ |
16 | evmisc.o evrgnini.o evxface.o evxfregn.o \ | 16 | evmisc.o evrgnini.o evxface.o evxfregn.o \ |
17 | evgpe.o evgpeblk.o | 17 | evgpe.o evgpeblk.o evgpeinit.o evgpeutil.o |
18 | 18 | ||
19 | acpi-y += exconfig.o exfield.o exnames.o exoparg6.o exresolv.o exstorob.o\ | 19 | acpi-y += exconfig.o exfield.o exnames.o exoparg6.o exresolv.o exstorob.o\ |
20 | exconvrt.o exfldio.o exoparg1.o exprep.o exresop.o exsystem.o\ | 20 | exconvrt.o exfldio.o exoparg1.o exprep.o exresop.o exsystem.o\ |
21 | excreate.o exmisc.o exoparg2.o exregion.o exstore.o exutils.o \ | 21 | excreate.o exmisc.o exoparg2.o exregion.o exstore.o exutils.o \ |
22 | exdump.o exmutex.o exoparg3.o exresnte.o exstoren.o | 22 | exdump.o exmutex.o exoparg3.o exresnte.o exstoren.o exdebug.o |
23 | 23 | ||
24 | acpi-y += hwacpi.o hwgpe.o hwregs.o hwsleep.o hwxface.o hwvalid.o | 24 | acpi-y += hwacpi.o hwgpe.o hwregs.o hwsleep.o hwxface.o hwvalid.o |
25 | 25 | ||
diff --git a/drivers/acpi/acpica/acevents.h b/drivers/acpi/acpica/acevents.h index 3e6ba99e4053..64d1e5c2d4ae 100644 --- a/drivers/acpi/acpica/acevents.h +++ b/drivers/acpi/acpica/acevents.h | |||
@@ -73,8 +73,10 @@ acpi_ev_queue_notify_request(struct acpi_namespace_node *node, | |||
73 | u32 notify_value); | 73 | u32 notify_value); |
74 | 74 | ||
75 | /* | 75 | /* |
76 | * evgpe - GPE handling and dispatch | 76 | * evgpe - Low-level GPE support |
77 | */ | 77 | */ |
78 | u32 acpi_ev_gpe_detect(struct acpi_gpe_xrupt_info *gpe_xrupt_list); | ||
79 | |||
78 | acpi_status | 80 | acpi_status |
79 | acpi_ev_update_gpe_enable_masks(struct acpi_gpe_event_info *gpe_event_info); | 81 | acpi_ev_update_gpe_enable_masks(struct acpi_gpe_event_info *gpe_event_info); |
80 | 82 | ||
@@ -85,19 +87,13 @@ acpi_status acpi_ev_disable_gpe(struct acpi_gpe_event_info *gpe_event_info); | |||
85 | struct acpi_gpe_event_info *acpi_ev_get_gpe_event_info(acpi_handle gpe_device, | 87 | struct acpi_gpe_event_info *acpi_ev_get_gpe_event_info(acpi_handle gpe_device, |
86 | u32 gpe_number); | 88 | u32 gpe_number); |
87 | 89 | ||
90 | struct acpi_gpe_event_info *acpi_ev_low_get_gpe_info(u32 gpe_number, | ||
91 | struct acpi_gpe_block_info | ||
92 | *gpe_block); | ||
93 | |||
88 | /* | 94 | /* |
89 | * evgpeblk | 95 | * evgpeblk - Upper-level GPE block support |
90 | */ | 96 | */ |
91 | u8 acpi_ev_valid_gpe_event(struct acpi_gpe_event_info *gpe_event_info); | ||
92 | |||
93 | acpi_status | ||
94 | acpi_ev_walk_gpe_list(acpi_gpe_callback gpe_walk_callback, void *context); | ||
95 | |||
96 | acpi_status | ||
97 | acpi_ev_delete_gpe_handlers(struct acpi_gpe_xrupt_info *gpe_xrupt_info, | ||
98 | struct acpi_gpe_block_info *gpe_block, | ||
99 | void *context); | ||
100 | |||
101 | acpi_status | 97 | acpi_status |
102 | acpi_ev_create_gpe_block(struct acpi_namespace_node *gpe_device, | 98 | acpi_ev_create_gpe_block(struct acpi_namespace_node *gpe_device, |
103 | struct acpi_generic_address *gpe_block_address, | 99 | struct acpi_generic_address *gpe_block_address, |
@@ -116,12 +112,37 @@ u32 | |||
116 | acpi_ev_gpe_dispatch(struct acpi_gpe_event_info *gpe_event_info, | 112 | acpi_ev_gpe_dispatch(struct acpi_gpe_event_info *gpe_event_info, |
117 | u32 gpe_number); | 113 | u32 gpe_number); |
118 | 114 | ||
119 | u32 acpi_ev_gpe_detect(struct acpi_gpe_xrupt_info *gpe_xrupt_list); | 115 | /* |
116 | * evgpeinit - GPE initialization and update | ||
117 | */ | ||
118 | acpi_status acpi_ev_gpe_initialize(void); | ||
119 | |||
120 | void acpi_ev_update_gpes(acpi_owner_id table_owner_id); | ||
120 | 121 | ||
121 | acpi_status | 122 | acpi_status |
122 | acpi_ev_check_for_wake_only_gpe(struct acpi_gpe_event_info *gpe_event_info); | 123 | acpi_ev_match_gpe_method(acpi_handle obj_handle, |
124 | u32 level, void *context, void **return_value); | ||
123 | 125 | ||
124 | acpi_status acpi_ev_gpe_initialize(void); | 126 | acpi_status |
127 | acpi_ev_match_prw_and_gpe(acpi_handle obj_handle, | ||
128 | u32 level, void *context, void **return_value); | ||
129 | |||
130 | /* | ||
131 | * evgpeutil - GPE utilities | ||
132 | */ | ||
133 | acpi_status | ||
134 | acpi_ev_walk_gpe_list(acpi_gpe_callback gpe_walk_callback, void *context); | ||
135 | |||
136 | u8 acpi_ev_valid_gpe_event(struct acpi_gpe_event_info *gpe_event_info); | ||
137 | |||
138 | struct acpi_gpe_xrupt_info *acpi_ev_get_gpe_xrupt_block(u32 interrupt_number); | ||
139 | |||
140 | acpi_status acpi_ev_delete_gpe_xrupt(struct acpi_gpe_xrupt_info *gpe_xrupt); | ||
141 | |||
142 | acpi_status | ||
143 | acpi_ev_delete_gpe_handlers(struct acpi_gpe_xrupt_info *gpe_xrupt_info, | ||
144 | struct acpi_gpe_block_info *gpe_block, | ||
145 | void *context); | ||
125 | 146 | ||
126 | /* | 147 | /* |
127 | * evregion - Address Space handling | 148 | * evregion - Address Space handling |
diff --git a/drivers/acpi/acpica/acglobal.h b/drivers/acpi/acpica/acglobal.h index f8dd8f250ac4..9070f1fe8f17 100644 --- a/drivers/acpi/acpica/acglobal.h +++ b/drivers/acpi/acpica/acglobal.h | |||
@@ -112,6 +112,19 @@ u8 ACPI_INIT_GLOBAL(acpi_gbl_leave_wake_gpes_disabled, TRUE); | |||
112 | */ | 112 | */ |
113 | u8 ACPI_INIT_GLOBAL(acpi_gbl_use_default_register_widths, TRUE); | 113 | u8 ACPI_INIT_GLOBAL(acpi_gbl_use_default_register_widths, TRUE); |
114 | 114 | ||
115 | /* | ||
116 | * Optionally enable output from the AML Debug Object. | ||
117 | */ | ||
118 | u8 ACPI_INIT_GLOBAL(acpi_gbl_enable_aml_debug_object, FALSE); | ||
119 | |||
120 | /* | ||
121 | * Optionally copy the entire DSDT to local memory (instead of simply | ||
122 | * mapping it.) There are some BIOSs that corrupt or replace the original | ||
123 | * DSDT, creating the need for this option. Default is FALSE, do not copy | ||
124 | * the DSDT. | ||
125 | */ | ||
126 | u8 ACPI_INIT_GLOBAL(acpi_gbl_copy_dsdt_locally, FALSE); | ||
127 | |||
115 | /* acpi_gbl_FADT is a local copy of the FADT, converted to a common format. */ | 128 | /* acpi_gbl_FADT is a local copy of the FADT, converted to a common format. */ |
116 | 129 | ||
117 | struct acpi_table_fadt acpi_gbl_FADT; | 130 | struct acpi_table_fadt acpi_gbl_FADT; |
@@ -145,11 +158,10 @@ ACPI_EXTERN u32 acpi_gbl_trace_dbg_layer; | |||
145 | ****************************************************************************/ | 158 | ****************************************************************************/ |
146 | 159 | ||
147 | /* | 160 | /* |
148 | * acpi_gbl_root_table_list is the master list of ACPI tables found in the | 161 | * acpi_gbl_root_table_list is the master list of ACPI tables that were |
149 | * RSDT/XSDT. | 162 | * found in the RSDT/XSDT. |
150 | * | ||
151 | */ | 163 | */ |
152 | ACPI_EXTERN struct acpi_internal_rsdt acpi_gbl_root_table_list; | 164 | ACPI_EXTERN struct acpi_table_list acpi_gbl_root_table_list; |
153 | ACPI_EXTERN struct acpi_table_facs *acpi_gbl_FACS; | 165 | ACPI_EXTERN struct acpi_table_facs *acpi_gbl_FACS; |
154 | 166 | ||
155 | /* These addresses are calculated from the FADT Event Block addresses */ | 167 | /* These addresses are calculated from the FADT Event Block addresses */ |
@@ -160,6 +172,11 @@ ACPI_EXTERN struct acpi_generic_address acpi_gbl_xpm1a_enable; | |||
160 | ACPI_EXTERN struct acpi_generic_address acpi_gbl_xpm1b_status; | 172 | ACPI_EXTERN struct acpi_generic_address acpi_gbl_xpm1b_status; |
161 | ACPI_EXTERN struct acpi_generic_address acpi_gbl_xpm1b_enable; | 173 | ACPI_EXTERN struct acpi_generic_address acpi_gbl_xpm1b_enable; |
162 | 174 | ||
175 | /* DSDT information. Used to check for DSDT corruption */ | ||
176 | |||
177 | ACPI_EXTERN struct acpi_table_header *acpi_gbl_DSDT; | ||
178 | ACPI_EXTERN struct acpi_table_header acpi_gbl_original_dsdt_header; | ||
179 | |||
163 | /* | 180 | /* |
164 | * Handle both ACPI 1.0 and ACPI 2.0 Integer widths. The integer width is | 181 | * Handle both ACPI 1.0 and ACPI 2.0 Integer widths. The integer width is |
165 | * determined by the revision of the DSDT: If the DSDT revision is less than | 182 | * determined by the revision of the DSDT: If the DSDT revision is less than |
diff --git a/drivers/acpi/acpica/acinterp.h b/drivers/acpi/acpica/acinterp.h index 6df3f8428168..049e203bd621 100644 --- a/drivers/acpi/acpica/acinterp.h +++ b/drivers/acpi/acpica/acinterp.h | |||
@@ -121,6 +121,13 @@ acpi_ex_convert_to_target_type(acpi_object_type destination_type, | |||
121 | struct acpi_walk_state *walk_state); | 121 | struct acpi_walk_state *walk_state); |
122 | 122 | ||
123 | /* | 123 | /* |
124 | * exdebug - AML debug object | ||
125 | */ | ||
126 | void | ||
127 | acpi_ex_do_debug_object(union acpi_operand_object *source_desc, | ||
128 | u32 level, u32 index); | ||
129 | |||
130 | /* | ||
124 | * exfield - ACPI AML (p-code) execution - field manipulation | 131 | * exfield - ACPI AML (p-code) execution - field manipulation |
125 | */ | 132 | */ |
126 | acpi_status | 133 | acpi_status |
@@ -274,7 +281,7 @@ acpi_status | |||
274 | acpi_ex_system_do_notify_op(union acpi_operand_object *value, | 281 | acpi_ex_system_do_notify_op(union acpi_operand_object *value, |
275 | union acpi_operand_object *obj_desc); | 282 | union acpi_operand_object *obj_desc); |
276 | 283 | ||
277 | acpi_status acpi_ex_system_do_suspend(u64 time); | 284 | acpi_status acpi_ex_system_do_sleep(u64 time); |
278 | 285 | ||
279 | acpi_status acpi_ex_system_do_stall(u32 time); | 286 | acpi_status acpi_ex_system_do_stall(u32 time); |
280 | 287 | ||
diff --git a/drivers/acpi/acpica/aclocal.h b/drivers/acpi/acpica/aclocal.h index 24b8faa5c395..147a7e6bd38f 100644 --- a/drivers/acpi/acpica/aclocal.h +++ b/drivers/acpi/acpica/aclocal.h | |||
@@ -213,12 +213,12 @@ struct acpi_namespace_node { | |||
213 | #define ANOBJ_IS_BIT_OFFSET 0x40 /* i_aSL only: Reference is a bit offset */ | 213 | #define ANOBJ_IS_BIT_OFFSET 0x40 /* i_aSL only: Reference is a bit offset */ |
214 | #define ANOBJ_IS_REFERENCED 0x80 /* i_aSL only: Object was referenced */ | 214 | #define ANOBJ_IS_REFERENCED 0x80 /* i_aSL only: Object was referenced */ |
215 | 215 | ||
216 | /* One internal RSDT for table management */ | 216 | /* Internal ACPI table management - master table list */ |
217 | 217 | ||
218 | struct acpi_internal_rsdt { | 218 | struct acpi_table_list { |
219 | struct acpi_table_desc *tables; | 219 | struct acpi_table_desc *tables; /* Table descriptor array */ |
220 | u32 count; | 220 | u32 current_table_count; /* Tables currently in the array */ |
221 | u32 size; | 221 | u32 max_table_count; /* Max tables array will hold */ |
222 | u8 flags; | 222 | u8 flags; |
223 | }; | 223 | }; |
224 | 224 | ||
@@ -427,8 +427,8 @@ struct acpi_gpe_event_info { | |||
427 | struct acpi_gpe_register_info *register_info; /* Backpointer to register info */ | 427 | struct acpi_gpe_register_info *register_info; /* Backpointer to register info */ |
428 | u8 flags; /* Misc info about this GPE */ | 428 | u8 flags; /* Misc info about this GPE */ |
429 | u8 gpe_number; /* This GPE */ | 429 | u8 gpe_number; /* This GPE */ |
430 | u8 runtime_count; | 430 | u8 runtime_count; /* References to a run GPE */ |
431 | u8 wakeup_count; | 431 | u8 wakeup_count; /* References to a wake GPE */ |
432 | }; | 432 | }; |
433 | 433 | ||
434 | /* Information about a GPE register pair, one per each status/enable pair in an array */ | 434 | /* Information about a GPE register pair, one per each status/enable pair in an array */ |
@@ -454,6 +454,7 @@ struct acpi_gpe_block_info { | |||
454 | struct acpi_gpe_event_info *event_info; /* One for each GPE */ | 454 | struct acpi_gpe_event_info *event_info; /* One for each GPE */ |
455 | struct acpi_generic_address block_address; /* Base address of the block */ | 455 | struct acpi_generic_address block_address; /* Base address of the block */ |
456 | u32 register_count; /* Number of register pairs in block */ | 456 | u32 register_count; /* Number of register pairs in block */ |
457 | u16 gpe_count; /* Number of individual GPEs in block */ | ||
457 | u8 block_base_number; /* Base GPE number for this block */ | 458 | u8 block_base_number; /* Base GPE number for this block */ |
458 | }; | 459 | }; |
459 | 460 | ||
@@ -469,6 +470,10 @@ struct acpi_gpe_xrupt_info { | |||
469 | struct acpi_gpe_walk_info { | 470 | struct acpi_gpe_walk_info { |
470 | struct acpi_namespace_node *gpe_device; | 471 | struct acpi_namespace_node *gpe_device; |
471 | struct acpi_gpe_block_info *gpe_block; | 472 | struct acpi_gpe_block_info *gpe_block; |
473 | u16 count; | ||
474 | acpi_owner_id owner_id; | ||
475 | u8 enable_this_gpe; | ||
476 | u8 execute_by_owner_id; | ||
472 | }; | 477 | }; |
473 | 478 | ||
474 | struct acpi_gpe_device_info { | 479 | struct acpi_gpe_device_info { |
diff --git a/drivers/acpi/acpica/actables.h b/drivers/acpi/acpica/actables.h index 8ff3b741df28..62a576e34361 100644 --- a/drivers/acpi/acpica/actables.h +++ b/drivers/acpi/acpica/actables.h | |||
@@ -107,6 +107,10 @@ u8 acpi_tb_checksum(u8 *buffer, u32 length); | |||
107 | acpi_status | 107 | acpi_status |
108 | acpi_tb_verify_checksum(struct acpi_table_header *table, u32 length); | 108 | acpi_tb_verify_checksum(struct acpi_table_header *table, u32 length); |
109 | 109 | ||
110 | void acpi_tb_check_dsdt_header(void); | ||
111 | |||
112 | struct acpi_table_header *acpi_tb_copy_dsdt(u32 table_index); | ||
113 | |||
110 | void | 114 | void |
111 | acpi_tb_install_table(acpi_physical_address address, | 115 | acpi_tb_install_table(acpi_physical_address address, |
112 | char *signature, u32 table_index); | 116 | char *signature, u32 table_index); |
diff --git a/drivers/acpi/acpica/dsfield.c b/drivers/acpi/acpica/dsfield.c index bb13817e0c31..347bee1726f1 100644 --- a/drivers/acpi/acpica/dsfield.c +++ b/drivers/acpi/acpica/dsfield.c | |||
@@ -323,7 +323,7 @@ acpi_ds_get_field_names(struct acpi_create_field_info *info, | |||
323 | default: | 323 | default: |
324 | 324 | ||
325 | ACPI_ERROR((AE_INFO, | 325 | ACPI_ERROR((AE_INFO, |
326 | "Invalid opcode in field list: %X", | 326 | "Invalid opcode in field list: 0x%X", |
327 | arg->common.aml_opcode)); | 327 | arg->common.aml_opcode)); |
328 | return_ACPI_STATUS(AE_AML_BAD_OPCODE); | 328 | return_ACPI_STATUS(AE_AML_BAD_OPCODE); |
329 | } | 329 | } |
diff --git a/drivers/acpi/acpica/dsmethod.c b/drivers/acpi/acpica/dsmethod.c index 721039233aa7..2a9a561c2f01 100644 --- a/drivers/acpi/acpica/dsmethod.c +++ b/drivers/acpi/acpica/dsmethod.c | |||
@@ -225,7 +225,7 @@ acpi_ds_begin_method_execution(struct acpi_namespace_node *method_node, | |||
225 | (walk_state->thread->current_sync_level > | 225 | (walk_state->thread->current_sync_level > |
226 | obj_desc->method.mutex->mutex.sync_level)) { | 226 | obj_desc->method.mutex->mutex.sync_level)) { |
227 | ACPI_ERROR((AE_INFO, | 227 | ACPI_ERROR((AE_INFO, |
228 | "Cannot acquire Mutex for method [%4.4s], current SyncLevel is too large (%d)", | 228 | "Cannot acquire Mutex for method [%4.4s], current SyncLevel is too large (%u)", |
229 | acpi_ut_get_node_name(method_node), | 229 | acpi_ut_get_node_name(method_node), |
230 | walk_state->thread->current_sync_level)); | 230 | walk_state->thread->current_sync_level)); |
231 | 231 | ||
diff --git a/drivers/acpi/acpica/dsmthdat.c b/drivers/acpi/acpica/dsmthdat.c index cc343b959540..f3d52f59250b 100644 --- a/drivers/acpi/acpica/dsmthdat.c +++ b/drivers/acpi/acpica/dsmthdat.c | |||
@@ -262,7 +262,7 @@ acpi_ds_method_data_get_node(u8 type, | |||
262 | 262 | ||
263 | if (index > ACPI_METHOD_MAX_LOCAL) { | 263 | if (index > ACPI_METHOD_MAX_LOCAL) { |
264 | ACPI_ERROR((AE_INFO, | 264 | ACPI_ERROR((AE_INFO, |
265 | "Local index %d is invalid (max %d)", | 265 | "Local index %u is invalid (max %u)", |
266 | index, ACPI_METHOD_MAX_LOCAL)); | 266 | index, ACPI_METHOD_MAX_LOCAL)); |
267 | return_ACPI_STATUS(AE_AML_INVALID_INDEX); | 267 | return_ACPI_STATUS(AE_AML_INVALID_INDEX); |
268 | } | 268 | } |
@@ -276,7 +276,7 @@ acpi_ds_method_data_get_node(u8 type, | |||
276 | 276 | ||
277 | if (index > ACPI_METHOD_MAX_ARG) { | 277 | if (index > ACPI_METHOD_MAX_ARG) { |
278 | ACPI_ERROR((AE_INFO, | 278 | ACPI_ERROR((AE_INFO, |
279 | "Arg index %d is invalid (max %d)", | 279 | "Arg index %u is invalid (max %u)", |
280 | index, ACPI_METHOD_MAX_ARG)); | 280 | index, ACPI_METHOD_MAX_ARG)); |
281 | return_ACPI_STATUS(AE_AML_INVALID_INDEX); | 281 | return_ACPI_STATUS(AE_AML_INVALID_INDEX); |
282 | } | 282 | } |
@@ -287,7 +287,7 @@ acpi_ds_method_data_get_node(u8 type, | |||
287 | break; | 287 | break; |
288 | 288 | ||
289 | default: | 289 | default: |
290 | ACPI_ERROR((AE_INFO, "Type %d is invalid", type)); | 290 | ACPI_ERROR((AE_INFO, "Type %u is invalid", type)); |
291 | return_ACPI_STATUS(AE_TYPE); | 291 | return_ACPI_STATUS(AE_TYPE); |
292 | } | 292 | } |
293 | 293 | ||
@@ -424,7 +424,7 @@ acpi_ds_method_data_get_value(u8 type, | |||
424 | case ACPI_REFCLASS_ARG: | 424 | case ACPI_REFCLASS_ARG: |
425 | 425 | ||
426 | ACPI_ERROR((AE_INFO, | 426 | ACPI_ERROR((AE_INFO, |
427 | "Uninitialized Arg[%d] at node %p", | 427 | "Uninitialized Arg[%u] at node %p", |
428 | index, node)); | 428 | index, node)); |
429 | 429 | ||
430 | return_ACPI_STATUS(AE_AML_UNINITIALIZED_ARG); | 430 | return_ACPI_STATUS(AE_AML_UNINITIALIZED_ARG); |
@@ -440,7 +440,7 @@ acpi_ds_method_data_get_value(u8 type, | |||
440 | default: | 440 | default: |
441 | 441 | ||
442 | ACPI_ERROR((AE_INFO, | 442 | ACPI_ERROR((AE_INFO, |
443 | "Not a Arg/Local opcode: %X", | 443 | "Not a Arg/Local opcode: 0x%X", |
444 | type)); | 444 | type)); |
445 | return_ACPI_STATUS(AE_AML_INTERNAL); | 445 | return_ACPI_STATUS(AE_AML_INTERNAL); |
446 | } | 446 | } |
diff --git a/drivers/acpi/acpica/dsobject.c b/drivers/acpi/acpica/dsobject.c index 891e08bf560b..3607adcaf085 100644 --- a/drivers/acpi/acpica/dsobject.c +++ b/drivers/acpi/acpica/dsobject.c | |||
@@ -288,7 +288,7 @@ acpi_ds_build_internal_buffer_obj(struct acpi_walk_state *walk_state, | |||
288 | if (byte_list) { | 288 | if (byte_list) { |
289 | if (byte_list->common.aml_opcode != AML_INT_BYTELIST_OP) { | 289 | if (byte_list->common.aml_opcode != AML_INT_BYTELIST_OP) { |
290 | ACPI_ERROR((AE_INFO, | 290 | ACPI_ERROR((AE_INFO, |
291 | "Expecting bytelist, got AML opcode %X in op %p", | 291 | "Expecting bytelist, found AML opcode 0x%X in op %p", |
292 | byte_list->common.aml_opcode, byte_list)); | 292 | byte_list->common.aml_opcode, byte_list)); |
293 | 293 | ||
294 | acpi_ut_remove_reference(obj_desc); | 294 | acpi_ut_remove_reference(obj_desc); |
@@ -511,7 +511,7 @@ acpi_ds_build_internal_package_obj(struct acpi_walk_state *walk_state, | |||
511 | } | 511 | } |
512 | 512 | ||
513 | ACPI_INFO((AE_INFO, | 513 | ACPI_INFO((AE_INFO, |
514 | "Actual Package length (0x%X) is larger than NumElements field (0x%X), truncated\n", | 514 | "Actual Package length (%u) is larger than NumElements field (%u), truncated\n", |
515 | i, element_count)); | 515 | i, element_count)); |
516 | } else if (i < element_count) { | 516 | } else if (i < element_count) { |
517 | /* | 517 | /* |
@@ -519,7 +519,7 @@ acpi_ds_build_internal_package_obj(struct acpi_walk_state *walk_state, | |||
519 | * Note: this is not an error, the package is padded out with NULLs. | 519 | * Note: this is not an error, the package is padded out with NULLs. |
520 | */ | 520 | */ |
521 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, | 521 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, |
522 | "Package List length (0x%X) smaller than NumElements count (0x%X), padded with null elements\n", | 522 | "Package List length (%u) smaller than NumElements count (%u), padded with null elements\n", |
523 | i, element_count)); | 523 | i, element_count)); |
524 | } | 524 | } |
525 | 525 | ||
@@ -701,7 +701,7 @@ acpi_ds_init_object_from_op(struct acpi_walk_state *walk_state, | |||
701 | default: | 701 | default: |
702 | 702 | ||
703 | ACPI_ERROR((AE_INFO, | 703 | ACPI_ERROR((AE_INFO, |
704 | "Unknown constant opcode %X", | 704 | "Unknown constant opcode 0x%X", |
705 | opcode)); | 705 | opcode)); |
706 | status = AE_AML_OPERAND_TYPE; | 706 | status = AE_AML_OPERAND_TYPE; |
707 | break; | 707 | break; |
@@ -717,7 +717,7 @@ acpi_ds_init_object_from_op(struct acpi_walk_state *walk_state, | |||
717 | break; | 717 | break; |
718 | 718 | ||
719 | default: | 719 | default: |
720 | ACPI_ERROR((AE_INFO, "Unknown Integer type %X", | 720 | ACPI_ERROR((AE_INFO, "Unknown Integer type 0x%X", |
721 | op_info->type)); | 721 | op_info->type)); |
722 | status = AE_AML_OPERAND_TYPE; | 722 | status = AE_AML_OPERAND_TYPE; |
723 | break; | 723 | break; |
@@ -806,7 +806,7 @@ acpi_ds_init_object_from_op(struct acpi_walk_state *walk_state, | |||
806 | default: | 806 | default: |
807 | 807 | ||
808 | ACPI_ERROR((AE_INFO, | 808 | ACPI_ERROR((AE_INFO, |
809 | "Unimplemented reference type for AML opcode: %4.4X", | 809 | "Unimplemented reference type for AML opcode: 0x%4.4X", |
810 | opcode)); | 810 | opcode)); |
811 | return_ACPI_STATUS(AE_AML_OPERAND_TYPE); | 811 | return_ACPI_STATUS(AE_AML_OPERAND_TYPE); |
812 | } | 812 | } |
@@ -816,7 +816,7 @@ acpi_ds_init_object_from_op(struct acpi_walk_state *walk_state, | |||
816 | 816 | ||
817 | default: | 817 | default: |
818 | 818 | ||
819 | ACPI_ERROR((AE_INFO, "Unimplemented data type: %X", | 819 | ACPI_ERROR((AE_INFO, "Unimplemented data type: 0x%X", |
820 | obj_desc->common.type)); | 820 | obj_desc->common.type)); |
821 | 821 | ||
822 | status = AE_AML_OPERAND_TYPE; | 822 | status = AE_AML_OPERAND_TYPE; |
diff --git a/drivers/acpi/acpica/dsopcode.c b/drivers/acpi/acpica/dsopcode.c index bf980cadb1e8..53a7e416f33e 100644 --- a/drivers/acpi/acpica/dsopcode.c +++ b/drivers/acpi/acpica/dsopcode.c | |||
@@ -292,7 +292,7 @@ acpi_status acpi_ds_get_buffer_arguments(union acpi_operand_object *obj_desc) | |||
292 | node = obj_desc->buffer.node; | 292 | node = obj_desc->buffer.node; |
293 | if (!node) { | 293 | if (!node) { |
294 | ACPI_ERROR((AE_INFO, | 294 | ACPI_ERROR((AE_INFO, |
295 | "No pointer back to NS node in buffer obj %p", | 295 | "No pointer back to namespace node in buffer object %p", |
296 | obj_desc)); | 296 | obj_desc)); |
297 | return_ACPI_STATUS(AE_AML_INTERNAL); | 297 | return_ACPI_STATUS(AE_AML_INTERNAL); |
298 | } | 298 | } |
@@ -336,7 +336,7 @@ acpi_status acpi_ds_get_package_arguments(union acpi_operand_object *obj_desc) | |||
336 | node = obj_desc->package.node; | 336 | node = obj_desc->package.node; |
337 | if (!node) { | 337 | if (!node) { |
338 | ACPI_ERROR((AE_INFO, | 338 | ACPI_ERROR((AE_INFO, |
339 | "No pointer back to NS node in package %p", | 339 | "No pointer back to namespace node in package %p", |
340 | obj_desc)); | 340 | obj_desc)); |
341 | return_ACPI_STATUS(AE_AML_INTERNAL); | 341 | return_ACPI_STATUS(AE_AML_INTERNAL); |
342 | } | 342 | } |
@@ -580,7 +580,8 @@ acpi_ds_init_buffer_field(u16 aml_opcode, | |||
580 | default: | 580 | default: |
581 | 581 | ||
582 | ACPI_ERROR((AE_INFO, | 582 | ACPI_ERROR((AE_INFO, |
583 | "Unknown field creation opcode %02x", aml_opcode)); | 583 | "Unknown field creation opcode 0x%02X", |
584 | aml_opcode)); | ||
584 | status = AE_AML_BAD_OPCODE; | 585 | status = AE_AML_BAD_OPCODE; |
585 | goto cleanup; | 586 | goto cleanup; |
586 | } | 587 | } |
@@ -589,7 +590,7 @@ acpi_ds_init_buffer_field(u16 aml_opcode, | |||
589 | 590 | ||
590 | if ((bit_offset + bit_count) > (8 * (u32) buffer_desc->buffer.length)) { | 591 | if ((bit_offset + bit_count) > (8 * (u32) buffer_desc->buffer.length)) { |
591 | ACPI_ERROR((AE_INFO, | 592 | ACPI_ERROR((AE_INFO, |
592 | "Field [%4.4s] at %d exceeds Buffer [%4.4s] size %d (bits)", | 593 | "Field [%4.4s] at %u exceeds Buffer [%4.4s] size %u (bits)", |
593 | acpi_ut_get_node_name(result_desc), | 594 | acpi_ut_get_node_name(result_desc), |
594 | bit_offset + bit_count, | 595 | bit_offset + bit_count, |
595 | acpi_ut_get_node_name(buffer_desc->buffer.node), | 596 | acpi_ut_get_node_name(buffer_desc->buffer.node), |
@@ -693,7 +694,7 @@ acpi_ds_eval_buffer_field_operands(struct acpi_walk_state *walk_state, | |||
693 | status = acpi_ex_resolve_operands(op->common.aml_opcode, | 694 | status = acpi_ex_resolve_operands(op->common.aml_opcode, |
694 | ACPI_WALK_OPERANDS, walk_state); | 695 | ACPI_WALK_OPERANDS, walk_state); |
695 | if (ACPI_FAILURE(status)) { | 696 | if (ACPI_FAILURE(status)) { |
696 | ACPI_ERROR((AE_INFO, "(%s) bad operand(s) (%X)", | 697 | ACPI_ERROR((AE_INFO, "(%s) bad operand(s), status 0x%X", |
697 | acpi_ps_get_opcode_name(op->common.aml_opcode), | 698 | acpi_ps_get_opcode_name(op->common.aml_opcode), |
698 | status)); | 699 | status)); |
699 | 700 | ||
@@ -1461,7 +1462,7 @@ acpi_ds_exec_end_control_op(struct acpi_walk_state * walk_state, | |||
1461 | 1462 | ||
1462 | default: | 1463 | default: |
1463 | 1464 | ||
1464 | ACPI_ERROR((AE_INFO, "Unknown control opcode=%X Op=%p", | 1465 | ACPI_ERROR((AE_INFO, "Unknown control opcode=0x%X Op=%p", |
1465 | op->common.aml_opcode, op)); | 1466 | op->common.aml_opcode, op)); |
1466 | 1467 | ||
1467 | status = AE_AML_BAD_OPCODE; | 1468 | status = AE_AML_BAD_OPCODE; |
diff --git a/drivers/acpi/acpica/dswexec.c b/drivers/acpi/acpica/dswexec.c index 6b76c486d784..d555b374e314 100644 --- a/drivers/acpi/acpica/dswexec.c +++ b/drivers/acpi/acpica/dswexec.c | |||
@@ -140,7 +140,7 @@ acpi_ds_get_predicate_value(struct acpi_walk_state *walk_state, | |||
140 | 140 | ||
141 | if (local_obj_desc->common.type != ACPI_TYPE_INTEGER) { | 141 | if (local_obj_desc->common.type != ACPI_TYPE_INTEGER) { |
142 | ACPI_ERROR((AE_INFO, | 142 | ACPI_ERROR((AE_INFO, |
143 | "Bad predicate (not an integer) ObjDesc=%p State=%p Type=%X", | 143 | "Bad predicate (not an integer) ObjDesc=%p State=%p Type=0x%X", |
144 | obj_desc, walk_state, obj_desc->common.type)); | 144 | obj_desc, walk_state, obj_desc->common.type)); |
145 | 145 | ||
146 | status = AE_AML_OPERAND_TYPE; | 146 | status = AE_AML_OPERAND_TYPE; |
@@ -354,7 +354,7 @@ acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *walk_state) | |||
354 | op_class = walk_state->op_info->class; | 354 | op_class = walk_state->op_info->class; |
355 | 355 | ||
356 | if (op_class == AML_CLASS_UNKNOWN) { | 356 | if (op_class == AML_CLASS_UNKNOWN) { |
357 | ACPI_ERROR((AE_INFO, "Unknown opcode %X", | 357 | ACPI_ERROR((AE_INFO, "Unknown opcode 0x%X", |
358 | op->common.aml_opcode)); | 358 | op->common.aml_opcode)); |
359 | return_ACPI_STATUS(AE_NOT_IMPLEMENTED); | 359 | return_ACPI_STATUS(AE_NOT_IMPLEMENTED); |
360 | } | 360 | } |
@@ -678,7 +678,7 @@ acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *walk_state) | |||
678 | default: | 678 | default: |
679 | 679 | ||
680 | ACPI_ERROR((AE_INFO, | 680 | ACPI_ERROR((AE_INFO, |
681 | "Unimplemented opcode, class=%X type=%X Opcode=%X Op=%p", | 681 | "Unimplemented opcode, class=0x%X type=0x%X Opcode=-0x%X Op=%p", |
682 | op_class, op_type, op->common.aml_opcode, | 682 | op_class, op_type, op->common.aml_opcode, |
683 | op)); | 683 | op)); |
684 | 684 | ||
diff --git a/drivers/acpi/acpica/dswstate.c b/drivers/acpi/acpica/dswstate.c index 050df8164165..83155dd8671e 100644 --- a/drivers/acpi/acpica/dswstate.c +++ b/drivers/acpi/acpica/dswstate.c | |||
@@ -179,7 +179,7 @@ acpi_ds_result_push(union acpi_operand_object * object, | |||
179 | 179 | ||
180 | if (!object) { | 180 | if (!object) { |
181 | ACPI_ERROR((AE_INFO, | 181 | ACPI_ERROR((AE_INFO, |
182 | "Null Object! Obj=%p State=%p Num=%X", | 182 | "Null Object! Obj=%p State=%p Num=%u", |
183 | object, walk_state, walk_state->result_count)); | 183 | object, walk_state, walk_state->result_count)); |
184 | return (AE_BAD_PARAMETER); | 184 | return (AE_BAD_PARAMETER); |
185 | } | 185 | } |
@@ -223,7 +223,7 @@ static acpi_status acpi_ds_result_stack_push(struct acpi_walk_state *walk_state) | |||
223 | 223 | ||
224 | if (((u32) walk_state->result_size + ACPI_RESULTS_FRAME_OBJ_NUM) > | 224 | if (((u32) walk_state->result_size + ACPI_RESULTS_FRAME_OBJ_NUM) > |
225 | ACPI_RESULTS_OBJ_NUM_MAX) { | 225 | ACPI_RESULTS_OBJ_NUM_MAX) { |
226 | ACPI_ERROR((AE_INFO, "Result stack overflow: State=%p Num=%X", | 226 | ACPI_ERROR((AE_INFO, "Result stack overflow: State=%p Num=%u", |
227 | walk_state, walk_state->result_size)); | 227 | walk_state, walk_state->result_size)); |
228 | return (AE_STACK_OVERFLOW); | 228 | return (AE_STACK_OVERFLOW); |
229 | } | 229 | } |
@@ -314,7 +314,7 @@ acpi_ds_obj_stack_push(void *object, struct acpi_walk_state * walk_state) | |||
314 | 314 | ||
315 | if (walk_state->num_operands >= ACPI_OBJ_NUM_OPERANDS) { | 315 | if (walk_state->num_operands >= ACPI_OBJ_NUM_OPERANDS) { |
316 | ACPI_ERROR((AE_INFO, | 316 | ACPI_ERROR((AE_INFO, |
317 | "Object stack overflow! Obj=%p State=%p #Ops=%X", | 317 | "Object stack overflow! Obj=%p State=%p #Ops=%u", |
318 | object, walk_state, walk_state->num_operands)); | 318 | object, walk_state, walk_state->num_operands)); |
319 | return (AE_STACK_OVERFLOW); | 319 | return (AE_STACK_OVERFLOW); |
320 | } | 320 | } |
@@ -365,7 +365,7 @@ acpi_ds_obj_stack_pop(u32 pop_count, struct acpi_walk_state * walk_state) | |||
365 | 365 | ||
366 | if (walk_state->num_operands == 0) { | 366 | if (walk_state->num_operands == 0) { |
367 | ACPI_ERROR((AE_INFO, | 367 | ACPI_ERROR((AE_INFO, |
368 | "Object stack underflow! Count=%X State=%p #Ops=%X", | 368 | "Object stack underflow! Count=%X State=%p #Ops=%u", |
369 | pop_count, walk_state, | 369 | pop_count, walk_state, |
370 | walk_state->num_operands)); | 370 | walk_state->num_operands)); |
371 | return (AE_STACK_UNDERFLOW); | 371 | return (AE_STACK_UNDERFLOW); |
@@ -377,7 +377,7 @@ acpi_ds_obj_stack_pop(u32 pop_count, struct acpi_walk_state * walk_state) | |||
377 | walk_state->operands[walk_state->num_operands] = NULL; | 377 | walk_state->operands[walk_state->num_operands] = NULL; |
378 | } | 378 | } |
379 | 379 | ||
380 | ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "Count=%X State=%p #Ops=%X\n", | 380 | ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "Count=%X State=%p #Ops=%u\n", |
381 | pop_count, walk_state, walk_state->num_operands)); | 381 | pop_count, walk_state, walk_state->num_operands)); |
382 | 382 | ||
383 | return (AE_OK); | 383 | return (AE_OK); |
diff --git a/drivers/acpi/acpica/evevent.c b/drivers/acpi/acpica/evevent.c index c1e6f472d435..f5795915a2e9 100644 --- a/drivers/acpi/acpica/evevent.c +++ b/drivers/acpi/acpica/evevent.c | |||
@@ -302,7 +302,7 @@ static u32 acpi_ev_fixed_event_dispatch(u32 event) | |||
302 | ACPI_DISABLE_EVENT); | 302 | ACPI_DISABLE_EVENT); |
303 | 303 | ||
304 | ACPI_ERROR((AE_INFO, | 304 | ACPI_ERROR((AE_INFO, |
305 | "No installed handler for fixed event [%08X]", | 305 | "No installed handler for fixed event [0x%08X]", |
306 | event)); | 306 | event)); |
307 | 307 | ||
308 | return (ACPI_INTERRUPT_NOT_HANDLED); | 308 | return (ACPI_INTERRUPT_NOT_HANDLED); |
diff --git a/drivers/acpi/acpica/evgpe.c b/drivers/acpi/acpica/evgpe.c index 78c55508aff5..a221ad404167 100644 --- a/drivers/acpi/acpica/evgpe.c +++ b/drivers/acpi/acpica/evgpe.c | |||
@@ -60,7 +60,8 @@ static void ACPI_SYSTEM_XFACE acpi_ev_asynch_execute_gpe_method(void *context); | |||
60 | * | 60 | * |
61 | * RETURN: Status | 61 | * RETURN: Status |
62 | * | 62 | * |
63 | * DESCRIPTION: Updates GPE register enable masks based on the GPE type | 63 | * DESCRIPTION: Updates GPE register enable masks based upon whether there are |
64 | * references (either wake or run) to this GPE | ||
64 | * | 65 | * |
65 | ******************************************************************************/ | 66 | ******************************************************************************/ |
66 | 67 | ||
@@ -81,14 +82,20 @@ acpi_ev_update_gpe_enable_masks(struct acpi_gpe_event_info *gpe_event_info) | |||
81 | (1 << | 82 | (1 << |
82 | (gpe_event_info->gpe_number - gpe_register_info->base_gpe_number)); | 83 | (gpe_event_info->gpe_number - gpe_register_info->base_gpe_number)); |
83 | 84 | ||
85 | /* Clear the wake/run bits up front */ | ||
86 | |||
84 | ACPI_CLEAR_BIT(gpe_register_info->enable_for_wake, register_bit); | 87 | ACPI_CLEAR_BIT(gpe_register_info->enable_for_wake, register_bit); |
85 | ACPI_CLEAR_BIT(gpe_register_info->enable_for_run, register_bit); | 88 | ACPI_CLEAR_BIT(gpe_register_info->enable_for_run, register_bit); |
86 | 89 | ||
87 | if (gpe_event_info->runtime_count) | 90 | /* Set the mask bits only if there are references to this GPE */ |
91 | |||
92 | if (gpe_event_info->runtime_count) { | ||
88 | ACPI_SET_BIT(gpe_register_info->enable_for_run, register_bit); | 93 | ACPI_SET_BIT(gpe_register_info->enable_for_run, register_bit); |
94 | } | ||
89 | 95 | ||
90 | if (gpe_event_info->wakeup_count) | 96 | if (gpe_event_info->wakeup_count) { |
91 | ACPI_SET_BIT(gpe_register_info->enable_for_wake, register_bit); | 97 | ACPI_SET_BIT(gpe_register_info->enable_for_wake, register_bit); |
98 | } | ||
92 | 99 | ||
93 | return_ACPI_STATUS(AE_OK); | 100 | return_ACPI_STATUS(AE_OK); |
94 | } | 101 | } |
@@ -101,7 +108,10 @@ acpi_ev_update_gpe_enable_masks(struct acpi_gpe_event_info *gpe_event_info) | |||
101 | * | 108 | * |
102 | * RETURN: Status | 109 | * RETURN: Status |
103 | * | 110 | * |
104 | * DESCRIPTION: Enable a GPE based on the GPE type | 111 | * DESCRIPTION: Hardware-enable a GPE. Always enables the GPE, regardless |
112 | * of type or number of references. | ||
113 | * | ||
114 | * Note: The GPE lock should be already acquired when this function is called. | ||
105 | * | 115 | * |
106 | ******************************************************************************/ | 116 | ******************************************************************************/ |
107 | 117 | ||
@@ -109,20 +119,36 @@ acpi_status acpi_ev_enable_gpe(struct acpi_gpe_event_info *gpe_event_info) | |||
109 | { | 119 | { |
110 | acpi_status status; | 120 | acpi_status status; |
111 | 121 | ||
122 | |||
112 | ACPI_FUNCTION_TRACE(ev_enable_gpe); | 123 | ACPI_FUNCTION_TRACE(ev_enable_gpe); |
113 | 124 | ||
114 | /* Make sure HW enable masks are updated */ | 125 | |
126 | /* | ||
127 | * We will only allow a GPE to be enabled if it has either an | ||
128 | * associated method (_Lxx/_Exx) or a handler. Otherwise, the | ||
129 | * GPE will be immediately disabled by acpi_ev_gpe_dispatch the | ||
130 | * first time it fires. | ||
131 | */ | ||
132 | if (!(gpe_event_info->flags & ACPI_GPE_DISPATCH_MASK)) { | ||
133 | return_ACPI_STATUS(AE_NO_HANDLER); | ||
134 | } | ||
135 | |||
136 | /* Ensure the HW enable masks are current */ | ||
115 | 137 | ||
116 | status = acpi_ev_update_gpe_enable_masks(gpe_event_info); | 138 | status = acpi_ev_update_gpe_enable_masks(gpe_event_info); |
117 | if (ACPI_FAILURE(status)) | 139 | if (ACPI_FAILURE(status)) { |
118 | return_ACPI_STATUS(status); | 140 | return_ACPI_STATUS(status); |
141 | } | ||
142 | |||
143 | /* Clear the GPE (of stale events) */ | ||
119 | 144 | ||
120 | /* Clear the GPE (of stale events), then enable it */ | ||
121 | status = acpi_hw_clear_gpe(gpe_event_info); | 145 | status = acpi_hw_clear_gpe(gpe_event_info); |
122 | if (ACPI_FAILURE(status)) | 146 | if (ACPI_FAILURE(status)) { |
123 | return_ACPI_STATUS(status); | 147 | return_ACPI_STATUS(status); |
148 | } | ||
124 | 149 | ||
125 | /* Enable the requested GPE */ | 150 | /* Enable the requested GPE */ |
151 | |||
126 | status = acpi_hw_write_gpe_enable_reg(gpe_event_info); | 152 | status = acpi_hw_write_gpe_enable_reg(gpe_event_info); |
127 | return_ACPI_STATUS(status); | 153 | return_ACPI_STATUS(status); |
128 | } | 154 | } |
@@ -135,7 +161,10 @@ acpi_status acpi_ev_enable_gpe(struct acpi_gpe_event_info *gpe_event_info) | |||
135 | * | 161 | * |
136 | * RETURN: Status | 162 | * RETURN: Status |
137 | * | 163 | * |
138 | * DESCRIPTION: Disable a GPE based on the GPE type | 164 | * DESCRIPTION: Hardware-disable a GPE. Always disables the requested GPE, |
165 | * regardless of the type or number of references. | ||
166 | * | ||
167 | * Note: The GPE lock should be already acquired when this function is called. | ||
139 | * | 168 | * |
140 | ******************************************************************************/ | 169 | ******************************************************************************/ |
141 | 170 | ||
@@ -145,24 +174,71 @@ acpi_status acpi_ev_disable_gpe(struct acpi_gpe_event_info *gpe_event_info) | |||
145 | 174 | ||
146 | ACPI_FUNCTION_TRACE(ev_disable_gpe); | 175 | ACPI_FUNCTION_TRACE(ev_disable_gpe); |
147 | 176 | ||
148 | /* Make sure HW enable masks are updated */ | 177 | |
178 | /* | ||
179 | * Note: Always disable the GPE, even if we think that that it is already | ||
180 | * disabled. It is possible that the AML or some other code has enabled | ||
181 | * the GPE behind our back. | ||
182 | */ | ||
183 | |||
184 | /* Ensure the HW enable masks are current */ | ||
149 | 185 | ||
150 | status = acpi_ev_update_gpe_enable_masks(gpe_event_info); | 186 | status = acpi_ev_update_gpe_enable_masks(gpe_event_info); |
151 | if (ACPI_FAILURE(status)) | 187 | if (ACPI_FAILURE(status)) { |
152 | return_ACPI_STATUS(status); | 188 | return_ACPI_STATUS(status); |
189 | } | ||
153 | 190 | ||
154 | /* | 191 | /* |
155 | * Even if we don't know the GPE type, make sure that we always | 192 | * Always H/W disable this GPE, even if we don't know the GPE type. |
156 | * disable it. low_disable_gpe will just clear the enable bit for this | 193 | * Simply clear the enable bit for this particular GPE, but do not |
157 | * GPE and write it. It will not write out the current GPE enable mask, | 194 | * write out the current GPE enable mask since this may inadvertently |
158 | * since this may inadvertently enable GPEs too early, if a rogue GPE has | 195 | * enable GPEs too early. An example is a rogue GPE that has arrived |
159 | * come in during ACPICA initialization - possibly as a result of AML or | 196 | * during ACPICA initialization - possibly because AML or other code |
160 | * other code that has enabled the GPE. | 197 | * has enabled the GPE. |
161 | */ | 198 | */ |
162 | status = acpi_hw_low_disable_gpe(gpe_event_info); | 199 | status = acpi_hw_low_disable_gpe(gpe_event_info); |
163 | return_ACPI_STATUS(status); | 200 | return_ACPI_STATUS(status); |
164 | } | 201 | } |
165 | 202 | ||
203 | |||
204 | /******************************************************************************* | ||
205 | * | ||
206 | * FUNCTION: acpi_ev_low_get_gpe_info | ||
207 | * | ||
208 | * PARAMETERS: gpe_number - Raw GPE number | ||
209 | * gpe_block - A GPE info block | ||
210 | * | ||
211 | * RETURN: A GPE event_info struct. NULL if not a valid GPE (The gpe_number | ||
212 | * is not within the specified GPE block) | ||
213 | * | ||
214 | * DESCRIPTION: Returns the event_info struct associated with this GPE. This is | ||
215 | * the low-level implementation of ev_get_gpe_event_info. | ||
216 | * | ||
217 | ******************************************************************************/ | ||
218 | |||
219 | struct acpi_gpe_event_info *acpi_ev_low_get_gpe_info(u32 gpe_number, | ||
220 | struct acpi_gpe_block_info | ||
221 | *gpe_block) | ||
222 | { | ||
223 | u32 gpe_index; | ||
224 | |||
225 | /* | ||
226 | * Validate that the gpe_number is within the specified gpe_block. | ||
227 | * (Two steps) | ||
228 | */ | ||
229 | if (!gpe_block || (gpe_number < gpe_block->block_base_number)) { | ||
230 | return (NULL); | ||
231 | } | ||
232 | |||
233 | gpe_index = gpe_number - gpe_block->block_base_number; | ||
234 | if (gpe_index >= gpe_block->gpe_count) { | ||
235 | return (NULL); | ||
236 | } | ||
237 | |||
238 | return (&gpe_block->event_info[gpe_index]); | ||
239 | } | ||
240 | |||
241 | |||
166 | /******************************************************************************* | 242 | /******************************************************************************* |
167 | * | 243 | * |
168 | * FUNCTION: acpi_ev_get_gpe_event_info | 244 | * FUNCTION: acpi_ev_get_gpe_event_info |
@@ -184,29 +260,23 @@ struct acpi_gpe_event_info *acpi_ev_get_gpe_event_info(acpi_handle gpe_device, | |||
184 | u32 gpe_number) | 260 | u32 gpe_number) |
185 | { | 261 | { |
186 | union acpi_operand_object *obj_desc; | 262 | union acpi_operand_object *obj_desc; |
187 | struct acpi_gpe_block_info *gpe_block; | 263 | struct acpi_gpe_event_info *gpe_info; |
188 | u32 i; | 264 | u32 i; |
189 | 265 | ||
190 | ACPI_FUNCTION_ENTRY(); | 266 | ACPI_FUNCTION_ENTRY(); |
191 | 267 | ||
192 | /* A NULL gpe_block means use the FADT-defined GPE block(s) */ | 268 | /* A NULL gpe_device means use the FADT-defined GPE block(s) */ |
193 | 269 | ||
194 | if (!gpe_device) { | 270 | if (!gpe_device) { |
195 | 271 | ||
196 | /* Examine GPE Block 0 and 1 (These blocks are permanent) */ | 272 | /* Examine GPE Block 0 and 1 (These blocks are permanent) */ |
197 | 273 | ||
198 | for (i = 0; i < ACPI_MAX_GPE_BLOCKS; i++) { | 274 | for (i = 0; i < ACPI_MAX_GPE_BLOCKS; i++) { |
199 | gpe_block = acpi_gbl_gpe_fadt_blocks[i]; | 275 | gpe_info = acpi_ev_low_get_gpe_info(gpe_number, |
200 | if (gpe_block) { | 276 | acpi_gbl_gpe_fadt_blocks |
201 | if ((gpe_number >= gpe_block->block_base_number) | 277 | [i]); |
202 | && (gpe_number < | 278 | if (gpe_info) { |
203 | gpe_block->block_base_number + | 279 | return (gpe_info); |
204 | (gpe_block->register_count * 8))) { | ||
205 | return (&gpe_block-> | ||
206 | event_info[gpe_number - | ||
207 | gpe_block-> | ||
208 | block_base_number]); | ||
209 | } | ||
210 | } | 280 | } |
211 | } | 281 | } |
212 | 282 | ||
@@ -223,16 +293,8 @@ struct acpi_gpe_event_info *acpi_ev_get_gpe_event_info(acpi_handle gpe_device, | |||
223 | return (NULL); | 293 | return (NULL); |
224 | } | 294 | } |
225 | 295 | ||
226 | gpe_block = obj_desc->device.gpe_block; | 296 | return (acpi_ev_low_get_gpe_info |
227 | 297 | (gpe_number, obj_desc->device.gpe_block)); | |
228 | if ((gpe_number >= gpe_block->block_base_number) && | ||
229 | (gpe_number < | ||
230 | gpe_block->block_base_number + (gpe_block->register_count * 8))) { | ||
231 | return (&gpe_block-> | ||
232 | event_info[gpe_number - gpe_block->block_base_number]); | ||
233 | } | ||
234 | |||
235 | return (NULL); | ||
236 | } | 298 | } |
237 | 299 | ||
238 | /******************************************************************************* | 300 | /******************************************************************************* |
@@ -389,7 +451,7 @@ static void ACPI_SYSTEM_XFACE acpi_ev_asynch_execute_gpe_method(void *context) | |||
389 | return_VOID; | 451 | return_VOID; |
390 | } | 452 | } |
391 | 453 | ||
392 | /* Set the GPE flags for return to enabled state */ | 454 | /* Update the GPE register masks for return to enabled state */ |
393 | 455 | ||
394 | (void)acpi_ev_update_gpe_enable_masks(gpe_event_info); | 456 | (void)acpi_ev_update_gpe_enable_masks(gpe_event_info); |
395 | 457 | ||
@@ -499,7 +561,7 @@ acpi_ev_gpe_dispatch(struct acpi_gpe_event_info *gpe_event_info, u32 gpe_number) | |||
499 | status = acpi_hw_clear_gpe(gpe_event_info); | 561 | status = acpi_hw_clear_gpe(gpe_event_info); |
500 | if (ACPI_FAILURE(status)) { | 562 | if (ACPI_FAILURE(status)) { |
501 | ACPI_EXCEPTION((AE_INFO, status, | 563 | ACPI_EXCEPTION((AE_INFO, status, |
502 | "Unable to clear GPE[%2X]", | 564 | "Unable to clear GPE[0x%2X]", |
503 | gpe_number)); | 565 | gpe_number)); |
504 | return_UINT32(ACPI_INTERRUPT_NOT_HANDLED); | 566 | return_UINT32(ACPI_INTERRUPT_NOT_HANDLED); |
505 | } | 567 | } |
@@ -532,7 +594,7 @@ acpi_ev_gpe_dispatch(struct acpi_gpe_event_info *gpe_event_info, u32 gpe_number) | |||
532 | status = acpi_hw_clear_gpe(gpe_event_info); | 594 | status = acpi_hw_clear_gpe(gpe_event_info); |
533 | if (ACPI_FAILURE(status)) { | 595 | if (ACPI_FAILURE(status)) { |
534 | ACPI_EXCEPTION((AE_INFO, status, | 596 | ACPI_EXCEPTION((AE_INFO, status, |
535 | "Unable to clear GPE[%2X]", | 597 | "Unable to clear GPE[0x%2X]", |
536 | gpe_number)); | 598 | gpe_number)); |
537 | return_UINT32(ACPI_INTERRUPT_NOT_HANDLED); | 599 | return_UINT32(ACPI_INTERRUPT_NOT_HANDLED); |
538 | } | 600 | } |
@@ -548,7 +610,7 @@ acpi_ev_gpe_dispatch(struct acpi_gpe_event_info *gpe_event_info, u32 gpe_number) | |||
548 | status = acpi_ev_disable_gpe(gpe_event_info); | 610 | status = acpi_ev_disable_gpe(gpe_event_info); |
549 | if (ACPI_FAILURE(status)) { | 611 | if (ACPI_FAILURE(status)) { |
550 | ACPI_EXCEPTION((AE_INFO, status, | 612 | ACPI_EXCEPTION((AE_INFO, status, |
551 | "Unable to disable GPE[%2X]", | 613 | "Unable to disable GPE[0x%2X]", |
552 | gpe_number)); | 614 | gpe_number)); |
553 | return_UINT32(ACPI_INTERRUPT_NOT_HANDLED); | 615 | return_UINT32(ACPI_INTERRUPT_NOT_HANDLED); |
554 | } | 616 | } |
@@ -562,27 +624,30 @@ acpi_ev_gpe_dispatch(struct acpi_gpe_event_info *gpe_event_info, u32 gpe_number) | |||
562 | gpe_event_info); | 624 | gpe_event_info); |
563 | if (ACPI_FAILURE(status)) { | 625 | if (ACPI_FAILURE(status)) { |
564 | ACPI_EXCEPTION((AE_INFO, status, | 626 | ACPI_EXCEPTION((AE_INFO, status, |
565 | "Unable to queue handler for GPE[%2X] - event disabled", | 627 | "Unable to queue handler for GPE[0x%2X] - event disabled", |
566 | gpe_number)); | 628 | gpe_number)); |
567 | } | 629 | } |
568 | break; | 630 | break; |
569 | 631 | ||
570 | default: | 632 | default: |
571 | 633 | ||
572 | /* No handler or method to run! */ | 634 | /* |
573 | 635 | * No handler or method to run! | |
636 | * 03/2010: This case should no longer be possible. We will not allow | ||
637 | * a GPE to be enabled if it has no handler or method. | ||
638 | */ | ||
574 | ACPI_ERROR((AE_INFO, | 639 | ACPI_ERROR((AE_INFO, |
575 | "No handler or method for GPE[%2X], disabling event", | 640 | "No handler or method for GPE[0x%2X], disabling event", |
576 | gpe_number)); | 641 | gpe_number)); |
577 | 642 | ||
578 | /* | 643 | /* |
579 | * Disable the GPE. The GPE will remain disabled until the ACPICA | 644 | * Disable the GPE. The GPE will remain disabled a handler |
580 | * Core Subsystem is restarted, or a handler is installed. | 645 | * is installed or ACPICA is restarted. |
581 | */ | 646 | */ |
582 | status = acpi_ev_disable_gpe(gpe_event_info); | 647 | status = acpi_ev_disable_gpe(gpe_event_info); |
583 | if (ACPI_FAILURE(status)) { | 648 | if (ACPI_FAILURE(status)) { |
584 | ACPI_EXCEPTION((AE_INFO, status, | 649 | ACPI_EXCEPTION((AE_INFO, status, |
585 | "Unable to disable GPE[%2X]", | 650 | "Unable to disable GPE[0x%2X]", |
586 | gpe_number)); | 651 | gpe_number)); |
587 | return_UINT32(ACPI_INTERRUPT_NOT_HANDLED); | 652 | return_UINT32(ACPI_INTERRUPT_NOT_HANDLED); |
588 | } | 653 | } |
diff --git a/drivers/acpi/acpica/evgpeblk.c b/drivers/acpi/acpica/evgpeblk.c index fef721917eaf..7c28f2d9fd35 100644 --- a/drivers/acpi/acpica/evgpeblk.c +++ b/drivers/acpi/acpica/evgpeblk.c | |||
@@ -51,20 +51,6 @@ ACPI_MODULE_NAME("evgpeblk") | |||
51 | 51 | ||
52 | /* Local prototypes */ | 52 | /* Local prototypes */ |
53 | static acpi_status | 53 | static acpi_status |
54 | acpi_ev_save_method_info(acpi_handle obj_handle, | ||
55 | u32 level, void *obj_desc, void **return_value); | ||
56 | |||
57 | static acpi_status | ||
58 | acpi_ev_match_prw_and_gpe(acpi_handle obj_handle, | ||
59 | u32 level, void *info, void **return_value); | ||
60 | |||
61 | static struct acpi_gpe_xrupt_info *acpi_ev_get_gpe_xrupt_block(u32 | ||
62 | interrupt_number); | ||
63 | |||
64 | static acpi_status | ||
65 | acpi_ev_delete_gpe_xrupt(struct acpi_gpe_xrupt_info *gpe_xrupt); | ||
66 | |||
67 | static acpi_status | ||
68 | acpi_ev_install_gpe_block(struct acpi_gpe_block_info *gpe_block, | 54 | acpi_ev_install_gpe_block(struct acpi_gpe_block_info *gpe_block, |
69 | u32 interrupt_number); | 55 | u32 interrupt_number); |
70 | 56 | ||
@@ -73,527 +59,6 @@ acpi_ev_create_gpe_info_blocks(struct acpi_gpe_block_info *gpe_block); | |||
73 | 59 | ||
74 | /******************************************************************************* | 60 | /******************************************************************************* |
75 | * | 61 | * |
76 | * FUNCTION: acpi_ev_valid_gpe_event | ||
77 | * | ||
78 | * PARAMETERS: gpe_event_info - Info for this GPE | ||
79 | * | ||
80 | * RETURN: TRUE if the gpe_event is valid | ||
81 | * | ||
82 | * DESCRIPTION: Validate a GPE event. DO NOT CALL FROM INTERRUPT LEVEL. | ||
83 | * Should be called only when the GPE lists are semaphore locked | ||
84 | * and not subject to change. | ||
85 | * | ||
86 | ******************************************************************************/ | ||
87 | |||
88 | u8 acpi_ev_valid_gpe_event(struct acpi_gpe_event_info *gpe_event_info) | ||
89 | { | ||
90 | struct acpi_gpe_xrupt_info *gpe_xrupt_block; | ||
91 | struct acpi_gpe_block_info *gpe_block; | ||
92 | |||
93 | ACPI_FUNCTION_ENTRY(); | ||
94 | |||
95 | /* No need for spin lock since we are not changing any list elements */ | ||
96 | |||
97 | /* Walk the GPE interrupt levels */ | ||
98 | |||
99 | gpe_xrupt_block = acpi_gbl_gpe_xrupt_list_head; | ||
100 | while (gpe_xrupt_block) { | ||
101 | gpe_block = gpe_xrupt_block->gpe_block_list_head; | ||
102 | |||
103 | /* Walk the GPE blocks on this interrupt level */ | ||
104 | |||
105 | while (gpe_block) { | ||
106 | if ((&gpe_block->event_info[0] <= gpe_event_info) && | ||
107 | (&gpe_block->event_info[((acpi_size) | ||
108 | gpe_block-> | ||
109 | register_count) * 8] > | ||
110 | gpe_event_info)) { | ||
111 | return (TRUE); | ||
112 | } | ||
113 | |||
114 | gpe_block = gpe_block->next; | ||
115 | } | ||
116 | |||
117 | gpe_xrupt_block = gpe_xrupt_block->next; | ||
118 | } | ||
119 | |||
120 | return (FALSE); | ||
121 | } | ||
122 | |||
123 | /******************************************************************************* | ||
124 | * | ||
125 | * FUNCTION: acpi_ev_walk_gpe_list | ||
126 | * | ||
127 | * PARAMETERS: gpe_walk_callback - Routine called for each GPE block | ||
128 | * Context - Value passed to callback | ||
129 | * | ||
130 | * RETURN: Status | ||
131 | * | ||
132 | * DESCRIPTION: Walk the GPE lists. | ||
133 | * | ||
134 | ******************************************************************************/ | ||
135 | |||
136 | acpi_status | ||
137 | acpi_ev_walk_gpe_list(acpi_gpe_callback gpe_walk_callback, void *context) | ||
138 | { | ||
139 | struct acpi_gpe_block_info *gpe_block; | ||
140 | struct acpi_gpe_xrupt_info *gpe_xrupt_info; | ||
141 | acpi_status status = AE_OK; | ||
142 | acpi_cpu_flags flags; | ||
143 | |||
144 | ACPI_FUNCTION_TRACE(ev_walk_gpe_list); | ||
145 | |||
146 | flags = acpi_os_acquire_lock(acpi_gbl_gpe_lock); | ||
147 | |||
148 | /* Walk the interrupt level descriptor list */ | ||
149 | |||
150 | gpe_xrupt_info = acpi_gbl_gpe_xrupt_list_head; | ||
151 | while (gpe_xrupt_info) { | ||
152 | |||
153 | /* Walk all Gpe Blocks attached to this interrupt level */ | ||
154 | |||
155 | gpe_block = gpe_xrupt_info->gpe_block_list_head; | ||
156 | while (gpe_block) { | ||
157 | |||
158 | /* One callback per GPE block */ | ||
159 | |||
160 | status = | ||
161 | gpe_walk_callback(gpe_xrupt_info, gpe_block, | ||
162 | context); | ||
163 | if (ACPI_FAILURE(status)) { | ||
164 | if (status == AE_CTRL_END) { /* Callback abort */ | ||
165 | status = AE_OK; | ||
166 | } | ||
167 | goto unlock_and_exit; | ||
168 | } | ||
169 | |||
170 | gpe_block = gpe_block->next; | ||
171 | } | ||
172 | |||
173 | gpe_xrupt_info = gpe_xrupt_info->next; | ||
174 | } | ||
175 | |||
176 | unlock_and_exit: | ||
177 | acpi_os_release_lock(acpi_gbl_gpe_lock, flags); | ||
178 | return_ACPI_STATUS(status); | ||
179 | } | ||
180 | |||
181 | /******************************************************************************* | ||
182 | * | ||
183 | * FUNCTION: acpi_ev_delete_gpe_handlers | ||
184 | * | ||
185 | * PARAMETERS: gpe_xrupt_info - GPE Interrupt info | ||
186 | * gpe_block - Gpe Block info | ||
187 | * | ||
188 | * RETURN: Status | ||
189 | * | ||
190 | * DESCRIPTION: Delete all Handler objects found in the GPE data structs. | ||
191 | * Used only prior to termination. | ||
192 | * | ||
193 | ******************************************************************************/ | ||
194 | |||
195 | acpi_status | ||
196 | acpi_ev_delete_gpe_handlers(struct acpi_gpe_xrupt_info *gpe_xrupt_info, | ||
197 | struct acpi_gpe_block_info *gpe_block, | ||
198 | void *context) | ||
199 | { | ||
200 | struct acpi_gpe_event_info *gpe_event_info; | ||
201 | u32 i; | ||
202 | u32 j; | ||
203 | |||
204 | ACPI_FUNCTION_TRACE(ev_delete_gpe_handlers); | ||
205 | |||
206 | /* Examine each GPE Register within the block */ | ||
207 | |||
208 | for (i = 0; i < gpe_block->register_count; i++) { | ||
209 | |||
210 | /* Now look at the individual GPEs in this byte register */ | ||
211 | |||
212 | for (j = 0; j < ACPI_GPE_REGISTER_WIDTH; j++) { | ||
213 | gpe_event_info = &gpe_block->event_info[((acpi_size) i * | ||
214 | ACPI_GPE_REGISTER_WIDTH) | ||
215 | + j]; | ||
216 | |||
217 | if ((gpe_event_info->flags & ACPI_GPE_DISPATCH_MASK) == | ||
218 | ACPI_GPE_DISPATCH_HANDLER) { | ||
219 | ACPI_FREE(gpe_event_info->dispatch.handler); | ||
220 | gpe_event_info->dispatch.handler = NULL; | ||
221 | gpe_event_info->flags &= | ||
222 | ~ACPI_GPE_DISPATCH_MASK; | ||
223 | } | ||
224 | } | ||
225 | } | ||
226 | |||
227 | return_ACPI_STATUS(AE_OK); | ||
228 | } | ||
229 | |||
230 | /******************************************************************************* | ||
231 | * | ||
232 | * FUNCTION: acpi_ev_save_method_info | ||
233 | * | ||
234 | * PARAMETERS: Callback from walk_namespace | ||
235 | * | ||
236 | * RETURN: Status | ||
237 | * | ||
238 | * DESCRIPTION: Called from acpi_walk_namespace. Expects each object to be a | ||
239 | * control method under the _GPE portion of the namespace. | ||
240 | * Extract the name and GPE type from the object, saving this | ||
241 | * information for quick lookup during GPE dispatch | ||
242 | * | ||
243 | * The name of each GPE control method is of the form: | ||
244 | * "_Lxx" or "_Exx" | ||
245 | * Where: | ||
246 | * L - means that the GPE is level triggered | ||
247 | * E - means that the GPE is edge triggered | ||
248 | * xx - is the GPE number [in HEX] | ||
249 | * | ||
250 | ******************************************************************************/ | ||
251 | |||
252 | static acpi_status | ||
253 | acpi_ev_save_method_info(acpi_handle obj_handle, | ||
254 | u32 level, void *obj_desc, void **return_value) | ||
255 | { | ||
256 | struct acpi_gpe_block_info *gpe_block = (void *)obj_desc; | ||
257 | struct acpi_gpe_event_info *gpe_event_info; | ||
258 | u32 gpe_number; | ||
259 | char name[ACPI_NAME_SIZE + 1]; | ||
260 | u8 type; | ||
261 | |||
262 | ACPI_FUNCTION_TRACE(ev_save_method_info); | ||
263 | |||
264 | /* | ||
265 | * _Lxx and _Exx GPE method support | ||
266 | * | ||
267 | * 1) Extract the name from the object and convert to a string | ||
268 | */ | ||
269 | ACPI_MOVE_32_TO_32(name, | ||
270 | &((struct acpi_namespace_node *)obj_handle)->name. | ||
271 | integer); | ||
272 | name[ACPI_NAME_SIZE] = 0; | ||
273 | |||
274 | /* | ||
275 | * 2) Edge/Level determination is based on the 2nd character | ||
276 | * of the method name | ||
277 | * | ||
278 | * NOTE: Default GPE type is RUNTIME. May be changed later to WAKE | ||
279 | * if a _PRW object is found that points to this GPE. | ||
280 | */ | ||
281 | switch (name[1]) { | ||
282 | case 'L': | ||
283 | type = ACPI_GPE_LEVEL_TRIGGERED; | ||
284 | break; | ||
285 | |||
286 | case 'E': | ||
287 | type = ACPI_GPE_EDGE_TRIGGERED; | ||
288 | break; | ||
289 | |||
290 | default: | ||
291 | /* Unknown method type, just ignore it! */ | ||
292 | |||
293 | ACPI_DEBUG_PRINT((ACPI_DB_LOAD, | ||
294 | "Ignoring unknown GPE method type: %s " | ||
295 | "(name not of form _Lxx or _Exx)", name)); | ||
296 | return_ACPI_STATUS(AE_OK); | ||
297 | } | ||
298 | |||
299 | /* Convert the last two characters of the name to the GPE Number */ | ||
300 | |||
301 | gpe_number = ACPI_STRTOUL(&name[2], NULL, 16); | ||
302 | if (gpe_number == ACPI_UINT32_MAX) { | ||
303 | |||
304 | /* Conversion failed; invalid method, just ignore it */ | ||
305 | |||
306 | ACPI_DEBUG_PRINT((ACPI_DB_LOAD, | ||
307 | "Could not extract GPE number from name: %s " | ||
308 | "(name is not of form _Lxx or _Exx)", name)); | ||
309 | return_ACPI_STATUS(AE_OK); | ||
310 | } | ||
311 | |||
312 | /* Ensure that we have a valid GPE number for this GPE block */ | ||
313 | |||
314 | if ((gpe_number < gpe_block->block_base_number) || | ||
315 | (gpe_number >= (gpe_block->block_base_number + | ||
316 | (gpe_block->register_count * 8)))) { | ||
317 | /* | ||
318 | * Not valid for this GPE block, just ignore it. However, it may be | ||
319 | * valid for a different GPE block, since GPE0 and GPE1 methods both | ||
320 | * appear under \_GPE. | ||
321 | */ | ||
322 | return_ACPI_STATUS(AE_OK); | ||
323 | } | ||
324 | |||
325 | /* | ||
326 | * Now we can add this information to the gpe_event_info block for use | ||
327 | * during dispatch of this GPE. | ||
328 | */ | ||
329 | gpe_event_info = | ||
330 | &gpe_block->event_info[gpe_number - gpe_block->block_base_number]; | ||
331 | |||
332 | gpe_event_info->flags = (u8) (type | ACPI_GPE_DISPATCH_METHOD); | ||
333 | |||
334 | gpe_event_info->dispatch.method_node = | ||
335 | (struct acpi_namespace_node *)obj_handle; | ||
336 | |||
337 | ACPI_DEBUG_PRINT((ACPI_DB_LOAD, | ||
338 | "Registered GPE method %s as GPE number 0x%.2X\n", | ||
339 | name, gpe_number)); | ||
340 | return_ACPI_STATUS(AE_OK); | ||
341 | } | ||
342 | |||
343 | /******************************************************************************* | ||
344 | * | ||
345 | * FUNCTION: acpi_ev_match_prw_and_gpe | ||
346 | * | ||
347 | * PARAMETERS: Callback from walk_namespace | ||
348 | * | ||
349 | * RETURN: Status. NOTE: We ignore errors so that the _PRW walk is | ||
350 | * not aborted on a single _PRW failure. | ||
351 | * | ||
352 | * DESCRIPTION: Called from acpi_walk_namespace. Expects each object to be a | ||
353 | * Device. Run the _PRW method. If present, extract the GPE | ||
354 | * number and mark the GPE as a WAKE GPE. | ||
355 | * | ||
356 | ******************************************************************************/ | ||
357 | |||
358 | static acpi_status | ||
359 | acpi_ev_match_prw_and_gpe(acpi_handle obj_handle, | ||
360 | u32 level, void *info, void **return_value) | ||
361 | { | ||
362 | struct acpi_gpe_walk_info *gpe_info = (void *)info; | ||
363 | struct acpi_namespace_node *gpe_device; | ||
364 | struct acpi_gpe_block_info *gpe_block; | ||
365 | struct acpi_namespace_node *target_gpe_device; | ||
366 | struct acpi_gpe_event_info *gpe_event_info; | ||
367 | union acpi_operand_object *pkg_desc; | ||
368 | union acpi_operand_object *obj_desc; | ||
369 | u32 gpe_number; | ||
370 | acpi_status status; | ||
371 | |||
372 | ACPI_FUNCTION_TRACE(ev_match_prw_and_gpe); | ||
373 | |||
374 | /* Check for a _PRW method under this device */ | ||
375 | |||
376 | status = acpi_ut_evaluate_object(obj_handle, METHOD_NAME__PRW, | ||
377 | ACPI_BTYPE_PACKAGE, &pkg_desc); | ||
378 | if (ACPI_FAILURE(status)) { | ||
379 | |||
380 | /* Ignore all errors from _PRW, we don't want to abort the subsystem */ | ||
381 | |||
382 | return_ACPI_STATUS(AE_OK); | ||
383 | } | ||
384 | |||
385 | /* The returned _PRW package must have at least two elements */ | ||
386 | |||
387 | if (pkg_desc->package.count < 2) { | ||
388 | goto cleanup; | ||
389 | } | ||
390 | |||
391 | /* Extract pointers from the input context */ | ||
392 | |||
393 | gpe_device = gpe_info->gpe_device; | ||
394 | gpe_block = gpe_info->gpe_block; | ||
395 | |||
396 | /* | ||
397 | * The _PRW object must return a package, we are only interested in the | ||
398 | * first element | ||
399 | */ | ||
400 | obj_desc = pkg_desc->package.elements[0]; | ||
401 | |||
402 | if (obj_desc->common.type == ACPI_TYPE_INTEGER) { | ||
403 | |||
404 | /* Use FADT-defined GPE device (from definition of _PRW) */ | ||
405 | |||
406 | target_gpe_device = acpi_gbl_fadt_gpe_device; | ||
407 | |||
408 | /* Integer is the GPE number in the FADT described GPE blocks */ | ||
409 | |||
410 | gpe_number = (u32) obj_desc->integer.value; | ||
411 | } else if (obj_desc->common.type == ACPI_TYPE_PACKAGE) { | ||
412 | |||
413 | /* Package contains a GPE reference and GPE number within a GPE block */ | ||
414 | |||
415 | if ((obj_desc->package.count < 2) || | ||
416 | ((obj_desc->package.elements[0])->common.type != | ||
417 | ACPI_TYPE_LOCAL_REFERENCE) || | ||
418 | ((obj_desc->package.elements[1])->common.type != | ||
419 | ACPI_TYPE_INTEGER)) { | ||
420 | goto cleanup; | ||
421 | } | ||
422 | |||
423 | /* Get GPE block reference and decode */ | ||
424 | |||
425 | target_gpe_device = | ||
426 | obj_desc->package.elements[0]->reference.node; | ||
427 | gpe_number = (u32) obj_desc->package.elements[1]->integer.value; | ||
428 | } else { | ||
429 | /* Unknown type, just ignore it */ | ||
430 | |||
431 | goto cleanup; | ||
432 | } | ||
433 | |||
434 | /* | ||
435 | * Is this GPE within this block? | ||
436 | * | ||
437 | * TRUE if and only if these conditions are true: | ||
438 | * 1) The GPE devices match. | ||
439 | * 2) The GPE index(number) is within the range of the Gpe Block | ||
440 | * associated with the GPE device. | ||
441 | */ | ||
442 | if ((gpe_device == target_gpe_device) && | ||
443 | (gpe_number >= gpe_block->block_base_number) && | ||
444 | (gpe_number < gpe_block->block_base_number + | ||
445 | (gpe_block->register_count * 8))) { | ||
446 | gpe_event_info = &gpe_block->event_info[gpe_number - | ||
447 | gpe_block-> | ||
448 | block_base_number]; | ||
449 | |||
450 | gpe_event_info->flags |= ACPI_GPE_CAN_WAKE; | ||
451 | } | ||
452 | |||
453 | cleanup: | ||
454 | acpi_ut_remove_reference(pkg_desc); | ||
455 | return_ACPI_STATUS(AE_OK); | ||
456 | } | ||
457 | |||
458 | /******************************************************************************* | ||
459 | * | ||
460 | * FUNCTION: acpi_ev_get_gpe_xrupt_block | ||
461 | * | ||
462 | * PARAMETERS: interrupt_number - Interrupt for a GPE block | ||
463 | * | ||
464 | * RETURN: A GPE interrupt block | ||
465 | * | ||
466 | * DESCRIPTION: Get or Create a GPE interrupt block. There is one interrupt | ||
467 | * block per unique interrupt level used for GPEs. Should be | ||
468 | * called only when the GPE lists are semaphore locked and not | ||
469 | * subject to change. | ||
470 | * | ||
471 | ******************************************************************************/ | ||
472 | |||
473 | static struct acpi_gpe_xrupt_info *acpi_ev_get_gpe_xrupt_block(u32 | ||
474 | interrupt_number) | ||
475 | { | ||
476 | struct acpi_gpe_xrupt_info *next_gpe_xrupt; | ||
477 | struct acpi_gpe_xrupt_info *gpe_xrupt; | ||
478 | acpi_status status; | ||
479 | acpi_cpu_flags flags; | ||
480 | |||
481 | ACPI_FUNCTION_TRACE(ev_get_gpe_xrupt_block); | ||
482 | |||
483 | /* No need for lock since we are not changing any list elements here */ | ||
484 | |||
485 | next_gpe_xrupt = acpi_gbl_gpe_xrupt_list_head; | ||
486 | while (next_gpe_xrupt) { | ||
487 | if (next_gpe_xrupt->interrupt_number == interrupt_number) { | ||
488 | return_PTR(next_gpe_xrupt); | ||
489 | } | ||
490 | |||
491 | next_gpe_xrupt = next_gpe_xrupt->next; | ||
492 | } | ||
493 | |||
494 | /* Not found, must allocate a new xrupt descriptor */ | ||
495 | |||
496 | gpe_xrupt = ACPI_ALLOCATE_ZEROED(sizeof(struct acpi_gpe_xrupt_info)); | ||
497 | if (!gpe_xrupt) { | ||
498 | return_PTR(NULL); | ||
499 | } | ||
500 | |||
501 | gpe_xrupt->interrupt_number = interrupt_number; | ||
502 | |||
503 | /* Install new interrupt descriptor with spin lock */ | ||
504 | |||
505 | flags = acpi_os_acquire_lock(acpi_gbl_gpe_lock); | ||
506 | if (acpi_gbl_gpe_xrupt_list_head) { | ||
507 | next_gpe_xrupt = acpi_gbl_gpe_xrupt_list_head; | ||
508 | while (next_gpe_xrupt->next) { | ||
509 | next_gpe_xrupt = next_gpe_xrupt->next; | ||
510 | } | ||
511 | |||
512 | next_gpe_xrupt->next = gpe_xrupt; | ||
513 | gpe_xrupt->previous = next_gpe_xrupt; | ||
514 | } else { | ||
515 | acpi_gbl_gpe_xrupt_list_head = gpe_xrupt; | ||
516 | } | ||
517 | acpi_os_release_lock(acpi_gbl_gpe_lock, flags); | ||
518 | |||
519 | /* Install new interrupt handler if not SCI_INT */ | ||
520 | |||
521 | if (interrupt_number != acpi_gbl_FADT.sci_interrupt) { | ||
522 | status = acpi_os_install_interrupt_handler(interrupt_number, | ||
523 | acpi_ev_gpe_xrupt_handler, | ||
524 | gpe_xrupt); | ||
525 | if (ACPI_FAILURE(status)) { | ||
526 | ACPI_ERROR((AE_INFO, | ||
527 | "Could not install GPE interrupt handler at level 0x%X", | ||
528 | interrupt_number)); | ||
529 | return_PTR(NULL); | ||
530 | } | ||
531 | } | ||
532 | |||
533 | return_PTR(gpe_xrupt); | ||
534 | } | ||
535 | |||
536 | /******************************************************************************* | ||
537 | * | ||
538 | * FUNCTION: acpi_ev_delete_gpe_xrupt | ||
539 | * | ||
540 | * PARAMETERS: gpe_xrupt - A GPE interrupt info block | ||
541 | * | ||
542 | * RETURN: Status | ||
543 | * | ||
544 | * DESCRIPTION: Remove and free a gpe_xrupt block. Remove an associated | ||
545 | * interrupt handler if not the SCI interrupt. | ||
546 | * | ||
547 | ******************************************************************************/ | ||
548 | |||
549 | static acpi_status | ||
550 | acpi_ev_delete_gpe_xrupt(struct acpi_gpe_xrupt_info *gpe_xrupt) | ||
551 | { | ||
552 | acpi_status status; | ||
553 | acpi_cpu_flags flags; | ||
554 | |||
555 | ACPI_FUNCTION_TRACE(ev_delete_gpe_xrupt); | ||
556 | |||
557 | /* We never want to remove the SCI interrupt handler */ | ||
558 | |||
559 | if (gpe_xrupt->interrupt_number == acpi_gbl_FADT.sci_interrupt) { | ||
560 | gpe_xrupt->gpe_block_list_head = NULL; | ||
561 | return_ACPI_STATUS(AE_OK); | ||
562 | } | ||
563 | |||
564 | /* Disable this interrupt */ | ||
565 | |||
566 | status = | ||
567 | acpi_os_remove_interrupt_handler(gpe_xrupt->interrupt_number, | ||
568 | acpi_ev_gpe_xrupt_handler); | ||
569 | if (ACPI_FAILURE(status)) { | ||
570 | return_ACPI_STATUS(status); | ||
571 | } | ||
572 | |||
573 | /* Unlink the interrupt block with lock */ | ||
574 | |||
575 | flags = acpi_os_acquire_lock(acpi_gbl_gpe_lock); | ||
576 | if (gpe_xrupt->previous) { | ||
577 | gpe_xrupt->previous->next = gpe_xrupt->next; | ||
578 | } else { | ||
579 | /* No previous, update list head */ | ||
580 | |||
581 | acpi_gbl_gpe_xrupt_list_head = gpe_xrupt->next; | ||
582 | } | ||
583 | |||
584 | if (gpe_xrupt->next) { | ||
585 | gpe_xrupt->next->previous = gpe_xrupt->previous; | ||
586 | } | ||
587 | acpi_os_release_lock(acpi_gbl_gpe_lock, flags); | ||
588 | |||
589 | /* Free the block */ | ||
590 | |||
591 | ACPI_FREE(gpe_xrupt); | ||
592 | return_ACPI_STATUS(AE_OK); | ||
593 | } | ||
594 | |||
595 | /******************************************************************************* | ||
596 | * | ||
597 | * FUNCTION: acpi_ev_install_gpe_block | 62 | * FUNCTION: acpi_ev_install_gpe_block |
598 | * | 63 | * |
599 | * PARAMETERS: gpe_block - New GPE block | 64 | * PARAMETERS: gpe_block - New GPE block |
@@ -705,8 +170,7 @@ acpi_status acpi_ev_delete_gpe_block(struct acpi_gpe_block_info *gpe_block) | |||
705 | acpi_os_release_lock(acpi_gbl_gpe_lock, flags); | 170 | acpi_os_release_lock(acpi_gbl_gpe_lock, flags); |
706 | } | 171 | } |
707 | 172 | ||
708 | acpi_current_gpe_count -= | 173 | acpi_current_gpe_count -= gpe_block->gpe_count; |
709 | gpe_block->register_count * ACPI_GPE_REGISTER_WIDTH; | ||
710 | 174 | ||
711 | /* Free the gpe_block */ | 175 | /* Free the gpe_block */ |
712 | 176 | ||
@@ -760,9 +224,7 @@ acpi_ev_create_gpe_info_blocks(struct acpi_gpe_block_info *gpe_block) | |||
760 | * Allocate the GPE event_info block. There are eight distinct GPEs | 224 | * Allocate the GPE event_info block. There are eight distinct GPEs |
761 | * per register. Initialization to zeros is sufficient. | 225 | * per register. Initialization to zeros is sufficient. |
762 | */ | 226 | */ |
763 | gpe_event_info = ACPI_ALLOCATE_ZEROED(((acpi_size) gpe_block-> | 227 | gpe_event_info = ACPI_ALLOCATE_ZEROED((acpi_size) gpe_block->gpe_count * |
764 | register_count * | ||
765 | ACPI_GPE_REGISTER_WIDTH) * | ||
766 | sizeof(struct | 228 | sizeof(struct |
767 | acpi_gpe_event_info)); | 229 | acpi_gpe_event_info)); |
768 | if (!gpe_event_info) { | 230 | if (!gpe_event_info) { |
@@ -880,6 +342,7 @@ acpi_ev_create_gpe_block(struct acpi_namespace_node *gpe_device, | |||
880 | { | 342 | { |
881 | acpi_status status; | 343 | acpi_status status; |
882 | struct acpi_gpe_block_info *gpe_block; | 344 | struct acpi_gpe_block_info *gpe_block; |
345 | struct acpi_gpe_walk_info walk_info; | ||
883 | 346 | ||
884 | ACPI_FUNCTION_TRACE(ev_create_gpe_block); | 347 | ACPI_FUNCTION_TRACE(ev_create_gpe_block); |
885 | 348 | ||
@@ -897,6 +360,7 @@ acpi_ev_create_gpe_block(struct acpi_namespace_node *gpe_device, | |||
897 | /* Initialize the new GPE block */ | 360 | /* Initialize the new GPE block */ |
898 | 361 | ||
899 | gpe_block->node = gpe_device; | 362 | gpe_block->node = gpe_device; |
363 | gpe_block->gpe_count = (u16)(register_count * ACPI_GPE_REGISTER_WIDTH); | ||
900 | gpe_block->register_count = register_count; | 364 | gpe_block->register_count = register_count; |
901 | gpe_block->block_base_number = gpe_block_base_number; | 365 | gpe_block->block_base_number = gpe_block_base_number; |
902 | 366 | ||
@@ -921,12 +385,17 @@ acpi_ev_create_gpe_block(struct acpi_namespace_node *gpe_device, | |||
921 | return_ACPI_STATUS(status); | 385 | return_ACPI_STATUS(status); |
922 | } | 386 | } |
923 | 387 | ||
924 | /* Find all GPE methods (_Lxx, _Exx) for this block */ | 388 | /* Find all GPE methods (_Lxx or_Exx) for this block */ |
389 | |||
390 | walk_info.gpe_block = gpe_block; | ||
391 | walk_info.gpe_device = gpe_device; | ||
392 | walk_info.enable_this_gpe = FALSE; | ||
393 | walk_info.execute_by_owner_id = FALSE; | ||
925 | 394 | ||
926 | status = acpi_ns_walk_namespace(ACPI_TYPE_METHOD, gpe_device, | 395 | status = acpi_ns_walk_namespace(ACPI_TYPE_METHOD, gpe_device, |
927 | ACPI_UINT32_MAX, ACPI_NS_WALK_NO_UNLOCK, | 396 | ACPI_UINT32_MAX, ACPI_NS_WALK_NO_UNLOCK, |
928 | acpi_ev_save_method_info, NULL, | 397 | acpi_ev_match_gpe_method, NULL, |
929 | gpe_block, NULL); | 398 | &walk_info, NULL); |
930 | 399 | ||
931 | /* Return the new block */ | 400 | /* Return the new block */ |
932 | 401 | ||
@@ -938,14 +407,13 @@ acpi_ev_create_gpe_block(struct acpi_namespace_node *gpe_device, | |||
938 | "GPE %02X to %02X [%4.4s] %u regs on int 0x%X\n", | 407 | "GPE %02X to %02X [%4.4s] %u regs on int 0x%X\n", |
939 | (u32) gpe_block->block_base_number, | 408 | (u32) gpe_block->block_base_number, |
940 | (u32) (gpe_block->block_base_number + | 409 | (u32) (gpe_block->block_base_number + |
941 | ((gpe_block->register_count * | 410 | (gpe_block->gpe_count - 1)), |
942 | ACPI_GPE_REGISTER_WIDTH) - 1)), | ||
943 | gpe_device->name.ascii, gpe_block->register_count, | 411 | gpe_device->name.ascii, gpe_block->register_count, |
944 | interrupt_number)); | 412 | interrupt_number)); |
945 | 413 | ||
946 | /* Update global count of currently available GPEs */ | 414 | /* Update global count of currently available GPEs */ |
947 | 415 | ||
948 | acpi_current_gpe_count += register_count * ACPI_GPE_REGISTER_WIDTH; | 416 | acpi_current_gpe_count += gpe_block->gpe_count; |
949 | return_ACPI_STATUS(AE_OK); | 417 | return_ACPI_STATUS(AE_OK); |
950 | } | 418 | } |
951 | 419 | ||
@@ -969,10 +437,13 @@ acpi_status | |||
969 | acpi_ev_initialize_gpe_block(struct acpi_namespace_node *gpe_device, | 437 | acpi_ev_initialize_gpe_block(struct acpi_namespace_node *gpe_device, |
970 | struct acpi_gpe_block_info *gpe_block) | 438 | struct acpi_gpe_block_info *gpe_block) |
971 | { | 439 | { |
440 | acpi_status status; | ||
972 | struct acpi_gpe_event_info *gpe_event_info; | 441 | struct acpi_gpe_event_info *gpe_event_info; |
973 | struct acpi_gpe_walk_info gpe_info; | 442 | struct acpi_gpe_walk_info walk_info; |
974 | u32 wake_gpe_count; | 443 | u32 wake_gpe_count; |
975 | u32 gpe_enabled_count; | 444 | u32 gpe_enabled_count; |
445 | u32 gpe_index; | ||
446 | u32 gpe_number; | ||
976 | u32 i; | 447 | u32 i; |
977 | u32 j; | 448 | u32 j; |
978 | 449 | ||
@@ -995,210 +466,75 @@ acpi_ev_initialize_gpe_block(struct acpi_namespace_node *gpe_device, | |||
995 | * definition a wake GPE and will not be enabled while the machine | 466 | * definition a wake GPE and will not be enabled while the machine |
996 | * is running. | 467 | * is running. |
997 | */ | 468 | */ |
998 | gpe_info.gpe_block = gpe_block; | 469 | walk_info.gpe_block = gpe_block; |
999 | gpe_info.gpe_device = gpe_device; | 470 | walk_info.gpe_device = gpe_device; |
471 | walk_info.execute_by_owner_id = FALSE; | ||
1000 | 472 | ||
1001 | acpi_ns_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT, | 473 | status = |
474 | acpi_ns_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT, | ||
1002 | ACPI_UINT32_MAX, ACPI_NS_WALK_UNLOCK, | 475 | ACPI_UINT32_MAX, ACPI_NS_WALK_UNLOCK, |
1003 | acpi_ev_match_prw_and_gpe, NULL, | 476 | acpi_ev_match_prw_and_gpe, NULL, |
1004 | &gpe_info, NULL); | 477 | &walk_info, NULL); |
478 | if (ACPI_FAILURE(status)) { | ||
479 | ACPI_EXCEPTION((AE_INFO, status, | ||
480 | "While executing _PRW methods")); | ||
481 | } | ||
1005 | } | 482 | } |
1006 | 483 | ||
1007 | /* | 484 | /* |
1008 | * Enable all GPEs that have a corresponding method and aren't | 485 | * Enable all GPEs that have a corresponding method and are not |
1009 | * capable of generating wakeups. Any other GPEs within this block | 486 | * capable of generating wakeups. Any other GPEs within this block |
1010 | * must be enabled via the acpi_enable_gpe() interface. | 487 | * must be enabled via the acpi_enable_gpe interface. |
1011 | */ | 488 | */ |
1012 | wake_gpe_count = 0; | 489 | wake_gpe_count = 0; |
1013 | gpe_enabled_count = 0; | 490 | gpe_enabled_count = 0; |
1014 | if (gpe_device == acpi_gbl_fadt_gpe_device) | 491 | |
492 | if (gpe_device == acpi_gbl_fadt_gpe_device) { | ||
1015 | gpe_device = NULL; | 493 | gpe_device = NULL; |
494 | } | ||
1016 | 495 | ||
1017 | for (i = 0; i < gpe_block->register_count; i++) { | 496 | for (i = 0; i < gpe_block->register_count; i++) { |
1018 | for (j = 0; j < ACPI_GPE_REGISTER_WIDTH; j++) { | 497 | for (j = 0; j < ACPI_GPE_REGISTER_WIDTH; j++) { |
1019 | acpi_status status; | ||
1020 | acpi_size gpe_index; | ||
1021 | int gpe_number; | ||
1022 | 498 | ||
1023 | /* Get the info block for this particular GPE */ | 499 | /* Get the info block for this particular GPE */ |
1024 | gpe_index = (acpi_size)i * ACPI_GPE_REGISTER_WIDTH + j; | 500 | |
501 | gpe_index = (i * ACPI_GPE_REGISTER_WIDTH) + j; | ||
1025 | gpe_event_info = &gpe_block->event_info[gpe_index]; | 502 | gpe_event_info = &gpe_block->event_info[gpe_index]; |
1026 | 503 | ||
1027 | if (gpe_event_info->flags & ACPI_GPE_CAN_WAKE) { | 504 | if (gpe_event_info->flags & ACPI_GPE_CAN_WAKE) { |
1028 | wake_gpe_count++; | 505 | wake_gpe_count++; |
1029 | if (acpi_gbl_leave_wake_gpes_disabled) | 506 | if (acpi_gbl_leave_wake_gpes_disabled) { |
1030 | continue; | 507 | continue; |
508 | } | ||
1031 | } | 509 | } |
1032 | 510 | ||
1033 | if (!(gpe_event_info->flags & ACPI_GPE_DISPATCH_METHOD)) | 511 | /* Ignore GPEs that have no corresponding _Lxx/_Exx method */ |
512 | |||
513 | if (!(gpe_event_info->flags & ACPI_GPE_DISPATCH_METHOD)) { | ||
1034 | continue; | 514 | continue; |
515 | } | ||
516 | |||
517 | /* Enable this GPE */ | ||
1035 | 518 | ||
1036 | gpe_number = gpe_index + gpe_block->block_base_number; | 519 | gpe_number = gpe_index + gpe_block->block_base_number; |
1037 | status = acpi_enable_gpe(gpe_device, gpe_number, | 520 | status = acpi_enable_gpe(gpe_device, gpe_number, |
1038 | ACPI_GPE_TYPE_RUNTIME); | 521 | ACPI_GPE_TYPE_RUNTIME); |
1039 | if (ACPI_FAILURE(status)) | ||
1040 | ACPI_ERROR((AE_INFO, | ||
1041 | "Failed to enable GPE %02X\n", | ||
1042 | gpe_number)); | ||
1043 | else | ||
1044 | gpe_enabled_count++; | ||
1045 | } | ||
1046 | } | ||
1047 | |||
1048 | ACPI_DEBUG_PRINT((ACPI_DB_INIT, | ||
1049 | "Found %u Wake, Enabled %u Runtime GPEs in this block\n", | ||
1050 | wake_gpe_count, gpe_enabled_count)); | ||
1051 | |||
1052 | return_ACPI_STATUS(AE_OK); | ||
1053 | } | ||
1054 | |||
1055 | /******************************************************************************* | ||
1056 | * | ||
1057 | * FUNCTION: acpi_ev_gpe_initialize | ||
1058 | * | ||
1059 | * PARAMETERS: None | ||
1060 | * | ||
1061 | * RETURN: Status | ||
1062 | * | ||
1063 | * DESCRIPTION: Initialize the GPE data structures | ||
1064 | * | ||
1065 | ******************************************************************************/ | ||
1066 | |||
1067 | acpi_status acpi_ev_gpe_initialize(void) | ||
1068 | { | ||
1069 | u32 register_count0 = 0; | ||
1070 | u32 register_count1 = 0; | ||
1071 | u32 gpe_number_max = 0; | ||
1072 | acpi_status status; | ||
1073 | |||
1074 | ACPI_FUNCTION_TRACE(ev_gpe_initialize); | ||
1075 | |||
1076 | status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE); | ||
1077 | if (ACPI_FAILURE(status)) { | ||
1078 | return_ACPI_STATUS(status); | ||
1079 | } | ||
1080 | |||
1081 | /* | ||
1082 | * Initialize the GPE Block(s) defined in the FADT | ||
1083 | * | ||
1084 | * Why the GPE register block lengths are divided by 2: From the ACPI | ||
1085 | * Spec, section "General-Purpose Event Registers", we have: | ||
1086 | * | ||
1087 | * "Each register block contains two registers of equal length | ||
1088 | * GPEx_STS and GPEx_EN (where x is 0 or 1). The length of the | ||
1089 | * GPE0_STS and GPE0_EN registers is equal to half the GPE0_LEN | ||
1090 | * The length of the GPE1_STS and GPE1_EN registers is equal to | ||
1091 | * half the GPE1_LEN. If a generic register block is not supported | ||
1092 | * then its respective block pointer and block length values in the | ||
1093 | * FADT table contain zeros. The GPE0_LEN and GPE1_LEN do not need | ||
1094 | * to be the same size." | ||
1095 | */ | ||
1096 | |||
1097 | /* | ||
1098 | * Determine the maximum GPE number for this machine. | ||
1099 | * | ||
1100 | * Note: both GPE0 and GPE1 are optional, and either can exist without | ||
1101 | * the other. | ||
1102 | * | ||
1103 | * If EITHER the register length OR the block address are zero, then that | ||
1104 | * particular block is not supported. | ||
1105 | */ | ||
1106 | if (acpi_gbl_FADT.gpe0_block_length && | ||
1107 | acpi_gbl_FADT.xgpe0_block.address) { | ||
1108 | |||
1109 | /* GPE block 0 exists (has both length and address > 0) */ | ||
1110 | |||
1111 | register_count0 = (u16) (acpi_gbl_FADT.gpe0_block_length / 2); | ||
1112 | |||
1113 | gpe_number_max = | ||
1114 | (register_count0 * ACPI_GPE_REGISTER_WIDTH) - 1; | ||
1115 | |||
1116 | /* Install GPE Block 0 */ | ||
1117 | |||
1118 | status = acpi_ev_create_gpe_block(acpi_gbl_fadt_gpe_device, | ||
1119 | &acpi_gbl_FADT.xgpe0_block, | ||
1120 | register_count0, 0, | ||
1121 | acpi_gbl_FADT.sci_interrupt, | ||
1122 | &acpi_gbl_gpe_fadt_blocks[0]); | ||
1123 | |||
1124 | if (ACPI_FAILURE(status)) { | ||
1125 | ACPI_EXCEPTION((AE_INFO, status, | ||
1126 | "Could not create GPE Block 0")); | ||
1127 | } | ||
1128 | } | ||
1129 | |||
1130 | if (acpi_gbl_FADT.gpe1_block_length && | ||
1131 | acpi_gbl_FADT.xgpe1_block.address) { | ||
1132 | |||
1133 | /* GPE block 1 exists (has both length and address > 0) */ | ||
1134 | |||
1135 | register_count1 = (u16) (acpi_gbl_FADT.gpe1_block_length / 2); | ||
1136 | |||
1137 | /* Check for GPE0/GPE1 overlap (if both banks exist) */ | ||
1138 | |||
1139 | if ((register_count0) && | ||
1140 | (gpe_number_max >= acpi_gbl_FADT.gpe1_base)) { | ||
1141 | ACPI_ERROR((AE_INFO, | ||
1142 | "GPE0 block (GPE 0 to %d) overlaps the GPE1 block " | ||
1143 | "(GPE %d to %d) - Ignoring GPE1", | ||
1144 | gpe_number_max, acpi_gbl_FADT.gpe1_base, | ||
1145 | acpi_gbl_FADT.gpe1_base + | ||
1146 | ((register_count1 * | ||
1147 | ACPI_GPE_REGISTER_WIDTH) - 1))); | ||
1148 | |||
1149 | /* Ignore GPE1 block by setting the register count to zero */ | ||
1150 | |||
1151 | register_count1 = 0; | ||
1152 | } else { | ||
1153 | /* Install GPE Block 1 */ | ||
1154 | |||
1155 | status = | ||
1156 | acpi_ev_create_gpe_block(acpi_gbl_fadt_gpe_device, | ||
1157 | &acpi_gbl_FADT.xgpe1_block, | ||
1158 | register_count1, | ||
1159 | acpi_gbl_FADT.gpe1_base, | ||
1160 | acpi_gbl_FADT. | ||
1161 | sci_interrupt, | ||
1162 | &acpi_gbl_gpe_fadt_blocks | ||
1163 | [1]); | ||
1164 | |||
1165 | if (ACPI_FAILURE(status)) { | 522 | if (ACPI_FAILURE(status)) { |
1166 | ACPI_EXCEPTION((AE_INFO, status, | 523 | ACPI_EXCEPTION((AE_INFO, status, |
1167 | "Could not create GPE Block 1")); | 524 | "Could not enable GPE 0x%02X", |
525 | gpe_number)); | ||
526 | continue; | ||
1168 | } | 527 | } |
1169 | 528 | ||
1170 | /* | 529 | gpe_enabled_count++; |
1171 | * GPE0 and GPE1 do not have to be contiguous in the GPE number | ||
1172 | * space. However, GPE0 always starts at GPE number zero. | ||
1173 | */ | ||
1174 | gpe_number_max = acpi_gbl_FADT.gpe1_base + | ||
1175 | ((register_count1 * ACPI_GPE_REGISTER_WIDTH) - 1); | ||
1176 | } | 530 | } |
1177 | } | 531 | } |
1178 | 532 | ||
1179 | /* Exit if there are no GPE registers */ | 533 | if (gpe_enabled_count || wake_gpe_count) { |
1180 | |||
1181 | if ((register_count0 + register_count1) == 0) { | ||
1182 | |||
1183 | /* GPEs are not required by ACPI, this is OK */ | ||
1184 | |||
1185 | ACPI_DEBUG_PRINT((ACPI_DB_INIT, | 534 | ACPI_DEBUG_PRINT((ACPI_DB_INIT, |
1186 | "There are no GPE blocks defined in the FADT\n")); | 535 | "Enabled %u Runtime GPEs, added %u Wake GPEs in this block\n", |
1187 | status = AE_OK; | 536 | gpe_enabled_count, wake_gpe_count)); |
1188 | goto cleanup; | ||
1189 | } | ||
1190 | |||
1191 | /* Check for Max GPE number out-of-range */ | ||
1192 | |||
1193 | if (gpe_number_max > ACPI_GPE_MAX) { | ||
1194 | ACPI_ERROR((AE_INFO, | ||
1195 | "Maximum GPE number from FADT is too large: 0x%X", | ||
1196 | gpe_number_max)); | ||
1197 | status = AE_BAD_VALUE; | ||
1198 | goto cleanup; | ||
1199 | } | 537 | } |
1200 | 538 | ||
1201 | cleanup: | ||
1202 | (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE); | ||
1203 | return_ACPI_STATUS(AE_OK); | 539 | return_ACPI_STATUS(AE_OK); |
1204 | } | 540 | } |
diff --git a/drivers/acpi/acpica/evgpeinit.c b/drivers/acpi/acpica/evgpeinit.c new file mode 100644 index 000000000000..3f6c2d26410d --- /dev/null +++ b/drivers/acpi/acpica/evgpeinit.c | |||
@@ -0,0 +1,653 @@ | |||
1 | /****************************************************************************** | ||
2 | * | ||
3 | * Module Name: evgpeinit - System GPE initialization and update | ||
4 | * | ||
5 | *****************************************************************************/ | ||
6 | |||
7 | /* | ||
8 | * Copyright (C) 2000 - 2010, Intel Corp. | ||
9 | * All rights reserved. | ||
10 | * | ||
11 | * Redistribution and use in source and binary forms, with or without | ||
12 | * modification, are permitted provided that the following conditions | ||
13 | * are met: | ||
14 | * 1. Redistributions of source code must retain the above copyright | ||
15 | * notice, this list of conditions, and the following disclaimer, | ||
16 | * without modification. | ||
17 | * 2. Redistributions in binary form must reproduce at minimum a disclaimer | ||
18 | * substantially similar to the "NO WARRANTY" disclaimer below | ||
19 | * ("Disclaimer") and any redistribution must be conditioned upon | ||
20 | * including a substantially similar Disclaimer requirement for further | ||
21 | * binary redistribution. | ||
22 | * 3. Neither the names of the above-listed copyright holders nor the names | ||
23 | * of any contributors may be used to endorse or promote products derived | ||
24 | * from this software without specific prior written permission. | ||
25 | * | ||
26 | * Alternatively, this software may be distributed under the terms of the | ||
27 | * GNU General Public License ("GPL") version 2 as published by the Free | ||
28 | * Software Foundation. | ||
29 | * | ||
30 | * NO WARRANTY | ||
31 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
32 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
33 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR | ||
34 | * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||
35 | * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||
36 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||
37 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||
38 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | ||
39 | * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING | ||
40 | * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||
41 | * POSSIBILITY OF SUCH DAMAGES. | ||
42 | */ | ||
43 | |||
44 | #include <acpi/acpi.h> | ||
45 | #include "accommon.h" | ||
46 | #include "acevents.h" | ||
47 | #include "acnamesp.h" | ||
48 | #include "acinterp.h" | ||
49 | |||
50 | #define _COMPONENT ACPI_EVENTS | ||
51 | ACPI_MODULE_NAME("evgpeinit") | ||
52 | |||
53 | /******************************************************************************* | ||
54 | * | ||
55 | * FUNCTION: acpi_ev_gpe_initialize | ||
56 | * | ||
57 | * PARAMETERS: None | ||
58 | * | ||
59 | * RETURN: Status | ||
60 | * | ||
61 | * DESCRIPTION: Initialize the GPE data structures and the FADT GPE 0/1 blocks | ||
62 | * | ||
63 | ******************************************************************************/ | ||
64 | acpi_status acpi_ev_gpe_initialize(void) | ||
65 | { | ||
66 | u32 register_count0 = 0; | ||
67 | u32 register_count1 = 0; | ||
68 | u32 gpe_number_max = 0; | ||
69 | acpi_status status; | ||
70 | |||
71 | ACPI_FUNCTION_TRACE(ev_gpe_initialize); | ||
72 | |||
73 | status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE); | ||
74 | if (ACPI_FAILURE(status)) { | ||
75 | return_ACPI_STATUS(status); | ||
76 | } | ||
77 | |||
78 | /* | ||
79 | * Initialize the GPE Block(s) defined in the FADT | ||
80 | * | ||
81 | * Why the GPE register block lengths are divided by 2: From the ACPI | ||
82 | * Spec, section "General-Purpose Event Registers", we have: | ||
83 | * | ||
84 | * "Each register block contains two registers of equal length | ||
85 | * GPEx_STS and GPEx_EN (where x is 0 or 1). The length of the | ||
86 | * GPE0_STS and GPE0_EN registers is equal to half the GPE0_LEN | ||
87 | * The length of the GPE1_STS and GPE1_EN registers is equal to | ||
88 | * half the GPE1_LEN. If a generic register block is not supported | ||
89 | * then its respective block pointer and block length values in the | ||
90 | * FADT table contain zeros. The GPE0_LEN and GPE1_LEN do not need | ||
91 | * to be the same size." | ||
92 | */ | ||
93 | |||
94 | /* | ||
95 | * Determine the maximum GPE number for this machine. | ||
96 | * | ||
97 | * Note: both GPE0 and GPE1 are optional, and either can exist without | ||
98 | * the other. | ||
99 | * | ||
100 | * If EITHER the register length OR the block address are zero, then that | ||
101 | * particular block is not supported. | ||
102 | */ | ||
103 | if (acpi_gbl_FADT.gpe0_block_length && | ||
104 | acpi_gbl_FADT.xgpe0_block.address) { | ||
105 | |||
106 | /* GPE block 0 exists (has both length and address > 0) */ | ||
107 | |||
108 | register_count0 = (u16)(acpi_gbl_FADT.gpe0_block_length / 2); | ||
109 | |||
110 | gpe_number_max = | ||
111 | (register_count0 * ACPI_GPE_REGISTER_WIDTH) - 1; | ||
112 | |||
113 | /* Install GPE Block 0 */ | ||
114 | |||
115 | status = acpi_ev_create_gpe_block(acpi_gbl_fadt_gpe_device, | ||
116 | &acpi_gbl_FADT.xgpe0_block, | ||
117 | register_count0, 0, | ||
118 | acpi_gbl_FADT.sci_interrupt, | ||
119 | &acpi_gbl_gpe_fadt_blocks[0]); | ||
120 | |||
121 | if (ACPI_FAILURE(status)) { | ||
122 | ACPI_EXCEPTION((AE_INFO, status, | ||
123 | "Could not create GPE Block 0")); | ||
124 | } | ||
125 | } | ||
126 | |||
127 | if (acpi_gbl_FADT.gpe1_block_length && | ||
128 | acpi_gbl_FADT.xgpe1_block.address) { | ||
129 | |||
130 | /* GPE block 1 exists (has both length and address > 0) */ | ||
131 | |||
132 | register_count1 = (u16)(acpi_gbl_FADT.gpe1_block_length / 2); | ||
133 | |||
134 | /* Check for GPE0/GPE1 overlap (if both banks exist) */ | ||
135 | |||
136 | if ((register_count0) && | ||
137 | (gpe_number_max >= acpi_gbl_FADT.gpe1_base)) { | ||
138 | ACPI_ERROR((AE_INFO, | ||
139 | "GPE0 block (GPE 0 to %u) overlaps the GPE1 block " | ||
140 | "(GPE %u to %u) - Ignoring GPE1", | ||
141 | gpe_number_max, acpi_gbl_FADT.gpe1_base, | ||
142 | acpi_gbl_FADT.gpe1_base + | ||
143 | ((register_count1 * | ||
144 | ACPI_GPE_REGISTER_WIDTH) - 1))); | ||
145 | |||
146 | /* Ignore GPE1 block by setting the register count to zero */ | ||
147 | |||
148 | register_count1 = 0; | ||
149 | } else { | ||
150 | /* Install GPE Block 1 */ | ||
151 | |||
152 | status = | ||
153 | acpi_ev_create_gpe_block(acpi_gbl_fadt_gpe_device, | ||
154 | &acpi_gbl_FADT.xgpe1_block, | ||
155 | register_count1, | ||
156 | acpi_gbl_FADT.gpe1_base, | ||
157 | acpi_gbl_FADT. | ||
158 | sci_interrupt, | ||
159 | &acpi_gbl_gpe_fadt_blocks | ||
160 | [1]); | ||
161 | |||
162 | if (ACPI_FAILURE(status)) { | ||
163 | ACPI_EXCEPTION((AE_INFO, status, | ||
164 | "Could not create GPE Block 1")); | ||
165 | } | ||
166 | |||
167 | /* | ||
168 | * GPE0 and GPE1 do not have to be contiguous in the GPE number | ||
169 | * space. However, GPE0 always starts at GPE number zero. | ||
170 | */ | ||
171 | gpe_number_max = acpi_gbl_FADT.gpe1_base + | ||
172 | ((register_count1 * ACPI_GPE_REGISTER_WIDTH) - 1); | ||
173 | } | ||
174 | } | ||
175 | |||
176 | /* Exit if there are no GPE registers */ | ||
177 | |||
178 | if ((register_count0 + register_count1) == 0) { | ||
179 | |||
180 | /* GPEs are not required by ACPI, this is OK */ | ||
181 | |||
182 | ACPI_DEBUG_PRINT((ACPI_DB_INIT, | ||
183 | "There are no GPE blocks defined in the FADT\n")); | ||
184 | status = AE_OK; | ||
185 | goto cleanup; | ||
186 | } | ||
187 | |||
188 | /* Check for Max GPE number out-of-range */ | ||
189 | |||
190 | if (gpe_number_max > ACPI_GPE_MAX) { | ||
191 | ACPI_ERROR((AE_INFO, | ||
192 | "Maximum GPE number from FADT is too large: 0x%X", | ||
193 | gpe_number_max)); | ||
194 | status = AE_BAD_VALUE; | ||
195 | goto cleanup; | ||
196 | } | ||
197 | |||
198 | cleanup: | ||
199 | (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE); | ||
200 | return_ACPI_STATUS(AE_OK); | ||
201 | } | ||
202 | |||
203 | /******************************************************************************* | ||
204 | * | ||
205 | * FUNCTION: acpi_ev_update_gpes | ||
206 | * | ||
207 | * PARAMETERS: table_owner_id - ID of the newly-loaded ACPI table | ||
208 | * | ||
209 | * RETURN: None | ||
210 | * | ||
211 | * DESCRIPTION: Check for new GPE methods (_Lxx/_Exx) made available as a | ||
212 | * result of a Load() or load_table() operation. If new GPE | ||
213 | * methods have been installed, register the new methods and | ||
214 | * enable and runtime GPEs that are associated with them. Also, | ||
215 | * run any newly loaded _PRW methods in order to discover any | ||
216 | * new CAN_WAKE GPEs. | ||
217 | * | ||
218 | ******************************************************************************/ | ||
219 | |||
220 | void acpi_ev_update_gpes(acpi_owner_id table_owner_id) | ||
221 | { | ||
222 | struct acpi_gpe_xrupt_info *gpe_xrupt_info; | ||
223 | struct acpi_gpe_block_info *gpe_block; | ||
224 | struct acpi_gpe_walk_info walk_info; | ||
225 | acpi_status status = AE_OK; | ||
226 | u32 new_wake_gpe_count = 0; | ||
227 | |||
228 | /* We will examine only _PRW/_Lxx/_Exx methods owned by this table */ | ||
229 | |||
230 | walk_info.owner_id = table_owner_id; | ||
231 | walk_info.execute_by_owner_id = TRUE; | ||
232 | walk_info.count = 0; | ||
233 | |||
234 | if (acpi_gbl_leave_wake_gpes_disabled) { | ||
235 | /* | ||
236 | * 1) Run any newly-loaded _PRW methods to find any GPEs that | ||
237 | * can now be marked as CAN_WAKE GPEs. Note: We must run the | ||
238 | * _PRW methods before we process the _Lxx/_Exx methods because | ||
239 | * we will enable all runtime GPEs associated with the new | ||
240 | * _Lxx/_Exx methods at the time we process those methods. | ||
241 | * | ||
242 | * Unlock interpreter so that we can run the _PRW methods. | ||
243 | */ | ||
244 | walk_info.gpe_block = NULL; | ||
245 | walk_info.gpe_device = NULL; | ||
246 | |||
247 | acpi_ex_exit_interpreter(); | ||
248 | |||
249 | status = | ||
250 | acpi_ns_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT, | ||
251 | ACPI_UINT32_MAX, | ||
252 | ACPI_NS_WALK_NO_UNLOCK, | ||
253 | acpi_ev_match_prw_and_gpe, NULL, | ||
254 | &walk_info, NULL); | ||
255 | if (ACPI_FAILURE(status)) { | ||
256 | ACPI_EXCEPTION((AE_INFO, status, | ||
257 | "While executing _PRW methods")); | ||
258 | } | ||
259 | |||
260 | acpi_ex_enter_interpreter(); | ||
261 | new_wake_gpe_count = walk_info.count; | ||
262 | } | ||
263 | |||
264 | /* | ||
265 | * 2) Find any _Lxx/_Exx GPE methods that have just been loaded. | ||
266 | * | ||
267 | * Any GPEs that correspond to new _Lxx/_Exx methods and are not | ||
268 | * marked as CAN_WAKE are immediately enabled. | ||
269 | * | ||
270 | * Examine the namespace underneath each gpe_device within the | ||
271 | * gpe_block lists. | ||
272 | */ | ||
273 | status = acpi_ut_acquire_mutex(ACPI_MTX_EVENTS); | ||
274 | if (ACPI_FAILURE(status)) { | ||
275 | return; | ||
276 | } | ||
277 | |||
278 | walk_info.count = 0; | ||
279 | walk_info.enable_this_gpe = TRUE; | ||
280 | |||
281 | /* Walk the interrupt level descriptor list */ | ||
282 | |||
283 | gpe_xrupt_info = acpi_gbl_gpe_xrupt_list_head; | ||
284 | while (gpe_xrupt_info) { | ||
285 | |||
286 | /* Walk all Gpe Blocks attached to this interrupt level */ | ||
287 | |||
288 | gpe_block = gpe_xrupt_info->gpe_block_list_head; | ||
289 | while (gpe_block) { | ||
290 | walk_info.gpe_block = gpe_block; | ||
291 | walk_info.gpe_device = gpe_block->node; | ||
292 | |||
293 | status = acpi_ns_walk_namespace(ACPI_TYPE_METHOD, | ||
294 | walk_info.gpe_device, | ||
295 | ACPI_UINT32_MAX, | ||
296 | ACPI_NS_WALK_NO_UNLOCK, | ||
297 | acpi_ev_match_gpe_method, | ||
298 | NULL, &walk_info, NULL); | ||
299 | if (ACPI_FAILURE(status)) { | ||
300 | ACPI_EXCEPTION((AE_INFO, status, | ||
301 | "While decoding _Lxx/_Exx methods")); | ||
302 | } | ||
303 | |||
304 | gpe_block = gpe_block->next; | ||
305 | } | ||
306 | |||
307 | gpe_xrupt_info = gpe_xrupt_info->next; | ||
308 | } | ||
309 | |||
310 | if (walk_info.count || new_wake_gpe_count) { | ||
311 | ACPI_INFO((AE_INFO, | ||
312 | "Enabled %u new runtime GPEs, added %u new wakeup GPEs", | ||
313 | walk_info.count, new_wake_gpe_count)); | ||
314 | } | ||
315 | |||
316 | (void)acpi_ut_release_mutex(ACPI_MTX_EVENTS); | ||
317 | return; | ||
318 | } | ||
319 | |||
320 | /******************************************************************************* | ||
321 | * | ||
322 | * FUNCTION: acpi_ev_match_gpe_method | ||
323 | * | ||
324 | * PARAMETERS: Callback from walk_namespace | ||
325 | * | ||
326 | * RETURN: Status | ||
327 | * | ||
328 | * DESCRIPTION: Called from acpi_walk_namespace. Expects each object to be a | ||
329 | * control method under the _GPE portion of the namespace. | ||
330 | * Extract the name and GPE type from the object, saving this | ||
331 | * information for quick lookup during GPE dispatch. Allows a | ||
332 | * per-owner_id evaluation if execute_by_owner_id is TRUE in the | ||
333 | * walk_info parameter block. | ||
334 | * | ||
335 | * The name of each GPE control method is of the form: | ||
336 | * "_Lxx" or "_Exx", where: | ||
337 | * L - means that the GPE is level triggered | ||
338 | * E - means that the GPE is edge triggered | ||
339 | * xx - is the GPE number [in HEX] | ||
340 | * | ||
341 | * If walk_info->execute_by_owner_id is TRUE, we only execute examine GPE methods | ||
342 | * with that owner. | ||
343 | * If walk_info->enable_this_gpe is TRUE, the GPE that is referred to by a GPE | ||
344 | * method is immediately enabled (Used for Load/load_table operators) | ||
345 | * | ||
346 | ******************************************************************************/ | ||
347 | |||
348 | acpi_status | ||
349 | acpi_ev_match_gpe_method(acpi_handle obj_handle, | ||
350 | u32 level, void *context, void **return_value) | ||
351 | { | ||
352 | struct acpi_namespace_node *method_node = | ||
353 | ACPI_CAST_PTR(struct acpi_namespace_node, obj_handle); | ||
354 | struct acpi_gpe_walk_info *walk_info = | ||
355 | ACPI_CAST_PTR(struct acpi_gpe_walk_info, context); | ||
356 | struct acpi_gpe_event_info *gpe_event_info; | ||
357 | struct acpi_namespace_node *gpe_device; | ||
358 | acpi_status status; | ||
359 | u32 gpe_number; | ||
360 | char name[ACPI_NAME_SIZE + 1]; | ||
361 | u8 type; | ||
362 | |||
363 | ACPI_FUNCTION_TRACE(ev_match_gpe_method); | ||
364 | |||
365 | /* Check if requested owner_id matches this owner_id */ | ||
366 | |||
367 | if ((walk_info->execute_by_owner_id) && | ||
368 | (method_node->owner_id != walk_info->owner_id)) { | ||
369 | return_ACPI_STATUS(AE_OK); | ||
370 | } | ||
371 | |||
372 | /* | ||
373 | * Match and decode the _Lxx and _Exx GPE method names | ||
374 | * | ||
375 | * 1) Extract the method name and null terminate it | ||
376 | */ | ||
377 | ACPI_MOVE_32_TO_32(name, &method_node->name.integer); | ||
378 | name[ACPI_NAME_SIZE] = 0; | ||
379 | |||
380 | /* 2) Name must begin with an underscore */ | ||
381 | |||
382 | if (name[0] != '_') { | ||
383 | return_ACPI_STATUS(AE_OK); /* Ignore this method */ | ||
384 | } | ||
385 | |||
386 | /* | ||
387 | * 3) Edge/Level determination is based on the 2nd character | ||
388 | * of the method name | ||
389 | * | ||
390 | * NOTE: Default GPE type is RUNTIME only. Later, if a _PRW object is | ||
391 | * found that points to this GPE, the ACPI_GPE_CAN_WAKE flag is set. | ||
392 | */ | ||
393 | switch (name[1]) { | ||
394 | case 'L': | ||
395 | type = ACPI_GPE_LEVEL_TRIGGERED; | ||
396 | break; | ||
397 | |||
398 | case 'E': | ||
399 | type = ACPI_GPE_EDGE_TRIGGERED; | ||
400 | break; | ||
401 | |||
402 | default: | ||
403 | /* Unknown method type, just ignore it */ | ||
404 | |||
405 | ACPI_DEBUG_PRINT((ACPI_DB_LOAD, | ||
406 | "Ignoring unknown GPE method type: %s " | ||
407 | "(name not of form _Lxx or _Exx)", name)); | ||
408 | return_ACPI_STATUS(AE_OK); | ||
409 | } | ||
410 | |||
411 | /* 4) The last two characters of the name are the hex GPE Number */ | ||
412 | |||
413 | gpe_number = ACPI_STRTOUL(&name[2], NULL, 16); | ||
414 | if (gpe_number == ACPI_UINT32_MAX) { | ||
415 | |||
416 | /* Conversion failed; invalid method, just ignore it */ | ||
417 | |||
418 | ACPI_DEBUG_PRINT((ACPI_DB_LOAD, | ||
419 | "Could not extract GPE number from name: %s " | ||
420 | "(name is not of form _Lxx or _Exx)", name)); | ||
421 | return_ACPI_STATUS(AE_OK); | ||
422 | } | ||
423 | |||
424 | /* Ensure that we have a valid GPE number for this GPE block */ | ||
425 | |||
426 | gpe_event_info = | ||
427 | acpi_ev_low_get_gpe_info(gpe_number, walk_info->gpe_block); | ||
428 | if (!gpe_event_info) { | ||
429 | /* | ||
430 | * This gpe_number is not valid for this GPE block, just ignore it. | ||
431 | * However, it may be valid for a different GPE block, since GPE0 | ||
432 | * and GPE1 methods both appear under \_GPE. | ||
433 | */ | ||
434 | return_ACPI_STATUS(AE_OK); | ||
435 | } | ||
436 | |||
437 | if ((gpe_event_info->flags & ACPI_GPE_DISPATCH_MASK) == | ||
438 | ACPI_GPE_DISPATCH_HANDLER) { | ||
439 | |||
440 | /* If there is already a handler, ignore this GPE method */ | ||
441 | |||
442 | return_ACPI_STATUS(AE_OK); | ||
443 | } | ||
444 | |||
445 | if ((gpe_event_info->flags & ACPI_GPE_DISPATCH_MASK) == | ||
446 | ACPI_GPE_DISPATCH_METHOD) { | ||
447 | /* | ||
448 | * If there is already a method, ignore this method. But check | ||
449 | * for a type mismatch (if both the _Lxx AND _Exx exist) | ||
450 | */ | ||
451 | if (type != (gpe_event_info->flags & ACPI_GPE_XRUPT_TYPE_MASK)) { | ||
452 | ACPI_ERROR((AE_INFO, | ||
453 | "For GPE 0x%.2X, found both _L%2.2X and _E%2.2X methods", | ||
454 | gpe_number, gpe_number, gpe_number)); | ||
455 | } | ||
456 | return_ACPI_STATUS(AE_OK); | ||
457 | } | ||
458 | |||
459 | /* | ||
460 | * Add the GPE information from above to the gpe_event_info block for | ||
461 | * use during dispatch of this GPE. | ||
462 | */ | ||
463 | gpe_event_info->flags |= (u8)(type | ACPI_GPE_DISPATCH_METHOD); | ||
464 | gpe_event_info->dispatch.method_node = method_node; | ||
465 | |||
466 | /* | ||
467 | * Enable this GPE if requested. This only happens when during the | ||
468 | * execution of a Load or load_table operator. We have found a new | ||
469 | * GPE method and want to immediately enable the GPE if it is a | ||
470 | * runtime GPE. | ||
471 | */ | ||
472 | if (walk_info->enable_this_gpe) { | ||
473 | |||
474 | /* Ignore GPEs that can wake the system */ | ||
475 | |||
476 | if (!(gpe_event_info->flags & ACPI_GPE_CAN_WAKE) || | ||
477 | !acpi_gbl_leave_wake_gpes_disabled) { | ||
478 | walk_info->count++; | ||
479 | gpe_device = walk_info->gpe_device; | ||
480 | |||
481 | if (gpe_device == acpi_gbl_fadt_gpe_device) { | ||
482 | gpe_device = NULL; | ||
483 | } | ||
484 | |||
485 | status = acpi_enable_gpe(gpe_device, gpe_number, | ||
486 | ACPI_GPE_TYPE_RUNTIME); | ||
487 | if (ACPI_FAILURE(status)) { | ||
488 | ACPI_EXCEPTION((AE_INFO, status, | ||
489 | "Could not enable GPE 0x%02X", | ||
490 | gpe_number)); | ||
491 | } | ||
492 | } | ||
493 | } | ||
494 | |||
495 | ACPI_DEBUG_PRINT((ACPI_DB_LOAD, | ||
496 | "Registered GPE method %s as GPE number 0x%.2X\n", | ||
497 | name, gpe_number)); | ||
498 | return_ACPI_STATUS(AE_OK); | ||
499 | } | ||
500 | |||
501 | /******************************************************************************* | ||
502 | * | ||
503 | * FUNCTION: acpi_ev_match_prw_and_gpe | ||
504 | * | ||
505 | * PARAMETERS: Callback from walk_namespace | ||
506 | * | ||
507 | * RETURN: Status. NOTE: We ignore errors so that the _PRW walk is | ||
508 | * not aborted on a single _PRW failure. | ||
509 | * | ||
510 | * DESCRIPTION: Called from acpi_walk_namespace. Expects each object to be a | ||
511 | * Device. Run the _PRW method. If present, extract the GPE | ||
512 | * number and mark the GPE as a CAN_WAKE GPE. Allows a | ||
513 | * per-owner_id execution if execute_by_owner_id is TRUE in the | ||
514 | * walk_info parameter block. | ||
515 | * | ||
516 | * If walk_info->execute_by_owner_id is TRUE, we only execute _PRWs with that | ||
517 | * owner. | ||
518 | * If walk_info->gpe_device is NULL, we execute every _PRW found. Otherwise, | ||
519 | * we only execute _PRWs that refer to the input gpe_device. | ||
520 | * | ||
521 | ******************************************************************************/ | ||
522 | |||
523 | acpi_status | ||
524 | acpi_ev_match_prw_and_gpe(acpi_handle obj_handle, | ||
525 | u32 level, void *context, void **return_value) | ||
526 | { | ||
527 | struct acpi_gpe_walk_info *walk_info = | ||
528 | ACPI_CAST_PTR(struct acpi_gpe_walk_info, context); | ||
529 | struct acpi_namespace_node *gpe_device; | ||
530 | struct acpi_gpe_block_info *gpe_block; | ||
531 | struct acpi_namespace_node *target_gpe_device; | ||
532 | struct acpi_namespace_node *prw_node; | ||
533 | struct acpi_gpe_event_info *gpe_event_info; | ||
534 | union acpi_operand_object *pkg_desc; | ||
535 | union acpi_operand_object *obj_desc; | ||
536 | u32 gpe_number; | ||
537 | acpi_status status; | ||
538 | |||
539 | ACPI_FUNCTION_TRACE(ev_match_prw_and_gpe); | ||
540 | |||
541 | /* Check for a _PRW method under this device */ | ||
542 | |||
543 | status = acpi_ns_get_node(obj_handle, METHOD_NAME__PRW, | ||
544 | ACPI_NS_NO_UPSEARCH, &prw_node); | ||
545 | if (ACPI_FAILURE(status)) { | ||
546 | return_ACPI_STATUS(AE_OK); | ||
547 | } | ||
548 | |||
549 | /* Check if requested owner_id matches this owner_id */ | ||
550 | |||
551 | if ((walk_info->execute_by_owner_id) && | ||
552 | (prw_node->owner_id != walk_info->owner_id)) { | ||
553 | return_ACPI_STATUS(AE_OK); | ||
554 | } | ||
555 | |||
556 | /* Execute the _PRW */ | ||
557 | |||
558 | status = acpi_ut_evaluate_object(prw_node, NULL, | ||
559 | ACPI_BTYPE_PACKAGE, &pkg_desc); | ||
560 | if (ACPI_FAILURE(status)) { | ||
561 | return_ACPI_STATUS(AE_OK); | ||
562 | } | ||
563 | |||
564 | /* The returned _PRW package must have at least two elements */ | ||
565 | |||
566 | if (pkg_desc->package.count < 2) { | ||
567 | goto cleanup; | ||
568 | } | ||
569 | |||
570 | /* Extract pointers from the input context */ | ||
571 | |||
572 | gpe_device = walk_info->gpe_device; | ||
573 | gpe_block = walk_info->gpe_block; | ||
574 | |||
575 | /* | ||
576 | * The _PRW object must return a package, we are only interested | ||
577 | * in the first element | ||
578 | */ | ||
579 | obj_desc = pkg_desc->package.elements[0]; | ||
580 | |||
581 | if (obj_desc->common.type == ACPI_TYPE_INTEGER) { | ||
582 | |||
583 | /* Use FADT-defined GPE device (from definition of _PRW) */ | ||
584 | |||
585 | target_gpe_device = NULL; | ||
586 | if (gpe_device) { | ||
587 | target_gpe_device = acpi_gbl_fadt_gpe_device; | ||
588 | } | ||
589 | |||
590 | /* Integer is the GPE number in the FADT described GPE blocks */ | ||
591 | |||
592 | gpe_number = (u32)obj_desc->integer.value; | ||
593 | } else if (obj_desc->common.type == ACPI_TYPE_PACKAGE) { | ||
594 | |||
595 | /* Package contains a GPE reference and GPE number within a GPE block */ | ||
596 | |||
597 | if ((obj_desc->package.count < 2) || | ||
598 | ((obj_desc->package.elements[0])->common.type != | ||
599 | ACPI_TYPE_LOCAL_REFERENCE) || | ||
600 | ((obj_desc->package.elements[1])->common.type != | ||
601 | ACPI_TYPE_INTEGER)) { | ||
602 | goto cleanup; | ||
603 | } | ||
604 | |||
605 | /* Get GPE block reference and decode */ | ||
606 | |||
607 | target_gpe_device = | ||
608 | obj_desc->package.elements[0]->reference.node; | ||
609 | gpe_number = (u32)obj_desc->package.elements[1]->integer.value; | ||
610 | } else { | ||
611 | /* Unknown type, just ignore it */ | ||
612 | |||
613 | goto cleanup; | ||
614 | } | ||
615 | |||
616 | /* Get the gpe_event_info for this GPE */ | ||
617 | |||
618 | if (gpe_device) { | ||
619 | /* | ||
620 | * Is this GPE within this block? | ||
621 | * | ||
622 | * TRUE if and only if these conditions are true: | ||
623 | * 1) The GPE devices match. | ||
624 | * 2) The GPE index(number) is within the range of the Gpe Block | ||
625 | * associated with the GPE device. | ||
626 | */ | ||
627 | if (gpe_device != target_gpe_device) { | ||
628 | goto cleanup; | ||
629 | } | ||
630 | |||
631 | gpe_event_info = | ||
632 | acpi_ev_low_get_gpe_info(gpe_number, gpe_block); | ||
633 | } else { | ||
634 | /* gpe_device is NULL, just match the target_device and gpe_number */ | ||
635 | |||
636 | gpe_event_info = | ||
637 | acpi_ev_get_gpe_event_info(target_gpe_device, gpe_number); | ||
638 | } | ||
639 | |||
640 | if (gpe_event_info) { | ||
641 | if (!(gpe_event_info->flags & ACPI_GPE_CAN_WAKE)) { | ||
642 | |||
643 | /* This GPE can wake the system */ | ||
644 | |||
645 | gpe_event_info->flags |= ACPI_GPE_CAN_WAKE; | ||
646 | walk_info->count++; | ||
647 | } | ||
648 | } | ||
649 | |||
650 | cleanup: | ||
651 | acpi_ut_remove_reference(pkg_desc); | ||
652 | return_ACPI_STATUS(AE_OK); | ||
653 | } | ||
diff --git a/drivers/acpi/acpica/evgpeutil.c b/drivers/acpi/acpica/evgpeutil.c new file mode 100644 index 000000000000..19a0e513ea48 --- /dev/null +++ b/drivers/acpi/acpica/evgpeutil.c | |||
@@ -0,0 +1,337 @@ | |||
1 | /****************************************************************************** | ||
2 | * | ||
3 | * Module Name: evgpeutil - GPE utilities | ||
4 | * | ||
5 | *****************************************************************************/ | ||
6 | |||
7 | /* | ||
8 | * Copyright (C) 2000 - 2010, Intel Corp. | ||
9 | * All rights reserved. | ||
10 | * | ||
11 | * Redistribution and use in source and binary forms, with or without | ||
12 | * modification, are permitted provided that the following conditions | ||
13 | * are met: | ||
14 | * 1. Redistributions of source code must retain the above copyright | ||
15 | * notice, this list of conditions, and the following disclaimer, | ||
16 | * without modification. | ||
17 | * 2. Redistributions in binary form must reproduce at minimum a disclaimer | ||
18 | * substantially similar to the "NO WARRANTY" disclaimer below | ||
19 | * ("Disclaimer") and any redistribution must be conditioned upon | ||
20 | * including a substantially similar Disclaimer requirement for further | ||
21 | * binary redistribution. | ||
22 | * 3. Neither the names of the above-listed copyright holders nor the names | ||
23 | * of any contributors may be used to endorse or promote products derived | ||
24 | * from this software without specific prior written permission. | ||
25 | * | ||
26 | * Alternatively, this software may be distributed under the terms of the | ||
27 | * GNU General Public License ("GPL") version 2 as published by the Free | ||
28 | * Software Foundation. | ||
29 | * | ||
30 | * NO WARRANTY | ||
31 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
32 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
33 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR | ||
34 | * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||
35 | * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||
36 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||
37 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||
38 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | ||
39 | * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING | ||
40 | * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||
41 | * POSSIBILITY OF SUCH DAMAGES. | ||
42 | */ | ||
43 | |||
44 | #include <acpi/acpi.h> | ||
45 | #include "accommon.h" | ||
46 | #include "acevents.h" | ||
47 | |||
48 | #define _COMPONENT ACPI_EVENTS | ||
49 | ACPI_MODULE_NAME("evgpeutil") | ||
50 | |||
51 | /******************************************************************************* | ||
52 | * | ||
53 | * FUNCTION: acpi_ev_walk_gpe_list | ||
54 | * | ||
55 | * PARAMETERS: gpe_walk_callback - Routine called for each GPE block | ||
56 | * Context - Value passed to callback | ||
57 | * | ||
58 | * RETURN: Status | ||
59 | * | ||
60 | * DESCRIPTION: Walk the GPE lists. | ||
61 | * | ||
62 | ******************************************************************************/ | ||
63 | acpi_status | ||
64 | acpi_ev_walk_gpe_list(acpi_gpe_callback gpe_walk_callback, void *context) | ||
65 | { | ||
66 | struct acpi_gpe_block_info *gpe_block; | ||
67 | struct acpi_gpe_xrupt_info *gpe_xrupt_info; | ||
68 | acpi_status status = AE_OK; | ||
69 | acpi_cpu_flags flags; | ||
70 | |||
71 | ACPI_FUNCTION_TRACE(ev_walk_gpe_list); | ||
72 | |||
73 | flags = acpi_os_acquire_lock(acpi_gbl_gpe_lock); | ||
74 | |||
75 | /* Walk the interrupt level descriptor list */ | ||
76 | |||
77 | gpe_xrupt_info = acpi_gbl_gpe_xrupt_list_head; | ||
78 | while (gpe_xrupt_info) { | ||
79 | |||
80 | /* Walk all Gpe Blocks attached to this interrupt level */ | ||
81 | |||
82 | gpe_block = gpe_xrupt_info->gpe_block_list_head; | ||
83 | while (gpe_block) { | ||
84 | |||
85 | /* One callback per GPE block */ | ||
86 | |||
87 | status = | ||
88 | gpe_walk_callback(gpe_xrupt_info, gpe_block, | ||
89 | context); | ||
90 | if (ACPI_FAILURE(status)) { | ||
91 | if (status == AE_CTRL_END) { /* Callback abort */ | ||
92 | status = AE_OK; | ||
93 | } | ||
94 | goto unlock_and_exit; | ||
95 | } | ||
96 | |||
97 | gpe_block = gpe_block->next; | ||
98 | } | ||
99 | |||
100 | gpe_xrupt_info = gpe_xrupt_info->next; | ||
101 | } | ||
102 | |||
103 | unlock_and_exit: | ||
104 | acpi_os_release_lock(acpi_gbl_gpe_lock, flags); | ||
105 | return_ACPI_STATUS(status); | ||
106 | } | ||
107 | |||
108 | /******************************************************************************* | ||
109 | * | ||
110 | * FUNCTION: acpi_ev_valid_gpe_event | ||
111 | * | ||
112 | * PARAMETERS: gpe_event_info - Info for this GPE | ||
113 | * | ||
114 | * RETURN: TRUE if the gpe_event is valid | ||
115 | * | ||
116 | * DESCRIPTION: Validate a GPE event. DO NOT CALL FROM INTERRUPT LEVEL. | ||
117 | * Should be called only when the GPE lists are semaphore locked | ||
118 | * and not subject to change. | ||
119 | * | ||
120 | ******************************************************************************/ | ||
121 | |||
122 | u8 acpi_ev_valid_gpe_event(struct acpi_gpe_event_info *gpe_event_info) | ||
123 | { | ||
124 | struct acpi_gpe_xrupt_info *gpe_xrupt_block; | ||
125 | struct acpi_gpe_block_info *gpe_block; | ||
126 | |||
127 | ACPI_FUNCTION_ENTRY(); | ||
128 | |||
129 | /* No need for spin lock since we are not changing any list elements */ | ||
130 | |||
131 | /* Walk the GPE interrupt levels */ | ||
132 | |||
133 | gpe_xrupt_block = acpi_gbl_gpe_xrupt_list_head; | ||
134 | while (gpe_xrupt_block) { | ||
135 | gpe_block = gpe_xrupt_block->gpe_block_list_head; | ||
136 | |||
137 | /* Walk the GPE blocks on this interrupt level */ | ||
138 | |||
139 | while (gpe_block) { | ||
140 | if ((&gpe_block->event_info[0] <= gpe_event_info) && | ||
141 | (&gpe_block->event_info[gpe_block->gpe_count] > | ||
142 | gpe_event_info)) { | ||
143 | return (TRUE); | ||
144 | } | ||
145 | |||
146 | gpe_block = gpe_block->next; | ||
147 | } | ||
148 | |||
149 | gpe_xrupt_block = gpe_xrupt_block->next; | ||
150 | } | ||
151 | |||
152 | return (FALSE); | ||
153 | } | ||
154 | |||
155 | /******************************************************************************* | ||
156 | * | ||
157 | * FUNCTION: acpi_ev_get_gpe_xrupt_block | ||
158 | * | ||
159 | * PARAMETERS: interrupt_number - Interrupt for a GPE block | ||
160 | * | ||
161 | * RETURN: A GPE interrupt block | ||
162 | * | ||
163 | * DESCRIPTION: Get or Create a GPE interrupt block. There is one interrupt | ||
164 | * block per unique interrupt level used for GPEs. Should be | ||
165 | * called only when the GPE lists are semaphore locked and not | ||
166 | * subject to change. | ||
167 | * | ||
168 | ******************************************************************************/ | ||
169 | |||
170 | struct acpi_gpe_xrupt_info *acpi_ev_get_gpe_xrupt_block(u32 interrupt_number) | ||
171 | { | ||
172 | struct acpi_gpe_xrupt_info *next_gpe_xrupt; | ||
173 | struct acpi_gpe_xrupt_info *gpe_xrupt; | ||
174 | acpi_status status; | ||
175 | acpi_cpu_flags flags; | ||
176 | |||
177 | ACPI_FUNCTION_TRACE(ev_get_gpe_xrupt_block); | ||
178 | |||
179 | /* No need for lock since we are not changing any list elements here */ | ||
180 | |||
181 | next_gpe_xrupt = acpi_gbl_gpe_xrupt_list_head; | ||
182 | while (next_gpe_xrupt) { | ||
183 | if (next_gpe_xrupt->interrupt_number == interrupt_number) { | ||
184 | return_PTR(next_gpe_xrupt); | ||
185 | } | ||
186 | |||
187 | next_gpe_xrupt = next_gpe_xrupt->next; | ||
188 | } | ||
189 | |||
190 | /* Not found, must allocate a new xrupt descriptor */ | ||
191 | |||
192 | gpe_xrupt = ACPI_ALLOCATE_ZEROED(sizeof(struct acpi_gpe_xrupt_info)); | ||
193 | if (!gpe_xrupt) { | ||
194 | return_PTR(NULL); | ||
195 | } | ||
196 | |||
197 | gpe_xrupt->interrupt_number = interrupt_number; | ||
198 | |||
199 | /* Install new interrupt descriptor with spin lock */ | ||
200 | |||
201 | flags = acpi_os_acquire_lock(acpi_gbl_gpe_lock); | ||
202 | if (acpi_gbl_gpe_xrupt_list_head) { | ||
203 | next_gpe_xrupt = acpi_gbl_gpe_xrupt_list_head; | ||
204 | while (next_gpe_xrupt->next) { | ||
205 | next_gpe_xrupt = next_gpe_xrupt->next; | ||
206 | } | ||
207 | |||
208 | next_gpe_xrupt->next = gpe_xrupt; | ||
209 | gpe_xrupt->previous = next_gpe_xrupt; | ||
210 | } else { | ||
211 | acpi_gbl_gpe_xrupt_list_head = gpe_xrupt; | ||
212 | } | ||
213 | acpi_os_release_lock(acpi_gbl_gpe_lock, flags); | ||
214 | |||
215 | /* Install new interrupt handler if not SCI_INT */ | ||
216 | |||
217 | if (interrupt_number != acpi_gbl_FADT.sci_interrupt) { | ||
218 | status = acpi_os_install_interrupt_handler(interrupt_number, | ||
219 | acpi_ev_gpe_xrupt_handler, | ||
220 | gpe_xrupt); | ||
221 | if (ACPI_FAILURE(status)) { | ||
222 | ACPI_ERROR((AE_INFO, | ||
223 | "Could not install GPE interrupt handler at level 0x%X", | ||
224 | interrupt_number)); | ||
225 | return_PTR(NULL); | ||
226 | } | ||
227 | } | ||
228 | |||
229 | return_PTR(gpe_xrupt); | ||
230 | } | ||
231 | |||
232 | /******************************************************************************* | ||
233 | * | ||
234 | * FUNCTION: acpi_ev_delete_gpe_xrupt | ||
235 | * | ||
236 | * PARAMETERS: gpe_xrupt - A GPE interrupt info block | ||
237 | * | ||
238 | * RETURN: Status | ||
239 | * | ||
240 | * DESCRIPTION: Remove and free a gpe_xrupt block. Remove an associated | ||
241 | * interrupt handler if not the SCI interrupt. | ||
242 | * | ||
243 | ******************************************************************************/ | ||
244 | |||
245 | acpi_status acpi_ev_delete_gpe_xrupt(struct acpi_gpe_xrupt_info *gpe_xrupt) | ||
246 | { | ||
247 | acpi_status status; | ||
248 | acpi_cpu_flags flags; | ||
249 | |||
250 | ACPI_FUNCTION_TRACE(ev_delete_gpe_xrupt); | ||
251 | |||
252 | /* We never want to remove the SCI interrupt handler */ | ||
253 | |||
254 | if (gpe_xrupt->interrupt_number == acpi_gbl_FADT.sci_interrupt) { | ||
255 | gpe_xrupt->gpe_block_list_head = NULL; | ||
256 | return_ACPI_STATUS(AE_OK); | ||
257 | } | ||
258 | |||
259 | /* Disable this interrupt */ | ||
260 | |||
261 | status = | ||
262 | acpi_os_remove_interrupt_handler(gpe_xrupt->interrupt_number, | ||
263 | acpi_ev_gpe_xrupt_handler); | ||
264 | if (ACPI_FAILURE(status)) { | ||
265 | return_ACPI_STATUS(status); | ||
266 | } | ||
267 | |||
268 | /* Unlink the interrupt block with lock */ | ||
269 | |||
270 | flags = acpi_os_acquire_lock(acpi_gbl_gpe_lock); | ||
271 | if (gpe_xrupt->previous) { | ||
272 | gpe_xrupt->previous->next = gpe_xrupt->next; | ||
273 | } else { | ||
274 | /* No previous, update list head */ | ||
275 | |||
276 | acpi_gbl_gpe_xrupt_list_head = gpe_xrupt->next; | ||
277 | } | ||
278 | |||
279 | if (gpe_xrupt->next) { | ||
280 | gpe_xrupt->next->previous = gpe_xrupt->previous; | ||
281 | } | ||
282 | acpi_os_release_lock(acpi_gbl_gpe_lock, flags); | ||
283 | |||
284 | /* Free the block */ | ||
285 | |||
286 | ACPI_FREE(gpe_xrupt); | ||
287 | return_ACPI_STATUS(AE_OK); | ||
288 | } | ||
289 | |||
290 | /******************************************************************************* | ||
291 | * | ||
292 | * FUNCTION: acpi_ev_delete_gpe_handlers | ||
293 | * | ||
294 | * PARAMETERS: gpe_xrupt_info - GPE Interrupt info | ||
295 | * gpe_block - Gpe Block info | ||
296 | * | ||
297 | * RETURN: Status | ||
298 | * | ||
299 | * DESCRIPTION: Delete all Handler objects found in the GPE data structs. | ||
300 | * Used only prior to termination. | ||
301 | * | ||
302 | ******************************************************************************/ | ||
303 | |||
304 | acpi_status | ||
305 | acpi_ev_delete_gpe_handlers(struct acpi_gpe_xrupt_info *gpe_xrupt_info, | ||
306 | struct acpi_gpe_block_info *gpe_block, | ||
307 | void *context) | ||
308 | { | ||
309 | struct acpi_gpe_event_info *gpe_event_info; | ||
310 | u32 i; | ||
311 | u32 j; | ||
312 | |||
313 | ACPI_FUNCTION_TRACE(ev_delete_gpe_handlers); | ||
314 | |||
315 | /* Examine each GPE Register within the block */ | ||
316 | |||
317 | for (i = 0; i < gpe_block->register_count; i++) { | ||
318 | |||
319 | /* Now look at the individual GPEs in this byte register */ | ||
320 | |||
321 | for (j = 0; j < ACPI_GPE_REGISTER_WIDTH; j++) { | ||
322 | gpe_event_info = &gpe_block->event_info[((acpi_size) i * | ||
323 | ACPI_GPE_REGISTER_WIDTH) | ||
324 | + j]; | ||
325 | |||
326 | if ((gpe_event_info->flags & ACPI_GPE_DISPATCH_MASK) == | ||
327 | ACPI_GPE_DISPATCH_HANDLER) { | ||
328 | ACPI_FREE(gpe_event_info->dispatch.handler); | ||
329 | gpe_event_info->dispatch.handler = NULL; | ||
330 | gpe_event_info->flags &= | ||
331 | ~ACPI_GPE_DISPATCH_MASK; | ||
332 | } | ||
333 | } | ||
334 | } | ||
335 | |||
336 | return_ACPI_STATUS(AE_OK); | ||
337 | } | ||
diff --git a/drivers/acpi/acpica/evmisc.c b/drivers/acpi/acpica/evmisc.c index 9a3cb7045a32..df0aea9a8cfd 100644 --- a/drivers/acpi/acpica/evmisc.c +++ b/drivers/acpi/acpica/evmisc.c | |||
@@ -590,7 +590,7 @@ void acpi_ev_terminate(void) | |||
590 | status = acpi_disable_event(i, 0); | 590 | status = acpi_disable_event(i, 0); |
591 | if (ACPI_FAILURE(status)) { | 591 | if (ACPI_FAILURE(status)) { |
592 | ACPI_ERROR((AE_INFO, | 592 | ACPI_ERROR((AE_INFO, |
593 | "Could not disable fixed event %d", | 593 | "Could not disable fixed event %u", |
594 | (u32) i)); | 594 | (u32) i)); |
595 | } | 595 | } |
596 | } | 596 | } |
diff --git a/drivers/acpi/acpica/evxface.c b/drivers/acpi/acpica/evxface.c index b40757955f9b..cc825023012a 100644 --- a/drivers/acpi/acpica/evxface.c +++ b/drivers/acpi/acpica/evxface.c | |||
@@ -142,7 +142,7 @@ acpi_install_fixed_event_handler(u32 event, | |||
142 | if (ACPI_SUCCESS(status)) | 142 | if (ACPI_SUCCESS(status)) |
143 | status = acpi_enable_event(event, 0); | 143 | status = acpi_enable_event(event, 0); |
144 | if (ACPI_FAILURE(status)) { | 144 | if (ACPI_FAILURE(status)) { |
145 | ACPI_WARNING((AE_INFO, "Could not enable fixed event %X", | 145 | ACPI_WARNING((AE_INFO, "Could not enable fixed event 0x%X", |
146 | event)); | 146 | event)); |
147 | 147 | ||
148 | /* Remove the handler */ | 148 | /* Remove the handler */ |
@@ -203,7 +203,7 @@ acpi_remove_fixed_event_handler(u32 event, acpi_event_handler handler) | |||
203 | 203 | ||
204 | if (ACPI_FAILURE(status)) { | 204 | if (ACPI_FAILURE(status)) { |
205 | ACPI_WARNING((AE_INFO, | 205 | ACPI_WARNING((AE_INFO, |
206 | "Could not write to fixed event enable register %X", | 206 | "Could not write to fixed event enable register 0x%X", |
207 | event)); | 207 | event)); |
208 | } else { | 208 | } else { |
209 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Disabled fixed event %X\n", | 209 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Disabled fixed event %X\n", |
@@ -682,14 +682,13 @@ acpi_install_gpe_handler(acpi_handle gpe_device, | |||
682 | 682 | ||
683 | /* Parameter validation */ | 683 | /* Parameter validation */ |
684 | 684 | ||
685 | if ((!address) || (type > ACPI_GPE_XRUPT_TYPE_MASK)) { | 685 | if ((!address) || (type & ~ACPI_GPE_XRUPT_TYPE_MASK)) { |
686 | status = AE_BAD_PARAMETER; | 686 | return_ACPI_STATUS(AE_BAD_PARAMETER); |
687 | goto exit; | ||
688 | } | 687 | } |
689 | 688 | ||
690 | status = acpi_ut_acquire_mutex(ACPI_MTX_EVENTS); | 689 | status = acpi_ut_acquire_mutex(ACPI_MTX_EVENTS); |
691 | if (ACPI_FAILURE(status)) { | 690 | if (ACPI_FAILURE(status)) { |
692 | goto exit; | 691 | return_ACPI_STATUS(status); |
693 | } | 692 | } |
694 | 693 | ||
695 | /* Ensure that we have a valid GPE number */ | 694 | /* Ensure that we have a valid GPE number */ |
@@ -720,6 +719,13 @@ acpi_install_gpe_handler(acpi_handle gpe_device, | |||
720 | handler->context = context; | 719 | handler->context = context; |
721 | handler->method_node = gpe_event_info->dispatch.method_node; | 720 | handler->method_node = gpe_event_info->dispatch.method_node; |
722 | 721 | ||
722 | /* Disable the GPE before installing the handler */ | ||
723 | |||
724 | status = acpi_ev_disable_gpe(gpe_event_info); | ||
725 | if (ACPI_FAILURE (status)) { | ||
726 | goto unlock_and_exit; | ||
727 | } | ||
728 | |||
723 | /* Install the handler */ | 729 | /* Install the handler */ |
724 | 730 | ||
725 | flags = acpi_os_acquire_lock(acpi_gbl_gpe_lock); | 731 | flags = acpi_os_acquire_lock(acpi_gbl_gpe_lock); |
@@ -733,12 +739,8 @@ acpi_install_gpe_handler(acpi_handle gpe_device, | |||
733 | 739 | ||
734 | acpi_os_release_lock(acpi_gbl_gpe_lock, flags); | 740 | acpi_os_release_lock(acpi_gbl_gpe_lock, flags); |
735 | 741 | ||
736 | unlock_and_exit: | 742 | unlock_and_exit: |
737 | (void)acpi_ut_release_mutex(ACPI_MTX_EVENTS); | 743 | (void)acpi_ut_release_mutex(ACPI_MTX_EVENTS); |
738 | exit: | ||
739 | if (ACPI_FAILURE(status)) | ||
740 | ACPI_EXCEPTION((AE_INFO, status, | ||
741 | "Installing notify handler failed")); | ||
742 | return_ACPI_STATUS(status); | 744 | return_ACPI_STATUS(status); |
743 | } | 745 | } |
744 | 746 | ||
diff --git a/drivers/acpi/acpica/evxfevnt.c b/drivers/acpi/acpica/evxfevnt.c index 5ff32c78ea2d..7c7bbb4d402c 100644 --- a/drivers/acpi/acpica/evxfevnt.c +++ b/drivers/acpi/acpica/evxfevnt.c | |||
@@ -203,21 +203,26 @@ ACPI_EXPORT_SYMBOL(acpi_enable_event) | |||
203 | * | 203 | * |
204 | * FUNCTION: acpi_set_gpe | 204 | * FUNCTION: acpi_set_gpe |
205 | * | 205 | * |
206 | * PARAMETERS: gpe_device - Parent GPE Device | 206 | * PARAMETERS: gpe_device - Parent GPE Device. NULL for GPE0/GPE1 |
207 | * gpe_number - GPE level within the GPE block | 207 | * gpe_number - GPE level within the GPE block |
208 | * action - Enable or disable | 208 | * action - ACPI_GPE_ENABLE or ACPI_GPE_DISABLE |
209 | * Called from ISR or not | ||
210 | * | 209 | * |
211 | * RETURN: Status | 210 | * RETURN: Status |
212 | * | 211 | * |
213 | * DESCRIPTION: Enable or disable an ACPI event (general purpose) | 212 | * DESCRIPTION: Enable or disable an individual GPE. This function bypasses |
213 | * the reference count mechanism used in the acpi_enable_gpe and | ||
214 | * acpi_disable_gpe interfaces -- and should be used with care. | ||
215 | * | ||
216 | * Note: Typically used to disable a runtime GPE for short period of time, | ||
217 | * then re-enable it, without disturbing the existing reference counts. This | ||
218 | * is useful, for example, in the Embedded Controller (EC) driver. | ||
214 | * | 219 | * |
215 | ******************************************************************************/ | 220 | ******************************************************************************/ |
216 | acpi_status acpi_set_gpe(acpi_handle gpe_device, u32 gpe_number, u8 action) | 221 | acpi_status acpi_set_gpe(acpi_handle gpe_device, u32 gpe_number, u8 action) |
217 | { | 222 | { |
218 | acpi_status status = AE_OK; | ||
219 | acpi_cpu_flags flags; | ||
220 | struct acpi_gpe_event_info *gpe_event_info; | 223 | struct acpi_gpe_event_info *gpe_event_info; |
224 | acpi_status status; | ||
225 | acpi_cpu_flags flags; | ||
221 | 226 | ||
222 | ACPI_FUNCTION_TRACE(acpi_set_gpe); | 227 | ACPI_FUNCTION_TRACE(acpi_set_gpe); |
223 | 228 | ||
@@ -243,7 +248,6 @@ acpi_status acpi_set_gpe(acpi_handle gpe_device, u32 gpe_number, u8 action) | |||
243 | break; | 248 | break; |
244 | 249 | ||
245 | default: | 250 | default: |
246 | ACPI_ERROR((AE_INFO, "Invalid action\n")); | ||
247 | status = AE_BAD_PARAMETER; | 251 | status = AE_BAD_PARAMETER; |
248 | break; | 252 | break; |
249 | } | 253 | } |
@@ -259,25 +263,31 @@ ACPI_EXPORT_SYMBOL(acpi_set_gpe) | |||
259 | * | 263 | * |
260 | * FUNCTION: acpi_enable_gpe | 264 | * FUNCTION: acpi_enable_gpe |
261 | * | 265 | * |
262 | * PARAMETERS: gpe_device - Parent GPE Device | 266 | * PARAMETERS: gpe_device - Parent GPE Device. NULL for GPE0/GPE1 |
263 | * gpe_number - GPE level within the GPE block | 267 | * gpe_number - GPE level within the GPE block |
264 | * type - Purpose the GPE will be used for | 268 | * gpe_type - ACPI_GPE_TYPE_RUNTIME or ACPI_GPE_TYPE_WAKE |
269 | * or both | ||
265 | * | 270 | * |
266 | * RETURN: Status | 271 | * RETURN: Status |
267 | * | 272 | * |
268 | * DESCRIPTION: Take a reference to a GPE and enable it if necessary | 273 | * DESCRIPTION: Add a reference to a GPE. On the first reference, the GPE is |
274 | * hardware-enabled (for runtime GPEs), or the GPE register mask | ||
275 | * is updated (for wake GPEs). | ||
269 | * | 276 | * |
270 | ******************************************************************************/ | 277 | ******************************************************************************/ |
271 | acpi_status acpi_enable_gpe(acpi_handle gpe_device, u32 gpe_number, u8 type) | 278 | acpi_status acpi_enable_gpe(acpi_handle gpe_device, u32 gpe_number, u8 gpe_type) |
272 | { | 279 | { |
273 | acpi_status status = AE_OK; | 280 | acpi_status status = AE_OK; |
274 | acpi_cpu_flags flags; | ||
275 | struct acpi_gpe_event_info *gpe_event_info; | 281 | struct acpi_gpe_event_info *gpe_event_info; |
282 | acpi_cpu_flags flags; | ||
276 | 283 | ||
277 | ACPI_FUNCTION_TRACE(acpi_enable_gpe); | 284 | ACPI_FUNCTION_TRACE(acpi_enable_gpe); |
278 | 285 | ||
279 | if (type & ~ACPI_GPE_TYPE_WAKE_RUN) | 286 | /* Parameter validation */ |
287 | |||
288 | if (!gpe_type || (gpe_type & ~ACPI_GPE_TYPE_WAKE_RUN)) { | ||
280 | return_ACPI_STATUS(AE_BAD_PARAMETER); | 289 | return_ACPI_STATUS(AE_BAD_PARAMETER); |
290 | } | ||
281 | 291 | ||
282 | flags = acpi_os_acquire_lock(acpi_gbl_gpe_lock); | 292 | flags = acpi_os_acquire_lock(acpi_gbl_gpe_lock); |
283 | 293 | ||
@@ -289,26 +299,43 @@ acpi_status acpi_enable_gpe(acpi_handle gpe_device, u32 gpe_number, u8 type) | |||
289 | goto unlock_and_exit; | 299 | goto unlock_and_exit; |
290 | } | 300 | } |
291 | 301 | ||
292 | if (type & ACPI_GPE_TYPE_RUNTIME) { | 302 | if (gpe_type & ACPI_GPE_TYPE_RUNTIME) { |
293 | if (++gpe_event_info->runtime_count == 1) { | 303 | if (gpe_event_info->runtime_count == ACPI_UINT8_MAX) { |
304 | status = AE_LIMIT; /* Too many references */ | ||
305 | goto unlock_and_exit; | ||
306 | } | ||
307 | |||
308 | gpe_event_info->runtime_count++; | ||
309 | if (gpe_event_info->runtime_count == 1) { | ||
294 | status = acpi_ev_enable_gpe(gpe_event_info); | 310 | status = acpi_ev_enable_gpe(gpe_event_info); |
295 | if (ACPI_FAILURE(status)) | 311 | if (ACPI_FAILURE(status)) { |
296 | gpe_event_info->runtime_count--; | 312 | gpe_event_info->runtime_count--; |
313 | goto unlock_and_exit; | ||
314 | } | ||
297 | } | 315 | } |
298 | } | 316 | } |
299 | 317 | ||
300 | if (type & ACPI_GPE_TYPE_WAKE) { | 318 | if (gpe_type & ACPI_GPE_TYPE_WAKE) { |
319 | /* The GPE must have the ability to wake the system */ | ||
320 | |||
301 | if (!(gpe_event_info->flags & ACPI_GPE_CAN_WAKE)) { | 321 | if (!(gpe_event_info->flags & ACPI_GPE_CAN_WAKE)) { |
302 | status = AE_BAD_PARAMETER; | 322 | status = AE_TYPE; |
323 | goto unlock_and_exit; | ||
324 | } | ||
325 | |||
326 | if (gpe_event_info->wakeup_count == ACPI_UINT8_MAX) { | ||
327 | status = AE_LIMIT; /* Too many references */ | ||
303 | goto unlock_and_exit; | 328 | goto unlock_and_exit; |
304 | } | 329 | } |
305 | 330 | ||
306 | /* | 331 | /* |
307 | * Wake-up GPEs are only enabled right prior to putting the | 332 | * Update the enable mask on the first wakeup reference. Wake GPEs |
308 | * system into a sleep state. | 333 | * are only hardware-enabled just before sleeping. |
309 | */ | 334 | */ |
310 | if (++gpe_event_info->wakeup_count == 1) | 335 | gpe_event_info->wakeup_count++; |
311 | acpi_ev_update_gpe_enable_masks(gpe_event_info); | 336 | if (gpe_event_info->wakeup_count == 1) { |
337 | (void)acpi_ev_update_gpe_enable_masks(gpe_event_info); | ||
338 | } | ||
312 | } | 339 | } |
313 | 340 | ||
314 | unlock_and_exit: | 341 | unlock_and_exit: |
@@ -321,27 +348,34 @@ ACPI_EXPORT_SYMBOL(acpi_enable_gpe) | |||
321 | * | 348 | * |
322 | * FUNCTION: acpi_disable_gpe | 349 | * FUNCTION: acpi_disable_gpe |
323 | * | 350 | * |
324 | * PARAMETERS: gpe_device - Parent GPE Device | 351 | * PARAMETERS: gpe_device - Parent GPE Device. NULL for GPE0/GPE1 |
325 | * gpe_number - GPE level within the GPE block | 352 | * gpe_number - GPE level within the GPE block |
326 | * type - Purpose the GPE won't be used for any more | 353 | * gpe_type - ACPI_GPE_TYPE_RUNTIME or ACPI_GPE_TYPE_WAKE |
354 | * or both | ||
327 | * | 355 | * |
328 | * RETURN: Status | 356 | * RETURN: Status |
329 | * | 357 | * |
330 | * DESCRIPTION: Release a reference to a GPE and disable it if necessary | 358 | * DESCRIPTION: Remove a reference to a GPE. When the last reference is |
359 | * removed, only then is the GPE disabled (for runtime GPEs), or | ||
360 | * the GPE mask bit disabled (for wake GPEs) | ||
331 | * | 361 | * |
332 | ******************************************************************************/ | 362 | ******************************************************************************/ |
333 | acpi_status acpi_disable_gpe(acpi_handle gpe_device, u32 gpe_number, u8 type) | 363 | acpi_status acpi_disable_gpe(acpi_handle gpe_device, u32 gpe_number, u8 gpe_type) |
334 | { | 364 | { |
335 | acpi_status status = AE_OK; | 365 | acpi_status status = AE_OK; |
336 | acpi_cpu_flags flags; | ||
337 | struct acpi_gpe_event_info *gpe_event_info; | 366 | struct acpi_gpe_event_info *gpe_event_info; |
367 | acpi_cpu_flags flags; | ||
338 | 368 | ||
339 | ACPI_FUNCTION_TRACE(acpi_disable_gpe); | 369 | ACPI_FUNCTION_TRACE(acpi_disable_gpe); |
340 | 370 | ||
341 | if (type & ~ACPI_GPE_TYPE_WAKE_RUN) | 371 | /* Parameter validation */ |
372 | |||
373 | if (!gpe_type || (gpe_type & ~ACPI_GPE_TYPE_WAKE_RUN)) { | ||
342 | return_ACPI_STATUS(AE_BAD_PARAMETER); | 374 | return_ACPI_STATUS(AE_BAD_PARAMETER); |
375 | } | ||
343 | 376 | ||
344 | flags = acpi_os_acquire_lock(acpi_gbl_gpe_lock); | 377 | flags = acpi_os_acquire_lock(acpi_gbl_gpe_lock); |
378 | |||
345 | /* Ensure that we have a valid GPE number */ | 379 | /* Ensure that we have a valid GPE number */ |
346 | 380 | ||
347 | gpe_event_info = acpi_ev_get_gpe_event_info(gpe_device, gpe_number); | 381 | gpe_event_info = acpi_ev_get_gpe_event_info(gpe_device, gpe_number); |
@@ -350,18 +384,39 @@ acpi_status acpi_disable_gpe(acpi_handle gpe_device, u32 gpe_number, u8 type) | |||
350 | goto unlock_and_exit; | 384 | goto unlock_and_exit; |
351 | } | 385 | } |
352 | 386 | ||
353 | if ((type & ACPI_GPE_TYPE_RUNTIME) && gpe_event_info->runtime_count) { | 387 | /* Hardware-disable a runtime GPE on removal of the last reference */ |
354 | if (--gpe_event_info->runtime_count == 0) | 388 | |
389 | if (gpe_type & ACPI_GPE_TYPE_RUNTIME) { | ||
390 | if (!gpe_event_info->runtime_count) { | ||
391 | status = AE_LIMIT; /* There are no references to remove */ | ||
392 | goto unlock_and_exit; | ||
393 | } | ||
394 | |||
395 | gpe_event_info->runtime_count--; | ||
396 | if (!gpe_event_info->runtime_count) { | ||
355 | status = acpi_ev_disable_gpe(gpe_event_info); | 397 | status = acpi_ev_disable_gpe(gpe_event_info); |
398 | if (ACPI_FAILURE(status)) { | ||
399 | gpe_event_info->runtime_count++; | ||
400 | goto unlock_and_exit; | ||
401 | } | ||
402 | } | ||
356 | } | 403 | } |
357 | 404 | ||
358 | if ((type & ACPI_GPE_TYPE_WAKE) && gpe_event_info->wakeup_count) { | 405 | /* |
359 | /* | 406 | * Update masks for wake GPE on removal of the last reference. |
360 | * Wake-up GPEs are not enabled after leaving system sleep | 407 | * No need to hardware-disable wake GPEs here, they are not currently |
361 | * states, so we don't need to disable them here. | 408 | * enabled. |
362 | */ | 409 | */ |
363 | if (--gpe_event_info->wakeup_count == 0) | 410 | if (gpe_type & ACPI_GPE_TYPE_WAKE) { |
364 | acpi_ev_update_gpe_enable_masks(gpe_event_info); | 411 | if (!gpe_event_info->wakeup_count) { |
412 | status = AE_LIMIT; /* There are no references to remove */ | ||
413 | goto unlock_and_exit; | ||
414 | } | ||
415 | |||
416 | gpe_event_info->wakeup_count--; | ||
417 | if (!gpe_event_info->wakeup_count) { | ||
418 | (void)acpi_ev_update_gpe_enable_masks(gpe_event_info); | ||
419 | } | ||
365 | } | 420 | } |
366 | 421 | ||
367 | unlock_and_exit: | 422 | unlock_and_exit: |
@@ -465,30 +520,23 @@ ACPI_EXPORT_SYMBOL(acpi_clear_event) | |||
465 | * | 520 | * |
466 | * FUNCTION: acpi_clear_gpe | 521 | * FUNCTION: acpi_clear_gpe |
467 | * | 522 | * |
468 | * PARAMETERS: gpe_device - Parent GPE Device | 523 | * PARAMETERS: gpe_device - Parent GPE Device. NULL for GPE0/GPE1 |
469 | * gpe_number - GPE level within the GPE block | 524 | * gpe_number - GPE level within the GPE block |
470 | * Flags - Called from an ISR or not | ||
471 | * | 525 | * |
472 | * RETURN: Status | 526 | * RETURN: Status |
473 | * | 527 | * |
474 | * DESCRIPTION: Clear an ACPI event (general purpose) | 528 | * DESCRIPTION: Clear an ACPI event (general purpose) |
475 | * | 529 | * |
476 | ******************************************************************************/ | 530 | ******************************************************************************/ |
477 | acpi_status acpi_clear_gpe(acpi_handle gpe_device, u32 gpe_number, u32 flags) | 531 | acpi_status acpi_clear_gpe(acpi_handle gpe_device, u32 gpe_number) |
478 | { | 532 | { |
479 | acpi_status status = AE_OK; | 533 | acpi_status status = AE_OK; |
480 | struct acpi_gpe_event_info *gpe_event_info; | 534 | struct acpi_gpe_event_info *gpe_event_info; |
535 | acpi_cpu_flags flags; | ||
481 | 536 | ||
482 | ACPI_FUNCTION_TRACE(acpi_clear_gpe); | 537 | ACPI_FUNCTION_TRACE(acpi_clear_gpe); |
483 | 538 | ||
484 | /* Use semaphore lock if not executing at interrupt level */ | 539 | flags = acpi_os_acquire_lock(acpi_gbl_gpe_lock); |
485 | |||
486 | if (flags & ACPI_NOT_ISR) { | ||
487 | status = acpi_ut_acquire_mutex(ACPI_MTX_EVENTS); | ||
488 | if (ACPI_FAILURE(status)) { | ||
489 | return_ACPI_STATUS(status); | ||
490 | } | ||
491 | } | ||
492 | 540 | ||
493 | /* Ensure that we have a valid GPE number */ | 541 | /* Ensure that we have a valid GPE number */ |
494 | 542 | ||
@@ -501,9 +549,7 @@ acpi_status acpi_clear_gpe(acpi_handle gpe_device, u32 gpe_number, u32 flags) | |||
501 | status = acpi_hw_clear_gpe(gpe_event_info); | 549 | status = acpi_hw_clear_gpe(gpe_event_info); |
502 | 550 | ||
503 | unlock_and_exit: | 551 | unlock_and_exit: |
504 | if (flags & ACPI_NOT_ISR) { | 552 | acpi_os_release_lock(acpi_gbl_gpe_lock, flags); |
505 | (void)acpi_ut_release_mutex(ACPI_MTX_EVENTS); | ||
506 | } | ||
507 | return_ACPI_STATUS(status); | 553 | return_ACPI_STATUS(status); |
508 | } | 554 | } |
509 | 555 | ||
@@ -569,9 +615,8 @@ ACPI_EXPORT_SYMBOL(acpi_get_event_status) | |||
569 | * | 615 | * |
570 | * FUNCTION: acpi_get_gpe_status | 616 | * FUNCTION: acpi_get_gpe_status |
571 | * | 617 | * |
572 | * PARAMETERS: gpe_device - Parent GPE Device | 618 | * PARAMETERS: gpe_device - Parent GPE Device. NULL for GPE0/GPE1 |
573 | * gpe_number - GPE level within the GPE block | 619 | * gpe_number - GPE level within the GPE block |
574 | * Flags - Called from an ISR or not | ||
575 | * event_status - Where the current status of the event will | 620 | * event_status - Where the current status of the event will |
576 | * be returned | 621 | * be returned |
577 | * | 622 | * |
@@ -582,21 +627,15 @@ ACPI_EXPORT_SYMBOL(acpi_get_event_status) | |||
582 | ******************************************************************************/ | 627 | ******************************************************************************/ |
583 | acpi_status | 628 | acpi_status |
584 | acpi_get_gpe_status(acpi_handle gpe_device, | 629 | acpi_get_gpe_status(acpi_handle gpe_device, |
585 | u32 gpe_number, u32 flags, acpi_event_status * event_status) | 630 | u32 gpe_number, acpi_event_status *event_status) |
586 | { | 631 | { |
587 | acpi_status status = AE_OK; | 632 | acpi_status status = AE_OK; |
588 | struct acpi_gpe_event_info *gpe_event_info; | 633 | struct acpi_gpe_event_info *gpe_event_info; |
634 | acpi_cpu_flags flags; | ||
589 | 635 | ||
590 | ACPI_FUNCTION_TRACE(acpi_get_gpe_status); | 636 | ACPI_FUNCTION_TRACE(acpi_get_gpe_status); |
591 | 637 | ||
592 | /* Use semaphore lock if not executing at interrupt level */ | 638 | flags = acpi_os_acquire_lock(acpi_gbl_gpe_lock); |
593 | |||
594 | if (flags & ACPI_NOT_ISR) { | ||
595 | status = acpi_ut_acquire_mutex(ACPI_MTX_EVENTS); | ||
596 | if (ACPI_FAILURE(status)) { | ||
597 | return_ACPI_STATUS(status); | ||
598 | } | ||
599 | } | ||
600 | 639 | ||
601 | /* Ensure that we have a valid GPE number */ | 640 | /* Ensure that we have a valid GPE number */ |
602 | 641 | ||
@@ -614,9 +653,7 @@ acpi_get_gpe_status(acpi_handle gpe_device, | |||
614 | *event_status |= ACPI_EVENT_FLAG_HANDLE; | 653 | *event_status |= ACPI_EVENT_FLAG_HANDLE; |
615 | 654 | ||
616 | unlock_and_exit: | 655 | unlock_and_exit: |
617 | if (flags & ACPI_NOT_ISR) { | 656 | acpi_os_release_lock(acpi_gbl_gpe_lock, flags); |
618 | (void)acpi_ut_release_mutex(ACPI_MTX_EVENTS); | ||
619 | } | ||
620 | return_ACPI_STATUS(status); | 657 | return_ACPI_STATUS(status); |
621 | } | 658 | } |
622 | 659 | ||
@@ -673,20 +710,15 @@ acpi_install_gpe_block(acpi_handle gpe_device, | |||
673 | goto unlock_and_exit; | 710 | goto unlock_and_exit; |
674 | } | 711 | } |
675 | 712 | ||
676 | /* Run the _PRW methods and enable the GPEs */ | 713 | /* Install block in the device_object attached to the node */ |
677 | |||
678 | status = acpi_ev_initialize_gpe_block(node, gpe_block); | ||
679 | if (ACPI_FAILURE(status)) { | ||
680 | goto unlock_and_exit; | ||
681 | } | ||
682 | |||
683 | /* Get the device_object attached to the node */ | ||
684 | 714 | ||
685 | obj_desc = acpi_ns_get_attached_object(node); | 715 | obj_desc = acpi_ns_get_attached_object(node); |
686 | if (!obj_desc) { | 716 | if (!obj_desc) { |
687 | 717 | ||
688 | /* No object, create a new one */ | 718 | /* |
689 | 719 | * No object, create a new one (Device nodes do not always have | |
720 | * an attached object) | ||
721 | */ | ||
690 | obj_desc = acpi_ut_create_internal_object(ACPI_TYPE_DEVICE); | 722 | obj_desc = acpi_ut_create_internal_object(ACPI_TYPE_DEVICE); |
691 | if (!obj_desc) { | 723 | if (!obj_desc) { |
692 | status = AE_NO_MEMORY; | 724 | status = AE_NO_MEMORY; |
@@ -705,10 +737,14 @@ acpi_install_gpe_block(acpi_handle gpe_device, | |||
705 | } | 737 | } |
706 | } | 738 | } |
707 | 739 | ||
708 | /* Install the GPE block in the device_object */ | 740 | /* Now install the GPE block in the device_object */ |
709 | 741 | ||
710 | obj_desc->device.gpe_block = gpe_block; | 742 | obj_desc->device.gpe_block = gpe_block; |
711 | 743 | ||
744 | /* Run the _PRW methods and enable the runtime GPEs in the new block */ | ||
745 | |||
746 | status = acpi_ev_initialize_gpe_block(node, gpe_block); | ||
747 | |||
712 | unlock_and_exit: | 748 | unlock_and_exit: |
713 | (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE); | 749 | (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE); |
714 | return_ACPI_STATUS(status); | 750 | return_ACPI_STATUS(status); |
@@ -839,8 +875,7 @@ acpi_ev_get_gpe_device(struct acpi_gpe_xrupt_info *gpe_xrupt_info, | |||
839 | 875 | ||
840 | /* Increment Index by the number of GPEs in this block */ | 876 | /* Increment Index by the number of GPEs in this block */ |
841 | 877 | ||
842 | info->next_block_base_index += | 878 | info->next_block_base_index += gpe_block->gpe_count; |
843 | (gpe_block->register_count * ACPI_GPE_REGISTER_WIDTH); | ||
844 | 879 | ||
845 | if (info->index < info->next_block_base_index) { | 880 | if (info->index < info->next_block_base_index) { |
846 | /* | 881 | /* |
diff --git a/drivers/acpi/acpica/exconfig.c b/drivers/acpi/acpica/exconfig.c index 7e8b3bedc376..008621c5ad85 100644 --- a/drivers/acpi/acpica/exconfig.c +++ b/drivers/acpi/acpica/exconfig.c | |||
@@ -82,8 +82,9 @@ acpi_ex_add_table(u32 table_index, | |||
82 | struct acpi_namespace_node *parent_node, | 82 | struct acpi_namespace_node *parent_node, |
83 | union acpi_operand_object **ddb_handle) | 83 | union acpi_operand_object **ddb_handle) |
84 | { | 84 | { |
85 | acpi_status status; | ||
86 | union acpi_operand_object *obj_desc; | 85 | union acpi_operand_object *obj_desc; |
86 | acpi_status status; | ||
87 | acpi_owner_id owner_id; | ||
87 | 88 | ||
88 | ACPI_FUNCTION_TRACE(ex_add_table); | 89 | ACPI_FUNCTION_TRACE(ex_add_table); |
89 | 90 | ||
@@ -119,7 +120,14 @@ acpi_ex_add_table(u32 table_index, | |||
119 | acpi_ns_exec_module_code_list(); | 120 | acpi_ns_exec_module_code_list(); |
120 | acpi_ex_enter_interpreter(); | 121 | acpi_ex_enter_interpreter(); |
121 | 122 | ||
122 | return_ACPI_STATUS(status); | 123 | /* Update GPEs for any new _PRW or _Lxx/_Exx methods. Ignore errors */ |
124 | |||
125 | status = acpi_tb_get_owner_id(table_index, &owner_id); | ||
126 | if (ACPI_SUCCESS(status)) { | ||
127 | acpi_ev_update_gpes(owner_id); | ||
128 | } | ||
129 | |||
130 | return_ACPI_STATUS(AE_OK); | ||
123 | } | 131 | } |
124 | 132 | ||
125 | /******************************************************************************* | 133 | /******************************************************************************* |
@@ -248,10 +256,8 @@ acpi_ex_load_table_op(struct acpi_walk_state *walk_state, | |||
248 | 256 | ||
249 | status = acpi_get_table_by_index(table_index, &table); | 257 | status = acpi_get_table_by_index(table_index, &table); |
250 | if (ACPI_SUCCESS(status)) { | 258 | if (ACPI_SUCCESS(status)) { |
251 | ACPI_INFO((AE_INFO, | 259 | ACPI_INFO((AE_INFO, "Dynamic OEM Table Load:")); |
252 | "Dynamic OEM Table Load - [%.4s] OemId [%.6s] OemTableId [%.8s]", | 260 | acpi_tb_print_table_header(0, table); |
253 | table->signature, table->oem_id, | ||
254 | table->oem_table_id)); | ||
255 | } | 261 | } |
256 | 262 | ||
257 | /* Invoke table handler if present */ | 263 | /* Invoke table handler if present */ |
@@ -525,6 +531,9 @@ acpi_ex_load_op(union acpi_operand_object *obj_desc, | |||
525 | return_ACPI_STATUS(status); | 531 | return_ACPI_STATUS(status); |
526 | } | 532 | } |
527 | 533 | ||
534 | ACPI_INFO((AE_INFO, "Dynamic OEM Table Load:")); | ||
535 | acpi_tb_print_table_header(0, table_desc.pointer); | ||
536 | |||
528 | /* Remove the reference by added by acpi_ex_store above */ | 537 | /* Remove the reference by added by acpi_ex_store above */ |
529 | 538 | ||
530 | acpi_ut_remove_reference(ddb_handle); | 539 | acpi_ut_remove_reference(ddb_handle); |
diff --git a/drivers/acpi/acpica/exconvrt.c b/drivers/acpi/acpica/exconvrt.c index bda7aed0404b..b73bc50c5b76 100644 --- a/drivers/acpi/acpica/exconvrt.c +++ b/drivers/acpi/acpica/exconvrt.c | |||
@@ -650,7 +650,7 @@ acpi_ex_convert_to_target_type(acpi_object_type destination_type, | |||
650 | 650 | ||
651 | default: | 651 | default: |
652 | ACPI_ERROR((AE_INFO, | 652 | ACPI_ERROR((AE_INFO, |
653 | "Bad destination type during conversion: %X", | 653 | "Bad destination type during conversion: 0x%X", |
654 | destination_type)); | 654 | destination_type)); |
655 | status = AE_AML_INTERNAL; | 655 | status = AE_AML_INTERNAL; |
656 | break; | 656 | break; |
@@ -665,7 +665,7 @@ acpi_ex_convert_to_target_type(acpi_object_type destination_type, | |||
665 | 665 | ||
666 | default: | 666 | default: |
667 | ACPI_ERROR((AE_INFO, | 667 | ACPI_ERROR((AE_INFO, |
668 | "Unknown Target type ID 0x%X AmlOpcode %X DestType %s", | 668 | "Unknown Target type ID 0x%X AmlOpcode 0x%X DestType %s", |
669 | GET_CURRENT_ARG_TYPE(walk_state->op_info-> | 669 | GET_CURRENT_ARG_TYPE(walk_state->op_info-> |
670 | runtime_args), | 670 | runtime_args), |
671 | walk_state->opcode, | 671 | walk_state->opcode, |
diff --git a/drivers/acpi/acpica/excreate.c b/drivers/acpi/acpica/excreate.c index 0aa57d938698..3c61b48c73f5 100644 --- a/drivers/acpi/acpica/excreate.c +++ b/drivers/acpi/acpica/excreate.c | |||
@@ -306,12 +306,12 @@ acpi_ex_create_region(u8 * aml_start, | |||
306 | */ | 306 | */ |
307 | if ((region_space >= ACPI_NUM_PREDEFINED_REGIONS) && | 307 | if ((region_space >= ACPI_NUM_PREDEFINED_REGIONS) && |
308 | (region_space < ACPI_USER_REGION_BEGIN)) { | 308 | (region_space < ACPI_USER_REGION_BEGIN)) { |
309 | ACPI_ERROR((AE_INFO, "Invalid AddressSpace type %X", | 309 | ACPI_ERROR((AE_INFO, "Invalid AddressSpace type 0x%X", |
310 | region_space)); | 310 | region_space)); |
311 | return_ACPI_STATUS(AE_AML_INVALID_SPACE_ID); | 311 | return_ACPI_STATUS(AE_AML_INVALID_SPACE_ID); |
312 | } | 312 | } |
313 | 313 | ||
314 | ACPI_DEBUG_PRINT((ACPI_DB_LOAD, "Region Type - %s (%X)\n", | 314 | ACPI_DEBUG_PRINT((ACPI_DB_LOAD, "Region Type - %s (0x%X)\n", |
315 | acpi_ut_get_region_name(region_space), region_space)); | 315 | acpi_ut_get_region_name(region_space), region_space)); |
316 | 316 | ||
317 | /* Create the region descriptor */ | 317 | /* Create the region descriptor */ |
diff --git a/drivers/acpi/acpica/exdebug.c b/drivers/acpi/acpica/exdebug.c new file mode 100644 index 000000000000..be8c98b480d7 --- /dev/null +++ b/drivers/acpi/acpica/exdebug.c | |||
@@ -0,0 +1,261 @@ | |||
1 | /****************************************************************************** | ||
2 | * | ||
3 | * Module Name: exdebug - Support for stores to the AML Debug Object | ||
4 | * | ||
5 | *****************************************************************************/ | ||
6 | |||
7 | /* | ||
8 | * Copyright (C) 2000 - 2010, Intel Corp. | ||
9 | * All rights reserved. | ||
10 | * | ||
11 | * Redistribution and use in source and binary forms, with or without | ||
12 | * modification, are permitted provided that the following conditions | ||
13 | * are met: | ||
14 | * 1. Redistributions of source code must retain the above copyright | ||
15 | * notice, this list of conditions, and the following disclaimer, | ||
16 | * without modification. | ||
17 | * 2. Redistributions in binary form must reproduce at minimum a disclaimer | ||
18 | * substantially similar to the "NO WARRANTY" disclaimer below | ||
19 | * ("Disclaimer") and any redistribution must be conditioned upon | ||
20 | * including a substantially similar Disclaimer requirement for further | ||
21 | * binary redistribution. | ||
22 | * 3. Neither the names of the above-listed copyright holders nor the names | ||
23 | * of any contributors may be used to endorse or promote products derived | ||
24 | * from this software without specific prior written permission. | ||
25 | * | ||
26 | * Alternatively, this software may be distributed under the terms of the | ||
27 | * GNU General Public License ("GPL") version 2 as published by the Free | ||
28 | * Software Foundation. | ||
29 | * | ||
30 | * NO WARRANTY | ||
31 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
32 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
33 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR | ||
34 | * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||
35 | * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||
36 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||
37 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||
38 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | ||
39 | * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING | ||
40 | * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||
41 | * POSSIBILITY OF SUCH DAMAGES. | ||
42 | */ | ||
43 | |||
44 | #include <acpi/acpi.h> | ||
45 | #include "accommon.h" | ||
46 | #include "acinterp.h" | ||
47 | |||
48 | #define _COMPONENT ACPI_EXECUTER | ||
49 | ACPI_MODULE_NAME("exdebug") | ||
50 | |||
51 | #ifndef ACPI_NO_ERROR_MESSAGES | ||
52 | /******************************************************************************* | ||
53 | * | ||
54 | * FUNCTION: acpi_ex_do_debug_object | ||
55 | * | ||
56 | * PARAMETERS: source_desc - Object to be output to "Debug Object" | ||
57 | * Level - Indentation level (used for packages) | ||
58 | * Index - Current package element, zero if not pkg | ||
59 | * | ||
60 | * RETURN: None | ||
61 | * | ||
62 | * DESCRIPTION: Handles stores to the AML Debug Object. For example: | ||
63 | * Store(INT1, Debug) | ||
64 | * | ||
65 | * This function is not compiled if ACPI_NO_ERROR_MESSAGES is set. | ||
66 | * | ||
67 | * This function is only enabled if acpi_gbl_enable_aml_debug_object is set, or | ||
68 | * if ACPI_LV_DEBUG_OBJECT is set in the acpi_dbg_level. Thus, in the normal | ||
69 | * operational case, stores to the debug object are ignored but can be easily | ||
70 | * enabled if necessary. | ||
71 | * | ||
72 | ******************************************************************************/ | ||
73 | void | ||
74 | acpi_ex_do_debug_object(union acpi_operand_object *source_desc, | ||
75 | u32 level, u32 index) | ||
76 | { | ||
77 | u32 i; | ||
78 | |||
79 | ACPI_FUNCTION_TRACE_PTR(ex_do_debug_object, source_desc); | ||
80 | |||
81 | /* Output must be enabled via the debug_object global or the dbg_level */ | ||
82 | |||
83 | if (!acpi_gbl_enable_aml_debug_object && | ||
84 | !(acpi_dbg_level & ACPI_LV_DEBUG_OBJECT)) { | ||
85 | return_VOID; | ||
86 | } | ||
87 | |||
88 | /* | ||
89 | * Print line header as long as we are not in the middle of an | ||
90 | * object display | ||
91 | */ | ||
92 | if (!((level > 0) && index == 0)) { | ||
93 | acpi_os_printf("[ACPI Debug] %*s", level, " "); | ||
94 | } | ||
95 | |||
96 | /* Display the index for package output only */ | ||
97 | |||
98 | if (index > 0) { | ||
99 | acpi_os_printf("(%.2u) ", index - 1); | ||
100 | } | ||
101 | |||
102 | if (!source_desc) { | ||
103 | acpi_os_printf("[Null Object]\n"); | ||
104 | return_VOID; | ||
105 | } | ||
106 | |||
107 | if (ACPI_GET_DESCRIPTOR_TYPE(source_desc) == ACPI_DESC_TYPE_OPERAND) { | ||
108 | acpi_os_printf("%s ", | ||
109 | acpi_ut_get_object_type_name(source_desc)); | ||
110 | |||
111 | if (!acpi_ut_valid_internal_object(source_desc)) { | ||
112 | acpi_os_printf("%p, Invalid Internal Object!\n", | ||
113 | source_desc); | ||
114 | return_VOID; | ||
115 | } | ||
116 | } else if (ACPI_GET_DESCRIPTOR_TYPE(source_desc) == | ||
117 | ACPI_DESC_TYPE_NAMED) { | ||
118 | acpi_os_printf("%s: %p\n", | ||
119 | acpi_ut_get_type_name(((struct | ||
120 | acpi_namespace_node *) | ||
121 | source_desc)->type), | ||
122 | source_desc); | ||
123 | return_VOID; | ||
124 | } else { | ||
125 | return_VOID; | ||
126 | } | ||
127 | |||
128 | /* source_desc is of type ACPI_DESC_TYPE_OPERAND */ | ||
129 | |||
130 | switch (source_desc->common.type) { | ||
131 | case ACPI_TYPE_INTEGER: | ||
132 | |||
133 | /* Output correct integer width */ | ||
134 | |||
135 | if (acpi_gbl_integer_byte_width == 4) { | ||
136 | acpi_os_printf("0x%8.8X\n", | ||
137 | (u32)source_desc->integer.value); | ||
138 | } else { | ||
139 | acpi_os_printf("0x%8.8X%8.8X\n", | ||
140 | ACPI_FORMAT_UINT64(source_desc->integer. | ||
141 | value)); | ||
142 | } | ||
143 | break; | ||
144 | |||
145 | case ACPI_TYPE_BUFFER: | ||
146 | |||
147 | acpi_os_printf("[0x%.2X]\n", (u32)source_desc->buffer.length); | ||
148 | acpi_ut_dump_buffer2(source_desc->buffer.pointer, | ||
149 | (source_desc->buffer.length < 256) ? | ||
150 | source_desc->buffer.length : 256, | ||
151 | DB_BYTE_DISPLAY); | ||
152 | break; | ||
153 | |||
154 | case ACPI_TYPE_STRING: | ||
155 | |||
156 | acpi_os_printf("[0x%.2X] \"%s\"\n", | ||
157 | source_desc->string.length, | ||
158 | source_desc->string.pointer); | ||
159 | break; | ||
160 | |||
161 | case ACPI_TYPE_PACKAGE: | ||
162 | |||
163 | acpi_os_printf("[Contains 0x%.2X Elements]\n", | ||
164 | source_desc->package.count); | ||
165 | |||
166 | /* Output the entire contents of the package */ | ||
167 | |||
168 | for (i = 0; i < source_desc->package.count; i++) { | ||
169 | acpi_ex_do_debug_object(source_desc->package. | ||
170 | elements[i], level + 4, i + 1); | ||
171 | } | ||
172 | break; | ||
173 | |||
174 | case ACPI_TYPE_LOCAL_REFERENCE: | ||
175 | |||
176 | acpi_os_printf("[%s] ", | ||
177 | acpi_ut_get_reference_name(source_desc)); | ||
178 | |||
179 | /* Decode the reference */ | ||
180 | |||
181 | switch (source_desc->reference.class) { | ||
182 | case ACPI_REFCLASS_INDEX: | ||
183 | |||
184 | acpi_os_printf("0x%X\n", source_desc->reference.value); | ||
185 | break; | ||
186 | |||
187 | case ACPI_REFCLASS_TABLE: | ||
188 | |||
189 | /* Case for ddb_handle */ | ||
190 | |||
191 | acpi_os_printf("Table Index 0x%X\n", | ||
192 | source_desc->reference.value); | ||
193 | return; | ||
194 | |||
195 | default: | ||
196 | break; | ||
197 | } | ||
198 | |||
199 | acpi_os_printf(" "); | ||
200 | |||
201 | /* Check for valid node first, then valid object */ | ||
202 | |||
203 | if (source_desc->reference.node) { | ||
204 | if (ACPI_GET_DESCRIPTOR_TYPE | ||
205 | (source_desc->reference.node) != | ||
206 | ACPI_DESC_TYPE_NAMED) { | ||
207 | acpi_os_printf | ||
208 | (" %p - Not a valid namespace node\n", | ||
209 | source_desc->reference.node); | ||
210 | } else { | ||
211 | acpi_os_printf("Node %p [%4.4s] ", | ||
212 | source_desc->reference.node, | ||
213 | (source_desc->reference.node)-> | ||
214 | name.ascii); | ||
215 | |||
216 | switch ((source_desc->reference.node)->type) { | ||
217 | |||
218 | /* These types have no attached object */ | ||
219 | |||
220 | case ACPI_TYPE_DEVICE: | ||
221 | acpi_os_printf("Device\n"); | ||
222 | break; | ||
223 | |||
224 | case ACPI_TYPE_THERMAL: | ||
225 | acpi_os_printf("Thermal Zone\n"); | ||
226 | break; | ||
227 | |||
228 | default: | ||
229 | acpi_ex_do_debug_object((source_desc-> | ||
230 | reference. | ||
231 | node)->object, | ||
232 | level + 4, 0); | ||
233 | break; | ||
234 | } | ||
235 | } | ||
236 | } else if (source_desc->reference.object) { | ||
237 | if (ACPI_GET_DESCRIPTOR_TYPE | ||
238 | (source_desc->reference.object) == | ||
239 | ACPI_DESC_TYPE_NAMED) { | ||
240 | acpi_ex_do_debug_object(((struct | ||
241 | acpi_namespace_node *) | ||
242 | source_desc->reference. | ||
243 | object)->object, | ||
244 | level + 4, 0); | ||
245 | } else { | ||
246 | acpi_ex_do_debug_object(source_desc->reference. | ||
247 | object, level + 4, 0); | ||
248 | } | ||
249 | } | ||
250 | break; | ||
251 | |||
252 | default: | ||
253 | |||
254 | acpi_os_printf("%p\n", source_desc); | ||
255 | break; | ||
256 | } | ||
257 | |||
258 | ACPI_DEBUG_PRINT_RAW((ACPI_DB_EXEC, "\n")); | ||
259 | return_VOID; | ||
260 | } | ||
261 | #endif | ||
diff --git a/drivers/acpi/acpica/exfield.c b/drivers/acpi/acpica/exfield.c index 6c79fecbee42..f17d2ff0031b 100644 --- a/drivers/acpi/acpica/exfield.c +++ b/drivers/acpi/acpica/exfield.c | |||
@@ -281,7 +281,7 @@ acpi_ex_write_data_to_field(union acpi_operand_object *source_desc, | |||
281 | 281 | ||
282 | if (source_desc->buffer.length < length) { | 282 | if (source_desc->buffer.length < length) { |
283 | ACPI_ERROR((AE_INFO, | 283 | ACPI_ERROR((AE_INFO, |
284 | "SMBus or IPMI write requires Buffer of length %X, found length %X", | 284 | "SMBus or IPMI write requires Buffer of length %u, found length %u", |
285 | length, source_desc->buffer.length)); | 285 | length, source_desc->buffer.length)); |
286 | 286 | ||
287 | return_ACPI_STATUS(AE_AML_BUFFER_LIMIT); | 287 | return_ACPI_STATUS(AE_AML_BUFFER_LIMIT); |
diff --git a/drivers/acpi/acpica/exfldio.c b/drivers/acpi/acpica/exfldio.c index f68a216168be..a6dc26f0b3be 100644 --- a/drivers/acpi/acpica/exfldio.c +++ b/drivers/acpi/acpica/exfldio.c | |||
@@ -94,7 +94,7 @@ acpi_ex_setup_region(union acpi_operand_object *obj_desc, | |||
94 | /* We must have a valid region */ | 94 | /* We must have a valid region */ |
95 | 95 | ||
96 | if (rgn_desc->common.type != ACPI_TYPE_REGION) { | 96 | if (rgn_desc->common.type != ACPI_TYPE_REGION) { |
97 | ACPI_ERROR((AE_INFO, "Needed Region, found type %X (%s)", | 97 | ACPI_ERROR((AE_INFO, "Needed Region, found type 0x%X (%s)", |
98 | rgn_desc->common.type, | 98 | rgn_desc->common.type, |
99 | acpi_ut_get_object_type_name(rgn_desc))); | 99 | acpi_ut_get_object_type_name(rgn_desc))); |
100 | 100 | ||
@@ -175,7 +175,7 @@ acpi_ex_setup_region(union acpi_operand_object *obj_desc, | |||
175 | * byte, and a field with Dword access specified. | 175 | * byte, and a field with Dword access specified. |
176 | */ | 176 | */ |
177 | ACPI_ERROR((AE_INFO, | 177 | ACPI_ERROR((AE_INFO, |
178 | "Field [%4.4s] access width (%d bytes) too large for region [%4.4s] (length %X)", | 178 | "Field [%4.4s] access width (%u bytes) too large for region [%4.4s] (length %u)", |
179 | acpi_ut_get_node_name(obj_desc-> | 179 | acpi_ut_get_node_name(obj_desc-> |
180 | common_field.node), | 180 | common_field.node), |
181 | obj_desc->common_field.access_byte_width, | 181 | obj_desc->common_field.access_byte_width, |
@@ -189,7 +189,7 @@ acpi_ex_setup_region(union acpi_operand_object *obj_desc, | |||
189 | * exceeds region length, indicate an error | 189 | * exceeds region length, indicate an error |
190 | */ | 190 | */ |
191 | ACPI_ERROR((AE_INFO, | 191 | ACPI_ERROR((AE_INFO, |
192 | "Field [%4.4s] Base+Offset+Width %X+%X+%X is beyond end of region [%4.4s] (length %X)", | 192 | "Field [%4.4s] Base+Offset+Width %u+%u+%u is beyond end of region [%4.4s] (length %u)", |
193 | acpi_ut_get_node_name(obj_desc->common_field.node), | 193 | acpi_ut_get_node_name(obj_desc->common_field.node), |
194 | obj_desc->common_field.base_byte_offset, | 194 | obj_desc->common_field.base_byte_offset, |
195 | field_datum_byte_offset, | 195 | field_datum_byte_offset, |
@@ -281,13 +281,13 @@ acpi_ex_access_region(union acpi_operand_object *obj_desc, | |||
281 | if (ACPI_FAILURE(status)) { | 281 | if (ACPI_FAILURE(status)) { |
282 | if (status == AE_NOT_IMPLEMENTED) { | 282 | if (status == AE_NOT_IMPLEMENTED) { |
283 | ACPI_ERROR((AE_INFO, | 283 | ACPI_ERROR((AE_INFO, |
284 | "Region %s(%X) not implemented", | 284 | "Region %s(0x%X) not implemented", |
285 | acpi_ut_get_region_name(rgn_desc->region. | 285 | acpi_ut_get_region_name(rgn_desc->region. |
286 | space_id), | 286 | space_id), |
287 | rgn_desc->region.space_id)); | 287 | rgn_desc->region.space_id)); |
288 | } else if (status == AE_NOT_EXIST) { | 288 | } else if (status == AE_NOT_EXIST) { |
289 | ACPI_ERROR((AE_INFO, | 289 | ACPI_ERROR((AE_INFO, |
290 | "Region %s(%X) has no handler", | 290 | "Region %s(0x%X) has no handler", |
291 | acpi_ut_get_region_name(rgn_desc->region. | 291 | acpi_ut_get_region_name(rgn_desc->region. |
292 | space_id), | 292 | space_id), |
293 | rgn_desc->region.space_id)); | 293 | rgn_desc->region.space_id)); |
@@ -525,7 +525,7 @@ acpi_ex_field_datum_io(union acpi_operand_object *obj_desc, | |||
525 | 525 | ||
526 | default: | 526 | default: |
527 | 527 | ||
528 | ACPI_ERROR((AE_INFO, "Wrong object type in field I/O %X", | 528 | ACPI_ERROR((AE_INFO, "Wrong object type in field I/O %u", |
529 | obj_desc->common.type)); | 529 | obj_desc->common.type)); |
530 | status = AE_AML_INTERNAL; | 530 | status = AE_AML_INTERNAL; |
531 | break; | 531 | break; |
@@ -630,7 +630,7 @@ acpi_ex_write_with_update_rule(union acpi_operand_object *obj_desc, | |||
630 | default: | 630 | default: |
631 | 631 | ||
632 | ACPI_ERROR((AE_INFO, | 632 | ACPI_ERROR((AE_INFO, |
633 | "Unknown UpdateRule value: %X", | 633 | "Unknown UpdateRule value: 0x%X", |
634 | (obj_desc->common_field. | 634 | (obj_desc->common_field. |
635 | field_flags & | 635 | field_flags & |
636 | AML_FIELD_UPDATE_RULE_MASK))); | 636 | AML_FIELD_UPDATE_RULE_MASK))); |
@@ -689,7 +689,7 @@ acpi_ex_extract_from_field(union acpi_operand_object *obj_desc, | |||
689 | if (buffer_length < | 689 | if (buffer_length < |
690 | ACPI_ROUND_BITS_UP_TO_BYTES(obj_desc->common_field.bit_length)) { | 690 | ACPI_ROUND_BITS_UP_TO_BYTES(obj_desc->common_field.bit_length)) { |
691 | ACPI_ERROR((AE_INFO, | 691 | ACPI_ERROR((AE_INFO, |
692 | "Field size %X (bits) is too large for buffer (%X)", | 692 | "Field size %u (bits) is too large for buffer (%u)", |
693 | obj_desc->common_field.bit_length, buffer_length)); | 693 | obj_desc->common_field.bit_length, buffer_length)); |
694 | 694 | ||
695 | return_ACPI_STATUS(AE_BUFFER_OVERFLOW); | 695 | return_ACPI_STATUS(AE_BUFFER_OVERFLOW); |
diff --git a/drivers/acpi/acpica/exmisc.c b/drivers/acpi/acpica/exmisc.c index c5bb1eeed2df..95db4be0877b 100644 --- a/drivers/acpi/acpica/exmisc.c +++ b/drivers/acpi/acpica/exmisc.c | |||
@@ -99,7 +99,7 @@ acpi_ex_get_object_reference(union acpi_operand_object *obj_desc, | |||
99 | 99 | ||
100 | default: | 100 | default: |
101 | 101 | ||
102 | ACPI_ERROR((AE_INFO, "Unknown Reference Class %2.2X", | 102 | ACPI_ERROR((AE_INFO, "Unknown Reference Class 0x%2.2X", |
103 | obj_desc->reference.class)); | 103 | obj_desc->reference.class)); |
104 | return_ACPI_STATUS(AE_AML_INTERNAL); | 104 | return_ACPI_STATUS(AE_AML_INTERNAL); |
105 | } | 105 | } |
@@ -115,7 +115,7 @@ acpi_ex_get_object_reference(union acpi_operand_object *obj_desc, | |||
115 | 115 | ||
116 | default: | 116 | default: |
117 | 117 | ||
118 | ACPI_ERROR((AE_INFO, "Invalid descriptor type %X", | 118 | ACPI_ERROR((AE_INFO, "Invalid descriptor type 0x%X", |
119 | ACPI_GET_DESCRIPTOR_TYPE(obj_desc))); | 119 | ACPI_GET_DESCRIPTOR_TYPE(obj_desc))); |
120 | return_ACPI_STATUS(AE_TYPE); | 120 | return_ACPI_STATUS(AE_TYPE); |
121 | } | 121 | } |
@@ -276,7 +276,7 @@ acpi_ex_do_concatenate(union acpi_operand_object *operand0, | |||
276 | break; | 276 | break; |
277 | 277 | ||
278 | default: | 278 | default: |
279 | ACPI_ERROR((AE_INFO, "Invalid object type: %X", | 279 | ACPI_ERROR((AE_INFO, "Invalid object type: 0x%X", |
280 | operand0->common.type)); | 280 | operand0->common.type)); |
281 | status = AE_AML_INTERNAL; | 281 | status = AE_AML_INTERNAL; |
282 | } | 282 | } |
@@ -378,7 +378,7 @@ acpi_ex_do_concatenate(union acpi_operand_object *operand0, | |||
378 | 378 | ||
379 | /* Invalid object type, should not happen here */ | 379 | /* Invalid object type, should not happen here */ |
380 | 380 | ||
381 | ACPI_ERROR((AE_INFO, "Invalid object type: %X", | 381 | ACPI_ERROR((AE_INFO, "Invalid object type: 0x%X", |
382 | operand0->common.type)); | 382 | operand0->common.type)); |
383 | status = AE_AML_INTERNAL; | 383 | status = AE_AML_INTERNAL; |
384 | goto cleanup; | 384 | goto cleanup; |
diff --git a/drivers/acpi/acpica/exmutex.c b/drivers/acpi/acpica/exmutex.c index 7116bc86494d..f73be97043c0 100644 --- a/drivers/acpi/acpica/exmutex.c +++ b/drivers/acpi/acpica/exmutex.c | |||
@@ -85,10 +85,10 @@ void acpi_ex_unlink_mutex(union acpi_operand_object *obj_desc) | |||
85 | (obj_desc->mutex.prev)->mutex.next = obj_desc->mutex.next; | 85 | (obj_desc->mutex.prev)->mutex.next = obj_desc->mutex.next; |
86 | 86 | ||
87 | /* | 87 | /* |
88 | * Migrate the previous sync level associated with this mutex to the | 88 | * Migrate the previous sync level associated with this mutex to |
89 | * previous mutex on the list so that it may be preserved. This handles | 89 | * the previous mutex on the list so that it may be preserved. |
90 | * the case where several mutexes have been acquired at the same level, | 90 | * This handles the case where several mutexes have been acquired |
91 | * but are not released in opposite order. | 91 | * at the same level, but are not released in opposite order. |
92 | */ | 92 | */ |
93 | (obj_desc->mutex.prev)->mutex.original_sync_level = | 93 | (obj_desc->mutex.prev)->mutex.original_sync_level = |
94 | obj_desc->mutex.original_sync_level; | 94 | obj_desc->mutex.original_sync_level; |
@@ -101,8 +101,8 @@ void acpi_ex_unlink_mutex(union acpi_operand_object *obj_desc) | |||
101 | * | 101 | * |
102 | * FUNCTION: acpi_ex_link_mutex | 102 | * FUNCTION: acpi_ex_link_mutex |
103 | * | 103 | * |
104 | * PARAMETERS: obj_desc - The mutex to be linked | 104 | * PARAMETERS: obj_desc - The mutex to be linked |
105 | * Thread - Current executing thread object | 105 | * Thread - Current executing thread object |
106 | * | 106 | * |
107 | * RETURN: None | 107 | * RETURN: None |
108 | * | 108 | * |
@@ -138,9 +138,9 @@ acpi_ex_link_mutex(union acpi_operand_object *obj_desc, | |||
138 | * | 138 | * |
139 | * FUNCTION: acpi_ex_acquire_mutex_object | 139 | * FUNCTION: acpi_ex_acquire_mutex_object |
140 | * | 140 | * |
141 | * PARAMETERS: time_desc - Timeout in milliseconds | 141 | * PARAMETERS: Timeout - Timeout in milliseconds |
142 | * obj_desc - Mutex object | 142 | * obj_desc - Mutex object |
143 | * Thread - Current thread state | 143 | * thread_id - Current thread state |
144 | * | 144 | * |
145 | * RETURN: Status | 145 | * RETURN: Status |
146 | * | 146 | * |
@@ -234,7 +234,7 @@ acpi_ex_acquire_mutex(union acpi_operand_object *time_desc, | |||
234 | return_ACPI_STATUS(AE_BAD_PARAMETER); | 234 | return_ACPI_STATUS(AE_BAD_PARAMETER); |
235 | } | 235 | } |
236 | 236 | ||
237 | /* Must have a valid thread ID */ | 237 | /* Must have a valid thread state struct */ |
238 | 238 | ||
239 | if (!walk_state->thread) { | 239 | if (!walk_state->thread) { |
240 | ACPI_ERROR((AE_INFO, | 240 | ACPI_ERROR((AE_INFO, |
@@ -249,7 +249,7 @@ acpi_ex_acquire_mutex(union acpi_operand_object *time_desc, | |||
249 | */ | 249 | */ |
250 | if (walk_state->thread->current_sync_level > obj_desc->mutex.sync_level) { | 250 | if (walk_state->thread->current_sync_level > obj_desc->mutex.sync_level) { |
251 | ACPI_ERROR((AE_INFO, | 251 | ACPI_ERROR((AE_INFO, |
252 | "Cannot acquire Mutex [%4.4s], current SyncLevel is too large (%d)", | 252 | "Cannot acquire Mutex [%4.4s], current SyncLevel is too large (%u)", |
253 | acpi_ut_get_node_name(obj_desc->mutex.node), | 253 | acpi_ut_get_node_name(obj_desc->mutex.node), |
254 | walk_state->thread->current_sync_level)); | 254 | walk_state->thread->current_sync_level)); |
255 | return_ACPI_STATUS(AE_AML_MUTEX_ORDER); | 255 | return_ACPI_STATUS(AE_AML_MUTEX_ORDER); |
@@ -359,6 +359,7 @@ acpi_ex_release_mutex(union acpi_operand_object *obj_desc, | |||
359 | { | 359 | { |
360 | acpi_status status = AE_OK; | 360 | acpi_status status = AE_OK; |
361 | u8 previous_sync_level; | 361 | u8 previous_sync_level; |
362 | struct acpi_thread_state *owner_thread; | ||
362 | 363 | ||
363 | ACPI_FUNCTION_TRACE(ex_release_mutex); | 364 | ACPI_FUNCTION_TRACE(ex_release_mutex); |
364 | 365 | ||
@@ -366,9 +367,11 @@ acpi_ex_release_mutex(union acpi_operand_object *obj_desc, | |||
366 | return_ACPI_STATUS(AE_BAD_PARAMETER); | 367 | return_ACPI_STATUS(AE_BAD_PARAMETER); |
367 | } | 368 | } |
368 | 369 | ||
370 | owner_thread = obj_desc->mutex.owner_thread; | ||
371 | |||
369 | /* The mutex must have been previously acquired in order to release it */ | 372 | /* The mutex must have been previously acquired in order to release it */ |
370 | 373 | ||
371 | if (!obj_desc->mutex.owner_thread) { | 374 | if (!owner_thread) { |
372 | ACPI_ERROR((AE_INFO, | 375 | ACPI_ERROR((AE_INFO, |
373 | "Cannot release Mutex [%4.4s], not acquired", | 376 | "Cannot release Mutex [%4.4s], not acquired", |
374 | acpi_ut_get_node_name(obj_desc->mutex.node))); | 377 | acpi_ut_get_node_name(obj_desc->mutex.node))); |
@@ -387,16 +390,13 @@ acpi_ex_release_mutex(union acpi_operand_object *obj_desc, | |||
387 | * The Mutex is owned, but this thread must be the owner. | 390 | * The Mutex is owned, but this thread must be the owner. |
388 | * Special case for Global Lock, any thread can release | 391 | * Special case for Global Lock, any thread can release |
389 | */ | 392 | */ |
390 | if ((obj_desc->mutex.owner_thread->thread_id != | 393 | if ((owner_thread->thread_id != walk_state->thread->thread_id) && |
391 | walk_state->thread->thread_id) | 394 | (obj_desc != acpi_gbl_global_lock_mutex)) { |
392 | && (obj_desc != acpi_gbl_global_lock_mutex)) { | ||
393 | ACPI_ERROR((AE_INFO, | 395 | ACPI_ERROR((AE_INFO, |
394 | "Thread %p cannot release Mutex [%4.4s] acquired by thread %p", | 396 | "Thread %p cannot release Mutex [%4.4s] acquired by thread %p", |
395 | ACPI_CAST_PTR(void, walk_state->thread->thread_id), | 397 | ACPI_CAST_PTR(void, walk_state->thread->thread_id), |
396 | acpi_ut_get_node_name(obj_desc->mutex.node), | 398 | acpi_ut_get_node_name(obj_desc->mutex.node), |
397 | ACPI_CAST_PTR(void, | 399 | ACPI_CAST_PTR(void, owner_thread->thread_id))); |
398 | obj_desc->mutex.owner_thread-> | ||
399 | thread_id))); | ||
400 | return_ACPI_STATUS(AE_AML_NOT_OWNER); | 400 | return_ACPI_STATUS(AE_AML_NOT_OWNER); |
401 | } | 401 | } |
402 | 402 | ||
@@ -407,10 +407,9 @@ acpi_ex_release_mutex(union acpi_operand_object *obj_desc, | |||
407 | * different level can only mean that the mutex ordering rule is being | 407 | * different level can only mean that the mutex ordering rule is being |
408 | * violated. This behavior is clarified in ACPI 4.0 specification. | 408 | * violated. This behavior is clarified in ACPI 4.0 specification. |
409 | */ | 409 | */ |
410 | if (obj_desc->mutex.sync_level != | 410 | if (obj_desc->mutex.sync_level != owner_thread->current_sync_level) { |
411 | walk_state->thread->current_sync_level) { | ||
412 | ACPI_ERROR((AE_INFO, | 411 | ACPI_ERROR((AE_INFO, |
413 | "Cannot release Mutex [%4.4s], SyncLevel mismatch: mutex %d current %d", | 412 | "Cannot release Mutex [%4.4s], SyncLevel mismatch: mutex %u current %u", |
414 | acpi_ut_get_node_name(obj_desc->mutex.node), | 413 | acpi_ut_get_node_name(obj_desc->mutex.node), |
415 | obj_desc->mutex.sync_level, | 414 | obj_desc->mutex.sync_level, |
416 | walk_state->thread->current_sync_level)); | 415 | walk_state->thread->current_sync_level)); |
@@ -423,7 +422,7 @@ acpi_ex_release_mutex(union acpi_operand_object *obj_desc, | |||
423 | * acquired, but are not released in reverse order. | 422 | * acquired, but are not released in reverse order. |
424 | */ | 423 | */ |
425 | previous_sync_level = | 424 | previous_sync_level = |
426 | walk_state->thread->acquired_mutex_list->mutex.original_sync_level; | 425 | owner_thread->acquired_mutex_list->mutex.original_sync_level; |
427 | 426 | ||
428 | status = acpi_ex_release_mutex_object(obj_desc); | 427 | status = acpi_ex_release_mutex_object(obj_desc); |
429 | if (ACPI_FAILURE(status)) { | 428 | if (ACPI_FAILURE(status)) { |
@@ -434,8 +433,9 @@ acpi_ex_release_mutex(union acpi_operand_object *obj_desc, | |||
434 | 433 | ||
435 | /* Restore the previous sync_level */ | 434 | /* Restore the previous sync_level */ |
436 | 435 | ||
437 | walk_state->thread->current_sync_level = previous_sync_level; | 436 | owner_thread->current_sync_level = previous_sync_level; |
438 | } | 437 | } |
438 | |||
439 | return_ACPI_STATUS(status); | 439 | return_ACPI_STATUS(status); |
440 | } | 440 | } |
441 | 441 | ||
@@ -443,7 +443,7 @@ acpi_ex_release_mutex(union acpi_operand_object *obj_desc, | |||
443 | * | 443 | * |
444 | * FUNCTION: acpi_ex_release_all_mutexes | 444 | * FUNCTION: acpi_ex_release_all_mutexes |
445 | * | 445 | * |
446 | * PARAMETERS: Thread - Current executing thread object | 446 | * PARAMETERS: Thread - Current executing thread object |
447 | * | 447 | * |
448 | * RETURN: Status | 448 | * RETURN: Status |
449 | * | 449 | * |
diff --git a/drivers/acpi/acpica/exnames.c b/drivers/acpi/acpica/exnames.c index 679f308c5a89..d11e539ef763 100644 --- a/drivers/acpi/acpica/exnames.c +++ b/drivers/acpi/acpica/exnames.c | |||
@@ -102,7 +102,7 @@ static char *acpi_ex_allocate_name_string(u32 prefix_count, u32 num_name_segs) | |||
102 | name_string = ACPI_ALLOCATE(size_needed); | 102 | name_string = ACPI_ALLOCATE(size_needed); |
103 | if (!name_string) { | 103 | if (!name_string) { |
104 | ACPI_ERROR((AE_INFO, | 104 | ACPI_ERROR((AE_INFO, |
105 | "Could not allocate size %d", size_needed)); | 105 | "Could not allocate size %u", size_needed)); |
106 | return_PTR(NULL); | 106 | return_PTR(NULL); |
107 | } | 107 | } |
108 | 108 | ||
@@ -216,7 +216,7 @@ static acpi_status acpi_ex_name_segment(u8 ** in_aml_address, char *name_string) | |||
216 | */ | 216 | */ |
217 | status = AE_AML_BAD_NAME; | 217 | status = AE_AML_BAD_NAME; |
218 | ACPI_ERROR((AE_INFO, | 218 | ACPI_ERROR((AE_INFO, |
219 | "Bad character %02x in name, at %p", | 219 | "Bad character 0x%02x in name, at %p", |
220 | *aml_address, aml_address)); | 220 | *aml_address, aml_address)); |
221 | } | 221 | } |
222 | 222 | ||
diff --git a/drivers/acpi/acpica/exoparg1.c b/drivers/acpi/acpica/exoparg1.c index 99adbab5acbf..84e4d185aa25 100644 --- a/drivers/acpi/acpica/exoparg1.c +++ b/drivers/acpi/acpica/exoparg1.c | |||
@@ -110,7 +110,7 @@ acpi_status acpi_ex_opcode_0A_0T_1R(struct acpi_walk_state *walk_state) | |||
110 | 110 | ||
111 | default: /* Unknown opcode */ | 111 | default: /* Unknown opcode */ |
112 | 112 | ||
113 | ACPI_ERROR((AE_INFO, "Unknown AML opcode %X", | 113 | ACPI_ERROR((AE_INFO, "Unknown AML opcode 0x%X", |
114 | walk_state->opcode)); | 114 | walk_state->opcode)); |
115 | status = AE_AML_BAD_OPCODE; | 115 | status = AE_AML_BAD_OPCODE; |
116 | break; | 116 | break; |
@@ -173,7 +173,7 @@ acpi_status acpi_ex_opcode_1A_0T_0R(struct acpi_walk_state *walk_state) | |||
173 | 173 | ||
174 | case AML_SLEEP_OP: /* Sleep (msec_time) */ | 174 | case AML_SLEEP_OP: /* Sleep (msec_time) */ |
175 | 175 | ||
176 | status = acpi_ex_system_do_suspend(operand[0]->integer.value); | 176 | status = acpi_ex_system_do_sleep(operand[0]->integer.value); |
177 | break; | 177 | break; |
178 | 178 | ||
179 | case AML_STALL_OP: /* Stall (usec_time) */ | 179 | case AML_STALL_OP: /* Stall (usec_time) */ |
@@ -189,7 +189,7 @@ acpi_status acpi_ex_opcode_1A_0T_0R(struct acpi_walk_state *walk_state) | |||
189 | 189 | ||
190 | default: /* Unknown opcode */ | 190 | default: /* Unknown opcode */ |
191 | 191 | ||
192 | ACPI_ERROR((AE_INFO, "Unknown AML opcode %X", | 192 | ACPI_ERROR((AE_INFO, "Unknown AML opcode 0x%X", |
193 | walk_state->opcode)); | 193 | walk_state->opcode)); |
194 | status = AE_AML_BAD_OPCODE; | 194 | status = AE_AML_BAD_OPCODE; |
195 | break; | 195 | break; |
@@ -229,7 +229,7 @@ acpi_status acpi_ex_opcode_1A_1T_0R(struct acpi_walk_state *walk_state) | |||
229 | 229 | ||
230 | default: /* Unknown opcode */ | 230 | default: /* Unknown opcode */ |
231 | 231 | ||
232 | ACPI_ERROR((AE_INFO, "Unknown AML opcode %X", | 232 | ACPI_ERROR((AE_INFO, "Unknown AML opcode 0x%X", |
233 | walk_state->opcode)); | 233 | walk_state->opcode)); |
234 | status = AE_AML_BAD_OPCODE; | 234 | status = AE_AML_BAD_OPCODE; |
235 | goto cleanup; | 235 | goto cleanup; |
@@ -399,7 +399,7 @@ acpi_status acpi_ex_opcode_1A_1T_1R(struct acpi_walk_state *walk_state) | |||
399 | 399 | ||
400 | if (digit > 0) { | 400 | if (digit > 0) { |
401 | ACPI_ERROR((AE_INFO, | 401 | ACPI_ERROR((AE_INFO, |
402 | "Integer too large to convert to BCD: %8.8X%8.8X", | 402 | "Integer too large to convert to BCD: 0x%8.8X%8.8X", |
403 | ACPI_FORMAT_UINT64(operand[0]-> | 403 | ACPI_FORMAT_UINT64(operand[0]-> |
404 | integer.value))); | 404 | integer.value))); |
405 | status = AE_AML_NUMERIC_OVERFLOW; | 405 | status = AE_AML_NUMERIC_OVERFLOW; |
@@ -540,7 +540,7 @@ acpi_status acpi_ex_opcode_1A_1T_1R(struct acpi_walk_state *walk_state) | |||
540 | 540 | ||
541 | default: /* Unknown opcode */ | 541 | default: /* Unknown opcode */ |
542 | 542 | ||
543 | ACPI_ERROR((AE_INFO, "Unknown AML opcode %X", | 543 | ACPI_ERROR((AE_INFO, "Unknown AML opcode 0x%X", |
544 | walk_state->opcode)); | 544 | walk_state->opcode)); |
545 | status = AE_AML_BAD_OPCODE; | 545 | status = AE_AML_BAD_OPCODE; |
546 | goto cleanup; | 546 | goto cleanup; |
@@ -979,7 +979,7 @@ acpi_status acpi_ex_opcode_1A_0T_1R(struct acpi_walk_state *walk_state) | |||
979 | default: | 979 | default: |
980 | 980 | ||
981 | ACPI_ERROR((AE_INFO, | 981 | ACPI_ERROR((AE_INFO, |
982 | "Unknown Index TargetType %X in reference object %p", | 982 | "Unknown Index TargetType 0x%X in reference object %p", |
983 | operand[0]->reference. | 983 | operand[0]->reference. |
984 | target_type, operand[0])); | 984 | target_type, operand[0])); |
985 | status = AE_AML_OPERAND_TYPE; | 985 | status = AE_AML_OPERAND_TYPE; |
@@ -1007,7 +1007,7 @@ acpi_status acpi_ex_opcode_1A_0T_1R(struct acpi_walk_state *walk_state) | |||
1007 | 1007 | ||
1008 | default: | 1008 | default: |
1009 | ACPI_ERROR((AE_INFO, | 1009 | ACPI_ERROR((AE_INFO, |
1010 | "Unknown class in reference(%p) - %2.2X", | 1010 | "Unknown class in reference(%p) - 0x%2.2X", |
1011 | operand[0], | 1011 | operand[0], |
1012 | operand[0]->reference.class)); | 1012 | operand[0]->reference.class)); |
1013 | 1013 | ||
@@ -1019,7 +1019,7 @@ acpi_status acpi_ex_opcode_1A_0T_1R(struct acpi_walk_state *walk_state) | |||
1019 | 1019 | ||
1020 | default: | 1020 | default: |
1021 | 1021 | ||
1022 | ACPI_ERROR((AE_INFO, "Unknown AML opcode %X", | 1022 | ACPI_ERROR((AE_INFO, "Unknown AML opcode 0x%X", |
1023 | walk_state->opcode)); | 1023 | walk_state->opcode)); |
1024 | status = AE_AML_BAD_OPCODE; | 1024 | status = AE_AML_BAD_OPCODE; |
1025 | goto cleanup; | 1025 | goto cleanup; |
diff --git a/drivers/acpi/acpica/exoparg2.c b/drivers/acpi/acpica/exoparg2.c index 22841bbbe63c..10e104cf0fb9 100644 --- a/drivers/acpi/acpica/exoparg2.c +++ b/drivers/acpi/acpica/exoparg2.c | |||
@@ -119,33 +119,6 @@ acpi_status acpi_ex_opcode_2A_0T_0R(struct acpi_walk_state *walk_state) | |||
119 | status = AE_AML_OPERAND_TYPE; | 119 | status = AE_AML_OPERAND_TYPE; |
120 | break; | 120 | break; |
121 | } | 121 | } |
122 | #ifdef ACPI_GPE_NOTIFY_CHECK | ||
123 | /* | ||
124 | * GPE method wake/notify check. Here, we want to ensure that we | ||
125 | * don't receive any "DeviceWake" Notifies from a GPE _Lxx or _Exx | ||
126 | * GPE method during system runtime. If we do, the GPE is marked | ||
127 | * as "wake-only" and disabled. | ||
128 | * | ||
129 | * 1) Is the Notify() value == device_wake? | ||
130 | * 2) Is this a GPE deferred method? (An _Lxx or _Exx method) | ||
131 | * 3) Did the original GPE happen at system runtime? | ||
132 | * (versus during wake) | ||
133 | * | ||
134 | * If all three cases are true, this is a wake-only GPE that should | ||
135 | * be disabled at runtime. | ||
136 | */ | ||
137 | if (value == 2) { /* device_wake */ | ||
138 | status = | ||
139 | acpi_ev_check_for_wake_only_gpe(walk_state-> | ||
140 | gpe_event_info); | ||
141 | if (ACPI_FAILURE(status)) { | ||
142 | |||
143 | /* AE_WAKE_ONLY_GPE only error, means ignore this notify */ | ||
144 | |||
145 | return_ACPI_STATUS(AE_OK) | ||
146 | } | ||
147 | } | ||
148 | #endif | ||
149 | 122 | ||
150 | /* | 123 | /* |
151 | * Dispatch the notify to the appropriate handler | 124 | * Dispatch the notify to the appropriate handler |
@@ -159,7 +132,7 @@ acpi_status acpi_ex_opcode_2A_0T_0R(struct acpi_walk_state *walk_state) | |||
159 | 132 | ||
160 | default: | 133 | default: |
161 | 134 | ||
162 | ACPI_ERROR((AE_INFO, "Unknown AML opcode %X", | 135 | ACPI_ERROR((AE_INFO, "Unknown AML opcode 0x%X", |
163 | walk_state->opcode)); | 136 | walk_state->opcode)); |
164 | status = AE_AML_BAD_OPCODE; | 137 | status = AE_AML_BAD_OPCODE; |
165 | } | 138 | } |
@@ -224,7 +197,7 @@ acpi_status acpi_ex_opcode_2A_2T_1R(struct acpi_walk_state *walk_state) | |||
224 | 197 | ||
225 | default: | 198 | default: |
226 | 199 | ||
227 | ACPI_ERROR((AE_INFO, "Unknown AML opcode %X", | 200 | ACPI_ERROR((AE_INFO, "Unknown AML opcode 0x%X", |
228 | walk_state->opcode)); | 201 | walk_state->opcode)); |
229 | status = AE_AML_BAD_OPCODE; | 202 | status = AE_AML_BAD_OPCODE; |
230 | goto cleanup; | 203 | goto cleanup; |
@@ -441,7 +414,7 @@ acpi_status acpi_ex_opcode_2A_1T_1R(struct acpi_walk_state *walk_state) | |||
441 | 414 | ||
442 | if (ACPI_FAILURE(status)) { | 415 | if (ACPI_FAILURE(status)) { |
443 | ACPI_EXCEPTION((AE_INFO, status, | 416 | ACPI_EXCEPTION((AE_INFO, status, |
444 | "Index (%X%8.8X) is beyond end of object", | 417 | "Index (0x%8.8X%8.8X) is beyond end of object", |
445 | ACPI_FORMAT_UINT64(index))); | 418 | ACPI_FORMAT_UINT64(index))); |
446 | goto cleanup; | 419 | goto cleanup; |
447 | } | 420 | } |
@@ -464,7 +437,7 @@ acpi_status acpi_ex_opcode_2A_1T_1R(struct acpi_walk_state *walk_state) | |||
464 | 437 | ||
465 | default: | 438 | default: |
466 | 439 | ||
467 | ACPI_ERROR((AE_INFO, "Unknown AML opcode %X", | 440 | ACPI_ERROR((AE_INFO, "Unknown AML opcode 0x%X", |
468 | walk_state->opcode)); | 441 | walk_state->opcode)); |
469 | status = AE_AML_BAD_OPCODE; | 442 | status = AE_AML_BAD_OPCODE; |
470 | break; | 443 | break; |
@@ -572,7 +545,7 @@ acpi_status acpi_ex_opcode_2A_0T_1R(struct acpi_walk_state *walk_state) | |||
572 | 545 | ||
573 | default: | 546 | default: |
574 | 547 | ||
575 | ACPI_ERROR((AE_INFO, "Unknown AML opcode %X", | 548 | ACPI_ERROR((AE_INFO, "Unknown AML opcode 0x%X", |
576 | walk_state->opcode)); | 549 | walk_state->opcode)); |
577 | status = AE_AML_BAD_OPCODE; | 550 | status = AE_AML_BAD_OPCODE; |
578 | goto cleanup; | 551 | goto cleanup; |
diff --git a/drivers/acpi/acpica/exoparg3.c b/drivers/acpi/acpica/exoparg3.c index 8bb1012ef44e..7a08d23befcd 100644 --- a/drivers/acpi/acpica/exoparg3.c +++ b/drivers/acpi/acpica/exoparg3.c | |||
@@ -119,7 +119,7 @@ acpi_status acpi_ex_opcode_3A_0T_0R(struct acpi_walk_state *walk_state) | |||
119 | 119 | ||
120 | default: | 120 | default: |
121 | 121 | ||
122 | ACPI_ERROR((AE_INFO, "Unknown AML opcode %X", | 122 | ACPI_ERROR((AE_INFO, "Unknown AML opcode 0x%X", |
123 | walk_state->opcode)); | 123 | walk_state->opcode)); |
124 | status = AE_AML_BAD_OPCODE; | 124 | status = AE_AML_BAD_OPCODE; |
125 | goto cleanup; | 125 | goto cleanup; |
@@ -244,7 +244,7 @@ acpi_status acpi_ex_opcode_3A_1T_1R(struct acpi_walk_state *walk_state) | |||
244 | 244 | ||
245 | default: | 245 | default: |
246 | 246 | ||
247 | ACPI_ERROR((AE_INFO, "Unknown AML opcode %X", | 247 | ACPI_ERROR((AE_INFO, "Unknown AML opcode 0x%X", |
248 | walk_state->opcode)); | 248 | walk_state->opcode)); |
249 | status = AE_AML_BAD_OPCODE; | 249 | status = AE_AML_BAD_OPCODE; |
250 | goto cleanup; | 250 | goto cleanup; |
diff --git a/drivers/acpi/acpica/exoparg6.c b/drivers/acpi/acpica/exoparg6.c index f256b6a25f2e..4b50730cf9a0 100644 --- a/drivers/acpi/acpica/exoparg6.c +++ b/drivers/acpi/acpica/exoparg6.c | |||
@@ -245,7 +245,7 @@ acpi_status acpi_ex_opcode_6A_0T_1R(struct acpi_walk_state * walk_state) | |||
245 | index = operand[5]->integer.value; | 245 | index = operand[5]->integer.value; |
246 | if (index >= operand[0]->package.count) { | 246 | if (index >= operand[0]->package.count) { |
247 | ACPI_ERROR((AE_INFO, | 247 | ACPI_ERROR((AE_INFO, |
248 | "Index (%X%8.8X) beyond package end (%X)", | 248 | "Index (0x%8.8X%8.8X) beyond package end (0x%X)", |
249 | ACPI_FORMAT_UINT64(index), | 249 | ACPI_FORMAT_UINT64(index), |
250 | operand[0]->package.count)); | 250 | operand[0]->package.count)); |
251 | status = AE_AML_PACKAGE_LIMIT; | 251 | status = AE_AML_PACKAGE_LIMIT; |
@@ -314,7 +314,7 @@ acpi_status acpi_ex_opcode_6A_0T_1R(struct acpi_walk_state * walk_state) | |||
314 | 314 | ||
315 | default: | 315 | default: |
316 | 316 | ||
317 | ACPI_ERROR((AE_INFO, "Unknown AML opcode %X", | 317 | ACPI_ERROR((AE_INFO, "Unknown AML opcode 0x%X", |
318 | walk_state->opcode)); | 318 | walk_state->opcode)); |
319 | status = AE_AML_BAD_OPCODE; | 319 | status = AE_AML_BAD_OPCODE; |
320 | goto cleanup; | 320 | goto cleanup; |
diff --git a/drivers/acpi/acpica/exprep.c b/drivers/acpi/acpica/exprep.c index 2fbfe51fb141..25059dace0ad 100644 --- a/drivers/acpi/acpica/exprep.c +++ b/drivers/acpi/acpica/exprep.c | |||
@@ -275,7 +275,7 @@ acpi_ex_decode_field_access(union acpi_operand_object *obj_desc, | |||
275 | default: | 275 | default: |
276 | /* Invalid field access type */ | 276 | /* Invalid field access type */ |
277 | 277 | ||
278 | ACPI_ERROR((AE_INFO, "Unknown field access type %X", access)); | 278 | ACPI_ERROR((AE_INFO, "Unknown field access type 0x%X", access)); |
279 | return_UINT32(0); | 279 | return_UINT32(0); |
280 | } | 280 | } |
281 | 281 | ||
@@ -430,7 +430,7 @@ acpi_status acpi_ex_prep_field_value(struct acpi_create_field_info *info) | |||
430 | type = acpi_ns_get_type(info->region_node); | 430 | type = acpi_ns_get_type(info->region_node); |
431 | if (type != ACPI_TYPE_REGION) { | 431 | if (type != ACPI_TYPE_REGION) { |
432 | ACPI_ERROR((AE_INFO, | 432 | ACPI_ERROR((AE_INFO, |
433 | "Needed Region, found type %X (%s)", | 433 | "Needed Region, found type 0x%X (%s)", |
434 | type, acpi_ut_get_type_name(type))); | 434 | type, acpi_ut_get_type_name(type))); |
435 | 435 | ||
436 | return_ACPI_STATUS(AE_AML_OPERAND_TYPE); | 436 | return_ACPI_STATUS(AE_AML_OPERAND_TYPE); |
diff --git a/drivers/acpi/acpica/exregion.c b/drivers/acpi/acpica/exregion.c index 486b2e5661b6..531000fc77d2 100644 --- a/drivers/acpi/acpica/exregion.c +++ b/drivers/acpi/acpica/exregion.c | |||
@@ -105,7 +105,7 @@ acpi_ex_system_memory_space_handler(u32 function, | |||
105 | break; | 105 | break; |
106 | 106 | ||
107 | default: | 107 | default: |
108 | ACPI_ERROR((AE_INFO, "Invalid SystemMemory width %d", | 108 | ACPI_ERROR((AE_INFO, "Invalid SystemMemory width %u", |
109 | bit_width)); | 109 | bit_width)); |
110 | return_ACPI_STATUS(AE_AML_OPERAND_VALUE); | 110 | return_ACPI_STATUS(AE_AML_OPERAND_VALUE); |
111 | } | 111 | } |
@@ -173,7 +173,7 @@ acpi_ex_system_memory_space_handler(u32 function, | |||
173 | mem_info->mapped_logical_address = acpi_os_map_memory((acpi_physical_address) address, map_length); | 173 | mem_info->mapped_logical_address = acpi_os_map_memory((acpi_physical_address) address, map_length); |
174 | if (!mem_info->mapped_logical_address) { | 174 | if (!mem_info->mapped_logical_address) { |
175 | ACPI_ERROR((AE_INFO, | 175 | ACPI_ERROR((AE_INFO, |
176 | "Could not map memory at %8.8X%8.8X, size %X", | 176 | "Could not map memory at 0x%8.8X%8.8X, size %u", |
177 | ACPI_FORMAT_NATIVE_UINT(address), | 177 | ACPI_FORMAT_NATIVE_UINT(address), |
178 | (u32) map_length)); | 178 | (u32) map_length)); |
179 | mem_info->mapped_length = 0; | 179 | mem_info->mapped_length = 0; |
@@ -491,8 +491,10 @@ acpi_ex_data_table_space_handler(u32 function, | |||
491 | { | 491 | { |
492 | ACPI_FUNCTION_TRACE(ex_data_table_space_handler); | 492 | ACPI_FUNCTION_TRACE(ex_data_table_space_handler); |
493 | 493 | ||
494 | /* Perform the memory read or write */ | 494 | /* |
495 | 495 | * Perform the memory read or write. The bit_width was already | |
496 | * validated. | ||
497 | */ | ||
496 | switch (function) { | 498 | switch (function) { |
497 | case ACPI_READ: | 499 | case ACPI_READ: |
498 | 500 | ||
@@ -502,9 +504,14 @@ acpi_ex_data_table_space_handler(u32 function, | |||
502 | break; | 504 | break; |
503 | 505 | ||
504 | case ACPI_WRITE: | 506 | case ACPI_WRITE: |
507 | |||
508 | ACPI_MEMCPY(ACPI_PHYSADDR_TO_PTR(address), | ||
509 | ACPI_CAST_PTR(char, value), ACPI_DIV_8(bit_width)); | ||
510 | break; | ||
511 | |||
505 | default: | 512 | default: |
506 | 513 | ||
507 | return_ACPI_STATUS(AE_SUPPORT); | 514 | return_ACPI_STATUS(AE_BAD_PARAMETER); |
508 | } | 515 | } |
509 | 516 | ||
510 | return_ACPI_STATUS(AE_OK); | 517 | return_ACPI_STATUS(AE_OK); |
diff --git a/drivers/acpi/acpica/exresnte.c b/drivers/acpi/acpica/exresnte.c index fdc1b27999ef..1fa4289a687e 100644 --- a/drivers/acpi/acpica/exresnte.c +++ b/drivers/acpi/acpica/exresnte.c | |||
@@ -252,7 +252,7 @@ acpi_ex_resolve_node_to_value(struct acpi_namespace_node **object_ptr, | |||
252 | /* No named references are allowed here */ | 252 | /* No named references are allowed here */ |
253 | 253 | ||
254 | ACPI_ERROR((AE_INFO, | 254 | ACPI_ERROR((AE_INFO, |
255 | "Unsupported Reference type %X", | 255 | "Unsupported Reference type 0x%X", |
256 | source_desc->reference.class)); | 256 | source_desc->reference.class)); |
257 | 257 | ||
258 | return_ACPI_STATUS(AE_AML_OPERAND_TYPE); | 258 | return_ACPI_STATUS(AE_AML_OPERAND_TYPE); |
@@ -264,7 +264,7 @@ acpi_ex_resolve_node_to_value(struct acpi_namespace_node **object_ptr, | |||
264 | /* Default case is for unknown types */ | 264 | /* Default case is for unknown types */ |
265 | 265 | ||
266 | ACPI_ERROR((AE_INFO, | 266 | ACPI_ERROR((AE_INFO, |
267 | "Node %p - Unknown object type %X", | 267 | "Node %p - Unknown object type 0x%X", |
268 | node, entry_type)); | 268 | node, entry_type)); |
269 | 269 | ||
270 | return_ACPI_STATUS(AE_AML_OPERAND_TYPE); | 270 | return_ACPI_STATUS(AE_AML_OPERAND_TYPE); |
diff --git a/drivers/acpi/acpica/exresolv.c b/drivers/acpi/acpica/exresolv.c index fdd6a7079b97..7ca35ea8acea 100644 --- a/drivers/acpi/acpica/exresolv.c +++ b/drivers/acpi/acpica/exresolv.c | |||
@@ -231,7 +231,7 @@ acpi_ex_resolve_object_to_value(union acpi_operand_object **stack_ptr, | |||
231 | /* Invalid reference object */ | 231 | /* Invalid reference object */ |
232 | 232 | ||
233 | ACPI_ERROR((AE_INFO, | 233 | ACPI_ERROR((AE_INFO, |
234 | "Unknown TargetType %X in Index/Reference object %p", | 234 | "Unknown TargetType 0x%X in Index/Reference object %p", |
235 | stack_desc->reference.target_type, | 235 | stack_desc->reference.target_type, |
236 | stack_desc)); | 236 | stack_desc)); |
237 | status = AE_AML_INTERNAL; | 237 | status = AE_AML_INTERNAL; |
@@ -273,8 +273,8 @@ acpi_ex_resolve_object_to_value(union acpi_operand_object **stack_ptr, | |||
273 | default: | 273 | default: |
274 | 274 | ||
275 | ACPI_ERROR((AE_INFO, | 275 | ACPI_ERROR((AE_INFO, |
276 | "Unknown Reference type %X in %p", ref_type, | 276 | "Unknown Reference type 0x%X in %p", |
277 | stack_desc)); | 277 | ref_type, stack_desc)); |
278 | status = AE_AML_INTERNAL; | 278 | status = AE_AML_INTERNAL; |
279 | break; | 279 | break; |
280 | } | 280 | } |
@@ -403,7 +403,8 @@ acpi_ex_resolve_multiple(struct acpi_walk_state *walk_state, | |||
403 | 403 | ||
404 | if (ACPI_GET_DESCRIPTOR_TYPE(node) != | 404 | if (ACPI_GET_DESCRIPTOR_TYPE(node) != |
405 | ACPI_DESC_TYPE_NAMED) { | 405 | ACPI_DESC_TYPE_NAMED) { |
406 | ACPI_ERROR((AE_INFO, "Not a NS node %p [%s]", | 406 | ACPI_ERROR((AE_INFO, |
407 | "Not a namespace node %p [%s]", | ||
407 | node, | 408 | node, |
408 | acpi_ut_get_descriptor_name(node))); | 409 | acpi_ut_get_descriptor_name(node))); |
409 | return_ACPI_STATUS(AE_AML_INTERNAL); | 410 | return_ACPI_STATUS(AE_AML_INTERNAL); |
@@ -507,7 +508,7 @@ acpi_ex_resolve_multiple(struct acpi_walk_state *walk_state, | |||
507 | default: | 508 | default: |
508 | 509 | ||
509 | ACPI_ERROR((AE_INFO, | 510 | ACPI_ERROR((AE_INFO, |
510 | "Unknown Reference Class %2.2X", | 511 | "Unknown Reference Class 0x%2.2X", |
511 | obj_desc->reference.class)); | 512 | obj_desc->reference.class)); |
512 | return_ACPI_STATUS(AE_AML_INTERNAL); | 513 | return_ACPI_STATUS(AE_AML_INTERNAL); |
513 | } | 514 | } |
diff --git a/drivers/acpi/acpica/exresop.c b/drivers/acpi/acpica/exresop.c index c5ecd615f145..8c97cfd6a0fd 100644 --- a/drivers/acpi/acpica/exresop.c +++ b/drivers/acpi/acpica/exresop.c | |||
@@ -153,7 +153,7 @@ acpi_ex_resolve_operands(u16 opcode, | |||
153 | 153 | ||
154 | arg_types = op_info->runtime_args; | 154 | arg_types = op_info->runtime_args; |
155 | if (arg_types == ARGI_INVALID_OPCODE) { | 155 | if (arg_types == ARGI_INVALID_OPCODE) { |
156 | ACPI_ERROR((AE_INFO, "Unknown AML opcode %X", opcode)); | 156 | ACPI_ERROR((AE_INFO, "Unknown AML opcode 0x%X", opcode)); |
157 | 157 | ||
158 | return_ACPI_STATUS(AE_AML_INTERNAL); | 158 | return_ACPI_STATUS(AE_AML_INTERNAL); |
159 | } | 159 | } |
@@ -218,7 +218,7 @@ acpi_ex_resolve_operands(u16 opcode, | |||
218 | 218 | ||
219 | if (!acpi_ut_valid_object_type(object_type)) { | 219 | if (!acpi_ut_valid_object_type(object_type)) { |
220 | ACPI_ERROR((AE_INFO, | 220 | ACPI_ERROR((AE_INFO, |
221 | "Bad operand object type [%X]", | 221 | "Bad operand object type [0x%X]", |
222 | object_type)); | 222 | object_type)); |
223 | 223 | ||
224 | return_ACPI_STATUS(AE_AML_OPERAND_TYPE); | 224 | return_ACPI_STATUS(AE_AML_OPERAND_TYPE); |
@@ -253,7 +253,7 @@ acpi_ex_resolve_operands(u16 opcode, | |||
253 | default: | 253 | default: |
254 | 254 | ||
255 | ACPI_ERROR((AE_INFO, | 255 | ACPI_ERROR((AE_INFO, |
256 | "Unknown Reference Class %2.2X in %p", | 256 | "Unknown Reference Class 0x%2.2X in %p", |
257 | obj_desc->reference.class, | 257 | obj_desc->reference.class, |
258 | obj_desc)); | 258 | obj_desc)); |
259 | 259 | ||
@@ -665,7 +665,7 @@ acpi_ex_resolve_operands(u16 opcode, | |||
665 | /* Unknown type */ | 665 | /* Unknown type */ |
666 | 666 | ||
667 | ACPI_ERROR((AE_INFO, | 667 | ACPI_ERROR((AE_INFO, |
668 | "Internal - Unknown ARGI (required operand) type %X", | 668 | "Internal - Unknown ARGI (required operand) type 0x%X", |
669 | this_arg_type)); | 669 | this_arg_type)); |
670 | 670 | ||
671 | return_ACPI_STATUS(AE_BAD_PARAMETER); | 671 | return_ACPI_STATUS(AE_BAD_PARAMETER); |
diff --git a/drivers/acpi/acpica/exstore.c b/drivers/acpi/acpica/exstore.c index 702b9ecfd44b..1624436ba4c5 100644 --- a/drivers/acpi/acpica/exstore.c +++ b/drivers/acpi/acpica/exstore.c | |||
@@ -1,4 +1,3 @@ | |||
1 | |||
2 | /****************************************************************************** | 1 | /****************************************************************************** |
3 | * | 2 | * |
4 | * Module Name: exstore - AML Interpreter object store support | 3 | * Module Name: exstore - AML Interpreter object store support |
@@ -53,10 +52,6 @@ | |||
53 | ACPI_MODULE_NAME("exstore") | 52 | ACPI_MODULE_NAME("exstore") |
54 | 53 | ||
55 | /* Local prototypes */ | 54 | /* Local prototypes */ |
56 | static void | ||
57 | acpi_ex_do_debug_object(union acpi_operand_object *source_desc, | ||
58 | u32 level, u32 index); | ||
59 | |||
60 | static acpi_status | 55 | static acpi_status |
61 | acpi_ex_store_object_to_index(union acpi_operand_object *val_desc, | 56 | acpi_ex_store_object_to_index(union acpi_operand_object *val_desc, |
62 | union acpi_operand_object *dest_desc, | 57 | union acpi_operand_object *dest_desc, |
@@ -64,215 +59,6 @@ acpi_ex_store_object_to_index(union acpi_operand_object *val_desc, | |||
64 | 59 | ||
65 | /******************************************************************************* | 60 | /******************************************************************************* |
66 | * | 61 | * |
67 | * FUNCTION: acpi_ex_do_debug_object | ||
68 | * | ||
69 | * PARAMETERS: source_desc - Value to be stored | ||
70 | * Level - Indentation level (used for packages) | ||
71 | * Index - Current package element, zero if not pkg | ||
72 | * | ||
73 | * RETURN: None | ||
74 | * | ||
75 | * DESCRIPTION: Handles stores to the Debug Object. | ||
76 | * | ||
77 | ******************************************************************************/ | ||
78 | |||
79 | static void | ||
80 | acpi_ex_do_debug_object(union acpi_operand_object *source_desc, | ||
81 | u32 level, u32 index) | ||
82 | { | ||
83 | u32 i; | ||
84 | |||
85 | ACPI_FUNCTION_TRACE_PTR(ex_do_debug_object, source_desc); | ||
86 | |||
87 | /* Print line header as long as we are not in the middle of an object display */ | ||
88 | |||
89 | if (!((level > 0) && index == 0)) { | ||
90 | ACPI_DEBUG_PRINT_RAW((ACPI_DB_DEBUG_OBJECT, "[ACPI Debug] %*s", | ||
91 | level, " ")); | ||
92 | } | ||
93 | |||
94 | /* Display index for package output only */ | ||
95 | |||
96 | if (index > 0) { | ||
97 | ACPI_DEBUG_PRINT_RAW((ACPI_DB_DEBUG_OBJECT, | ||
98 | "(%.2u) ", index - 1)); | ||
99 | } | ||
100 | |||
101 | if (!source_desc) { | ||
102 | ACPI_DEBUG_PRINT_RAW((ACPI_DB_DEBUG_OBJECT, "[Null Object]\n")); | ||
103 | return_VOID; | ||
104 | } | ||
105 | |||
106 | if (ACPI_GET_DESCRIPTOR_TYPE(source_desc) == ACPI_DESC_TYPE_OPERAND) { | ||
107 | ACPI_DEBUG_PRINT_RAW((ACPI_DB_DEBUG_OBJECT, "%s ", | ||
108 | acpi_ut_get_object_type_name | ||
109 | (source_desc))); | ||
110 | |||
111 | if (!acpi_ut_valid_internal_object(source_desc)) { | ||
112 | ACPI_DEBUG_PRINT_RAW((ACPI_DB_DEBUG_OBJECT, | ||
113 | "%p, Invalid Internal Object!\n", | ||
114 | source_desc)); | ||
115 | return_VOID; | ||
116 | } | ||
117 | } else if (ACPI_GET_DESCRIPTOR_TYPE(source_desc) == | ||
118 | ACPI_DESC_TYPE_NAMED) { | ||
119 | ACPI_DEBUG_PRINT_RAW((ACPI_DB_DEBUG_OBJECT, "%s: %p\n", | ||
120 | acpi_ut_get_type_name(((struct | ||
121 | acpi_namespace_node | ||
122 | *)source_desc)-> | ||
123 | type), | ||
124 | source_desc)); | ||
125 | return_VOID; | ||
126 | } else { | ||
127 | return_VOID; | ||
128 | } | ||
129 | |||
130 | /* source_desc is of type ACPI_DESC_TYPE_OPERAND */ | ||
131 | |||
132 | switch (source_desc->common.type) { | ||
133 | case ACPI_TYPE_INTEGER: | ||
134 | |||
135 | /* Output correct integer width */ | ||
136 | |||
137 | if (acpi_gbl_integer_byte_width == 4) { | ||
138 | ACPI_DEBUG_PRINT_RAW((ACPI_DB_DEBUG_OBJECT, "0x%8.8X\n", | ||
139 | (u32) source_desc->integer. | ||
140 | value)); | ||
141 | } else { | ||
142 | ACPI_DEBUG_PRINT_RAW((ACPI_DB_DEBUG_OBJECT, | ||
143 | "0x%8.8X%8.8X\n", | ||
144 | ACPI_FORMAT_UINT64(source_desc-> | ||
145 | integer. | ||
146 | value))); | ||
147 | } | ||
148 | break; | ||
149 | |||
150 | case ACPI_TYPE_BUFFER: | ||
151 | |||
152 | ACPI_DEBUG_PRINT_RAW((ACPI_DB_DEBUG_OBJECT, "[0x%.2X]\n", | ||
153 | (u32) source_desc->buffer.length)); | ||
154 | ACPI_DUMP_BUFFER(source_desc->buffer.pointer, | ||
155 | (source_desc->buffer.length < | ||
156 | 256) ? source_desc->buffer.length : 256); | ||
157 | break; | ||
158 | |||
159 | case ACPI_TYPE_STRING: | ||
160 | |||
161 | ACPI_DEBUG_PRINT_RAW((ACPI_DB_DEBUG_OBJECT, "[0x%.2X] \"%s\"\n", | ||
162 | source_desc->string.length, | ||
163 | source_desc->string.pointer)); | ||
164 | break; | ||
165 | |||
166 | case ACPI_TYPE_PACKAGE: | ||
167 | |||
168 | ACPI_DEBUG_PRINT_RAW((ACPI_DB_DEBUG_OBJECT, | ||
169 | "[Contains 0x%.2X Elements]\n", | ||
170 | source_desc->package.count)); | ||
171 | |||
172 | /* Output the entire contents of the package */ | ||
173 | |||
174 | for (i = 0; i < source_desc->package.count; i++) { | ||
175 | acpi_ex_do_debug_object(source_desc->package. | ||
176 | elements[i], level + 4, i + 1); | ||
177 | } | ||
178 | break; | ||
179 | |||
180 | case ACPI_TYPE_LOCAL_REFERENCE: | ||
181 | |||
182 | ACPI_DEBUG_PRINT_RAW((ACPI_DB_DEBUG_OBJECT, "[%s] ", | ||
183 | acpi_ut_get_reference_name(source_desc))); | ||
184 | |||
185 | /* Decode the reference */ | ||
186 | |||
187 | switch (source_desc->reference.class) { | ||
188 | case ACPI_REFCLASS_INDEX: | ||
189 | |||
190 | ACPI_DEBUG_PRINT_RAW((ACPI_DB_DEBUG_OBJECT, "0x%X\n", | ||
191 | source_desc->reference.value)); | ||
192 | break; | ||
193 | |||
194 | case ACPI_REFCLASS_TABLE: | ||
195 | |||
196 | /* Case for ddb_handle */ | ||
197 | |||
198 | ACPI_DEBUG_PRINT_RAW((ACPI_DB_DEBUG_OBJECT, | ||
199 | "Table Index 0x%X\n", | ||
200 | source_desc->reference.value)); | ||
201 | return; | ||
202 | |||
203 | default: | ||
204 | break; | ||
205 | } | ||
206 | |||
207 | ACPI_DEBUG_PRINT_RAW((ACPI_DB_DEBUG_OBJECT, " ")); | ||
208 | |||
209 | /* Check for valid node first, then valid object */ | ||
210 | |||
211 | if (source_desc->reference.node) { | ||
212 | if (ACPI_GET_DESCRIPTOR_TYPE | ||
213 | (source_desc->reference.node) != | ||
214 | ACPI_DESC_TYPE_NAMED) { | ||
215 | ACPI_DEBUG_PRINT_RAW((ACPI_DB_DEBUG_OBJECT, | ||
216 | " %p - Not a valid namespace node\n", | ||
217 | source_desc->reference. | ||
218 | node)); | ||
219 | } else { | ||
220 | ACPI_DEBUG_PRINT_RAW((ACPI_DB_DEBUG_OBJECT, | ||
221 | "Node %p [%4.4s] ", | ||
222 | source_desc->reference. | ||
223 | node, | ||
224 | (source_desc->reference. | ||
225 | node)->name.ascii)); | ||
226 | |||
227 | switch ((source_desc->reference.node)->type) { | ||
228 | |||
229 | /* These types have no attached object */ | ||
230 | |||
231 | case ACPI_TYPE_DEVICE: | ||
232 | acpi_os_printf("Device\n"); | ||
233 | break; | ||
234 | |||
235 | case ACPI_TYPE_THERMAL: | ||
236 | acpi_os_printf("Thermal Zone\n"); | ||
237 | break; | ||
238 | |||
239 | default: | ||
240 | acpi_ex_do_debug_object((source_desc-> | ||
241 | reference. | ||
242 | node)->object, | ||
243 | level + 4, 0); | ||
244 | break; | ||
245 | } | ||
246 | } | ||
247 | } else if (source_desc->reference.object) { | ||
248 | if (ACPI_GET_DESCRIPTOR_TYPE | ||
249 | (source_desc->reference.object) == | ||
250 | ACPI_DESC_TYPE_NAMED) { | ||
251 | acpi_ex_do_debug_object(((struct | ||
252 | acpi_namespace_node *) | ||
253 | source_desc->reference. | ||
254 | object)->object, | ||
255 | level + 4, 0); | ||
256 | } else { | ||
257 | acpi_ex_do_debug_object(source_desc->reference. | ||
258 | object, level + 4, 0); | ||
259 | } | ||
260 | } | ||
261 | break; | ||
262 | |||
263 | default: | ||
264 | |||
265 | ACPI_DEBUG_PRINT_RAW((ACPI_DB_DEBUG_OBJECT, "%p\n", | ||
266 | source_desc)); | ||
267 | break; | ||
268 | } | ||
269 | |||
270 | ACPI_DEBUG_PRINT_RAW((ACPI_DB_EXEC, "\n")); | ||
271 | return_VOID; | ||
272 | } | ||
273 | |||
274 | /******************************************************************************* | ||
275 | * | ||
276 | * FUNCTION: acpi_ex_store | 62 | * FUNCTION: acpi_ex_store |
277 | * | 63 | * |
278 | * PARAMETERS: *source_desc - Value to be stored | 64 | * PARAMETERS: *source_desc - Value to be stored |
@@ -402,12 +188,12 @@ acpi_ex_store(union acpi_operand_object *source_desc, | |||
402 | source_desc, | 188 | source_desc, |
403 | acpi_ut_get_object_type_name(source_desc))); | 189 | acpi_ut_get_object_type_name(source_desc))); |
404 | 190 | ||
405 | acpi_ex_do_debug_object(source_desc, 0, 0); | 191 | ACPI_DEBUG_OBJECT(source_desc, 0, 0); |
406 | break; | 192 | break; |
407 | 193 | ||
408 | default: | 194 | default: |
409 | 195 | ||
410 | ACPI_ERROR((AE_INFO, "Unknown Reference Class %2.2X", | 196 | ACPI_ERROR((AE_INFO, "Unknown Reference Class 0x%2.2X", |
411 | ref_desc->reference.class)); | 197 | ref_desc->reference.class)); |
412 | ACPI_DUMP_ENTRY(ref_desc, ACPI_LV_INFO); | 198 | ACPI_DUMP_ENTRY(ref_desc, ACPI_LV_INFO); |
413 | 199 | ||
diff --git a/drivers/acpi/acpica/exsystem.c b/drivers/acpi/acpica/exsystem.c index e11b6cb42a57..6d32e09327f1 100644 --- a/drivers/acpi/acpica/exsystem.c +++ b/drivers/acpi/acpica/exsystem.c | |||
@@ -170,7 +170,7 @@ acpi_status acpi_ex_system_do_stall(u32 how_long) | |||
170 | * (ACPI specifies 100 usec as max, but this gives some slack in | 170 | * (ACPI specifies 100 usec as max, but this gives some slack in |
171 | * order to support existing BIOSs) | 171 | * order to support existing BIOSs) |
172 | */ | 172 | */ |
173 | ACPI_ERROR((AE_INFO, "Time parameter is too large (%d)", | 173 | ACPI_ERROR((AE_INFO, "Time parameter is too large (%u)", |
174 | how_long)); | 174 | how_long)); |
175 | status = AE_AML_OPERAND_VALUE; | 175 | status = AE_AML_OPERAND_VALUE; |
176 | } else { | 176 | } else { |
@@ -182,18 +182,18 @@ acpi_status acpi_ex_system_do_stall(u32 how_long) | |||
182 | 182 | ||
183 | /******************************************************************************* | 183 | /******************************************************************************* |
184 | * | 184 | * |
185 | * FUNCTION: acpi_ex_system_do_suspend | 185 | * FUNCTION: acpi_ex_system_do_sleep |
186 | * | 186 | * |
187 | * PARAMETERS: how_long - The amount of time to suspend, | 187 | * PARAMETERS: how_long - The amount of time to sleep, |
188 | * in milliseconds | 188 | * in milliseconds |
189 | * | 189 | * |
190 | * RETURN: None | 190 | * RETURN: None |
191 | * | 191 | * |
192 | * DESCRIPTION: Suspend running thread for specified amount of time. | 192 | * DESCRIPTION: Sleep the running thread for specified amount of time. |
193 | * | 193 | * |
194 | ******************************************************************************/ | 194 | ******************************************************************************/ |
195 | 195 | ||
196 | acpi_status acpi_ex_system_do_suspend(u64 how_long) | 196 | acpi_status acpi_ex_system_do_sleep(u64 how_long) |
197 | { | 197 | { |
198 | ACPI_FUNCTION_ENTRY(); | 198 | ACPI_FUNCTION_ENTRY(); |
199 | 199 | ||
diff --git a/drivers/acpi/acpica/hwregs.c b/drivers/acpi/acpica/hwregs.c index ec7fc227b33f..5d1273b660ae 100644 --- a/drivers/acpi/acpica/hwregs.c +++ b/drivers/acpi/acpica/hwregs.c | |||
@@ -299,7 +299,7 @@ struct acpi_bit_register_info *acpi_hw_get_bit_register_info(u32 register_id) | |||
299 | ACPI_FUNCTION_ENTRY(); | 299 | ACPI_FUNCTION_ENTRY(); |
300 | 300 | ||
301 | if (register_id > ACPI_BITREG_MAX) { | 301 | if (register_id > ACPI_BITREG_MAX) { |
302 | ACPI_ERROR((AE_INFO, "Invalid BitRegister ID: %X", | 302 | ACPI_ERROR((AE_INFO, "Invalid BitRegister ID: 0x%X", |
303 | register_id)); | 303 | register_id)); |
304 | return (NULL); | 304 | return (NULL); |
305 | } | 305 | } |
@@ -413,7 +413,7 @@ acpi_hw_register_read(u32 register_id, u32 * return_value) | |||
413 | break; | 413 | break; |
414 | 414 | ||
415 | default: | 415 | default: |
416 | ACPI_ERROR((AE_INFO, "Unknown Register ID: %X", register_id)); | 416 | ACPI_ERROR((AE_INFO, "Unknown Register ID: 0x%X", register_id)); |
417 | status = AE_BAD_PARAMETER; | 417 | status = AE_BAD_PARAMETER; |
418 | break; | 418 | break; |
419 | } | 419 | } |
@@ -549,7 +549,7 @@ acpi_status acpi_hw_register_write(u32 register_id, u32 value) | |||
549 | break; | 549 | break; |
550 | 550 | ||
551 | default: | 551 | default: |
552 | ACPI_ERROR((AE_INFO, "Unknown Register ID: %X", register_id)); | 552 | ACPI_ERROR((AE_INFO, "Unknown Register ID: 0x%X", register_id)); |
553 | status = AE_BAD_PARAMETER; | 553 | status = AE_BAD_PARAMETER; |
554 | break; | 554 | break; |
555 | } | 555 | } |
diff --git a/drivers/acpi/acpica/hwsleep.c b/drivers/acpi/acpica/hwsleep.c index 5e6d4dbb8024..36eb803dd9d0 100644 --- a/drivers/acpi/acpica/hwsleep.c +++ b/drivers/acpi/acpica/hwsleep.c | |||
@@ -245,7 +245,7 @@ acpi_status asmlinkage acpi_enter_sleep_state(u8 sleep_state) | |||
245 | 245 | ||
246 | if ((acpi_gbl_sleep_type_a > ACPI_SLEEP_TYPE_MAX) || | 246 | if ((acpi_gbl_sleep_type_a > ACPI_SLEEP_TYPE_MAX) || |
247 | (acpi_gbl_sleep_type_b > ACPI_SLEEP_TYPE_MAX)) { | 247 | (acpi_gbl_sleep_type_b > ACPI_SLEEP_TYPE_MAX)) { |
248 | ACPI_ERROR((AE_INFO, "Sleep values out of range: A=%X B=%X", | 248 | ACPI_ERROR((AE_INFO, "Sleep values out of range: A=0x%X B=0x%X", |
249 | acpi_gbl_sleep_type_a, acpi_gbl_sleep_type_b)); | 249 | acpi_gbl_sleep_type_a, acpi_gbl_sleep_type_b)); |
250 | return_ACPI_STATUS(AE_AML_OPERAND_VALUE); | 250 | return_ACPI_STATUS(AE_AML_OPERAND_VALUE); |
251 | } | 251 | } |
diff --git a/drivers/acpi/acpica/hwvalid.c b/drivers/acpi/acpica/hwvalid.c index e26c17d4b716..c10d587c1641 100644 --- a/drivers/acpi/acpica/hwvalid.c +++ b/drivers/acpi/acpica/hwvalid.c | |||
@@ -150,7 +150,7 @@ acpi_hw_validate_io_request(acpi_io_address address, u32 bit_width) | |||
150 | 150 | ||
151 | if (last_address > ACPI_UINT16_MAX) { | 151 | if (last_address > ACPI_UINT16_MAX) { |
152 | ACPI_ERROR((AE_INFO, | 152 | ACPI_ERROR((AE_INFO, |
153 | "Illegal I/O port address/length above 64K: 0x%p/%X", | 153 | "Illegal I/O port address/length above 64K: %p/0x%X", |
154 | ACPI_CAST_PTR(void, address), byte_width)); | 154 | ACPI_CAST_PTR(void, address), byte_width)); |
155 | return_ACPI_STATUS(AE_LIMIT); | 155 | return_ACPI_STATUS(AE_LIMIT); |
156 | } | 156 | } |
diff --git a/drivers/acpi/acpica/nsaccess.c b/drivers/acpi/acpica/nsaccess.c index aa2b80132d0a..3a2814676ac3 100644 --- a/drivers/acpi/acpica/nsaccess.c +++ b/drivers/acpi/acpica/nsaccess.c | |||
@@ -222,7 +222,7 @@ acpi_status acpi_ns_root_initialize(void) | |||
222 | default: | 222 | default: |
223 | 223 | ||
224 | ACPI_ERROR((AE_INFO, | 224 | ACPI_ERROR((AE_INFO, |
225 | "Unsupported initial type value %X", | 225 | "Unsupported initial type value 0x%X", |
226 | init_val->type)); | 226 | init_val->type)); |
227 | acpi_ut_remove_reference(obj_desc); | 227 | acpi_ut_remove_reference(obj_desc); |
228 | obj_desc = NULL; | 228 | obj_desc = NULL; |
diff --git a/drivers/acpi/acpica/nsdump.c b/drivers/acpi/acpica/nsdump.c index 0689d36638d9..2110cc2360f0 100644 --- a/drivers/acpi/acpica/nsdump.c +++ b/drivers/acpi/acpica/nsdump.c | |||
@@ -205,8 +205,8 @@ acpi_ns_dump_one_object(acpi_handle obj_handle, | |||
205 | /* Check the node type and name */ | 205 | /* Check the node type and name */ |
206 | 206 | ||
207 | if (type > ACPI_TYPE_LOCAL_MAX) { | 207 | if (type > ACPI_TYPE_LOCAL_MAX) { |
208 | ACPI_WARNING((AE_INFO, "Invalid ACPI Object Type %08X", | 208 | ACPI_WARNING((AE_INFO, |
209 | type)); | 209 | "Invalid ACPI Object Type 0x%08X", type)); |
210 | } | 210 | } |
211 | 211 | ||
212 | if (!acpi_ut_valid_acpi_name(this_node->name.integer)) { | 212 | if (!acpi_ut_valid_acpi_name(this_node->name.integer)) { |
diff --git a/drivers/acpi/acpica/nsnames.c b/drivers/acpi/acpica/nsnames.c index 959372451635..7dea0031605c 100644 --- a/drivers/acpi/acpica/nsnames.c +++ b/drivers/acpi/acpica/nsnames.c | |||
@@ -107,7 +107,7 @@ acpi_ns_build_external_path(struct acpi_namespace_node *node, | |||
107 | 107 | ||
108 | if (index != 0) { | 108 | if (index != 0) { |
109 | ACPI_ERROR((AE_INFO, | 109 | ACPI_ERROR((AE_INFO, |
110 | "Could not construct external pathname; index=%X, size=%X, Path=%s", | 110 | "Could not construct external pathname; index=%u, size=%u, Path=%s", |
111 | (u32) index, (u32) size, &name_buffer[size])); | 111 | (u32) index, (u32) size, &name_buffer[size])); |
112 | 112 | ||
113 | return (AE_BAD_PARAMETER); | 113 | return (AE_BAD_PARAMETER); |
diff --git a/drivers/acpi/acpica/nssearch.c b/drivers/acpi/acpica/nssearch.c index 08f8b3f5ccaa..a8e42b5e9463 100644 --- a/drivers/acpi/acpica/nssearch.c +++ b/drivers/acpi/acpica/nssearch.c | |||
@@ -311,7 +311,7 @@ acpi_ns_search_and_enter(u32 target_name, | |||
311 | 311 | ||
312 | if (!node || !target_name || !return_node) { | 312 | if (!node || !target_name || !return_node) { |
313 | ACPI_ERROR((AE_INFO, | 313 | ACPI_ERROR((AE_INFO, |
314 | "Null parameter: Node %p Name %X ReturnNode %p", | 314 | "Null parameter: Node %p Name 0x%X ReturnNode %p", |
315 | node, target_name, return_node)); | 315 | node, target_name, return_node)); |
316 | return_ACPI_STATUS(AE_BAD_PARAMETER); | 316 | return_ACPI_STATUS(AE_BAD_PARAMETER); |
317 | } | 317 | } |
diff --git a/drivers/acpi/acpica/nsutils.c b/drivers/acpi/acpica/nsutils.c index 24d05a87a2a3..bab559712da1 100644 --- a/drivers/acpi/acpica/nsutils.c +++ b/drivers/acpi/acpica/nsutils.c | |||
@@ -276,7 +276,7 @@ u32 acpi_ns_local(acpi_object_type type) | |||
276 | 276 | ||
277 | /* Type code out of range */ | 277 | /* Type code out of range */ |
278 | 278 | ||
279 | ACPI_WARNING((AE_INFO, "Invalid Object Type %X", type)); | 279 | ACPI_WARNING((AE_INFO, "Invalid Object Type 0x%X", type)); |
280 | return_UINT32(ACPI_NS_NORMAL); | 280 | return_UINT32(ACPI_NS_NORMAL); |
281 | } | 281 | } |
282 | 282 | ||
@@ -764,7 +764,7 @@ u32 acpi_ns_opens_scope(acpi_object_type type) | |||
764 | 764 | ||
765 | /* type code out of range */ | 765 | /* type code out of range */ |
766 | 766 | ||
767 | ACPI_WARNING((AE_INFO, "Invalid Object Type %X", type)); | 767 | ACPI_WARNING((AE_INFO, "Invalid Object Type 0x%X", type)); |
768 | return_UINT32(ACPI_NS_NORMAL); | 768 | return_UINT32(ACPI_NS_NORMAL); |
769 | } | 769 | } |
770 | 770 | ||
diff --git a/drivers/acpi/acpica/psargs.c b/drivers/acpi/acpica/psargs.c index 00493e108a01..7df1a4c95274 100644 --- a/drivers/acpi/acpica/psargs.c +++ b/drivers/acpi/acpica/psargs.c | |||
@@ -460,7 +460,7 @@ acpi_ps_get_next_simple_arg(struct acpi_parse_state *parser_state, | |||
460 | 460 | ||
461 | default: | 461 | default: |
462 | 462 | ||
463 | ACPI_ERROR((AE_INFO, "Invalid ArgType %X", arg_type)); | 463 | ACPI_ERROR((AE_INFO, "Invalid ArgType 0x%X", arg_type)); |
464 | return_VOID; | 464 | return_VOID; |
465 | } | 465 | } |
466 | 466 | ||
@@ -742,7 +742,7 @@ acpi_ps_get_next_arg(struct acpi_walk_state *walk_state, | |||
742 | 742 | ||
743 | default: | 743 | default: |
744 | 744 | ||
745 | ACPI_ERROR((AE_INFO, "Invalid ArgType: %X", arg_type)); | 745 | ACPI_ERROR((AE_INFO, "Invalid ArgType: 0x%X", arg_type)); |
746 | status = AE_AML_OPERAND_TYPE; | 746 | status = AE_AML_OPERAND_TYPE; |
747 | break; | 747 | break; |
748 | } | 748 | } |
diff --git a/drivers/acpi/acpica/psloop.c b/drivers/acpi/acpica/psloop.c index 59aabaeab1d3..2f2e7760938c 100644 --- a/drivers/acpi/acpica/psloop.c +++ b/drivers/acpi/acpica/psloop.c | |||
@@ -136,7 +136,7 @@ static acpi_status acpi_ps_get_aml_opcode(struct acpi_walk_state *walk_state) | |||
136 | /* The opcode is unrecognized. Just skip unknown opcodes */ | 136 | /* The opcode is unrecognized. Just skip unknown opcodes */ |
137 | 137 | ||
138 | ACPI_ERROR((AE_INFO, | 138 | ACPI_ERROR((AE_INFO, |
139 | "Found unknown opcode %X at AML address %p offset %X, ignoring", | 139 | "Found unknown opcode 0x%X at AML address %p offset 0x%X, ignoring", |
140 | walk_state->opcode, walk_state->parser_state.aml, | 140 | walk_state->opcode, walk_state->parser_state.aml, |
141 | walk_state->aml_offset)); | 141 | walk_state->aml_offset)); |
142 | 142 | ||
@@ -1021,7 +1021,6 @@ acpi_status acpi_ps_parse_loop(struct acpi_walk_state *walk_state) | |||
1021 | if (status == AE_AML_NO_RETURN_VALUE) { | 1021 | if (status == AE_AML_NO_RETURN_VALUE) { |
1022 | ACPI_EXCEPTION((AE_INFO, status, | 1022 | ACPI_EXCEPTION((AE_INFO, status, |
1023 | "Invoked method did not return a value")); | 1023 | "Invoked method did not return a value")); |
1024 | |||
1025 | } | 1024 | } |
1026 | 1025 | ||
1027 | ACPI_EXCEPTION((AE_INFO, status, | 1026 | ACPI_EXCEPTION((AE_INFO, status, |
diff --git a/drivers/acpi/acpica/psxface.c b/drivers/acpi/acpica/psxface.c index 6064dd4e94c2..c42f067cff9d 100644 --- a/drivers/acpi/acpica/psxface.c +++ b/drivers/acpi/acpica/psxface.c | |||
@@ -46,6 +46,7 @@ | |||
46 | #include "acparser.h" | 46 | #include "acparser.h" |
47 | #include "acdispat.h" | 47 | #include "acdispat.h" |
48 | #include "acinterp.h" | 48 | #include "acinterp.h" |
49 | #include "actables.h" | ||
49 | #include "amlcode.h" | 50 | #include "amlcode.h" |
50 | 51 | ||
51 | #define _COMPONENT ACPI_PARSER | 52 | #define _COMPONENT ACPI_PARSER |
@@ -220,6 +221,10 @@ acpi_status acpi_ps_execute_method(struct acpi_evaluate_info *info) | |||
220 | 221 | ||
221 | ACPI_FUNCTION_TRACE(ps_execute_method); | 222 | ACPI_FUNCTION_TRACE(ps_execute_method); |
222 | 223 | ||
224 | /* Quick validation of DSDT header */ | ||
225 | |||
226 | acpi_tb_check_dsdt_header(); | ||
227 | |||
223 | /* Validate the Info and method Node */ | 228 | /* Validate the Info and method Node */ |
224 | 229 | ||
225 | if (!info || !info->resolved_node) { | 230 | if (!info || !info->resolved_node) { |
diff --git a/drivers/acpi/acpica/rscreate.c b/drivers/acpi/acpica/rscreate.c index f2ee3b548609..c80a2eea3a01 100644 --- a/drivers/acpi/acpica/rscreate.c +++ b/drivers/acpi/acpica/rscreate.c | |||
@@ -212,7 +212,7 @@ acpi_rs_create_pci_routing_table(union acpi_operand_object *package_object, | |||
212 | 212 | ||
213 | if ((*top_object_list)->common.type != ACPI_TYPE_PACKAGE) { | 213 | if ((*top_object_list)->common.type != ACPI_TYPE_PACKAGE) { |
214 | ACPI_ERROR((AE_INFO, | 214 | ACPI_ERROR((AE_INFO, |
215 | "(PRT[%X]) Need sub-package, found %s", | 215 | "(PRT[%u]) Need sub-package, found %s", |
216 | index, | 216 | index, |
217 | acpi_ut_get_object_type_name | 217 | acpi_ut_get_object_type_name |
218 | (*top_object_list))); | 218 | (*top_object_list))); |
@@ -223,7 +223,7 @@ acpi_rs_create_pci_routing_table(union acpi_operand_object *package_object, | |||
223 | 223 | ||
224 | if ((*top_object_list)->package.count != 4) { | 224 | if ((*top_object_list)->package.count != 4) { |
225 | ACPI_ERROR((AE_INFO, | 225 | ACPI_ERROR((AE_INFO, |
226 | "(PRT[%X]) Need package of length 4, found length %d", | 226 | "(PRT[%u]) Need package of length 4, found length %u", |
227 | index, (*top_object_list)->package.count)); | 227 | index, (*top_object_list)->package.count)); |
228 | return_ACPI_STATUS(AE_AML_PACKAGE_LIMIT); | 228 | return_ACPI_STATUS(AE_AML_PACKAGE_LIMIT); |
229 | } | 229 | } |
@@ -240,7 +240,7 @@ acpi_rs_create_pci_routing_table(union acpi_operand_object *package_object, | |||
240 | obj_desc = sub_object_list[0]; | 240 | obj_desc = sub_object_list[0]; |
241 | if (obj_desc->common.type != ACPI_TYPE_INTEGER) { | 241 | if (obj_desc->common.type != ACPI_TYPE_INTEGER) { |
242 | ACPI_ERROR((AE_INFO, | 242 | ACPI_ERROR((AE_INFO, |
243 | "(PRT[%X].Address) Need Integer, found %s", | 243 | "(PRT[%u].Address) Need Integer, found %s", |
244 | index, | 244 | index, |
245 | acpi_ut_get_object_type_name(obj_desc))); | 245 | acpi_ut_get_object_type_name(obj_desc))); |
246 | return_ACPI_STATUS(AE_BAD_DATA); | 246 | return_ACPI_STATUS(AE_BAD_DATA); |
@@ -253,7 +253,7 @@ acpi_rs_create_pci_routing_table(union acpi_operand_object *package_object, | |||
253 | obj_desc = sub_object_list[1]; | 253 | obj_desc = sub_object_list[1]; |
254 | if (obj_desc->common.type != ACPI_TYPE_INTEGER) { | 254 | if (obj_desc->common.type != ACPI_TYPE_INTEGER) { |
255 | ACPI_ERROR((AE_INFO, | 255 | ACPI_ERROR((AE_INFO, |
256 | "(PRT[%X].Pin) Need Integer, found %s", | 256 | "(PRT[%u].Pin) Need Integer, found %s", |
257 | index, | 257 | index, |
258 | acpi_ut_get_object_type_name(obj_desc))); | 258 | acpi_ut_get_object_type_name(obj_desc))); |
259 | return_ACPI_STATUS(AE_BAD_DATA); | 259 | return_ACPI_STATUS(AE_BAD_DATA); |
@@ -289,7 +289,7 @@ acpi_rs_create_pci_routing_table(union acpi_operand_object *package_object, | |||
289 | if (obj_desc->reference.class != | 289 | if (obj_desc->reference.class != |
290 | ACPI_REFCLASS_NAME) { | 290 | ACPI_REFCLASS_NAME) { |
291 | ACPI_ERROR((AE_INFO, | 291 | ACPI_ERROR((AE_INFO, |
292 | "(PRT[%X].Source) Need name, found Reference Class %X", | 292 | "(PRT[%u].Source) Need name, found Reference Class 0x%X", |
293 | index, | 293 | index, |
294 | obj_desc->reference.class)); | 294 | obj_desc->reference.class)); |
295 | return_ACPI_STATUS(AE_BAD_DATA); | 295 | return_ACPI_STATUS(AE_BAD_DATA); |
@@ -340,7 +340,7 @@ acpi_rs_create_pci_routing_table(union acpi_operand_object *package_object, | |||
340 | default: | 340 | default: |
341 | 341 | ||
342 | ACPI_ERROR((AE_INFO, | 342 | ACPI_ERROR((AE_INFO, |
343 | "(PRT[%X].Source) Need Ref/String/Integer, found %s", | 343 | "(PRT[%u].Source) Need Ref/String/Integer, found %s", |
344 | index, | 344 | index, |
345 | acpi_ut_get_object_type_name | 345 | acpi_ut_get_object_type_name |
346 | (obj_desc))); | 346 | (obj_desc))); |
@@ -358,7 +358,7 @@ acpi_rs_create_pci_routing_table(union acpi_operand_object *package_object, | |||
358 | obj_desc = sub_object_list[3]; | 358 | obj_desc = sub_object_list[3]; |
359 | if (obj_desc->common.type != ACPI_TYPE_INTEGER) { | 359 | if (obj_desc->common.type != ACPI_TYPE_INTEGER) { |
360 | ACPI_ERROR((AE_INFO, | 360 | ACPI_ERROR((AE_INFO, |
361 | "(PRT[%X].SourceIndex) Need Integer, found %s", | 361 | "(PRT[%u].SourceIndex) Need Integer, found %s", |
362 | index, | 362 | index, |
363 | acpi_ut_get_object_type_name(obj_desc))); | 363 | acpi_ut_get_object_type_name(obj_desc))); |
364 | return_ACPI_STATUS(AE_BAD_DATA); | 364 | return_ACPI_STATUS(AE_BAD_DATA); |
diff --git a/drivers/acpi/acpica/rslist.c b/drivers/acpi/acpica/rslist.c index fd057c72d252..7335f22aac20 100644 --- a/drivers/acpi/acpica/rslist.c +++ b/drivers/acpi/acpica/rslist.c | |||
@@ -94,7 +94,7 @@ acpi_rs_convert_aml_to_resources(u8 * aml, | |||
94 | [resource_index]); | 94 | [resource_index]); |
95 | if (ACPI_FAILURE(status)) { | 95 | if (ACPI_FAILURE(status)) { |
96 | ACPI_EXCEPTION((AE_INFO, status, | 96 | ACPI_EXCEPTION((AE_INFO, status, |
97 | "Could not convert AML resource (Type %X)", | 97 | "Could not convert AML resource (Type 0x%X)", |
98 | *aml)); | 98 | *aml)); |
99 | return_ACPI_STATUS(status); | 99 | return_ACPI_STATUS(status); |
100 | } | 100 | } |
@@ -147,7 +147,7 @@ acpi_rs_convert_resources_to_aml(struct acpi_resource *resource, | |||
147 | 147 | ||
148 | if (resource->type > ACPI_RESOURCE_TYPE_MAX) { | 148 | if (resource->type > ACPI_RESOURCE_TYPE_MAX) { |
149 | ACPI_ERROR((AE_INFO, | 149 | ACPI_ERROR((AE_INFO, |
150 | "Invalid descriptor type (%X) in resource list", | 150 | "Invalid descriptor type (0x%X) in resource list", |
151 | resource->type)); | 151 | resource->type)); |
152 | return_ACPI_STATUS(AE_BAD_DATA); | 152 | return_ACPI_STATUS(AE_BAD_DATA); |
153 | } | 153 | } |
@@ -161,7 +161,7 @@ acpi_rs_convert_resources_to_aml(struct acpi_resource *resource, | |||
161 | [resource->type]); | 161 | [resource->type]); |
162 | if (ACPI_FAILURE(status)) { | 162 | if (ACPI_FAILURE(status)) { |
163 | ACPI_EXCEPTION((AE_INFO, status, | 163 | ACPI_EXCEPTION((AE_INFO, status, |
164 | "Could not convert resource (type %X) to AML", | 164 | "Could not convert resource (type 0x%X) to AML", |
165 | resource->type)); | 165 | resource->type)); |
166 | return_ACPI_STATUS(status); | 166 | return_ACPI_STATUS(status); |
167 | } | 167 | } |
diff --git a/drivers/acpi/acpica/rsmisc.c b/drivers/acpi/acpica/rsmisc.c index 07de352fa443..f8cd9e87d987 100644 --- a/drivers/acpi/acpica/rsmisc.c +++ b/drivers/acpi/acpica/rsmisc.c | |||
@@ -88,7 +88,7 @@ acpi_rs_convert_aml_to_resource(struct acpi_resource *resource, | |||
88 | /* Each internal resource struct is expected to be 32-bit aligned */ | 88 | /* Each internal resource struct is expected to be 32-bit aligned */ |
89 | 89 | ||
90 | ACPI_WARNING((AE_INFO, | 90 | ACPI_WARNING((AE_INFO, |
91 | "Misaligned resource pointer (get): %p Type %2.2X Len %X", | 91 | "Misaligned resource pointer (get): %p Type 0x%2.2X Length %u", |
92 | resource, resource->type, resource->length)); | 92 | resource, resource->type, resource->length)); |
93 | } | 93 | } |
94 | 94 | ||
@@ -541,7 +541,7 @@ if (((aml->irq.flags & 0x09) == 0x00) || ((aml->irq.flags & 0x09) == 0x09)) { | |||
541 | * "IRQ Format"), so 0x00 and 0x09 are illegal. | 541 | * "IRQ Format"), so 0x00 and 0x09 are illegal. |
542 | */ | 542 | */ |
543 | ACPI_ERROR((AE_INFO, | 543 | ACPI_ERROR((AE_INFO, |
544 | "Invalid interrupt polarity/trigger in resource list, %X", | 544 | "Invalid interrupt polarity/trigger in resource list, 0x%X", |
545 | aml->irq.flags)); | 545 | aml->irq.flags)); |
546 | return_ACPI_STATUS(AE_BAD_DATA); | 546 | return_ACPI_STATUS(AE_BAD_DATA); |
547 | } | 547 | } |
diff --git a/drivers/acpi/acpica/tbfadt.c b/drivers/acpi/acpica/tbfadt.c index f43fbe0fc3fc..1728cb9bf600 100644 --- a/drivers/acpi/acpica/tbfadt.c +++ b/drivers/acpi/acpica/tbfadt.c | |||
@@ -283,7 +283,7 @@ void acpi_tb_create_local_fadt(struct acpi_table_header *table, u32 length) | |||
283 | if (length > sizeof(struct acpi_table_fadt)) { | 283 | if (length > sizeof(struct acpi_table_fadt)) { |
284 | ACPI_WARNING((AE_INFO, | 284 | ACPI_WARNING((AE_INFO, |
285 | "FADT (revision %u) is longer than ACPI 2.0 version, " | 285 | "FADT (revision %u) is longer than ACPI 2.0 version, " |
286 | "truncating length 0x%X to 0x%X", | 286 | "truncating length %u to %u", |
287 | table->revision, length, | 287 | table->revision, length, |
288 | (u32)sizeof(struct acpi_table_fadt))); | 288 | (u32)sizeof(struct acpi_table_fadt))); |
289 | } | 289 | } |
@@ -422,7 +422,7 @@ static void acpi_tb_convert_fadt(void) | |||
422 | if (address64->address && address32 && | 422 | if (address64->address && address32 && |
423 | (address64->address != (u64) address32)) { | 423 | (address64->address != (u64) address32)) { |
424 | ACPI_ERROR((AE_INFO, | 424 | ACPI_ERROR((AE_INFO, |
425 | "32/64X address mismatch in %s: %8.8X/%8.8X%8.8X, using 32", | 425 | "32/64X address mismatch in %s: 0x%8.8X/0x%8.8X%8.8X, using 32", |
426 | fadt_info_table[i].name, address32, | 426 | fadt_info_table[i].name, address32, |
427 | ACPI_FORMAT_UINT64(address64->address))); | 427 | ACPI_FORMAT_UINT64(address64->address))); |
428 | } | 428 | } |
@@ -481,7 +481,7 @@ static void acpi_tb_validate_fadt(void) | |||
481 | (acpi_gbl_FADT.Xfacs != (u64) acpi_gbl_FADT.facs)) { | 481 | (acpi_gbl_FADT.Xfacs != (u64) acpi_gbl_FADT.facs)) { |
482 | ACPI_WARNING((AE_INFO, | 482 | ACPI_WARNING((AE_INFO, |
483 | "32/64X FACS address mismatch in FADT - " | 483 | "32/64X FACS address mismatch in FADT - " |
484 | "%8.8X/%8.8X%8.8X, using 32", | 484 | "0x%8.8X/0x%8.8X%8.8X, using 32", |
485 | acpi_gbl_FADT.facs, | 485 | acpi_gbl_FADT.facs, |
486 | ACPI_FORMAT_UINT64(acpi_gbl_FADT.Xfacs))); | 486 | ACPI_FORMAT_UINT64(acpi_gbl_FADT.Xfacs))); |
487 | 487 | ||
@@ -492,7 +492,7 @@ static void acpi_tb_validate_fadt(void) | |||
492 | (acpi_gbl_FADT.Xdsdt != (u64) acpi_gbl_FADT.dsdt)) { | 492 | (acpi_gbl_FADT.Xdsdt != (u64) acpi_gbl_FADT.dsdt)) { |
493 | ACPI_WARNING((AE_INFO, | 493 | ACPI_WARNING((AE_INFO, |
494 | "32/64X DSDT address mismatch in FADT - " | 494 | "32/64X DSDT address mismatch in FADT - " |
495 | "%8.8X/%8.8X%8.8X, using 32", | 495 | "0x%8.8X/0x%8.8X%8.8X, using 32", |
496 | acpi_gbl_FADT.dsdt, | 496 | acpi_gbl_FADT.dsdt, |
497 | ACPI_FORMAT_UINT64(acpi_gbl_FADT.Xdsdt))); | 497 | ACPI_FORMAT_UINT64(acpi_gbl_FADT.Xdsdt))); |
498 | 498 | ||
@@ -521,7 +521,7 @@ static void acpi_tb_validate_fadt(void) | |||
521 | if (address64->address && | 521 | if (address64->address && |
522 | (address64->bit_width != ACPI_MUL_8(length))) { | 522 | (address64->bit_width != ACPI_MUL_8(length))) { |
523 | ACPI_WARNING((AE_INFO, | 523 | ACPI_WARNING((AE_INFO, |
524 | "32/64X length mismatch in %s: %d/%d", | 524 | "32/64X length mismatch in %s: %u/%u", |
525 | name, ACPI_MUL_8(length), | 525 | name, ACPI_MUL_8(length), |
526 | address64->bit_width)); | 526 | address64->bit_width)); |
527 | } | 527 | } |
@@ -534,7 +534,7 @@ static void acpi_tb_validate_fadt(void) | |||
534 | if (!address64->address || !length) { | 534 | if (!address64->address || !length) { |
535 | ACPI_ERROR((AE_INFO, | 535 | ACPI_ERROR((AE_INFO, |
536 | "Required field %s has zero address and/or length:" | 536 | "Required field %s has zero address and/or length:" |
537 | " %8.8X%8.8X/%X", | 537 | " 0x%8.8X%8.8X/0x%X", |
538 | name, | 538 | name, |
539 | ACPI_FORMAT_UINT64(address64-> | 539 | ACPI_FORMAT_UINT64(address64-> |
540 | address), | 540 | address), |
@@ -550,7 +550,7 @@ static void acpi_tb_validate_fadt(void) | |||
550 | (!address64->address && length)) { | 550 | (!address64->address && length)) { |
551 | ACPI_WARNING((AE_INFO, | 551 | ACPI_WARNING((AE_INFO, |
552 | "Optional field %s has zero address or length: " | 552 | "Optional field %s has zero address or length: " |
553 | "%8.8X%8.8X/%X", | 553 | "0x%8.8X%8.8X/0x%X", |
554 | name, | 554 | name, |
555 | ACPI_FORMAT_UINT64(address64-> | 555 | ACPI_FORMAT_UINT64(address64-> |
556 | address), | 556 | address), |
@@ -600,7 +600,7 @@ static void acpi_tb_setup_fadt_registers(void) | |||
600 | (fadt_info_table[i].default_length != | 600 | (fadt_info_table[i].default_length != |
601 | target64->bit_width)) { | 601 | target64->bit_width)) { |
602 | ACPI_WARNING((AE_INFO, | 602 | ACPI_WARNING((AE_INFO, |
603 | "Invalid length for %s: %d, using default %d", | 603 | "Invalid length for %s: %u, using default %u", |
604 | fadt_info_table[i].name, | 604 | fadt_info_table[i].name, |
605 | target64->bit_width, | 605 | target64->bit_width, |
606 | fadt_info_table[i]. | 606 | fadt_info_table[i]. |
diff --git a/drivers/acpi/acpica/tbfind.c b/drivers/acpi/acpica/tbfind.c index e252180ce61c..989d5c867864 100644 --- a/drivers/acpi/acpica/tbfind.c +++ b/drivers/acpi/acpica/tbfind.c | |||
@@ -83,7 +83,7 @@ acpi_tb_find_table(char *signature, | |||
83 | 83 | ||
84 | /* Search for the table */ | 84 | /* Search for the table */ |
85 | 85 | ||
86 | for (i = 0; i < acpi_gbl_root_table_list.count; ++i) { | 86 | for (i = 0; i < acpi_gbl_root_table_list.current_table_count; ++i) { |
87 | if (ACPI_MEMCMP(&(acpi_gbl_root_table_list.tables[i].signature), | 87 | if (ACPI_MEMCMP(&(acpi_gbl_root_table_list.tables[i].signature), |
88 | header.signature, ACPI_NAME_SIZE)) { | 88 | header.signature, ACPI_NAME_SIZE)) { |
89 | 89 | ||
diff --git a/drivers/acpi/acpica/tbinstal.c b/drivers/acpi/acpica/tbinstal.c index 7ec02b0f69e0..83d7af8d0905 100644 --- a/drivers/acpi/acpica/tbinstal.c +++ b/drivers/acpi/acpica/tbinstal.c | |||
@@ -137,7 +137,7 @@ acpi_tb_add_table(struct acpi_table_desc *table_desc, u32 *table_index) | |||
137 | 137 | ||
138 | /* Check if table is already registered */ | 138 | /* Check if table is already registered */ |
139 | 139 | ||
140 | for (i = 0; i < acpi_gbl_root_table_list.count; ++i) { | 140 | for (i = 0; i < acpi_gbl_root_table_list.current_table_count; ++i) { |
141 | if (!acpi_gbl_root_table_list.tables[i].pointer) { | 141 | if (!acpi_gbl_root_table_list.tables[i].pointer) { |
142 | status = | 142 | status = |
143 | acpi_tb_verify_table(&acpi_gbl_root_table_list. | 143 | acpi_tb_verify_table(&acpi_gbl_root_table_list. |
@@ -273,7 +273,7 @@ acpi_status acpi_tb_resize_root_table_list(void) | |||
273 | /* Increase the Table Array size */ | 273 | /* Increase the Table Array size */ |
274 | 274 | ||
275 | tables = ACPI_ALLOCATE_ZEROED(((acpi_size) acpi_gbl_root_table_list. | 275 | tables = ACPI_ALLOCATE_ZEROED(((acpi_size) acpi_gbl_root_table_list. |
276 | size + | 276 | max_table_count + |
277 | ACPI_ROOT_TABLE_SIZE_INCREMENT) * | 277 | ACPI_ROOT_TABLE_SIZE_INCREMENT) * |
278 | sizeof(struct acpi_table_desc)); | 278 | sizeof(struct acpi_table_desc)); |
279 | if (!tables) { | 279 | if (!tables) { |
@@ -286,8 +286,8 @@ acpi_status acpi_tb_resize_root_table_list(void) | |||
286 | 286 | ||
287 | if (acpi_gbl_root_table_list.tables) { | 287 | if (acpi_gbl_root_table_list.tables) { |
288 | ACPI_MEMCPY(tables, acpi_gbl_root_table_list.tables, | 288 | ACPI_MEMCPY(tables, acpi_gbl_root_table_list.tables, |
289 | (acpi_size) acpi_gbl_root_table_list.size * | 289 | (acpi_size) acpi_gbl_root_table_list. |
290 | sizeof(struct acpi_table_desc)); | 290 | max_table_count * sizeof(struct acpi_table_desc)); |
291 | 291 | ||
292 | if (acpi_gbl_root_table_list.flags & ACPI_ROOT_ORIGIN_ALLOCATED) { | 292 | if (acpi_gbl_root_table_list.flags & ACPI_ROOT_ORIGIN_ALLOCATED) { |
293 | ACPI_FREE(acpi_gbl_root_table_list.tables); | 293 | ACPI_FREE(acpi_gbl_root_table_list.tables); |
@@ -295,8 +295,9 @@ acpi_status acpi_tb_resize_root_table_list(void) | |||
295 | } | 295 | } |
296 | 296 | ||
297 | acpi_gbl_root_table_list.tables = tables; | 297 | acpi_gbl_root_table_list.tables = tables; |
298 | acpi_gbl_root_table_list.size += ACPI_ROOT_TABLE_SIZE_INCREMENT; | 298 | acpi_gbl_root_table_list.max_table_count += |
299 | acpi_gbl_root_table_list.flags |= (u8) ACPI_ROOT_ORIGIN_ALLOCATED; | 299 | ACPI_ROOT_TABLE_SIZE_INCREMENT; |
300 | acpi_gbl_root_table_list.flags |= (u8)ACPI_ROOT_ORIGIN_ALLOCATED; | ||
300 | 301 | ||
301 | return_ACPI_STATUS(AE_OK); | 302 | return_ACPI_STATUS(AE_OK); |
302 | } | 303 | } |
@@ -321,38 +322,36 @@ acpi_tb_store_table(acpi_physical_address address, | |||
321 | struct acpi_table_header *table, | 322 | struct acpi_table_header *table, |
322 | u32 length, u8 flags, u32 *table_index) | 323 | u32 length, u8 flags, u32 *table_index) |
323 | { | 324 | { |
324 | acpi_status status = AE_OK; | 325 | acpi_status status; |
326 | struct acpi_table_desc *new_table; | ||
325 | 327 | ||
326 | /* Ensure that there is room for the table in the Root Table List */ | 328 | /* Ensure that there is room for the table in the Root Table List */ |
327 | 329 | ||
328 | if (acpi_gbl_root_table_list.count >= acpi_gbl_root_table_list.size) { | 330 | if (acpi_gbl_root_table_list.current_table_count >= |
331 | acpi_gbl_root_table_list.max_table_count) { | ||
329 | status = acpi_tb_resize_root_table_list(); | 332 | status = acpi_tb_resize_root_table_list(); |
330 | if (ACPI_FAILURE(status)) { | 333 | if (ACPI_FAILURE(status)) { |
331 | return (status); | 334 | return (status); |
332 | } | 335 | } |
333 | } | 336 | } |
334 | 337 | ||
338 | new_table = | ||
339 | &acpi_gbl_root_table_list.tables[acpi_gbl_root_table_list. | ||
340 | current_table_count]; | ||
341 | |||
335 | /* Initialize added table */ | 342 | /* Initialize added table */ |
336 | 343 | ||
337 | acpi_gbl_root_table_list.tables[acpi_gbl_root_table_list.count]. | 344 | new_table->address = address; |
338 | address = address; | 345 | new_table->pointer = table; |
339 | acpi_gbl_root_table_list.tables[acpi_gbl_root_table_list.count]. | 346 | new_table->length = length; |
340 | pointer = table; | 347 | new_table->owner_id = 0; |
341 | acpi_gbl_root_table_list.tables[acpi_gbl_root_table_list.count].length = | 348 | new_table->flags = flags; |
342 | length; | 349 | |
343 | acpi_gbl_root_table_list.tables[acpi_gbl_root_table_list.count]. | 350 | ACPI_MOVE_32_TO_32(&new_table->signature, table->signature); |
344 | owner_id = 0; | 351 | |
345 | acpi_gbl_root_table_list.tables[acpi_gbl_root_table_list.count].flags = | 352 | *table_index = acpi_gbl_root_table_list.current_table_count; |
346 | flags; | 353 | acpi_gbl_root_table_list.current_table_count++; |
347 | 354 | return (AE_OK); | |
348 | ACPI_MOVE_32_TO_32(& | ||
349 | (acpi_gbl_root_table_list. | ||
350 | tables[acpi_gbl_root_table_list.count].signature), | ||
351 | table->signature); | ||
352 | |||
353 | *table_index = acpi_gbl_root_table_list.count; | ||
354 | acpi_gbl_root_table_list.count++; | ||
355 | return (status); | ||
356 | } | 355 | } |
357 | 356 | ||
358 | /******************************************************************************* | 357 | /******************************************************************************* |
@@ -408,7 +407,7 @@ void acpi_tb_terminate(void) | |||
408 | 407 | ||
409 | /* Delete the individual tables */ | 408 | /* Delete the individual tables */ |
410 | 409 | ||
411 | for (i = 0; i < acpi_gbl_root_table_list.count; ++i) { | 410 | for (i = 0; i < acpi_gbl_root_table_list.current_table_count; i++) { |
412 | acpi_tb_delete_table(&acpi_gbl_root_table_list.tables[i]); | 411 | acpi_tb_delete_table(&acpi_gbl_root_table_list.tables[i]); |
413 | } | 412 | } |
414 | 413 | ||
@@ -422,7 +421,7 @@ void acpi_tb_terminate(void) | |||
422 | 421 | ||
423 | acpi_gbl_root_table_list.tables = NULL; | 422 | acpi_gbl_root_table_list.tables = NULL; |
424 | acpi_gbl_root_table_list.flags = 0; | 423 | acpi_gbl_root_table_list.flags = 0; |
425 | acpi_gbl_root_table_list.count = 0; | 424 | acpi_gbl_root_table_list.current_table_count = 0; |
426 | 425 | ||
427 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "ACPI Tables freed\n")); | 426 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "ACPI Tables freed\n")); |
428 | (void)acpi_ut_release_mutex(ACPI_MTX_TABLES); | 427 | (void)acpi_ut_release_mutex(ACPI_MTX_TABLES); |
@@ -452,7 +451,7 @@ acpi_status acpi_tb_delete_namespace_by_owner(u32 table_index) | |||
452 | return_ACPI_STATUS(status); | 451 | return_ACPI_STATUS(status); |
453 | } | 452 | } |
454 | 453 | ||
455 | if (table_index >= acpi_gbl_root_table_list.count) { | 454 | if (table_index >= acpi_gbl_root_table_list.current_table_count) { |
456 | 455 | ||
457 | /* The table index does not exist */ | 456 | /* The table index does not exist */ |
458 | 457 | ||
@@ -505,7 +504,7 @@ acpi_status acpi_tb_allocate_owner_id(u32 table_index) | |||
505 | ACPI_FUNCTION_TRACE(tb_allocate_owner_id); | 504 | ACPI_FUNCTION_TRACE(tb_allocate_owner_id); |
506 | 505 | ||
507 | (void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES); | 506 | (void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES); |
508 | if (table_index < acpi_gbl_root_table_list.count) { | 507 | if (table_index < acpi_gbl_root_table_list.current_table_count) { |
509 | status = acpi_ut_allocate_owner_id | 508 | status = acpi_ut_allocate_owner_id |
510 | (&(acpi_gbl_root_table_list.tables[table_index].owner_id)); | 509 | (&(acpi_gbl_root_table_list.tables[table_index].owner_id)); |
511 | } | 510 | } |
@@ -533,7 +532,7 @@ acpi_status acpi_tb_release_owner_id(u32 table_index) | |||
533 | ACPI_FUNCTION_TRACE(tb_release_owner_id); | 532 | ACPI_FUNCTION_TRACE(tb_release_owner_id); |
534 | 533 | ||
535 | (void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES); | 534 | (void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES); |
536 | if (table_index < acpi_gbl_root_table_list.count) { | 535 | if (table_index < acpi_gbl_root_table_list.current_table_count) { |
537 | acpi_ut_release_owner_id(& | 536 | acpi_ut_release_owner_id(& |
538 | (acpi_gbl_root_table_list. | 537 | (acpi_gbl_root_table_list. |
539 | tables[table_index].owner_id)); | 538 | tables[table_index].owner_id)); |
@@ -564,7 +563,7 @@ acpi_status acpi_tb_get_owner_id(u32 table_index, acpi_owner_id *owner_id) | |||
564 | ACPI_FUNCTION_TRACE(tb_get_owner_id); | 563 | ACPI_FUNCTION_TRACE(tb_get_owner_id); |
565 | 564 | ||
566 | (void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES); | 565 | (void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES); |
567 | if (table_index < acpi_gbl_root_table_list.count) { | 566 | if (table_index < acpi_gbl_root_table_list.current_table_count) { |
568 | *owner_id = | 567 | *owner_id = |
569 | acpi_gbl_root_table_list.tables[table_index].owner_id; | 568 | acpi_gbl_root_table_list.tables[table_index].owner_id; |
570 | status = AE_OK; | 569 | status = AE_OK; |
@@ -589,7 +588,7 @@ u8 acpi_tb_is_table_loaded(u32 table_index) | |||
589 | u8 is_loaded = FALSE; | 588 | u8 is_loaded = FALSE; |
590 | 589 | ||
591 | (void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES); | 590 | (void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES); |
592 | if (table_index < acpi_gbl_root_table_list.count) { | 591 | if (table_index < acpi_gbl_root_table_list.current_table_count) { |
593 | is_loaded = (u8) | 592 | is_loaded = (u8) |
594 | (acpi_gbl_root_table_list.tables[table_index].flags & | 593 | (acpi_gbl_root_table_list.tables[table_index].flags & |
595 | ACPI_TABLE_IS_LOADED); | 594 | ACPI_TABLE_IS_LOADED); |
@@ -616,7 +615,7 @@ void acpi_tb_set_table_loaded_flag(u32 table_index, u8 is_loaded) | |||
616 | { | 615 | { |
617 | 616 | ||
618 | (void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES); | 617 | (void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES); |
619 | if (table_index < acpi_gbl_root_table_list.count) { | 618 | if (table_index < acpi_gbl_root_table_list.current_table_count) { |
620 | if (is_loaded) { | 619 | if (is_loaded) { |
621 | acpi_gbl_root_table_list.tables[table_index].flags |= | 620 | acpi_gbl_root_table_list.tables[table_index].flags |= |
622 | ACPI_TABLE_IS_LOADED; | 621 | ACPI_TABLE_IS_LOADED; |
diff --git a/drivers/acpi/acpica/tbutils.c b/drivers/acpi/acpica/tbutils.c index 02723a9fb10c..34f9c2bc5e1f 100644 --- a/drivers/acpi/acpica/tbutils.c +++ b/drivers/acpi/acpica/tbutils.c | |||
@@ -158,7 +158,7 @@ acpi_status acpi_tb_initialize_facs(void) | |||
158 | u8 acpi_tb_tables_loaded(void) | 158 | u8 acpi_tb_tables_loaded(void) |
159 | { | 159 | { |
160 | 160 | ||
161 | if (acpi_gbl_root_table_list.count >= 3) { | 161 | if (acpi_gbl_root_table_list.current_table_count >= 3) { |
162 | return (TRUE); | 162 | return (TRUE); |
163 | } | 163 | } |
164 | 164 | ||
@@ -309,7 +309,7 @@ acpi_status acpi_tb_verify_checksum(struct acpi_table_header *table, u32 length) | |||
309 | 309 | ||
310 | if (checksum) { | 310 | if (checksum) { |
311 | ACPI_WARNING((AE_INFO, | 311 | ACPI_WARNING((AE_INFO, |
312 | "Incorrect checksum in table [%4.4s] - %2.2X, should be %2.2X", | 312 | "Incorrect checksum in table [%4.4s] - 0x%2.2X, should be 0x%2.2X", |
313 | table->signature, table->checksum, | 313 | table->signature, table->checksum, |
314 | (u8) (table->checksum - checksum))); | 314 | (u8) (table->checksum - checksum))); |
315 | 315 | ||
@@ -349,6 +349,84 @@ u8 acpi_tb_checksum(u8 *buffer, u32 length) | |||
349 | 349 | ||
350 | /******************************************************************************* | 350 | /******************************************************************************* |
351 | * | 351 | * |
352 | * FUNCTION: acpi_tb_check_dsdt_header | ||
353 | * | ||
354 | * PARAMETERS: None | ||
355 | * | ||
356 | * RETURN: None | ||
357 | * | ||
358 | * DESCRIPTION: Quick compare to check validity of the DSDT. This will detect | ||
359 | * if the DSDT has been replaced from outside the OS and/or if | ||
360 | * the DSDT header has been corrupted. | ||
361 | * | ||
362 | ******************************************************************************/ | ||
363 | |||
364 | void acpi_tb_check_dsdt_header(void) | ||
365 | { | ||
366 | |||
367 | /* Compare original length and checksum to current values */ | ||
368 | |||
369 | if (acpi_gbl_original_dsdt_header.length != acpi_gbl_DSDT->length || | ||
370 | acpi_gbl_original_dsdt_header.checksum != acpi_gbl_DSDT->checksum) { | ||
371 | ACPI_ERROR((AE_INFO, | ||
372 | "The DSDT has been corrupted or replaced - old, new headers below")); | ||
373 | acpi_tb_print_table_header(0, &acpi_gbl_original_dsdt_header); | ||
374 | acpi_tb_print_table_header(0, acpi_gbl_DSDT); | ||
375 | |||
376 | ACPI_ERROR((AE_INFO, | ||
377 | "Please send DMI info to linux-acpi@vger.kernel.org\n" | ||
378 | "If system does not work as expected, please boot with acpi=copy_dsdt")); | ||
379 | |||
380 | /* Disable further error messages */ | ||
381 | |||
382 | acpi_gbl_original_dsdt_header.length = acpi_gbl_DSDT->length; | ||
383 | acpi_gbl_original_dsdt_header.checksum = | ||
384 | acpi_gbl_DSDT->checksum; | ||
385 | } | ||
386 | } | ||
387 | |||
388 | /******************************************************************************* | ||
389 | * | ||
390 | * FUNCTION: acpi_tb_copy_dsdt | ||
391 | * | ||
392 | * PARAMETERS: table_desc - Installed table to copy | ||
393 | * | ||
394 | * RETURN: None | ||
395 | * | ||
396 | * DESCRIPTION: Implements a subsystem option to copy the DSDT to local memory. | ||
397 | * Some very bad BIOSs are known to either corrupt the DSDT or | ||
398 | * install a new, bad DSDT. This copy works around the problem. | ||
399 | * | ||
400 | ******************************************************************************/ | ||
401 | |||
402 | struct acpi_table_header *acpi_tb_copy_dsdt(u32 table_index) | ||
403 | { | ||
404 | struct acpi_table_header *new_table; | ||
405 | struct acpi_table_desc *table_desc; | ||
406 | |||
407 | table_desc = &acpi_gbl_root_table_list.tables[table_index]; | ||
408 | |||
409 | new_table = ACPI_ALLOCATE(table_desc->length); | ||
410 | if (!new_table) { | ||
411 | ACPI_ERROR((AE_INFO, "Could not copy DSDT of length 0x%X", | ||
412 | table_desc->length)); | ||
413 | return (NULL); | ||
414 | } | ||
415 | |||
416 | ACPI_MEMCPY(new_table, table_desc->pointer, table_desc->length); | ||
417 | acpi_tb_delete_table(table_desc); | ||
418 | table_desc->pointer = new_table; | ||
419 | table_desc->flags = ACPI_TABLE_ORIGIN_ALLOCATED; | ||
420 | |||
421 | ACPI_INFO((AE_INFO, | ||
422 | "Forced DSDT copy: length 0x%05X copied locally, original unmapped", | ||
423 | new_table->length)); | ||
424 | |||
425 | return (new_table); | ||
426 | } | ||
427 | |||
428 | /******************************************************************************* | ||
429 | * | ||
352 | * FUNCTION: acpi_tb_install_table | 430 | * FUNCTION: acpi_tb_install_table |
353 | * | 431 | * |
354 | * PARAMETERS: Address - Physical address of DSDT or FACS | 432 | * PARAMETERS: Address - Physical address of DSDT or FACS |
@@ -496,7 +574,7 @@ acpi_tb_get_root_table_entry(u8 *table_entry, u32 table_entry_size) | |||
496 | /* Will truncate 64-bit address to 32 bits, issue warning */ | 574 | /* Will truncate 64-bit address to 32 bits, issue warning */ |
497 | 575 | ||
498 | ACPI_WARNING((AE_INFO, | 576 | ACPI_WARNING((AE_INFO, |
499 | "64-bit Physical Address in XSDT is too large (%8.8X%8.8X)," | 577 | "64-bit Physical Address in XSDT is too large (0x%8.8X%8.8X)," |
500 | " truncating", | 578 | " truncating", |
501 | ACPI_FORMAT_UINT64(address64))); | 579 | ACPI_FORMAT_UINT64(address64))); |
502 | } | 580 | } |
@@ -629,14 +707,14 @@ acpi_tb_parse_root_table(acpi_physical_address rsdp_address) | |||
629 | */ | 707 | */ |
630 | table_entry = | 708 | table_entry = |
631 | ACPI_CAST_PTR(u8, table) + sizeof(struct acpi_table_header); | 709 | ACPI_CAST_PTR(u8, table) + sizeof(struct acpi_table_header); |
632 | acpi_gbl_root_table_list.count = 2; | 710 | acpi_gbl_root_table_list.current_table_count = 2; |
633 | 711 | ||
634 | /* | 712 | /* |
635 | * Initialize the root table array from the RSDT/XSDT | 713 | * Initialize the root table array from the RSDT/XSDT |
636 | */ | 714 | */ |
637 | for (i = 0; i < table_count; i++) { | 715 | for (i = 0; i < table_count; i++) { |
638 | if (acpi_gbl_root_table_list.count >= | 716 | if (acpi_gbl_root_table_list.current_table_count >= |
639 | acpi_gbl_root_table_list.size) { | 717 | acpi_gbl_root_table_list.max_table_count) { |
640 | 718 | ||
641 | /* There is no more room in the root table array, attempt resize */ | 719 | /* There is no more room in the root table array, attempt resize */ |
642 | 720 | ||
@@ -646,19 +724,20 @@ acpi_tb_parse_root_table(acpi_physical_address rsdp_address) | |||
646 | "Truncating %u table entries!", | 724 | "Truncating %u table entries!", |
647 | (unsigned) (table_count - | 725 | (unsigned) (table_count - |
648 | (acpi_gbl_root_table_list. | 726 | (acpi_gbl_root_table_list. |
649 | count - 2)))); | 727 | current_table_count - |
728 | 2)))); | ||
650 | break; | 729 | break; |
651 | } | 730 | } |
652 | } | 731 | } |
653 | 732 | ||
654 | /* Get the table physical address (32-bit for RSDT, 64-bit for XSDT) */ | 733 | /* Get the table physical address (32-bit for RSDT, 64-bit for XSDT) */ |
655 | 734 | ||
656 | acpi_gbl_root_table_list.tables[acpi_gbl_root_table_list.count]. | 735 | acpi_gbl_root_table_list.tables[acpi_gbl_root_table_list. |
657 | address = | 736 | current_table_count].address = |
658 | acpi_tb_get_root_table_entry(table_entry, table_entry_size); | 737 | acpi_tb_get_root_table_entry(table_entry, table_entry_size); |
659 | 738 | ||
660 | table_entry += table_entry_size; | 739 | table_entry += table_entry_size; |
661 | acpi_gbl_root_table_list.count++; | 740 | acpi_gbl_root_table_list.current_table_count++; |
662 | } | 741 | } |
663 | 742 | ||
664 | /* | 743 | /* |
@@ -671,7 +750,7 @@ acpi_tb_parse_root_table(acpi_physical_address rsdp_address) | |||
671 | * Complete the initialization of the root table array by examining | 750 | * Complete the initialization of the root table array by examining |
672 | * the header of each table | 751 | * the header of each table |
673 | */ | 752 | */ |
674 | for (i = 2; i < acpi_gbl_root_table_list.count; i++) { | 753 | for (i = 2; i < acpi_gbl_root_table_list.current_table_count; i++) { |
675 | acpi_tb_install_table(acpi_gbl_root_table_list.tables[i]. | 754 | acpi_tb_install_table(acpi_gbl_root_table_list.tables[i]. |
676 | address, NULL, i); | 755 | address, NULL, i); |
677 | 756 | ||
diff --git a/drivers/acpi/acpica/tbxface.c b/drivers/acpi/acpica/tbxface.c index 5217a6159a31..4a8b9e6ea57a 100644 --- a/drivers/acpi/acpica/tbxface.c +++ b/drivers/acpi/acpica/tbxface.c | |||
@@ -72,7 +72,7 @@ static int no_auto_ssdt; | |||
72 | acpi_status acpi_allocate_root_table(u32 initial_table_count) | 72 | acpi_status acpi_allocate_root_table(u32 initial_table_count) |
73 | { | 73 | { |
74 | 74 | ||
75 | acpi_gbl_root_table_list.size = initial_table_count; | 75 | acpi_gbl_root_table_list.max_table_count = initial_table_count; |
76 | acpi_gbl_root_table_list.flags = ACPI_ROOT_ALLOW_RESIZE; | 76 | acpi_gbl_root_table_list.flags = ACPI_ROOT_ALLOW_RESIZE; |
77 | 77 | ||
78 | return (acpi_tb_resize_root_table_list()); | 78 | return (acpi_tb_resize_root_table_list()); |
@@ -130,7 +130,7 @@ acpi_initialize_tables(struct acpi_table_desc * initial_table_array, | |||
130 | sizeof(struct acpi_table_desc)); | 130 | sizeof(struct acpi_table_desc)); |
131 | 131 | ||
132 | acpi_gbl_root_table_list.tables = initial_table_array; | 132 | acpi_gbl_root_table_list.tables = initial_table_array; |
133 | acpi_gbl_root_table_list.size = initial_table_count; | 133 | acpi_gbl_root_table_list.max_table_count = initial_table_count; |
134 | acpi_gbl_root_table_list.flags = ACPI_ROOT_ORIGIN_UNKNOWN; | 134 | acpi_gbl_root_table_list.flags = ACPI_ROOT_ORIGIN_UNKNOWN; |
135 | if (allow_resize) { | 135 | if (allow_resize) { |
136 | acpi_gbl_root_table_list.flags |= | 136 | acpi_gbl_root_table_list.flags |= |
@@ -172,6 +172,7 @@ acpi_status acpi_reallocate_root_table(void) | |||
172 | { | 172 | { |
173 | struct acpi_table_desc *tables; | 173 | struct acpi_table_desc *tables; |
174 | acpi_size new_size; | 174 | acpi_size new_size; |
175 | acpi_size current_size; | ||
175 | 176 | ||
176 | ACPI_FUNCTION_TRACE(acpi_reallocate_root_table); | 177 | ACPI_FUNCTION_TRACE(acpi_reallocate_root_table); |
177 | 178 | ||
@@ -183,10 +184,17 @@ acpi_status acpi_reallocate_root_table(void) | |||
183 | return_ACPI_STATUS(AE_SUPPORT); | 184 | return_ACPI_STATUS(AE_SUPPORT); |
184 | } | 185 | } |
185 | 186 | ||
186 | new_size = ((acpi_size) acpi_gbl_root_table_list.count + | 187 | /* |
187 | ACPI_ROOT_TABLE_SIZE_INCREMENT) * | 188 | * Get the current size of the root table and add the default |
189 | * increment to create the new table size. | ||
190 | */ | ||
191 | current_size = (acpi_size) | ||
192 | acpi_gbl_root_table_list.current_table_count * | ||
188 | sizeof(struct acpi_table_desc); | 193 | sizeof(struct acpi_table_desc); |
189 | 194 | ||
195 | new_size = current_size + | ||
196 | (ACPI_ROOT_TABLE_SIZE_INCREMENT * sizeof(struct acpi_table_desc)); | ||
197 | |||
190 | /* Create new array and copy the old array */ | 198 | /* Create new array and copy the old array */ |
191 | 199 | ||
192 | tables = ACPI_ALLOCATE_ZEROED(new_size); | 200 | tables = ACPI_ALLOCATE_ZEROED(new_size); |
@@ -194,10 +202,17 @@ acpi_status acpi_reallocate_root_table(void) | |||
194 | return_ACPI_STATUS(AE_NO_MEMORY); | 202 | return_ACPI_STATUS(AE_NO_MEMORY); |
195 | } | 203 | } |
196 | 204 | ||
197 | ACPI_MEMCPY(tables, acpi_gbl_root_table_list.tables, new_size); | 205 | ACPI_MEMCPY(tables, acpi_gbl_root_table_list.tables, current_size); |
198 | 206 | ||
199 | acpi_gbl_root_table_list.size = acpi_gbl_root_table_list.count; | 207 | /* |
208 | * Update the root table descriptor. The new size will be the current | ||
209 | * number of tables plus the increment, independent of the reserved | ||
210 | * size of the original table list. | ||
211 | */ | ||
200 | acpi_gbl_root_table_list.tables = tables; | 212 | acpi_gbl_root_table_list.tables = tables; |
213 | acpi_gbl_root_table_list.max_table_count = | ||
214 | acpi_gbl_root_table_list.current_table_count + | ||
215 | ACPI_ROOT_TABLE_SIZE_INCREMENT; | ||
201 | acpi_gbl_root_table_list.flags = | 216 | acpi_gbl_root_table_list.flags = |
202 | ACPI_ROOT_ORIGIN_ALLOCATED | ACPI_ROOT_ALLOW_RESIZE; | 217 | ACPI_ROOT_ORIGIN_ALLOCATED | ACPI_ROOT_ALLOW_RESIZE; |
203 | 218 | ||
@@ -278,7 +293,8 @@ acpi_get_table_header(char *signature, | |||
278 | 293 | ||
279 | /* Walk the root table list */ | 294 | /* Walk the root table list */ |
280 | 295 | ||
281 | for (i = 0, j = 0; i < acpi_gbl_root_table_list.count; i++) { | 296 | for (i = 0, j = 0; i < acpi_gbl_root_table_list.current_table_count; |
297 | i++) { | ||
282 | if (!ACPI_COMPARE_NAME | 298 | if (!ACPI_COMPARE_NAME |
283 | (&(acpi_gbl_root_table_list.tables[i].signature), | 299 | (&(acpi_gbl_root_table_list.tables[i].signature), |
284 | signature)) { | 300 | signature)) { |
@@ -341,7 +357,7 @@ acpi_status acpi_unload_table_id(acpi_owner_id id) | |||
341 | ACPI_FUNCTION_TRACE(acpi_unload_table_id); | 357 | ACPI_FUNCTION_TRACE(acpi_unload_table_id); |
342 | 358 | ||
343 | /* Find table in the global table list */ | 359 | /* Find table in the global table list */ |
344 | for (i = 0; i < acpi_gbl_root_table_list.count; ++i) { | 360 | for (i = 0; i < acpi_gbl_root_table_list.current_table_count; ++i) { |
345 | if (id != acpi_gbl_root_table_list.tables[i].owner_id) { | 361 | if (id != acpi_gbl_root_table_list.tables[i].owner_id) { |
346 | continue; | 362 | continue; |
347 | } | 363 | } |
@@ -391,7 +407,8 @@ acpi_get_table_with_size(char *signature, | |||
391 | 407 | ||
392 | /* Walk the root table list */ | 408 | /* Walk the root table list */ |
393 | 409 | ||
394 | for (i = 0, j = 0; i < acpi_gbl_root_table_list.count; i++) { | 410 | for (i = 0, j = 0; i < acpi_gbl_root_table_list.current_table_count; |
411 | i++) { | ||
395 | if (!ACPI_COMPARE_NAME | 412 | if (!ACPI_COMPARE_NAME |
396 | (&(acpi_gbl_root_table_list.tables[i].signature), | 413 | (&(acpi_gbl_root_table_list.tables[i].signature), |
397 | signature)) { | 414 | signature)) { |
@@ -459,7 +476,7 @@ acpi_get_table_by_index(u32 table_index, struct acpi_table_header **table) | |||
459 | 476 | ||
460 | /* Validate index */ | 477 | /* Validate index */ |
461 | 478 | ||
462 | if (table_index >= acpi_gbl_root_table_list.count) { | 479 | if (table_index >= acpi_gbl_root_table_list.current_table_count) { |
463 | (void)acpi_ut_release_mutex(ACPI_MTX_TABLES); | 480 | (void)acpi_ut_release_mutex(ACPI_MTX_TABLES); |
464 | return_ACPI_STATUS(AE_BAD_PARAMETER); | 481 | return_ACPI_STATUS(AE_BAD_PARAMETER); |
465 | } | 482 | } |
@@ -500,16 +517,17 @@ static acpi_status acpi_tb_load_namespace(void) | |||
500 | { | 517 | { |
501 | acpi_status status; | 518 | acpi_status status; |
502 | u32 i; | 519 | u32 i; |
520 | struct acpi_table_header *new_dsdt; | ||
503 | 521 | ||
504 | ACPI_FUNCTION_TRACE(tb_load_namespace); | 522 | ACPI_FUNCTION_TRACE(tb_load_namespace); |
505 | 523 | ||
506 | (void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES); | 524 | (void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES); |
507 | 525 | ||
508 | /* | 526 | /* |
509 | * Load the namespace. The DSDT is required, but any SSDT and PSDT tables | 527 | * Load the namespace. The DSDT is required, but any SSDT and |
510 | * are optional. | 528 | * PSDT tables are optional. Verify the DSDT. |
511 | */ | 529 | */ |
512 | if (!acpi_gbl_root_table_list.count || | 530 | if (!acpi_gbl_root_table_list.current_table_count || |
513 | !ACPI_COMPARE_NAME(& | 531 | !ACPI_COMPARE_NAME(& |
514 | (acpi_gbl_root_table_list. | 532 | (acpi_gbl_root_table_list. |
515 | tables[ACPI_TABLE_INDEX_DSDT].signature), | 533 | tables[ACPI_TABLE_INDEX_DSDT].signature), |
@@ -522,17 +540,35 @@ static acpi_status acpi_tb_load_namespace(void) | |||
522 | goto unlock_and_exit; | 540 | goto unlock_and_exit; |
523 | } | 541 | } |
524 | 542 | ||
525 | /* A valid DSDT is required */ | 543 | /* |
526 | 544 | * Save the DSDT pointer for simple access. This is the mapped memory | |
527 | status = | 545 | * address. We must take care here because the address of the .Tables |
528 | acpi_tb_verify_table(&acpi_gbl_root_table_list. | 546 | * array can change dynamically as tables are loaded at run-time. Note: |
529 | tables[ACPI_TABLE_INDEX_DSDT]); | 547 | * .Pointer field is not validated until after call to acpi_tb_verify_table. |
530 | if (ACPI_FAILURE(status)) { | 548 | */ |
549 | acpi_gbl_DSDT = | ||
550 | acpi_gbl_root_table_list.tables[ACPI_TABLE_INDEX_DSDT].pointer; | ||
531 | 551 | ||
532 | status = AE_NO_ACPI_TABLES; | 552 | /* |
533 | goto unlock_and_exit; | 553 | * Optionally copy the entire DSDT to local memory (instead of simply |
554 | * mapping it.) There are some BIOSs that corrupt or replace the original | ||
555 | * DSDT, creating the need for this option. Default is FALSE, do not copy | ||
556 | * the DSDT. | ||
557 | */ | ||
558 | if (acpi_gbl_copy_dsdt_locally) { | ||
559 | new_dsdt = acpi_tb_copy_dsdt(ACPI_TABLE_INDEX_DSDT); | ||
560 | if (new_dsdt) { | ||
561 | acpi_gbl_DSDT = new_dsdt; | ||
562 | } | ||
534 | } | 563 | } |
535 | 564 | ||
565 | /* | ||
566 | * Save the original DSDT header for detection of table corruption | ||
567 | * and/or replacement of the DSDT from outside the OS. | ||
568 | */ | ||
569 | ACPI_MEMCPY(&acpi_gbl_original_dsdt_header, acpi_gbl_DSDT, | ||
570 | sizeof(struct acpi_table_header)); | ||
571 | |||
536 | (void)acpi_ut_release_mutex(ACPI_MTX_TABLES); | 572 | (void)acpi_ut_release_mutex(ACPI_MTX_TABLES); |
537 | 573 | ||
538 | /* Load and parse tables */ | 574 | /* Load and parse tables */ |
@@ -545,7 +581,7 @@ static acpi_status acpi_tb_load_namespace(void) | |||
545 | /* Load any SSDT or PSDT tables. Note: Loop leaves tables locked */ | 581 | /* Load any SSDT or PSDT tables. Note: Loop leaves tables locked */ |
546 | 582 | ||
547 | (void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES); | 583 | (void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES); |
548 | for (i = 0; i < acpi_gbl_root_table_list.count; ++i) { | 584 | for (i = 0; i < acpi_gbl_root_table_list.current_table_count; ++i) { |
549 | if ((!ACPI_COMPARE_NAME | 585 | if ((!ACPI_COMPARE_NAME |
550 | (&(acpi_gbl_root_table_list.tables[i].signature), | 586 | (&(acpi_gbl_root_table_list.tables[i].signature), |
551 | ACPI_SIG_SSDT) | 587 | ACPI_SIG_SSDT) |
diff --git a/drivers/acpi/acpica/tbxfroot.c b/drivers/acpi/acpica/tbxfroot.c index dda6e8c497d3..fd2c07d1d3ac 100644 --- a/drivers/acpi/acpica/tbxfroot.c +++ b/drivers/acpi/acpica/tbxfroot.c | |||
@@ -134,7 +134,7 @@ acpi_status acpi_find_root_pointer(acpi_size *table_address) | |||
134 | ACPI_EBDA_PTR_LENGTH); | 134 | ACPI_EBDA_PTR_LENGTH); |
135 | if (!table_ptr) { | 135 | if (!table_ptr) { |
136 | ACPI_ERROR((AE_INFO, | 136 | ACPI_ERROR((AE_INFO, |
137 | "Could not map memory at %8.8X for length %X", | 137 | "Could not map memory at 0x%8.8X for length %u", |
138 | ACPI_EBDA_PTR_LOCATION, ACPI_EBDA_PTR_LENGTH)); | 138 | ACPI_EBDA_PTR_LOCATION, ACPI_EBDA_PTR_LENGTH)); |
139 | 139 | ||
140 | return_ACPI_STATUS(AE_NO_MEMORY); | 140 | return_ACPI_STATUS(AE_NO_MEMORY); |
@@ -159,7 +159,7 @@ acpi_status acpi_find_root_pointer(acpi_size *table_address) | |||
159 | ACPI_EBDA_WINDOW_SIZE); | 159 | ACPI_EBDA_WINDOW_SIZE); |
160 | if (!table_ptr) { | 160 | if (!table_ptr) { |
161 | ACPI_ERROR((AE_INFO, | 161 | ACPI_ERROR((AE_INFO, |
162 | "Could not map memory at %8.8X for length %X", | 162 | "Could not map memory at 0x%8.8X for length %u", |
163 | physical_address, ACPI_EBDA_WINDOW_SIZE)); | 163 | physical_address, ACPI_EBDA_WINDOW_SIZE)); |
164 | 164 | ||
165 | return_ACPI_STATUS(AE_NO_MEMORY); | 165 | return_ACPI_STATUS(AE_NO_MEMORY); |
@@ -191,7 +191,7 @@ acpi_status acpi_find_root_pointer(acpi_size *table_address) | |||
191 | 191 | ||
192 | if (!table_ptr) { | 192 | if (!table_ptr) { |
193 | ACPI_ERROR((AE_INFO, | 193 | ACPI_ERROR((AE_INFO, |
194 | "Could not map memory at %8.8X for length %X", | 194 | "Could not map memory at 0x%8.8X for length %u", |
195 | ACPI_HI_RSDP_WINDOW_BASE, | 195 | ACPI_HI_RSDP_WINDOW_BASE, |
196 | ACPI_HI_RSDP_WINDOW_SIZE)); | 196 | ACPI_HI_RSDP_WINDOW_SIZE)); |
197 | 197 | ||
diff --git a/drivers/acpi/acpica/utalloc.c b/drivers/acpi/acpica/utalloc.c index 3d706b8fd449..8f0896281567 100644 --- a/drivers/acpi/acpica/utalloc.c +++ b/drivers/acpi/acpica/utalloc.c | |||
@@ -340,7 +340,7 @@ void *acpi_ut_allocate(acpi_size size, | |||
340 | /* Report allocation error */ | 340 | /* Report allocation error */ |
341 | 341 | ||
342 | ACPI_WARNING((module, line, | 342 | ACPI_WARNING((module, line, |
343 | "Could not allocate size %X", (u32) size)); | 343 | "Could not allocate size %u", (u32) size)); |
344 | 344 | ||
345 | return_PTR(NULL); | 345 | return_PTR(NULL); |
346 | } | 346 | } |
diff --git a/drivers/acpi/acpica/utcopy.c b/drivers/acpi/acpica/utcopy.c index 97ec3621e71d..6fef83f04bcd 100644 --- a/drivers/acpi/acpica/utcopy.c +++ b/drivers/acpi/acpica/utcopy.c | |||
@@ -677,16 +677,24 @@ acpi_ut_copy_simple_object(union acpi_operand_object *source_desc, | |||
677 | u16 reference_count; | 677 | u16 reference_count; |
678 | union acpi_operand_object *next_object; | 678 | union acpi_operand_object *next_object; |
679 | acpi_status status; | 679 | acpi_status status; |
680 | acpi_size copy_size; | ||
680 | 681 | ||
681 | /* Save fields from destination that we don't want to overwrite */ | 682 | /* Save fields from destination that we don't want to overwrite */ |
682 | 683 | ||
683 | reference_count = dest_desc->common.reference_count; | 684 | reference_count = dest_desc->common.reference_count; |
684 | next_object = dest_desc->common.next_object; | 685 | next_object = dest_desc->common.next_object; |
685 | 686 | ||
686 | /* Copy the entire source object over the destination object */ | 687 | /* |
688 | * Copy the entire source object over the destination object. | ||
689 | * Note: Source can be either an operand object or namespace node. | ||
690 | */ | ||
691 | copy_size = sizeof(union acpi_operand_object); | ||
692 | if (ACPI_GET_DESCRIPTOR_TYPE(source_desc) == ACPI_DESC_TYPE_NAMED) { | ||
693 | copy_size = sizeof(struct acpi_namespace_node); | ||
694 | } | ||
687 | 695 | ||
688 | ACPI_MEMCPY((char *)dest_desc, (char *)source_desc, | 696 | ACPI_MEMCPY(ACPI_CAST_PTR(char, dest_desc), |
689 | sizeof(union acpi_operand_object)); | 697 | ACPI_CAST_PTR(char, source_desc), copy_size); |
690 | 698 | ||
691 | /* Restore the saved fields */ | 699 | /* Restore the saved fields */ |
692 | 700 | ||
diff --git a/drivers/acpi/acpica/utdelete.c b/drivers/acpi/acpica/utdelete.c index 16b51c69606a..ed794cd033ea 100644 --- a/drivers/acpi/acpica/utdelete.c +++ b/drivers/acpi/acpica/utdelete.c | |||
@@ -434,7 +434,7 @@ acpi_ut_update_ref_count(union acpi_operand_object *object, u32 action) | |||
434 | 434 | ||
435 | default: | 435 | default: |
436 | 436 | ||
437 | ACPI_ERROR((AE_INFO, "Unknown action (%X)", action)); | 437 | ACPI_ERROR((AE_INFO, "Unknown action (0x%X)", action)); |
438 | break; | 438 | break; |
439 | } | 439 | } |
440 | 440 | ||
@@ -444,8 +444,8 @@ acpi_ut_update_ref_count(union acpi_operand_object *object, u32 action) | |||
444 | */ | 444 | */ |
445 | if (count > ACPI_MAX_REFERENCE_COUNT) { | 445 | if (count > ACPI_MAX_REFERENCE_COUNT) { |
446 | ACPI_WARNING((AE_INFO, | 446 | ACPI_WARNING((AE_INFO, |
447 | "Large Reference Count (%X) in object %p", count, | 447 | "Large Reference Count (0x%X) in object %p", |
448 | object)); | 448 | count, object)); |
449 | } | 449 | } |
450 | } | 450 | } |
451 | 451 | ||
diff --git a/drivers/acpi/acpica/uteval.c b/drivers/acpi/acpica/uteval.c index 7f5e734ce7f7..6dfdeb653490 100644 --- a/drivers/acpi/acpica/uteval.c +++ b/drivers/acpi/acpica/uteval.c | |||
@@ -307,7 +307,7 @@ acpi_ut_evaluate_object(struct acpi_namespace_node *prefix_node, | |||
307 | prefix_node, path, AE_TYPE); | 307 | prefix_node, path, AE_TYPE); |
308 | 308 | ||
309 | ACPI_ERROR((AE_INFO, | 309 | ACPI_ERROR((AE_INFO, |
310 | "Type returned from %s was incorrect: %s, expected Btypes: %X", | 310 | "Type returned from %s was incorrect: %s, expected Btypes: 0x%X", |
311 | path, | 311 | path, |
312 | acpi_ut_get_object_type_name(info->return_object), | 312 | acpi_ut_get_object_type_name(info->return_object), |
313 | expected_return_btypes)); | 313 | expected_return_btypes)); |
diff --git a/drivers/acpi/acpica/utglobal.c b/drivers/acpi/acpica/utglobal.c index eda3e656c4af..66116750a0f9 100644 --- a/drivers/acpi/acpica/utglobal.c +++ b/drivers/acpi/acpica/utglobal.c | |||
@@ -785,6 +785,7 @@ acpi_status acpi_ut_init_globals(void) | |||
785 | 785 | ||
786 | /* Miscellaneous variables */ | 786 | /* Miscellaneous variables */ |
787 | 787 | ||
788 | acpi_gbl_DSDT = NULL; | ||
788 | acpi_gbl_cm_single_step = FALSE; | 789 | acpi_gbl_cm_single_step = FALSE; |
789 | acpi_gbl_db_terminate_threads = FALSE; | 790 | acpi_gbl_db_terminate_threads = FALSE; |
790 | acpi_gbl_shutdown = FALSE; | 791 | acpi_gbl_shutdown = FALSE; |
diff --git a/drivers/acpi/acpica/utmisc.c b/drivers/acpi/acpica/utmisc.c index 32982e2ac384..e8d0724ee403 100644 --- a/drivers/acpi/acpica/utmisc.c +++ b/drivers/acpi/acpica/utmisc.c | |||
@@ -205,7 +205,7 @@ acpi_status acpi_ut_allocate_owner_id(acpi_owner_id * owner_id) | |||
205 | /* Guard against multiple allocations of ID to the same location */ | 205 | /* Guard against multiple allocations of ID to the same location */ |
206 | 206 | ||
207 | if (*owner_id) { | 207 | if (*owner_id) { |
208 | ACPI_ERROR((AE_INFO, "Owner ID [%2.2X] already exists", | 208 | ACPI_ERROR((AE_INFO, "Owner ID [0x%2.2X] already exists", |
209 | *owner_id)); | 209 | *owner_id)); |
210 | return_ACPI_STATUS(AE_ALREADY_EXISTS); | 210 | return_ACPI_STATUS(AE_ALREADY_EXISTS); |
211 | } | 211 | } |
@@ -315,7 +315,7 @@ void acpi_ut_release_owner_id(acpi_owner_id * owner_id_ptr) | |||
315 | /* Zero is not a valid owner_iD */ | 315 | /* Zero is not a valid owner_iD */ |
316 | 316 | ||
317 | if (owner_id == 0) { | 317 | if (owner_id == 0) { |
318 | ACPI_ERROR((AE_INFO, "Invalid OwnerId: %2.2X", owner_id)); | 318 | ACPI_ERROR((AE_INFO, "Invalid OwnerId: 0x%2.2X", owner_id)); |
319 | return_VOID; | 319 | return_VOID; |
320 | } | 320 | } |
321 | 321 | ||
@@ -341,7 +341,7 @@ void acpi_ut_release_owner_id(acpi_owner_id * owner_id_ptr) | |||
341 | acpi_gbl_owner_id_mask[index] ^= bit; | 341 | acpi_gbl_owner_id_mask[index] ^= bit; |
342 | } else { | 342 | } else { |
343 | ACPI_ERROR((AE_INFO, | 343 | ACPI_ERROR((AE_INFO, |
344 | "Release of non-allocated OwnerId: %2.2X", | 344 | "Release of non-allocated OwnerId: 0x%2.2X", |
345 | owner_id + 1)); | 345 | owner_id + 1)); |
346 | } | 346 | } |
347 | 347 | ||
diff --git a/drivers/acpi/acpica/utmutex.c b/drivers/acpi/acpica/utmutex.c index 55d014ed6d55..058b3df48271 100644 --- a/drivers/acpi/acpica/utmutex.c +++ b/drivers/acpi/acpica/utmutex.c | |||
@@ -258,7 +258,7 @@ acpi_status acpi_ut_acquire_mutex(acpi_mutex_handle mutex_id) | |||
258 | acpi_gbl_mutex_info[mutex_id].thread_id = this_thread_id; | 258 | acpi_gbl_mutex_info[mutex_id].thread_id = this_thread_id; |
259 | } else { | 259 | } else { |
260 | ACPI_EXCEPTION((AE_INFO, status, | 260 | ACPI_EXCEPTION((AE_INFO, status, |
261 | "Thread %p could not acquire Mutex [%X]", | 261 | "Thread %p could not acquire Mutex [0x%X]", |
262 | ACPI_CAST_PTR(void, this_thread_id), mutex_id)); | 262 | ACPI_CAST_PTR(void, this_thread_id), mutex_id)); |
263 | } | 263 | } |
264 | 264 | ||
@@ -297,7 +297,7 @@ acpi_status acpi_ut_release_mutex(acpi_mutex_handle mutex_id) | |||
297 | */ | 297 | */ |
298 | if (acpi_gbl_mutex_info[mutex_id].thread_id == ACPI_MUTEX_NOT_ACQUIRED) { | 298 | if (acpi_gbl_mutex_info[mutex_id].thread_id == ACPI_MUTEX_NOT_ACQUIRED) { |
299 | ACPI_ERROR((AE_INFO, | 299 | ACPI_ERROR((AE_INFO, |
300 | "Mutex [%X] is not acquired, cannot release", | 300 | "Mutex [0x%X] is not acquired, cannot release", |
301 | mutex_id)); | 301 | mutex_id)); |
302 | 302 | ||
303 | return (AE_NOT_ACQUIRED); | 303 | return (AE_NOT_ACQUIRED); |
diff --git a/drivers/acpi/acpica/utobject.c b/drivers/acpi/acpica/utobject.c index 3356f0cb0745..fd1fa2749ea5 100644 --- a/drivers/acpi/acpica/utobject.c +++ b/drivers/acpi/acpica/utobject.c | |||
@@ -251,7 +251,7 @@ union acpi_operand_object *acpi_ut_create_buffer_object(acpi_size buffer_size) | |||
251 | 251 | ||
252 | buffer = ACPI_ALLOCATE_ZEROED(buffer_size); | 252 | buffer = ACPI_ALLOCATE_ZEROED(buffer_size); |
253 | if (!buffer) { | 253 | if (!buffer) { |
254 | ACPI_ERROR((AE_INFO, "Could not allocate size %X", | 254 | ACPI_ERROR((AE_INFO, "Could not allocate size %u", |
255 | (u32) buffer_size)); | 255 | (u32) buffer_size)); |
256 | acpi_ut_remove_reference(buffer_desc); | 256 | acpi_ut_remove_reference(buffer_desc); |
257 | return_PTR(NULL); | 257 | return_PTR(NULL); |
@@ -303,7 +303,7 @@ union acpi_operand_object *acpi_ut_create_string_object(acpi_size string_size) | |||
303 | */ | 303 | */ |
304 | string = ACPI_ALLOCATE_ZEROED(string_size + 1); | 304 | string = ACPI_ALLOCATE_ZEROED(string_size + 1); |
305 | if (!string) { | 305 | if (!string) { |
306 | ACPI_ERROR((AE_INFO, "Could not allocate size %X", | 306 | ACPI_ERROR((AE_INFO, "Could not allocate size %u", |
307 | (u32) string_size)); | 307 | (u32) string_size)); |
308 | acpi_ut_remove_reference(string_desc); | 308 | acpi_ut_remove_reference(string_desc); |
309 | return_PTR(NULL); | 309 | return_PTR(NULL); |
@@ -533,7 +533,7 @@ acpi_ut_get_simple_object_size(union acpi_operand_object *internal_object, | |||
533 | */ | 533 | */ |
534 | ACPI_ERROR((AE_INFO, | 534 | ACPI_ERROR((AE_INFO, |
535 | "Cannot convert to external object - " | 535 | "Cannot convert to external object - " |
536 | "unsupported Reference Class [%s] %X in object %p", | 536 | "unsupported Reference Class [%s] 0x%X in object %p", |
537 | acpi_ut_get_reference_name(internal_object), | 537 | acpi_ut_get_reference_name(internal_object), |
538 | internal_object->reference.class, | 538 | internal_object->reference.class, |
539 | internal_object)); | 539 | internal_object)); |
@@ -545,7 +545,7 @@ acpi_ut_get_simple_object_size(union acpi_operand_object *internal_object, | |||
545 | default: | 545 | default: |
546 | 546 | ||
547 | ACPI_ERROR((AE_INFO, "Cannot convert to external object - " | 547 | ACPI_ERROR((AE_INFO, "Cannot convert to external object - " |
548 | "unsupported type [%s] %X in object %p", | 548 | "unsupported type [%s] 0x%X in object %p", |
549 | acpi_ut_get_object_type_name(internal_object), | 549 | acpi_ut_get_object_type_name(internal_object), |
550 | internal_object->common.type, internal_object)); | 550 | internal_object->common.type, internal_object)); |
551 | status = AE_TYPE; | 551 | status = AE_TYPE; |
diff --git a/drivers/acpi/bus.c b/drivers/acpi/bus.c index 743576bf1bd7..9042a8579668 100644 --- a/drivers/acpi/bus.c +++ b/drivers/acpi/bus.c | |||
@@ -69,6 +69,44 @@ static struct dmi_system_id __cpuinitdata power_nocheck_dmi_table[] = { | |||
69 | }; | 69 | }; |
70 | 70 | ||
71 | 71 | ||
72 | #ifdef CONFIG_X86 | ||
73 | static int set_copy_dsdt(const struct dmi_system_id *id) | ||
74 | { | ||
75 | printk(KERN_NOTICE "%s detected - " | ||
76 | "force copy of DSDT to local memory\n", id->ident); | ||
77 | acpi_gbl_copy_dsdt_locally = 1; | ||
78 | return 0; | ||
79 | } | ||
80 | |||
81 | static struct dmi_system_id dsdt_dmi_table[] __initdata = { | ||
82 | /* | ||
83 | * Insyde BIOS on some TOSHIBA machines corrupt the DSDT. | ||
84 | * https://bugzilla.kernel.org/show_bug.cgi?id=14679 | ||
85 | */ | ||
86 | { | ||
87 | .callback = set_copy_dsdt, | ||
88 | .ident = "TOSHIBA Satellite A505", | ||
89 | .matches = { | ||
90 | DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), | ||
91 | DMI_MATCH(DMI_PRODUCT_NAME, "Satellite A505"), | ||
92 | }, | ||
93 | }, | ||
94 | { | ||
95 | .callback = set_copy_dsdt, | ||
96 | .ident = "TOSHIBA Satellite L505D", | ||
97 | .matches = { | ||
98 | DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), | ||
99 | DMI_MATCH(DMI_PRODUCT_NAME, "Satellite L505D"), | ||
100 | }, | ||
101 | }, | ||
102 | {} | ||
103 | }; | ||
104 | #else | ||
105 | static struct dmi_system_id dsdt_dmi_table[] __initdata = { | ||
106 | {} | ||
107 | }; | ||
108 | #endif | ||
109 | |||
72 | /* -------------------------------------------------------------------------- | 110 | /* -------------------------------------------------------------------------- |
73 | Device Management | 111 | Device Management |
74 | -------------------------------------------------------------------------- */ | 112 | -------------------------------------------------------------------------- */ |
@@ -813,6 +851,12 @@ void __init acpi_early_init(void) | |||
813 | 851 | ||
814 | acpi_gbl_permanent_mmap = 1; | 852 | acpi_gbl_permanent_mmap = 1; |
815 | 853 | ||
854 | /* | ||
855 | * If the machine falls into the DMI check table, | ||
856 | * DSDT will be copied to memory | ||
857 | */ | ||
858 | dmi_check_system(dsdt_dmi_table); | ||
859 | |||
816 | status = acpi_reallocate_root_table(); | 860 | status = acpi_reallocate_root_table(); |
817 | if (ACPI_FAILURE(status)) { | 861 | if (ACPI_FAILURE(status)) { |
818 | printk(KERN_ERR PREFIX | 862 | printk(KERN_ERR PREFIX |
diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c index 0338f513a010..7f2e051ed4f1 100644 --- a/drivers/acpi/scan.c +++ b/drivers/acpi/scan.c | |||
@@ -765,7 +765,7 @@ static void acpi_bus_set_run_wake_flags(struct acpi_device *device) | |||
765 | } | 765 | } |
766 | 766 | ||
767 | status = acpi_get_gpe_status(NULL, device->wakeup.gpe_number, | 767 | status = acpi_get_gpe_status(NULL, device->wakeup.gpe_number, |
768 | ACPI_NOT_ISR, &event_status); | 768 | &event_status); |
769 | if (status == AE_OK) | 769 | if (status == AE_OK) |
770 | device->wakeup.flags.run_wake = | 770 | device->wakeup.flags.run_wake = |
771 | !!(event_status & ACPI_EVENT_FLAG_HANDLE); | 771 | !!(event_status & ACPI_EVENT_FLAG_HANDLE); |
diff --git a/drivers/acpi/system.c b/drivers/acpi/system.c index 4aaf24976138..e35525b39f6b 100644 --- a/drivers/acpi/system.c +++ b/drivers/acpi/system.c | |||
@@ -303,8 +303,7 @@ static int get_status(u32 index, acpi_event_status *status, acpi_handle *handle) | |||
303 | "Invalid GPE 0x%x\n", index)); | 303 | "Invalid GPE 0x%x\n", index)); |
304 | goto end; | 304 | goto end; |
305 | } | 305 | } |
306 | result = acpi_get_gpe_status(*handle, index, | 306 | result = acpi_get_gpe_status(*handle, index, status); |
307 | ACPI_NOT_ISR, status); | ||
308 | } else if (index < (num_gpes + ACPI_NUM_FIXED_EVENTS)) | 307 | } else if (index < (num_gpes + ACPI_NUM_FIXED_EVENTS)) |
309 | result = acpi_get_event_status(index - num_gpes, status); | 308 | result = acpi_get_event_status(index - num_gpes, status); |
310 | 309 | ||
@@ -395,7 +394,7 @@ static ssize_t counter_set(struct kobject *kobj, | |||
395 | result = acpi_set_gpe(handle, index, ACPI_GPE_ENABLE); | 394 | result = acpi_set_gpe(handle, index, ACPI_GPE_ENABLE); |
396 | else if (!strcmp(buf, "clear\n") && | 395 | else if (!strcmp(buf, "clear\n") && |
397 | (status & ACPI_EVENT_FLAG_SET)) | 396 | (status & ACPI_EVENT_FLAG_SET)) |
398 | result = acpi_clear_gpe(handle, index, ACPI_NOT_ISR); | 397 | result = acpi_clear_gpe(handle, index); |
399 | else | 398 | else |
400 | all_counters[index].count = strtoul(buf, NULL, 0); | 399 | all_counters[index].count = strtoul(buf, NULL, 0); |
401 | } else if (index < num_gpes + ACPI_NUM_FIXED_EVENTS) { | 400 | } else if (index < num_gpes + ACPI_NUM_FIXED_EVENTS) { |
diff --git a/include/acpi/acexcep.h b/include/acpi/acexcep.h index 5b2e5e80ecb0..5958d7845bd5 100644 --- a/include/acpi/acexcep.h +++ b/include/acpi/acexcep.h | |||
@@ -87,7 +87,7 @@ | |||
87 | #define AE_NO_GLOBAL_LOCK (acpi_status) (0x0017 | AE_CODE_ENVIRONMENTAL) | 87 | #define AE_NO_GLOBAL_LOCK (acpi_status) (0x0017 | AE_CODE_ENVIRONMENTAL) |
88 | #define AE_ABORT_METHOD (acpi_status) (0x0018 | AE_CODE_ENVIRONMENTAL) | 88 | #define AE_ABORT_METHOD (acpi_status) (0x0018 | AE_CODE_ENVIRONMENTAL) |
89 | #define AE_SAME_HANDLER (acpi_status) (0x0019 | AE_CODE_ENVIRONMENTAL) | 89 | #define AE_SAME_HANDLER (acpi_status) (0x0019 | AE_CODE_ENVIRONMENTAL) |
90 | #define AE_WAKE_ONLY_GPE (acpi_status) (0x001A | AE_CODE_ENVIRONMENTAL) | 90 | #define AE_NO_HANDLER (acpi_status) (0x001A | AE_CODE_ENVIRONMENTAL) |
91 | #define AE_OWNER_ID_LIMIT (acpi_status) (0x001B | AE_CODE_ENVIRONMENTAL) | 91 | #define AE_OWNER_ID_LIMIT (acpi_status) (0x001B | AE_CODE_ENVIRONMENTAL) |
92 | 92 | ||
93 | #define AE_CODE_ENV_MAX 0x001B | 93 | #define AE_CODE_ENV_MAX 0x001B |
diff --git a/include/acpi/acoutput.h b/include/acpi/acoutput.h index d7726685797e..5e952262d6ee 100644 --- a/include/acpi/acoutput.h +++ b/include/acpi/acoutput.h | |||
@@ -206,6 +206,7 @@ | |||
206 | #define ACPI_WARNING(plist) acpi_warning plist | 206 | #define ACPI_WARNING(plist) acpi_warning plist |
207 | #define ACPI_EXCEPTION(plist) acpi_exception plist | 207 | #define ACPI_EXCEPTION(plist) acpi_exception plist |
208 | #define ACPI_ERROR(plist) acpi_error plist | 208 | #define ACPI_ERROR(plist) acpi_error plist |
209 | #define ACPI_DEBUG_OBJECT(obj,l,i) acpi_ex_do_debug_object(obj,l,i) | ||
209 | 210 | ||
210 | #else | 211 | #else |
211 | 212 | ||
@@ -215,6 +216,7 @@ | |||
215 | #define ACPI_WARNING(plist) | 216 | #define ACPI_WARNING(plist) |
216 | #define ACPI_EXCEPTION(plist) | 217 | #define ACPI_EXCEPTION(plist) |
217 | #define ACPI_ERROR(plist) | 218 | #define ACPI_ERROR(plist) |
219 | #define ACPI_DEBUG_OBJECT(obj,l,i) | ||
218 | 220 | ||
219 | #endif /* ACPI_NO_ERROR_MESSAGES */ | 221 | #endif /* ACPI_NO_ERROR_MESSAGES */ |
220 | 222 | ||
diff --git a/include/acpi/acpiosxf.h b/include/acpi/acpiosxf.h index b396854b83b0..29bf945143e8 100644 --- a/include/acpi/acpiosxf.h +++ b/include/acpi/acpiosxf.h | |||
@@ -233,8 +233,8 @@ acpi_os_write_pci_configuration(struct acpi_pci_id *pci_id, | |||
233 | * Interim function needed for PCI IRQ routing | 233 | * Interim function needed for PCI IRQ routing |
234 | */ | 234 | */ |
235 | void | 235 | void |
236 | acpi_os_derive_pci_id(acpi_handle rhandle, | 236 | acpi_os_derive_pci_id(acpi_handle device, |
237 | acpi_handle chandle, struct acpi_pci_id **pci_id); | 237 | acpi_handle region, struct acpi_pci_id **pci_id); |
238 | 238 | ||
239 | /* | 239 | /* |
240 | * Miscellaneous | 240 | * Miscellaneous |
diff --git a/include/acpi/acpixf.h b/include/acpi/acpixf.h index 4447a0461bae..0e4ab1fe5966 100644 --- a/include/acpi/acpixf.h +++ b/include/acpi/acpixf.h | |||
@@ -47,7 +47,7 @@ | |||
47 | 47 | ||
48 | /* Current ACPICA subsystem version in YYYYMMDD format */ | 48 | /* Current ACPICA subsystem version in YYYYMMDD format */ |
49 | 49 | ||
50 | #define ACPI_CA_VERSION 0x20100121 | 50 | #define ACPI_CA_VERSION 0x20100428 |
51 | 51 | ||
52 | #include "actypes.h" | 52 | #include "actypes.h" |
53 | #include "actbl.h" | 53 | #include "actbl.h" |
@@ -67,6 +67,8 @@ extern u8 acpi_gbl_leave_wake_gpes_disabled; | |||
67 | extern u8 acpi_gbl_use_default_register_widths; | 67 | extern u8 acpi_gbl_use_default_register_widths; |
68 | extern acpi_name acpi_gbl_trace_method_name; | 68 | extern acpi_name acpi_gbl_trace_method_name; |
69 | extern u32 acpi_gbl_trace_flags; | 69 | extern u32 acpi_gbl_trace_flags; |
70 | extern u8 acpi_gbl_enable_aml_debug_object; | ||
71 | extern u8 acpi_gbl_copy_dsdt_locally; | ||
70 | 72 | ||
71 | extern u32 acpi_current_gpe_count; | 73 | extern u32 acpi_current_gpe_count; |
72 | extern struct acpi_table_fadt acpi_gbl_FADT; | 74 | extern struct acpi_table_fadt acpi_gbl_FADT; |
@@ -164,7 +166,7 @@ acpi_get_devices(const char *HID, | |||
164 | void *context, void **return_value); | 166 | void *context, void **return_value); |
165 | 167 | ||
166 | acpi_status | 168 | acpi_status |
167 | acpi_get_name(acpi_handle handle, | 169 | acpi_get_name(acpi_handle object, |
168 | u32 name_type, struct acpi_buffer *ret_path_ptr); | 170 | u32 name_type, struct acpi_buffer *ret_path_ptr); |
169 | 171 | ||
170 | acpi_status | 172 | acpi_status |
@@ -172,14 +174,12 @@ acpi_get_handle(acpi_handle parent, | |||
172 | acpi_string pathname, acpi_handle * ret_handle); | 174 | acpi_string pathname, acpi_handle * ret_handle); |
173 | 175 | ||
174 | acpi_status | 176 | acpi_status |
175 | acpi_attach_data(acpi_handle obj_handle, | 177 | acpi_attach_data(acpi_handle object, acpi_object_handler handler, void *data); |
176 | acpi_object_handler handler, void *data); | ||
177 | 178 | ||
178 | acpi_status | 179 | acpi_status acpi_detach_data(acpi_handle object, acpi_object_handler handler); |
179 | acpi_detach_data(acpi_handle obj_handle, acpi_object_handler handler); | ||
180 | 180 | ||
181 | acpi_status | 181 | acpi_status |
182 | acpi_get_data(acpi_handle obj_handle, acpi_object_handler handler, void **data); | 182 | acpi_get_data(acpi_handle object, acpi_object_handler handler, void **data); |
183 | 183 | ||
184 | acpi_status | 184 | acpi_status |
185 | acpi_debug_trace(char *name, u32 debug_level, u32 debug_layer, u32 flags); | 185 | acpi_debug_trace(char *name, u32 debug_level, u32 debug_layer, u32 flags); |
@@ -201,7 +201,7 @@ acpi_evaluate_object_typed(acpi_handle object, | |||
201 | acpi_object_type return_type); | 201 | acpi_object_type return_type); |
202 | 202 | ||
203 | acpi_status | 203 | acpi_status |
204 | acpi_get_object_info(acpi_handle handle, | 204 | acpi_get_object_info(acpi_handle object, |
205 | struct acpi_device_info **return_buffer); | 205 | struct acpi_device_info **return_buffer); |
206 | 206 | ||
207 | acpi_status acpi_install_method(u8 *buffer); | 207 | acpi_status acpi_install_method(u8 *buffer); |
@@ -283,16 +283,17 @@ acpi_status acpi_get_event_status(u32 event, acpi_event_status * event_status); | |||
283 | */ | 283 | */ |
284 | acpi_status acpi_set_gpe(acpi_handle gpe_device, u32 gpe_number, u8 action); | 284 | acpi_status acpi_set_gpe(acpi_handle gpe_device, u32 gpe_number, u8 action); |
285 | 285 | ||
286 | acpi_status acpi_enable_gpe(acpi_handle gpe_device, u32 gpe_number, u8 type); | 286 | acpi_status |
287 | acpi_enable_gpe(acpi_handle gpe_device, u32 gpe_number, u8 gpe_type); | ||
287 | 288 | ||
288 | acpi_status acpi_disable_gpe(acpi_handle gpe_device, u32 gpe_number, u8 type); | 289 | acpi_status |
290 | acpi_disable_gpe(acpi_handle gpe_device, u32 gpe_number, u8 gpe_type); | ||
289 | 291 | ||
290 | acpi_status acpi_clear_gpe(acpi_handle gpe_device, u32 gpe_number, u32 flags); | 292 | acpi_status acpi_clear_gpe(acpi_handle gpe_device, u32 gpe_number); |
291 | 293 | ||
292 | acpi_status | 294 | acpi_status |
293 | acpi_get_gpe_status(acpi_handle gpe_device, | 295 | acpi_get_gpe_status(acpi_handle gpe_device, |
294 | u32 gpe_number, | 296 | u32 gpe_number, acpi_event_status *event_status); |
295 | u32 flags, acpi_event_status * event_status); | ||
296 | 297 | ||
297 | acpi_status acpi_disable_all_gpes(void); | 298 | acpi_status acpi_disable_all_gpes(void); |
298 | 299 | ||
@@ -315,33 +316,29 @@ acpi_status(*acpi_walk_resource_callback) (struct acpi_resource * resource, | |||
315 | void *context); | 316 | void *context); |
316 | 317 | ||
317 | acpi_status | 318 | acpi_status |
318 | acpi_get_vendor_resource(acpi_handle device_handle, | 319 | acpi_get_vendor_resource(acpi_handle device, |
319 | char *name, | 320 | char *name, |
320 | struct acpi_vendor_uuid *uuid, | 321 | struct acpi_vendor_uuid *uuid, |
321 | struct acpi_buffer *ret_buffer); | 322 | struct acpi_buffer *ret_buffer); |
322 | 323 | ||
323 | acpi_status | 324 | acpi_status |
324 | acpi_get_current_resources(acpi_handle device_handle, | 325 | acpi_get_current_resources(acpi_handle device, struct acpi_buffer *ret_buffer); |
325 | struct acpi_buffer *ret_buffer); | ||
326 | 326 | ||
327 | #ifdef ACPI_FUTURE_USAGE | 327 | #ifdef ACPI_FUTURE_USAGE |
328 | acpi_status | 328 | acpi_status |
329 | acpi_get_possible_resources(acpi_handle device_handle, | 329 | acpi_get_possible_resources(acpi_handle device, struct acpi_buffer *ret_buffer); |
330 | struct acpi_buffer *ret_buffer); | ||
331 | #endif | 330 | #endif |
332 | 331 | ||
333 | acpi_status | 332 | acpi_status |
334 | acpi_walk_resources(acpi_handle device_handle, | 333 | acpi_walk_resources(acpi_handle device, |
335 | char *name, | 334 | char *name, |
336 | acpi_walk_resource_callback user_function, void *context); | 335 | acpi_walk_resource_callback user_function, void *context); |
337 | 336 | ||
338 | acpi_status | 337 | acpi_status |
339 | acpi_set_current_resources(acpi_handle device_handle, | 338 | acpi_set_current_resources(acpi_handle device, struct acpi_buffer *in_buffer); |
340 | struct acpi_buffer *in_buffer); | ||
341 | 339 | ||
342 | acpi_status | 340 | acpi_status |
343 | acpi_get_irq_routing_table(acpi_handle bus_device_handle, | 341 | acpi_get_irq_routing_table(acpi_handle device, struct acpi_buffer *ret_buffer); |
344 | struct acpi_buffer *ret_buffer); | ||
345 | 342 | ||
346 | acpi_status | 343 | acpi_status |
347 | acpi_resource_to_address64(struct acpi_resource *resource, | 344 | acpi_resource_to_address64(struct acpi_resource *resource, |
diff --git a/include/acpi/actbl2.h b/include/acpi/actbl2.h index 5b02e307bff3..95f4d0ef4819 100644 --- a/include/acpi/actbl2.h +++ b/include/acpi/actbl2.h | |||
@@ -69,6 +69,7 @@ | |||
69 | #define ACPI_SIG_IBFT "IBFT" /* i_sCSI Boot Firmware Table */ | 69 | #define ACPI_SIG_IBFT "IBFT" /* i_sCSI Boot Firmware Table */ |
70 | #define ACPI_SIG_IVRS "IVRS" /* I/O Virtualization Reporting Structure */ | 70 | #define ACPI_SIG_IVRS "IVRS" /* I/O Virtualization Reporting Structure */ |
71 | #define ACPI_SIG_MCFG "MCFG" /* PCI Memory Mapped Configuration table */ | 71 | #define ACPI_SIG_MCFG "MCFG" /* PCI Memory Mapped Configuration table */ |
72 | #define ACPI_SIG_MCHI "MCHI" /* Management Controller Host Interface table */ | ||
72 | #define ACPI_SIG_SLIC "SLIC" /* Software Licensing Description Table */ | 73 | #define ACPI_SIG_SLIC "SLIC" /* Software Licensing Description Table */ |
73 | #define ACPI_SIG_SPCR "SPCR" /* Serial Port Console Redirection table */ | 74 | #define ACPI_SIG_SPCR "SPCR" /* Serial Port Console Redirection table */ |
74 | #define ACPI_SIG_SPMI "SPMI" /* Server Platform Management Interface table */ | 75 | #define ACPI_SIG_SPMI "SPMI" /* Server Platform Management Interface table */ |
@@ -679,6 +680,32 @@ struct acpi_mcfg_allocation { | |||
679 | 680 | ||
680 | /******************************************************************************* | 681 | /******************************************************************************* |
681 | * | 682 | * |
683 | * MCHI - Management Controller Host Interface Table | ||
684 | * Version 1 | ||
685 | * | ||
686 | * Conforms to "Management Component Transport Protocol (MCTP) Host | ||
687 | * Interface Specification", Revision 1.0.0a, October 13, 2009 | ||
688 | * | ||
689 | ******************************************************************************/ | ||
690 | |||
691 | struct acpi_table_mchi { | ||
692 | struct acpi_table_header header; /* Common ACPI table header */ | ||
693 | u8 interface_type; | ||
694 | u8 protocol; | ||
695 | u64 protocol_data; | ||
696 | u8 interrupt_type; | ||
697 | u8 gpe; | ||
698 | u8 pci_device_flag; | ||
699 | u32 global_interrupt; | ||
700 | struct acpi_generic_address control_register; | ||
701 | u8 pci_segment; | ||
702 | u8 pci_bus; | ||
703 | u8 pci_device; | ||
704 | u8 pci_function; | ||
705 | }; | ||
706 | |||
707 | /******************************************************************************* | ||
708 | * | ||
682 | * SPCR - Serial Port Console Redirection table | 709 | * SPCR - Serial Port Console Redirection table |
683 | * Version 1 | 710 | * Version 1 |
684 | * | 711 | * |
diff --git a/include/acpi/actypes.h b/include/acpi/actypes.h index 3f08e64962f8..bade172cad47 100644 --- a/include/acpi/actypes.h +++ b/include/acpi/actypes.h | |||
@@ -663,44 +663,42 @@ typedef u32 acpi_event_status; | |||
663 | #define ACPI_GPE_MAX 0xFF | 663 | #define ACPI_GPE_MAX 0xFF |
664 | #define ACPI_NUM_GPE 256 | 664 | #define ACPI_NUM_GPE 256 |
665 | 665 | ||
666 | /* Actions for acpi_set_gpe */ | ||
667 | |||
666 | #define ACPI_GPE_ENABLE 0 | 668 | #define ACPI_GPE_ENABLE 0 |
667 | #define ACPI_GPE_DISABLE 1 | 669 | #define ACPI_GPE_DISABLE 1 |
668 | 670 | ||
671 | /* gpe_types for acpi_enable_gpe and acpi_disable_gpe */ | ||
672 | |||
673 | #define ACPI_GPE_TYPE_WAKE (u8) 0x01 | ||
674 | #define ACPI_GPE_TYPE_RUNTIME (u8) 0x02 | ||
675 | #define ACPI_GPE_TYPE_WAKE_RUN (u8) 0x03 | ||
676 | |||
669 | /* | 677 | /* |
670 | * GPE info flags - Per GPE | 678 | * GPE info flags - Per GPE |
671 | * +-+-+-+---+-+-+-+ | 679 | * +-------+---+-+-+ |
672 | * |7|6|5|4:3|2|1|0| | 680 | * | 7:4 |3:2|1|0| |
673 | * +-+-+-+---+-+-+-+ | 681 | * +-------+---+-+-+ |
674 | * | | | | | | | | 682 | * | | | | |
675 | * | | | | | | +--- Interrupt type: Edge or Level Triggered | 683 | * | | | +--- Interrupt type: edge or level triggered |
676 | * | | | | | +--- GPE can wake the system | 684 | * | | +----- GPE can wake the system |
677 | * | | | | +--- Unused | 685 | * | +-------- Type of dispatch:to method, handler, or none |
678 | * | | | +--- Type of dispatch -- to method, handler, or none | 686 | * +-------------- <Reserved> |
679 | * | | +--- Unused | ||
680 | * | +--- Unused | ||
681 | * +--- Unused | ||
682 | */ | 687 | */ |
683 | #define ACPI_GPE_XRUPT_TYPE_MASK (u8) 0x01 | 688 | #define ACPI_GPE_XRUPT_TYPE_MASK (u8) 0x01 |
684 | #define ACPI_GPE_LEVEL_TRIGGERED (u8) 0x01 | 689 | #define ACPI_GPE_LEVEL_TRIGGERED (u8) 0x01 |
685 | #define ACPI_GPE_EDGE_TRIGGERED (u8) 0x00 | 690 | #define ACPI_GPE_EDGE_TRIGGERED (u8) 0x00 |
686 | 691 | ||
687 | #define ACPI_GPE_TYPE_MASK (u8) 0x06 | ||
688 | #define ACPI_GPE_TYPE_WAKE_RUN (u8) 0x06 | ||
689 | #define ACPI_GPE_TYPE_WAKE (u8) 0x02 | ||
690 | #define ACPI_GPE_TYPE_RUNTIME (u8) 0x04 /* Default */ | ||
691 | #define ACPI_GPE_CAN_WAKE (u8) 0x02 | 692 | #define ACPI_GPE_CAN_WAKE (u8) 0x02 |
692 | 693 | ||
693 | #define ACPI_GPE_DISPATCH_MASK (u8) 0x18 | 694 | #define ACPI_GPE_DISPATCH_MASK (u8) 0x0C |
694 | #define ACPI_GPE_DISPATCH_HANDLER (u8) 0x08 | 695 | #define ACPI_GPE_DISPATCH_HANDLER (u8) 0x04 |
695 | #define ACPI_GPE_DISPATCH_METHOD (u8) 0x10 | 696 | #define ACPI_GPE_DISPATCH_METHOD (u8) 0x08 |
696 | #define ACPI_GPE_DISPATCH_NOT_USED (u8) 0x00 /* Default */ | 697 | #define ACPI_GPE_DISPATCH_NOT_USED (u8) 0x00 |
697 | 698 | ||
698 | /* | 699 | /* |
699 | * Flags for GPE and Lock interfaces | 700 | * Flags for GPE and Lock interfaces |
700 | */ | 701 | */ |
701 | #define ACPI_EVENT_WAKE_ENABLE 0x2 /* acpi_gpe_enable */ | ||
702 | #define ACPI_EVENT_WAKE_DISABLE 0x2 /* acpi_gpe_disable */ | ||
703 | |||
704 | #define ACPI_NOT_ISR 0x1 | 702 | #define ACPI_NOT_ISR 0x1 |
705 | #define ACPI_ISR 0x0 | 703 | #define ACPI_ISR 0x0 |
706 | 704 | ||
@@ -953,7 +951,7 @@ acpi_status(*acpi_adr_space_setup) (acpi_handle region_handle, | |||
953 | #define ACPI_REGION_DEACTIVATE 1 | 951 | #define ACPI_REGION_DEACTIVATE 1 |
954 | 952 | ||
955 | typedef | 953 | typedef |
956 | acpi_status(*acpi_walk_callback) (acpi_handle obj_handle, | 954 | acpi_status(*acpi_walk_callback) (acpi_handle object, |
957 | u32 nesting_level, | 955 | u32 nesting_level, |
958 | void *context, void **return_value); | 956 | void *context, void **return_value); |
959 | 957 | ||