diff options
Diffstat (limited to 'drivers/acpi/dispatcher')
-rw-r--r-- | drivers/acpi/dispatcher/dsfield.c | 32 | ||||
-rw-r--r-- | drivers/acpi/dispatcher/dsinit.c | 25 | ||||
-rw-r--r-- | drivers/acpi/dispatcher/dsmethod.c | 55 | ||||
-rw-r--r-- | drivers/acpi/dispatcher/dsmthdat.c | 2 | ||||
-rw-r--r-- | drivers/acpi/dispatcher/dsobject.c | 78 | ||||
-rw-r--r-- | drivers/acpi/dispatcher/dsopcode.c | 6 | ||||
-rw-r--r-- | drivers/acpi/dispatcher/dsutils.c | 2 | ||||
-rw-r--r-- | drivers/acpi/dispatcher/dswexec.c | 12 | ||||
-rw-r--r-- | drivers/acpi/dispatcher/dswload.c | 19 | ||||
-rw-r--r-- | drivers/acpi/dispatcher/dswscope.c | 2 | ||||
-rw-r--r-- | drivers/acpi/dispatcher/dswstate.c | 2 |
11 files changed, 127 insertions, 108 deletions
diff --git a/drivers/acpi/dispatcher/dsfield.c b/drivers/acpi/dispatcher/dsfield.c index a6d77efb41a0..f049639bac35 100644 --- a/drivers/acpi/dispatcher/dsfield.c +++ b/drivers/acpi/dispatcher/dsfield.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2006, R. Byron Moore | 8 | * Copyright (C) 2000 - 2007, R. Byron Moore |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
@@ -133,7 +133,8 @@ acpi_ds_create_buffer_field(union acpi_parse_object *op, | |||
133 | } | 133 | } |
134 | } | 134 | } |
135 | 135 | ||
136 | /* We could put the returned object (Node) on the object stack for later, | 136 | /* |
137 | * We could put the returned object (Node) on the object stack for later, | ||
137 | * but for now, we will put it in the "op" object that the parser uses, | 138 | * but for now, we will put it in the "op" object that the parser uses, |
138 | * so we can get it again at the end of this scope | 139 | * so we can get it again at the end of this scope |
139 | */ | 140 | */ |
@@ -514,8 +515,33 @@ acpi_ds_create_bank_field(union acpi_parse_object *op, | |||
514 | 515 | ||
515 | /* Third arg is the bank_value */ | 516 | /* Third arg is the bank_value */ |
516 | 517 | ||
518 | /* TBD: This arg is a term_arg, not a constant, and must be evaluated */ | ||
519 | |||
517 | arg = arg->common.next; | 520 | arg = arg->common.next; |
518 | info.bank_value = (u32) arg->common.value.integer; | 521 | |
522 | /* Currently, only the following constants are supported */ | ||
523 | |||
524 | switch (arg->common.aml_opcode) { | ||
525 | case AML_ZERO_OP: | ||
526 | info.bank_value = 0; | ||
527 | break; | ||
528 | |||
529 | case AML_ONE_OP: | ||
530 | info.bank_value = 1; | ||
531 | break; | ||
532 | |||
533 | case AML_BYTE_OP: | ||
534 | case AML_WORD_OP: | ||
535 | case AML_DWORD_OP: | ||
536 | case AML_QWORD_OP: | ||
537 | info.bank_value = (u32) arg->common.value.integer; | ||
538 | break; | ||
539 | |||
540 | default: | ||
541 | info.bank_value = 0; | ||
542 | ACPI_ERROR((AE_INFO, | ||
543 | "Non-constant BankValue for BankField is not implemented")); | ||
544 | } | ||
519 | 545 | ||
520 | /* Fourth arg is the field flags */ | 546 | /* Fourth arg is the field flags */ |
521 | 547 | ||
diff --git a/drivers/acpi/dispatcher/dsinit.c b/drivers/acpi/dispatcher/dsinit.c index 1888c055d10f..af923c388520 100644 --- a/drivers/acpi/dispatcher/dsinit.c +++ b/drivers/acpi/dispatcher/dsinit.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2006, R. Byron Moore | 8 | * Copyright (C) 2000 - 2007, R. Byron Moore |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
@@ -44,6 +44,7 @@ | |||
44 | #include <acpi/acpi.h> | 44 | #include <acpi/acpi.h> |
45 | #include <acpi/acdispat.h> | 45 | #include <acpi/acdispat.h> |
46 | #include <acpi/acnamesp.h> | 46 | #include <acpi/acnamesp.h> |
47 | #include <acpi/actables.h> | ||
47 | 48 | ||
48 | #define _COMPONENT ACPI_DISPATCHER | 49 | #define _COMPONENT ACPI_DISPATCHER |
49 | ACPI_MODULE_NAME("dsinit") | 50 | ACPI_MODULE_NAME("dsinit") |
@@ -90,7 +91,7 @@ acpi_ds_init_one_object(acpi_handle obj_handle, | |||
90 | * We are only interested in NS nodes owned by the table that | 91 | * We are only interested in NS nodes owned by the table that |
91 | * was just loaded | 92 | * was just loaded |
92 | */ | 93 | */ |
93 | if (node->owner_id != info->table_desc->owner_id) { | 94 | if (node->owner_id != info->owner_id) { |
94 | return (AE_OK); | 95 | return (AE_OK); |
95 | } | 96 | } |
96 | 97 | ||
@@ -150,14 +151,21 @@ acpi_ds_init_one_object(acpi_handle obj_handle, | |||
150 | ******************************************************************************/ | 151 | ******************************************************************************/ |
151 | 152 | ||
152 | acpi_status | 153 | acpi_status |
153 | acpi_ds_initialize_objects(struct acpi_table_desc * table_desc, | 154 | acpi_ds_initialize_objects(acpi_native_uint table_index, |
154 | struct acpi_namespace_node * start_node) | 155 | struct acpi_namespace_node * start_node) |
155 | { | 156 | { |
156 | acpi_status status; | 157 | acpi_status status; |
157 | struct acpi_init_walk_info info; | 158 | struct acpi_init_walk_info info; |
159 | struct acpi_table_header *table; | ||
160 | acpi_owner_id owner_id; | ||
158 | 161 | ||
159 | ACPI_FUNCTION_TRACE(ds_initialize_objects); | 162 | ACPI_FUNCTION_TRACE(ds_initialize_objects); |
160 | 163 | ||
164 | status = acpi_tb_get_owner_id(table_index, &owner_id); | ||
165 | if (ACPI_FAILURE(status)) { | ||
166 | return_ACPI_STATUS(status); | ||
167 | } | ||
168 | |||
161 | ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, | 169 | ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, |
162 | "**** Starting initialization of namespace objects ****\n")); | 170 | "**** Starting initialization of namespace objects ****\n")); |
163 | ACPI_DEBUG_PRINT_RAW((ACPI_DB_INIT, "Parsing all Control Methods:")); | 171 | ACPI_DEBUG_PRINT_RAW((ACPI_DB_INIT, "Parsing all Control Methods:")); |
@@ -166,7 +174,8 @@ acpi_ds_initialize_objects(struct acpi_table_desc * table_desc, | |||
166 | info.op_region_count = 0; | 174 | info.op_region_count = 0; |
167 | info.object_count = 0; | 175 | info.object_count = 0; |
168 | info.device_count = 0; | 176 | info.device_count = 0; |
169 | info.table_desc = table_desc; | 177 | info.table_index = table_index; |
178 | info.owner_id = owner_id; | ||
170 | 179 | ||
171 | /* Walk entire namespace from the supplied root */ | 180 | /* Walk entire namespace from the supplied root */ |
172 | 181 | ||
@@ -176,10 +185,14 @@ acpi_ds_initialize_objects(struct acpi_table_desc * table_desc, | |||
176 | ACPI_EXCEPTION((AE_INFO, status, "During WalkNamespace")); | 185 | ACPI_EXCEPTION((AE_INFO, status, "During WalkNamespace")); |
177 | } | 186 | } |
178 | 187 | ||
188 | status = acpi_get_table_by_index(table_index, &table); | ||
189 | if (ACPI_FAILURE(status)) { | ||
190 | return_ACPI_STATUS(status); | ||
191 | } | ||
192 | |||
179 | ACPI_DEBUG_PRINT_RAW((ACPI_DB_INIT, | 193 | ACPI_DEBUG_PRINT_RAW((ACPI_DB_INIT, |
180 | "\nTable [%4.4s](id %4.4X) - %hd Objects with %hd Devices %hd Methods %hd Regions\n", | 194 | "\nTable [%4.4s](id %4.4X) - %hd Objects with %hd Devices %hd Methods %hd Regions\n", |
181 | table_desc->pointer->signature, | 195 | table->signature, owner_id, info.object_count, |
182 | table_desc->owner_id, info.object_count, | ||
183 | info.device_count, info.method_count, | 196 | info.device_count, info.method_count, |
184 | info.op_region_count)); | 197 | info.op_region_count)); |
185 | 198 | ||
diff --git a/drivers/acpi/dispatcher/dsmethod.c b/drivers/acpi/dispatcher/dsmethod.c index cf888add3191..1cbe61905824 100644 --- a/drivers/acpi/dispatcher/dsmethod.c +++ b/drivers/acpi/dispatcher/dsmethod.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2006, R. Byron Moore | 8 | * Copyright (C) 2000 - 2007, R. Byron Moore |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
@@ -327,7 +327,7 @@ acpi_ds_call_control_method(struct acpi_thread_state *thread, | |||
327 | ACPI_FUNCTION_TRACE_PTR(ds_call_control_method, this_walk_state); | 327 | ACPI_FUNCTION_TRACE_PTR(ds_call_control_method, this_walk_state); |
328 | 328 | ||
329 | ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, | 329 | ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, |
330 | "Execute method %p, currentstate=%p\n", | 330 | "Calling method %p, currentstate=%p\n", |
331 | this_walk_state->prev_op, this_walk_state)); | 331 | this_walk_state->prev_op, this_walk_state)); |
332 | 332 | ||
333 | /* | 333 | /* |
@@ -351,49 +351,7 @@ acpi_ds_call_control_method(struct acpi_thread_state *thread, | |||
351 | return_ACPI_STATUS(status); | 351 | return_ACPI_STATUS(status); |
352 | } | 352 | } |
353 | 353 | ||
354 | /* | 354 | /* Begin method parse/execution. Create a new walk state */ |
355 | * 1) Parse the method. All "normal" methods are parsed for each execution. | ||
356 | * Internal methods (_OSI, etc.) do not require parsing. | ||
357 | */ | ||
358 | if (!(obj_desc->method.method_flags & AML_METHOD_INTERNAL_ONLY)) { | ||
359 | |||
360 | /* Create a new walk state for the parse */ | ||
361 | |||
362 | next_walk_state = | ||
363 | acpi_ds_create_walk_state(obj_desc->method.owner_id, op, | ||
364 | obj_desc, NULL); | ||
365 | if (!next_walk_state) { | ||
366 | status = AE_NO_MEMORY; | ||
367 | goto cleanup; | ||
368 | } | ||
369 | |||
370 | /* Create and init a parse tree root */ | ||
371 | |||
372 | op = acpi_ps_create_scope_op(); | ||
373 | if (!op) { | ||
374 | status = AE_NO_MEMORY; | ||
375 | goto cleanup; | ||
376 | } | ||
377 | |||
378 | status = acpi_ds_init_aml_walk(next_walk_state, op, method_node, | ||
379 | obj_desc->method.aml_start, | ||
380 | obj_desc->method.aml_length, | ||
381 | NULL, 1); | ||
382 | if (ACPI_FAILURE(status)) { | ||
383 | acpi_ps_delete_parse_tree(op); | ||
384 | goto cleanup; | ||
385 | } | ||
386 | |||
387 | /* Begin AML parse (deletes next_walk_state) */ | ||
388 | |||
389 | status = acpi_ps_parse_aml(next_walk_state); | ||
390 | acpi_ps_delete_parse_tree(op); | ||
391 | if (ACPI_FAILURE(status)) { | ||
392 | goto cleanup; | ||
393 | } | ||
394 | } | ||
395 | |||
396 | /* 2) Begin method execution. Create a new walk state */ | ||
397 | 355 | ||
398 | next_walk_state = acpi_ds_create_walk_state(obj_desc->method.owner_id, | 356 | next_walk_state = acpi_ds_create_walk_state(obj_desc->method.owner_id, |
399 | NULL, obj_desc, thread); | 357 | NULL, obj_desc, thread); |
@@ -424,7 +382,8 @@ acpi_ds_call_control_method(struct acpi_thread_state *thread, | |||
424 | 382 | ||
425 | status = acpi_ds_init_aml_walk(next_walk_state, NULL, method_node, | 383 | status = acpi_ds_init_aml_walk(next_walk_state, NULL, method_node, |
426 | obj_desc->method.aml_start, | 384 | obj_desc->method.aml_start, |
427 | obj_desc->method.aml_length, info, 3); | 385 | obj_desc->method.aml_length, info, |
386 | ACPI_IMODE_EXECUTE); | ||
428 | 387 | ||
429 | ACPI_FREE(info); | 388 | ACPI_FREE(info); |
430 | if (ACPI_FAILURE(status)) { | 389 | if (ACPI_FAILURE(status)) { |
@@ -445,8 +404,8 @@ acpi_ds_call_control_method(struct acpi_thread_state *thread, | |||
445 | this_walk_state->num_operands = 0; | 404 | this_walk_state->num_operands = 0; |
446 | 405 | ||
447 | ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, | 406 | ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, |
448 | "Starting nested execution, newstate=%p\n", | 407 | "**** Begin nested execution of [%4.4s] **** WalkState=%p\n", |
449 | next_walk_state)); | 408 | method_node->name.ascii, next_walk_state)); |
450 | 409 | ||
451 | /* Invoke an internal method if necessary */ | 410 | /* Invoke an internal method if necessary */ |
452 | 411 | ||
diff --git a/drivers/acpi/dispatcher/dsmthdat.c b/drivers/acpi/dispatcher/dsmthdat.c index 459160ff9058..ba4626e06a5e 100644 --- a/drivers/acpi/dispatcher/dsmthdat.c +++ b/drivers/acpi/dispatcher/dsmthdat.c | |||
@@ -5,7 +5,7 @@ | |||
5 | ******************************************************************************/ | 5 | ******************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2006, R. Byron Moore | 8 | * Copyright (C) 2000 - 2007, R. Byron Moore |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/dispatcher/dsobject.c b/drivers/acpi/dispatcher/dsobject.c index 72190abb1d59..a474ca2334d5 100644 --- a/drivers/acpi/dispatcher/dsobject.c +++ b/drivers/acpi/dispatcher/dsobject.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2006, R. Byron Moore | 8 | * Copyright (C) 2000 - 2007, R. Byron Moore |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
@@ -260,7 +260,7 @@ acpi_ds_build_internal_buffer_obj(struct acpi_walk_state *walk_state, | |||
260 | } | 260 | } |
261 | 261 | ||
262 | obj_desc->buffer.flags |= AOPOBJ_DATA_VALID; | 262 | obj_desc->buffer.flags |= AOPOBJ_DATA_VALID; |
263 | op->common.node = (struct acpi_namespace_node *)obj_desc; | 263 | op->common.node = ACPI_CAST_PTR(struct acpi_namespace_node, obj_desc); |
264 | return_ACPI_STATUS(AE_OK); | 264 | return_ACPI_STATUS(AE_OK); |
265 | } | 265 | } |
266 | 266 | ||
@@ -270,7 +270,8 @@ acpi_ds_build_internal_buffer_obj(struct acpi_walk_state *walk_state, | |||
270 | * | 270 | * |
271 | * PARAMETERS: walk_state - Current walk state | 271 | * PARAMETERS: walk_state - Current walk state |
272 | * Op - Parser object to be translated | 272 | * Op - Parser object to be translated |
273 | * package_length - Number of elements in the package | 273 | * element_count - Number of elements in the package - this is |
274 | * the num_elements argument to Package() | ||
274 | * obj_desc_ptr - Where the ACPI internal object is returned | 275 | * obj_desc_ptr - Where the ACPI internal object is returned |
275 | * | 276 | * |
276 | * RETURN: Status | 277 | * RETURN: Status |
@@ -278,18 +279,29 @@ acpi_ds_build_internal_buffer_obj(struct acpi_walk_state *walk_state, | |||
278 | * DESCRIPTION: Translate a parser Op package object to the equivalent | 279 | * DESCRIPTION: Translate a parser Op package object to the equivalent |
279 | * namespace object | 280 | * namespace object |
280 | * | 281 | * |
282 | * NOTE: The number of elements in the package will be always be the num_elements | ||
283 | * count, regardless of the number of elements in the package list. If | ||
284 | * num_elements is smaller, only that many package list elements are used. | ||
285 | * if num_elements is larger, the Package object is padded out with | ||
286 | * objects of type Uninitialized (as per ACPI spec.) | ||
287 | * | ||
288 | * Even though the ASL compilers do not allow num_elements to be smaller | ||
289 | * than the Package list length (for the fixed length package opcode), some | ||
290 | * BIOS code modifies the AML on the fly to adjust the num_elements, and | ||
291 | * this code compensates for that. This also provides compatibility with | ||
292 | * other AML interpreters. | ||
293 | * | ||
281 | ******************************************************************************/ | 294 | ******************************************************************************/ |
282 | 295 | ||
283 | acpi_status | 296 | acpi_status |
284 | acpi_ds_build_internal_package_obj(struct acpi_walk_state *walk_state, | 297 | acpi_ds_build_internal_package_obj(struct acpi_walk_state *walk_state, |
285 | union acpi_parse_object *op, | 298 | union acpi_parse_object *op, |
286 | u32 package_length, | 299 | u32 element_count, |
287 | union acpi_operand_object **obj_desc_ptr) | 300 | union acpi_operand_object **obj_desc_ptr) |
288 | { | 301 | { |
289 | union acpi_parse_object *arg; | 302 | union acpi_parse_object *arg; |
290 | union acpi_parse_object *parent; | 303 | union acpi_parse_object *parent; |
291 | union acpi_operand_object *obj_desc = NULL; | 304 | union acpi_operand_object *obj_desc = NULL; |
292 | u32 package_list_length; | ||
293 | acpi_status status = AE_OK; | 305 | acpi_status status = AE_OK; |
294 | acpi_native_uint i; | 306 | acpi_native_uint i; |
295 | 307 | ||
@@ -318,32 +330,13 @@ acpi_ds_build_internal_package_obj(struct acpi_walk_state *walk_state, | |||
318 | obj_desc->package.node = parent->common.node; | 330 | obj_desc->package.node = parent->common.node; |
319 | } | 331 | } |
320 | 332 | ||
321 | obj_desc->package.count = package_length; | ||
322 | |||
323 | /* Count the number of items in the package list */ | ||
324 | |||
325 | arg = op->common.value.arg; | ||
326 | arg = arg->common.next; | ||
327 | for (package_list_length = 0; arg; package_list_length++) { | ||
328 | arg = arg->common.next; | ||
329 | } | ||
330 | |||
331 | /* | ||
332 | * The package length (number of elements) will be the greater | ||
333 | * of the specified length and the length of the initializer list | ||
334 | */ | ||
335 | if (package_list_length > package_length) { | ||
336 | obj_desc->package.count = package_list_length; | ||
337 | } | ||
338 | |||
339 | /* | 333 | /* |
340 | * Allocate the pointer array (array of pointers to the | 334 | * Allocate the element array (array of pointers to the individual |
341 | * individual objects). Add an extra pointer slot so | 335 | * objects) based on the num_elements parameter. Add an extra pointer slot |
342 | * that the list is always null terminated. | 336 | * so that the list is always null terminated. |
343 | */ | 337 | */ |
344 | obj_desc->package.elements = ACPI_ALLOCATE_ZEROED(((acpi_size) | 338 | obj_desc->package.elements = ACPI_ALLOCATE_ZEROED(((acpi_size) |
345 | obj_desc->package. | 339 | element_count + |
346 | count + | ||
347 | 1) * sizeof(void *)); | 340 | 1) * sizeof(void *)); |
348 | 341 | ||
349 | if (!obj_desc->package.elements) { | 342 | if (!obj_desc->package.elements) { |
@@ -351,15 +344,20 @@ acpi_ds_build_internal_package_obj(struct acpi_walk_state *walk_state, | |||
351 | return_ACPI_STATUS(AE_NO_MEMORY); | 344 | return_ACPI_STATUS(AE_NO_MEMORY); |
352 | } | 345 | } |
353 | 346 | ||
347 | obj_desc->package.count = element_count; | ||
348 | |||
354 | /* | 349 | /* |
355 | * Initialize all elements of the package | 350 | * Initialize the elements of the package, up to the num_elements count. |
351 | * Package is automatically padded with uninitialized (NULL) elements | ||
352 | * if num_elements is greater than the package list length. Likewise, | ||
353 | * Package is truncated if num_elements is less than the list length. | ||
356 | */ | 354 | */ |
357 | arg = op->common.value.arg; | 355 | arg = op->common.value.arg; |
358 | arg = arg->common.next; | 356 | arg = arg->common.next; |
359 | for (i = 0; arg; i++) { | 357 | for (i = 0; arg && (i < element_count); i++) { |
360 | if (arg->common.aml_opcode == AML_INT_RETURN_VALUE_OP) { | 358 | if (arg->common.aml_opcode == AML_INT_RETURN_VALUE_OP) { |
361 | 359 | ||
362 | /* Object (package or buffer) is already built */ | 360 | /* This package element is already built, just get it */ |
363 | 361 | ||
364 | obj_desc->package.elements[i] = | 362 | obj_desc->package.elements[i] = |
365 | ACPI_CAST_PTR(union acpi_operand_object, | 363 | ACPI_CAST_PTR(union acpi_operand_object, |
@@ -373,8 +371,14 @@ acpi_ds_build_internal_package_obj(struct acpi_walk_state *walk_state, | |||
373 | arg = arg->common.next; | 371 | arg = arg->common.next; |
374 | } | 372 | } |
375 | 373 | ||
374 | if (!arg) { | ||
375 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, | ||
376 | "Package List length larger than NumElements count (%X), truncated\n", | ||
377 | element_count)); | ||
378 | } | ||
379 | |||
376 | obj_desc->package.flags |= AOPOBJ_DATA_VALID; | 380 | obj_desc->package.flags |= AOPOBJ_DATA_VALID; |
377 | op->common.node = (struct acpi_namespace_node *)obj_desc; | 381 | op->common.node = ACPI_CAST_PTR(struct acpi_namespace_node, obj_desc); |
378 | return_ACPI_STATUS(status); | 382 | return_ACPI_STATUS(status); |
379 | } | 383 | } |
380 | 384 | ||
@@ -488,8 +492,9 @@ acpi_ds_init_object_from_op(struct acpi_walk_state *walk_state, | |||
488 | /* | 492 | /* |
489 | * Defer evaluation of Buffer term_arg operand | 493 | * Defer evaluation of Buffer term_arg operand |
490 | */ | 494 | */ |
491 | obj_desc->buffer.node = (struct acpi_namespace_node *) | 495 | obj_desc->buffer.node = |
492 | walk_state->operands[0]; | 496 | ACPI_CAST_PTR(struct acpi_namespace_node, |
497 | walk_state->operands[0]); | ||
493 | obj_desc->buffer.aml_start = op->named.data; | 498 | obj_desc->buffer.aml_start = op->named.data; |
494 | obj_desc->buffer.aml_length = op->named.length; | 499 | obj_desc->buffer.aml_length = op->named.length; |
495 | break; | 500 | break; |
@@ -499,8 +504,9 @@ acpi_ds_init_object_from_op(struct acpi_walk_state *walk_state, | |||
499 | /* | 504 | /* |
500 | * Defer evaluation of Package term_arg operand | 505 | * Defer evaluation of Package term_arg operand |
501 | */ | 506 | */ |
502 | obj_desc->package.node = (struct acpi_namespace_node *) | 507 | obj_desc->package.node = |
503 | walk_state->operands[0]; | 508 | ACPI_CAST_PTR(struct acpi_namespace_node, |
509 | walk_state->operands[0]); | ||
504 | obj_desc->package.aml_start = op->named.data; | 510 | obj_desc->package.aml_start = op->named.data; |
505 | obj_desc->package.aml_length = op->named.length; | 511 | obj_desc->package.aml_length = op->named.length; |
506 | break; | 512 | break; |
diff --git a/drivers/acpi/dispatcher/dsopcode.c b/drivers/acpi/dispatcher/dsopcode.c index 5b974a8fe614..6c6104a7a247 100644 --- a/drivers/acpi/dispatcher/dsopcode.c +++ b/drivers/acpi/dispatcher/dsopcode.c | |||
@@ -6,7 +6,7 @@ | |||
6 | *****************************************************************************/ | 6 | *****************************************************************************/ |
7 | 7 | ||
8 | /* | 8 | /* |
9 | * Copyright (C) 2000 - 2006, R. Byron Moore | 9 | * Copyright (C) 2000 - 2007, R. Byron Moore |
10 | * All rights reserved. | 10 | * All rights reserved. |
11 | * | 11 | * |
12 | * Redistribution and use in source and binary forms, with or without | 12 | * Redistribution and use in source and binary forms, with or without |
@@ -114,7 +114,7 @@ acpi_ds_execute_arguments(struct acpi_namespace_node *node, | |||
114 | } | 114 | } |
115 | 115 | ||
116 | status = acpi_ds_init_aml_walk(walk_state, op, NULL, aml_start, | 116 | status = acpi_ds_init_aml_walk(walk_state, op, NULL, aml_start, |
117 | aml_length, NULL, 1); | 117 | aml_length, NULL, ACPI_IMODE_LOAD_PASS1); |
118 | if (ACPI_FAILURE(status)) { | 118 | if (ACPI_FAILURE(status)) { |
119 | acpi_ds_delete_walk_state(walk_state); | 119 | acpi_ds_delete_walk_state(walk_state); |
120 | goto cleanup; | 120 | goto cleanup; |
@@ -157,7 +157,7 @@ acpi_ds_execute_arguments(struct acpi_namespace_node *node, | |||
157 | /* Execute the opcode and arguments */ | 157 | /* Execute the opcode and arguments */ |
158 | 158 | ||
159 | status = acpi_ds_init_aml_walk(walk_state, op, NULL, aml_start, | 159 | status = acpi_ds_init_aml_walk(walk_state, op, NULL, aml_start, |
160 | aml_length, NULL, 3); | 160 | aml_length, NULL, ACPI_IMODE_EXECUTE); |
161 | if (ACPI_FAILURE(status)) { | 161 | if (ACPI_FAILURE(status)) { |
162 | acpi_ds_delete_walk_state(walk_state); | 162 | acpi_ds_delete_walk_state(walk_state); |
163 | goto cleanup; | 163 | goto cleanup; |
diff --git a/drivers/acpi/dispatcher/dsutils.c b/drivers/acpi/dispatcher/dsutils.c index 05230baf5de8..e4073e05a75c 100644 --- a/drivers/acpi/dispatcher/dsutils.c +++ b/drivers/acpi/dispatcher/dsutils.c | |||
@@ -5,7 +5,7 @@ | |||
5 | ******************************************************************************/ | 5 | ******************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2006, R. Byron Moore | 8 | * Copyright (C) 2000 - 2007, R. Byron Moore |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/dispatcher/dswexec.c b/drivers/acpi/dispatcher/dswexec.c index d7a616c3104e..69693fa07224 100644 --- a/drivers/acpi/dispatcher/dswexec.c +++ b/drivers/acpi/dispatcher/dswexec.c | |||
@@ -6,7 +6,7 @@ | |||
6 | *****************************************************************************/ | 6 | *****************************************************************************/ |
7 | 7 | ||
8 | /* | 8 | /* |
9 | * Copyright (C) 2000 - 2006, R. Byron Moore | 9 | * Copyright (C) 2000 - 2007, R. Byron Moore |
10 | * All rights reserved. | 10 | * All rights reserved. |
11 | * | 11 | * |
12 | * Redistribution and use in source and binary forms, with or without | 12 | * Redistribution and use in source and binary forms, with or without |
@@ -219,7 +219,7 @@ acpi_ds_exec_begin_op(struct acpi_walk_state *walk_state, | |||
219 | if (!op) { | 219 | if (!op) { |
220 | status = acpi_ds_load2_begin_op(walk_state, out_op); | 220 | status = acpi_ds_load2_begin_op(walk_state, out_op); |
221 | if (ACPI_FAILURE(status)) { | 221 | if (ACPI_FAILURE(status)) { |
222 | return_ACPI_STATUS(status); | 222 | goto error_exit; |
223 | } | 223 | } |
224 | 224 | ||
225 | op = *out_op; | 225 | op = *out_op; |
@@ -238,7 +238,7 @@ acpi_ds_exec_begin_op(struct acpi_walk_state *walk_state, | |||
238 | 238 | ||
239 | status = acpi_ds_scope_stack_pop(walk_state); | 239 | status = acpi_ds_scope_stack_pop(walk_state); |
240 | if (ACPI_FAILURE(status)) { | 240 | if (ACPI_FAILURE(status)) { |
241 | return_ACPI_STATUS(status); | 241 | goto error_exit; |
242 | } | 242 | } |
243 | } | 243 | } |
244 | } | 244 | } |
@@ -287,7 +287,7 @@ acpi_ds_exec_begin_op(struct acpi_walk_state *walk_state, | |||
287 | 287 | ||
288 | status = acpi_ds_result_stack_push(walk_state); | 288 | status = acpi_ds_result_stack_push(walk_state); |
289 | if (ACPI_FAILURE(status)) { | 289 | if (ACPI_FAILURE(status)) { |
290 | return_ACPI_STATUS(status); | 290 | goto error_exit; |
291 | } | 291 | } |
292 | 292 | ||
293 | status = acpi_ds_exec_begin_control_op(walk_state, op); | 293 | status = acpi_ds_exec_begin_control_op(walk_state, op); |
@@ -328,6 +328,10 @@ acpi_ds_exec_begin_op(struct acpi_walk_state *walk_state, | |||
328 | /* Nothing to do here during method execution */ | 328 | /* Nothing to do here during method execution */ |
329 | 329 | ||
330 | return_ACPI_STATUS(status); | 330 | return_ACPI_STATUS(status); |
331 | |||
332 | error_exit: | ||
333 | status = acpi_ds_method_error(status, walk_state); | ||
334 | return_ACPI_STATUS(status); | ||
331 | } | 335 | } |
332 | 336 | ||
333 | /***************************************************************************** | 337 | /***************************************************************************** |
diff --git a/drivers/acpi/dispatcher/dswload.c b/drivers/acpi/dispatcher/dswload.c index e3ca7f6539c1..8ab9d1b29a4c 100644 --- a/drivers/acpi/dispatcher/dswload.c +++ b/drivers/acpi/dispatcher/dswload.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2006, R. Byron Moore | 8 | * Copyright (C) 2000 - 2007, R. Byron Moore |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
@@ -196,6 +196,7 @@ acpi_ds_load1_begin_op(struct acpi_walk_state * walk_state, | |||
196 | * one of the opcodes that actually opens a scope | 196 | * one of the opcodes that actually opens a scope |
197 | */ | 197 | */ |
198 | switch (node->type) { | 198 | switch (node->type) { |
199 | case ACPI_TYPE_ANY: | ||
199 | case ACPI_TYPE_LOCAL_SCOPE: /* Scope */ | 200 | case ACPI_TYPE_LOCAL_SCOPE: /* Scope */ |
200 | case ACPI_TYPE_DEVICE: | 201 | case ACPI_TYPE_DEVICE: |
201 | case ACPI_TYPE_POWER: | 202 | case ACPI_TYPE_POWER: |
@@ -546,6 +547,7 @@ acpi_ds_load2_begin_op(struct acpi_walk_state *walk_state, | |||
546 | acpi_status status; | 547 | acpi_status status; |
547 | acpi_object_type object_type; | 548 | acpi_object_type object_type; |
548 | char *buffer_ptr; | 549 | char *buffer_ptr; |
550 | u32 flags; | ||
549 | 551 | ||
550 | ACPI_FUNCTION_TRACE(ds_load2_begin_op); | 552 | ACPI_FUNCTION_TRACE(ds_load2_begin_op); |
551 | 553 | ||
@@ -669,6 +671,7 @@ acpi_ds_load2_begin_op(struct acpi_walk_state *walk_state, | |||
669 | * one of the opcodes that actually opens a scope | 671 | * one of the opcodes that actually opens a scope |
670 | */ | 672 | */ |
671 | switch (node->type) { | 673 | switch (node->type) { |
674 | case ACPI_TYPE_ANY: | ||
672 | case ACPI_TYPE_LOCAL_SCOPE: /* Scope */ | 675 | case ACPI_TYPE_LOCAL_SCOPE: /* Scope */ |
673 | case ACPI_TYPE_DEVICE: | 676 | case ACPI_TYPE_DEVICE: |
674 | case ACPI_TYPE_POWER: | 677 | case ACPI_TYPE_POWER: |
@@ -750,12 +753,20 @@ acpi_ds_load2_begin_op(struct acpi_walk_state *walk_state, | |||
750 | break; | 753 | break; |
751 | } | 754 | } |
752 | 755 | ||
753 | /* Add new entry into namespace */ | 756 | flags = ACPI_NS_NO_UPSEARCH; |
757 | if (walk_state->pass_number == ACPI_IMODE_EXECUTE) { | ||
758 | |||
759 | /* Execution mode, node cannot already exist, node is temporary */ | ||
760 | |||
761 | flags |= (ACPI_NS_ERROR_IF_FOUND | ACPI_NS_TEMPORARY); | ||
762 | } | ||
763 | |||
764 | /* Add new entry or lookup existing entry */ | ||
754 | 765 | ||
755 | status = | 766 | status = |
756 | acpi_ns_lookup(walk_state->scope_info, buffer_ptr, | 767 | acpi_ns_lookup(walk_state->scope_info, buffer_ptr, |
757 | object_type, ACPI_IMODE_LOAD_PASS2, | 768 | object_type, ACPI_IMODE_LOAD_PASS2, flags, |
758 | ACPI_NS_NO_UPSEARCH, walk_state, &(node)); | 769 | walk_state, &node); |
759 | break; | 770 | break; |
760 | } | 771 | } |
761 | 772 | ||
diff --git a/drivers/acpi/dispatcher/dswscope.c b/drivers/acpi/dispatcher/dswscope.c index c9228972f5f6..3927c495e4bf 100644 --- a/drivers/acpi/dispatcher/dswscope.c +++ b/drivers/acpi/dispatcher/dswscope.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2006, R. Byron Moore | 8 | * Copyright (C) 2000 - 2007, R. Byron Moore |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |
diff --git a/drivers/acpi/dispatcher/dswstate.c b/drivers/acpi/dispatcher/dswstate.c index 7817e5522679..16c8e38b51ef 100644 --- a/drivers/acpi/dispatcher/dswstate.c +++ b/drivers/acpi/dispatcher/dswstate.c | |||
@@ -5,7 +5,7 @@ | |||
5 | *****************************************************************************/ | 5 | *****************************************************************************/ |
6 | 6 | ||
7 | /* | 7 | /* |
8 | * Copyright (C) 2000 - 2006, R. Byron Moore | 8 | * Copyright (C) 2000 - 2007, R. Byron Moore |
9 | * All rights reserved. | 9 | * All rights reserved. |
10 | * | 10 | * |
11 | * Redistribution and use in source and binary forms, with or without | 11 | * Redistribution and use in source and binary forms, with or without |