Skip to content

Commit

Permalink
ACPICA: Fixes for external Reference Objects
Browse files Browse the repository at this point in the history
All Reference Objects returned via the AcpiEvaluteObject interface
are now marked as type "REFERENCE" instead of "ANY". The type ANY
is now reservered for NULL objects - either NULL package elements
or unresolved named references.

Signed-off-by: Bob Moore <robert.moore@intel.com>
Signed-off-by: Alexey Starikovskiy <astarikovskiy@suse.de>
Signed-off-by: Lin Ming <ming.m.lin@intel.com>
Signed-off-by: Len Brown <len.brown@intel.com>
  • Loading branch information
Bob Moore authored and Len Brown committed Apr 22, 2008
1 parent 7a5bb99 commit cd0b224
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 11 deletions.
3 changes: 1 addition & 2 deletions drivers/acpi/scan.c
Original file line number Diff line number Diff line change
Expand Up @@ -677,9 +677,8 @@ acpi_bus_extract_wakeup_device_power_package(struct acpi_device *device,
device->wakeup.resources.count = package->package.count - 2;
for (i = 0; i < device->wakeup.resources.count; i++) {
element = &(package->package.elements[i + 2]);
if (element->type != ACPI_TYPE_ANY) {
if (element->type != ACPI_TYPE_LOCAL_REFERENCE)
return AE_BAD_DATA;
}

device->wakeup.resources.handles[i] = element->reference.handle;
}
Expand Down
32 changes: 24 additions & 8 deletions drivers/acpi/utilities/utcopy.c
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,8 @@

#include <acpi/acpi.h>
#include <acpi/amlcode.h>
#include <acpi/acnamesp.h>


#define _COMPONENT ACPI_UTILITIES
ACPI_MODULE_NAME("utcopy")
Expand Down Expand Up @@ -172,22 +174,21 @@ acpi_ut_copy_isimple_to_esimple(union acpi_operand_object *internal_object,

case ACPI_TYPE_LOCAL_REFERENCE:

/*
* This is an object reference. Attempt to dereference it.
*/
/* This is an object reference. */

switch (internal_object->reference.opcode) {
case AML_INT_NAMEPATH_OP:

/* For namepath, return the object handle ("reference") */

default:
/*
* Use the object type of "Any" to indicate a reference
* to object containing a handle to an ACPI named object.
*/
external_object->type = ACPI_TYPE_ANY;

/* We are referring to the namespace node */

external_object->reference.handle =
internal_object->reference.node;
external_object->reference.actual_type =
acpi_ns_get_type(internal_object->reference.node);
break;
}
break;
Expand Down Expand Up @@ -460,6 +461,7 @@ acpi_ut_copy_esimple_to_isimple(union acpi_object *external_object,
case ACPI_TYPE_STRING:
case ACPI_TYPE_BUFFER:
case ACPI_TYPE_INTEGER:
case ACPI_TYPE_LOCAL_REFERENCE:

internal_object = acpi_ut_create_internal_object((u8)
external_object->
Expand All @@ -469,6 +471,11 @@ acpi_ut_copy_esimple_to_isimple(union acpi_object *external_object,
}
break;

case ACPI_TYPE_ANY: /* This is the case for a NULL object */

*ret_internal_object = NULL;
return_ACPI_STATUS(AE_OK);

default:
/* All other types are not supported */

Expand Down Expand Up @@ -522,6 +529,15 @@ acpi_ut_copy_esimple_to_isimple(union acpi_object *external_object,
internal_object->integer.value = external_object->integer.value;
break;

case ACPI_TYPE_LOCAL_REFERENCE:

/* TBD: should validate incoming handle */

internal_object->reference.opcode = AML_INT_NAMEPATH_OP;
internal_object->reference.node =
external_object->reference.handle;
break;

default:
/* Other types can't get here */
break;
Expand Down
2 changes: 1 addition & 1 deletion drivers/acpi/utils.c
Original file line number Diff line number Diff line change
Expand Up @@ -398,7 +398,7 @@ acpi_evaluate_reference(acpi_handle handle,

element = &(package->package.elements[i]);

if (element->type != ACPI_TYPE_ANY) {
if (element->type != ACPI_TYPE_LOCAL_REFERENCE) {
status = AE_BAD_DATA;
printk(KERN_ERR PREFIX
"Expecting a [Reference] package element, found type %X\n",
Expand Down

0 comments on commit cd0b224

Please sign in to comment.