*
* FUNCTION: acpi_ds_parse_method
*
- * PARAMETERS: obj_handle - Node of the method
- * Level - Current nesting level
- * Context - Points to a method counter
- * return_value - Not used
+ * PARAMETERS: obj_handle - Method node
*
* RETURN: Status
*
- * DESCRIPTION: Call the parser and parse the AML that is
- * associated with the method.
+ * DESCRIPTION: Call the parser and parse the AML that is associated with the
+ * method.
*
* MUTEX: Assumes parser is locked
*
* increments the thread count, and waits at the method semaphore
* for clearance to execute.
*
- * MUTEX: Locks/unlocks parser.
- *
******************************************************************************/
acpi_status
*
* FUNCTION: acpi_ds_call_control_method
*
- * PARAMETERS: walk_state - Current state of the walk
+ * PARAMETERS: Thread - Info for this thread
+ * this_walk_state - Current walk state
* Op - Current Op to be walked
*
* RETURN: Status
*
* FUNCTION: acpi_ds_restart_control_method
*
- * PARAMETERS: walk_state - State of the method when it was preempted
- * Op - Pointer to new current op
+ * PARAMETERS: walk_state - State for preempted method (caller)
+ * return_desc - Return value from the called method
*
* RETURN: Status
*
- * DESCRIPTION: Restart a method that was preempted
+ * DESCRIPTION: Restart a method that was preempted by another (nested) method
+ * invocation. Handle the return value (if any) from the callee.
*
******************************************************************************/
ACPI_FUNCTION_TRACE_PTR ("ds_restart_control_method", walk_state);
+ ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
+ "****Restart [%4.4s] Op %p return_value_from_callee %p\n",
+ (char *) &walk_state->method_node->name, walk_state->method_call_op,
+ return_desc));
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
+ " return_from_this_method_used?=%X res_stack %p Walk %p\n",
+ walk_state->return_used,
+ walk_state->results, walk_state));
+
+ /* Did the called method return a value? */
+
if (return_desc) {
+ /* Are we actually going to use the return value? */
+
if (walk_state->return_used) {
- /*
- * Get the return value (if any) from the previous method.
- * NULL if no return value
- */
+ /* Save the return value from the previous method */
+
status = acpi_ds_result_push (return_desc, walk_state);
if (ACPI_FAILURE (status)) {
acpi_ut_remove_reference (return_desc);
return_ACPI_STATUS (status);
}
+
+ /*
+ * Save as THIS method's return value in case it is returned
+ * immediately to yet another method
+ */
+ walk_state->return_desc = return_desc;
}
else {
/*
}
}
- ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
- "Method=%p Return=%p return_used?=%X res_stack=%p State=%p\n",
- walk_state->method_call_op, return_desc, walk_state->return_used,
- walk_state->results, walk_state));
-
return_ACPI_STATUS (AE_OK);
}
*
* FUNCTION: acpi_ds_is_result_used
*
- * PARAMETERS: Op
- * result_obj
- * walk_state
+ * PARAMETERS: Op - Current Op
+ * walk_state - Current State
*
- * RETURN: Status
+ * RETURN: TRUE if result is used, FALSE otherwise
*
* DESCRIPTION: Check if a result object will be used by the parent
*
}
/*
- * If there is no parent, the result can't possibly be used!
- * (An executing method typically has no parent, since each
- * method is parsed separately) However, a method that is
- * invoked from another method has a parent.
+ * If there is no parent, we are executing at the method level.
+ * An executing method typically has no parent, since each method
+ * is parsed separately.
*/
if (!op->common.parent) {
+ /*
+ * If this is the last statement in the method, we know it is not a
+ * Return() operator (would not come here.) The following code is the
+ * optional support for a so-called "implicit return". Some AML code
+ * assumes that the last value of the method is "implicitly" returned
+ * to the caller. Just save the last result as the return value.
+ * NOTE: this is optional because the ASL language does not actually
+ * support this behavior.
+ */
+ if ((acpi_gbl_enable_interpeter_slack) &&
+ (walk_state->parser_state.aml >= walk_state->parser_state.aml_end)) {
+ ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
+ "Result of [%s] will be implicitly returned\n",
+ acpi_ps_get_opcode_name (op->common.aml_opcode)));
+
+ /* Use the top of the result stack as the implicit return value */
+
+ walk_state->return_desc = walk_state->results->results.obj_desc[0];
+ return_VALUE (TRUE);
+ }
+
+ /* No parent, the return value cannot possibly be used */
+
return_VALUE (FALSE);
}
- /*
- * Get info on the parent. The root Op is AML_SCOPE
- */
+ /* Get info on the parent. The root_op is AML_SCOPE */
+
parent_info = acpi_ps_get_opcode_info (op->common.parent->common.aml_opcode);
if (parent_info->class == AML_CLASS_UNKNOWN) {
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Unknown parent opcode. Op=%p\n", op));
*
* FUNCTION: acpi_ds_delete_result_if_not_used
*
- * PARAMETERS: Op
- * result_obj
- * walk_state
+ * PARAMETERS: Op - Current parse Op
+ * result_obj - Result of the operation
+ * walk_state - Current state
*
* RETURN: Status
*
*
* FUNCTION: acpi_ds_create_operand
*
- * PARAMETERS: walk_state
- * Arg
+ * PARAMETERS: walk_state - Current walk state
+ * Arg - Parse object for the argument
+ * arg_index - Which argument (zero based)
*
* RETURN: Status
*
* FUNCTION: acpi_ev_update_gpe_enable_masks
*
* PARAMETERS: gpe_event_info - GPE to update
+ * Type - What to do: ACPI_GPE_DISABLE or
+ * ACPI_GPE_ENABLE
*
* RETURN: Status
*
* FUNCTION: acpi_ev_enable_gpe
*
* PARAMETERS: gpe_event_info - GPE to enable
+ * write_to_hardware - Enable now, or just mark data structs
+ * (WAKE GPEs should be deferred)
*
* RETURN: Status
*
#ifdef ACPI_GPE_NOTIFY_CHECK
/*******************************************************************************
- * NOT USED, PROTOTYPE ONLY AND WILL PROBABLY BE REMOVED
+ * TBD: NOT USED, PROTOTYPE ONLY AND WILL PROBABLY BE REMOVED
*
* FUNCTION: acpi_ev_check_for_wake_only_gpe
*
*
* FUNCTION: acpi_ev_queue_notify_request
*
- * PARAMETERS:
+ * PARAMETERS: Node - NS node for the notified object
+ * notify_value - Value from the Notify() request
*
- * RETURN: None.
+ * RETURN: Status
*
* DESCRIPTION: Dispatch a device notification event to a previously
* installed handler.
notify_value));
}
- /*
- * Get the notify object attached to the NS Node
- */
+ /* Get the notify object attached to the NS Node */
+
obj_desc = acpi_ns_get_attached_object (node);
if (obj_desc) {
/* We have the notify object, Get the right handler */
}
if (!handler_obj) {
- /* There is no per-device notify handler for this device */
-
+ /*
+ * There is no per-device notify handler for this device.
+ * This may or may not be a problem.
+ */
ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
"No notify handler for Notify(%4.4s, %X) node %p\n",
acpi_ut_get_node_name (node), notify_value, node));
*
* FUNCTION: acpi_ev_notify_dispatch
*
- * PARAMETERS:
+ * PARAMETERS: Context - To be passsed to the notify handler
*
* RETURN: None.
*
*
* FUNCTION: acpi_ev_global_lock_thread
*
+ * PARAMETERS: Context - From thread interface, not used
+ *
* RETURN: None
*
* DESCRIPTION: Invoked by SCI interrupt handler upon acquisition of the
*
* FUNCTION: acpi_ev_global_lock_handler
*
- * RETURN: Status
+ * PARAMETERS: Context - From thread interface, not used
+ *
+ * RETURN: ACPI_INTERRUPT_HANDLED or ACPI_INTERRUPT_NOT_HANDLED
*
* DESCRIPTION: Invoked directly from the SCI handler when a global lock
* release interrupt occurs. Grab the global lock and queue
*
* FUNCTION: acpi_ev_init_global_lock_handler
*
+ * PARAMETERS: None
+ *
* RETURN: Status
*
* DESCRIPTION: Install a handler for the global lock release event
*
* FUNCTION: acpi_ev_acquire_global_lock
*
+ * PARAMETERS: Timeout - Max time to wait for the lock, in millisec.
+ *
* RETURN: Status
*
* DESCRIPTION: Attempt to gain ownership of the Global Lock.
*
* FUNCTION: acpi_ev_release_global_lock
*
+ * PARAMETERS: None
+ *
+ * RETURN: Status
+ *
* DESCRIPTION: Releases ownership of the Global Lock.
*
******************************************************************************/
* FUNCTION: acpi_ev_execute_reg_method
*
* PARAMETERS: region_obj - Object structure
- * Function - On (1) or Off (0)
+ * Function - Passed to _REG: On (1) or Off (0)
*
* RETURN: Status
*
goto cleanup;
}
- /* Set up the parameter objects */
+ /* Setup the parameter objects */
params[0]->integer.value = region_obj->region.space_id;
params[1]->integer.value = function;
* FUNCTION: acpi_ev_address_space_dispatch
*
* PARAMETERS: region_obj - Internal region object
- * space_id - ID of the address space (0-255)
* Function - Read or Write operation
* Address - Where in the space to read or write
* bit_width - Field width in bits (8, 16, 32, or 64)
*
* FUNCTION: acpi_ev_detach_region
*
- * PARAMETERS: region_obj - Region Object
- * acpi_ns_is_locked - Namespace Region Already Locked?
+ * PARAMETERS: region_obj - Region Object
+ * acpi_ns_is_locked - Namespace Region Already Locked?
*
* RETURN: None
*
*
* FUNCTION: acpi_ev_attach_region
*
- * PARAMETERS: handler_obj - Handler Object
- * region_obj - Region Object
- * acpi_ns_is_locked - Namespace Region Already Locked?
+ * PARAMETERS: handler_obj - Handler Object
+ * region_obj - Region Object
+ * acpi_ns_is_locked - Namespace Region Already Locked?
*
* RETURN: None
*
*
* RETURN: Status
*
- * DESCRIPTION: Run _REG methods for the Space ID;
+ * DESCRIPTION: Run all _REG methods for the input Space ID;
* Note: assumes namespace is locked, or system init time.
*
******************************************************************************/
*
* FUNCTION: acpi_ev_system_memory_region_setup
*
- * PARAMETERS: region_obj - Region we are interested in
+ * PARAMETERS: Handle - Region we are interested in
* Function - Start or stop
* handler_context - Address space handler context
* region_context - Region specific context
*
* FUNCTION: acpi_ev_io_space_region_setup
*
- * PARAMETERS: region_obj - Region we are interested in
+ * PARAMETERS: Handle - Region we are interested in
* Function - Start or stop
* handler_context - Address space handler context
* region_context - Region specific context
*
* FUNCTION: acpi_ev_pci_config_region_setup
*
- * PARAMETERS: region_obj - Region we are interested in
+ * PARAMETERS: Handle - Region we are interested in
* Function - Start or stop
* handler_context - Address space handler context
* region_context - Region specific context
*
* FUNCTION: acpi_ev_pci_bar_region_setup
*
- * PARAMETERS: region_obj - Region we are interested in
+ * PARAMETERS: Handle - Region we are interested in
* Function - Start or stop
* handler_context - Address space handler context
* region_context - Region specific context
*
* FUNCTION: acpi_ev_cmos_region_setup
*
- * PARAMETERS: region_obj - Region we are interested in
+ * PARAMETERS: Handle - Region we are interested in
* Function - Start or stop
* handler_context - Address space handler context
* region_context - Region specific context
*
* FUNCTION: acpi_ev_default_region_setup
*
- * PARAMETERS: region_obj - Region we are interested in
+ * PARAMETERS: Handle - Region we are interested in
* Function - Start or stop
* handler_context - Address space handler context
* region_context - Region specific context
* ACPI_DEVICE_NOTIFY: driver_handler (80-ff)
* ACPI_ALL_NOTIFY: both system and device
* Handler - Address of the handler
+ *
* RETURN: Status
*
* DESCRIPTION: Remove a handler for notifies on an ACPI device
goto unlock_and_exit;
}
- /*
- * Root Object
- */
+ /* Root Object */
+
if (device == ACPI_ROOT_OBJECT) {
ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Removing notify handler for ROOT object.\n"));
}
}
- /*
- * All Other Objects
- */
+ /* All Other Objects */
+
else {
/* Notifies allowed on this object? */
*
* PARAMETERS: gpe_event_info - Info block for the GPE to be cleared
*
- * RETURN: status_status
+ * RETURN: Status
*
* DESCRIPTION: Clear the status bit for a single GPE.
*
* return_value - Value that was read from the register
* Flags - Lock the hardware or not
*
- * RETURN: Value is read from specified Register. Value returned is
- * normalized to bit0 (is shifted all the way right)
+ * RETURN: Status and the value read from specified Register. Value
+ * returned is normalized to bit0 (is shifted all the way right)
*
* DESCRIPTION: ACPI bit_register read function.
*
}
}
+ /* Read from the register */
+
status = acpi_hw_register_read (ACPI_MTX_DO_NOT_LOCK,
bit_reg_info->parent_register, ®ister_value);
*
* PARAMETERS: register_id - ID of ACPI bit_register to access
* Value - (only used on write) value to write to the
- * Register, NOT pre-normalized to the bit pos.
+ * Register, NOT pre-normalized to the bit pos
* Flags - Lock the hardware or not
*
- * RETURN: None
+ * RETURN: Status
*
* DESCRIPTION: ACPI Bit Register write function.
*
*
* FUNCTION: acpi_hw_register_read
*
- * PARAMETERS: use_lock - Mutex hw access.
- * register_id - register_iD + Offset.
+ * PARAMETERS: use_lock - Mutex hw access
+ * register_id - register_iD + Offset
+ * return_value - Value that was read from the register
*
- * RETURN: Value read or written.
+ * RETURN: Status and the value read.
*
* DESCRIPTION: Acpi register read function. Registers are read at the
* given offset.
*
* FUNCTION: acpi_hw_register_write
*
- * PARAMETERS: use_lock - Mutex hw access.
- * register_id - register_iD + Offset.
+ * PARAMETERS: use_lock - Mutex hw access
+ * register_id - register_iD + Offset
+ * Value - The value to write
*
- * RETURN: Value read or written.
+ * RETURN: Status
*
* DESCRIPTION: Acpi register Write function. Registers are written at the
* given offset.
*
* PARAMETERS: Width - 8, 16, or 32
* Value - Where the value is returned
- * Register - GAS register structure
+ * Reg - GAS register structure
*
* RETURN: Status
*
- * DESCRIPTION: Read from either memory, IO, or PCI config space.
+ * DESCRIPTION: Read from either memory or IO space.
*
******************************************************************************/
u32 *value,
struct acpi_generic_address *reg)
{
- struct acpi_pci_id pci_id;
- u16 pci_register;
acpi_status status;
*value = 0;
/*
- * Three address spaces supported:
- * Memory, IO, or PCI_Config.
+ * Two address spaces supported: Memory or IO.
+ * PCI_Config is not supported here because the GAS struct is insufficient
*/
switch (reg->address_space_id) {
case ACPI_ADR_SPACE_SYSTEM_MEMORY:
break;
- case ACPI_ADR_SPACE_PCI_CONFIG:
-
- pci_id.segment = 0;
- pci_id.bus = 0;
- pci_id.device = ACPI_PCI_DEVICE (reg->address);
- pci_id.function = ACPI_PCI_FUNCTION (reg->address);
- pci_register = (u16) ACPI_PCI_REGISTER (reg->address);
-
- status = acpi_os_read_pci_configuration (&pci_id, pci_register,
- value, width);
- break;
-
-
default:
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
"Unsupported address space: %X\n", reg->address_space_id));
*
* PARAMETERS: Width - 8, 16, or 32
* Value - To be written
- * Register - GAS register structure
+ * Reg - GAS register structure
*
* RETURN: Status
*
- * DESCRIPTION: Write to either memory, IO, or PCI config space.
+ * DESCRIPTION: Write to either memory or IO space.
*
******************************************************************************/
u32 value,
struct acpi_generic_address *reg)
{
- struct acpi_pci_id pci_id;
- u16 pci_register;
acpi_status status;
}
/*
- * Three address spaces supported:
- * Memory, IO, or PCI_Config.
+ * Two address spaces supported: Memory or IO.
+ * PCI_Config is not supported here because the GAS struct is insufficient
*/
switch (reg->address_space_id) {
case ACPI_ADR_SPACE_SYSTEM_MEMORY:
break;
- case ACPI_ADR_SPACE_PCI_CONFIG:
-
- pci_id.segment = 0;
- pci_id.bus = 0;
- pci_id.device = ACPI_PCI_DEVICE (reg->address);
- pci_id.function = ACPI_PCI_FUNCTION (reg->address);
- pci_register = (u16) ACPI_PCI_REGISTER (reg->address);
-
- status = acpi_os_write_pci_configuration (&pci_id, pci_register,
- (acpi_integer) value, width);
- break;
-
-
default:
ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
"Unsupported address space: %X\n", reg->address_space_id));
*
* FUNCTION: acpi_get_timer_resolution
*
- * PARAMETERS: none
+ * PARAMETERS: Resolution - Where the resolution is returned
*
- * RETURN: Number of bits of resolution in the PM Timer (24 or 32).
+ * RETURN: Status and timer resolution
*
- * DESCRIPTION: Obtains resolution of the ACPI PM Timer.
+ * DESCRIPTION: Obtains resolution of the ACPI PM Timer (24 or 32 bits).
*
******************************************************************************/
*
* FUNCTION: acpi_get_timer
*
- * PARAMETERS: none
+ * PARAMETERS: Ticks - Where the timer value is returned
*
- * RETURN: Current value of the ACPI PM Timer (in ticks).
+ * RETURN: Status and current ticks
*
- * DESCRIPTION: Obtains current value of ACPI PM Timer.
+ * DESCRIPTION: Obtains current value of ACPI PM Timer (in ticks).
*
******************************************************************************/
*
* FUNCTION: acpi_get_timer_duration
*
- * PARAMETERS: start_ticks
- * end_ticks
- * time_elapsed
+ * PARAMETERS: start_ticks - Starting timestamp
+ * end_ticks - End timestamp
+ * time_elapsed - Where the elapsed time is returned
*
- * RETURN: time_elapsed
+ * RETURN: Status and time_elapsed
*
* DESCRIPTION: Computes the time elapsed (in microseconds) between two
* PM Timer time stamps, taking into account the possibility of
* Note that this function accommodates only a single timer
* rollover. Thus for 24-bit timers, this function should only
* be used for calculating durations less than ~4.6 seconds
- * (~20 minutes for 32-bit timers) -- calculations below
+ * (~20 minutes for 32-bit timers) -- calculations below:
*
* 2**24 Ticks / 3,600,000 Ticks/Sec = 4.66 sec
* 2**32 Ticks / 3,600,000 Ticks/Sec = 1193 sec or 19.88 minutes
/*
* Compute Tick Delta:
- * -------------------
* Handle (max one) timer rollovers on 24- versus 32-bit timers.
*/
if (start_ticks < end_ticks) {
}
/*
- * Compute Duration:
- * -----------------
- *
- * Requires a 64-bit divide:
+ * Compute Duration (Requires a 64-bit divide):
*
* time_elapsed = (delta_ticks * 1000000) / PM_TIMER_FREQUENCY;
*/
/* Version string */
-#define ACPI_CA_VERSION 0x20040715
+#define ACPI_CA_VERSION 0x20040816
/*
* OS name, used for the _OS object. The _OS object is essentially obsolete,
#define AE_AML_CIRCULAR_REFERENCE (acpi_status) (0x0020 | AE_CODE_AML)
#define AE_AML_BAD_RESOURCE_LENGTH (acpi_status) (0x0021 | AE_CODE_AML)
-#define AE_CODE_AML_MAX 0x0020
+#define AE_CODE_AML_MAX 0x0021
/*
* Internal exceptions used for control
#define ACPI_IS_OCTAL_DIGIT(d) (((char)(d) >= '0') && ((char)(d) <= '7'))
-/* Macros for GAS addressing */
-
-#if ACPI_MACHINE_WIDTH != 16
-
-#define ACPI_PCI_DEVICE(a) (u16) ((ACPI_HIDWORD ((a))) & 0x0000FFFF)
-#define ACPI_PCI_FUNCTION(a) (u16) ((ACPI_LODWORD ((a))) >> 16)
-#define ACPI_PCI_REGISTER(a) (u16) ((ACPI_LODWORD ((a))) & 0x0000FFFF)
-
-#else
-
-/* No support for GAS and PCI IDs in 16-bit mode */
-
-#define ACPI_PCI_FUNCTION(a) (u16) ((a) & 0xFFFF0000)
-#define ACPI_PCI_DEVICE(a) (u16) ((a) & 0x0000FFFF)
-#define ACPI_PCI_REGISTER(a) (u16) ((a) & 0x0000FFFF)
-
-#endif
-
/* Bitfields within ACPI registers */