acpi: switch acpi_object from a struct to a union

* this way the size of acpi_object_type matches the size of ACPI_OBJECT
for 32-bit and 64-bit builds.
* adjust users of the type acpi_object_type.
This commit is contained in:
Jérôme Duval
2013-10-24 14:29:47 +02:00
parent c9cff42225
commit 2bd8cdc16b
6 changed files with 69 additions and 62 deletions
+36 -29
View File
@@ -11,7 +11,7 @@
typedef struct acpi_module_info acpi_module_info;
typedef struct acpi_object_type acpi_object_type;
typedef union acpi_object_type acpi_object_type;
#define B_ACPI_MODULE_NAME "bus_managers/acpi/v1"
@@ -83,36 +83,43 @@ enum {
/* ACPI control method arg type */
struct acpi_object_type {
union acpi_object_type {
uint32 object_type;
union {
struct {
uint32 object_type;
uint64 integer;
struct {
uint32 len;
char *string; /* You have to allocate string space yourself */
} string;
struct {
size_t length;
void *buffer;
} buffer;
struct {
uint32 count;
acpi_object_type *objects;
} package;
struct {
uint32 actual_type;
acpi_handle handle;
} reference;
struct {
uint32 cpu_id;
int pblk_address;
size_t pblk_length;
} processor;
struct {
uint32 min_power_state;
uint32 resource_order;
} power_resource;
} data;
} integer;
struct {
uint32 object_type;
uint32 len;
char *string; /* You have to allocate string space yourself */
} string;
struct {
uint32 object_type;
uint32 length;
void *buffer;
} buffer;
struct {
uint32 object_type;
uint32 count;
acpi_object_type *objects;
} package;
struct {
uint32 object_type;
uint32 actual_type;
acpi_handle handle;
} reference;
struct {
uint32 object_type;
uint32 cpu_id;
acpi_io_address pblk_address;
uint32 pblk_length;
} processor;
struct {
uint32 object_type;
uint32 min_power_state;
uint32 resource_order;
} power_resource;
};
@@ -81,7 +81,7 @@ acpi_GetInteger(acpi_device_module_info* acpi, acpi_device& acpiCookie,
status_t status = acpi->evaluate_method(acpiCookie, path, NULL, &buf);
if (status == B_OK) {
if (object.object_type == ACPI_TYPE_INTEGER)
*number = object.data.integer;
*number = object.integer.integer;
else
status = B_BAD_VALUE;
}
@@ -99,7 +99,7 @@ acpi_GetReference(acpi_module_info* acpi, acpi_handle scope,
switch (obj->object_type) {
case ACPI_TYPE_LOCAL_REFERENCE:
case ACPI_TYPE_ANY:
return obj->data.reference.handle;
return obj->reference.handle;
case ACPI_TYPE_STRING:
{
@@ -107,7 +107,7 @@ acpi_GetReference(acpi_module_info* acpi, acpi_handle scope,
// scope can be NULL.
// TODO: This may not always be the case.
acpi_handle handle;
if (acpi->get_handle(scope, obj->data.string.string, &handle)
if (acpi->get_handle(scope, obj->string.string, &handle)
== B_OK)
return handle;
}
@@ -120,10 +120,10 @@ acpi_GetReference(acpi_module_info* acpi, acpi_handle scope,
status_t
acpi_PkgInt(acpi_object_type* res, int idx, int* dst)
{
acpi_object_type* obj = &res->data.package.objects[idx];
acpi_object_type* obj = &res->package.objects[idx];
if (obj == NULL || obj->object_type != ACPI_TYPE_INTEGER)
return B_BAD_VALUE;
*dst = obj->data.integer;
*dst = obj->integer.integer;
return B_OK;
}
@@ -336,13 +336,13 @@ embedded_controller_init_driver(device_node* dev, void** _driverCookie)
switch (obj->object_type) {
case ACPI_TYPE_INTEGER:
sc->ec_gpehandle = NULL;
sc->ec_gpebit = obj->data.integer;
sc->ec_gpebit = obj->integer.integer;
break;
case ACPI_TYPE_PACKAGE:
if (!ACPI_PKG_VALID(obj, 2))
goto error;
sc->ec_gpehandle = acpi_GetReference(sc->ec_acpi_module, NULL,
&obj->data.package.objects[0]);
&obj->package.objects[0]);
if (sc->ec_gpehandle == NULL
|| acpi_PkgInt32(obj, 1, (uint32*)&sc->ec_gpebit) != B_OK)
goto error;
@@ -128,7 +128,7 @@ typedef uint8 EC_EVENT;
#define ACPI_PKG_VALID(pkg, size) \
((pkg) != NULL && (pkg)->object_type == ACPI_TYPE_PACKAGE && \
(pkg)->data.package.count >= (size))
(pkg)->package.count >= (size))
/*
@@ -76,26 +76,26 @@ ReadBatteryStatus(battery_driver_cookie* cookie,
object = (acpi_object_type*)buffer.pointer;
if (object->object_type != ACPI_TYPE_PACKAGE
|| object->data.package.count < 4) {
|| object->package.count < 4) {
status = B_ERROR;
goto exit;
}
pointer = object->data.package.objects;
pointer = object->package.objects;
batteryStatus->state = (pointer->object_type == ACPI_TYPE_INTEGER)
? pointer->data.integer : BATTERY_CRITICAL_STATE;
? pointer->integer.integer : BATTERY_CRITICAL_STATE;
pointer++;
batteryStatus->current_rate = (pointer->object_type == ACPI_TYPE_INTEGER)
? pointer->data.integer : -1;
? pointer->integer.integer : -1;
pointer++;
batteryStatus->capacity = (pointer->object_type == ACPI_TYPE_INTEGER)
? pointer->data.integer : -1;
? pointer->integer.integer : -1;
pointer++;
batteryStatus->voltage = (pointer->object_type == ACPI_TYPE_INTEGER)
? pointer->data.integer : -1;
? pointer->integer.integer : -1;
/* If key values are all < 0, it is likely that the battery slot is empty
* or the battery is damaged. Set BATTERY_CRITICAL_STATE
@@ -131,68 +131,68 @@ ReadBatteryInfo(battery_driver_cookie* cookie,
object = (acpi_object_type*)buffer.pointer;
if (object->object_type != ACPI_TYPE_PACKAGE
|| object->data.package.count < 13) {
|| object->package.count < 13) {
status = B_ERROR;
goto exit;
}
pointer = object->data.package.objects;
pointer = object->package.objects;
batteryInfo->power_unit = (pointer->object_type == ACPI_TYPE_INTEGER)
? pointer->data.integer : -1;
? pointer->integer.integer : -1;
pointer++;
batteryInfo->design_capacity = (pointer->object_type == ACPI_TYPE_INTEGER)
? pointer->data.integer : -1;
? pointer->integer.integer : -1;
pointer++;
batteryInfo->last_full_charge = (pointer->object_type == ACPI_TYPE_INTEGER)
? pointer->data.integer : -1;
? pointer->integer.integer : -1;
pointer++;
batteryInfo->technology = (pointer->object_type == ACPI_TYPE_INTEGER)
? pointer->data.integer : -1;
? pointer->integer.integer : -1;
pointer++;
batteryInfo->design_voltage = (pointer->object_type == ACPI_TYPE_INTEGER)
? pointer->data.integer : -1;
? pointer->integer.integer : -1;
pointer++;
batteryInfo->design_capacity_warning =
(pointer->object_type == ACPI_TYPE_INTEGER)
? pointer->data.integer : -1;
? pointer->integer.integer : -1;
pointer++;
batteryInfo->design_capacity_low =
(pointer->object_type == ACPI_TYPE_INTEGER)
? pointer->data.integer : -1;
? pointer->integer.integer : -1;
pointer++;
batteryInfo->capacity_granularity_1 =
(pointer->object_type == ACPI_TYPE_INTEGER)
? pointer->data.integer : -1;
? pointer->integer.integer : -1;
pointer++;
batteryInfo->capacity_granularity_2 =
(pointer->object_type == ACPI_TYPE_INTEGER)
? pointer->data.integer : -1;
? pointer->integer.integer : -1;
pointer++;
strlcpy(batteryInfo->model_number,
(pointer->object_type == ACPI_TYPE_STRING)
? pointer->data.string.string : "", sizeof(batteryInfo->model_number));
? pointer->string.string : "", sizeof(batteryInfo->model_number));
pointer++;
strlcpy(batteryInfo->serial_number,
(pointer->object_type == ACPI_TYPE_STRING)
? pointer->data.string.string : "", sizeof(batteryInfo->serial_number));
? pointer->string.string : "", sizeof(batteryInfo->serial_number));
pointer++;
strlcpy(batteryInfo->type, (pointer->object_type == ACPI_TYPE_STRING)
? pointer->data.string.string : "", sizeof(batteryInfo->type));
? pointer->string.string : "", sizeof(batteryInfo->type));
pointer++;
strlcpy(batteryInfo->oem_info, (pointer->object_type == ACPI_TYPE_STRING)
? pointer->data.string.string : "", sizeof(batteryInfo->oem_info));
? pointer->string.string : "", sizeof(batteryInfo->oem_info));
exit:
free(buffer.pointer);
@@ -207,7 +207,7 @@ EstimatedRuntime(battery_driver_cookie* cookie, acpi_battery_info* info)
acpi_object_type argument;
argument.object_type = ACPI_TYPE_INTEGER;
argument.data.integer = info->current_rate;
argument.integer.integer = info->current_rate;
acpi_objects arguments;
arguments.count = 1;
@@ -231,7 +231,7 @@ EstimatedRuntime(battery_driver_cookie* cookie, acpi_battery_info* info)
if (returnObject->object_type != ACPI_TYPE_INTEGER)
return -1;
int result = returnObject->data.integer;
int result = returnObject->integer.integer;
return result;
}
+1 -1
View File
@@ -612,7 +612,7 @@ acpi_set_interrupt_model(acpi_module_info* acpiModule, uint32 interruptModel)
{
acpi_object_type model;
model.object_type = ACPI_TYPE_INTEGER;
model.data.integer = interruptModel;
model.integer.integer = interruptModel;
acpi_objects parameter;
parameter.count = 1;
@@ -346,7 +346,7 @@ evaluate_integer(acpi_module_info* acpi, acpi_handle handle,
if (result.object_type != ACPI_TYPE_INTEGER)
return B_BAD_TYPE;
value = result.data.integer;
value = result.integer.integer;
return B_OK;
}