mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-23 09:19:51 +00:00
Merge branch 'acpica'
* acpica: MAINTAINERS / ACPICA: Add ACPICA information to MAINTAINERS ACPICA: Update version to 20130823. ACPICA: SCI Handlers: Update handler interface, eliminate unnecessary argument. ACPICA: Cleanup exception codes. ACPICA: Tables: Cleanup RSDP signature codes. ACPICA: Tables: Cleanup table checksum verification code. ACPICA: Debugger: Add new command to display full namespace pathnames. ACPICA: Operation region support: Never free the handler "context" pointer. ACPICA: Add support for host-installed SCI handlers. ACPICA: Validate start object for acpi_walk_namespace. ACPICA: Debugger: Prevent possible command line buffer overflow, kernel behavior is not affected. ACPICA: Linux-specific header: enable "aarch64" 64-bit build. ACPICA: Debug output: small formatting update, no functional change. ACPICA: acpi_read: On error, do not modify the return value target location. ACPICA: Improve error message for "too many parent prefixes" condition.
This commit is contained in:
commit
9183ea62f7
24 changed files with 479 additions and 72 deletions
14
MAINTAINERS
14
MAINTAINERS
|
@ -253,6 +253,20 @@ F: drivers/pci/*acpi*
|
|||
F: drivers/pci/*/*acpi*
|
||||
F: drivers/pci/*/*/*acpi*
|
||||
|
||||
ACPI COMPONENT ARCHITECTURE (ACPICA)
|
||||
M: Robert Moore <robert.moore@intel.com>
|
||||
M: Lv Zheng <lv.zheng@intel.com>
|
||||
M: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
|
||||
L: linux-acpi@vger.kernel.org
|
||||
L: devel@acpica.org
|
||||
W: https://acpica.org/
|
||||
W: https://github.com/acpica/acpica/
|
||||
Q: https://patchwork.kernel.org/project/linux-acpi/list/
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm
|
||||
S: Supported
|
||||
F: drivers/acpi/acpica/
|
||||
F: include/acpi/
|
||||
|
||||
ACPI FAN DRIVER
|
||||
M: Zhang Rui <rui.zhang@intel.com>
|
||||
L: linux-acpi@vger.kernel.org
|
||||
|
|
|
@ -113,11 +113,12 @@ void acpi_db_display_handlers(void);
|
|||
ACPI_HW_DEPENDENT_RETURN_VOID(void
|
||||
acpi_db_generate_gpe(char *gpe_arg,
|
||||
char *block_arg))
|
||||
ACPI_HW_DEPENDENT_RETURN_VOID(void acpi_db_generate_sci(void))
|
||||
|
||||
/*
|
||||
* dbconvert - miscellaneous conversion routines
|
||||
*/
|
||||
acpi_status acpi_db_hex_char_to_value(int hex_char, u8 *return_value);
|
||||
acpi_status acpi_db_hex_char_to_value(int hex_char, u8 *return_value);
|
||||
|
||||
acpi_status acpi_db_convert_to_package(char *string, union acpi_object *object);
|
||||
|
||||
|
@ -154,6 +155,8 @@ void acpi_db_set_scope(char *name);
|
|||
|
||||
void acpi_db_dump_namespace(char *start_arg, char *depth_arg);
|
||||
|
||||
void acpi_db_dump_namespace_paths(void);
|
||||
|
||||
void acpi_db_dump_namespace_by_owner(char *owner_arg, char *depth_arg);
|
||||
|
||||
acpi_status acpi_db_find_name_in_namespace(char *name_arg);
|
||||
|
|
|
@ -242,11 +242,11 @@ acpi_ev_initialize_region(union acpi_operand_object *region_obj,
|
|||
*/
|
||||
u32 ACPI_SYSTEM_XFACE acpi_ev_gpe_xrupt_handler(void *context);
|
||||
|
||||
u32 acpi_ev_sci_dispatch(void);
|
||||
|
||||
u32 acpi_ev_install_sci_handler(void);
|
||||
|
||||
acpi_status acpi_ev_remove_sci_handler(void);
|
||||
|
||||
u32 acpi_ev_initialize_SCI(u32 program_SCI);
|
||||
acpi_status acpi_ev_remove_all_sci_handlers(void);
|
||||
|
||||
ACPI_HW_DEPENDENT_RETURN_VOID(void acpi_ev_terminate(void))
|
||||
#endif /* __ACEVENTS_H__ */
|
||||
|
|
|
@ -269,6 +269,7 @@ ACPI_EXTERN acpi_table_handler acpi_gbl_table_handler;
|
|||
ACPI_EXTERN void *acpi_gbl_table_handler_context;
|
||||
ACPI_EXTERN struct acpi_walk_state *acpi_gbl_breakpoint_walk;
|
||||
ACPI_EXTERN acpi_interface_handler acpi_gbl_interface_handler;
|
||||
ACPI_EXTERN struct acpi_sci_handler_info *acpi_gbl_sci_handler_list;
|
||||
|
||||
/* Owner ID support */
|
||||
|
||||
|
@ -445,13 +446,6 @@ ACPI_EXTERN u8 acpi_gbl_db_opt_tables;
|
|||
ACPI_EXTERN u8 acpi_gbl_db_opt_stats;
|
||||
ACPI_EXTERN u8 acpi_gbl_db_opt_ini_methods;
|
||||
ACPI_EXTERN u8 acpi_gbl_db_opt_no_region_support;
|
||||
|
||||
ACPI_EXTERN char *acpi_gbl_db_args[ACPI_DEBUGGER_MAX_ARGS];
|
||||
ACPI_EXTERN acpi_object_type acpi_gbl_db_arg_types[ACPI_DEBUGGER_MAX_ARGS];
|
||||
ACPI_EXTERN char acpi_gbl_db_line_buf[ACPI_DB_LINE_BUFFER_SIZE];
|
||||
ACPI_EXTERN char acpi_gbl_db_parsed_buf[ACPI_DB_LINE_BUFFER_SIZE];
|
||||
ACPI_EXTERN char acpi_gbl_db_scope_buf[80];
|
||||
ACPI_EXTERN char acpi_gbl_db_debug_filename[80];
|
||||
ACPI_EXTERN u8 acpi_gbl_db_output_to_file;
|
||||
ACPI_EXTERN char *acpi_gbl_db_buffer;
|
||||
ACPI_EXTERN char *acpi_gbl_db_filename;
|
||||
|
@ -459,6 +453,16 @@ ACPI_EXTERN u32 acpi_gbl_db_debug_level;
|
|||
ACPI_EXTERN u32 acpi_gbl_db_console_debug_level;
|
||||
ACPI_EXTERN struct acpi_namespace_node *acpi_gbl_db_scope_node;
|
||||
|
||||
ACPI_EXTERN char *acpi_gbl_db_args[ACPI_DEBUGGER_MAX_ARGS];
|
||||
ACPI_EXTERN acpi_object_type acpi_gbl_db_arg_types[ACPI_DEBUGGER_MAX_ARGS];
|
||||
|
||||
/* These buffers should all be the same size */
|
||||
|
||||
ACPI_EXTERN char acpi_gbl_db_line_buf[ACPI_DB_LINE_BUFFER_SIZE];
|
||||
ACPI_EXTERN char acpi_gbl_db_parsed_buf[ACPI_DB_LINE_BUFFER_SIZE];
|
||||
ACPI_EXTERN char acpi_gbl_db_scope_buf[ACPI_DB_LINE_BUFFER_SIZE];
|
||||
ACPI_EXTERN char acpi_gbl_db_debug_filename[ACPI_DB_LINE_BUFFER_SIZE];
|
||||
|
||||
/*
|
||||
* Statistic globals
|
||||
*/
|
||||
|
|
|
@ -398,6 +398,14 @@ struct acpi_simple_repair_info {
|
|||
*
|
||||
****************************************************************************/
|
||||
|
||||
/* Dispatch info for each host-installed SCI handler */
|
||||
|
||||
struct acpi_sci_handler_info {
|
||||
struct acpi_sci_handler_info *next;
|
||||
acpi_sci_handler address; /* Address of handler */
|
||||
void *context; /* Context to be passed to handler */
|
||||
};
|
||||
|
||||
/* Dispatch info for each GPE -- either a method or handler, cannot be both */
|
||||
|
||||
struct acpi_gpe_handler_info {
|
||||
|
|
|
@ -213,6 +213,12 @@ acpi_ns_dump_objects(acpi_object_type type,
|
|||
u8 display_type,
|
||||
u32 max_depth,
|
||||
acpi_owner_id owner_id, acpi_handle start_handle);
|
||||
|
||||
void
|
||||
acpi_ns_dump_object_paths(acpi_object_type type,
|
||||
u8 display_type,
|
||||
u32 max_depth,
|
||||
acpi_owner_id owner_id, acpi_handle start_handle);
|
||||
#endif /* ACPI_FUTURE_USAGE */
|
||||
|
||||
/*
|
||||
|
|
|
@ -196,7 +196,7 @@ acpi_ev_get_gpe_device(struct acpi_gpe_xrupt_info *gpe_xrupt_info,
|
|||
*
|
||||
* FUNCTION: acpi_ev_get_gpe_xrupt_block
|
||||
*
|
||||
* PARAMETERS: interrupt_number - Interrupt for a GPE block
|
||||
* PARAMETERS: interrupt_number - Interrupt for a GPE block
|
||||
*
|
||||
* RETURN: A GPE interrupt block
|
||||
*
|
||||
|
|
|
@ -264,13 +264,6 @@ void acpi_ev_terminate(void)
|
|||
|
||||
status = acpi_ev_walk_gpe_list(acpi_hw_disable_gpe_block, NULL);
|
||||
|
||||
/* Remove SCI handler */
|
||||
|
||||
status = acpi_ev_remove_sci_handler();
|
||||
if (ACPI_FAILURE(status)) {
|
||||
ACPI_ERROR((AE_INFO, "Could not remove SCI handler"));
|
||||
}
|
||||
|
||||
status = acpi_ev_remove_global_lock_handler();
|
||||
if (ACPI_FAILURE(status)) {
|
||||
ACPI_ERROR((AE_INFO,
|
||||
|
@ -280,6 +273,13 @@ void acpi_ev_terminate(void)
|
|||
acpi_gbl_events_initialized = FALSE;
|
||||
}
|
||||
|
||||
/* Remove SCI handlers */
|
||||
|
||||
status = acpi_ev_remove_all_sci_handlers();
|
||||
if (ACPI_FAILURE(status)) {
|
||||
ACPI_ERROR((AE_INFO, "Could not remove SCI handler"));
|
||||
}
|
||||
|
||||
/* Deallocate all handler objects installed within GPE info structs */
|
||||
|
||||
status = acpi_ev_walk_gpe_list(acpi_ev_delete_gpe_handlers, NULL);
|
||||
|
|
|
@ -217,16 +217,11 @@ acpi_ev_address_space_dispatch(union acpi_operand_object *region_obj,
|
|||
if (!(region_obj->region.flags & AOPOBJ_SETUP_COMPLETE)) {
|
||||
region_obj->region.flags |= AOPOBJ_SETUP_COMPLETE;
|
||||
|
||||
if (region_obj2->extra.region_context) {
|
||||
|
||||
/* The handler for this region was already installed */
|
||||
|
||||
ACPI_FREE(region_context);
|
||||
} else {
|
||||
/*
|
||||
* Save the returned context for use in all accesses to
|
||||
* this particular region
|
||||
*/
|
||||
/*
|
||||
* Save the returned context for use in all accesses to
|
||||
* the handler for this particular region
|
||||
*/
|
||||
if (!(region_obj2->extra.region_context)) {
|
||||
region_obj2->extra.region_context =
|
||||
region_context;
|
||||
}
|
||||
|
@ -402,6 +397,14 @@ acpi_ev_detach_region(union acpi_operand_object *region_obj,
|
|||
handler_obj->address_space.
|
||||
context, region_context);
|
||||
|
||||
/*
|
||||
* region_context should have been released by the deactivate
|
||||
* operation. We don't need access to it anymore here.
|
||||
*/
|
||||
if (region_context) {
|
||||
*region_context = NULL;
|
||||
}
|
||||
|
||||
/* Init routine may fail, Just ignore errors */
|
||||
|
||||
if (ACPI_FAILURE(status)) {
|
||||
|
|
|
@ -52,6 +52,50 @@ ACPI_MODULE_NAME("evsci")
|
|||
/* Local prototypes */
|
||||
static u32 ACPI_SYSTEM_XFACE acpi_ev_sci_xrupt_handler(void *context);
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ev_sci_dispatch
|
||||
*
|
||||
* PARAMETERS: None
|
||||
*
|
||||
* RETURN: Status code indicates whether interrupt was handled.
|
||||
*
|
||||
* DESCRIPTION: Dispatch the SCI to all host-installed SCI handlers.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
u32 acpi_ev_sci_dispatch(void)
|
||||
{
|
||||
struct acpi_sci_handler_info *sci_handler;
|
||||
acpi_cpu_flags flags;
|
||||
u32 int_status = ACPI_INTERRUPT_NOT_HANDLED;
|
||||
|
||||
ACPI_FUNCTION_NAME(ev_sci_dispatch);
|
||||
|
||||
/* Are there any host-installed SCI handlers? */
|
||||
|
||||
if (!acpi_gbl_sci_handler_list) {
|
||||
return (int_status);
|
||||
}
|
||||
|
||||
flags = acpi_os_acquire_lock(acpi_gbl_gpe_lock);
|
||||
|
||||
/* Invoke all host-installed SCI handlers */
|
||||
|
||||
sci_handler = acpi_gbl_sci_handler_list;
|
||||
while (sci_handler) {
|
||||
|
||||
/* Invoke the installed handler (at interrupt level) */
|
||||
|
||||
int_status |= sci_handler->address(sci_handler->context);
|
||||
|
||||
sci_handler = sci_handler->next;
|
||||
}
|
||||
|
||||
acpi_os_release_lock(acpi_gbl_gpe_lock, flags);
|
||||
return (int_status);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ev_sci_xrupt_handler
|
||||
|
@ -89,6 +133,10 @@ static u32 ACPI_SYSTEM_XFACE acpi_ev_sci_xrupt_handler(void *context)
|
|||
*/
|
||||
interrupt_handled |= acpi_ev_gpe_detect(gpe_xrupt_list);
|
||||
|
||||
/* Invoke all host-installed SCI handlers */
|
||||
|
||||
interrupt_handled |= acpi_ev_sci_dispatch();
|
||||
|
||||
return_UINT32(interrupt_handled);
|
||||
}
|
||||
|
||||
|
@ -112,14 +160,13 @@ u32 ACPI_SYSTEM_XFACE acpi_ev_gpe_xrupt_handler(void *context)
|
|||
ACPI_FUNCTION_TRACE(ev_gpe_xrupt_handler);
|
||||
|
||||
/*
|
||||
* We are guaranteed by the ACPI CA initialization/shutdown code that
|
||||
* We are guaranteed by the ACPICA initialization/shutdown code that
|
||||
* if this interrupt handler is installed, ACPI is enabled.
|
||||
*/
|
||||
|
||||
/* GPEs: Check for and dispatch any GPEs that have occurred */
|
||||
|
||||
interrupt_handled |= acpi_ev_gpe_detect(gpe_xrupt_list);
|
||||
|
||||
return_UINT32(interrupt_handled);
|
||||
}
|
||||
|
||||
|
@ -150,15 +197,15 @@ u32 acpi_ev_install_sci_handler(void)
|
|||
|
||||
/******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ev_remove_sci_handler
|
||||
* FUNCTION: acpi_ev_remove_all_sci_handlers
|
||||
*
|
||||
* PARAMETERS: none
|
||||
*
|
||||
* RETURN: E_OK if handler uninstalled OK, E_ERROR if handler was not
|
||||
* RETURN: AE_OK if handler uninstalled, AE_ERROR if handler was not
|
||||
* installed to begin with
|
||||
*
|
||||
* DESCRIPTION: Remove the SCI interrupt handler. No further SCIs will be
|
||||
* taken.
|
||||
* taken. Remove all host-installed SCI handlers.
|
||||
*
|
||||
* Note: It doesn't seem important to disable all events or set the event
|
||||
* enable registers to their original values. The OS should disable
|
||||
|
@ -167,11 +214,13 @@ u32 acpi_ev_install_sci_handler(void)
|
|||
*
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status acpi_ev_remove_sci_handler(void)
|
||||
acpi_status acpi_ev_remove_all_sci_handlers(void)
|
||||
{
|
||||
struct acpi_sci_handler_info *sci_handler;
|
||||
acpi_cpu_flags flags;
|
||||
acpi_status status;
|
||||
|
||||
ACPI_FUNCTION_TRACE(ev_remove_sci_handler);
|
||||
ACPI_FUNCTION_TRACE(ev_remove_all_sci_handlers);
|
||||
|
||||
/* Just let the OS remove the handler and disable the level */
|
||||
|
||||
|
@ -179,6 +228,21 @@ acpi_status acpi_ev_remove_sci_handler(void)
|
|||
acpi_os_remove_interrupt_handler((u32) acpi_gbl_FADT.sci_interrupt,
|
||||
acpi_ev_sci_xrupt_handler);
|
||||
|
||||
if (!acpi_gbl_sci_handler_list) {
|
||||
return (status);
|
||||
}
|
||||
|
||||
flags = acpi_os_acquire_lock(acpi_gbl_gpe_lock);
|
||||
|
||||
/* Free all host-installed SCI handlers */
|
||||
|
||||
while (acpi_gbl_sci_handler_list) {
|
||||
sci_handler = acpi_gbl_sci_handler_list;
|
||||
acpi_gbl_sci_handler_list = sci_handler->next;
|
||||
ACPI_FREE(sci_handler);
|
||||
}
|
||||
|
||||
acpi_os_release_lock(acpi_gbl_gpe_lock, flags);
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
|
|
|
@ -383,6 +383,144 @@ ACPI_EXPORT_SYMBOL(acpi_install_exception_handler)
|
|||
#endif /* ACPI_FUTURE_USAGE */
|
||||
|
||||
#if (!ACPI_REDUCED_HARDWARE)
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_install_sci_handler
|
||||
*
|
||||
* PARAMETERS: address - Address of the handler
|
||||
* context - Value passed to the handler on each SCI
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Install a handler for a System Control Interrupt.
|
||||
*
|
||||
******************************************************************************/
|
||||
acpi_status acpi_install_sci_handler(acpi_sci_handler address, void *context)
|
||||
{
|
||||
struct acpi_sci_handler_info *new_sci_handler;
|
||||
struct acpi_sci_handler_info *sci_handler;
|
||||
acpi_cpu_flags flags;
|
||||
acpi_status status;
|
||||
|
||||
ACPI_FUNCTION_TRACE(acpi_install_sci_handler);
|
||||
|
||||
if (!address) {
|
||||
return_ACPI_STATUS(AE_BAD_PARAMETER);
|
||||
}
|
||||
|
||||
/* Allocate and init a handler object */
|
||||
|
||||
new_sci_handler = ACPI_ALLOCATE(sizeof(struct acpi_sci_handler_info));
|
||||
if (!new_sci_handler) {
|
||||
return_ACPI_STATUS(AE_NO_MEMORY);
|
||||
}
|
||||
|
||||
new_sci_handler->address = address;
|
||||
new_sci_handler->context = context;
|
||||
|
||||
status = acpi_ut_acquire_mutex(ACPI_MTX_EVENTS);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
goto exit;
|
||||
}
|
||||
|
||||
/* Lock list during installation */
|
||||
|
||||
flags = acpi_os_acquire_lock(acpi_gbl_gpe_lock);
|
||||
sci_handler = acpi_gbl_sci_handler_list;
|
||||
|
||||
/* Ensure handler does not already exist */
|
||||
|
||||
while (sci_handler) {
|
||||
if (address == sci_handler->address) {
|
||||
status = AE_ALREADY_EXISTS;
|
||||
goto unlock_and_exit;
|
||||
}
|
||||
|
||||
sci_handler = sci_handler->next;
|
||||
}
|
||||
|
||||
/* Install the new handler into the global list (at head) */
|
||||
|
||||
new_sci_handler->next = acpi_gbl_sci_handler_list;
|
||||
acpi_gbl_sci_handler_list = new_sci_handler;
|
||||
|
||||
unlock_and_exit:
|
||||
|
||||
acpi_os_release_lock(acpi_gbl_gpe_lock, flags);
|
||||
(void)acpi_ut_release_mutex(ACPI_MTX_EVENTS);
|
||||
|
||||
exit:
|
||||
if (ACPI_FAILURE(status)) {
|
||||
ACPI_FREE(new_sci_handler);
|
||||
}
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_remove_sci_handler
|
||||
*
|
||||
* PARAMETERS: address - Address of the handler
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Remove a handler for a System Control Interrupt.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status acpi_remove_sci_handler(acpi_sci_handler address)
|
||||
{
|
||||
struct acpi_sci_handler_info *prev_sci_handler;
|
||||
struct acpi_sci_handler_info *next_sci_handler;
|
||||
acpi_cpu_flags flags;
|
||||
acpi_status status;
|
||||
|
||||
ACPI_FUNCTION_TRACE(acpi_remove_sci_handler);
|
||||
|
||||
if (!address) {
|
||||
return_ACPI_STATUS(AE_BAD_PARAMETER);
|
||||
}
|
||||
|
||||
status = acpi_ut_acquire_mutex(ACPI_MTX_EVENTS);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
/* Remove the SCI handler with lock */
|
||||
|
||||
flags = acpi_os_acquire_lock(acpi_gbl_gpe_lock);
|
||||
|
||||
prev_sci_handler = NULL;
|
||||
next_sci_handler = acpi_gbl_sci_handler_list;
|
||||
while (next_sci_handler) {
|
||||
if (next_sci_handler->address == address) {
|
||||
|
||||
/* Unlink and free the SCI handler info block */
|
||||
|
||||
if (prev_sci_handler) {
|
||||
prev_sci_handler->next = next_sci_handler->next;
|
||||
} else {
|
||||
acpi_gbl_sci_handler_list =
|
||||
next_sci_handler->next;
|
||||
}
|
||||
|
||||
acpi_os_release_lock(acpi_gbl_gpe_lock, flags);
|
||||
ACPI_FREE(next_sci_handler);
|
||||
goto unlock_and_exit;
|
||||
}
|
||||
|
||||
prev_sci_handler = next_sci_handler;
|
||||
next_sci_handler = next_sci_handler->next;
|
||||
}
|
||||
|
||||
acpi_os_release_lock(acpi_gbl_gpe_lock, flags);
|
||||
status = AE_NOT_EXIST;
|
||||
|
||||
unlock_and_exit:
|
||||
(void)acpi_ut_release_mutex(ACPI_MTX_EVENTS);
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_install_global_event_handler
|
||||
|
@ -398,6 +536,7 @@ ACPI_EXPORT_SYMBOL(acpi_install_exception_handler)
|
|||
* Can be used to update event counters, etc.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status
|
||||
acpi_install_global_event_handler(acpi_gbl_event_handler handler, void *context)
|
||||
{
|
||||
|
|
|
@ -119,7 +119,8 @@ ACPI_EXPORT_SYMBOL(acpi_reset)
|
|||
******************************************************************************/
|
||||
acpi_status acpi_read(u64 *return_value, struct acpi_generic_address *reg)
|
||||
{
|
||||
u32 value;
|
||||
u32 value_lo;
|
||||
u32 value_hi;
|
||||
u32 width;
|
||||
u64 address;
|
||||
acpi_status status;
|
||||
|
@ -137,13 +138,8 @@ acpi_status acpi_read(u64 *return_value, struct acpi_generic_address *reg)
|
|||
return (status);
|
||||
}
|
||||
|
||||
/* Initialize entire 64-bit return value to zero */
|
||||
|
||||
*return_value = 0;
|
||||
value = 0;
|
||||
|
||||
/*
|
||||
* Two address spaces supported: Memory or IO. PCI_Config is
|
||||
* Two address spaces supported: Memory or I/O. PCI_Config is
|
||||
* not supported here because the GAS structure is insufficient
|
||||
*/
|
||||
if (reg->space_id == ACPI_ADR_SPACE_SYSTEM_MEMORY) {
|
||||
|
@ -155,29 +151,35 @@ acpi_status acpi_read(u64 *return_value, struct acpi_generic_address *reg)
|
|||
}
|
||||
} else { /* ACPI_ADR_SPACE_SYSTEM_IO, validated earlier */
|
||||
|
||||
value_lo = 0;
|
||||
value_hi = 0;
|
||||
|
||||
width = reg->bit_width;
|
||||
if (width == 64) {
|
||||
width = 32; /* Break into two 32-bit transfers */
|
||||
}
|
||||
|
||||
status = acpi_hw_read_port((acpi_io_address)
|
||||
address, &value, width);
|
||||
address, &value_lo, width);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
}
|
||||
*return_value = value;
|
||||
|
||||
if (reg->bit_width == 64) {
|
||||
|
||||
/* Read the top 32 bits */
|
||||
|
||||
status = acpi_hw_read_port((acpi_io_address)
|
||||
(address + 4), &value, 32);
|
||||
(address + 4), &value_hi,
|
||||
32);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
}
|
||||
*return_value |= ((u64)value << 32);
|
||||
}
|
||||
|
||||
/* Set the return value only if status is AE_OK */
|
||||
|
||||
*return_value = (value_lo | ((u64)value_hi << 32));
|
||||
}
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_IO,
|
||||
|
@ -186,7 +188,7 @@ acpi_status acpi_read(u64 *return_value, struct acpi_generic_address *reg)
|
|||
ACPI_FORMAT_UINT64(address),
|
||||
acpi_ut_get_region_name(reg->space_id)));
|
||||
|
||||
return (status);
|
||||
return (AE_OK);
|
||||
}
|
||||
|
||||
ACPI_EXPORT_SYMBOL(acpi_read)
|
||||
|
|
|
@ -424,8 +424,9 @@ acpi_ns_lookup(union acpi_generic_state *scope_info,
|
|||
/* Current scope has no parent scope */
|
||||
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"ACPI path has too many parent prefixes (^) "
|
||||
"- reached beyond root node"));
|
||||
"%s: Path has too many parent prefixes (^) "
|
||||
"- reached beyond root node",
|
||||
pathname));
|
||||
return_ACPI_STATUS(AE_NOT_FOUND);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -59,6 +59,17 @@ acpi_ns_dump_one_device(acpi_handle obj_handle,
|
|||
#endif
|
||||
|
||||
#if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER)
|
||||
|
||||
#ifdef ACPI_FUTURE_USAGE
|
||||
static acpi_status
|
||||
acpi_ns_dump_one_object_path(acpi_handle obj_handle,
|
||||
u32 level, void *context, void **return_value);
|
||||
|
||||
static acpi_status
|
||||
acpi_ns_get_max_depth(acpi_handle obj_handle,
|
||||
u32 level, void *context, void **return_value);
|
||||
#endif /* ACPI_FUTURE_USAGE */
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ns_print_pathname
|
||||
|
@ -671,6 +682,129 @@ acpi_ns_dump_objects(acpi_object_type type,
|
|||
}
|
||||
#endif /* ACPI_FUTURE_USAGE */
|
||||
|
||||
#ifdef ACPI_FUTURE_USAGE
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ns_dump_one_object_path, acpi_ns_get_max_depth
|
||||
*
|
||||
* PARAMETERS: obj_handle - Node to be dumped
|
||||
* level - Nesting level of the handle
|
||||
* context - Passed into walk_namespace
|
||||
* return_value - Not used
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Dump the full pathname to a namespace object. acp_ns_get_max_depth
|
||||
* computes the maximum nesting depth in the namespace tree, in
|
||||
* order to simplify formatting in acpi_ns_dump_one_object_path.
|
||||
* These procedures are user_functions called by acpi_ns_walk_namespace.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
static acpi_status
|
||||
acpi_ns_dump_one_object_path(acpi_handle obj_handle,
|
||||
u32 level, void *context, void **return_value)
|
||||
{
|
||||
u32 max_level = *((u32 *)context);
|
||||
char *pathname;
|
||||
struct acpi_namespace_node *node;
|
||||
int path_indent;
|
||||
|
||||
if (!obj_handle) {
|
||||
return (AE_OK);
|
||||
}
|
||||
|
||||
node = acpi_ns_validate_handle(obj_handle);
|
||||
pathname = acpi_ns_get_external_pathname(node);
|
||||
|
||||
path_indent = 1;
|
||||
if (level <= max_level) {
|
||||
path_indent = max_level - level + 1;
|
||||
}
|
||||
|
||||
acpi_os_printf("%2d%*s%-12s%*s",
|
||||
level, level, " ", acpi_ut_get_type_name(node->type),
|
||||
path_indent, " ");
|
||||
|
||||
acpi_os_printf("%s\n", &pathname[1]);
|
||||
ACPI_FREE(pathname);
|
||||
return (AE_OK);
|
||||
}
|
||||
|
||||
static acpi_status
|
||||
acpi_ns_get_max_depth(acpi_handle obj_handle,
|
||||
u32 level, void *context, void **return_value)
|
||||
{
|
||||
u32 *max_level = (u32 *)context;
|
||||
|
||||
if (level > *max_level) {
|
||||
*max_level = level;
|
||||
}
|
||||
return (AE_OK);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ns_dump_object_paths
|
||||
*
|
||||
* PARAMETERS: type - Object type to be dumped
|
||||
* display_type - 0 or ACPI_DISPLAY_SUMMARY
|
||||
* max_depth - Maximum depth of dump. Use ACPI_UINT32_MAX
|
||||
* for an effectively unlimited depth.
|
||||
* owner_id - Dump only objects owned by this ID. Use
|
||||
* ACPI_UINT32_MAX to match all owners.
|
||||
* start_handle - Where in namespace to start/end search
|
||||
*
|
||||
* RETURN: None
|
||||
*
|
||||
* DESCRIPTION: Dump full object pathnames within the loaded namespace. Uses
|
||||
* acpi_ns_walk_namespace in conjunction with acpi_ns_dump_one_object_path.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
void
|
||||
acpi_ns_dump_object_paths(acpi_object_type type,
|
||||
u8 display_type,
|
||||
u32 max_depth,
|
||||
acpi_owner_id owner_id, acpi_handle start_handle)
|
||||
{
|
||||
acpi_status status;
|
||||
u32 max_level = 0;
|
||||
|
||||
ACPI_FUNCTION_ENTRY();
|
||||
|
||||
/*
|
||||
* Just lock the entire namespace for the duration of the dump.
|
||||
* We don't want any changes to the namespace during this time,
|
||||
* especially the temporary nodes since we are going to display
|
||||
* them also.
|
||||
*/
|
||||
status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
acpi_os_printf("Could not acquire namespace mutex\n");
|
||||
return;
|
||||
}
|
||||
|
||||
/* Get the max depth of the namespace tree, for formatting later */
|
||||
|
||||
(void)acpi_ns_walk_namespace(type, start_handle, max_depth,
|
||||
ACPI_NS_WALK_NO_UNLOCK |
|
||||
ACPI_NS_WALK_TEMP_NODES,
|
||||
acpi_ns_get_max_depth, NULL,
|
||||
(void *)&max_level, NULL);
|
||||
|
||||
/* Now dump the entire namespace */
|
||||
|
||||
(void)acpi_ns_walk_namespace(type, start_handle, max_depth,
|
||||
ACPI_NS_WALK_NO_UNLOCK |
|
||||
ACPI_NS_WALK_TEMP_NODES,
|
||||
acpi_ns_dump_one_object_path, NULL,
|
||||
(void *)&max_level, NULL);
|
||||
|
||||
(void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
|
||||
}
|
||||
#endif /* ACPI_FUTURE_USAGE */
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ns_dump_entry
|
||||
|
|
|
@ -605,11 +605,19 @@ acpi_walk_namespace(acpi_object_type type,
|
|||
goto unlock_and_exit;
|
||||
}
|
||||
|
||||
/* Now we can validate the starting node */
|
||||
|
||||
if (!acpi_ns_validate_handle(start_object)) {
|
||||
status = AE_BAD_PARAMETER;
|
||||
goto unlock_and_exit2;
|
||||
}
|
||||
|
||||
status = acpi_ns_walk_namespace(type, start_object, max_depth,
|
||||
ACPI_NS_WALK_UNLOCK,
|
||||
descending_callback, ascending_callback,
|
||||
context, return_value);
|
||||
|
||||
unlock_and_exit2:
|
||||
(void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
|
||||
|
||||
unlock_and_exit:
|
||||
|
|
|
@ -80,16 +80,10 @@ acpi_status acpi_tb_verify_table(struct acpi_table_desc *table_desc)
|
|||
}
|
||||
}
|
||||
|
||||
/* FACS is the odd table, has no standard ACPI header and no checksum */
|
||||
/* Always calculate checksum, ignore bad checksum if requested */
|
||||
|
||||
if (!ACPI_COMPARE_NAME(&table_desc->signature, ACPI_SIG_FACS)) {
|
||||
|
||||
/* Always calculate checksum, ignore bad checksum if requested */
|
||||
|
||||
status =
|
||||
acpi_tb_verify_checksum(table_desc->pointer,
|
||||
table_desc->length);
|
||||
}
|
||||
status =
|
||||
acpi_tb_verify_checksum(table_desc->pointer, table_desc->length);
|
||||
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
|
|
@ -138,7 +138,7 @@ acpi_tb_print_table_header(acpi_physical_address address,
|
|||
ACPI_INFO((AE_INFO, "%4.4s %p %05X",
|
||||
header->signature, ACPI_CAST_PTR(void, address),
|
||||
header->length));
|
||||
} else if (ACPI_COMPARE_NAME(header->signature, ACPI_SIG_RSDP)) {
|
||||
} else if (ACPI_VALIDATE_RSDP_SIG(header->signature)) {
|
||||
|
||||
/* RSDP has no common fields */
|
||||
|
||||
|
@ -190,6 +190,16 @@ acpi_status acpi_tb_verify_checksum(struct acpi_table_header *table, u32 length)
|
|||
{
|
||||
u8 checksum;
|
||||
|
||||
/*
|
||||
* FACS/S3PT:
|
||||
* They are the odd tables, have no standard ACPI header and no checksum
|
||||
*/
|
||||
|
||||
if (ACPI_COMPARE_NAME(table->signature, ACPI_SIG_S3PT) ||
|
||||
ACPI_COMPARE_NAME(table->signature, ACPI_SIG_FACS)) {
|
||||
return (AE_OK);
|
||||
}
|
||||
|
||||
/* Compute the checksum on the table */
|
||||
|
||||
checksum = acpi_tb_checksum(ACPI_CAST_PTR(u8, table), length);
|
||||
|
|
|
@ -68,8 +68,7 @@ acpi_status acpi_tb_validate_rsdp(struct acpi_table_rsdp *rsdp)
|
|||
* Note: Sometimes there exists more than one RSDP in memory; the valid
|
||||
* RSDP has a valid checksum, all others have an invalid checksum.
|
||||
*/
|
||||
if (ACPI_STRNCMP((char *)rsdp->signature, ACPI_SIG_RSDP,
|
||||
sizeof(ACPI_SIG_RSDP) - 1) != 0) {
|
||||
if (!ACPI_VALIDATE_RSDP_SIG(rsdp->signature)) {
|
||||
|
||||
/* Nope, BAD Signature */
|
||||
|
||||
|
|
|
@ -190,7 +190,7 @@ acpi_debug_print(u32 requested_debug_level,
|
|||
* Display the module name, current line number, thread ID (if requested),
|
||||
* current procedure nesting level, and the current procedure name
|
||||
*/
|
||||
acpi_os_printf("%8s-%04ld ", module_name, line_number);
|
||||
acpi_os_printf("%9s-%04ld ", module_name, line_number);
|
||||
|
||||
if (ACPI_LV_THREADS & acpi_dbg_level) {
|
||||
acpi_os_printf("[%u] ", (u32)thread_id);
|
||||
|
|
|
@ -291,7 +291,7 @@ acpi_status acpi_ut_init_globals(void)
|
|||
|
||||
#if (!ACPI_REDUCED_HARDWARE)
|
||||
|
||||
/* GPE support */
|
||||
/* GPE/SCI support */
|
||||
|
||||
acpi_gbl_all_gpes_initialized = FALSE;
|
||||
acpi_gbl_gpe_xrupt_list_head = NULL;
|
||||
|
@ -300,6 +300,7 @@ acpi_status acpi_ut_init_globals(void)
|
|||
acpi_current_gpe_count = 0;
|
||||
|
||||
acpi_gbl_global_event_handler = NULL;
|
||||
acpi_gbl_sci_handler_list = NULL;
|
||||
|
||||
#endif /* !ACPI_REDUCED_HARDWARE */
|
||||
|
||||
|
|
|
@ -125,8 +125,9 @@ struct acpi_exception_info {
|
|||
#define AE_NO_HANDLER EXCEP_ENV (0x001A)
|
||||
#define AE_OWNER_ID_LIMIT EXCEP_ENV (0x001B)
|
||||
#define AE_NOT_CONFIGURED EXCEP_ENV (0x001C)
|
||||
#define AE_ACCESS EXCEP_ENV (0x001D)
|
||||
|
||||
#define AE_CODE_ENV_MAX 0x001C
|
||||
#define AE_CODE_ENV_MAX 0x001D
|
||||
|
||||
/*
|
||||
* Programmer exceptions
|
||||
|
@ -227,7 +228,7 @@ static const struct acpi_exception_info acpi_gbl_exception_names_env[] = {
|
|||
EXCEP_TXT("AE_NO_ACPI_TABLES", "ACPI tables could not be found"),
|
||||
EXCEP_TXT("AE_NO_NAMESPACE", "A namespace has not been loaded"),
|
||||
EXCEP_TXT("AE_NO_MEMORY", "Insufficient dynamic memory"),
|
||||
EXCEP_TXT("AE_NOT_FOUND", "The name was not found in the namespace"),
|
||||
EXCEP_TXT("AE_NOT_FOUND", "A requested entity is not found"),
|
||||
EXCEP_TXT("AE_NOT_EXIST", "A required entity does not exist"),
|
||||
EXCEP_TXT("AE_ALREADY_EXISTS", "An entity already exists"),
|
||||
EXCEP_TXT("AE_TYPE", "The object type is incorrect"),
|
||||
|
@ -259,7 +260,8 @@ static const struct acpi_exception_info acpi_gbl_exception_names_env[] = {
|
|||
EXCEP_TXT("AE_OWNER_ID_LIMIT",
|
||||
"There are no more Owner IDs available for ACPI tables or control methods"),
|
||||
EXCEP_TXT("AE_NOT_CONFIGURED",
|
||||
"The interface is not part of the current subsystem configuration")
|
||||
"The interface is not part of the current subsystem configuration"),
|
||||
EXCEP_TXT("AE_ACCESS", "Permission denied for the requested operation")
|
||||
};
|
||||
|
||||
static const struct acpi_exception_info acpi_gbl_exception_names_pgm[] = {
|
||||
|
|
|
@ -46,7 +46,7 @@
|
|||
|
||||
/* Current ACPICA subsystem version in YYYYMMDD format */
|
||||
|
||||
#define ACPI_CA_VERSION 0x20130725
|
||||
#define ACPI_CA_VERSION 0x20130823
|
||||
|
||||
#include <acpi/acconfig.h>
|
||||
#include <acpi/actypes.h>
|
||||
|
@ -280,9 +280,16 @@ acpi_status
|
|||
acpi_install_initialization_handler(acpi_init_handler handler, u32 function);
|
||||
|
||||
ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status
|
||||
acpi_install_global_event_handler
|
||||
(acpi_gbl_event_handler handler, void *context))
|
||||
|
||||
acpi_install_sci_handler(acpi_sci_handler
|
||||
address,
|
||||
void *context))
|
||||
ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status
|
||||
acpi_remove_sci_handler(acpi_sci_handler
|
||||
address))
|
||||
ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status
|
||||
acpi_install_global_event_handler
|
||||
(acpi_gbl_event_handler handler,
|
||||
void *context))
|
||||
ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status
|
||||
acpi_install_fixed_event_handler(u32
|
||||
acpi_event,
|
||||
|
|
|
@ -474,6 +474,11 @@ typedef u64 acpi_integer;
|
|||
#define ACPI_MOVE_NAME(dest,src) (ACPI_STRNCPY (ACPI_CAST_PTR (char, (dest)), ACPI_CAST_PTR (char, (src)), ACPI_NAME_SIZE))
|
||||
#endif
|
||||
|
||||
/* Support for the special RSDP signature (8 characters) */
|
||||
|
||||
#define ACPI_VALIDATE_RSDP_SIG(a) (!ACPI_STRNCMP (ACPI_CAST_PTR (char, (a)), ACPI_SIG_RSDP, 8))
|
||||
#define ACPI_MAKE_RSDP_SIG(dest) (ACPI_MEMCPY (ACPI_CAST_PTR (char, (dest)), ACPI_SIG_RSDP, 8))
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* Miscellaneous constants
|
||||
|
@ -945,6 +950,9 @@ typedef void
|
|||
/*
|
||||
* Various handlers and callback procedures
|
||||
*/
|
||||
typedef
|
||||
u32 (*acpi_sci_handler) (void *context);
|
||||
|
||||
typedef
|
||||
void (*acpi_gbl_event_handler) (u32 event_type,
|
||||
acpi_handle device,
|
||||
|
|
|
@ -87,7 +87,7 @@
|
|||
#define ACPI_FLUSH_CPU_CACHE()
|
||||
#define ACPI_CAST_PTHREAD_T(pthread) ((acpi_thread_id) (pthread))
|
||||
|
||||
#if defined(__ia64__) || defined(__x86_64__)
|
||||
#if defined(__ia64__) || defined(__x86_64__) || defined(__aarch64__)
|
||||
#define ACPI_MACHINE_WIDTH 64
|
||||
#define COMPILER_DEPENDENT_INT64 long
|
||||
#define COMPILER_DEPENDENT_UINT64 unsigned long
|
||||
|
|
Loading…
Reference in a new issue