Commit 523f88f1 authored by Paul Mackerras's avatar Paul Mackerras

Merge samba.org:/home/paulus/kernel/linux-2.5

into samba.org:/home/paulus/kernel/for-linus-ppc
parents 4c276cb8 e3c76cab
...@@ -1086,7 +1086,7 @@ void __init mp_parse_prt (void) ...@@ -1086,7 +1086,7 @@ void __init mp_parse_prt (void)
/* /*
* Parsing through the PCI Interrupt Routing Table (PRT) and program * Parsing through the PCI Interrupt Routing Table (PRT) and program
* routing for all static (IOAPIC-direct) entries. * routing for all entries.
*/ */
list_for_each(node, &acpi_prt.entries) { list_for_each(node, &acpi_prt.entries) {
entry = list_entry(node, struct acpi_prt_entry, node); entry = list_entry(node, struct acpi_prt_entry, node);
...@@ -1100,6 +1100,10 @@ void __init mp_parse_prt (void) ...@@ -1100,6 +1100,10 @@ void __init mp_parse_prt (void)
else else
irq = entry->link.index; irq = entry->link.index;
/* Don't set up the ACPI SCI because it's already set up */
if (acpi_fadt.sci_int == irq)
continue;
ioapic = mp_find_ioapic(irq); ioapic = mp_find_ioapic(irq);
if (ioapic < 0) if (ioapic < 0)
continue; continue;
......
...@@ -222,8 +222,8 @@ acpi_ds_initialize_objects ( ...@@ -222,8 +222,8 @@ acpi_ds_initialize_objects (
} }
ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INIT, ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INIT,
"\nTable [%4.4s] - %hd Objects with %hd Devices %hd Methods %hd Regions\n", "\nTable [%4.4s](id %4.4X) - %hd Objects with %hd Devices %hd Methods %hd Regions\n",
table_desc->pointer->signature, info.object_count, table_desc->pointer->signature, table_desc->table_id, info.object_count,
info.device_count, info.method_count, info.op_region_count)); info.device_count, info.method_count, info.op_region_count));
ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
......
...@@ -290,6 +290,8 @@ acpi_ds_call_control_method ( ...@@ -290,6 +290,8 @@ acpi_ds_call_control_method (
return_ACPI_STATUS (AE_NULL_OBJECT); return_ACPI_STATUS (AE_NULL_OBJECT);
} }
obj_desc->method.owning_id = acpi_ut_allocate_owner_id (ACPI_OWNER_TYPE_METHOD);
/* Init for new method, wait on concurrency semaphore */ /* Init for new method, wait on concurrency semaphore */
status = acpi_ds_begin_method_execution (method_node, obj_desc, status = acpi_ds_begin_method_execution (method_node, obj_desc,
......
...@@ -204,7 +204,8 @@ acpi_ds_build_internal_buffer_obj ( ...@@ -204,7 +204,8 @@ acpi_ds_build_internal_buffer_obj (
if (obj_desc->buffer.length == 0) { if (obj_desc->buffer.length == 0) {
obj_desc->buffer.pointer = NULL; obj_desc->buffer.pointer = NULL;
ACPI_REPORT_WARNING (("Buffer created with zero length in AML\n")); ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
"Buffer defined with zero length in AML, creating\n"));
} }
else { else {
obj_desc->buffer.pointer = ACPI_MEM_CALLOCATE ( obj_desc->buffer.pointer = ACPI_MEM_CALLOCATE (
......
...@@ -82,7 +82,7 @@ acpi_ds_execute_arguments ( ...@@ -82,7 +82,7 @@ acpi_ds_execute_arguments (
union acpi_parse_object *arg; union acpi_parse_object *arg;
ACPI_FUNCTION_TRACE ("acpi_ds_execute_arguments"); ACPI_FUNCTION_TRACE ("ds_execute_arguments");
/* /*
...@@ -99,7 +99,7 @@ acpi_ds_execute_arguments ( ...@@ -99,7 +99,7 @@ acpi_ds_execute_arguments (
/* Create and initialize a new parser state */ /* Create and initialize a new parser state */
walk_state = acpi_ds_create_walk_state (TABLE_ID_DSDT, NULL, NULL, NULL); walk_state = acpi_ds_create_walk_state (0, NULL, NULL, NULL);
if (!walk_state) { if (!walk_state) {
return_ACPI_STATUS (AE_NO_MEMORY); return_ACPI_STATUS (AE_NO_MEMORY);
} }
...@@ -139,7 +139,7 @@ acpi_ds_execute_arguments ( ...@@ -139,7 +139,7 @@ acpi_ds_execute_arguments (
/* Create and initialize a new parser state */ /* Create and initialize a new parser state */
walk_state = acpi_ds_create_walk_state (TABLE_ID_DSDT, NULL, NULL, NULL); walk_state = acpi_ds_create_walk_state (0, NULL, NULL, NULL);
if (!walk_state) { if (!walk_state) {
return_ACPI_STATUS (AE_NO_MEMORY); return_ACPI_STATUS (AE_NO_MEMORY);
} }
......
...@@ -50,6 +50,7 @@ ...@@ -50,6 +50,7 @@
#include <acpi/acinterp.h> #include <acpi/acinterp.h>
#include <acpi/acnamesp.h> #include <acpi/acnamesp.h>
#include <acpi/acdebug.h> #include <acpi/acdebug.h>
#include <acpi/acdisasm.h>
#define _COMPONENT ACPI_DISPATCHER #define _COMPONENT ACPI_DISPATCHER
...@@ -657,6 +658,16 @@ acpi_ds_exec_end_op ( ...@@ -657,6 +658,16 @@ acpi_ds_exec_end_op (
/* Always clear the object stack */ /* Always clear the object stack */
walk_state->num_operands = 0; walk_state->num_operands = 0;
#ifdef ACPI_DISASSEMBLER
/* On error, display method locals/args */
if (ACPI_FAILURE (status)) {
acpi_dm_dump_method_info (status, walk_state, op);
}
#endif
return_ACPI_STATUS (status); return_ACPI_STATUS (status);
} }
......
...@@ -113,7 +113,7 @@ acpi_ec_wait ( ...@@ -113,7 +113,7 @@ acpi_ec_wait (
switch (event) { switch (event) {
case ACPI_EC_EVENT_OBF: case ACPI_EC_EVENT_OBF:
do { do {
acpi_hw_low_level_read(8, &acpi_ec_status, &ec->status_addr, 0); acpi_hw_low_level_read(8, &acpi_ec_status, &ec->status_addr);
if (acpi_ec_status & ACPI_EC_FLAG_OBF) if (acpi_ec_status & ACPI_EC_FLAG_OBF)
return 0; return 0;
udelay(ACPI_EC_UDELAY); udelay(ACPI_EC_UDELAY);
...@@ -121,7 +121,7 @@ acpi_ec_wait ( ...@@ -121,7 +121,7 @@ acpi_ec_wait (
break; break;
case ACPI_EC_EVENT_IBE: case ACPI_EC_EVENT_IBE:
do { do {
acpi_hw_low_level_read(8, &acpi_ec_status, &ec->status_addr, 0); acpi_hw_low_level_read(8, &acpi_ec_status, &ec->status_addr);
if (!(acpi_ec_status & ACPI_EC_FLAG_IBF)) if (!(acpi_ec_status & ACPI_EC_FLAG_IBF))
return 0; return 0;
udelay(ACPI_EC_UDELAY); udelay(ACPI_EC_UDELAY);
...@@ -161,18 +161,18 @@ acpi_ec_read ( ...@@ -161,18 +161,18 @@ acpi_ec_read (
spin_lock_irqsave(&ec->lock, flags); spin_lock_irqsave(&ec->lock, flags);
acpi_hw_low_level_write(8, ACPI_EC_COMMAND_READ, &ec->command_addr, 0); acpi_hw_low_level_write(8, ACPI_EC_COMMAND_READ, &ec->command_addr);
result = acpi_ec_wait(ec, ACPI_EC_EVENT_IBE); result = acpi_ec_wait(ec, ACPI_EC_EVENT_IBE);
if (result) if (result)
goto end; goto end;
acpi_hw_low_level_write(8, address, &ec->data_addr, 0); acpi_hw_low_level_write(8, address, &ec->data_addr);
result = acpi_ec_wait(ec, ACPI_EC_EVENT_OBF); result = acpi_ec_wait(ec, ACPI_EC_EVENT_OBF);
if (result) if (result)
goto end; goto end;
acpi_hw_low_level_read(8, data, &ec->data_addr, 0); acpi_hw_low_level_read(8, data, &ec->data_addr);
ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Read [%02x] from address [%02x]\n", ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Read [%02x] from address [%02x]\n",
*data, address)); *data, address));
...@@ -211,17 +211,17 @@ acpi_ec_write ( ...@@ -211,17 +211,17 @@ acpi_ec_write (
spin_lock_irqsave(&ec->lock, flags); spin_lock_irqsave(&ec->lock, flags);
acpi_hw_low_level_write(8, ACPI_EC_COMMAND_WRITE, &ec->command_addr, 0); acpi_hw_low_level_write(8, ACPI_EC_COMMAND_WRITE, &ec->command_addr);
result = acpi_ec_wait(ec, ACPI_EC_EVENT_IBE); result = acpi_ec_wait(ec, ACPI_EC_EVENT_IBE);
if (result) if (result)
goto end; goto end;
acpi_hw_low_level_write(8, address, &ec->data_addr, 0); acpi_hw_low_level_write(8, address, &ec->data_addr);
result = acpi_ec_wait(ec, ACPI_EC_EVENT_IBE); result = acpi_ec_wait(ec, ACPI_EC_EVENT_IBE);
if (result) if (result)
goto end; goto end;
acpi_hw_low_level_write(8, data, &ec->data_addr, 0); acpi_hw_low_level_write(8, data, &ec->data_addr);
result = acpi_ec_wait(ec, ACPI_EC_EVENT_IBE); result = acpi_ec_wait(ec, ACPI_EC_EVENT_IBE);
if (result) if (result)
goto end; goto end;
...@@ -310,12 +310,12 @@ acpi_ec_query ( ...@@ -310,12 +310,12 @@ acpi_ec_query (
*/ */
spin_lock_irqsave(&ec->lock, flags); spin_lock_irqsave(&ec->lock, flags);
acpi_hw_low_level_write(8, ACPI_EC_COMMAND_QUERY, &ec->command_addr, 0); acpi_hw_low_level_write(8, ACPI_EC_COMMAND_QUERY, &ec->command_addr);
result = acpi_ec_wait(ec, ACPI_EC_EVENT_OBF); result = acpi_ec_wait(ec, ACPI_EC_EVENT_OBF);
if (result) if (result)
goto end; goto end;
acpi_hw_low_level_read(8, data, &ec->data_addr, 0); acpi_hw_low_level_read(8, data, &ec->data_addr);
if (!*data) if (!*data)
result = -ENODATA; result = -ENODATA;
...@@ -355,7 +355,7 @@ acpi_ec_gpe_query ( ...@@ -355,7 +355,7 @@ acpi_ec_gpe_query (
goto end; goto end;
spin_lock_irqsave(&ec->lock, flags); spin_lock_irqsave(&ec->lock, flags);
acpi_hw_low_level_read(8, &value, &ec->command_addr, 0); acpi_hw_low_level_read(8, &value, &ec->command_addr);
spin_unlock_irqrestore(&ec->lock, flags); spin_unlock_irqrestore(&ec->lock, flags);
/* TBD: Implement asynch events! /* TBD: Implement asynch events!
......
...@@ -170,7 +170,7 @@ acpi_ev_gpe_detect ( ...@@ -170,7 +170,7 @@ acpi_ev_gpe_detect (
/* Read the Status Register */ /* Read the Status Register */
status = acpi_hw_low_level_read (ACPI_GPE_REGISTER_WIDTH, &in_value, status = acpi_hw_low_level_read (ACPI_GPE_REGISTER_WIDTH, &in_value,
&gpe_register_info->status_address, 0); &gpe_register_info->status_address);
gpe_register_info->status = (u8) in_value; gpe_register_info->status = (u8) in_value;
if (ACPI_FAILURE (status)) { if (ACPI_FAILURE (status)) {
goto unlock_and_exit; goto unlock_and_exit;
...@@ -179,7 +179,7 @@ acpi_ev_gpe_detect ( ...@@ -179,7 +179,7 @@ acpi_ev_gpe_detect (
/* Read the Enable Register */ /* Read the Enable Register */
status = acpi_hw_low_level_read (ACPI_GPE_REGISTER_WIDTH, &in_value, status = acpi_hw_low_level_read (ACPI_GPE_REGISTER_WIDTH, &in_value,
&gpe_register_info->enable_address, 0); &gpe_register_info->enable_address);
gpe_register_info->enable = (u8) in_value; gpe_register_info->enable = (u8) in_value;
if (ACPI_FAILURE (status)) { if (ACPI_FAILURE (status)) {
goto unlock_and_exit; goto unlock_and_exit;
......
...@@ -634,13 +634,13 @@ acpi_ev_create_gpe_info_blocks ( ...@@ -634,13 +634,13 @@ acpi_ev_create_gpe_info_blocks (
* by writing a '0'. * by writing a '0'.
*/ */
status = acpi_hw_low_level_write (ACPI_GPE_REGISTER_WIDTH, 0x00, status = acpi_hw_low_level_write (ACPI_GPE_REGISTER_WIDTH, 0x00,
&this_register->enable_address, 0); &this_register->enable_address);
if (ACPI_FAILURE (status)) { if (ACPI_FAILURE (status)) {
goto error_exit; goto error_exit;
} }
status = acpi_hw_low_level_write (ACPI_GPE_REGISTER_WIDTH, 0xFF, status = acpi_hw_low_level_write (ACPI_GPE_REGISTER_WIDTH, 0xFF,
&this_register->status_address, 0); &this_register->status_address);
if (ACPI_FAILURE (status)) { if (ACPI_FAILURE (status)) {
goto error_exit; goto error_exit;
} }
...@@ -732,18 +732,16 @@ acpi_ev_create_gpe_block ( ...@@ -732,18 +732,16 @@ acpi_ev_create_gpe_block (
/* Dump info about this GPE block */ /* Dump info about this GPE block */
ACPI_DEBUG_PRINT ((ACPI_DB_INIT, "GPE Block: [%4.4s] %X registers at %8.8X%8.8X on interrupt %d\n", ACPI_DEBUG_PRINT ((ACPI_DB_INIT, "GPE %02d to %02d [%4.4s] %d regs at %8.8X%8.8X on int %d\n",
gpe_block->block_base_number,
(u32) (gpe_block->block_base_number +
((gpe_block->register_count * ACPI_GPE_REGISTER_WIDTH) -1)),
gpe_device->name.ascii, gpe_device->name.ascii,
gpe_block->register_count, gpe_block->register_count,
ACPI_HIDWORD (gpe_block->block_address.address), ACPI_HIDWORD (gpe_block->block_address.address),
ACPI_LODWORD (gpe_block->block_address.address), ACPI_LODWORD (gpe_block->block_address.address),
interrupt_level)); interrupt_level));
ACPI_DEBUG_PRINT ((ACPI_DB_INIT, "GPE Block defined as GPE 0x%.2X to GPE 0x%.2X\n",
gpe_block->block_base_number,
(u32) (gpe_block->block_base_number +
((gpe_block->register_count * ACPI_GPE_REGISTER_WIDTH) -1))));
/* Find all GPE methods (_Lxx, _Exx) for this block */ /* Find all GPE methods (_Lxx, _Exx) for this block */
status = acpi_ns_walk_namespace (ACPI_TYPE_METHOD, gpe_device, status = acpi_ns_walk_namespace (ACPI_TYPE_METHOD, gpe_device,
......
...@@ -156,10 +156,10 @@ acpi_ev_queue_notify_request ( ...@@ -156,10 +156,10 @@ acpi_ev_queue_notify_request (
case ACPI_TYPE_POWER: case ACPI_TYPE_POWER:
if (notify_value <= ACPI_MAX_SYS_NOTIFY) { if (notify_value <= ACPI_MAX_SYS_NOTIFY) {
handler_obj = obj_desc->common_notify.sys_handler; handler_obj = obj_desc->common_notify.system_notify;
} }
else { else {
handler_obj = obj_desc->common_notify.drv_handler; handler_obj = obj_desc->common_notify.device_notify;
} }
break; break;
...@@ -171,8 +171,8 @@ acpi_ev_queue_notify_request ( ...@@ -171,8 +171,8 @@ acpi_ev_queue_notify_request (
/* If there is any handler to run, schedule the dispatcher */ /* If there is any handler to run, schedule the dispatcher */
if ((acpi_gbl_sys_notify.handler && (notify_value <= ACPI_MAX_SYS_NOTIFY)) || if ((acpi_gbl_system_notify.handler && (notify_value <= ACPI_MAX_SYS_NOTIFY)) ||
(acpi_gbl_drv_notify.handler && (notify_value > ACPI_MAX_SYS_NOTIFY)) || (acpi_gbl_device_notify.handler && (notify_value > ACPI_MAX_SYS_NOTIFY)) ||
handler_obj) { handler_obj) {
notify_info = acpi_ut_create_generic_state (); notify_info = acpi_ut_create_generic_state ();
if (!notify_info) { if (!notify_info) {
...@@ -235,17 +235,17 @@ acpi_ev_notify_dispatch ( ...@@ -235,17 +235,17 @@ acpi_ev_notify_dispatch (
if (notify_info->notify.value <= ACPI_MAX_SYS_NOTIFY) { if (notify_info->notify.value <= ACPI_MAX_SYS_NOTIFY) {
/* Global system notification handler */ /* Global system notification handler */
if (acpi_gbl_sys_notify.handler) { if (acpi_gbl_system_notify.handler) {
global_handler = acpi_gbl_sys_notify.handler; global_handler = acpi_gbl_system_notify.handler;
global_context = acpi_gbl_sys_notify.context; global_context = acpi_gbl_system_notify.context;
} }
} }
else { else {
/* Global driver notification handler */ /* Global driver notification handler */
if (acpi_gbl_drv_notify.handler) { if (acpi_gbl_device_notify.handler) {
global_handler = acpi_gbl_drv_notify.handler; global_handler = acpi_gbl_device_notify.handler;
global_context = acpi_gbl_drv_notify.context; global_context = acpi_gbl_device_notify.context;
} }
} }
...@@ -259,8 +259,8 @@ acpi_ev_notify_dispatch ( ...@@ -259,8 +259,8 @@ acpi_ev_notify_dispatch (
handler_obj = notify_info->notify.handler_obj; handler_obj = notify_info->notify.handler_obj;
if (handler_obj) { if (handler_obj) {
handler_obj->notify_handler.handler (notify_info->notify.node, notify_info->notify.value, handler_obj->notify.handler (notify_info->notify.node, notify_info->notify.value,
handler_obj->notify_handler.context); handler_obj->notify.context);
} }
/* All done with the info object */ /* All done with the info object */
......
This diff is collapsed.
...@@ -165,10 +165,11 @@ acpi_ev_pci_config_region_setup ( ...@@ -165,10 +165,11 @@ acpi_ev_pci_config_region_setup (
void **region_context) void **region_context)
{ {
acpi_status status = AE_OK; acpi_status status = AE_OK;
acpi_integer temp; acpi_integer pci_value;
struct acpi_pci_id *pci_id = *region_context; struct acpi_pci_id *pci_id = *region_context;
union acpi_operand_object *handler_obj; union acpi_operand_object *handler_obj;
struct acpi_namespace_node *node; struct acpi_namespace_node *parent_node;
struct acpi_namespace_node *pci_root_node;
union acpi_operand_object *region_obj = (union acpi_operand_object *) handle; union acpi_operand_object *region_obj = (union acpi_operand_object *) handle;
struct acpi_device_id object_hID; struct acpi_device_id object_hID;
...@@ -176,7 +177,7 @@ acpi_ev_pci_config_region_setup ( ...@@ -176,7 +177,7 @@ acpi_ev_pci_config_region_setup (
ACPI_FUNCTION_TRACE ("ev_pci_config_region_setup"); ACPI_FUNCTION_TRACE ("ev_pci_config_region_setup");
handler_obj = region_obj->region.addr_handler; handler_obj = region_obj->region.address_space;
if (!handler_obj) { if (!handler_obj) {
/* /*
* No installed handler. This shouldn't happen because the dispatch * No installed handler. This shouldn't happen because the dispatch
...@@ -187,45 +188,15 @@ acpi_ev_pci_config_region_setup ( ...@@ -187,45 +188,15 @@ acpi_ev_pci_config_region_setup (
return_ACPI_STATUS (AE_NOT_EXIST); return_ACPI_STATUS (AE_NOT_EXIST);
} }
*region_context = NULL;
if (function == ACPI_REGION_DEACTIVATE) { if (function == ACPI_REGION_DEACTIVATE) {
if (pci_id) { if (pci_id) {
ACPI_MEM_FREE (pci_id); ACPI_MEM_FREE (pci_id);
*region_context = NULL;
} }
return_ACPI_STATUS (status); return_ACPI_STATUS (status);
} }
/* Create a new context */ parent_node = acpi_ns_get_parent_node (region_obj->region.node);
pci_id = ACPI_MEM_CALLOCATE (sizeof (struct acpi_pci_id));
if (!pci_id) {
return_ACPI_STATUS (AE_NO_MEMORY);
}
/*
* For PCI Config space access, we have to pass the segment, bus,
* device and function numbers. This routine must acquire those.
*/
/*
* First get device and function numbers from the _ADR object
* in the parent's scope.
*/
node = acpi_ns_get_parent_node (region_obj->region.node);
/* Evaluate the _ADR object */
status = acpi_ut_evaluate_numeric_object (METHOD_NAME__ADR, node, &temp);
/*
* The default is zero, and since the allocation above zeroed
* the data, just do nothing on failure.
*/
if (ACPI_SUCCESS (status)) {
pci_id->device = ACPI_HIWORD (ACPI_LODWORD (temp));
pci_id->function = ACPI_LOWORD (ACPI_LODWORD (temp));
}
/* /*
* Get the _SEG and _BBN values from the device upon which the handler * Get the _SEG and _BBN values from the device upon which the handler
...@@ -236,61 +207,106 @@ acpi_ev_pci_config_region_setup ( ...@@ -236,61 +207,106 @@ acpi_ev_pci_config_region_setup (
*/ */
/* /*
* If the addr_handler.Node is still pointing to the root, we need * If the address_space.Node is still pointing to the root, we need
* to scan upward for a PCI Root bridge and re-associate the op_region * to scan upward for a PCI Root bridge and re-associate the op_region
* handlers with that device. * handlers with that device.
*/ */
if (handler_obj->addr_handler.node == acpi_gbl_root_node) { if (handler_obj->address_space.node == acpi_gbl_root_node) {
/* /* Start search from the parent object */
* Node is currently the parent object
*/ pci_root_node = parent_node;
while (node != acpi_gbl_root_node) { while (pci_root_node != acpi_gbl_root_node) {
status = acpi_ut_execute_HID (node, &object_hID); status = acpi_ut_execute_HID (pci_root_node, &object_hID);
if (ACPI_SUCCESS (status)) { if (ACPI_SUCCESS (status)) {
/* Got a valid _HID, check if this is a PCI root */ /* Got a valid _HID, check if this is a PCI root */
if (!(ACPI_STRNCMP (object_hID.buffer, PCI_ROOT_HID_STRING, if (!(ACPI_STRNCMP (object_hID.value, PCI_ROOT_HID_STRING,
sizeof (PCI_ROOT_HID_STRING)))) { sizeof (PCI_ROOT_HID_STRING)))) {
/* Install a handler for this PCI root bridge */ /* Install a handler for this PCI root bridge */
status = acpi_install_address_space_handler ((acpi_handle) node, status = acpi_install_address_space_handler ((acpi_handle) pci_root_node,
ACPI_ADR_SPACE_PCI_CONFIG, ACPI_ADR_SPACE_PCI_CONFIG,
ACPI_DEFAULT_HANDLER, NULL, NULL); ACPI_DEFAULT_HANDLER, NULL, NULL);
if (ACPI_FAILURE (status)) { if (ACPI_FAILURE (status)) {
ACPI_REPORT_ERROR (("Could not install pci_config handler for %4.4s, %s\n", if (status == AE_SAME_HANDLER) {
node->name.ascii, acpi_format_exception (status))); /*
* It is OK if the handler is already installed on the root
* bridge. Still need to return a context object for the
* new PCI_Config operation region, however.
*/
status = AE_OK;
}
else {
ACPI_REPORT_ERROR ((
"Could not install pci_config handler for Root Bridge %4.4s, %s\n",
pci_root_node->name.ascii, acpi_format_exception (status)));
}
} }
break; break;
} }
} }
node = acpi_ns_get_parent_node (node); pci_root_node = acpi_ns_get_parent_node (pci_root_node);
} }
/* PCI root bridge not found, use namespace root node */
} }
else { else {
node = handler_obj->addr_handler.node; pci_root_node = handler_obj->address_space.node;
} }
/* /*
* The PCI segment number comes from the _SEG method * If this region is now initialized, we are done.
* (install_address_space_handler could have initialized it)
*/ */
status = acpi_ut_evaluate_numeric_object (METHOD_NAME__SEG, node, &temp); if (region_obj->region.flags & AOPOBJ_SETUP_COMPLETE) {
if (ACPI_SUCCESS (status)) { return_ACPI_STATUS (AE_OK);
pci_id->segment = ACPI_LOWORD (temp); }
/* Region is still not initialized. Create a new context */
pci_id = ACPI_MEM_CALLOCATE (sizeof (struct acpi_pci_id));
if (!pci_id) {
return_ACPI_STATUS (AE_NO_MEMORY);
} }
/* /*
* The PCI bus number comes from the _BBN method * For PCI_Config space access, we need the segment, bus,
* device and function numbers. Acquire them here.
*/ */
status = acpi_ut_evaluate_numeric_object (METHOD_NAME__BBN, node, &temp);
if (ACPI_SUCCESS (status)) {
pci_id->bus = ACPI_LOWORD (temp);
}
/* /*
* Complete this device's pci_id * Get the PCI device and function numbers from the _ADR object
* contained in the parent's scope.
*/ */
acpi_os_derive_pci_id (node, region_obj->region.node, &pci_id); status = acpi_ut_evaluate_numeric_object (METHOD_NAME__ADR, parent_node, &pci_value);
/*
* The default is zero, and since the allocation above zeroed
* the data, just do nothing on failure.
*/
if (ACPI_SUCCESS (status)) {
pci_id->device = ACPI_HIWORD (ACPI_LODWORD (pci_value));
pci_id->function = ACPI_LOWORD (ACPI_LODWORD (pci_value));
}
/* The PCI segment number comes from the _SEG method */
status = acpi_ut_evaluate_numeric_object (METHOD_NAME__SEG, pci_root_node, &pci_value);
if (ACPI_SUCCESS (status)) {
pci_id->segment = ACPI_LOWORD (pci_value);
}
/* The PCI bus number comes from the _BBN method */
status = acpi_ut_evaluate_numeric_object (METHOD_NAME__BBN, pci_root_node, &pci_value);
if (ACPI_SUCCESS (status)) {
pci_id->bus = ACPI_LOWORD (pci_value);
}
/* Complete this device's pci_id */
acpi_os_derive_pci_id (pci_root_node, region_obj->region.node, &pci_id);
*region_context = pci_id; *region_context = pci_id;
return_ACPI_STATUS (AE_OK); return_ACPI_STATUS (AE_OK);
...@@ -451,14 +467,15 @@ acpi_ev_initialize_region ( ...@@ -451,14 +467,15 @@ acpi_ev_initialize_region (
node = acpi_ns_get_parent_node (region_obj->region.node); node = acpi_ns_get_parent_node (region_obj->region.node);
space_id = region_obj->region.space_id; space_id = region_obj->region.space_id;
region_obj->region.addr_handler = NULL; /* Setup defaults */
region_obj->region.address_space = NULL;
region_obj2->extra.method_REG = NULL; region_obj2->extra.method_REG = NULL;
region_obj->common.flags &= ~(AOPOBJ_SETUP_COMPLETE); region_obj->common.flags &= ~(AOPOBJ_SETUP_COMPLETE);
region_obj->common.flags |= AOPOBJ_OBJECT_INITIALIZED; region_obj->common.flags |= AOPOBJ_OBJECT_INITIALIZED;
/* /* Find any "_REG" method associated with this region definition */
* Find any "_REG" method associated with this region definition
*/
status = acpi_ns_search_node (*reg_name_ptr, node, status = acpi_ns_search_node (*reg_name_ptr, node,
ACPI_TYPE_METHOD, &method_node); ACPI_TYPE_METHOD, &method_node);
if (ACPI_SUCCESS (status)) { if (ACPI_SUCCESS (status)) {
...@@ -475,29 +492,27 @@ acpi_ev_initialize_region ( ...@@ -475,29 +492,27 @@ acpi_ev_initialize_region (
* ie: acpi_gbl_root_node->parent_entry being set to NULL * ie: acpi_gbl_root_node->parent_entry being set to NULL
*/ */
while (node) { while (node) {
/* /* Check to see if a handler exists */
* Check to see if a handler exists
*/
handler_obj = NULL; handler_obj = NULL;
obj_desc = acpi_ns_get_attached_object (node); obj_desc = acpi_ns_get_attached_object (node);
if (obj_desc) { if (obj_desc) {
/* /* Can only be a handler if the object exists */
* Can only be a handler if the object exists
*/
switch (node->type) { switch (node->type) {
case ACPI_TYPE_DEVICE: case ACPI_TYPE_DEVICE:
handler_obj = obj_desc->device.addr_handler; handler_obj = obj_desc->device.address_space;
break; break;
case ACPI_TYPE_PROCESSOR: case ACPI_TYPE_PROCESSOR:
handler_obj = obj_desc->processor.addr_handler; handler_obj = obj_desc->processor.address_space;
break; break;
case ACPI_TYPE_THERMAL: case ACPI_TYPE_THERMAL:
handler_obj = obj_desc->thermal_zone.addr_handler; handler_obj = obj_desc->thermal_zone.address_space;
break; break;
default: default:
...@@ -508,7 +523,7 @@ acpi_ev_initialize_region ( ...@@ -508,7 +523,7 @@ acpi_ev_initialize_region (
while (handler_obj) { while (handler_obj) {
/* Is this handler of the correct type? */ /* Is this handler of the correct type? */
if (handler_obj->addr_handler.space_id == space_id) { if (handler_obj->address_space.space_id == space_id) {
/* Found correct handler */ /* Found correct handler */
ACPI_DEBUG_PRINT ((ACPI_DB_OPREGION, ACPI_DEBUG_PRINT ((ACPI_DB_OPREGION,
...@@ -523,7 +538,7 @@ acpi_ev_initialize_region ( ...@@ -523,7 +538,7 @@ acpi_ev_initialize_region (
/* Try next handler in the list */ /* Try next handler in the list */
handler_obj = handler_obj->addr_handler.next; handler_obj = handler_obj->address_space.next;
} }
} }
...@@ -534,9 +549,8 @@ acpi_ev_initialize_region ( ...@@ -534,9 +549,8 @@ acpi_ev_initialize_region (
node = acpi_ns_get_parent_node (node); node = acpi_ns_get_parent_node (node);
} }
/* /* If we get here, there is no handler for this region */
* If we get here, there is no handler for this region
*/
ACPI_DEBUG_PRINT ((ACPI_DB_OPREGION, ACPI_DEBUG_PRINT ((ACPI_DB_OPREGION,
"No handler for region_type %s(%X) (region_obj %p)\n", "No handler for region_type %s(%X) (region_obj %p)\n",
acpi_ut_get_region_name (space_id), space_id, region_obj)); acpi_ut_get_region_name (space_id), space_id, region_obj));
......
...@@ -244,22 +244,22 @@ acpi_install_notify_handler ( ...@@ -244,22 +244,22 @@ acpi_install_notify_handler (
/* Make sure the handler is not already installed */ /* Make sure the handler is not already installed */
if (((handler_type == ACPI_SYSTEM_NOTIFY) && if (((handler_type == ACPI_SYSTEM_NOTIFY) &&
acpi_gbl_sys_notify.handler) || acpi_gbl_system_notify.handler) ||
((handler_type == ACPI_DEVICE_NOTIFY) && ((handler_type == ACPI_DEVICE_NOTIFY) &&
acpi_gbl_drv_notify.handler)) { acpi_gbl_device_notify.handler)) {
status = AE_ALREADY_EXISTS; status = AE_ALREADY_EXISTS;
goto unlock_and_exit; goto unlock_and_exit;
} }
if (handler_type == ACPI_SYSTEM_NOTIFY) { if (handler_type == ACPI_SYSTEM_NOTIFY) {
acpi_gbl_sys_notify.node = node; acpi_gbl_system_notify.node = node;
acpi_gbl_sys_notify.handler = handler; acpi_gbl_system_notify.handler = handler;
acpi_gbl_sys_notify.context = context; acpi_gbl_system_notify.context = context;
} }
else /* ACPI_DEVICE_NOTIFY */ { else /* ACPI_DEVICE_NOTIFY */ {
acpi_gbl_drv_notify.node = node; acpi_gbl_device_notify.node = node;
acpi_gbl_drv_notify.handler = handler; acpi_gbl_device_notify.handler = handler;
acpi_gbl_drv_notify.context = context; acpi_gbl_device_notify.context = context;
} }
/* Global notify handler installed */ /* Global notify handler installed */
...@@ -282,13 +282,12 @@ acpi_install_notify_handler ( ...@@ -282,13 +282,12 @@ acpi_install_notify_handler (
obj_desc = acpi_ns_get_attached_object (node); obj_desc = acpi_ns_get_attached_object (node);
if (obj_desc) { if (obj_desc) {
/* Object exists - make sure there's no handler */ /* Object exists - make sure there's no handler */
if (((handler_type == ACPI_SYSTEM_NOTIFY) && if (((handler_type == ACPI_SYSTEM_NOTIFY) &&
obj_desc->common_notify.sys_handler) || obj_desc->common_notify.system_notify) ||
((handler_type == ACPI_DEVICE_NOTIFY) && ((handler_type == ACPI_DEVICE_NOTIFY) &&
obj_desc->common_notify.drv_handler)) { obj_desc->common_notify.device_notify)) {
status = AE_ALREADY_EXISTS; status = AE_ALREADY_EXISTS;
goto unlock_and_exit; goto unlock_and_exit;
} }
...@@ -305,6 +304,11 @@ acpi_install_notify_handler ( ...@@ -305,6 +304,11 @@ acpi_install_notify_handler (
/* Attach new object to the Node */ /* Attach new object to the Node */
status = acpi_ns_attach_object (device, obj_desc, node->type); status = acpi_ns_attach_object (device, obj_desc, node->type);
/* Remove local reference to the object */
acpi_ut_remove_reference (obj_desc);
if (ACPI_FAILURE (status)) { if (ACPI_FAILURE (status)) {
goto unlock_and_exit; goto unlock_and_exit;
} }
...@@ -318,15 +322,15 @@ acpi_install_notify_handler ( ...@@ -318,15 +322,15 @@ acpi_install_notify_handler (
goto unlock_and_exit; goto unlock_and_exit;
} }
notify_obj->notify_handler.node = node; notify_obj->notify.node = node;
notify_obj->notify_handler.handler = handler; notify_obj->notify.handler = handler;
notify_obj->notify_handler.context = context; notify_obj->notify.context = context;
if (handler_type == ACPI_SYSTEM_NOTIFY) { if (handler_type == ACPI_SYSTEM_NOTIFY) {
obj_desc->common_notify.sys_handler = notify_obj; obj_desc->common_notify.system_notify = notify_obj;
} }
else /* ACPI_DEVICE_NOTIFY */ { else /* ACPI_DEVICE_NOTIFY */ {
obj_desc->common_notify.drv_handler = notify_obj; obj_desc->common_notify.device_notify = notify_obj;
} }
} }
...@@ -395,22 +399,22 @@ acpi_remove_notify_handler ( ...@@ -395,22 +399,22 @@ acpi_remove_notify_handler (
ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Removing notify handler for ROOT object.\n")); ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Removing notify handler for ROOT object.\n"));
if (((handler_type == ACPI_SYSTEM_NOTIFY) && if (((handler_type == ACPI_SYSTEM_NOTIFY) &&
!acpi_gbl_sys_notify.handler) || !acpi_gbl_system_notify.handler) ||
((handler_type == ACPI_DEVICE_NOTIFY) && ((handler_type == ACPI_DEVICE_NOTIFY) &&
!acpi_gbl_drv_notify.handler)) { !acpi_gbl_device_notify.handler)) {
status = AE_NOT_EXIST; status = AE_NOT_EXIST;
goto unlock_and_exit; goto unlock_and_exit;
} }
if (handler_type == ACPI_SYSTEM_NOTIFY) { if (handler_type == ACPI_SYSTEM_NOTIFY) {
acpi_gbl_sys_notify.node = NULL; acpi_gbl_system_notify.node = NULL;
acpi_gbl_sys_notify.handler = NULL; acpi_gbl_system_notify.handler = NULL;
acpi_gbl_sys_notify.context = NULL; acpi_gbl_system_notify.context = NULL;
} }
else { else {
acpi_gbl_drv_notify.node = NULL; acpi_gbl_device_notify.node = NULL;
acpi_gbl_drv_notify.handler = NULL; acpi_gbl_device_notify.handler = NULL;
acpi_gbl_drv_notify.context = NULL; acpi_gbl_device_notify.context = NULL;
} }
} }
...@@ -436,14 +440,14 @@ acpi_remove_notify_handler ( ...@@ -436,14 +440,14 @@ acpi_remove_notify_handler (
/* Object exists - make sure there's an existing handler */ /* Object exists - make sure there's an existing handler */
if (handler_type == ACPI_SYSTEM_NOTIFY) { if (handler_type == ACPI_SYSTEM_NOTIFY) {
notify_obj = obj_desc->common_notify.sys_handler; notify_obj = obj_desc->common_notify.system_notify;
} }
else { else {
notify_obj = obj_desc->common_notify.drv_handler; notify_obj = obj_desc->common_notify.device_notify;
} }
if ((!notify_obj) || if ((!notify_obj) ||
(notify_obj->notify_handler.handler != handler)) { (notify_obj->notify.handler != handler)) {
status = AE_BAD_PARAMETER; status = AE_BAD_PARAMETER;
goto unlock_and_exit; goto unlock_and_exit;
} }
...@@ -451,10 +455,10 @@ acpi_remove_notify_handler ( ...@@ -451,10 +455,10 @@ acpi_remove_notify_handler (
/* Remove the handler */ /* Remove the handler */
if (handler_type == ACPI_SYSTEM_NOTIFY) { if (handler_type == ACPI_SYSTEM_NOTIFY) {
obj_desc->common_notify.sys_handler = NULL; obj_desc->common_notify.system_notify = NULL;
} }
else { else {
obj_desc->common_notify.drv_handler = NULL; obj_desc->common_notify.device_notify = NULL;
} }
acpi_ut_remove_reference (notify_obj); acpi_ut_remove_reference (notify_obj);
......
...@@ -654,7 +654,11 @@ acpi_install_gpe_block ( ...@@ -654,7 +654,11 @@ acpi_install_gpe_block (
} }
status = acpi_ns_attach_object (node, obj_desc, ACPI_TYPE_DEVICE); status = acpi_ns_attach_object (node, obj_desc, ACPI_TYPE_DEVICE);
/* Remove local reference to the object */
acpi_ut_remove_reference (obj_desc); acpi_ut_remove_reference (obj_desc);
if (ACPI_FAILURE (status)) { if (ACPI_FAILURE (status)) {
goto unlock_and_exit; goto unlock_and_exit;
} }
......
...@@ -154,7 +154,7 @@ acpi_install_address_space_handler ( ...@@ -154,7 +154,7 @@ acpi_install_address_space_handler (
break; break;
default: default:
status = AE_NOT_EXIST; status = AE_BAD_PARAMETER;
goto unlock_and_exit; goto unlock_and_exit;
} }
} }
...@@ -170,26 +170,36 @@ acpi_install_address_space_handler ( ...@@ -170,26 +170,36 @@ acpi_install_address_space_handler (
obj_desc = acpi_ns_get_attached_object (node); obj_desc = acpi_ns_get_attached_object (node);
if (obj_desc) { if (obj_desc) {
/* /*
* The object exists. * The attached device object already exists.
* Make sure the handler is not already installed. * Make sure the handler is not already installed.
*/ */
handler_obj = obj_desc->device.address_space;
/* check the address handler the user requested */ /* Walk the handler list for this device */
handler_obj = obj_desc->device.addr_handler;
while (handler_obj) { while (handler_obj) {
/* Same space_id indicates a handler already installed */
if(handler_obj->address_space.space_id == space_id) {
if (handler_obj->address_space.handler == handler) {
/* /*
* Found an Address handler, see if user requested this * It is (relatively) OK to attempt to install the SAME
* address space. * handler twice. This can easily happen with PCI_Config space.
*/ */
if(handler_obj->addr_handler.space_id == space_id) { status = AE_SAME_HANDLER;
goto unlock_and_exit;
}
else {
/* A handler is already installed */
status = AE_ALREADY_EXISTS; status = AE_ALREADY_EXISTS;
}
goto unlock_and_exit; goto unlock_and_exit;
} }
/* Walk the linked list of handlers */ /* Walk the linked list of handlers */
handler_obj = handler_obj->addr_handler.next; handler_obj = handler_obj->address_space.next;
} }
} }
else { else {
...@@ -218,8 +228,12 @@ acpi_install_address_space_handler ( ...@@ -218,8 +228,12 @@ acpi_install_address_space_handler (
/* Attach the new object to the Node */ /* Attach the new object to the Node */
status = acpi_ns_attach_object (node, obj_desc, type); status = acpi_ns_attach_object (node, obj_desc, type);
if (ACPI_FAILURE (status)) {
/* Remove local reference to the object */
acpi_ut_remove_reference (obj_desc); acpi_ut_remove_reference (obj_desc);
if (ACPI_FAILURE (status)) {
goto unlock_and_exit; goto unlock_and_exit;
} }
} }
...@@ -241,14 +255,25 @@ acpi_install_address_space_handler ( ...@@ -241,14 +255,25 @@ acpi_install_address_space_handler (
goto unlock_and_exit; goto unlock_and_exit;
} }
handler_obj->addr_handler.space_id = (u8) space_id; /* Init handler obj */
handler_obj->addr_handler.hflags = flags;
handler_obj->addr_handler.next = obj_desc->device.addr_handler; handler_obj->address_space.space_id = (u8) space_id;
handler_obj->addr_handler.region_list = NULL; handler_obj->address_space.hflags = flags;
handler_obj->addr_handler.node = node; handler_obj->address_space.region_list = NULL;
handler_obj->addr_handler.handler = handler; handler_obj->address_space.node = node;
handler_obj->addr_handler.context = context; handler_obj->address_space.handler = handler;
handler_obj->addr_handler.setup = setup; handler_obj->address_space.context = context;
handler_obj->address_space.setup = setup;
/* Install at head of Device.address_space list */
handler_obj->address_space.next = obj_desc->device.address_space;
/*
* The Device object is the first reference on the handler_obj.
* Each region that uses the handler adds a reference.
*/
obj_desc->device.address_space = handler_obj;
/* /*
* Walk the namespace finding all of the regions this * Walk the namespace finding all of the regions this
...@@ -262,19 +287,10 @@ acpi_install_address_space_handler ( ...@@ -262,19 +287,10 @@ acpi_install_address_space_handler (
* In either case, back up and search down the remainder * In either case, back up and search down the remainder
* of the branch * of the branch
*/ */
status = acpi_ns_walk_namespace (ACPI_TYPE_ANY, device, status = acpi_ns_walk_namespace (ACPI_TYPE_ANY, device, ACPI_UINT32_MAX,
ACPI_UINT32_MAX, ACPI_NS_WALK_UNLOCK, ACPI_NS_WALK_UNLOCK, acpi_ev_install_handler,
acpi_ev_addr_handler_helper,
handler_obj, NULL); handler_obj, NULL);
/* Place this handler 1st on the list */
handler_obj->common.reference_count =
(u16) (handler_obj->common.reference_count +
obj_desc->common.reference_count - 1);
obj_desc->device.addr_handler = handler_obj;
unlock_and_exit: unlock_and_exit:
(void) acpi_ut_release_mutex (ACPI_MTX_NAMESPACE); (void) acpi_ut_release_mutex (ACPI_MTX_NAMESPACE);
return_ACPI_STATUS (status); return_ACPI_STATUS (status);
...@@ -341,12 +357,12 @@ acpi_remove_address_space_handler ( ...@@ -341,12 +357,12 @@ acpi_remove_address_space_handler (
/* Find the address handler the user requested */ /* Find the address handler the user requested */
handler_obj = obj_desc->device.addr_handler; handler_obj = obj_desc->device.address_space;
last_obj_ptr = &obj_desc->device.addr_handler; last_obj_ptr = &obj_desc->device.address_space;
while (handler_obj) { while (handler_obj) {
/* We have a handler, see if user requested this one */ /* We have a handler, see if user requested this one */
if (handler_obj->addr_handler.space_id == space_id) { if (handler_obj->address_space.space_id == space_id) {
/* Matched space_id, first dereference this in the Regions */ /* Matched space_id, first dereference this in the Regions */
ACPI_DEBUG_PRINT ((ACPI_DB_OPREGION, ACPI_DEBUG_PRINT ((ACPI_DB_OPREGION,
...@@ -354,7 +370,7 @@ acpi_remove_address_space_handler ( ...@@ -354,7 +370,7 @@ acpi_remove_address_space_handler (
handler_obj, handler, acpi_ut_get_region_name (space_id), handler_obj, handler, acpi_ut_get_region_name (space_id),
node, obj_desc)); node, obj_desc));
region_obj = handler_obj->addr_handler.region_list; region_obj = handler_obj->address_space.region_list;
/* Walk the handler's region list */ /* Walk the handler's region list */
...@@ -372,13 +388,13 @@ acpi_remove_address_space_handler ( ...@@ -372,13 +388,13 @@ acpi_remove_address_space_handler (
* Walk the list: Just grab the head because the * Walk the list: Just grab the head because the
* detach_region removed the previous head. * detach_region removed the previous head.
*/ */
region_obj = handler_obj->addr_handler.region_list; region_obj = handler_obj->address_space.region_list;
} }
/* Remove this Handler object from the list */ /* Remove this Handler object from the list */
*last_obj_ptr = handler_obj->addr_handler.next; *last_obj_ptr = handler_obj->address_space.next;
/* Now we can delete the handler object */ /* Now we can delete the handler object */
...@@ -388,8 +404,8 @@ acpi_remove_address_space_handler ( ...@@ -388,8 +404,8 @@ acpi_remove_address_space_handler (
/* Walk the linked list of handlers */ /* Walk the linked list of handlers */
last_obj_ptr = &handler_obj->addr_handler.next; last_obj_ptr = &handler_obj->address_space.next;
handler_obj = handler_obj->addr_handler.next; handler_obj = handler_obj->address_space.next;
} }
/* The handler does not exist */ /* The handler does not exist */
......
...@@ -360,11 +360,11 @@ acpi_ex_load_op ( ...@@ -360,11 +360,11 @@ acpi_ex_load_op (
/* The table must be either an SSDT or a PSDT */ /* The table must be either an SSDT or a PSDT */
if ((!ACPI_STRNCMP (table_ptr->signature, if ((!ACPI_STRNCMP (table_ptr->signature,
acpi_gbl_acpi_table_data[ACPI_TABLE_PSDT].signature, acpi_gbl_table_data[ACPI_TABLE_PSDT].signature,
acpi_gbl_acpi_table_data[ACPI_TABLE_PSDT].sig_length)) && acpi_gbl_table_data[ACPI_TABLE_PSDT].sig_length)) &&
(!ACPI_STRNCMP (table_ptr->signature, (!ACPI_STRNCMP (table_ptr->signature,
acpi_gbl_acpi_table_data[ACPI_TABLE_SSDT].signature, acpi_gbl_table_data[ACPI_TABLE_SSDT].signature,
acpi_gbl_acpi_table_data[ACPI_TABLE_SSDT].sig_length))) { acpi_gbl_table_data[ACPI_TABLE_SSDT].sig_length))) {
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
"Table has invalid signature [%4.4s], must be SSDT or PSDT\n", "Table has invalid signature [%4.4s], must be SSDT or PSDT\n",
table_ptr->signature)); table_ptr->signature));
......
...@@ -635,9 +635,9 @@ acpi_ex_dump_object_descriptor ( ...@@ -635,9 +635,9 @@ acpi_ex_dump_object_descriptor (
case ACPI_TYPE_DEVICE: case ACPI_TYPE_DEVICE:
acpi_ex_out_pointer ("addr_handler", obj_desc->device.addr_handler); acpi_ex_out_pointer ("address_space", obj_desc->device.address_space);
acpi_ex_out_pointer ("sys_handler", obj_desc->device.sys_handler); acpi_ex_out_pointer ("system_notify", obj_desc->device.system_notify);
acpi_ex_out_pointer ("drv_handler", obj_desc->device.drv_handler); acpi_ex_out_pointer ("device_notify", obj_desc->device.device_notify);
break; break;
...@@ -673,7 +673,7 @@ acpi_ex_dump_object_descriptor ( ...@@ -673,7 +673,7 @@ acpi_ex_dump_object_descriptor (
acpi_ex_out_integer ("Flags", obj_desc->region.flags); acpi_ex_out_integer ("Flags", obj_desc->region.flags);
acpi_ex_out_address ("Address", obj_desc->region.address); acpi_ex_out_address ("Address", obj_desc->region.address);
acpi_ex_out_integer ("Length", obj_desc->region.length); acpi_ex_out_integer ("Length", obj_desc->region.length);
acpi_ex_out_pointer ("addr_handler", obj_desc->region.addr_handler); acpi_ex_out_pointer ("address_space", obj_desc->region.address_space);
acpi_ex_out_pointer ("Next", obj_desc->region.next); acpi_ex_out_pointer ("Next", obj_desc->region.next);
break; break;
...@@ -682,8 +682,8 @@ acpi_ex_dump_object_descriptor ( ...@@ -682,8 +682,8 @@ acpi_ex_dump_object_descriptor (
acpi_ex_out_integer ("system_level", obj_desc->power_resource.system_level); acpi_ex_out_integer ("system_level", obj_desc->power_resource.system_level);
acpi_ex_out_integer ("resource_order", obj_desc->power_resource.resource_order); acpi_ex_out_integer ("resource_order", obj_desc->power_resource.resource_order);
acpi_ex_out_pointer ("sys_handler", obj_desc->power_resource.sys_handler); acpi_ex_out_pointer ("system_notify", obj_desc->power_resource.system_notify);
acpi_ex_out_pointer ("drv_handler", obj_desc->power_resource.drv_handler); acpi_ex_out_pointer ("device_notify", obj_desc->power_resource.device_notify);
break; break;
...@@ -692,17 +692,17 @@ acpi_ex_dump_object_descriptor ( ...@@ -692,17 +692,17 @@ acpi_ex_dump_object_descriptor (
acpi_ex_out_integer ("Processor ID", obj_desc->processor.proc_id); acpi_ex_out_integer ("Processor ID", obj_desc->processor.proc_id);
acpi_ex_out_integer ("Length", obj_desc->processor.length); acpi_ex_out_integer ("Length", obj_desc->processor.length);
acpi_ex_out_address ("Address", (acpi_physical_address) obj_desc->processor.address); acpi_ex_out_address ("Address", (acpi_physical_address) obj_desc->processor.address);
acpi_ex_out_pointer ("sys_handler", obj_desc->processor.sys_handler); acpi_ex_out_pointer ("system_notify", obj_desc->processor.system_notify);
acpi_ex_out_pointer ("drv_handler", obj_desc->processor.drv_handler); acpi_ex_out_pointer ("device_notify", obj_desc->processor.device_notify);
acpi_ex_out_pointer ("addr_handler", obj_desc->processor.addr_handler); acpi_ex_out_pointer ("address_space", obj_desc->processor.address_space);
break; break;
case ACPI_TYPE_THERMAL: case ACPI_TYPE_THERMAL:
acpi_ex_out_pointer ("sys_handler", obj_desc->thermal_zone.sys_handler); acpi_ex_out_pointer ("system_notify", obj_desc->thermal_zone.system_notify);
acpi_ex_out_pointer ("drv_handler", obj_desc->thermal_zone.drv_handler); acpi_ex_out_pointer ("device_notify", obj_desc->thermal_zone.device_notify);
acpi_ex_out_pointer ("addr_handler", obj_desc->thermal_zone.addr_handler); acpi_ex_out_pointer ("address_space", obj_desc->thermal_zone.address_space);
break; break;
...@@ -762,18 +762,18 @@ acpi_ex_dump_object_descriptor ( ...@@ -762,18 +762,18 @@ acpi_ex_dump_object_descriptor (
case ACPI_TYPE_LOCAL_ADDRESS_HANDLER: case ACPI_TYPE_LOCAL_ADDRESS_HANDLER:
acpi_ex_out_integer ("space_id", obj_desc->addr_handler.space_id); acpi_ex_out_integer ("space_id", obj_desc->address_space.space_id);
acpi_ex_out_pointer ("Next", obj_desc->addr_handler.next); acpi_ex_out_pointer ("Next", obj_desc->address_space.next);
acpi_ex_out_pointer ("region_list", obj_desc->addr_handler.region_list); acpi_ex_out_pointer ("region_list", obj_desc->address_space.region_list);
acpi_ex_out_pointer ("Node", obj_desc->addr_handler.node); acpi_ex_out_pointer ("Node", obj_desc->address_space.node);
acpi_ex_out_pointer ("Context", obj_desc->addr_handler.context); acpi_ex_out_pointer ("Context", obj_desc->address_space.context);
break; break;
case ACPI_TYPE_LOCAL_NOTIFY: case ACPI_TYPE_LOCAL_NOTIFY:
acpi_ex_out_pointer ("Node", obj_desc->notify_handler.node); acpi_ex_out_pointer ("Node", obj_desc->notify.node);
acpi_ex_out_pointer ("Context", obj_desc->notify_handler.context); acpi_ex_out_pointer ("Context", obj_desc->notify.context);
break; break;
......
...@@ -77,7 +77,7 @@ acpi_hw_enable_gpe ( ...@@ -77,7 +77,7 @@ acpi_hw_enable_gpe (
* to enable the GPE, and write out the new register. * to enable the GPE, and write out the new register.
*/ */
status = acpi_hw_low_level_read (8, &in_byte, status = acpi_hw_low_level_read (8, &in_byte,
&gpe_event_info->register_info->enable_address, 0); &gpe_event_info->register_info->enable_address);
if (ACPI_FAILURE (status)) { if (ACPI_FAILURE (status)) {
return (status); return (status);
} }
...@@ -85,7 +85,7 @@ acpi_hw_enable_gpe ( ...@@ -85,7 +85,7 @@ acpi_hw_enable_gpe (
/* Write with the new GPE bit enabled */ /* Write with the new GPE bit enabled */
status = acpi_hw_low_level_write (8, (in_byte | gpe_event_info->bit_mask), status = acpi_hw_low_level_write (8, (in_byte | gpe_event_info->bit_mask),
&gpe_event_info->register_info->enable_address, 0); &gpe_event_info->register_info->enable_address);
return (status); return (status);
} }
...@@ -164,7 +164,7 @@ acpi_hw_disable_gpe ( ...@@ -164,7 +164,7 @@ acpi_hw_disable_gpe (
* and write out the new register value to disable the GPE. * and write out the new register value to disable the GPE.
*/ */
status = acpi_hw_low_level_read (8, &in_byte, status = acpi_hw_low_level_read (8, &in_byte,
&gpe_register_info->enable_address, 0); &gpe_register_info->enable_address);
if (ACPI_FAILURE (status)) { if (ACPI_FAILURE (status)) {
return (status); return (status);
} }
...@@ -172,7 +172,7 @@ acpi_hw_disable_gpe ( ...@@ -172,7 +172,7 @@ acpi_hw_disable_gpe (
/* Write the byte with this GPE bit cleared */ /* Write the byte with this GPE bit cleared */
status = acpi_hw_low_level_write (8, (in_byte & ~(gpe_event_info->bit_mask)), status = acpi_hw_low_level_write (8, (in_byte & ~(gpe_event_info->bit_mask)),
&gpe_register_info->enable_address, 0); &gpe_register_info->enable_address);
if (ACPI_FAILURE (status)) { if (ACPI_FAILURE (status)) {
return (status); return (status);
} }
...@@ -246,7 +246,7 @@ acpi_hw_clear_gpe ( ...@@ -246,7 +246,7 @@ acpi_hw_clear_gpe (
* clear this GPE. * clear this GPE.
*/ */
status = acpi_hw_low_level_write (8, gpe_event_info->bit_mask, status = acpi_hw_low_level_write (8, gpe_event_info->bit_mask,
&gpe_event_info->register_info->status_address, 0); &gpe_event_info->register_info->status_address);
return (status); return (status);
} }
...@@ -293,7 +293,7 @@ acpi_hw_get_gpe_status ( ...@@ -293,7 +293,7 @@ acpi_hw_get_gpe_status (
/* GPE Enabled? */ /* GPE Enabled? */
status = acpi_hw_low_level_read (8, &in_byte, &gpe_register_info->enable_address, 0); status = acpi_hw_low_level_read (8, &in_byte, &gpe_register_info->enable_address);
if (ACPI_FAILURE (status)) { if (ACPI_FAILURE (status)) {
goto unlock_and_exit; goto unlock_and_exit;
} }
...@@ -310,7 +310,7 @@ acpi_hw_get_gpe_status ( ...@@ -310,7 +310,7 @@ acpi_hw_get_gpe_status (
/* GPE active (set)? */ /* GPE active (set)? */
status = acpi_hw_low_level_read (8, &in_byte, &gpe_register_info->status_address, 0); status = acpi_hw_low_level_read (8, &in_byte, &gpe_register_info->status_address);
if (ACPI_FAILURE (status)) { if (ACPI_FAILURE (status)) {
goto unlock_and_exit; goto unlock_and_exit;
} }
...@@ -360,7 +360,7 @@ acpi_hw_disable_gpe_block ( ...@@ -360,7 +360,7 @@ acpi_hw_disable_gpe_block (
for (i = 0; i < gpe_block->register_count; i++) { for (i = 0; i < gpe_block->register_count; i++) {
status = acpi_hw_low_level_write (8, 0x00, status = acpi_hw_low_level_write (8, 0x00,
&gpe_block->register_info[i].enable_address, (u32) i); &gpe_block->register_info[i].enable_address);
if (ACPI_FAILURE (status)) { if (ACPI_FAILURE (status)) {
return (status); return (status);
} }
...@@ -401,7 +401,7 @@ acpi_hw_clear_gpe_block ( ...@@ -401,7 +401,7 @@ acpi_hw_clear_gpe_block (
for (i = 0; i < gpe_block->register_count; i++) { for (i = 0; i < gpe_block->register_count; i++) {
status = acpi_hw_low_level_write (8, 0xFF, status = acpi_hw_low_level_write (8, 0xFF,
&gpe_block->register_info[i].status_address, (u32) i); &gpe_block->register_info[i].status_address);
if (ACPI_FAILURE (status)) { if (ACPI_FAILURE (status)) {
return (status); return (status);
} }
...@@ -447,7 +447,7 @@ acpi_hw_disable_non_wakeup_gpe_block ( ...@@ -447,7 +447,7 @@ acpi_hw_disable_non_wakeup_gpe_block (
* will be using it to restore all the GPEs later. * will be using it to restore all the GPEs later.
*/ */
status = acpi_hw_low_level_read (8, &in_value, status = acpi_hw_low_level_read (8, &in_value,
&gpe_register_info->enable_address, 0); &gpe_register_info->enable_address);
if (ACPI_FAILURE (status)) { if (ACPI_FAILURE (status)) {
return (status); return (status);
} }
...@@ -458,7 +458,7 @@ acpi_hw_disable_non_wakeup_gpe_block ( ...@@ -458,7 +458,7 @@ acpi_hw_disable_non_wakeup_gpe_block (
* Disable all GPEs except wakeup GPEs. * Disable all GPEs except wakeup GPEs.
*/ */
status = acpi_hw_low_level_write (8, gpe_register_info->wake_enable, status = acpi_hw_low_level_write (8, gpe_register_info->wake_enable,
&gpe_register_info->enable_address, 0); &gpe_register_info->enable_address);
if (ACPI_FAILURE (status)) { if (ACPI_FAILURE (status)) {
return (status); return (status);
} }
...@@ -539,7 +539,7 @@ acpi_hw_enable_non_wakeup_gpe_block ( ...@@ -539,7 +539,7 @@ acpi_hw_enable_non_wakeup_gpe_block (
* Blast them back in. * Blast them back in.
*/ */
status = acpi_hw_low_level_write (8, gpe_register_info->enable, status = acpi_hw_low_level_write (8, gpe_register_info->enable,
&gpe_register_info->enable_address, 0); &gpe_register_info->enable_address);
if (ACPI_FAILURE (status)) { if (ACPI_FAILURE (status)) {
return (status); return (status);
} }
......
This diff is collapsed.
...@@ -108,7 +108,7 @@ acpi_get_timer ( ...@@ -108,7 +108,7 @@ acpi_get_timer (
return_ACPI_STATUS (AE_BAD_PARAMETER); return_ACPI_STATUS (AE_BAD_PARAMETER);
} }
status = acpi_hw_low_level_read (32, ticks, &acpi_gbl_FADT->xpm_tmr_blk, 0); status = acpi_hw_low_level_read (32, ticks, &acpi_gbl_FADT->xpm_tmr_blk);
return_ACPI_STATUS (status); return_ACPI_STATUS (status);
} }
......
...@@ -116,20 +116,34 @@ acpi_ns_delete_node ( ...@@ -116,20 +116,34 @@ acpi_ns_delete_node (
prev_node = NULL; prev_node = NULL;
next_node = parent_node->child; next_node = parent_node->child;
/* Find the node that is the previous peer in the parent's child list */
while (next_node != node) { while (next_node != node) {
prev_node = next_node; prev_node = next_node;
next_node = prev_node->peer; next_node = prev_node->peer;
} }
if (prev_node) { if (prev_node) {
/* Node is not first child, unlink it */
prev_node->peer = next_node->peer; prev_node->peer = next_node->peer;
if (next_node->flags & ANOBJ_END_OF_PEER_LIST) { if (next_node->flags & ANOBJ_END_OF_PEER_LIST) {
prev_node->flags |= ANOBJ_END_OF_PEER_LIST; prev_node->flags |= ANOBJ_END_OF_PEER_LIST;
} }
} }
else { else {
/* Node is first child (has no previous peer) */
if (next_node->flags & ANOBJ_END_OF_PEER_LIST) {
/* No peers at all */
parent_node->child = NULL;
}
else { /* Link peer list to parent */
parent_node->child = next_node->peer; parent_node->child = next_node->peer;
} }
}
ACPI_MEM_TRACKING (acpi_gbl_memory_lists[ACPI_MEM_LIST_NSNODE].total_freed++); ACPI_MEM_TRACKING (acpi_gbl_memory_lists[ACPI_MEM_LIST_NSNODE].total_freed++);
...@@ -222,7 +236,7 @@ acpi_ns_install_node ( ...@@ -222,7 +236,7 @@ acpi_ns_install_node (
struct acpi_namespace_node *node, /* New Child*/ struct acpi_namespace_node *node, /* New Child*/
acpi_object_type type) acpi_object_type type)
{ {
u16 owner_id = TABLE_ID_DSDT; u16 owner_id = 0;
struct acpi_namespace_node *child_node; struct acpi_namespace_node *child_node;
#ifdef ACPI_ALPHABETIC_NAMESPACE #ifdef ACPI_ALPHABETIC_NAMESPACE
...@@ -355,6 +369,7 @@ acpi_ns_delete_children ( ...@@ -355,6 +369,7 @@ acpi_ns_delete_children (
{ {
struct acpi_namespace_node *child_node; struct acpi_namespace_node *child_node;
struct acpi_namespace_node *next_node; struct acpi_namespace_node *next_node;
struct acpi_namespace_node *node;
u8 flags; u8 flags;
...@@ -399,6 +414,25 @@ acpi_ns_delete_children ( ...@@ -399,6 +414,25 @@ acpi_ns_delete_children (
* Detach an object if there is one, then free the child node * Detach an object if there is one, then free the child node
*/ */
acpi_ns_detach_object (child_node); acpi_ns_detach_object (child_node);
/*
* Decrement the reference count(s) of all parents up to
* the root! (counts were incremented when the node was created)
*/
node = child_node;
while ((node = acpi_ns_get_parent_node (node)) != NULL) {
node->reference_count--;
}
/* There should be only one reference remaining on this node */
if (child_node->reference_count != 1) {
ACPI_REPORT_WARNING (("Existing references (%d) on node being deleted (%p)\n",
child_node->reference_count, child_node));
}
/* Now we can delete the node */
ACPI_MEM_FREE (child_node); ACPI_MEM_FREE (child_node);
/* And move on to the next child in the list */ /* And move on to the next child in the list */
...@@ -512,7 +546,7 @@ acpi_ns_delete_namespace_subtree ( ...@@ -512,7 +546,7 @@ acpi_ns_delete_namespace_subtree (
* *
******************************************************************************/ ******************************************************************************/
static void void
acpi_ns_remove_reference ( acpi_ns_remove_reference (
struct acpi_namespace_node *node) struct acpi_namespace_node *node)
{ {
......
...@@ -72,7 +72,8 @@ acpi_ns_dump_one_device ( ...@@ -72,7 +72,8 @@ acpi_ns_dump_one_device (
void *context, void *context,
void **return_value) void **return_value)
{ {
struct acpi_device_info info; struct acpi_buffer buffer;
struct acpi_device_info *info;
acpi_status status; acpi_status status;
u32 i; u32 i;
...@@ -82,16 +83,19 @@ acpi_ns_dump_one_device ( ...@@ -82,16 +83,19 @@ acpi_ns_dump_one_device (
status = acpi_ns_dump_one_object (obj_handle, level, context, return_value); status = acpi_ns_dump_one_object (obj_handle, level, context, return_value);
status = acpi_get_object_info (obj_handle, &info); buffer.length = ACPI_ALLOCATE_LOCAL_BUFFER;
status = acpi_get_object_info (obj_handle, &buffer);
if (ACPI_SUCCESS (status)) { if (ACPI_SUCCESS (status)) {
info = buffer.pointer;
for (i = 0; i < level; i++) { for (i = 0; i < level; i++) {
ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " ")); ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " "));
} }
ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " HID: %s, ADR: %8.8X%8.8X, Status: %X\n", ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " HID: %s, ADR: %8.8X%8.8X, Status: %X\n",
info.hardware_id, info->hardware_id.value,
ACPI_HIDWORD (info.address), ACPI_LODWORD (info.address), ACPI_HIDWORD (info->address), ACPI_LODWORD (info->address),
info.current_status)); info->current_status));
ACPI_MEM_FREE (info);
} }
return (status); return (status);
......
...@@ -79,7 +79,7 @@ acpi_ns_load_table ( ...@@ -79,7 +79,7 @@ acpi_ns_load_table (
/* Check if table contains valid AML (must be DSDT, PSDT, SSDT, etc.) */ /* Check if table contains valid AML (must be DSDT, PSDT, SSDT, etc.) */
if (!(acpi_gbl_acpi_table_data[table_desc->type].flags & ACPI_TABLE_EXECUTABLE)) { if (!(acpi_gbl_table_data[table_desc->type].flags & ACPI_TABLE_EXECUTABLE)) {
/* Just ignore this table */ /* Just ignore this table */
return_ACPI_STATUS (AE_OK); return_ACPI_STATUS (AE_OK);
...@@ -182,7 +182,7 @@ acpi_ns_load_table_by_type ( ...@@ -182,7 +182,7 @@ acpi_ns_load_table_by_type (
ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Loading DSDT\n")); ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Loading DSDT\n"));
table_desc = &acpi_gbl_acpi_tables[ACPI_TABLE_DSDT]; table_desc = acpi_gbl_table_lists[ACPI_TABLE_DSDT].next;
/* If table already loaded into namespace, just return */ /* If table already loaded into namespace, just return */
...@@ -190,8 +190,6 @@ acpi_ns_load_table_by_type ( ...@@ -190,8 +190,6 @@ acpi_ns_load_table_by_type (
goto unlock_and_exit; goto unlock_and_exit;
} }
table_desc->table_id = TABLE_ID_DSDT;
/* Now load the single DSDT */ /* Now load the single DSDT */
status = acpi_ns_load_table (table_desc, acpi_gbl_root_node); status = acpi_ns_load_table (table_desc, acpi_gbl_root_node);
...@@ -205,13 +203,13 @@ acpi_ns_load_table_by_type ( ...@@ -205,13 +203,13 @@ acpi_ns_load_table_by_type (
case ACPI_TABLE_SSDT: case ACPI_TABLE_SSDT:
ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Loading %d SSDTs\n", ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Loading %d SSDTs\n",
acpi_gbl_acpi_tables[ACPI_TABLE_SSDT].count)); acpi_gbl_table_lists[ACPI_TABLE_SSDT].count));
/* /*
* Traverse list of SSDT tables * Traverse list of SSDT tables
*/ */
table_desc = &acpi_gbl_acpi_tables[ACPI_TABLE_SSDT]; table_desc = acpi_gbl_table_lists[ACPI_TABLE_SSDT].next;
for (i = 0; i < acpi_gbl_acpi_tables[ACPI_TABLE_SSDT].count; i++) { for (i = 0; i < acpi_gbl_table_lists[ACPI_TABLE_SSDT].count; i++) {
/* /*
* Only attempt to load table if it is not * Only attempt to load table if it is not
* already loaded! * already loaded!
...@@ -233,14 +231,14 @@ acpi_ns_load_table_by_type ( ...@@ -233,14 +231,14 @@ acpi_ns_load_table_by_type (
case ACPI_TABLE_PSDT: case ACPI_TABLE_PSDT:
ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Loading %d PSDTs\n", ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Loading %d PSDTs\n",
acpi_gbl_acpi_tables[ACPI_TABLE_PSDT].count)); acpi_gbl_table_lists[ACPI_TABLE_PSDT].count));
/* /*
* Traverse list of PSDT tables * Traverse list of PSDT tables
*/ */
table_desc = &acpi_gbl_acpi_tables[ACPI_TABLE_PSDT]; table_desc = acpi_gbl_table_lists[ACPI_TABLE_PSDT].next;
for (i = 0; i < acpi_gbl_acpi_tables[ACPI_TABLE_PSDT].count; i++) { for (i = 0; i < acpi_gbl_table_lists[ACPI_TABLE_PSDT].count; i++) {
/* Only attempt to load table if it is not already loaded! */ /* Only attempt to load table if it is not already loaded! */
if (!table_desc->loaded_into_namespace) { if (!table_desc->loaded_into_namespace) {
......
...@@ -85,10 +85,9 @@ acpi_ns_one_complete_parse ( ...@@ -85,10 +85,9 @@ acpi_ns_one_complete_parse (
return_ACPI_STATUS (AE_NO_MEMORY); return_ACPI_STATUS (AE_NO_MEMORY);
} }
/* Create and initialize a new walk state */ /* Create and initialize a new walk state */
walk_state = acpi_ds_create_walk_state (TABLE_ID_DSDT, walk_state = acpi_ds_create_walk_state (table_desc->table_id,
NULL, NULL, NULL); NULL, NULL, NULL);
if (!walk_state) { if (!walk_state) {
acpi_ps_free_op (parse_root); acpi_ps_free_op (parse_root);
......
...@@ -117,8 +117,9 @@ acpi_ns_search_node ( ...@@ -117,8 +117,9 @@ acpi_ns_search_node (
* Found matching entry. * Found matching entry.
*/ */
ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, ACPI_DEBUG_PRINT ((ACPI_DB_NAMES,
"Name %4.4s Type [%s] found at %p\n", "Name %4.4s Type [%s] found in scope [%4.4s] %p\n",
(char *) &target_name, acpi_ut_get_type_name (next_node->type), next_node)); (char *) &target_name, acpi_ut_get_type_name (next_node->type),
next_node->name.ascii, next_node));
*return_node = next_node; *return_node = next_node;
return_ACPI_STATUS (AE_OK); return_ACPI_STATUS (AE_OK);
...@@ -141,8 +142,10 @@ acpi_ns_search_node ( ...@@ -141,8 +142,10 @@ acpi_ns_search_node (
/* Searched entire namespace level, not found */ /* Searched entire namespace level, not found */
ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "Name %4.4s Type [%s] not found at %p\n", ACPI_DEBUG_PRINT ((ACPI_DB_NAMES,
(char *) &target_name, acpi_ut_get_type_name (type), next_node)); "Name %4.4s Type [%s] not found in search in scope [%4.4s] %p first child %p\n",
(char *) &target_name, acpi_ut_get_type_name (type),
node->name.ascii, node, node->child));
return_ACPI_STATUS (AE_NOT_FOUND); return_ACPI_STATUS (AE_NOT_FOUND);
} }
......
...@@ -181,7 +181,11 @@ acpi_ns_print_node_pathname ( ...@@ -181,7 +181,11 @@ acpi_ns_print_node_pathname (
status = acpi_ns_handle_to_pathname (node, &buffer); status = acpi_ns_handle_to_pathname (node, &buffer);
if (ACPI_SUCCESS (status)) { if (ACPI_SUCCESS (status)) {
acpi_os_printf ("%s [%s] (Node %p)", msg, (char *) buffer.pointer, node); if (msg) {
acpi_os_printf ("%s ", msg);
}
acpi_os_printf ("[%s] (Node %p)", (char *) buffer.pointer, node);
ACPI_MEM_FREE (buffer.pointer); ACPI_MEM_FREE (buffer.pointer);
} }
} }
...@@ -799,38 +803,31 @@ void ...@@ -799,38 +803,31 @@ void
acpi_ns_terminate (void) acpi_ns_terminate (void)
{ {
union acpi_operand_object *obj_desc; union acpi_operand_object *obj_desc;
struct acpi_namespace_node *this_node;
ACPI_FUNCTION_TRACE ("ns_terminate"); ACPI_FUNCTION_TRACE ("ns_terminate");
this_node = acpi_gbl_root_node;
/* /*
* 1) Free the entire namespace -- all objects, tables, and stacks * 1) Free the entire namespace -- all nodes and objects
* *
* Delete all objects linked to the root * Delete all object descriptors attached to namepsace nodes
* (additional table descriptors)
*/ */
acpi_ns_delete_namespace_subtree (this_node); acpi_ns_delete_namespace_subtree (acpi_gbl_root_node);
/* Detach any object(s) attached to the root */ /* Detach any objects attached to the root */
obj_desc = acpi_ns_get_attached_object (this_node); obj_desc = acpi_ns_get_attached_object (acpi_gbl_root_node);
if (obj_desc) { if (obj_desc) {
acpi_ns_detach_object (this_node); acpi_ns_detach_object (acpi_gbl_root_node);
acpi_ut_remove_reference (obj_desc);
} }
acpi_ns_delete_children (this_node);
ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Namespace freed\n")); ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Namespace freed\n"));
/* /*
* 2) Now we can delete the ACPI tables * 2) Now we can delete the ACPI tables
*/ */
acpi_tb_delete_acpi_tables (); acpi_tb_delete_all_tables ();
ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "ACPI Tables freed\n")); ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "ACPI Tables freed\n"));
return_VOID; return_VOID;
......
...@@ -437,16 +437,15 @@ acpi_ns_get_device_callback ( ...@@ -437,16 +437,15 @@ acpi_ns_get_device_callback (
void *context, void *context,
void **return_value) void **return_value)
{ {
struct acpi_get_devices_info *info = context;
acpi_status status; acpi_status status;
struct acpi_namespace_node *node; struct acpi_namespace_node *node;
u32 flags; u32 flags;
struct acpi_device_id hid; struct acpi_device_id hid;
struct acpi_device_id cid; struct acpi_compatible_id_list *cid;
struct acpi_get_devices_info *info; acpi_native_uint i;
info = context;
status = acpi_ut_acquire_mutex (ACPI_MTX_NAMESPACE); status = acpi_ut_acquire_mutex (ACPI_MTX_NAMESPACE);
if (ACPI_FAILURE (status)) { if (ACPI_FAILURE (status)) {
return (status); return (status);
...@@ -462,9 +461,8 @@ acpi_ns_get_device_callback ( ...@@ -462,9 +461,8 @@ acpi_ns_get_device_callback (
return (AE_BAD_PARAMETER); return (AE_BAD_PARAMETER);
} }
/* /* Run _STA to determine if device is present */
* Run _STA to determine if device is present
*/
status = acpi_ut_execute_STA (node, &flags); status = acpi_ut_execute_STA (node, &flags);
if (ACPI_FAILURE (status)) { if (ACPI_FAILURE (status)) {
return (AE_CTRL_DEPTH); return (AE_CTRL_DEPTH);
...@@ -472,12 +470,12 @@ acpi_ns_get_device_callback ( ...@@ -472,12 +470,12 @@ acpi_ns_get_device_callback (
if (!(flags & 0x01)) { if (!(flags & 0x01)) {
/* Don't return at the device or children of the device if not there */ /* Don't return at the device or children of the device if not there */
return (AE_CTRL_DEPTH); return (AE_CTRL_DEPTH);
} }
/* /* Filter based on device HID & CID */
* Filter based on device HID & CID
*/
if (info->hid != NULL) { if (info->hid != NULL) {
status = acpi_ut_execute_HID (node, &hid); status = acpi_ut_execute_HID (node, &hid);
if (status == AE_NOT_FOUND) { if (status == AE_NOT_FOUND) {
...@@ -487,7 +485,9 @@ acpi_ns_get_device_callback ( ...@@ -487,7 +485,9 @@ acpi_ns_get_device_callback (
return (AE_CTRL_DEPTH); return (AE_CTRL_DEPTH);
} }
if (ACPI_STRNCMP (hid.buffer, info->hid, sizeof (hid.buffer)) != 0) { if (ACPI_STRNCMP (hid.value, info->hid, sizeof (hid.value)) != 0) {
/* Get the list of Compatible IDs */
status = acpi_ut_execute_CID (node, &cid); status = acpi_ut_execute_CID (node, &cid);
if (status == AE_NOT_FOUND) { if (status == AE_NOT_FOUND) {
return (AE_OK); return (AE_OK);
...@@ -496,12 +496,17 @@ acpi_ns_get_device_callback ( ...@@ -496,12 +496,17 @@ acpi_ns_get_device_callback (
return (AE_CTRL_DEPTH); return (AE_CTRL_DEPTH);
} }
/* TBD: Handle CID packages */ /* Walk the CID list */
if (ACPI_STRNCMP (cid.buffer, info->hid, sizeof (cid.buffer)) != 0) { for (i = 0; i < cid->count; i++) {
if (ACPI_STRNCMP (cid->id[i].value, info->hid,
sizeof (struct acpi_compatible_id)) != 0) {
ACPI_MEM_FREE (cid);
return (AE_OK); return (AE_OK);
} }
} }
ACPI_MEM_FREE (cid);
}
} }
status = info->user_function (obj_handle, nesting_level, info->context, return_value); status = info->user_function (obj_handle, nesting_level, info->context, return_value);
......
...@@ -51,7 +51,7 @@ ...@@ -51,7 +51,7 @@
ACPI_MODULE_NAME ("nsxfname") ACPI_MODULE_NAME ("nsxfname")
/**************************************************************************** /******************************************************************************
* *
* FUNCTION: acpi_get_handle * FUNCTION: acpi_get_handle
* *
...@@ -119,7 +119,8 @@ acpi_get_handle ( ...@@ -119,7 +119,8 @@ acpi_get_handle (
/* /*
* Find the Node and convert to a handle * Find the Node and convert to a handle
*/ */
status = acpi_ns_get_node_by_path (pathname, prefix_node, ACPI_NS_NO_UPSEARCH, &node); status = acpi_ns_get_node_by_path (pathname, prefix_node, ACPI_NS_NO_UPSEARCH,
&node);
*ret_handle = NULL; *ret_handle = NULL;
if (ACPI_SUCCESS (status)) { if (ACPI_SUCCESS (status)) {
...@@ -130,7 +131,7 @@ acpi_get_handle ( ...@@ -130,7 +131,7 @@ acpi_get_handle (
} }
/**************************************************************************** /******************************************************************************
* *
* FUNCTION: acpi_get_name * FUNCTION: acpi_get_name
* *
...@@ -211,7 +212,7 @@ acpi_get_name ( ...@@ -211,7 +212,7 @@ acpi_get_name (
} }
/**************************************************************************** /******************************************************************************
* *
* FUNCTION: acpi_get_object_info * FUNCTION: acpi_get_object_info
* *
...@@ -229,22 +230,27 @@ acpi_get_name ( ...@@ -229,22 +230,27 @@ acpi_get_name (
acpi_status acpi_status
acpi_get_object_info ( acpi_get_object_info (
acpi_handle handle, acpi_handle handle,
struct acpi_device_info *info) struct acpi_buffer *buffer)
{ {
struct acpi_device_id hid;
struct acpi_device_id uid;
acpi_status status; acpi_status status;
u32 device_status = 0;
acpi_integer address = 0;
struct acpi_namespace_node *node; struct acpi_namespace_node *node;
struct acpi_device_info info;
struct acpi_device_info *return_info;
struct acpi_compatible_id_list *cid_list = NULL;
acpi_size size;
/* Parameter validation */ /* Parameter validation */
if (!handle || !info) { if (!handle || !buffer) {
return (AE_BAD_PARAMETER); return (AE_BAD_PARAMETER);
} }
status = acpi_ut_validate_buffer (buffer);
if (ACPI_FAILURE (status)) {
return (status);
}
status = acpi_ut_acquire_mutex (ACPI_MTX_NAMESPACE); status = acpi_ut_acquire_mutex (ACPI_MTX_NAMESPACE);
if (ACPI_FAILURE (status)) { if (ACPI_FAILURE (status)) {
return (status); return (status);
...@@ -256,69 +262,94 @@ acpi_get_object_info ( ...@@ -256,69 +262,94 @@ acpi_get_object_info (
return (AE_BAD_PARAMETER); return (AE_BAD_PARAMETER);
} }
info->type = node->type; /* Init return structure */
info->name = node->name.integer;
size = sizeof (struct acpi_device_info);
ACPI_MEMSET (&info, 0, size);
info.type = node->type;
info.name = node->name.integer;
info.valid = 0;
status = acpi_ut_release_mutex (ACPI_MTX_NAMESPACE); status = acpi_ut_release_mutex (ACPI_MTX_NAMESPACE);
if (ACPI_FAILURE (status)) { if (ACPI_FAILURE (status)) {
return (status); return (status);
} }
/* If not a device, we are all done */
if (info.type == ACPI_TYPE_DEVICE) {
/* /*
* If not a device, we are all done. * Get extra info for ACPI Devices objects only:
* Run the Device _HID, _UID, _CID, _STA, and _ADR methods.
*
* Note: none of these methods are required, so they may or may
* not be present for this device. The Info.Valid bitfield is used
* to indicate which methods were found and ran successfully.
*/ */
if (info->type != ACPI_TYPE_DEVICE) {
return (AE_OK);
}
/* Execute the Device._HID method */
/* status = acpi_ut_execute_HID (node, &info.hardware_id);
* Get extra info for ACPI devices only. Run the if (ACPI_SUCCESS (status)) {
* _HID, _UID, _STA, and _ADR methods. Note: none info.valid |= ACPI_VALID_HID;
* of these methods are required, so they may or may }
* not be present. The Info->Valid bits are used
* to indicate which methods ran successfully.
*/
info->valid = 0;
/* Execute the _HID method and save the result */ /* Execute the Device._UID method */
status = acpi_ut_execute_HID (node, &hid); status = acpi_ut_execute_UID (node, &info.unique_id);
if (ACPI_SUCCESS (status)) { if (ACPI_SUCCESS (status)) {
ACPI_STRNCPY (info->hardware_id, hid.buffer, sizeof(info->hardware_id)); info.valid |= ACPI_VALID_UID;
info->valid |= ACPI_VALID_HID;
} }
/* Execute the _UID method and save the result */ /* Execute the Device._CID method */
status = acpi_ut_execute_UID (node, &uid); status = acpi_ut_execute_CID (node, &cid_list);
if (ACPI_SUCCESS (status)) { if (ACPI_SUCCESS (status)) {
ACPI_STRCPY (info->unique_id, uid.buffer); size += ((acpi_size) cid_list->count - 1) *
info->valid |= ACPI_VALID_UID; sizeof (struct acpi_compatible_id);
info.valid |= ACPI_VALID_CID;
} }
/* /* Execute the Device._STA method */
* Execute the _STA method and save the result
* _STA is not always present status = acpi_ut_execute_STA (node, &info.current_status);
*/
status = acpi_ut_execute_STA (node, &device_status);
if (ACPI_SUCCESS (status)) { if (ACPI_SUCCESS (status)) {
info->current_status = device_status; info.valid |= ACPI_VALID_STA;
info->valid |= ACPI_VALID_STA;
} }
/* /* Execute the Device._ADR method */
* Execute the _ADR method and save result if successful
* _ADR is not always present
*/
status = acpi_ut_evaluate_numeric_object (METHOD_NAME__ADR,
node, &address);
status = acpi_ut_evaluate_numeric_object (METHOD_NAME__ADR, node,
&info.address);
if (ACPI_SUCCESS (status)) { if (ACPI_SUCCESS (status)) {
info->address = address; info.valid |= ACPI_VALID_ADR;
info->valid |= ACPI_VALID_ADR;
} }
return (AE_OK); status = AE_OK;
}
/* Validate/Allocate/Clear caller buffer */
status = acpi_ut_initialize_buffer (buffer, size);
if (ACPI_FAILURE (status)) {
goto cleanup;
}
/* Populate the return buffer */
return_info = buffer->pointer;
ACPI_MEMCPY (return_info, &info, sizeof (struct acpi_device_info));
if (cid_list) {
ACPI_MEMCPY (&return_info->compatibility_id, cid_list, cid_list->size);
}
cleanup:
if (cid_list) {
ACPI_MEM_FREE (cid_list);
}
return (status);
} }
...@@ -237,7 +237,7 @@ acpi_os_table_override (struct acpi_table_header *existing_table, ...@@ -237,7 +237,7 @@ acpi_os_table_override (struct acpi_table_header *existing_table,
static irqreturn_t static irqreturn_t
acpi_irq(int irq, void *dev_id, struct pt_regs *regs) acpi_irq(int irq, void *dev_id, struct pt_regs *regs)
{ {
return (*acpi_irq_handler)(acpi_irq_context); return (*acpi_irq_handler)(acpi_irq_context) ? IRQ_HANDLED : IRQ_NONE;
} }
acpi_status acpi_status
...@@ -1006,7 +1006,7 @@ acpi_os_name_setup(char *str) ...@@ -1006,7 +1006,7 @@ acpi_os_name_setup(char *str)
return 0; return 0;
for (; count-- && str && *str; str++) { for (; count-- && str && *str; str++) {
if (isalnum(*str) || *str == ' ') if (isalnum(*str) || *str == ' ' || *str == ':')
*p++ = *str; *p++ = *str;
else if (*str == '\'' || *str == '"') else if (*str == '\'' || *str == '"')
continue; continue;
......
...@@ -350,6 +350,11 @@ acpi_ps_get_next_namepath ( ...@@ -350,6 +350,11 @@ acpi_ps_get_next_namepath (
(status != AE_NOT_FOUND)) { (status != AE_NOT_FOUND)) {
ACPI_REPORT_NSERROR (path, status); ACPI_REPORT_NSERROR (path, status);
acpi_os_printf ("search_node %p start_node %p return_node %p\n",
scope_info.scope.node, parser_state->start_node, node);
} }
else { else {
/* /*
......
...@@ -270,7 +270,7 @@ acpi_ps_delete_parse_tree ( ...@@ -270,7 +270,7 @@ acpi_ps_delete_parse_tree (
return_VOID; return_VOID;
} }
walk_state = acpi_ds_create_walk_state (TABLE_ID_DSDT, NULL, NULL, thread); walk_state = acpi_ds_create_walk_state (0, NULL, NULL, thread);
if (!walk_state) { if (!walk_state) {
return_VOID; return_VOID;
} }
......
...@@ -178,7 +178,7 @@ acpi_psx_execute ( ...@@ -178,7 +178,7 @@ acpi_psx_execute (
/* Create and initialize a new walk state */ /* Create and initialize a new walk state */
walk_state = acpi_ds_create_walk_state (TABLE_ID_DSDT, NULL, NULL, NULL); walk_state = acpi_ds_create_walk_state (0, NULL, NULL, NULL);
if (!walk_state) { if (!walk_state) {
return_ACPI_STATUS (AE_NO_MEMORY); return_ACPI_STATUS (AE_NO_MEMORY);
} }
......
...@@ -379,25 +379,31 @@ acpi_resource_to_address64 ( ...@@ -379,25 +379,31 @@ acpi_resource_to_address64 (
{ {
struct acpi_resource_address16 *address16; struct acpi_resource_address16 *address16;
struct acpi_resource_address32 *address32; struct acpi_resource_address32 *address32;
struct acpi_resource_address64 *address64;
switch (resource->id) { switch (resource->id) {
case ACPI_RSTYPE_ADDRESS16: case ACPI_RSTYPE_ADDRESS16:
address16 = (struct acpi_resource_address16 *) &resource->data; address16 = (struct acpi_resource_address16 *) &resource->data;
ACPI_COPY_ADDRESS(out, address16); ACPI_COPY_ADDRESS(out, address16);
break; break;
case ACPI_RSTYPE_ADDRESS32: case ACPI_RSTYPE_ADDRESS32:
address32 = (struct acpi_resource_address32 *) &resource->data; address32 = (struct acpi_resource_address32 *) &resource->data;
ACPI_COPY_ADDRESS(out, address32); ACPI_COPY_ADDRESS(out, address32);
break; break;
case ACPI_RSTYPE_ADDRESS64: case ACPI_RSTYPE_ADDRESS64:
address64 = (struct acpi_resource_address64 *) &resource->data;
ACPI_COPY_ADDRESS(out, address64); /* Simple copy for 64 bit source */
ACPI_MEMCPY (out, &resource->data, sizeof (struct acpi_resource_address64));
break; break;
default: default:
return (AE_BAD_PARAMETER); return (AE_BAD_PARAMETER);
} }
......
...@@ -28,6 +28,8 @@ static spinlock_t acpi_device_lock = SPIN_LOCK_UNLOCKED; ...@@ -28,6 +28,8 @@ static spinlock_t acpi_device_lock = SPIN_LOCK_UNLOCKED;
static void acpi_device_release(struct kobject * kobj) static void acpi_device_release(struct kobject * kobj)
{ {
struct acpi_device * dev = container_of(kobj,struct acpi_device,kobj); struct acpi_device * dev = container_of(kobj,struct acpi_device,kobj);
if (dev->pnp.cid_list)
kfree(dev->pnp.cid_list);
kfree(dev); kfree(dev);
} }
...@@ -69,7 +71,7 @@ static void acpi_device_register(struct acpi_device * device, struct acpi_device ...@@ -69,7 +71,7 @@ static void acpi_device_register(struct acpi_device * device, struct acpi_device
device->kobj.parent = &parent->kobj; device->kobj.parent = &parent->kobj;
device->kobj.ktype = &ktype_acpi_ns; device->kobj.ktype = &ktype_acpi_ns;
device->kobj.kset = &acpi_namespace_kset; device->kobj.kset = &acpi_namespace_kset;
kobject_register(&device->kobj); kobject_add(&device->kobj);
} }
static int static int
...@@ -201,33 +203,16 @@ acpi_bus_match ( ...@@ -201,33 +203,16 @@ acpi_bus_match (
goto Done; goto Done;
if (device->flags.compatible_ids) { if (device->flags.compatible_ids) {
acpi_status status = AE_OK; struct acpi_compatible_id_list *cid_list = device->pnp.cid_list;
union acpi_object *object = NULL; int i;
char cid[256] = {};
status = acpi_evaluate_object(device->handle, "_CID", NULL,
&buffer);
if (ACPI_FAILURE(status) || !buffer.pointer)
return -ENOENT;
object = (union acpi_object *) buffer.pointer;
switch (object->type) {
case ACPI_TYPE_INTEGER:
acpi_ex_eisa_id_to_string((u32) object->integer.value,
cid);
break;
case ACPI_TYPE_STRING:
strncpy(cid, object->string.pointer, sizeof(cid) - 1);
break;
case ACPI_TYPE_PACKAGE:
/* TBD: Support CID packages */
break;
}
if (strlen(cid) && strstr(driver->ids,cid)) /* compare multiple _CID entries against driver ids */
for (i = 0; i < cid_list->count; i++)
{
if (strstr(driver->ids, cid_list->id[i].value))
goto Done; goto Done;
} }
}
error = -ENOENT; error = -ENOENT;
Done: Done:
...@@ -523,27 +508,30 @@ static void acpi_device_get_busid(struct acpi_device * device, acpi_handle handl ...@@ -523,27 +508,30 @@ static void acpi_device_get_busid(struct acpi_device * device, acpi_handle handl
static void acpi_device_set_id(struct acpi_device * device, struct acpi_device * parent, static void acpi_device_set_id(struct acpi_device * device, struct acpi_device * parent,
acpi_handle handle, int type) acpi_handle handle, int type)
{ {
struct acpi_device_info info; struct acpi_device_info *info;
struct acpi_buffer buffer = {ACPI_ALLOCATE_BUFFER, NULL};
char *hid = NULL; char *hid = NULL;
char *uid = NULL; char *uid = NULL;
struct acpi_compatible_id_list *cid_list = NULL;
acpi_status status; acpi_status status;
switch (type) { switch (type) {
case ACPI_BUS_TYPE_DEVICE: case ACPI_BUS_TYPE_DEVICE:
status = acpi_get_object_info(handle, &info); status = acpi_get_object_info(handle, &buffer);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
printk("%s: Error reading device info\n",__FUNCTION__); printk("%s: Error reading device info\n",__FUNCTION__);
return; return;
} }
/* Clean up info strings (not NULL terminated) */
info.hardware_id[sizeof(info.hardware_id)-1] = '\0'; info = buffer.pointer;
info.unique_id[sizeof(info.unique_id)-1] = '\0'; if (info->valid & ACPI_VALID_HID)
if (info.valid & ACPI_VALID_HID) hid = info->hardware_id.value;
hid = info.hardware_id; if (info->valid & ACPI_VALID_UID)
if (info.valid & ACPI_VALID_UID) uid = info->unique_id.value;
uid = info.unique_id; if (info->valid & ACPI_VALID_CID)
if (info.valid & ACPI_VALID_ADR) { cid_list = &info->compatibility_id;
device->pnp.bus_address = info.address; if (info->valid & ACPI_VALID_ADR) {
device->pnp.bus_address = info->address;
device->flags.bus_address = 1; device->flags.bus_address = 1;
} }
break; break;
...@@ -586,6 +574,15 @@ static void acpi_device_set_id(struct acpi_device * device, struct acpi_device * ...@@ -586,6 +574,15 @@ static void acpi_device_set_id(struct acpi_device * device, struct acpi_device *
sprintf(device->pnp.unique_id, "%s", uid); sprintf(device->pnp.unique_id, "%s", uid);
device->flags.unique_id = 1; device->flags.unique_id = 1;
} }
if (cid_list) {
device->pnp.cid_list = kmalloc(cid_list->size, GFP_KERNEL);
if (device->pnp.cid_list)
memcpy(device->pnp.cid_list, cid_list, cid_list->size);
else
printk(KERN_ERR "Memory allocation error\n");
}
acpi_os_free(buffer.pointer);
} }
int acpi_device_set_context(struct acpi_device * device, int type) int acpi_device_set_context(struct acpi_device * device, int type)
...@@ -781,8 +778,12 @@ acpi_bus_add ( ...@@ -781,8 +778,12 @@ acpi_bus_add (
end: end:
if (!result) if (!result)
*child = device; *child = device;
else else {
if (device->pnp.cid_list)
kfree(device->pnp.cid_list);
kfree(device); kfree(device);
}
return_VALUE(result); return_VALUE(result);
} }
......
...@@ -164,6 +164,36 @@ acpi_tb_convert_to_xsdt ( ...@@ -164,6 +164,36 @@ acpi_tb_convert_to_xsdt (
} }
/******************************************************************************
*
* FUNCTION: acpi_tb_init_generic_address
*
* PARAMETERS: new_gas_struct - GAS struct to be initialized
* register_bit_width - Width of this register
* Address - Address of the register
*
* RETURN: None
*
* DESCRIPTION: Initialize a GAS structure.
*
******************************************************************************/
static void
acpi_tb_init_generic_address (
struct acpi_generic_address *new_gas_struct,
u8 register_bit_width,
acpi_physical_address address)
{
ACPI_STORE_ADDRESS (new_gas_struct->address, address);
new_gas_struct->address_space_id = ACPI_ADR_SPACE_SYSTEM_IO;
new_gas_struct->register_bit_width = register_bit_width;
new_gas_struct->register_bit_offset = 0;
new_gas_struct->reserved = 0;
}
/******************************************************************************* /*******************************************************************************
* *
* FUNCTION: acpi_tb_convert_fadt1 * FUNCTION: acpi_tb_convert_fadt1
...@@ -233,14 +263,34 @@ acpi_tb_convert_fadt1 ( ...@@ -233,14 +263,34 @@ acpi_tb_convert_fadt1 (
/* /*
* Convert the V1.0 block addresses to V2.0 GAS structures * Convert the V1.0 block addresses to V2.0 GAS structures
*/ */
ASL_BUILD_GAS_FROM_V1_ENTRY (local_fadt->xpm1a_evt_blk, local_fadt->pm1_evt_len, local_fadt->V1_pm1a_evt_blk); acpi_tb_init_generic_address (&local_fadt->xpm1a_evt_blk, local_fadt->pm1_evt_len,
ASL_BUILD_GAS_FROM_V1_ENTRY (local_fadt->xpm1b_evt_blk, local_fadt->pm1_evt_len, local_fadt->V1_pm1b_evt_blk); (acpi_physical_address) local_fadt->V1_pm1a_evt_blk);
ASL_BUILD_GAS_FROM_V1_ENTRY (local_fadt->xpm1a_cnt_blk, local_fadt->pm1_cnt_len, local_fadt->V1_pm1a_cnt_blk); acpi_tb_init_generic_address (&local_fadt->xpm1b_evt_blk, local_fadt->pm1_evt_len,
ASL_BUILD_GAS_FROM_V1_ENTRY (local_fadt->xpm1b_cnt_blk, local_fadt->pm1_cnt_len, local_fadt->V1_pm1b_cnt_blk); (acpi_physical_address) local_fadt->V1_pm1b_evt_blk);
ASL_BUILD_GAS_FROM_V1_ENTRY (local_fadt->xpm2_cnt_blk, local_fadt->pm2_cnt_len, local_fadt->V1_pm2_cnt_blk); acpi_tb_init_generic_address (&local_fadt->xpm1a_cnt_blk, local_fadt->pm1_cnt_len,
ASL_BUILD_GAS_FROM_V1_ENTRY (local_fadt->xpm_tmr_blk, local_fadt->pm_tm_len, local_fadt->V1_pm_tmr_blk); (acpi_physical_address) local_fadt->V1_pm1a_cnt_blk);
ASL_BUILD_GAS_FROM_V1_ENTRY (local_fadt->xgpe0_blk, 0, local_fadt->V1_gpe0_blk); acpi_tb_init_generic_address (&local_fadt->xpm1b_cnt_blk, local_fadt->pm1_cnt_len,
ASL_BUILD_GAS_FROM_V1_ENTRY (local_fadt->xgpe1_blk, 0, local_fadt->V1_gpe1_blk); (acpi_physical_address) local_fadt->V1_pm1b_cnt_blk);
acpi_tb_init_generic_address (&local_fadt->xpm2_cnt_blk, local_fadt->pm2_cnt_len,
(acpi_physical_address) local_fadt->V1_pm2_cnt_blk);
acpi_tb_init_generic_address (&local_fadt->xpm_tmr_blk, local_fadt->pm_tm_len,
(acpi_physical_address) local_fadt->V1_pm_tmr_blk);
acpi_tb_init_generic_address (&local_fadt->xgpe0_blk, 0,
(acpi_physical_address) local_fadt->V1_gpe0_blk);
acpi_tb_init_generic_address (&local_fadt->xgpe1_blk, 0,
(acpi_physical_address) local_fadt->V1_gpe1_blk);
/* Create separate GAS structs for the PM1 Enable registers */
acpi_tb_init_generic_address (&acpi_gbl_xpm1a_enable,
(u8) ACPI_DIV_2 (acpi_gbl_FADT->pm1_evt_len),
(acpi_physical_address) (local_fadt->xpm1a_evt_blk.address +
ACPI_DIV_2 (acpi_gbl_FADT->pm1_evt_len)));
acpi_tb_init_generic_address (&acpi_gbl_xpm1b_enable,
(u8) ACPI_DIV_2 (acpi_gbl_FADT->pm1_evt_len),
(acpi_physical_address) (local_fadt->xpm1b_evt_blk.address +
ACPI_DIV_2 (acpi_gbl_FADT->pm1_evt_len)));
} }
...@@ -282,44 +332,58 @@ acpi_tb_convert_fadt2 ( ...@@ -282,44 +332,58 @@ acpi_tb_convert_fadt2 (
} }
if (!(local_fadt->xpm1a_evt_blk.address)) { if (!(local_fadt->xpm1a_evt_blk.address)) {
ASL_BUILD_GAS_FROM_V1_ENTRY (local_fadt->xpm1a_evt_blk, acpi_tb_init_generic_address (&local_fadt->xpm1a_evt_blk,
local_fadt->pm1_evt_len, local_fadt->V1_pm1a_evt_blk); local_fadt->pm1_evt_len, (acpi_physical_address) local_fadt->V1_pm1a_evt_blk);
} }
if (!(local_fadt->xpm1b_evt_blk.address)) { if (!(local_fadt->xpm1b_evt_blk.address)) {
ASL_BUILD_GAS_FROM_V1_ENTRY (local_fadt->xpm1b_evt_blk, acpi_tb_init_generic_address (&local_fadt->xpm1b_evt_blk,
local_fadt->pm1_evt_len, local_fadt->V1_pm1b_evt_blk); local_fadt->pm1_evt_len, (acpi_physical_address) local_fadt->V1_pm1b_evt_blk);
} }
if (!(local_fadt->xpm1a_cnt_blk.address)) { if (!(local_fadt->xpm1a_cnt_blk.address)) {
ASL_BUILD_GAS_FROM_V1_ENTRY (local_fadt->xpm1a_cnt_blk, acpi_tb_init_generic_address (&local_fadt->xpm1a_cnt_blk,
local_fadt->pm1_cnt_len, local_fadt->V1_pm1a_cnt_blk); local_fadt->pm1_cnt_len, (acpi_physical_address) local_fadt->V1_pm1a_cnt_blk);
} }
if (!(local_fadt->xpm1b_cnt_blk.address)) { if (!(local_fadt->xpm1b_cnt_blk.address)) {
ASL_BUILD_GAS_FROM_V1_ENTRY (local_fadt->xpm1b_cnt_blk, acpi_tb_init_generic_address (&local_fadt->xpm1b_cnt_blk,
local_fadt->pm1_cnt_len, local_fadt->V1_pm1b_cnt_blk); local_fadt->pm1_cnt_len, (acpi_physical_address) local_fadt->V1_pm1b_cnt_blk);
} }
if (!(local_fadt->xpm2_cnt_blk.address)) { if (!(local_fadt->xpm2_cnt_blk.address)) {
ASL_BUILD_GAS_FROM_V1_ENTRY (local_fadt->xpm2_cnt_blk, acpi_tb_init_generic_address (&local_fadt->xpm2_cnt_blk,
local_fadt->pm2_cnt_len, local_fadt->V1_pm2_cnt_blk); local_fadt->pm2_cnt_len, (acpi_physical_address) local_fadt->V1_pm2_cnt_blk);
} }
if (!(local_fadt->xpm_tmr_blk.address)) { if (!(local_fadt->xpm_tmr_blk.address)) {
ASL_BUILD_GAS_FROM_V1_ENTRY (local_fadt->xpm_tmr_blk, acpi_tb_init_generic_address (&local_fadt->xpm_tmr_blk,
local_fadt->pm_tm_len, local_fadt->V1_pm_tmr_blk); local_fadt->pm_tm_len, (acpi_physical_address) local_fadt->V1_pm_tmr_blk);
} }
if (!(local_fadt->xgpe0_blk.address)) { if (!(local_fadt->xgpe0_blk.address)) {
ASL_BUILD_GAS_FROM_V1_ENTRY (local_fadt->xgpe0_blk, acpi_tb_init_generic_address (&local_fadt->xgpe0_blk,
0, local_fadt->V1_gpe0_blk); 0, (acpi_physical_address) local_fadt->V1_gpe0_blk);
} }
if (!(local_fadt->xgpe1_blk.address)) { if (!(local_fadt->xgpe1_blk.address)) {
ASL_BUILD_GAS_FROM_V1_ENTRY (local_fadt->xgpe1_blk, acpi_tb_init_generic_address (&local_fadt->xgpe1_blk,
0, local_fadt->V1_gpe1_blk); 0, (acpi_physical_address) local_fadt->V1_gpe1_blk);
} }
/* Create separate GAS structs for the PM1 Enable registers */
acpi_tb_init_generic_address (&acpi_gbl_xpm1a_enable,
(u8) ACPI_DIV_2 (acpi_gbl_FADT->pm1_evt_len),
(acpi_physical_address) (local_fadt->xpm1a_evt_blk.address +
ACPI_DIV_2 (acpi_gbl_FADT->pm1_evt_len)));
acpi_gbl_xpm1a_enable.address_space_id = local_fadt->xpm1a_evt_blk.address_space_id;
acpi_tb_init_generic_address (&acpi_gbl_xpm1b_enable,
(u8) ACPI_DIV_2 (acpi_gbl_FADT->pm1_evt_len),
(acpi_physical_address) (local_fadt->xpm1b_evt_blk.address +
ACPI_DIV_2 (acpi_gbl_FADT->pm1_evt_len)));
acpi_gbl_xpm1b_enable.address_space_id = local_fadt->xpm1b_evt_blk.address_space_id;
} }
...@@ -396,7 +460,7 @@ acpi_tb_convert_table_fadt (void) ...@@ -396,7 +460,7 @@ acpi_tb_convert_table_fadt (void)
/* Free the original table */ /* Free the original table */
table_desc = &acpi_gbl_acpi_tables[ACPI_TABLE_FADT]; table_desc = acpi_gbl_table_lists[ACPI_TABLE_FADT].next;
acpi_tb_delete_single_table (table_desc); acpi_tb_delete_single_table (table_desc);
/* Install the new table */ /* Install the new table */
......
...@@ -456,18 +456,18 @@ acpi_tb_get_table_ptr ( ...@@ -456,18 +456,18 @@ acpi_tb_get_table_ptr (
* instance is always in the list head. * instance is always in the list head.
*/ */
if (instance == 1) { if (instance == 1) {
/* /* Get the first */
* Just pluck the pointer out of the global table!
* Will be null if no table is present if (acpi_gbl_table_lists[table_type].next) {
*/ *table_ptr_loc = acpi_gbl_table_lists[table_type].next->pointer;
*table_ptr_loc = acpi_gbl_acpi_tables[table_type].pointer; }
return_ACPI_STATUS (AE_OK); return_ACPI_STATUS (AE_OK);
} }
/* /*
* Check for instance out of range * Check for instance out of range
*/ */
if (instance > acpi_gbl_acpi_tables[table_type].count) { if (instance > acpi_gbl_table_lists[table_type].count) {
return_ACPI_STATUS (AE_NOT_EXIST); return_ACPI_STATUS (AE_NOT_EXIST);
} }
...@@ -478,7 +478,7 @@ acpi_tb_get_table_ptr ( ...@@ -478,7 +478,7 @@ acpi_tb_get_table_ptr (
* need to walk from the 2nd table until we reach the Instance * need to walk from the 2nd table until we reach the Instance
* that the user is looking for and return its table pointer. * that the user is looking for and return its table pointer.
*/ */
table_desc = acpi_gbl_acpi_tables[table_type].next; table_desc = acpi_gbl_table_lists[table_type].next;
for (i = 2; i < instance; i++) { for (i = 2; i < instance; i++) {
table_desc = table_desc->next; table_desc = table_desc->next;
} }
......
...@@ -307,7 +307,7 @@ acpi_tb_get_required_tables ( ...@@ -307,7 +307,7 @@ acpi_tb_get_required_tables (
/* Always delete the RSDP mapping, we are done with it */ /* Always delete the RSDP mapping, we are done with it */
acpi_tb_delete_acpi_table (ACPI_TABLE_RSDP); acpi_tb_delete_tables_by_type (ACPI_TABLE_RSDP);
return_ACPI_STATUS (status); return_ACPI_STATUS (status);
} }
......
...@@ -79,13 +79,13 @@ acpi_tb_match_signature ( ...@@ -79,13 +79,13 @@ acpi_tb_match_signature (
/* /*
* Search for a signature match among the known table types * Search for a signature match among the known table types
*/ */
for (i = 0; i < NUM_ACPI_TABLES; i++) { for (i = 0; i < NUM_ACPI_TABLE_TYPES; i++) {
if (!(acpi_gbl_acpi_table_data[i].flags & search_type)) { if (!(acpi_gbl_table_data[i].flags & search_type)) {
continue; continue;
} }
if (!ACPI_STRNCMP (signature, acpi_gbl_acpi_table_data[i].signature, if (!ACPI_STRNCMP (signature, acpi_gbl_table_data[i].signature,
acpi_gbl_acpi_table_data[i].sig_length)) { acpi_gbl_table_data[i].sig_length)) {
/* Found a signature match, return index if requested */ /* Found a signature match, return index if requested */
if (table_info) { if (table_info) {
...@@ -94,7 +94,7 @@ acpi_tb_match_signature ( ...@@ -94,7 +94,7 @@ acpi_tb_match_signature (
ACPI_DEBUG_PRINT ((ACPI_DB_INFO, ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
"Table [%4.4s] is an ACPI table consumed by the core subsystem\n", "Table [%4.4s] is an ACPI table consumed by the core subsystem\n",
(char *) acpi_gbl_acpi_table_data[i].signature)); (char *) acpi_gbl_table_data[i].signature));
return_ACPI_STATUS (AE_OK); return_ACPI_STATUS (AE_OK);
} }
...@@ -149,7 +149,7 @@ acpi_tb_install_table ( ...@@ -149,7 +149,7 @@ acpi_tb_install_table (
} }
ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "%s located at %p\n", ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "%s located at %p\n",
acpi_gbl_acpi_table_data[table_info->type].name, table_info->pointer)); acpi_gbl_table_data[table_info->type].name, table_info->pointer));
(void) acpi_ut_release_mutex (ACPI_MTX_TABLES); (void) acpi_ut_release_mutex (ACPI_MTX_TABLES);
return_ACPI_STATUS (status); return_ACPI_STATUS (status);
...@@ -239,70 +239,58 @@ acpi_tb_init_table_descriptor ( ...@@ -239,70 +239,58 @@ acpi_tb_init_table_descriptor (
acpi_table_type table_type, acpi_table_type table_type,
struct acpi_table_desc *table_info) struct acpi_table_desc *table_info)
{ {
struct acpi_table_desc *list_head; struct acpi_table_list *list_head;
struct acpi_table_desc *table_desc; struct acpi_table_desc *table_desc;
ACPI_FUNCTION_TRACE_U32 ("tb_init_table_descriptor", table_type); ACPI_FUNCTION_TRACE_U32 ("tb_init_table_descriptor", table_type);
/* Allocate a descriptor for this table */
table_desc = ACPI_MEM_CALLOCATE (sizeof (struct acpi_table_desc));
if (!table_desc) {
return_ACPI_STATUS (AE_NO_MEMORY);
}
/* /*
* Install the table into the global data structure * Install the table into the global data structure
*/ */
list_head = &acpi_gbl_acpi_tables[table_type]; list_head = &acpi_gbl_table_lists[table_type];
table_desc = list_head;
/* /*
* Two major types of tables: 1) Only one instance is allowed. This * Two major types of tables: 1) Only one instance is allowed. This
* includes most ACPI tables such as the DSDT. 2) Multiple instances of * includes most ACPI tables such as the DSDT. 2) Multiple instances of
* the table are allowed. This includes SSDT and PSDTs. * the table are allowed. This includes SSDT and PSDTs.
*/ */
if (ACPI_IS_SINGLE_TABLE (acpi_gbl_acpi_table_data[table_type].flags)) { if (ACPI_IS_SINGLE_TABLE (acpi_gbl_table_data[table_type].flags)) {
/* /*
* Only one table allowed, and a table has alread been installed * Only one table allowed, and a table has alread been installed
* at this location, so return an error. * at this location, so return an error.
*/ */
if (list_head->pointer) { if (list_head->next) {
return_ACPI_STATUS (AE_ALREADY_EXISTS); return_ACPI_STATUS (AE_ALREADY_EXISTS);
} }
table_desc->count = 1;
table_desc->prev = NULL;
table_desc->next = NULL;
} }
else {
/* /*
* Multiple tables allowed for this table type, we must link * Link the new table in to the list of tables of this type.
* the new table in to the list of tables of this type. * Just insert at the start of the list, order unimportant.
*
* table_desc->Prev is already NULL from calloc()
*/ */
if (list_head->pointer) { table_desc->next = list_head->next;
table_desc = ACPI_MEM_CALLOCATE (sizeof (struct acpi_table_desc)); list_head->next = table_desc;
if (!table_desc) {
return_ACPI_STATUS (AE_NO_MEMORY); if (table_desc->next) {
table_desc->next->prev = table_desc;
} }
list_head->count++; list_head->count++;
/* Update the original previous */ /* Finish initialization of the table descriptor */
list_head->prev->next = table_desc;
/* Update new entry */
table_desc->prev = list_head->prev; table_desc->type = (u8) table_type;
table_desc->next = list_head;
/* Update list head */
list_head->prev = table_desc;
}
else {
table_desc->count = 1;
}
}
/* Common initialization of the table descriptor */
table_desc->type = table_info->type;
table_desc->pointer = table_info->pointer; table_desc->pointer = table_info->pointer;
table_desc->length = table_info->length; table_desc->length = table_info->length;
table_desc->allocation = table_info->allocation; table_desc->allocation = table_info->allocation;
...@@ -316,8 +304,8 @@ acpi_tb_init_table_descriptor ( ...@@ -316,8 +304,8 @@ acpi_tb_init_table_descriptor (
* Set the appropriate global pointer (if there is one) to point to the * Set the appropriate global pointer (if there is one) to point to the
* newly installed table * newly installed table
*/ */
if (acpi_gbl_acpi_table_data[table_type].global_ptr) { if (acpi_gbl_table_data[table_type].global_ptr) {
*(acpi_gbl_acpi_table_data[table_type].global_ptr) = table_info->pointer; *(acpi_gbl_table_data[table_type].global_ptr) = table_info->pointer;
} }
/* Return Data */ /* Return Data */
...@@ -331,7 +319,7 @@ acpi_tb_init_table_descriptor ( ...@@ -331,7 +319,7 @@ acpi_tb_init_table_descriptor (
/******************************************************************************* /*******************************************************************************
* *
* FUNCTION: acpi_tb_delete_acpi_tables * FUNCTION: acpi_tb_delete_all_tables
* *
* PARAMETERS: None. * PARAMETERS: None.
* *
...@@ -342,7 +330,7 @@ acpi_tb_init_table_descriptor ( ...@@ -342,7 +330,7 @@ acpi_tb_init_table_descriptor (
******************************************************************************/ ******************************************************************************/
void void
acpi_tb_delete_acpi_tables (void) acpi_tb_delete_all_tables (void)
{ {
acpi_table_type type; acpi_table_type type;
...@@ -351,15 +339,15 @@ acpi_tb_delete_acpi_tables (void) ...@@ -351,15 +339,15 @@ acpi_tb_delete_acpi_tables (void)
* Free memory allocated for ACPI tables * Free memory allocated for ACPI tables
* Memory can either be mapped or allocated * Memory can either be mapped or allocated
*/ */
for (type = 0; type < NUM_ACPI_TABLES; type++) { for (type = 0; type < NUM_ACPI_TABLE_TYPES; type++) {
acpi_tb_delete_acpi_table (type); acpi_tb_delete_tables_by_type (type);
} }
} }
/******************************************************************************* /*******************************************************************************
* *
* FUNCTION: acpi_tb_delete_acpi_table * FUNCTION: acpi_tb_delete_tables_by_type
* *
* PARAMETERS: Type - The table type to be deleted * PARAMETERS: Type - The table type to be deleted
* *
...@@ -371,11 +359,15 @@ acpi_tb_delete_acpi_tables (void) ...@@ -371,11 +359,15 @@ acpi_tb_delete_acpi_tables (void)
******************************************************************************/ ******************************************************************************/
void void
acpi_tb_delete_acpi_table ( acpi_tb_delete_tables_by_type (
acpi_table_type type) acpi_table_type type)
{ {
struct acpi_table_desc *table_desc;
u32 count;
u32 i;
ACPI_FUNCTION_TRACE_U32 ("tb_delete_acpi_table", type); ACPI_FUNCTION_TRACE_U32 ("tb_delete_tables_by_type", type);
if (type > ACPI_TABLE_MAX) { if (type > ACPI_TABLE_MAX) {
...@@ -416,43 +408,10 @@ acpi_tb_delete_acpi_table ( ...@@ -416,43 +408,10 @@ acpi_tb_delete_acpi_table (
} }
/* Free the table */ /* Free the table */
acpi_tb_free_acpi_tables_of_type (&acpi_gbl_acpi_tables[type]);
(void) acpi_ut_release_mutex (ACPI_MTX_TABLES);
return_VOID;
}
/*******************************************************************************
*
* FUNCTION: acpi_tb_free_acpi_tables_of_type
*
* PARAMETERS: table_info - A table info struct
*
* RETURN: None.
*
* DESCRIPTION: Free the memory associated with an internal ACPI table
* Table mutex should be locked.
*
******************************************************************************/
void
acpi_tb_free_acpi_tables_of_type (
struct acpi_table_desc *list_head)
{
struct acpi_table_desc *table_desc;
u32 count;
u32 i;
ACPI_FUNCTION_TRACE_PTR ("tb_free_acpi_tables_of_type", list_head);
/* Get the head of the list */ /* Get the head of the list */
table_desc = list_head; table_desc = acpi_gbl_table_lists[type].next;
count = list_head->count; count = acpi_gbl_table_lists[type].count;
/* /*
* Walk the entire list, deleting both the allocated tables * Walk the entire list, deleting both the allocated tables
...@@ -462,6 +421,7 @@ acpi_tb_free_acpi_tables_of_type ( ...@@ -462,6 +421,7 @@ acpi_tb_free_acpi_tables_of_type (
table_desc = acpi_tb_uninstall_table (table_desc); table_desc = acpi_tb_uninstall_table (table_desc);
} }
(void) acpi_ut_release_mutex (ACPI_MTX_TABLES);
return_VOID; return_VOID;
} }
...@@ -484,11 +444,13 @@ acpi_tb_delete_single_table ( ...@@ -484,11 +444,13 @@ acpi_tb_delete_single_table (
struct acpi_table_desc *table_desc) struct acpi_table_desc *table_desc)
{ {
if (!table_desc) { /* Must have a valid table descriptor and pointer */
if ((!table_desc) ||
(!table_desc->pointer)) {
return; return;
} }
if (table_desc->pointer) {
/* Valid table, determine type of memory allocation */ /* Valid table, determine type of memory allocation */
switch (table_desc->allocation) { switch (table_desc->allocation) {
...@@ -508,7 +470,6 @@ acpi_tb_delete_single_table ( ...@@ -508,7 +470,6 @@ acpi_tb_delete_single_table (
default: default:
break; break;
} }
}
} }
...@@ -533,18 +494,23 @@ acpi_tb_uninstall_table ( ...@@ -533,18 +494,23 @@ acpi_tb_uninstall_table (
struct acpi_table_desc *next_desc; struct acpi_table_desc *next_desc;
ACPI_FUNCTION_TRACE_PTR ("acpi_tb_uninstall_table", table_desc); ACPI_FUNCTION_TRACE_PTR ("tb_uninstall_table", table_desc);
if (!table_desc) { if (!table_desc) {
return_PTR (NULL); return_PTR (NULL);
} }
/* Unlink the descriptor */ /* Unlink the descriptor from the doubly linked list */
if (table_desc->prev) { if (table_desc->prev) {
table_desc->prev->next = table_desc->next; table_desc->prev->next = table_desc->next;
} }
else {
/* Is first on list, update list head */
acpi_gbl_table_lists[table_desc->type].next = table_desc->next;
}
if (table_desc->next) { if (table_desc->next) {
table_desc->next->prev = table_desc->prev; table_desc->next->prev = table_desc->prev;
...@@ -554,23 +520,12 @@ acpi_tb_uninstall_table ( ...@@ -554,23 +520,12 @@ acpi_tb_uninstall_table (
acpi_tb_delete_single_table (table_desc); acpi_tb_delete_single_table (table_desc);
/* Free the table descriptor (Don't delete the list head, tho) */
if ((table_desc->prev) == (table_desc->next)) {
next_desc = NULL;
/* Clear the list head */
table_desc->pointer = NULL;
table_desc->length = 0;
table_desc->count = 0;
}
else {
/* Free the table descriptor */ /* Free the table descriptor */
next_desc = table_desc->next; next_desc = table_desc->next;
ACPI_MEM_FREE (table_desc); ACPI_MEM_FREE (table_desc);
}
/* Return pointer to the next descriptor */
return_PTR (next_desc); return_PTR (next_desc);
} }
......
...@@ -66,26 +66,25 @@ ...@@ -66,26 +66,25 @@
acpi_status acpi_status
acpi_tb_handle_to_object ( acpi_tb_handle_to_object (
u16 table_id, u16 table_id,
struct acpi_table_desc **table_desc) struct acpi_table_desc **return_table_desc)
{ {
u32 i; u32 i;
struct acpi_table_desc *list_head; struct acpi_table_desc *table_desc;
ACPI_FUNCTION_NAME ("tb_handle_to_object"); ACPI_FUNCTION_NAME ("tb_handle_to_object");
for (i = 0; i < ACPI_TABLE_MAX; i++) { for (i = 0; i < ACPI_TABLE_MAX; i++) {
list_head = &acpi_gbl_acpi_tables[i]; table_desc = acpi_gbl_table_lists[i].next;
do { while (table_desc) {
if (list_head->table_id == table_id) { if (table_desc->table_id == table_id) {
*table_desc = list_head; *return_table_desc = table_desc;
return (AE_OK); return (AE_OK);
} }
list_head = list_head->next; table_desc = table_desc->next;
}
} while (list_head != &acpi_gbl_acpi_tables[i]);
} }
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "table_id=%X does not exist\n", table_id)); ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "table_id=%X does not exist\n", table_id));
......
...@@ -235,7 +235,7 @@ acpi_status ...@@ -235,7 +235,7 @@ acpi_status
acpi_unload_table ( acpi_unload_table (
acpi_table_type table_type) acpi_table_type table_type)
{ {
struct acpi_table_desc *list_head; struct acpi_table_desc *table_desc;
ACPI_FUNCTION_TRACE ("acpi_unload_table"); ACPI_FUNCTION_TRACE ("acpi_unload_table");
...@@ -250,22 +250,22 @@ acpi_unload_table ( ...@@ -250,22 +250,22 @@ acpi_unload_table (
/* Find all tables of the requested type */ /* Find all tables of the requested type */
list_head = &acpi_gbl_acpi_tables[table_type]; table_desc = acpi_gbl_table_lists[table_type].next;
do { while (table_desc); {
/* /*
* Delete all namespace entries owned by this table. Note that these * Delete all namespace entries owned by this table. Note that these
* entries can appear anywhere in the namespace by virtue of the AML * entries can appear anywhere in the namespace by virtue of the AML
* "Scope" operator. Thus, we need to track ownership by an ID, not * "Scope" operator. Thus, we need to track ownership by an ID, not
* simply a position within the hierarchy * simply a position within the hierarchy
*/ */
acpi_ns_delete_namespace_by_owner (list_head->table_id); acpi_ns_delete_namespace_by_owner (table_desc->table_id);
/* Delete (or unmap) the actual table */ table_desc = table_desc->next;
}
acpi_tb_delete_acpi_table (table_type);
} while (list_head != &acpi_gbl_acpi_tables[table_type]); /* Delete (or unmap) all tables of this type */
acpi_tb_delete_tables_by_type (table_type);
return_ACPI_STATUS (AE_OK); return_ACPI_STATUS (AE_OK);
} }
...@@ -313,7 +313,7 @@ acpi_get_table_header ( ...@@ -313,7 +313,7 @@ acpi_get_table_header (
/* Check the table type and instance */ /* Check the table type and instance */
if ((table_type > ACPI_TABLE_MAX) || if ((table_type > ACPI_TABLE_MAX) ||
(ACPI_IS_SINGLE_TABLE (acpi_gbl_acpi_table_data[table_type].flags) && (ACPI_IS_SINGLE_TABLE (acpi_gbl_table_data[table_type].flags) &&
instance > 1)) { instance > 1)) {
return_ACPI_STATUS (AE_BAD_PARAMETER); return_ACPI_STATUS (AE_BAD_PARAMETER);
} }
...@@ -394,7 +394,7 @@ acpi_get_table ( ...@@ -394,7 +394,7 @@ acpi_get_table (
/* Check the table type and instance */ /* Check the table type and instance */
if ((table_type > ACPI_TABLE_MAX) || if ((table_type > ACPI_TABLE_MAX) ||
(ACPI_IS_SINGLE_TABLE (acpi_gbl_acpi_table_data[table_type].flags) && (ACPI_IS_SINGLE_TABLE (acpi_gbl_table_data[table_type].flags) &&
instance > 1)) { instance > 1)) {
return_ACPI_STATUS (AE_BAD_PARAMETER); return_ACPI_STATUS (AE_BAD_PARAMETER);
} }
......
...@@ -33,7 +33,7 @@ ...@@ -33,7 +33,7 @@
* *
*/ */
#define TOSHIBA_ACPI_VERSION "0.14" #define TOSHIBA_ACPI_VERSION "0.15"
#define PROC_INTERFACE_VERSION 1 #define PROC_INTERFACE_VERSION 1
#include <linux/kernel.h> #include <linux/kernel.h>
...@@ -172,9 +172,7 @@ hci_raw(const u32 in[HCI_WORDS], u32 out[HCI_WORDS]) ...@@ -172,9 +172,7 @@ hci_raw(const u32 in[HCI_WORDS], u32 out[HCI_WORDS])
for (i = 0; i < HCI_WORDS; ++i) { for (i = 0; i < HCI_WORDS; ++i) {
in_objs[i].type = ACPI_TYPE_INTEGER; in_objs[i].type = ACPI_TYPE_INTEGER;
in_objs[i].integer.value = in[i]; in_objs[i].integer.value = in[i];
/*printk("%04x ", in[i]);*/
} }
/*printk("\n");*/
results.length = sizeof(out_objs); results.length = sizeof(out_objs);
results.pointer = out_objs; results.pointer = out_objs;
...@@ -184,9 +182,7 @@ hci_raw(const u32 in[HCI_WORDS], u32 out[HCI_WORDS]) ...@@ -184,9 +182,7 @@ hci_raw(const u32 in[HCI_WORDS], u32 out[HCI_WORDS])
if ((status == AE_OK) && (out_objs->package.count <= HCI_WORDS)) { if ((status == AE_OK) && (out_objs->package.count <= HCI_WORDS)) {
for (i = 0; i < out_objs->package.count; ++i) { for (i = 0; i < out_objs->package.count; ++i) {
out[i] = out_objs->package.elements[i].integer.value; out[i] = out_objs->package.elements[i].integer.value;
/*printk("%04x ", out[i]);*/
} }
/*printk("\n");*/
} }
return status; return status;
...@@ -226,7 +222,7 @@ static int key_event_valid; ...@@ -226,7 +222,7 @@ static int key_event_valid;
typedef struct _ProcItem typedef struct _ProcItem
{ {
char* name; const char* name;
char* (*read_func)(char*); char* (*read_func)(char*);
unsigned long (*write_func)(const char*, unsigned long); unsigned long (*write_func)(const char*, unsigned long);
} ProcItem; } ProcItem;
...@@ -284,10 +280,8 @@ static unsigned long ...@@ -284,10 +280,8 @@ static unsigned long
write_lcd(const char* buffer, unsigned long count) write_lcd(const char* buffer, unsigned long count)
{ {
int value; int value;
/*int byte_count;*/
u32 hci_result; u32 hci_result;
/* ISSUE: %i doesn't work with hex values as advertised */
if (snscanf(buffer, count, " brightness : %i", &value) == 1 && if (snscanf(buffer, count, " brightness : %i", &value) == 1 &&
value >= 0 && value < HCI_LCD_BRIGHTNESS_LEVELS) { value >= 0 && value < HCI_LCD_BRIGHTNESS_LEVELS) {
value = value << HCI_LCD_BRIGHTNESS_SHIFT; value = value << HCI_LCD_BRIGHTNESS_SHIFT;
...@@ -414,6 +408,11 @@ read_keys(char* p) ...@@ -414,6 +408,11 @@ read_keys(char* p)
last_key_event = value; last_key_event = value;
} else if (hci_result == HCI_EMPTY) { } else if (hci_result == HCI_EMPTY) {
/* better luck next time */ /* better luck next time */
} else if (hci_result == HCI_NOT_SUPPORTED) {
/* This is a workaround for an unresolved issue on
* some machines where system events sporadically
* become disabled. */
hci_write1(HCI_SYSTEM_EVENT, 1, &hci_result);
} else { } else {
p += sprintf(p, "ERROR\n"); p += sprintf(p, "ERROR\n");
goto end; goto end;
......
...@@ -651,14 +651,22 @@ acpi_ut_copy_simple_object ( ...@@ -651,14 +651,22 @@ acpi_ut_copy_simple_object (
*/ */
if ((source_desc->buffer.pointer) && if ((source_desc->buffer.pointer) &&
(!(source_desc->common.flags & AOPOBJ_STATIC_POINTER))) { (!(source_desc->common.flags & AOPOBJ_STATIC_POINTER))) {
dest_desc->buffer.pointer = NULL;
/* Create an actual buffer only if length > 0 */
if (source_desc->buffer.length) {
dest_desc->buffer.pointer = ACPI_MEM_ALLOCATE (source_desc->buffer.length); dest_desc->buffer.pointer = ACPI_MEM_ALLOCATE (source_desc->buffer.length);
if (!dest_desc->buffer.pointer) { if (!dest_desc->buffer.pointer) {
return (AE_NO_MEMORY); return (AE_NO_MEMORY);
} }
/* Copy the actual buffer data */
ACPI_MEMCPY (dest_desc->buffer.pointer, source_desc->buffer.pointer, ACPI_MEMCPY (dest_desc->buffer.pointer, source_desc->buffer.pointer,
source_desc->buffer.length); source_desc->buffer.length);
} }
}
break; break;
case ACPI_TYPE_STRING: case ACPI_TYPE_STRING:
......
...@@ -71,6 +71,7 @@ acpi_ut_delete_internal_obj ( ...@@ -71,6 +71,7 @@ acpi_ut_delete_internal_obj (
void *obj_pointer = NULL; void *obj_pointer = NULL;
union acpi_operand_object *handler_desc; union acpi_operand_object *handler_desc;
union acpi_operand_object *second_desc; union acpi_operand_object *second_desc;
union acpi_operand_object *next_desc;
ACPI_FUNCTION_TRACE_PTR ("ut_delete_internal_obj", object); ACPI_FUNCTION_TRACE_PTR ("ut_delete_internal_obj", object);
...@@ -136,6 +137,15 @@ acpi_ut_delete_internal_obj ( ...@@ -136,6 +137,15 @@ acpi_ut_delete_internal_obj (
if (object->device.gpe_block) { if (object->device.gpe_block) {
(void) acpi_ev_delete_gpe_block (object->device.gpe_block); (void) acpi_ev_delete_gpe_block (object->device.gpe_block);
} }
/* Walk the handler list for this device */
handler_desc = object->device.address_space;
while (handler_desc) {
next_desc = handler_desc->address_space.next;
acpi_ut_remove_reference (handler_desc);
handler_desc = next_desc;
}
break; break;
...@@ -183,12 +193,15 @@ acpi_ut_delete_internal_obj ( ...@@ -183,12 +193,15 @@ acpi_ut_delete_internal_obj (
* default handlers -- and therefore, we created the context object * default handlers -- and therefore, we created the context object
* locally, it was not created by an external caller. * locally, it was not created by an external caller.
*/ */
handler_desc = object->region.addr_handler; handler_desc = object->region.address_space;
if ((handler_desc) && if (handler_desc) {
(handler_desc->addr_handler.hflags == ACPI_ADDR_HANDLER_DEFAULT_INSTALLED)) { if (handler_desc->address_space.hflags & ACPI_ADDR_HANDLER_DEFAULT_INSTALLED) {
obj_pointer = second_desc->extra.region_context; obj_pointer = second_desc->extra.region_context;
} }
acpi_ut_remove_reference (handler_desc);
}
/* Now we can free the Extra object */ /* Now we can free the Extra object */
acpi_ut_delete_object_desc (second_desc); acpi_ut_delete_object_desc (second_desc);
...@@ -211,7 +224,6 @@ acpi_ut_delete_internal_obj ( ...@@ -211,7 +224,6 @@ acpi_ut_delete_internal_obj (
break; break;
} }
/* Free any allocated memory (pointer within the object) found above */ /* Free any allocated memory (pointer within the object) found above */
if (obj_pointer) { if (obj_pointer) {
...@@ -299,7 +311,7 @@ acpi_ut_update_ref_count ( ...@@ -299,7 +311,7 @@ acpi_ut_update_ref_count (
new_count = count; new_count = count;
/* /*
* Reference count action (increment, decrement, or force delete) * Perform the reference count action (increment, decrement, or force delete)
*/ */
switch (action) { switch (action) {
...@@ -402,8 +414,6 @@ acpi_ut_update_object_reference ( ...@@ -402,8 +414,6 @@ acpi_ut_update_object_reference (
{ {
acpi_status status; acpi_status status;
u32 i; u32 i;
union acpi_operand_object *next;
union acpi_operand_object *new;
union acpi_generic_state *state_list = NULL; union acpi_generic_state *state_list = NULL;
union acpi_generic_state *state; union acpi_generic_state *state;
...@@ -417,9 +427,8 @@ acpi_ut_update_object_reference ( ...@@ -417,9 +427,8 @@ acpi_ut_update_object_reference (
return_ACPI_STATUS (AE_OK); return_ACPI_STATUS (AE_OK);
} }
/* /* Make sure that this isn't a namespace handle */
* Make sure that this isn't a namespace handle
*/
if (ACPI_GET_DESCRIPTOR_TYPE (object) == ACPI_DESC_TYPE_NAMED) { if (ACPI_GET_DESCRIPTOR_TYPE (object) == ACPI_DESC_TYPE_NAMED) {
ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, "Object %p is NS handle\n", object)); ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, "Object %p is NS handle\n", object));
return_ACPI_STATUS (AE_OK); return_ACPI_STATUS (AE_OK);
...@@ -439,28 +448,8 @@ acpi_ut_update_object_reference ( ...@@ -439,28 +448,8 @@ acpi_ut_update_object_reference (
switch (ACPI_GET_OBJECT_TYPE (object)) { switch (ACPI_GET_OBJECT_TYPE (object)) {
case ACPI_TYPE_DEVICE: case ACPI_TYPE_DEVICE:
status = acpi_ut_create_update_state_and_push (object->device.addr_handler, acpi_ut_update_ref_count (object->device.system_notify, action);
action, &state_list); acpi_ut_update_ref_count (object->device.device_notify, action);
if (ACPI_FAILURE (status)) {
goto error_exit;
}
acpi_ut_update_ref_count (object->device.sys_handler, action);
acpi_ut_update_ref_count (object->device.drv_handler, action);
break;
case ACPI_TYPE_LOCAL_ADDRESS_HANDLER:
/* Must walk list of address handlers */
next = object->addr_handler.next;
while (next) {
new = next->addr_handler.next;
acpi_ut_update_ref_count (next, action);
next = new;
}
break; break;
...@@ -590,16 +579,14 @@ acpi_ut_add_reference ( ...@@ -590,16 +579,14 @@ acpi_ut_add_reference (
ACPI_FUNCTION_TRACE_PTR ("ut_add_reference", object); ACPI_FUNCTION_TRACE_PTR ("ut_add_reference", object);
/* /* Ensure that we have a valid object */
* Ensure that we have a valid object
*/
if (!acpi_ut_valid_internal_object (object)) { if (!acpi_ut_valid_internal_object (object)) {
return_VOID; return_VOID;
} }
/* /* Increment the reference count */
* We have a valid ACPI internal object, now increment the reference count
*/
(void) acpi_ut_update_object_reference (object, REF_INCREMENT); (void) acpi_ut_update_object_reference (object, REF_INCREMENT);
return_VOID; return_VOID;
} }
...@@ -624,6 +611,7 @@ acpi_ut_remove_reference ( ...@@ -624,6 +611,7 @@ acpi_ut_remove_reference (
ACPI_FUNCTION_TRACE_PTR ("ut_remove_reference", object); ACPI_FUNCTION_TRACE_PTR ("ut_remove_reference", object);
/* /*
* Allow a NULL pointer to be passed in, just ignore it. This saves * Allow a NULL pointer to be passed in, just ignore it. This saves
* each caller from having to check. Also, ignore NS nodes. * each caller from having to check. Also, ignore NS nodes.
...@@ -634,9 +622,8 @@ acpi_ut_remove_reference ( ...@@ -634,9 +622,8 @@ acpi_ut_remove_reference (
return_VOID; return_VOID;
} }
/* /* Ensure that we have a valid object */
* Ensure that we have a valid object
*/
if (!acpi_ut_valid_internal_object (object)) { if (!acpi_ut_valid_internal_object (object)) {
return_VOID; return_VOID;
} }
......
...@@ -208,6 +208,46 @@ acpi_ut_evaluate_numeric_object ( ...@@ -208,6 +208,46 @@ acpi_ut_evaluate_numeric_object (
} }
/*******************************************************************************
*
* FUNCTION: acpi_ut_copy_id_string
*
* PARAMETERS: Destination - Where to copy the string
* Source - Source string
* max_length - Length of the destination buffer
*
* RETURN: None
*
* DESCRIPTION: Copies an ID string for the _HID, _CID, and _UID methods.
* Performs removal of a leading asterisk if present -- workaround
* for a known issue on a bunch of machines.
*
******************************************************************************/
static void
acpi_ut_copy_id_string (
char *destination,
char *source,
acpi_size max_length)
{
/*
* Workaround for ID strings that have a leading asterisk. This construct
* is not allowed by the ACPI specification (ID strings must be
* alphanumeric), but enough existing machines have this embedded in their
* ID strings that the following code is useful.
*/
if (*source == '*') {
source++;
}
/* Do the actual copy */
ACPI_STRNCPY (destination, source, max_length);
}
/******************************************************************************* /*******************************************************************************
* *
* FUNCTION: acpi_ut_execute_HID * FUNCTION: acpi_ut_execute_HID
...@@ -245,12 +285,13 @@ acpi_ut_execute_HID ( ...@@ -245,12 +285,13 @@ acpi_ut_execute_HID (
if (ACPI_GET_OBJECT_TYPE (obj_desc) == ACPI_TYPE_INTEGER) { if (ACPI_GET_OBJECT_TYPE (obj_desc) == ACPI_TYPE_INTEGER) {
/* Convert the Numeric HID to string */ /* Convert the Numeric HID to string */
acpi_ex_eisa_id_to_string ((u32) obj_desc->integer.value, hid->buffer); acpi_ex_eisa_id_to_string ((u32) obj_desc->integer.value, hid->value);
} }
else { else {
/* Copy the String HID from the returned object */ /* Copy the String HID from the returned object */
ACPI_STRNCPY (hid->buffer, obj_desc->string.pointer, sizeof(hid->buffer)); acpi_ut_copy_id_string (hid->value, obj_desc->string.pointer,
sizeof (hid->value));
} }
/* On exit, we must delete the return object */ /* On exit, we must delete the return object */
...@@ -260,6 +301,57 @@ acpi_ut_execute_HID ( ...@@ -260,6 +301,57 @@ acpi_ut_execute_HID (
} }
/*******************************************************************************
*
* FUNCTION: acpi_ut_translate_one_cid
*
* PARAMETERS: obj_desc - _CID object, must be integer or string
* one_cid - Where the CID string is returned
*
* RETURN: Status
*
* DESCRIPTION: Return a numeric or string _CID value as a string.
* (Compatible ID)
*
* NOTE: Assumes a maximum _CID string length of
* ACPI_MAX_CID_LENGTH.
*
******************************************************************************/
static acpi_status
acpi_ut_translate_one_cid (
union acpi_operand_object *obj_desc,
struct acpi_compatible_id *one_cid)
{
switch (ACPI_GET_OBJECT_TYPE (obj_desc)) {
case ACPI_TYPE_INTEGER:
/* Convert the Numeric CID to string */
acpi_ex_eisa_id_to_string ((u32) obj_desc->integer.value, one_cid->value);
return (AE_OK);
case ACPI_TYPE_STRING:
if (obj_desc->string.length > ACPI_MAX_CID_LENGTH) {
return (AE_AML_STRING_LIMIT);
}
/* Copy the String CID from the returned object */
acpi_ut_copy_id_string (one_cid->value, obj_desc->string.pointer,
ACPI_MAX_CID_LENGTH);
return (AE_OK);
default:
return (AE_TYPE);
}
}
/******************************************************************************* /*******************************************************************************
* *
* FUNCTION: acpi_ut_execute_CID * FUNCTION: acpi_ut_execute_CID
...@@ -279,55 +371,86 @@ acpi_ut_execute_HID ( ...@@ -279,55 +371,86 @@ acpi_ut_execute_HID (
acpi_status acpi_status
acpi_ut_execute_CID ( acpi_ut_execute_CID (
struct acpi_namespace_node *device_node, struct acpi_namespace_node *device_node,
struct acpi_device_id *cid) struct acpi_compatible_id_list **return_cid_list)
{ {
union acpi_operand_object *obj_desc; union acpi_operand_object *obj_desc;
acpi_status status; acpi_status status;
u32 count;
u32 size;
struct acpi_compatible_id_list *cid_list;
acpi_native_uint i;
ACPI_FUNCTION_TRACE ("ut_execute_CID"); ACPI_FUNCTION_TRACE ("ut_execute_CID");
/* Evaluate the _CID method for this device */
status = acpi_ut_evaluate_object (device_node, METHOD_NAME__CID, status = acpi_ut_evaluate_object (device_node, METHOD_NAME__CID,
ACPI_BTYPE_INTEGER | ACPI_BTYPE_STRING | ACPI_BTYPE_PACKAGE, &obj_desc); ACPI_BTYPE_INTEGER | ACPI_BTYPE_STRING | ACPI_BTYPE_PACKAGE,
&obj_desc);
if (ACPI_FAILURE (status)) { if (ACPI_FAILURE (status)) {
return_ACPI_STATUS (status); return_ACPI_STATUS (status);
} }
/* /* Get the number of _CIDs returned */
* A _CID can return either a single compatible ID or a package of compatible
* IDs. Each compatible ID can be a Number (32 bit compressed EISA ID) or
* string (PCI ID format, e.g. "PCI\VEN_vvvv&DEV_dddd&SUBSYS_ssssssss").
*/
switch (ACPI_GET_OBJECT_TYPE (obj_desc)) {
case ACPI_TYPE_INTEGER:
/* Convert the Numeric CID to string */ count = 1;
if (ACPI_GET_OBJECT_TYPE (obj_desc) == ACPI_TYPE_PACKAGE) {
count = obj_desc->package.count;
}
acpi_ex_eisa_id_to_string ((u32) obj_desc->integer.value, cid->buffer); /* Allocate a worst-case buffer for the _CIDs */
break;
case ACPI_TYPE_STRING: size = (((count - 1) * sizeof (struct acpi_compatible_id)) +
sizeof (struct acpi_compatible_id_list));
/* Copy the String CID from the returned object */ cid_list = ACPI_MEM_CALLOCATE ((acpi_size) size);
if (!cid_list) {
return_ACPI_STATUS (AE_NO_MEMORY);
}
ACPI_STRNCPY (cid->buffer, obj_desc->string.pointer, sizeof (cid->buffer)); /* Init CID list */
break;
case ACPI_TYPE_PACKAGE: cid_list->count = count;
cid_list->size = size;
/* TBD: Parse package elements; need different return struct, etc. */ /*
* A _CID can return either a single compatible ID or a package of compatible
* IDs. Each compatible ID can be one of the following:
* -- Number (32 bit compressed EISA ID) or
* -- String (PCI ID format, e.g. "PCI\VEN_vvvv&DEV_dddd&SUBSYS_ssssssss").
*/
status = AE_SUPPORT; /* The _CID object can be either a single CID or a package (list) of CIDs */
break;
default: if (ACPI_GET_OBJECT_TYPE (obj_desc) == ACPI_TYPE_PACKAGE) {
/* Translate each package element */
status = AE_TYPE; for (i = 0; i < count; i++) {
status = acpi_ut_translate_one_cid (obj_desc->package.elements[i],
&cid_list->id[i]);
if (ACPI_FAILURE (status)) {
break; break;
} }
}
}
else {
/* Only one CID, translate to a string */
/* On exit, we must delete the return object */ status = acpi_ut_translate_one_cid (obj_desc, cid_list->id);
}
/* Cleanup on error */
if (ACPI_FAILURE (status)) {
ACPI_MEM_FREE (cid_list);
}
else {
*return_cid_list = cid_list;
}
/* On exit, we must delete the _CID return object */
acpi_ut_remove_reference (obj_desc); acpi_ut_remove_reference (obj_desc);
return_ACPI_STATUS (status); return_ACPI_STATUS (status);
...@@ -371,12 +494,13 @@ acpi_ut_execute_UID ( ...@@ -371,12 +494,13 @@ acpi_ut_execute_UID (
if (ACPI_GET_OBJECT_TYPE (obj_desc) == ACPI_TYPE_INTEGER) { if (ACPI_GET_OBJECT_TYPE (obj_desc) == ACPI_TYPE_INTEGER) {
/* Convert the Numeric UID to string */ /* Convert the Numeric UID to string */
acpi_ex_unsigned_integer_to_string (obj_desc->integer.value, uid->buffer); acpi_ex_unsigned_integer_to_string (obj_desc->integer.value, uid->value);
} }
else { else {
/* Copy the String UID from the returned object */ /* Copy the String UID from the returned object */
ACPI_STRNCPY (uid->buffer, obj_desc->string.pointer, sizeof (uid->buffer)); acpi_ut_copy_id_string (uid->value, obj_desc->string.pointer,
sizeof (uid->value));
} }
/* On exit, we must delete the return object */ /* On exit, we must delete the return object */
......
...@@ -299,10 +299,10 @@ acpi_ut_hex_to_ascii_char ( ...@@ -299,10 +299,10 @@ acpi_ut_hex_to_ascii_char (
******************************************************************************/ ******************************************************************************/
struct acpi_table_desc acpi_gbl_acpi_tables[NUM_ACPI_TABLES]; struct acpi_table_list acpi_gbl_table_lists[NUM_ACPI_TABLE_TYPES];
struct acpi_table_support acpi_gbl_acpi_table_data[NUM_ACPI_TABLES] = struct acpi_table_support acpi_gbl_table_data[NUM_ACPI_TABLE_TYPES] =
{ {
/*********** Name, Signature, Global typed pointer Signature size, Type How many allowed?, Contains valid AML? */ /*********** Name, Signature, Global typed pointer Signature size, Type How many allowed?, Contains valid AML? */
...@@ -535,12 +535,10 @@ acpi_ut_get_object_type_name ( ...@@ -535,12 +535,10 @@ acpi_ut_get_object_type_name (
#if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER) #if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER)
/* /*
* Strings and procedures used for debug only * Strings and procedures used for debug only
*/ */
/***************************************************************************** /*****************************************************************************
* *
* FUNCTION: acpi_ut_get_mutex_name * FUNCTION: acpi_ut_get_mutex_name
...@@ -558,7 +556,7 @@ acpi_ut_get_mutex_name ( ...@@ -558,7 +556,7 @@ acpi_ut_get_mutex_name (
u32 mutex_id) u32 mutex_id)
{ {
if (mutex_id > MAX_MTX) if (mutex_id > MAX_MUTEX)
{ {
return ("Invalid Mutex ID"); return ("Invalid Mutex ID");
} }
...@@ -566,7 +564,6 @@ acpi_ut_get_mutex_name ( ...@@ -566,7 +564,6 @@ acpi_ut_get_mutex_name (
return (acpi_gbl_mutex_names[mutex_id]); return (acpi_gbl_mutex_names[mutex_id]);
} }
#endif #endif
...@@ -630,9 +627,12 @@ acpi_ut_allocate_owner_id ( ...@@ -630,9 +627,12 @@ acpi_ut_allocate_owner_id (
owner_id = acpi_gbl_next_table_owner_id; owner_id = acpi_gbl_next_table_owner_id;
acpi_gbl_next_table_owner_id++; acpi_gbl_next_table_owner_id++;
/* Check for wraparound */
if (acpi_gbl_next_table_owner_id == ACPI_FIRST_METHOD_ID) if (acpi_gbl_next_table_owner_id == ACPI_FIRST_METHOD_ID)
{ {
acpi_gbl_next_table_owner_id = ACPI_FIRST_TABLE_ID; acpi_gbl_next_table_owner_id = ACPI_FIRST_TABLE_ID;
ACPI_REPORT_WARNING (("Table owner ID wraparound\n"));
} }
break; break;
...@@ -644,6 +644,8 @@ acpi_ut_allocate_owner_id ( ...@@ -644,6 +644,8 @@ acpi_ut_allocate_owner_id (
if (acpi_gbl_next_method_owner_id == ACPI_FIRST_TABLE_ID) if (acpi_gbl_next_method_owner_id == ACPI_FIRST_TABLE_ID)
{ {
/* Check for wraparound */
acpi_gbl_next_method_owner_id = ACPI_FIRST_METHOD_ID; acpi_gbl_next_method_owner_id = ACPI_FIRST_METHOD_ID;
} }
break; break;
...@@ -710,23 +712,19 @@ acpi_ut_init_globals ( ...@@ -710,23 +712,19 @@ acpi_ut_init_globals (
/* ACPI table structure */ /* ACPI table structure */
for (i = 0; i < NUM_ACPI_TABLES; i++) for (i = 0; i < NUM_ACPI_TABLE_TYPES; i++)
{ {
acpi_gbl_acpi_tables[i].prev = &acpi_gbl_acpi_tables[i]; acpi_gbl_table_lists[i].next = NULL;
acpi_gbl_acpi_tables[i].next = &acpi_gbl_acpi_tables[i]; acpi_gbl_table_lists[i].count = 0;
acpi_gbl_acpi_tables[i].pointer = NULL;
acpi_gbl_acpi_tables[i].length = 0;
acpi_gbl_acpi_tables[i].allocation = ACPI_MEM_NOT_ALLOCATED;
acpi_gbl_acpi_tables[i].count = 0;
} }
/* Mutex locked flags */ /* Mutex locked flags */
for (i = 0; i < NUM_MTX; i++) for (i = 0; i < NUM_MUTEX; i++)
{ {
acpi_gbl_acpi_mutex_info[i].mutex = NULL; acpi_gbl_mutex_info[i].mutex = NULL;
acpi_gbl_acpi_mutex_info[i].owner_id = ACPI_MUTEX_NOT_ACQUIRED; acpi_gbl_mutex_info[i].owner_id = ACPI_MUTEX_NOT_ACQUIRED;
acpi_gbl_acpi_mutex_info[i].use_count = 0; acpi_gbl_mutex_info[i].use_count = 0;
} }
/* GPE support */ /* GPE support */
...@@ -737,8 +735,8 @@ acpi_ut_init_globals ( ...@@ -737,8 +735,8 @@ acpi_ut_init_globals (
/* Global notify handlers */ /* Global notify handlers */
acpi_gbl_sys_notify.handler = NULL; acpi_gbl_system_notify.handler = NULL;
acpi_gbl_drv_notify.handler = NULL; acpi_gbl_device_notify.handler = NULL;
acpi_gbl_init_handler = NULL; acpi_gbl_init_handler = NULL;
/* Global "typed" ACPI table pointers */ /* Global "typed" ACPI table pointers */
......
...@@ -549,7 +549,7 @@ acpi_ut_mutex_initialize ( ...@@ -549,7 +549,7 @@ acpi_ut_mutex_initialize (
/* /*
* Create each of the predefined mutex objects * Create each of the predefined mutex objects
*/ */
for (i = 0; i < NUM_MTX; i++) { for (i = 0; i < NUM_MUTEX; i++) {
status = acpi_ut_create_mutex (i); status = acpi_ut_create_mutex (i);
if (ACPI_FAILURE (status)) { if (ACPI_FAILURE (status)) {
return_ACPI_STATUS (status); return_ACPI_STATUS (status);
...@@ -588,7 +588,7 @@ acpi_ut_mutex_terminate ( ...@@ -588,7 +588,7 @@ acpi_ut_mutex_terminate (
/* /*
* Delete each predefined mutex object * Delete each predefined mutex object
*/ */
for (i = 0; i < NUM_MTX; i++) { for (i = 0; i < NUM_MUTEX; i++) {
(void) acpi_ut_delete_mutex (i); (void) acpi_ut_delete_mutex (i);
} }
...@@ -619,15 +619,15 @@ acpi_ut_create_mutex ( ...@@ -619,15 +619,15 @@ acpi_ut_create_mutex (
ACPI_FUNCTION_TRACE_U32 ("ut_create_mutex", mutex_id); ACPI_FUNCTION_TRACE_U32 ("ut_create_mutex", mutex_id);
if (mutex_id > MAX_MTX) { if (mutex_id > MAX_MUTEX) {
return_ACPI_STATUS (AE_BAD_PARAMETER); return_ACPI_STATUS (AE_BAD_PARAMETER);
} }
if (!acpi_gbl_acpi_mutex_info[mutex_id].mutex) { if (!acpi_gbl_mutex_info[mutex_id].mutex) {
status = acpi_os_create_semaphore (1, 1, status = acpi_os_create_semaphore (1, 1,
&acpi_gbl_acpi_mutex_info[mutex_id].mutex); &acpi_gbl_mutex_info[mutex_id].mutex);
acpi_gbl_acpi_mutex_info[mutex_id].owner_id = ACPI_MUTEX_NOT_ACQUIRED; acpi_gbl_mutex_info[mutex_id].owner_id = ACPI_MUTEX_NOT_ACQUIRED;
acpi_gbl_acpi_mutex_info[mutex_id].use_count = 0; acpi_gbl_mutex_info[mutex_id].use_count = 0;
} }
return_ACPI_STATUS (status); return_ACPI_STATUS (status);
...@@ -656,14 +656,14 @@ acpi_ut_delete_mutex ( ...@@ -656,14 +656,14 @@ acpi_ut_delete_mutex (
ACPI_FUNCTION_TRACE_U32 ("ut_delete_mutex", mutex_id); ACPI_FUNCTION_TRACE_U32 ("ut_delete_mutex", mutex_id);
if (mutex_id > MAX_MTX) { if (mutex_id > MAX_MUTEX) {
return_ACPI_STATUS (AE_BAD_PARAMETER); return_ACPI_STATUS (AE_BAD_PARAMETER);
} }
status = acpi_os_delete_semaphore (acpi_gbl_acpi_mutex_info[mutex_id].mutex); status = acpi_os_delete_semaphore (acpi_gbl_mutex_info[mutex_id].mutex);
acpi_gbl_acpi_mutex_info[mutex_id].mutex = NULL; acpi_gbl_mutex_info[mutex_id].mutex = NULL;
acpi_gbl_acpi_mutex_info[mutex_id].owner_id = ACPI_MUTEX_NOT_ACQUIRED; acpi_gbl_mutex_info[mutex_id].owner_id = ACPI_MUTEX_NOT_ACQUIRED;
return_ACPI_STATUS (status); return_ACPI_STATUS (status);
} }
...@@ -693,7 +693,7 @@ acpi_ut_acquire_mutex ( ...@@ -693,7 +693,7 @@ acpi_ut_acquire_mutex (
ACPI_FUNCTION_NAME ("ut_acquire_mutex"); ACPI_FUNCTION_NAME ("ut_acquire_mutex");
if (mutex_id > MAX_MTX) { if (mutex_id > MAX_MUTEX) {
return (AE_BAD_PARAMETER); return (AE_BAD_PARAMETER);
} }
...@@ -705,8 +705,8 @@ acpi_ut_acquire_mutex ( ...@@ -705,8 +705,8 @@ acpi_ut_acquire_mutex (
* the mutex ordering rule. This indicates a coding error somewhere in * the mutex ordering rule. This indicates a coding error somewhere in
* the ACPI subsystem code. * the ACPI subsystem code.
*/ */
for (i = mutex_id; i < MAX_MTX; i++) { for (i = mutex_id; i < MAX_MUTEX; i++) {
if (acpi_gbl_acpi_mutex_info[i].owner_id == this_thread_id) { if (acpi_gbl_mutex_info[i].owner_id == this_thread_id) {
if (i == mutex_id) { if (i == mutex_id) {
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
"Mutex [%s] already acquired by this thread [%X]\n", "Mutex [%s] already acquired by this thread [%X]\n",
...@@ -728,14 +728,14 @@ acpi_ut_acquire_mutex ( ...@@ -728,14 +728,14 @@ acpi_ut_acquire_mutex (
"Thread %X attempting to acquire Mutex [%s]\n", "Thread %X attempting to acquire Mutex [%s]\n",
this_thread_id, acpi_ut_get_mutex_name (mutex_id))); this_thread_id, acpi_ut_get_mutex_name (mutex_id)));
status = acpi_os_wait_semaphore (acpi_gbl_acpi_mutex_info[mutex_id].mutex, status = acpi_os_wait_semaphore (acpi_gbl_mutex_info[mutex_id].mutex,
1, ACPI_WAIT_FOREVER); 1, ACPI_WAIT_FOREVER);
if (ACPI_SUCCESS (status)) { if (ACPI_SUCCESS (status)) {
ACPI_DEBUG_PRINT ((ACPI_DB_MUTEX, "Thread %X acquired Mutex [%s]\n", ACPI_DEBUG_PRINT ((ACPI_DB_MUTEX, "Thread %X acquired Mutex [%s]\n",
this_thread_id, acpi_ut_get_mutex_name (mutex_id))); this_thread_id, acpi_ut_get_mutex_name (mutex_id)));
acpi_gbl_acpi_mutex_info[mutex_id].use_count++; acpi_gbl_mutex_info[mutex_id].use_count++;
acpi_gbl_acpi_mutex_info[mutex_id].owner_id = this_thread_id; acpi_gbl_mutex_info[mutex_id].owner_id = this_thread_id;
} }
else { else {
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Thread %X could not acquire Mutex [%s] %s\n", ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Thread %X could not acquire Mutex [%s] %s\n",
...@@ -776,14 +776,14 @@ acpi_ut_release_mutex ( ...@@ -776,14 +776,14 @@ acpi_ut_release_mutex (
"Thread %X releasing Mutex [%s]\n", this_thread_id, "Thread %X releasing Mutex [%s]\n", this_thread_id,
acpi_ut_get_mutex_name (mutex_id))); acpi_ut_get_mutex_name (mutex_id)));
if (mutex_id > MAX_MTX) { if (mutex_id > MAX_MUTEX) {
return (AE_BAD_PARAMETER); return (AE_BAD_PARAMETER);
} }
/* /*
* Mutex must be acquired in order to release it! * Mutex must be acquired in order to release it!
*/ */
if (acpi_gbl_acpi_mutex_info[mutex_id].owner_id == ACPI_MUTEX_NOT_ACQUIRED) { if (acpi_gbl_mutex_info[mutex_id].owner_id == ACPI_MUTEX_NOT_ACQUIRED) {
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
"Mutex [%s] is not acquired, cannot release\n", "Mutex [%s] is not acquired, cannot release\n",
acpi_ut_get_mutex_name (mutex_id))); acpi_ut_get_mutex_name (mutex_id)));
...@@ -797,8 +797,8 @@ acpi_ut_release_mutex ( ...@@ -797,8 +797,8 @@ acpi_ut_release_mutex (
* ordering rule. This indicates a coding error somewhere in * ordering rule. This indicates a coding error somewhere in
* the ACPI subsystem code. * the ACPI subsystem code.
*/ */
for (i = mutex_id; i < MAX_MTX; i++) { for (i = mutex_id; i < MAX_MUTEX; i++) {
if (acpi_gbl_acpi_mutex_info[i].owner_id == this_thread_id) { if (acpi_gbl_mutex_info[i].owner_id == this_thread_id) {
if (i == mutex_id) { if (i == mutex_id) {
continue; continue;
} }
...@@ -813,9 +813,9 @@ acpi_ut_release_mutex ( ...@@ -813,9 +813,9 @@ acpi_ut_release_mutex (
/* Mark unlocked FIRST */ /* Mark unlocked FIRST */
acpi_gbl_acpi_mutex_info[mutex_id].owner_id = ACPI_MUTEX_NOT_ACQUIRED; acpi_gbl_mutex_info[mutex_id].owner_id = ACPI_MUTEX_NOT_ACQUIRED;
status = acpi_os_signal_semaphore (acpi_gbl_acpi_mutex_info[mutex_id].mutex, 1); status = acpi_os_signal_semaphore (acpi_gbl_mutex_info[mutex_id].mutex, 1);
if (ACPI_FAILURE (status)) { if (ACPI_FAILURE (status)) {
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Thread %X could not release Mutex [%s] %s\n", ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Thread %X could not release Mutex [%s] %s\n",
......
...@@ -149,7 +149,7 @@ acpi_ut_create_buffer_object ( ...@@ -149,7 +149,7 @@ acpi_ut_create_buffer_object (
acpi_size buffer_size) acpi_size buffer_size)
{ {
union acpi_operand_object *buffer_desc; union acpi_operand_object *buffer_desc;
u8 *buffer; u8 *buffer = NULL;
ACPI_FUNCTION_TRACE_U32 ("ut_create_buffer_object", buffer_size); ACPI_FUNCTION_TRACE_U32 ("ut_create_buffer_object", buffer_size);
...@@ -163,6 +163,9 @@ acpi_ut_create_buffer_object ( ...@@ -163,6 +163,9 @@ acpi_ut_create_buffer_object (
return_PTR (NULL); return_PTR (NULL);
} }
/* Create an actual buffer only if size > 0 */
if (buffer_size > 0) {
/* Allocate the actual buffer */ /* Allocate the actual buffer */
buffer = ACPI_MEM_CALLOCATE (buffer_size); buffer = ACPI_MEM_CALLOCATE (buffer_size);
...@@ -172,6 +175,7 @@ acpi_ut_create_buffer_object ( ...@@ -172,6 +175,7 @@ acpi_ut_create_buffer_object (
acpi_ut_remove_reference (buffer_desc); acpi_ut_remove_reference (buffer_desc);
return_PTR (NULL); return_PTR (NULL);
} }
}
/* Complete buffer object initialization */ /* Complete buffer object initialization */
......
...@@ -144,23 +144,9 @@ acpi_enable_subsystem ( ...@@ -144,23 +144,9 @@ acpi_enable_subsystem (
ACPI_FUNCTION_TRACE ("acpi_enable_subsystem"); ACPI_FUNCTION_TRACE ("acpi_enable_subsystem");
/*
* Install the default op_region handlers. These are installed unless
* other handlers have already been installed via the
* install_address_space_handler interface
*/
if (!(flags & ACPI_NO_ADDRESS_SPACE_INIT)) {
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[Init] Installing default address space handlers\n"));
status = acpi_ev_init_address_spaces ();
if (ACPI_FAILURE (status)) {
return_ACPI_STATUS (status);
}
}
/* /*
* We must initialize the hardware before we can enable ACPI. * We must initialize the hardware before we can enable ACPI.
* FADT values are validated here. * The values from the FADT are validated here.
*/ */
if (!(flags & ACPI_NO_HARDWARE_INIT)) { if (!(flags & ACPI_NO_HARDWARE_INIT)) {
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[Init] Initializing ACPI hardware\n")); ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[Init] Initializing ACPI hardware\n"));
...@@ -172,7 +158,7 @@ acpi_enable_subsystem ( ...@@ -172,7 +158,7 @@ acpi_enable_subsystem (
} }
/* /*
* Enable ACPI on this platform * Enable ACPI mode
*/ */
if (!(flags & ACPI_NO_ACPI_ENABLE)) { if (!(flags & ACPI_NO_ACPI_ENABLE)) {
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[Init] Going into ACPI mode\n")); ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[Init] Going into ACPI mode\n"));
...@@ -187,8 +173,9 @@ acpi_enable_subsystem ( ...@@ -187,8 +173,9 @@ acpi_enable_subsystem (
} }
/* /*
* Note: * Initialize ACPI Event handling
* We must have the hardware AND events initialized before we can execute *
* NOTE: We must have the hardware AND events initialized before we can execute
* ANY control methods SAFELY. Any control method can require ACPI hardware * ANY control methods SAFELY. Any control method can require ACPI hardware
* support, so the hardware MUST be initialized before execution! * support, so the hardware MUST be initialized before execution!
*/ */
...@@ -201,7 +188,7 @@ acpi_enable_subsystem ( ...@@ -201,7 +188,7 @@ acpi_enable_subsystem (
} }
} }
/* Install SCI handler, Global Lock handler, GPE handlers */ /* Install the SCI handler, Global Lock handler, and GPE handlers */
if (!(flags & ACPI_NO_HANDLER_INIT)) { if (!(flags & ACPI_NO_HANDLER_INIT)) {
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[Init] Installing SCI/GL/GPE handlers\n")); ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[Init] Installing SCI/GL/GPE handlers\n"));
...@@ -237,14 +224,20 @@ acpi_initialize_objects ( ...@@ -237,14 +224,20 @@ acpi_initialize_objects (
ACPI_FUNCTION_TRACE ("acpi_initialize_objects"); ACPI_FUNCTION_TRACE ("acpi_initialize_objects");
/* /*
* Initialize all device objects in the namespace * Install the default op_region handlers. These are installed unless
* This runs the _STA and _INI methods. * other handlers have already been installed via the
* install_address_space_handler interface.
*
* NOTE: This will cause _REG methods to be run. Any objects accessed
* by the _REG methods will be automatically initialized, even if they
* contain executable AML (see call to acpi_ns_initialize_objects below).
*/ */
if (!(flags & ACPI_NO_DEVICE_INIT)) { if (!(flags & ACPI_NO_ADDRESS_SPACE_INIT)) {
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[Init] Initializing ACPI Devices\n")); ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[Init] Installing default address space handlers\n"));
status = acpi_ns_initialize_devices (); status = acpi_ev_init_address_spaces ();
if (ACPI_FAILURE (status)) { if (ACPI_FAILURE (status)) {
return_ACPI_STATUS (status); return_ACPI_STATUS (status);
} }
...@@ -252,8 +245,8 @@ acpi_initialize_objects ( ...@@ -252,8 +245,8 @@ acpi_initialize_objects (
/* /*
* Initialize the objects that remain uninitialized. This * Initialize the objects that remain uninitialized. This
* runs the executable AML that is part of the declaration of op_regions * runs the executable AML that may be part of the declaration of these
* and Fields. * objects: operation_regions, buffer_fields, Buffers, and Packages.
*/ */
if (!(flags & ACPI_NO_OBJECT_INIT)) { if (!(flags & ACPI_NO_OBJECT_INIT)) {
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[Init] Initializing ACPI Objects\n")); ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[Init] Initializing ACPI Objects\n"));
...@@ -264,6 +257,19 @@ acpi_initialize_objects ( ...@@ -264,6 +257,19 @@ acpi_initialize_objects (
} }
} }
/*
* Initialize all device objects in the namespace
* This runs the _STA and _INI methods.
*/
if (!(flags & ACPI_NO_DEVICE_INIT)) {
ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[Init] Initializing ACPI Devices\n"));
status = acpi_ns_initialize_devices ();
if (ACPI_FAILURE (status)) {
return_ACPI_STATUS (status);
}
}
/* /*
* Empty the caches (delete the cached objects) on the assumption that * Empty the caches (delete the cached objects) on the assumption that
* the table load filled them up more than they will be at runtime -- * the table load filled them up more than they will be at runtime --
...@@ -431,9 +437,9 @@ acpi_get_system_info ( ...@@ -431,9 +437,9 @@ acpi_get_system_info (
/* Current status of the ACPI tables, per table type */ /* Current status of the ACPI tables, per table type */
info_ptr->num_table_types = NUM_ACPI_TABLES; info_ptr->num_table_types = NUM_ACPI_TABLE_TYPES;
for (i = 0; i < NUM_ACPI_TABLES; i++) { for (i = 0; i < NUM_ACPI_TABLE_TYPES; i++) {
info_ptr->table_info[i].count = acpi_gbl_acpi_tables[i].count; info_ptr->table_info[i].count = acpi_gbl_table_lists[i].count;
} }
return_ACPI_STATUS (AE_OK); return_ACPI_STATUS (AE_OK);
......
...@@ -247,7 +247,7 @@ static ide_startstop_t write_intr (ide_drive_t *drive) ...@@ -247,7 +247,7 @@ static ide_startstop_t write_intr (ide_drive_t *drive)
* *
* Returns 0 on success. * Returns 0 on success.
* *
* Note that we may be called from two contexts - the do_rw_disk context * Note that we may be called from two contexts - __ide_do_rw_disk() context
* and IRQ context. The IRQ can happen any time after we've output the * and IRQ context. The IRQ can happen any time after we've output the
* full "mcount" number of sectors, so we must make sure we update the * full "mcount" number of sectors, so we must make sure we update the
* state _before_ we output the final part of the data! * state _before_ we output the final part of the data!
...@@ -351,11 +351,11 @@ static ide_startstop_t multwrite_intr (ide_drive_t *drive) ...@@ -351,11 +351,11 @@ static ide_startstop_t multwrite_intr (ide_drive_t *drive)
} }
/* /*
* do_rw_disk() issues READ and WRITE commands to a disk, * __ide_do_rw_disk() issues READ and WRITE commands to a disk,
* using LBA if supported, or CHS otherwise, to address sectors. * using LBA if supported, or CHS otherwise, to address sectors.
* It also takes care of issuing special DRIVE_CMDs. * It also takes care of issuing special DRIVE_CMDs.
*/ */
static ide_startstop_t do_rw_disk (ide_drive_t *drive, struct request *rq, sector_t block) ide_startstop_t __ide_do_rw_disk (ide_drive_t *drive, struct request *rq, sector_t block)
{ {
ide_hwif_t *hwif = HWIF(drive); ide_hwif_t *hwif = HWIF(drive);
u8 lba48 = (drive->addressing == 1) ? 1 : 0; u8 lba48 = (drive->addressing == 1) ? 1 : 0;
...@@ -367,11 +367,6 @@ static ide_startstop_t do_rw_disk (ide_drive_t *drive, struct request *rq, secto ...@@ -367,11 +367,6 @@ static ide_startstop_t do_rw_disk (ide_drive_t *drive, struct request *rq, secto
if (driver_blocked) if (driver_blocked)
panic("Request while ide driver is blocked?"); panic("Request while ide driver is blocked?");
#if defined(CONFIG_BLK_DEV_PDC4030) || defined(CONFIG_BLK_DEV_PDC4030_MODULE)
if (IS_PDC4030_DRIVE)
return promise_rw_disk(drive, rq, block);
#endif /* CONFIG_BLK_DEV_PDC4030 */
if (drive->using_tcq && idedisk_start_tag(drive, rq)) { if (drive->using_tcq && idedisk_start_tag(drive, rq)) {
if (!ata_pending_commands(drive)) if (!ata_pending_commands(drive))
BUG(); BUG();
...@@ -550,10 +545,11 @@ static ide_startstop_t do_rw_disk (ide_drive_t *drive, struct request *rq, secto ...@@ -550,10 +545,11 @@ static ide_startstop_t do_rw_disk (ide_drive_t *drive, struct request *rq, secto
} }
return ide_started; return ide_started;
} }
blk_dump_rq_flags(rq, "do_rw_disk - bad command"); blk_dump_rq_flags(rq, "__ide_do_rw_disk - bad command");
ide_end_request(drive, 0, 0); ide_end_request(drive, 0, 0);
return ide_stopped; return ide_stopped;
} }
EXPORT_SYMBOL_GPL(__ide_do_rw_disk);
#else /* CONFIG_IDE_TASKFILE_IO */ #else /* CONFIG_IDE_TASKFILE_IO */
...@@ -562,15 +558,15 @@ static ide_startstop_t lba_28_rw_disk(ide_drive_t *, struct request *, unsigned ...@@ -562,15 +558,15 @@ static ide_startstop_t lba_28_rw_disk(ide_drive_t *, struct request *, unsigned
static ide_startstop_t lba_48_rw_disk(ide_drive_t *, struct request *, unsigned long long); static ide_startstop_t lba_48_rw_disk(ide_drive_t *, struct request *, unsigned long long);
/* /*
* do_rw_disk() issues READ and WRITE commands to a disk, * __ide_do_rw_disk() issues READ and WRITE commands to a disk,
* using LBA if supported, or CHS otherwise, to address sectors. * using LBA if supported, or CHS otherwise, to address sectors.
* It also takes care of issuing special DRIVE_CMDs. * It also takes care of issuing special DRIVE_CMDs.
*/ */
static ide_startstop_t do_rw_disk (ide_drive_t *drive, struct request *rq, sector_t block) ide_startstop_t __ide_do_rw_disk (ide_drive_t *drive, struct request *rq, sector_t block)
{ {
BUG_ON(drive->blocked); BUG_ON(drive->blocked);
if (!blk_fs_request(rq)) { if (!blk_fs_request(rq)) {
blk_dump_rq_flags(rq, "do_rw_disk - bad command"); blk_dump_rq_flags(rq, "__ide_do_rw_disk - bad command");
ide_end_request(drive, 0, 0); ide_end_request(drive, 0, 0);
return ide_stopped; return ide_stopped;
} }
...@@ -581,11 +577,6 @@ static ide_startstop_t do_rw_disk (ide_drive_t *drive, struct request *rq, secto ...@@ -581,11 +577,6 @@ static ide_startstop_t do_rw_disk (ide_drive_t *drive, struct request *rq, secto
* need to add split taskfile operations based on 28bit threshold. * need to add split taskfile operations based on 28bit threshold.
*/ */
#if defined(CONFIG_BLK_DEV_PDC4030) || defined(CONFIG_BLK_DEV_PDC4030_MODULE)
if (IS_PDC4030_DRIVE)
return promise_rw_disk(drive, rq, block);
#endif /* CONFIG_BLK_DEV_PDC4030 */
if (drive->using_tcq && idedisk_start_tag(drive, rq)) { if (drive->using_tcq && idedisk_start_tag(drive, rq)) {
if (!ata_pending_commands(drive)) if (!ata_pending_commands(drive))
BUG(); BUG();
...@@ -601,6 +592,7 @@ static ide_startstop_t do_rw_disk (ide_drive_t *drive, struct request *rq, secto ...@@ -601,6 +592,7 @@ static ide_startstop_t do_rw_disk (ide_drive_t *drive, struct request *rq, secto
/* 28-bit CHS : DIE DIE DIE piece of legacy crap!!! */ /* 28-bit CHS : DIE DIE DIE piece of legacy crap!!! */
return chs_rw_disk(drive, rq, (unsigned long) block); return chs_rw_disk(drive, rq, (unsigned long) block);
} }
EXPORT_SYMBOL_GPL(__ide_do_rw_disk);
static task_ioreg_t get_command (ide_drive_t *drive, int cmd) static task_ioreg_t get_command (ide_drive_t *drive, int cmd)
{ {
...@@ -760,6 +752,16 @@ static ide_startstop_t lba_48_rw_disk (ide_drive_t *drive, struct request *rq, u ...@@ -760,6 +752,16 @@ static ide_startstop_t lba_48_rw_disk (ide_drive_t *drive, struct request *rq, u
#endif /* CONFIG_IDE_TASKFILE_IO */ #endif /* CONFIG_IDE_TASKFILE_IO */
static ide_startstop_t ide_do_rw_disk (ide_drive_t *drive, struct request *rq, sector_t block)
{
ide_hwif_t *hwif = HWIF(drive);
if (hwif->rw_disk)
return hwif->rw_disk(drive, rq, block);
else
return __ide_do_rw_disk(drive, rq, block);
}
static int do_idedisk_flushcache(ide_drive_t *drive); static int do_idedisk_flushcache(ide_drive_t *drive);
static u8 idedisk_dump_status (ide_drive_t *drive, const char *msg, u8 stat) static u8 idedisk_dump_status (ide_drive_t *drive, const char *msg, u8 stat)
...@@ -1541,11 +1543,6 @@ static void idedisk_setup (ide_drive_t *drive) ...@@ -1541,11 +1543,6 @@ static void idedisk_setup (ide_drive_t *drive)
struct hd_driveid *id = drive->id; struct hd_driveid *id = drive->id;
unsigned long capacity; unsigned long capacity;
#if 0
if (IS_PDC4030_DRIVE)
DRIVER(drive)->do_request = promise_rw_disk;
#endif
idedisk_add_settings(drive); idedisk_add_settings(drive);
if (drive->id_read == 0) if (drive->id_read == 0)
...@@ -1674,7 +1671,7 @@ static ide_driver_t idedisk_driver = { ...@@ -1674,7 +1671,7 @@ static ide_driver_t idedisk_driver = {
.supports_dsc_overlap = 0, .supports_dsc_overlap = 0,
.cleanup = idedisk_cleanup, .cleanup = idedisk_cleanup,
.flushcache = do_idedisk_flushcache, .flushcache = do_idedisk_flushcache,
.do_request = do_rw_disk, .do_request = ide_do_rw_disk,
.sense = idedisk_dump_status, .sense = idedisk_dump_status,
.error = idedisk_error, .error = idedisk_error,
.abort = idedisk_abort, .abort = idedisk_abort,
......
...@@ -913,6 +913,8 @@ int ide_register_hw (hw_regs_t *hw, ide_hwif_t **hwifp) ...@@ -913,6 +913,8 @@ int ide_register_hw (hw_regs_t *hw, ide_hwif_t **hwifp)
} }
for (index = 0; index < MAX_HWIFS; ++index) { for (index = 0; index < MAX_HWIFS; ++index) {
hwif = &ide_hwifs[index]; hwif = &ide_hwifs[index];
if (hwif->hold)
continue;
if ((!hwif->present && !hwif->mate && !initializing) || if ((!hwif->present && !hwif->mate && !initializing) ||
(!hwif->hw.io_ports[IDE_DATA_OFFSET] && initializing)) (!hwif->hw.io_ports[IDE_DATA_OFFSET] && initializing))
goto found; goto found;
...@@ -924,6 +926,8 @@ int ide_register_hw (hw_regs_t *hw, ide_hwif_t **hwifp) ...@@ -924,6 +926,8 @@ int ide_register_hw (hw_regs_t *hw, ide_hwif_t **hwifp)
found: found:
if (hwif->present) if (hwif->present)
ide_unregister(index); ide_unregister(index);
else if (!hwif->hold)
init_hwif_data(index);
if (hwif->present) if (hwif->present)
return -1; return -1;
memcpy(&hwif->hw, hw, sizeof(*hw)); memcpy(&hwif->hw, hw, sizeof(*hw));
......
...@@ -54,13 +54,7 @@ ...@@ -54,13 +54,7 @@
#include <asm/io.h> #include <asm/io.h>
#ifdef CONFIG_BLK_DEV_ALI14XX_MODULE #include "ide_modes.h"
# define _IDE_C
# include "ide_modes.h"
# undef _IDE_C
#else
# include "ide_modes.h"
#endif /* CONFIG_BLK_DEV_ALI14XX_MODULE */
/* port addresses for auto-detection */ /* port addresses for auto-detection */
#define ALI_NUM_PORTS 4 #define ALI_NUM_PORTS 4
......
...@@ -21,13 +21,7 @@ ...@@ -21,13 +21,7 @@
#include <asm/io.h> #include <asm/io.h>
#ifdef CONFIG_BLK_DEV_DTC2278_MODULE #include "ide_modes.h"
# define _IDE_C
# include "ide_modes.h"
# undef _IDE_C
#else
# include "ide_modes.h"
#endif /* CONFIG_BLK_DEV_DTC2278_MODULE */
/* /*
* Changing this #undef to #define may solve start up problems in some systems. * Changing this #undef to #define may solve start up problems in some systems.
......
...@@ -53,13 +53,7 @@ ...@@ -53,13 +53,7 @@
#include <asm/io.h> #include <asm/io.h>
#ifdef CONFIG_BLK_DEV_HT6560B_MODULE #include "ide_modes.h"
# define _IDE_C
# include "ide_modes.h"
# undef _IDE_C
#else
# include "ide_modes.h"
#endif /* CONFIG_BLK_DEV_HT6560B_MODULE */
/* #define DEBUG */ /* remove comments for DEBUG messages */ /* #define DEBUG */ /* remove comments for DEBUG messages */
......
...@@ -94,6 +94,8 @@ ...@@ -94,6 +94,8 @@
#include "pdc4030.h" #include "pdc4030.h"
static ide_startstop_t promise_rw_disk (ide_drive_t *drive, struct request *rq, unsigned long block);
/* /*
* promise_selectproc() is invoked by ide.c * promise_selectproc() is invoked by ide.c
* in preparation for access to the specified drive. * in preparation for access to the specified drive.
...@@ -231,6 +233,10 @@ int __init setup_pdc4030(ide_hwif_t *hwif) ...@@ -231,6 +233,10 @@ int __init setup_pdc4030(ide_hwif_t *hwif)
/* DC4030 hosted drives need their own identify... */ /* DC4030 hosted drives need their own identify... */
hwif->identify = hwif2->identify = &pdc4030_identify; hwif->identify = hwif2->identify = &pdc4030_identify;
/* Override the normal ide disk read/write. */
hwif->rw_disk = promise_rw_disk;
hwif2->rw_disk = promise_rw_disk;
/* Shift the remaining interfaces up by one */ /* Shift the remaining interfaces up by one */
for (i=MAX_HWIFS-1 ; i > hwif->index+1 ; i--) { for (i=MAX_HWIFS-1 ; i > hwif->index+1 ; i--) {
ide_hwif_t *h = &ide_hwifs[i]; ide_hwif_t *h = &ide_hwifs[i];
...@@ -803,7 +809,7 @@ ide_startstop_t do_pdc4030_io (ide_drive_t *drive, ide_task_t *task) ...@@ -803,7 +809,7 @@ ide_startstop_t do_pdc4030_io (ide_drive_t *drive, ide_task_t *task)
} }
} }
ide_startstop_t promise_rw_disk (ide_drive_t *drive, struct request *rq, unsigned long block) static ide_startstop_t promise_rw_disk (ide_drive_t *drive, struct request *rq, unsigned long block)
{ {
/* The four drives on the two logical (one physical) interfaces /* The four drives on the two logical (one physical) interfaces
are distinguished by writing the drive number (0-3) to the are distinguished by writing the drive number (0-3) to the
......
...@@ -42,14 +42,7 @@ ...@@ -42,14 +42,7 @@
#include <asm/system.h> #include <asm/system.h>
#include <asm/io.h> #include <asm/io.h>
#ifdef CONFIG_BLK_DEV_QD65XX_MODULE #include "ide_modes.h"
# define _IDE_C
# include "ide_modes.h"
# undef _IDE_C
#else
# include "ide_modes.h"
#endif /* CONFIG_BLK_DEV_QD65XX_MODULE */
#include "qd65xx.h" #include "qd65xx.h"
/* /*
......
...@@ -54,13 +54,7 @@ ...@@ -54,13 +54,7 @@
#include <asm/io.h> #include <asm/io.h>
#ifdef CONFIG_BLK_DEV_UMC8672_MODULE #include "ide_modes.h"
# define _IDE_C
# include "ide_modes.h"
# undef _IDE_C
#else
# include "ide_modes.h"
#endif /* CONFIG_BLK_DEV_UMC8672_MODULE */
/* /*
* Default speeds. These can be changed with "auto-tune" and/or hdparm. * Default speeds. These can be changed with "auto-tune" and/or hdparm.
......
...@@ -313,7 +313,8 @@ static unsigned int __init init_chipset_amd74xx(struct pci_dev *dev, const char ...@@ -313,7 +313,8 @@ static unsigned int __init init_chipset_amd74xx(struct pci_dev *dev, const char
case AMD_UDMA_100: case AMD_UDMA_100:
pci_read_config_byte(dev, AMD_CABLE_DETECT, &t); pci_read_config_byte(dev, AMD_CABLE_DETECT, &t);
amd_80w = ((u & 0x3) ? 1 : 0) | ((u & 0xc) ? 2 : 0); pci_read_config_dword(dev, AMD_UDMA_TIMING, &u);
amd_80w = ((t & 0x3) ? 1 : 0) | ((t & 0xc) ? 2 : 0);
for (i = 24; i >= 0; i -= 8) for (i = 24; i >= 0; i -= 8)
if (((u >> i) & 4) && !(amd_80w & (1 << (1 - (i >> 4))))) { if (((u >> i) & 4) && !(amd_80w & (1 << (1 - (i >> 4))))) {
printk(KERN_WARNING "AMD_IDE: Bios didn't set cable bits correctly. Enabling workaround.\n"); printk(KERN_WARNING "AMD_IDE: Bios didn't set cable bits correctly. Enabling workaround.\n");
...@@ -383,11 +384,6 @@ static unsigned int __init init_chipset_amd74xx(struct pci_dev *dev, const char ...@@ -383,11 +384,6 @@ static unsigned int __init init_chipset_amd74xx(struct pci_dev *dev, const char
return 0; return 0;
} }
static unsigned int __init ata66_amd74xx(ide_hwif_t *hwif)
{
return ((amd_enabled & amd_80w) >> hwif->channel) & 1;
}
static void __init init_hwif_amd74xx(ide_hwif_t *hwif) static void __init init_hwif_amd74xx(ide_hwif_t *hwif)
{ {
int i; int i;
......
...@@ -40,7 +40,7 @@ static ide_pci_device_t amd74xx_chipsets[] __devinitdata = { ...@@ -40,7 +40,7 @@ static ide_pci_device_t amd74xx_chipsets[] __devinitdata = {
.init_dma = init_dma_amd74xx, .init_dma = init_dma_amd74xx,
.channels = 2, .channels = 2,
.autodma = AUTODMA, .autodma = AUTODMA,
.enablebits = {{0x40,0x01,0x01}, {0x40,0x02,0x02}}, .enablebits = {{0x40,0x02,0x02}, {0x40,0x01,0x01}},
.bootable = ON_BOARD, .bootable = ON_BOARD,
.extra = 0 .extra = 0
},{ /* 1 */ },{ /* 1 */
...@@ -53,7 +53,7 @@ static ide_pci_device_t amd74xx_chipsets[] __devinitdata = { ...@@ -53,7 +53,7 @@ static ide_pci_device_t amd74xx_chipsets[] __devinitdata = {
.init_dma = init_dma_amd74xx, .init_dma = init_dma_amd74xx,
.channels = 2, .channels = 2,
.autodma = AUTODMA, .autodma = AUTODMA,
.enablebits = {{0x40,0x01,0x01}, {0x40,0x02,0x02}}, .enablebits = {{0x40,0x02,0x02}, {0x40,0x01,0x01}},
.bootable = ON_BOARD, .bootable = ON_BOARD,
.extra = 0 .extra = 0
},{ /* 2 */ },{ /* 2 */
...@@ -66,7 +66,7 @@ static ide_pci_device_t amd74xx_chipsets[] __devinitdata = { ...@@ -66,7 +66,7 @@ static ide_pci_device_t amd74xx_chipsets[] __devinitdata = {
.init_dma = init_dma_amd74xx, .init_dma = init_dma_amd74xx,
.channels = 2, .channels = 2,
.autodma = AUTODMA, .autodma = AUTODMA,
.enablebits = {{0x40,0x01,0x01}, {0x40,0x02,0x02}}, .enablebits = {{0x40,0x02,0x02}, {0x40,0x01,0x01}},
.bootable = ON_BOARD, .bootable = ON_BOARD,
.extra = 0 .extra = 0
},{ /* 3 */ },{ /* 3 */
...@@ -79,7 +79,7 @@ static ide_pci_device_t amd74xx_chipsets[] __devinitdata = { ...@@ -79,7 +79,7 @@ static ide_pci_device_t amd74xx_chipsets[] __devinitdata = {
.init_dma = init_dma_amd74xx, .init_dma = init_dma_amd74xx,
.channels = 2, .channels = 2,
.autodma = AUTODMA, .autodma = AUTODMA,
.enablebits = {{0x40,0x01,0x01}, {0x40,0x02,0x02}}, .enablebits = {{0x40,0x02,0x02}, {0x40,0x01,0x01}},
.bootable = ON_BOARD, .bootable = ON_BOARD,
.extra = 0 .extra = 0
},{ /* 4 */ },{ /* 4 */
...@@ -92,7 +92,7 @@ static ide_pci_device_t amd74xx_chipsets[] __devinitdata = { ...@@ -92,7 +92,7 @@ static ide_pci_device_t amd74xx_chipsets[] __devinitdata = {
.init_dma = init_dma_amd74xx, .init_dma = init_dma_amd74xx,
.autodma = AUTODMA, .autodma = AUTODMA,
.channels = 2, .channels = 2,
.enablebits = {{0x40,0x01,0x01}, {0x40,0x02,0x02}}, .enablebits = {{0x40,0x02,0x02}, {0x40,0x01,0x01}},
.bootable = ON_BOARD, .bootable = ON_BOARD,
.extra = 0 .extra = 0
}, },
...@@ -106,7 +106,7 @@ static ide_pci_device_t amd74xx_chipsets[] __devinitdata = { ...@@ -106,7 +106,7 @@ static ide_pci_device_t amd74xx_chipsets[] __devinitdata = {
.init_dma = init_dma_amd74xx, .init_dma = init_dma_amd74xx,
.channels = 2, .channels = 2,
.autodma = AUTODMA, .autodma = AUTODMA,
.enablebits = {{0x50,0x01,0x01}, {0x50,0x02,0x02}}, .enablebits = {{0x50,0x02,0x02}, {0x50,0x01,0x01}},
.bootable = ON_BOARD, .bootable = ON_BOARD,
.extra = 0, .extra = 0,
}, },
...@@ -120,7 +120,7 @@ static ide_pci_device_t amd74xx_chipsets[] __devinitdata = { ...@@ -120,7 +120,7 @@ static ide_pci_device_t amd74xx_chipsets[] __devinitdata = {
.init_dma = init_dma_amd74xx, .init_dma = init_dma_amd74xx,
.channels = 2, .channels = 2,
.autodma = AUTODMA, .autodma = AUTODMA,
.enablebits = {{0x50,0x01,0x01}, {0x50,0x02,0x02}}, .enablebits = {{0x50,0x02,0x02}, {0x50,0x01,0x01}},
.bootable = ON_BOARD, .bootable = ON_BOARD,
.extra = 0, .extra = 0,
}, },
......
...@@ -142,6 +142,9 @@ static int piix_get_info (char *buffer, char **addr, off_t offset, int count) ...@@ -142,6 +142,9 @@ static int piix_get_info (char *buffer, char **addr, off_t offset, int count)
p += sprintf(p, "\nController: %d\n", i); p += sprintf(p, "\nController: %d\n", i);
p += sprintf(p, "\n Intel "); p += sprintf(p, "\n Intel ");
switch(dev->device) { switch(dev->device) {
case PCI_DEVICE_ID_INTEL_82801EB_1:
p += sprintf(p, "PIIX4 SATA 150 ");
break;
case PCI_DEVICE_ID_INTEL_82801BA_8: case PCI_DEVICE_ID_INTEL_82801BA_8:
case PCI_DEVICE_ID_INTEL_82801BA_9: case PCI_DEVICE_ID_INTEL_82801BA_9:
case PCI_DEVICE_ID_INTEL_82801CA_10: case PCI_DEVICE_ID_INTEL_82801CA_10:
...@@ -275,6 +278,9 @@ static u8 piix_ratemask (ide_drive_t *drive) ...@@ -275,6 +278,9 @@ static u8 piix_ratemask (ide_drive_t *drive)
u8 mode; u8 mode;
switch(dev->device) { switch(dev->device) {
case PCI_DEVICE_ID_INTEL_82801EB_1:
mode = 3;
break;
/* UDMA 100 capable */ /* UDMA 100 capable */
case PCI_DEVICE_ID_INTEL_82801BA_8: case PCI_DEVICE_ID_INTEL_82801BA_8:
case PCI_DEVICE_ID_INTEL_82801BA_9: case PCI_DEVICE_ID_INTEL_82801BA_9:
...@@ -325,6 +331,7 @@ static u8 piix_ratemask (ide_drive_t *drive) ...@@ -325,6 +331,7 @@ static u8 piix_ratemask (ide_drive_t *drive)
static u8 piix_dma_2_pio (u8 xfer_rate) { static u8 piix_dma_2_pio (u8 xfer_rate) {
switch(xfer_rate) { switch(xfer_rate) {
case XFER_UDMA_6:
case XFER_UDMA_5: case XFER_UDMA_5:
case XFER_UDMA_4: case XFER_UDMA_4:
case XFER_UDMA_3: case XFER_UDMA_3:
...@@ -603,6 +610,7 @@ static int piix_config_drive_xfer_rate (ide_drive_t *drive) ...@@ -603,6 +610,7 @@ static int piix_config_drive_xfer_rate (ide_drive_t *drive)
static unsigned int __devinit init_chipset_piix (struct pci_dev *dev, const char *name) static unsigned int __devinit init_chipset_piix (struct pci_dev *dev, const char *name)
{ {
switch(dev->device) { switch(dev->device) {
case PCI_DEVICE_ID_INTEL_82801EB_1:
case PCI_DEVICE_ID_INTEL_82801AA_1: case PCI_DEVICE_ID_INTEL_82801AA_1:
case PCI_DEVICE_ID_INTEL_82801AB_1: case PCI_DEVICE_ID_INTEL_82801AB_1:
case PCI_DEVICE_ID_INTEL_82801BA_8: case PCI_DEVICE_ID_INTEL_82801BA_8:
...@@ -803,6 +811,7 @@ static struct pci_device_id piix_pci_tbl[] __devinitdata = { ...@@ -803,6 +811,7 @@ static struct pci_device_id piix_pci_tbl[] __devinitdata = {
{ PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801EB_11,PCI_ANY_ID, PCI_ANY_ID, 0, 0, 15}, { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801EB_11,PCI_ANY_ID, PCI_ANY_ID, 0, 0, 15},
{ PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801E_11, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 16}, { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801E_11, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 16},
{ PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_10,PCI_ANY_ID, PCI_ANY_ID, 0, 0, 17}, { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_10,PCI_ANY_ID, PCI_ANY_ID, 0, 0, 17},
{ PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801EB_1, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 18},
{ 0, }, { 0, },
}; };
......
...@@ -291,10 +291,10 @@ static ide_pci_device_t piix_pci_info[] __devinitdata = { ...@@ -291,10 +291,10 @@ static ide_pci_device_t piix_pci_info[] __devinitdata = {
.enablebits = {{0x41,0x80,0x80}, {0x43,0x80,0x80}}, .enablebits = {{0x41,0x80,0x80}, {0x43,0x80,0x80}},
.bootable = ON_BOARD, .bootable = ON_BOARD,
.extra = 0, .extra = 0,
},{ /* 17 */ },{ /* 18 */
.vendor = PCI_VENDOR_ID_INTEL, .vendor = PCI_VENDOR_ID_INTEL,
.device = PCI_DEVICE_ID_INTEL_82801DB_10, .device = PCI_DEVICE_ID_INTEL_82801EB_1,
.name = "ICH4", .name = "ICH5-SATA",
.init_setup = init_setup_piix, .init_setup = init_setup_piix,
.init_chipset = init_chipset_piix, .init_chipset = init_chipset_piix,
.init_iops = NULL, .init_iops = NULL,
......
/* /*
* linux/drivers/ide/pci/serverworks.c Version 0.7 10 Sept 2002 * linux/drivers/ide/pci/serverworks.c Version 0.8 25 Ebr 2003
* *
* Copyright (C) 1998-2000 Michel Aubry * Copyright (C) 1998-2000 Michel Aubry
* Copyright (C) 1998-2000 Andrzej Krzysztofowicz * Copyright (C) 1998-2000 Andrzej Krzysztofowicz
...@@ -203,11 +203,22 @@ static int svwks_get_info (char *buffer, char **addr, off_t offset, int count) ...@@ -203,11 +203,22 @@ static int svwks_get_info (char *buffer, char **addr, off_t offset, int count)
} }
#endif /* defined(DISPLAY_SVWKS_TIMINGS) && defined(CONFIG_PROC_FS) */ #endif /* defined(DISPLAY_SVWKS_TIMINGS) && defined(CONFIG_PROC_FS) */
static int check_in_drive_lists (ide_drive_t *drive, const char **list)
{
while (*list)
if (!strcmp(*list++, drive->id->model))
return 1;
return 0;
}
static u8 svwks_ratemask (ide_drive_t *drive) static u8 svwks_ratemask (ide_drive_t *drive)
{ {
struct pci_dev *dev = HWIF(drive)->pci_dev; struct pci_dev *dev = HWIF(drive)->pci_dev;
u8 mode; u8 mode;
if (!svwks_revision)
pci_read_config_byte(dev, PCI_REVISION_ID, &svwks_revision);
if (dev->device == PCI_DEVICE_ID_SERVERWORKS_OSB4IDE) { if (dev->device == PCI_DEVICE_ID_SERVERWORKS_OSB4IDE) {
u32 reg = 0; u32 reg = 0;
if (isa_dev) if (isa_dev)
...@@ -225,9 +236,13 @@ static u8 svwks_ratemask (ide_drive_t *drive) ...@@ -225,9 +236,13 @@ static u8 svwks_ratemask (ide_drive_t *drive)
} else if (svwks_revision >= SVWKS_CSB5_REVISION_NEW) { } else if (svwks_revision >= SVWKS_CSB5_REVISION_NEW) {
u8 btr = 0; u8 btr = 0;
pci_read_config_byte(dev, 0x5A, &btr); pci_read_config_byte(dev, 0x5A, &btr);
mode = btr; mode = btr & 0x3;
if (!eighty_ninty_three(drive)) if (!eighty_ninty_three(drive))
mode = min(mode, (u8)1); mode = min(mode, (u8)1);
/* If someone decides to do UDMA133 on CSB5 the same
issue will bite so be inclusive */
if (mode > 2 && check_in_drive_lists(drive, svwks_bad_ata100))
mode = 2;
} }
if (((dev->device == PCI_DEVICE_ID_SERVERWORKS_CSB6IDE) || if (((dev->device == PCI_DEVICE_ID_SERVERWORKS_CSB6IDE) ||
(dev->device == PCI_DEVICE_ID_SERVERWORKS_CSB6IDE2)) && (dev->device == PCI_DEVICE_ID_SERVERWORKS_CSB6IDE2)) &&
...@@ -419,13 +434,10 @@ static void config_chipset_for_pio (ide_drive_t *drive) ...@@ -419,13 +434,10 @@ static void config_chipset_for_pio (ide_drive_t *drive)
static void svwks_tune_drive (ide_drive_t *drive, u8 pio) static void svwks_tune_drive (ide_drive_t *drive, u8 pio)
{ {
/* Tune to desired value or to "best". We must not adjust if(pio == 255)
"best" when we adjust from pio numbers to rate values! */
if(pio != 255)
(void) svwks_tune_chipset(drive, (XFER_PIO_0 + pio));
else
(void) svwks_tune_chipset(drive, 255); (void) svwks_tune_chipset(drive, 255);
else
(void) svwks_tune_chipset(drive, (XFER_PIO_0 + pio));
} }
static int config_chipset_for_dma (ide_drive_t *drive) static int config_chipset_for_dma (ide_drive_t *drive)
...@@ -446,7 +458,7 @@ static int svwks_config_drive_xfer_rate (ide_drive_t *drive) ...@@ -446,7 +458,7 @@ static int svwks_config_drive_xfer_rate (ide_drive_t *drive)
drive->init_speed = 0; drive->init_speed = 0;
if (id && (id->capability & 1) && drive->autodma) { if ((id->capability & 1) && drive->autodma) {
/* Consult the list of known "bad" drives */ /* Consult the list of known "bad" drives */
if (hwif->ide_dma_bad_drive(drive)) if (hwif->ide_dma_bad_drive(drive))
goto fast_ata_pio; goto fast_ata_pio;
...@@ -483,28 +495,10 @@ static int svwks_config_drive_xfer_rate (ide_drive_t *drive) ...@@ -483,28 +495,10 @@ static int svwks_config_drive_xfer_rate (ide_drive_t *drive)
return hwif->ide_dma_on(drive); return hwif->ide_dma_on(drive);
} }
/* This can go soon */
static int svwks_ide_dma_end (ide_drive_t *drive) static int svwks_ide_dma_end (ide_drive_t *drive)
{ {
/*
* We never place the OSB4 into a UDMA mode with a disk
* medium, that means the UDMA "all my data is 4 byte shifted"
* problem cannot occur.
*/
#if 0
ide_hwif_t *hwif = HWIF(drive);
u8 dma_stat = hwif->INB(hwif->dma_status);
if ((dma_stat & 1) && drive->media == ide_disk)
{
printk(KERN_CRIT "Serverworks OSB4 in impossible state.\n");
printk(KERN_CRIT "Disable UDMA or if you are using Seagate then try switching disk types\n");
printk(KERN_CRIT "on this controller. Please report this event to osb4-bug@ide.cabal.tm\n");
/* Panic might sys_sync -> death by corrupt disk */
printk(KERN_CRIT "OSB4: continuing might cause disk corruption.\n");
while(1)
cpu_relax();
}
#endif
return __ide_dma_end(drive); return __ide_dma_end(drive);
} }
...@@ -630,8 +624,6 @@ static unsigned int __init init_chipset_svwks (struct pci_dev *dev, const char * ...@@ -630,8 +624,6 @@ static unsigned int __init init_chipset_svwks (struct pci_dev *dev, const char *
static unsigned int __init ata66_svwks_svwks (ide_hwif_t *hwif) static unsigned int __init ata66_svwks_svwks (ide_hwif_t *hwif)
{ {
// struct pci_dev *dev = hwif->pci_dev;
// return 0;
return 1; return 1;
} }
......
...@@ -11,6 +11,16 @@ ...@@ -11,6 +11,16 @@
#define SVWKS_CSB5_REVISION_NEW 0x92 /* min PCI_REVISION_ID for UDMA5 (A2.0) */ #define SVWKS_CSB5_REVISION_NEW 0x92 /* min PCI_REVISION_ID for UDMA5 (A2.0) */
#define SVWKS_CSB6_REVISION 0xa0 /* min PCI_REVISION_ID for UDMA4 (A1.0) */ #define SVWKS_CSB6_REVISION 0xa0 /* min PCI_REVISION_ID for UDMA4 (A1.0) */
/* Seagate Barracuda ATA IV Family drives in UDMA mode 5
* can overrun their FIFOs when used with the CSB5 */
const char *svwks_bad_ata100[] = {
"ST320011A",
"ST340016A",
"ST360021A",
"ST380021A",
NULL
};
#define DISPLAY_SVWKS_TIMINGS 1 #define DISPLAY_SVWKS_TIMINGS 1
#if defined(DISPLAY_SVWKS_TIMINGS) && defined(CONFIG_PROC_FS) #if defined(DISPLAY_SVWKS_TIMINGS) && defined(CONFIG_PROC_FS)
......
...@@ -161,9 +161,10 @@ static const struct { ...@@ -161,9 +161,10 @@ static const struct {
{ "SiS748", PCI_DEVICE_ID_SI_748, ATA_133, 0 }, { "SiS748", PCI_DEVICE_ID_SI_748, ATA_133, 0 },
{ "SiS746", PCI_DEVICE_ID_SI_746, ATA_133, 0 }, { "SiS746", PCI_DEVICE_ID_SI_746, ATA_133, 0 },
{ "SiS745", PCI_DEVICE_ID_SI_745, ATA_133, 0 }, { "SiS745", PCI_DEVICE_ID_SI_745, ATA_133, 0 },
{ "SiS740", PCI_DEVICE_ID_SI_740, ATA_100, 0 }, { "SiS740", PCI_DEVICE_ID_SI_740, ATA_133, 0 },
{ "SiS735", PCI_DEVICE_ID_SI_735, ATA_100, SIS5513_LATENCY }, { "SiS735", PCI_DEVICE_ID_SI_735, ATA_100, SIS5513_LATENCY },
{ "SiS730", PCI_DEVICE_ID_SI_730, ATA_100a, SIS5513_LATENCY }, { "SiS730", PCI_DEVICE_ID_SI_730, ATA_100a, SIS5513_LATENCY },
{ "SiS655", PCI_DEVICE_ID_SI_655, ATA_133, 0 },
{ "SiS652", PCI_DEVICE_ID_SI_652, ATA_133, 0 }, { "SiS652", PCI_DEVICE_ID_SI_652, ATA_133, 0 },
{ "SiS651", PCI_DEVICE_ID_SI_651, ATA_133, 0 }, { "SiS651", PCI_DEVICE_ID_SI_651, ATA_133, 0 },
{ "SiS650", PCI_DEVICE_ID_SI_650, ATA_133, 0 }, { "SiS650", PCI_DEVICE_ID_SI_650, ATA_133, 0 },
...@@ -257,8 +258,8 @@ static struct pci_dev *host_dev = NULL; ...@@ -257,8 +258,8 @@ static struct pci_dev *host_dev = NULL;
static char* chipset_capability[] = { static char* chipset_capability[] = {
"ATA", "ATA 16", "ATA", "ATA 16",
"ATA 33", "ATA 66", "ATA 33", "ATA 66",
"ATA 100", "ATA 100", "ATA 100 (1st gen)", "ATA 100 (2nd gen)",
"ATA 133", "ATA 133" "ATA 133 (1st gen)", "ATA 133 (2nd gen)"
}; };
#if defined(DISPLAY_SIS_TIMINGS) && defined(CONFIG_PROC_FS) #if defined(DISPLAY_SIS_TIMINGS) && defined(CONFIG_PROC_FS)
...@@ -331,8 +332,8 @@ static char* get_drives_info (char *buffer, u8 pos) ...@@ -331,8 +332,8 @@ static char* get_drives_info (char *buffer, u8 pos)
// Configuration space remapped to 0x70 // Configuration space remapped to 0x70
drive_pci = 0x70; drive_pci = 0x70;
} }
pci_read_config_dword(bmide_dev, (unsigned long)drive_pci+8*pos, &regdw0); pci_read_config_dword(bmide_dev, (unsigned long)drive_pci+4*pos, &regdw0);
pci_read_config_dword(bmide_dev, (unsigned long)drive_pci+8*pos+4, &regdw1); pci_read_config_dword(bmide_dev, (unsigned long)drive_pci+4*pos+8, &regdw1);
p += sprintf(p, "Drive %d:\n", pos); p += sprintf(p, "Drive %d:\n", pos);
} }
...@@ -357,8 +358,7 @@ static char* get_drives_info (char *buffer, u8 pos) ...@@ -357,8 +358,7 @@ static char* get_drives_info (char *buffer, u8 pos)
case ATA_100a: p += sprintf(p, cycle_time[(reg01 & 0x70) >> 4]); break; case ATA_100a: p += sprintf(p, cycle_time[(reg01 & 0x70) >> 4]); break;
case ATA_100: case ATA_100:
case ATA_133a: p += sprintf(p, cycle_time[reg01 & 0x0F]); break; case ATA_133a: p += sprintf(p, cycle_time[reg01 & 0x0F]); break;
case ATA_133: default: p += sprintf(p, "?"); break;
default: p += sprintf(p, "133+ ?"); break;
} }
p += sprintf(p, " \t UDMA Cycle Time "); p += sprintf(p, " \t UDMA Cycle Time ");
switch(chipset_family) { switch(chipset_family) {
...@@ -367,12 +367,12 @@ static char* get_drives_info (char *buffer, u8 pos) ...@@ -367,12 +367,12 @@ static char* get_drives_info (char *buffer, u8 pos)
case ATA_100a: p += sprintf(p, cycle_time[(reg11 & 0x70) >> 4]); break; case ATA_100a: p += sprintf(p, cycle_time[(reg11 & 0x70) >> 4]); break;
case ATA_100: case ATA_100:
case ATA_133a: p += sprintf(p, cycle_time[reg11 & 0x0F]); break; case ATA_133a: p += sprintf(p, cycle_time[reg11 & 0x0F]); break;
case ATA_133: default: p += sprintf(p, "?"); break;
default: p += sprintf(p, "133+ ?"); break;
} }
p += sprintf(p, "\n"); p += sprintf(p, "\n");
} }
if (chipset_family < ATA_133) { /* else case TODO */
/* Data Active */ /* Data Active */
p += sprintf(p, " Data Active Time "); p += sprintf(p, " Data Active Time ");
switch(chipset_family) { switch(chipset_family) {
...@@ -383,8 +383,7 @@ static char* get_drives_info (char *buffer, u8 pos) ...@@ -383,8 +383,7 @@ static char* get_drives_info (char *buffer, u8 pos)
case ATA_100a: p += sprintf(p, active_time[reg01 & 0x07]); break; case ATA_100a: p += sprintf(p, active_time[reg01 & 0x07]); break;
case ATA_100: case ATA_100:
case ATA_133a: p += sprintf(p, active_time[(reg00 & 0x70) >> 4]); break; case ATA_133a: p += sprintf(p, active_time[(reg00 & 0x70) >> 4]); break;
case ATA_133: default: p += sprintf(p, "?"); break;
default: p += sprintf(p, "133+ ?"); break;
} }
p += sprintf(p, " \t Data Active Time "); p += sprintf(p, " \t Data Active Time ");
switch(chipset_family) { switch(chipset_family) {
...@@ -395,14 +394,12 @@ static char* get_drives_info (char *buffer, u8 pos) ...@@ -395,14 +394,12 @@ static char* get_drives_info (char *buffer, u8 pos)
case ATA_100a: p += sprintf(p, active_time[reg11 & 0x07]); break; case ATA_100a: p += sprintf(p, active_time[reg11 & 0x07]); break;
case ATA_100: case ATA_100:
case ATA_133a: p += sprintf(p, active_time[(reg10 & 0x70) >> 4]); break; case ATA_133a: p += sprintf(p, active_time[(reg10 & 0x70) >> 4]); break;
case ATA_133: default: p += sprintf(p, "?"); break;
default: p += sprintf(p, "133+ ?"); break;
} }
p += sprintf(p, "\n"); p += sprintf(p, "\n");
/* Data Recovery */ /* Data Recovery */
/* warning: may need (reg&0x07) for pre ATA66 chips */ /* warning: may need (reg&0x07) for pre ATA66 chips */
if (chipset_family < ATA_133) {
p += sprintf(p, " Data Recovery Time %s \t Data Recovery Time %s\n", p += sprintf(p, " Data Recovery Time %s \t Data Recovery Time %s\n",
recovery_time[reg00 & 0x0f], recovery_time[reg10 & 0x0f]); recovery_time[reg00 & 0x0f], recovery_time[reg10 & 0x0f]);
} }
...@@ -430,7 +427,6 @@ static int sis_get_info (char *buffer, char **addr, off_t offset, int count) ...@@ -430,7 +427,6 @@ static int sis_get_info (char *buffer, char **addr, off_t offset, int count)
p += sprintf(p, "\nSiS 5513 "); p += sprintf(p, "\nSiS 5513 ");
switch(chipset_family) { switch(chipset_family) {
case ATA_00: p += sprintf(p, "Unknown???"); break;
case ATA_16: p += sprintf(p, "DMA 16"); break; case ATA_16: p += sprintf(p, "DMA 16"); break;
case ATA_33: p += sprintf(p, "Ultra 33"); break; case ATA_33: p += sprintf(p, "Ultra 33"); break;
case ATA_66: p += sprintf(p, "Ultra 66"); break; case ATA_66: p += sprintf(p, "Ultra 66"); break;
...@@ -867,6 +863,19 @@ static int sis5513_config_xfer_rate (ide_drive_t *drive) ...@@ -867,6 +863,19 @@ static int sis5513_config_xfer_rate (ide_drive_t *drive)
return sis5513_config_drive_xfer_rate(drive); return sis5513_config_drive_xfer_rate(drive);
} }
/* Helper function used at init time
* returns a PCI device revision ID
* (used to detect different IDE controller versions)
*/
static u8 __init devfn_rev(int device, int function)
{
u8 revision;
/* Find device */
struct pci_dev* dev = pci_find_slot(0,PCI_DEVFN(device,function));
pci_read_config_byte(dev, PCI_REVISION_ID, &revision);
return revision;
}
/* Chip detection and general config */ /* Chip detection and general config */
static unsigned int __init init_chipset_sis5513 (struct pci_dev *dev, const char *name) static unsigned int __init init_chipset_sis5513 (struct pci_dev *dev, const char *name)
{ {
...@@ -887,26 +896,24 @@ static unsigned int __init init_chipset_sis5513 (struct pci_dev *dev, const char ...@@ -887,26 +896,24 @@ static unsigned int __init init_chipset_sis5513 (struct pci_dev *dev, const char
/* check 100/133 chipset family */ /* check 100/133 chipset family */
if (chipset_family == ATA_133) { if (chipset_family == ATA_133) {
u32 reg54h; u32 reg54h;
u16 reg02h; u16 devid;
pci_read_config_dword(dev, 0x54, &reg54h); pci_read_config_dword(dev, 0x54, &reg54h);
/* SiS962 and above report 0x5518 dev id if high bit is cleared */
pci_write_config_dword(dev, 0x54, (reg54h & 0x7fffffff)); pci_write_config_dword(dev, 0x54, (reg54h & 0x7fffffff));
pci_read_config_word(dev, 0x02, &reg02h); pci_read_config_word(dev, 0x02, &devid);
/* restore register 0x54 */
pci_write_config_dword(dev, 0x54, reg54h); pci_write_config_dword(dev, 0x54, reg54h);
/* devid 5518 here means SiS962 or later /* devid 5518 here means SiS962 or later
which supports ATA133 */ which supports ATA133.
if (reg02h != 0x5518) { These are refered by chipset_family = ATA133
*/
if (devid != 0x5518) {
u8 reg49h; u8 reg49h;
unsigned long sbrev;
/* SiS961 family */ /* SiS961 family */
/*
* FIXME !!! GAK!!!!!!!!!! PCI DIRECT POKING
*/
outl(0x80001008, 0x0cf8);
sbrev = inl(0x0cfc);
pci_read_config_byte(dev, 0x49, &reg49h); pci_read_config_byte(dev, 0x49, &reg49h);
if (((sbrev & 0xff) == 0x10) && (reg49h & 0x80)) /* check isa bridge device rev id */
if (((devfn_rev(2,0) & 0xff) == 0x10) && (reg49h & 0x80))
chipset_family = ATA_133a; chipset_family = ATA_133a;
else else
chipset_family = ATA_100; chipset_family = ATA_100;
...@@ -924,6 +931,14 @@ static unsigned int __init init_chipset_sis5513 (struct pci_dev *dev, const char ...@@ -924,6 +931,14 @@ static unsigned int __init init_chipset_sis5513 (struct pci_dev *dev, const char
u8 latency = (chipset_family == ATA_100)? 0x80 : 0x10; /* Lacking specs */ u8 latency = (chipset_family == ATA_100)? 0x80 : 0x10; /* Lacking specs */
pci_write_config_byte(dev, PCI_LATENCY_TIMER, latency); pci_write_config_byte(dev, PCI_LATENCY_TIMER, latency);
} }
/* Special case for SiS630 : 630S/ET is ATA_100a */
if (SiSHostChipInfo[i].host_id == PCI_DEVICE_ID_SI_630) {
/* check host device rev id */
if (devfn_rev(0,0) >= 0x30) {
chipset_family = ATA_100a;
}
}
} }
/* Make general config ops here /* Make general config ops here
......
/* /*
* *
* Version 3.36 * Version 3.37
* *
* VIA IDE driver for Linux. Supported southbridges: * VIA IDE driver for Linux. Supported southbridges:
* *
* vt82c576, vt82c586, vt82c586a, vt82c586b, vt82c596a, vt82c596b, * vt82c576, vt82c586, vt82c586a, vt82c586b, vt82c596a, vt82c596b,
* vt82c686, vt82c686a, vt82c686b, vt8231, vt8233, vt8233c, vt8233a, * vt82c686, vt82c686a, vt82c686b, vt8231, vt8233, vt8233c, vt8233a,
* vt8235 * vt8235, vt8237
* *
* Copyright (c) 2000-2002 Vojtech Pavlik * Copyright (c) 2000-2002 Vojtech Pavlik
* *
...@@ -74,9 +74,7 @@ static struct via_isa_bridge { ...@@ -74,9 +74,7 @@ static struct via_isa_bridge {
u8 rev_max; u8 rev_max;
u16 flags; u16 flags;
} via_isa_bridges[] = { } via_isa_bridges[] = {
#ifdef FUTURE_BRIDGES { "vt8237", PCI_DEVICE_ID_VIA_8237, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST },
{ "vt8237", PCI_DEVICE_ID_VIA_8237, 0x00, 0x2f, VIA_UDMA_133 },
#endif
{ "vt8235", PCI_DEVICE_ID_VIA_8235, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST }, { "vt8235", PCI_DEVICE_ID_VIA_8235, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST },
{ "vt8233a", PCI_DEVICE_ID_VIA_8233A, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST }, { "vt8233a", PCI_DEVICE_ID_VIA_8233A, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST },
{ "vt8233c", PCI_DEVICE_ID_VIA_8233C_0, 0x00, 0x2f, VIA_UDMA_100 }, { "vt8233c", PCI_DEVICE_ID_VIA_8233C_0, 0x00, 0x2f, VIA_UDMA_100 },
...@@ -148,7 +146,7 @@ static int via_get_info(char *buffer, char **addr, off_t offset, int count) ...@@ -148,7 +146,7 @@ static int via_get_info(char *buffer, char **addr, off_t offset, int count)
via_print("----------VIA BusMastering IDE Configuration" via_print("----------VIA BusMastering IDE Configuration"
"----------------"); "----------------");
via_print("Driver Version: 3.36"); via_print("Driver Version: 3.37");
via_print("South Bridge: VIA %s", via_print("South Bridge: VIA %s",
via_config->name); via_config->name);
......
...@@ -636,6 +636,21 @@ static void __init quirk_via_bridge(struct pci_dev *pdev) ...@@ -636,6 +636,21 @@ static void __init quirk_via_bridge(struct pci_dev *pdev)
interrupt_line_quirk = 1; interrupt_line_quirk = 1;
} }
/*
* Serverworks CSB5 IDE does not fully support native mode
*/
static void __init quirk_svwks_csb5ide(struct pci_dev *pdev)
{
u8 prog;
pci_read_config_byte(pdev, PCI_CLASS_PROG, &prog);
if (prog & 5) {
prog &= ~5;
pdev->class &= ~5;
pci_write_config_byte(pdev, PCI_CLASS_PROG, prog);
/* need to re-assign BARs for compat mode */
quirk_ide_bases(pdev);
}
}
/* This was originally an Alpha specific thing, but it really fits here. /* This was originally an Alpha specific thing, but it really fits here.
* The i82375 PCI/EISA bridge appears as non-classified. Fix that. * The i82375 PCI/EISA bridge appears as non-classified. Fix that.
...@@ -813,6 +828,8 @@ static struct pci_fixup pci_fixups[] __devinitdata = { ...@@ -813,6 +828,8 @@ static struct pci_fixup pci_fixups[] __devinitdata = {
{ PCI_FIXUP_FINAL, PCI_VENDOR_ID_CYRIX, PCI_DEVICE_ID_CYRIX_PCI_MASTER, quirk_mediagx_master }, { PCI_FIXUP_FINAL, PCI_VENDOR_ID_CYRIX, PCI_DEVICE_ID_CYRIX_PCI_MASTER, quirk_mediagx_master },
{ PCI_FIXUP_HEADER, PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_CSB5IDE, quirk_svwks_csb5ide },
{ PCI_FIXUP_HEADER, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82375, quirk_eisa_bridge }, { PCI_FIXUP_HEADER, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82375, quirk_eisa_bridge },
/* /*
......
...@@ -64,7 +64,7 @@ ...@@ -64,7 +64,7 @@
/* Version string */ /* Version string */
#define ACPI_CA_VERSION 0x20030418 #define ACPI_CA_VERSION 0x20030522
/* Maximum objects in the various object caches */ /* Maximum objects in the various object caches */
...@@ -133,6 +133,11 @@ ...@@ -133,6 +133,11 @@
#define ACPI_MAX_STRING_CONVERSION 200 #define ACPI_MAX_STRING_CONVERSION 200
/* Length of _HID, _UID, and _CID values */
#define ACPI_DEVICE_ID_LENGTH 0x09
#define ACPI_MAX_CID_LENGTH 48
/* /*
* Operand Stack (in WALK_STATE), Must be large enough to contain METHOD_MAX_ARG * Operand Stack (in WALK_STATE), Must be large enough to contain METHOD_MAX_ARG
*/ */
......
...@@ -229,10 +229,6 @@ acpi_db_decode_and_display_object ( ...@@ -229,10 +229,6 @@ acpi_db_decode_and_display_object (
char *target, char *target,
char *output_type); char *output_type);
void
acpi_db_decode_node (
struct acpi_namespace_node *node);
void void
acpi_db_display_result_object ( acpi_db_display_result_object (
union acpi_operand_object *obj_desc, union acpi_operand_object *obj_desc,
...@@ -242,11 +238,6 @@ acpi_status ...@@ -242,11 +238,6 @@ acpi_status
acpi_db_display_all_methods ( acpi_db_display_all_methods (
char *display_count_arg); char *display_count_arg);
void
acpi_db_display_internal_object (
union acpi_operand_object *obj_desc,
struct acpi_walk_state *walk_state);
void void
acpi_db_display_arguments ( acpi_db_display_arguments (
void); void);
...@@ -263,6 +254,10 @@ void ...@@ -263,6 +254,10 @@ void
acpi_db_display_calling_tree ( acpi_db_display_calling_tree (
void); void);
void
acpi_db_display_object_type (
char *object_arg);
void void
acpi_db_display_argument_object ( acpi_db_display_argument_object (
union acpi_operand_object *obj_desc, union acpi_operand_object *obj_desc,
...@@ -276,10 +271,6 @@ void * ...@@ -276,10 +271,6 @@ void *
acpi_db_get_pointer ( acpi_db_get_pointer (
void *target); void *target);
void
acpi_db_decode_internal_object (
union acpi_operand_object *obj_desc);
/* /*
* dbexec - debugger control method execution * dbexec - debugger control method execution
......
This diff is collapsed.
...@@ -165,7 +165,7 @@ acpi_ev_address_space_dispatch ( ...@@ -165,7 +165,7 @@ acpi_ev_address_space_dispatch (
void *value); void *value);
acpi_status acpi_status
acpi_ev_addr_handler_helper ( acpi_ev_install_handler (
acpi_handle obj_handle, acpi_handle obj_handle,
u32 level, u32 level,
void *context, void *context,
......
...@@ -94,8 +94,9 @@ ...@@ -94,8 +94,9 @@
#define AE_NO_GLOBAL_LOCK (acpi_status) (0x001A | AE_CODE_ENVIRONMENTAL) #define AE_NO_GLOBAL_LOCK (acpi_status) (0x001A | AE_CODE_ENVIRONMENTAL)
#define AE_LOGICAL_ADDRESS (acpi_status) (0x001B | AE_CODE_ENVIRONMENTAL) #define AE_LOGICAL_ADDRESS (acpi_status) (0x001B | AE_CODE_ENVIRONMENTAL)
#define AE_ABORT_METHOD (acpi_status) (0x001C | AE_CODE_ENVIRONMENTAL) #define AE_ABORT_METHOD (acpi_status) (0x001C | AE_CODE_ENVIRONMENTAL)
#define AE_SAME_HANDLER (acpi_status) (0x001D | AE_CODE_ENVIRONMENTAL)
#define AE_CODE_ENV_MAX 0x001C #define AE_CODE_ENV_MAX 0x001D
/* /*
* Programmer exceptions * Programmer exceptions
...@@ -219,7 +220,8 @@ char const *acpi_gbl_exception_names_env[] = ...@@ -219,7 +220,8 @@ char const *acpi_gbl_exception_names_env[] =
"AE_NO_HARDWARE_RESPONSE", "AE_NO_HARDWARE_RESPONSE",
"AE_NO_GLOBAL_LOCK", "AE_NO_GLOBAL_LOCK",
"AE_LOGICAL_ADDRESS", "AE_LOGICAL_ADDRESS",
"AE_ABORT_METHOD" "AE_ABORT_METHOD",
"AE_SAME_HANDLER"
}; };
char const *acpi_gbl_exception_names_pgm[] = char const *acpi_gbl_exception_names_pgm[] =
......
...@@ -105,6 +105,8 @@ ACPI_EXTERN struct acpi_common_facs acpi_gbl_common_fACS; ...@@ -105,6 +105,8 @@ ACPI_EXTERN struct acpi_common_facs acpi_gbl_common_fACS;
*/ */
ACPI_EXTERN u8 acpi_gbl_integer_bit_width; ACPI_EXTERN u8 acpi_gbl_integer_bit_width;
ACPI_EXTERN u8 acpi_gbl_integer_byte_width; ACPI_EXTERN u8 acpi_gbl_integer_byte_width;
ACPI_EXTERN struct acpi_generic_address acpi_gbl_xpm1a_enable;
ACPI_EXTERN struct acpi_generic_address acpi_gbl_xpm1b_enable;
/* /*
* Since there may be multiple SSDTs and PSDTS, a single pointer is not * Since there may be multiple SSDTs and PSDTS, a single pointer is not
...@@ -115,15 +117,15 @@ ACPI_EXTERN u8 acpi_gbl_integer_byte_width; ...@@ -115,15 +117,15 @@ ACPI_EXTERN u8 acpi_gbl_integer_byte_width;
/* /*
* ACPI Table info arrays * ACPI Table info arrays
*/ */
extern struct acpi_table_desc acpi_gbl_acpi_tables[NUM_ACPI_TABLES]; extern struct acpi_table_list acpi_gbl_table_lists[NUM_ACPI_TABLE_TYPES];
extern struct acpi_table_support acpi_gbl_acpi_table_data[NUM_ACPI_TABLES]; extern struct acpi_table_support acpi_gbl_table_data[NUM_ACPI_TABLE_TYPES];
/* /*
* Predefined mutex objects. This array contains the * Predefined mutex objects. This array contains the
* actual OS mutex handles, indexed by the local ACPI_MUTEX_HANDLEs. * actual OS mutex handles, indexed by the local ACPI_MUTEX_HANDLEs.
* (The table maps local handles to the real OS handles) * (The table maps local handles to the real OS handles)
*/ */
ACPI_EXTERN struct acpi_mutex_info acpi_gbl_acpi_mutex_info [NUM_MTX]; ACPI_EXTERN struct acpi_mutex_info acpi_gbl_mutex_info[NUM_MUTEX];
/***************************************************************************** /*****************************************************************************
...@@ -134,8 +136,8 @@ ACPI_EXTERN struct acpi_mutex_info acpi_gbl_acpi_mutex_info [NUM_MT ...@@ -134,8 +136,8 @@ ACPI_EXTERN struct acpi_mutex_info acpi_gbl_acpi_mutex_info [NUM_MT
ACPI_EXTERN struct acpi_memory_list acpi_gbl_memory_lists[ACPI_NUM_MEM_LISTS]; ACPI_EXTERN struct acpi_memory_list acpi_gbl_memory_lists[ACPI_NUM_MEM_LISTS];
ACPI_EXTERN struct acpi_object_notify_handler acpi_gbl_drv_notify; ACPI_EXTERN struct acpi_object_notify_handler acpi_gbl_device_notify;
ACPI_EXTERN struct acpi_object_notify_handler acpi_gbl_sys_notify; ACPI_EXTERN struct acpi_object_notify_handler acpi_gbl_system_notify;
ACPI_EXTERN acpi_init_handler acpi_gbl_init_handler; ACPI_EXTERN acpi_init_handler acpi_gbl_init_handler;
ACPI_EXTERN struct acpi_walk_state *acpi_gbl_breakpoint_walk; ACPI_EXTERN struct acpi_walk_state *acpi_gbl_breakpoint_walk;
ACPI_EXTERN acpi_handle acpi_gbl_global_lock_semaphore; ACPI_EXTERN acpi_handle acpi_gbl_global_lock_semaphore;
......
...@@ -98,15 +98,13 @@ acpi_status ...@@ -98,15 +98,13 @@ acpi_status
acpi_hw_low_level_read ( acpi_hw_low_level_read (
u32 width, u32 width,
u32 *value, u32 *value,
struct acpi_generic_address *reg, struct acpi_generic_address *reg);
u32 offset);
acpi_status acpi_status
acpi_hw_low_level_write ( acpi_hw_low_level_write (
u32 width, u32 width,
u32 value, u32 value,
struct acpi_generic_address *reg, struct acpi_generic_address *reg);
u32 offset);
acpi_status acpi_status
acpi_hw_clear_acpi_status ( acpi_hw_clear_acpi_status (
......
...@@ -87,8 +87,8 @@ typedef u32 acpi_mutex_handle; ...@@ -87,8 +87,8 @@ typedef u32 acpi_mutex_handle;
#define ACPI_MTX_DEBUG_CMD_COMPLETE 11 #define ACPI_MTX_DEBUG_CMD_COMPLETE 11
#define ACPI_MTX_DEBUG_CMD_READY 12 #define ACPI_MTX_DEBUG_CMD_READY 12
#define MAX_MTX 12 #define MAX_MUTEX 12
#define NUM_MTX MAX_MTX+1 #define NUM_MUTEX MAX_MUTEX+1
#if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER) #if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER)
...@@ -140,12 +140,8 @@ struct acpi_mutex_info ...@@ -140,12 +140,8 @@ struct acpi_mutex_info
typedef u16 acpi_owner_id; typedef u16 acpi_owner_id;
#define ACPI_OWNER_TYPE_TABLE 0x0 #define ACPI_OWNER_TYPE_TABLE 0x0
#define ACPI_OWNER_TYPE_METHOD 0x1 #define ACPI_OWNER_TYPE_METHOD 0x1
#define ACPI_FIRST_METHOD_ID 0x0000 #define ACPI_FIRST_METHOD_ID 0x0001
#define ACPI_FIRST_TABLE_ID 0x8000 #define ACPI_FIRST_TABLE_ID 0xF000
/* TBD: [Restructure] get rid of the need for this! */
#define TABLE_ID_DSDT (acpi_owner_id) 0x8000
/* Field access granularities */ /* Field access granularities */
...@@ -232,13 +228,18 @@ struct acpi_table_desc ...@@ -232,13 +228,18 @@ struct acpi_table_desc
u64 physical_address; u64 physical_address;
u32 aml_length; u32 aml_length;
acpi_size length; acpi_size length;
u32 count;
acpi_owner_id table_id; acpi_owner_id table_id;
u8 type; u8 type;
u8 allocation; u8 allocation;
u8 loaded_into_namespace; u8 loaded_into_namespace;
}; };
struct acpi_table_list
{
struct acpi_table_desc *next;
u32 count;
};
struct acpi_find_context struct acpi_find_context
{ {
...@@ -855,16 +856,6 @@ struct acpi_bit_register_info ...@@ -855,16 +856,6 @@ struct acpi_bit_register_info
#define ACPI_RDESC_TYPE_QWORD_ADDRESS_SPACE 0x8A #define ACPI_RDESC_TYPE_QWORD_ADDRESS_SPACE 0x8A
/* String version of device HIDs and UIDs */
#define ACPI_DEVICE_ID_LENGTH 0x09
struct acpi_device_id
{
char buffer[ACPI_DEVICE_ID_LENGTH];
};
/***************************************************************************** /*****************************************************************************
* *
* Miscellaneous * Miscellaneous
......
...@@ -440,26 +440,6 @@ ...@@ -440,26 +440,6 @@
#define INCREMENT_ARG_LIST(list) (list >>= ((u32) ARG_TYPE_WIDTH)) #define INCREMENT_ARG_LIST(list) (list >>= ((u32) ARG_TYPE_WIDTH))
/*
* Build a GAS structure from earlier ACPI table entries (V1.0 and 0.71 extensions)
*
* 1) Address space
* 2) Length in bytes -- convert to length in bits
* 3) Bit offset is zero
* 4) Reserved field is zero
* 5) Expand address to 64 bits
*/
#define ASL_BUILD_GAS_FROM_ENTRY(a,b,c,d) do {a.address_space_id = (u8) d;\
a.register_bit_width = (u8) ACPI_MUL_8 (b);\
a.register_bit_offset = 0;\
a.reserved = 0;\
ACPI_STORE_ADDRESS (a.address,(acpi_physical_address) c);} while (0)
/* ACPI V1.0 entries -- address space is always I/O */
#define ASL_BUILD_GAS_FROM_V1_ENTRY(a,b,c) ASL_BUILD_GAS_FROM_ENTRY(a,b,c,ACPI_ADR_SPACE_SYSTEM_IO)
/* /*
* Reporting macros that are never compiled out * Reporting macros that are never compiled out
*/ */
......
...@@ -201,6 +201,11 @@ acpi_ns_compare_names ( ...@@ -201,6 +201,11 @@ acpi_ns_compare_names (
char *name1, char *name1,
char *name2); char *name2);
void
acpi_ns_remove_reference (
struct acpi_namespace_node *node);
/* /*
* Namespace modification - nsmodify * Namespace modification - nsmodify
*/ */
......
This diff is collapsed.
...@@ -186,6 +186,7 @@ struct acpi_device_pnp { ...@@ -186,6 +186,7 @@ struct acpi_device_pnp {
acpi_bus_id bus_id; /* Object name */ acpi_bus_id bus_id; /* Object name */
acpi_bus_address bus_address; /* _ADR */ acpi_bus_address bus_address; /* _ADR */
acpi_hardware_id hardware_id; /* _HID */ acpi_hardware_id hardware_id; /* _HID */
struct acpi_compatible_id_list *cid_list; /* _CIDs */
acpi_unique_id unique_id; /* _UID */ acpi_unique_id unique_id; /* _UID */
acpi_device_name device_name; /* Driver-determined */ acpi_device_name device_name; /* Driver-determined */
acpi_device_class device_class; /* " */ acpi_device_class device_class; /* " */
......
...@@ -290,12 +290,12 @@ acpi_os_derive_pci_id( ...@@ -290,12 +290,12 @@ acpi_os_derive_pci_id(
u8 u8
acpi_os_readable ( acpi_os_readable (
void *pointer, void *pointer,
u32 length); acpi_size length);
u8 u8
acpi_os_writable ( acpi_os_writable (
void *pointer, void *pointer,
u32 length); acpi_size length);
u32 u32
acpi_os_get_timer ( acpi_os_get_timer (
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment