diff options
author | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-02-07 18:36:08 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-02-07 18:36:08 -0500 |
commit | 21d37bbc65e39a26856de6b14be371ff24e0d03f (patch) | |
tree | a04bb72e191cae13f47462c57bb1641c42b7b52b /drivers/acpi/dispatcher/dsobject.c | |
parent | bff288c19e8b6217ddd660d4fa42c29a0ab1d58c (diff) | |
parent | 57e1c5c87db512629dd44ddeb882a5aaf0e4299e (diff) |
Merge branch 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6
* 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6: (140 commits)
ACPICA: reduce table header messages to fit within 80 columns
asus-laptop: merge with ACPICA table update
ACPI: bay: Convert ACPI Bay driver to be compatible with sysfs update.
ACPI: bay: new driver is EXPERIMENTAL
ACPI: bay: make drive_bays static
ACPI: bay: make bay a platform driver
ACPI: bay: remove prototype procfs code
ACPI: bay: delete unused variable
ACPI: bay: new driver adding removable drive bay support
ACPI: dock: check if parent is on dock
ACPICA: fix gcc build warnings
Altix: Add ACPI SSDT PCI device support (hotplug)
Altix: ACPI SSDT PCI device support
ACPICA: reduce conflicts with Altix patch series
ACPI_NUMA: fix HP IA64 simulator issue with extended memory domain
ACPI: fix HP RX2600 IA64 boot
ACPI: build fix for IBM x440 - CONFIG_X86_SUMMIT
ACPICA: Update version to 20070126
ACPICA: Fix for incorrect parameter passed to AcpiTbDeleteTable during table load.
ACPICA: Update copyright to 2007.
...
Diffstat (limited to 'drivers/acpi/dispatcher/dsobject.c')
-rw-r--r-- | drivers/acpi/dispatcher/dsobject.c | 78 |
1 files changed, 42 insertions, 36 deletions
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; |