mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 21:38:32 +08:00
Merge branch 'acpica' into acpi-lpss
The following commits depend on the 'acpica' material.
This commit is contained in:
commit
a090b22f3f
@ -52,10 +52,6 @@
|
||||
|
||||
/* Asm macros */
|
||||
|
||||
#define ACPI_ASM_MACROS
|
||||
#define BREAKPOINT3
|
||||
#define ACPI_DISABLE_IRQS() local_irq_disable()
|
||||
#define ACPI_ENABLE_IRQS() local_irq_enable()
|
||||
#define ACPI_FLUSH_CPU_CACHE()
|
||||
|
||||
static inline int
|
||||
|
@ -49,10 +49,6 @@
|
||||
|
||||
/* Asm macros */
|
||||
|
||||
#define ACPI_ASM_MACROS
|
||||
#define BREAKPOINT3
|
||||
#define ACPI_DISABLE_IRQS() local_irq_disable()
|
||||
#define ACPI_ENABLE_IRQS() local_irq_enable()
|
||||
#define ACPI_FLUSH_CPU_CACHE() wbinvd()
|
||||
|
||||
int __acpi_acquire_global_lock(unsigned int *lock);
|
||||
|
@ -31,6 +31,7 @@ acpi-y += \
|
||||
evgpeinit.o \
|
||||
evgpeutil.o \
|
||||
evglock.o \
|
||||
evhandler.o \
|
||||
evmisc.o \
|
||||
evregion.o \
|
||||
evrgnini.o \
|
||||
@ -90,6 +91,7 @@ acpi-y += \
|
||||
nsobject.o \
|
||||
nsparse.o \
|
||||
nspredef.o \
|
||||
nsprepkg.o \
|
||||
nsrepair.o \
|
||||
nsrepair2.o \
|
||||
nssearch.o \
|
||||
@ -104,7 +106,9 @@ acpi-$(ACPI_FUTURE_USAGE) += nsdumpdv.o
|
||||
acpi-y += \
|
||||
psargs.o \
|
||||
psloop.o \
|
||||
psobject.o \
|
||||
psopcode.o \
|
||||
psopinfo.o \
|
||||
psparse.o \
|
||||
psscope.o \
|
||||
pstree.o \
|
||||
@ -126,7 +130,7 @@ acpi-y += \
|
||||
rsutils.o \
|
||||
rsxface.o
|
||||
|
||||
acpi-$(ACPI_FUTURE_USAGE) += rsdump.o
|
||||
acpi-$(ACPI_FUTURE_USAGE) += rsdump.o rsdumpinfo.o
|
||||
|
||||
acpi-y += \
|
||||
tbfadt.o \
|
||||
@ -155,8 +159,10 @@ acpi-y += \
|
||||
utmutex.o \
|
||||
utobject.o \
|
||||
utosi.o \
|
||||
utownerid.o \
|
||||
utresrc.o \
|
||||
utstate.o \
|
||||
utstring.o \
|
||||
utxface.o \
|
||||
utxfinit.o \
|
||||
utxferror.o \
|
||||
|
@ -51,6 +51,7 @@
|
||||
*
|
||||
* Note: The order of these include files is important.
|
||||
*/
|
||||
#include <acpi/acconfig.h> /* Global configuration constants */
|
||||
#include "acmacros.h" /* C macros */
|
||||
#include "aclocal.h" /* Internal data types */
|
||||
#include "acobject.h" /* ACPI internal object */
|
||||
|
@ -114,6 +114,21 @@ ACPI_HW_DEPENDENT_RETURN_VOID(void
|
||||
acpi_db_generate_gpe(char *gpe_arg,
|
||||
char *block_arg))
|
||||
|
||||
/*
|
||||
* dbconvert - miscellaneous conversion routines
|
||||
*/
|
||||
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);
|
||||
|
||||
acpi_status
|
||||
acpi_db_convert_to_object(acpi_object_type type,
|
||||
char *string, union acpi_object *object);
|
||||
|
||||
u8 *acpi_db_encode_pld_buffer(struct acpi_pld_info *pld_info);
|
||||
|
||||
void acpi_db_dump_pld_buffer(union acpi_object *obj_desc);
|
||||
|
||||
/*
|
||||
* dbmethod - control method commands
|
||||
*/
|
||||
@ -191,6 +206,8 @@ void
|
||||
acpi_db_create_execution_threads(char *num_threads_arg,
|
||||
char *num_loops_arg, char *method_name_arg);
|
||||
|
||||
void acpi_db_delete_objects(u32 count, union acpi_object *objects);
|
||||
|
||||
#ifdef ACPI_DBG_TRACK_ALLOCATIONS
|
||||
u32 acpi_db_get_cache_info(struct acpi_memory_list *cache);
|
||||
#endif
|
||||
|
@ -158,10 +158,23 @@ acpi_ev_delete_gpe_handlers(struct acpi_gpe_xrupt_info *gpe_xrupt_info,
|
||||
void *context);
|
||||
|
||||
/*
|
||||
* evregion - Address Space handling
|
||||
* evhandler - Address space handling
|
||||
*/
|
||||
u8
|
||||
acpi_ev_has_default_handler(struct acpi_namespace_node *node,
|
||||
acpi_adr_space_type space_id);
|
||||
|
||||
acpi_status acpi_ev_install_region_handlers(void);
|
||||
|
||||
acpi_status
|
||||
acpi_ev_install_space_handler(struct acpi_namespace_node *node,
|
||||
acpi_adr_space_type space_id,
|
||||
acpi_adr_space_handler handler,
|
||||
acpi_adr_space_setup setup, void *context);
|
||||
|
||||
/*
|
||||
* evregion - Operation region support
|
||||
*/
|
||||
acpi_status acpi_ev_initialize_op_regions(void);
|
||||
|
||||
acpi_status
|
||||
@ -179,12 +192,6 @@ void
|
||||
acpi_ev_detach_region(union acpi_operand_object *region_obj,
|
||||
u8 acpi_ns_is_locked);
|
||||
|
||||
acpi_status
|
||||
acpi_ev_install_space_handler(struct acpi_namespace_node *node,
|
||||
acpi_adr_space_type space_id,
|
||||
acpi_adr_space_handler handler,
|
||||
acpi_adr_space_setup setup, void *context);
|
||||
|
||||
acpi_status
|
||||
acpi_ev_execute_reg_methods(struct acpi_namespace_node *node,
|
||||
acpi_adr_space_type space_id);
|
||||
|
@ -192,14 +192,6 @@ ACPI_EXTERN u8 acpi_gbl_integer_bit_width;
|
||||
ACPI_EXTERN u8 acpi_gbl_integer_byte_width;
|
||||
ACPI_EXTERN u8 acpi_gbl_integer_nybble_width;
|
||||
|
||||
/* Mutex for _OSI support */
|
||||
|
||||
ACPI_EXTERN acpi_mutex acpi_gbl_osi_mutex;
|
||||
|
||||
/* Reader/Writer lock is used for namespace walk and dynamic table unload */
|
||||
|
||||
ACPI_EXTERN struct acpi_rw_lock acpi_gbl_namespace_rw_lock;
|
||||
|
||||
/*****************************************************************************
|
||||
*
|
||||
* Mutual exclusion within ACPICA subsystem
|
||||
@ -233,6 +225,14 @@ ACPI_EXTERN u8 acpi_gbl_global_lock_pending;
|
||||
ACPI_EXTERN acpi_spinlock acpi_gbl_gpe_lock; /* For GPE data structs and registers */
|
||||
ACPI_EXTERN acpi_spinlock acpi_gbl_hardware_lock; /* For ACPI H/W except GPE registers */
|
||||
|
||||
/* Mutex for _OSI support */
|
||||
|
||||
ACPI_EXTERN acpi_mutex acpi_gbl_osi_mutex;
|
||||
|
||||
/* Reader/Writer lock is used for namespace walk and dynamic table unload */
|
||||
|
||||
ACPI_EXTERN struct acpi_rw_lock acpi_gbl_namespace_rw_lock;
|
||||
|
||||
/*****************************************************************************
|
||||
*
|
||||
* Miscellaneous globals
|
||||
@ -252,7 +252,7 @@ ACPI_EXTERN acpi_cache_t *acpi_gbl_operand_cache;
|
||||
ACPI_EXTERN struct acpi_global_notify_handler acpi_gbl_global_notify[2];
|
||||
ACPI_EXTERN acpi_exception_handler acpi_gbl_exception_handler;
|
||||
ACPI_EXTERN acpi_init_handler acpi_gbl_init_handler;
|
||||
ACPI_EXTERN acpi_tbl_handler acpi_gbl_table_handler;
|
||||
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;
|
||||
@ -304,6 +304,7 @@ extern const char *acpi_gbl_region_types[ACPI_NUM_PREDEFINED_REGIONS];
|
||||
ACPI_EXTERN struct acpi_memory_list *acpi_gbl_global_list;
|
||||
ACPI_EXTERN struct acpi_memory_list *acpi_gbl_ns_node_list;
|
||||
ACPI_EXTERN u8 acpi_gbl_display_final_mem_stats;
|
||||
ACPI_EXTERN u8 acpi_gbl_disable_mem_tracking;
|
||||
#endif
|
||||
|
||||
/*****************************************************************************
|
||||
@ -365,19 +366,18 @@ ACPI_EXTERN u8 acpi_gbl_sleep_type_b;
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
extern struct acpi_fixed_event_info
|
||||
acpi_gbl_fixed_event_info[ACPI_NUM_FIXED_EVENTS];
|
||||
ACPI_EXTERN struct acpi_fixed_event_handler
|
||||
acpi_gbl_fixed_event_handlers[ACPI_NUM_FIXED_EVENTS];
|
||||
ACPI_EXTERN struct acpi_gpe_xrupt_info *acpi_gbl_gpe_xrupt_list_head;
|
||||
ACPI_EXTERN struct acpi_gpe_block_info
|
||||
*acpi_gbl_gpe_fadt_blocks[ACPI_MAX_GPE_BLOCKS];
|
||||
|
||||
#if (!ACPI_REDUCED_HARDWARE)
|
||||
|
||||
ACPI_EXTERN u8 acpi_gbl_all_gpes_initialized;
|
||||
ACPI_EXTERN struct acpi_gpe_xrupt_info *acpi_gbl_gpe_xrupt_list_head;
|
||||
ACPI_EXTERN struct acpi_gpe_block_info
|
||||
*acpi_gbl_gpe_fadt_blocks[ACPI_MAX_GPE_BLOCKS];
|
||||
ACPI_EXTERN acpi_gbl_event_handler acpi_gbl_global_event_handler;
|
||||
ACPI_EXTERN void *acpi_gbl_global_event_handler_context;
|
||||
ACPI_EXTERN struct acpi_fixed_event_handler
|
||||
acpi_gbl_fixed_event_handlers[ACPI_NUM_FIXED_EVENTS];
|
||||
extern struct acpi_fixed_event_info
|
||||
acpi_gbl_fixed_event_info[ACPI_NUM_FIXED_EVENTS];
|
||||
|
||||
#endif /* !ACPI_REDUCED_HARDWARE */
|
||||
|
||||
@ -415,6 +415,8 @@ ACPI_EXTERN u8 acpi_gbl_db_output_flags;
|
||||
|
||||
ACPI_EXTERN u8 acpi_gbl_db_opt_disasm;
|
||||
ACPI_EXTERN u8 acpi_gbl_db_opt_verbose;
|
||||
ACPI_EXTERN struct acpi_external_list *acpi_gbl_external_list;
|
||||
ACPI_EXTERN struct acpi_external_file *acpi_gbl_external_file_list;
|
||||
#endif
|
||||
|
||||
#ifdef ACPI_DEBUGGER
|
||||
@ -426,6 +428,7 @@ extern u8 acpi_gbl_db_terminate_threads;
|
||||
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];
|
||||
|
@ -458,7 +458,7 @@ void acpi_ex_reacquire_interpreter(void);
|
||||
|
||||
void acpi_ex_relinquish_interpreter(void);
|
||||
|
||||
void acpi_ex_truncate_for32bit_table(union acpi_operand_object *obj_desc);
|
||||
u8 acpi_ex_truncate_for32bit_table(union acpi_operand_object *obj_desc);
|
||||
|
||||
void acpi_ex_acquire_global_lock(u32 rule);
|
||||
|
||||
|
@ -189,11 +189,10 @@ struct acpi_namespace_node {
|
||||
#define ANOBJ_EVALUATED 0x20 /* Set on first evaluation of node */
|
||||
#define ANOBJ_ALLOCATED_BUFFER 0x40 /* Method AML buffer is dynamic (install_method) */
|
||||
|
||||
#define ANOBJ_IS_EXTERNAL 0x08 /* i_aSL only: This object created via External() */
|
||||
#define ANOBJ_METHOD_NO_RETVAL 0x10 /* i_aSL only: Method has no return value */
|
||||
#define ANOBJ_METHOD_SOME_NO_RETVAL 0x20 /* i_aSL only: Method has at least one return value */
|
||||
#define ANOBJ_IS_BIT_OFFSET 0x40 /* i_aSL only: Reference is a bit offset */
|
||||
#define ANOBJ_IS_REFERENCED 0x80 /* i_aSL only: Object was referenced */
|
||||
#define ANOBJ_IS_EXTERNAL 0x08 /* iASL only: This object created via External() */
|
||||
#define ANOBJ_METHOD_NO_RETVAL 0x10 /* iASL only: Method has no return value */
|
||||
#define ANOBJ_METHOD_SOME_NO_RETVAL 0x20 /* iASL only: Method has at least one return value */
|
||||
#define ANOBJ_IS_REFERENCED 0x80 /* iASL only: Object was referenced */
|
||||
|
||||
/* Internal ACPI table management - master table list */
|
||||
|
||||
@ -411,11 +410,10 @@ struct acpi_gpe_notify_info {
|
||||
struct acpi_gpe_notify_info *next;
|
||||
};
|
||||
|
||||
struct acpi_gpe_notify_object {
|
||||
struct acpi_namespace_node *node;
|
||||
struct acpi_gpe_notify_object *next;
|
||||
};
|
||||
|
||||
/*
|
||||
* GPE dispatch info. At any time, the GPE can have at most one type
|
||||
* of dispatch - Method, Handler, or Implicit Notify.
|
||||
*/
|
||||
union acpi_gpe_dispatch_info {
|
||||
struct acpi_namespace_node *method_node; /* Method node for this GPE level */
|
||||
struct acpi_gpe_handler_info *handler; /* Installed GPE handler */
|
||||
@ -679,6 +677,8 @@ struct acpi_opcode_info {
|
||||
u8 type; /* Opcode type */
|
||||
};
|
||||
|
||||
/* Value associated with the parse object */
|
||||
|
||||
union acpi_parse_value {
|
||||
u64 integer; /* Integer constant (Up to 64 bits) */
|
||||
u32 size; /* bytelist or field size */
|
||||
@ -1023,6 +1023,31 @@ struct acpi_port_info {
|
||||
|
||||
#define ACPI_ASCII_ZERO 0x30
|
||||
|
||||
/*****************************************************************************
|
||||
*
|
||||
* Disassembler
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
struct acpi_external_list {
|
||||
char *path;
|
||||
char *internal_path;
|
||||
struct acpi_external_list *next;
|
||||
u32 value;
|
||||
u16 length;
|
||||
u8 type;
|
||||
u8 flags;
|
||||
};
|
||||
|
||||
/* Values for Flags field above */
|
||||
|
||||
#define ACPI_IPATH_ALLOCATED 0x01
|
||||
|
||||
struct acpi_external_file {
|
||||
char *path;
|
||||
struct acpi_external_file *next;
|
||||
};
|
||||
|
||||
/*****************************************************************************
|
||||
*
|
||||
* Debugger
|
||||
|
@ -49,14 +49,18 @@
|
||||
* get into potential aligment issues -- see the STORE macros below.
|
||||
* Use with care.
|
||||
*/
|
||||
#define ACPI_GET8(ptr) *ACPI_CAST_PTR (u8, ptr)
|
||||
#define ACPI_GET16(ptr) *ACPI_CAST_PTR (u16, ptr)
|
||||
#define ACPI_GET32(ptr) *ACPI_CAST_PTR (u32, ptr)
|
||||
#define ACPI_GET64(ptr) *ACPI_CAST_PTR (u64, ptr)
|
||||
#define ACPI_SET8(ptr) *ACPI_CAST_PTR (u8, ptr)
|
||||
#define ACPI_SET16(ptr) *ACPI_CAST_PTR (u16, ptr)
|
||||
#define ACPI_SET32(ptr) *ACPI_CAST_PTR (u32, ptr)
|
||||
#define ACPI_SET64(ptr) *ACPI_CAST_PTR (u64, ptr)
|
||||
#define ACPI_CAST8(ptr) ACPI_CAST_PTR (u8, (ptr))
|
||||
#define ACPI_CAST16(ptr) ACPI_CAST_PTR (u16, (ptr))
|
||||
#define ACPI_CAST32(ptr) ACPI_CAST_PTR (u32, (ptr))
|
||||
#define ACPI_CAST64(ptr) ACPI_CAST_PTR (u64, (ptr))
|
||||
#define ACPI_GET8(ptr) (*ACPI_CAST8 (ptr))
|
||||
#define ACPI_GET16(ptr) (*ACPI_CAST16 (ptr))
|
||||
#define ACPI_GET32(ptr) (*ACPI_CAST32 (ptr))
|
||||
#define ACPI_GET64(ptr) (*ACPI_CAST64 (ptr))
|
||||
#define ACPI_SET8(ptr, val) (*ACPI_CAST8 (ptr) = (u8) (val))
|
||||
#define ACPI_SET16(ptr, val) (*ACPI_CAST16 (ptr) = (u16) (val))
|
||||
#define ACPI_SET32(ptr, val) (*ACPI_CAST32 (ptr) = (u32) (val))
|
||||
#define ACPI_SET64(ptr, val) (*ACPI_CAST64 (ptr) = (u64) (val))
|
||||
|
||||
/*
|
||||
* printf() format helpers
|
||||
@ -293,6 +297,26 @@
|
||||
#define ACPI_16BIT_MASK 0x0000FFFF
|
||||
#define ACPI_24BIT_MASK 0x00FFFFFF
|
||||
|
||||
/* Macros to extract flag bits from position zero */
|
||||
|
||||
#define ACPI_GET_1BIT_FLAG(value) ((value) & ACPI_1BIT_MASK)
|
||||
#define ACPI_GET_2BIT_FLAG(value) ((value) & ACPI_2BIT_MASK)
|
||||
#define ACPI_GET_3BIT_FLAG(value) ((value) & ACPI_3BIT_MASK)
|
||||
#define ACPI_GET_4BIT_FLAG(value) ((value) & ACPI_4BIT_MASK)
|
||||
|
||||
/* Macros to extract flag bits from position one and above */
|
||||
|
||||
#define ACPI_EXTRACT_1BIT_FLAG(field, position) (ACPI_GET_1BIT_FLAG ((field) >> position))
|
||||
#define ACPI_EXTRACT_2BIT_FLAG(field, position) (ACPI_GET_2BIT_FLAG ((field) >> position))
|
||||
#define ACPI_EXTRACT_3BIT_FLAG(field, position) (ACPI_GET_3BIT_FLAG ((field) >> position))
|
||||
#define ACPI_EXTRACT_4BIT_FLAG(field, position) (ACPI_GET_4BIT_FLAG ((field) >> position))
|
||||
|
||||
/* ACPI Pathname helpers */
|
||||
|
||||
#define ACPI_IS_ROOT_PREFIX(c) ((c) == (u8) 0x5C) /* Backslash */
|
||||
#define ACPI_IS_PARENT_PREFIX(c) ((c) == (u8) 0x5E) /* Carat */
|
||||
#define ACPI_IS_PATH_SEPARATOR(c) ((c) == (u8) 0x2E) /* Period (dot) */
|
||||
|
||||
/*
|
||||
* An object of type struct acpi_namespace_node can appear in some contexts
|
||||
* where a pointer to an object of type union acpi_operand_object can also
|
||||
@ -364,137 +388,6 @@
|
||||
|
||||
#endif /* ACPI_NO_ERROR_MESSAGES */
|
||||
|
||||
/*
|
||||
* Debug macros that are conditionally compiled
|
||||
*/
|
||||
#ifdef ACPI_DEBUG_OUTPUT
|
||||
/*
|
||||
* Function entry tracing
|
||||
*/
|
||||
#define ACPI_FUNCTION_TRACE(a) ACPI_FUNCTION_NAME(a) \
|
||||
acpi_ut_trace(ACPI_DEBUG_PARAMETERS)
|
||||
#define ACPI_FUNCTION_TRACE_PTR(a, b) ACPI_FUNCTION_NAME(a) \
|
||||
acpi_ut_trace_ptr(ACPI_DEBUG_PARAMETERS, (void *)b)
|
||||
#define ACPI_FUNCTION_TRACE_U32(a, b) ACPI_FUNCTION_NAME(a) \
|
||||
acpi_ut_trace_u32(ACPI_DEBUG_PARAMETERS, (u32)b)
|
||||
#define ACPI_FUNCTION_TRACE_STR(a, b) ACPI_FUNCTION_NAME(a) \
|
||||
acpi_ut_trace_str(ACPI_DEBUG_PARAMETERS, (char *)b)
|
||||
|
||||
#define ACPI_FUNCTION_ENTRY() acpi_ut_track_stack_ptr()
|
||||
|
||||
/*
|
||||
* Function exit tracing.
|
||||
* WARNING: These macros include a return statement. This is usually considered
|
||||
* bad form, but having a separate exit macro is very ugly and difficult to maintain.
|
||||
* One of the FUNCTION_TRACE macros above must be used in conjunction with these macros
|
||||
* so that "_AcpiFunctionName" is defined.
|
||||
*
|
||||
* Note: the DO_WHILE0 macro is used to prevent some compilers from complaining
|
||||
* about these constructs.
|
||||
*/
|
||||
#ifdef ACPI_USE_DO_WHILE_0
|
||||
#define ACPI_DO_WHILE0(a) do a while(0)
|
||||
#else
|
||||
#define ACPI_DO_WHILE0(a) a
|
||||
#endif
|
||||
|
||||
#define return_VOID ACPI_DO_WHILE0 ({ \
|
||||
acpi_ut_exit (ACPI_DEBUG_PARAMETERS); \
|
||||
return;})
|
||||
/*
|
||||
* There are two versions of most of the return macros. The default version is
|
||||
* safer, since it avoids side-effects by guaranteeing that the argument will
|
||||
* not be evaluated twice.
|
||||
*
|
||||
* A less-safe version of the macros is provided for optional use if the
|
||||
* compiler uses excessive CPU stack (for example, this may happen in the
|
||||
* debug case if code optimzation is disabled.)
|
||||
*/
|
||||
#ifndef ACPI_SIMPLE_RETURN_MACROS
|
||||
|
||||
#define return_ACPI_STATUS(s) ACPI_DO_WHILE0 ({ \
|
||||
register acpi_status _s = (s); \
|
||||
acpi_ut_status_exit (ACPI_DEBUG_PARAMETERS, _s); \
|
||||
return (_s); })
|
||||
#define return_PTR(s) ACPI_DO_WHILE0 ({ \
|
||||
register void *_s = (void *) (s); \
|
||||
acpi_ut_ptr_exit (ACPI_DEBUG_PARAMETERS, (u8 *) _s); \
|
||||
return (_s); })
|
||||
#define return_VALUE(s) ACPI_DO_WHILE0 ({ \
|
||||
register u64 _s = (s); \
|
||||
acpi_ut_value_exit (ACPI_DEBUG_PARAMETERS, _s); \
|
||||
return (_s); })
|
||||
#define return_UINT8(s) ACPI_DO_WHILE0 ({ \
|
||||
register u8 _s = (u8) (s); \
|
||||
acpi_ut_value_exit (ACPI_DEBUG_PARAMETERS, (u64) _s); \
|
||||
return (_s); })
|
||||
#define return_UINT32(s) ACPI_DO_WHILE0 ({ \
|
||||
register u32 _s = (u32) (s); \
|
||||
acpi_ut_value_exit (ACPI_DEBUG_PARAMETERS, (u64) _s); \
|
||||
return (_s); })
|
||||
#else /* Use original less-safe macros */
|
||||
|
||||
#define return_ACPI_STATUS(s) ACPI_DO_WHILE0 ({ \
|
||||
acpi_ut_status_exit (ACPI_DEBUG_PARAMETERS, (s)); \
|
||||
return((s)); })
|
||||
#define return_PTR(s) ACPI_DO_WHILE0 ({ \
|
||||
acpi_ut_ptr_exit (ACPI_DEBUG_PARAMETERS, (u8 *) (s)); \
|
||||
return((s)); })
|
||||
#define return_VALUE(s) ACPI_DO_WHILE0 ({ \
|
||||
acpi_ut_value_exit (ACPI_DEBUG_PARAMETERS, (u64) (s)); \
|
||||
return((s)); })
|
||||
#define return_UINT8(s) return_VALUE(s)
|
||||
#define return_UINT32(s) return_VALUE(s)
|
||||
|
||||
#endif /* ACPI_SIMPLE_RETURN_MACROS */
|
||||
|
||||
/* Conditional execution */
|
||||
|
||||
#define ACPI_DEBUG_EXEC(a) a
|
||||
#define ACPI_DEBUG_ONLY_MEMBERS(a) a;
|
||||
#define _VERBOSE_STRUCTURES
|
||||
|
||||
/* Various object display routines for debug */
|
||||
|
||||
#define ACPI_DUMP_STACK_ENTRY(a) acpi_ex_dump_operand((a), 0)
|
||||
#define ACPI_DUMP_OPERANDS(a, b ,c) acpi_ex_dump_operands(a, b, c)
|
||||
#define ACPI_DUMP_ENTRY(a, b) acpi_ns_dump_entry (a, b)
|
||||
#define ACPI_DUMP_PATHNAME(a, b, c, d) acpi_ns_dump_pathname(a, b, c, d)
|
||||
#define ACPI_DUMP_BUFFER(a, b) acpi_ut_debug_dump_buffer((u8 *) a, b, DB_BYTE_DISPLAY, _COMPONENT)
|
||||
|
||||
#else
|
||||
/*
|
||||
* This is the non-debug case -- make everything go away,
|
||||
* leaving no executable debug code!
|
||||
*/
|
||||
#define ACPI_DEBUG_EXEC(a)
|
||||
#define ACPI_DEBUG_ONLY_MEMBERS(a)
|
||||
#define ACPI_FUNCTION_TRACE(a)
|
||||
#define ACPI_FUNCTION_TRACE_PTR(a, b)
|
||||
#define ACPI_FUNCTION_TRACE_U32(a, b)
|
||||
#define ACPI_FUNCTION_TRACE_STR(a, b)
|
||||
#define ACPI_FUNCTION_EXIT
|
||||
#define ACPI_FUNCTION_STATUS_EXIT(s)
|
||||
#define ACPI_FUNCTION_VALUE_EXIT(s)
|
||||
#define ACPI_FUNCTION_ENTRY()
|
||||
#define ACPI_DUMP_STACK_ENTRY(a)
|
||||
#define ACPI_DUMP_OPERANDS(a, b, c)
|
||||
#define ACPI_DUMP_ENTRY(a, b)
|
||||
#define ACPI_DUMP_TABLES(a, b)
|
||||
#define ACPI_DUMP_PATHNAME(a, b, c, d)
|
||||
#define ACPI_DUMP_BUFFER(a, b)
|
||||
#define ACPI_DEBUG_PRINT(pl)
|
||||
#define ACPI_DEBUG_PRINT_RAW(pl)
|
||||
|
||||
#define return_VOID return
|
||||
#define return_ACPI_STATUS(s) return(s)
|
||||
#define return_VALUE(s) return(s)
|
||||
#define return_UINT8(s) return(s)
|
||||
#define return_UINT32(s) return(s)
|
||||
#define return_PTR(s) return(s)
|
||||
|
||||
#endif /* ACPI_DEBUG_OUTPUT */
|
||||
|
||||
#if (!ACPI_REDUCED_HARDWARE)
|
||||
#define ACPI_HW_OPTIONAL_FUNCTION(addr) addr
|
||||
#else
|
||||
|
@ -218,6 +218,18 @@ acpi_ns_check_parameter_count(char *pathname,
|
||||
u32 user_param_count,
|
||||
const union acpi_predefined_info *info);
|
||||
|
||||
acpi_status
|
||||
acpi_ns_check_object_type(struct acpi_predefined_data *data,
|
||||
union acpi_operand_object **return_object_ptr,
|
||||
u32 expected_btypes, u32 package_index);
|
||||
|
||||
/*
|
||||
* nsprepkg - Validation of predefined name packages
|
||||
*/
|
||||
acpi_status
|
||||
acpi_ns_check_package(struct acpi_predefined_data *data,
|
||||
union acpi_operand_object **return_object_ptr);
|
||||
|
||||
/*
|
||||
* nsnames - Name and Scope manipulation
|
||||
*/
|
||||
@ -333,8 +345,6 @@ acpi_ns_install_node(struct acpi_walk_state *walk_state,
|
||||
/*
|
||||
* nsutils - Utility functions
|
||||
*/
|
||||
u8 acpi_ns_valid_root_prefix(char prefix);
|
||||
|
||||
acpi_object_type acpi_ns_get_type(struct acpi_namespace_node *node);
|
||||
|
||||
u32 acpi_ns_local(acpi_object_type type);
|
||||
|
@ -307,7 +307,7 @@ struct acpi_object_addr_handler {
|
||||
struct acpi_namespace_node *node; /* Parent device */
|
||||
void *context;
|
||||
acpi_adr_space_setup setup;
|
||||
union acpi_operand_object *region_list; /* regions using this handler */
|
||||
union acpi_operand_object *region_list; /* Regions using this handler */
|
||||
union acpi_operand_object *next;
|
||||
};
|
||||
|
||||
|
@ -105,7 +105,28 @@ union acpi_parse_object *acpi_ps_find_name(union acpi_parse_object *scope,
|
||||
union acpi_parse_object *acpi_ps_get_parent(union acpi_parse_object *op);
|
||||
|
||||
/*
|
||||
* psopcode - AML Opcode information
|
||||
* psobject - support for parse object processing
|
||||
*/
|
||||
acpi_status
|
||||
acpi_ps_build_named_op(struct acpi_walk_state *walk_state,
|
||||
u8 *aml_op_start,
|
||||
union acpi_parse_object *unnamed_op,
|
||||
union acpi_parse_object **op);
|
||||
|
||||
acpi_status
|
||||
acpi_ps_create_op(struct acpi_walk_state *walk_state,
|
||||
u8 *aml_op_start, union acpi_parse_object **new_op);
|
||||
|
||||
acpi_status
|
||||
acpi_ps_complete_op(struct acpi_walk_state *walk_state,
|
||||
union acpi_parse_object **op, acpi_status status);
|
||||
|
||||
acpi_status
|
||||
acpi_ps_complete_final_op(struct acpi_walk_state *walk_state,
|
||||
union acpi_parse_object *op, acpi_status status);
|
||||
|
||||
/*
|
||||
* psopinfo - AML Opcode information
|
||||
*/
|
||||
const struct acpi_opcode_info *acpi_ps_get_opcode_info(u16 opcode);
|
||||
|
||||
@ -211,8 +232,6 @@ void acpi_ps_free_op(union acpi_parse_object *op);
|
||||
|
||||
u8 acpi_ps_is_leading_char(u32 c);
|
||||
|
||||
u8 acpi_ps_is_prefix_char(u32 c);
|
||||
|
||||
#ifdef ACPI_FUTURE_USAGE
|
||||
u32 acpi_ps_get_name(union acpi_parse_object *op);
|
||||
#endif /* ACPI_FUTURE_USAGE */
|
||||
|
@ -1,7 +1,6 @@
|
||||
/******************************************************************************
|
||||
*
|
||||
* Name: acpredef - Information table for ACPI predefined methods and objects
|
||||
* $Revision: 1.1 $
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
@ -51,13 +50,13 @@
|
||||
*
|
||||
* 1) PTYPE1 packages do not contain sub-packages.
|
||||
*
|
||||
* ACPI_PTYPE1_FIXED: Fixed length, 1 or 2 object types:
|
||||
* ACPI_PTYPE1_FIXED: Fixed-length length, 1 or 2 object types:
|
||||
* object type
|
||||
* count
|
||||
* object type
|
||||
* count
|
||||
*
|
||||
* ACPI_PTYPE1_VAR: Variable length:
|
||||
* ACPI_PTYPE1_VAR: Variable-length length:
|
||||
* object type (Int/Buf/Ref)
|
||||
*
|
||||
* ACPI_PTYPE1_OPTION: Package has some required and some optional elements
|
||||
@ -85,10 +84,10 @@
|
||||
* count
|
||||
* (Used for _CST)
|
||||
*
|
||||
* ACPI_PTYPE2_FIXED: Each subpackage is of fixed length
|
||||
* ACPI_PTYPE2_FIXED: Each subpackage is of Fixed-length
|
||||
* (Used for _PRT)
|
||||
*
|
||||
* ACPI_PTYPE2_MIN: Each subpackage has a variable but minimum length
|
||||
* ACPI_PTYPE2_MIN: Each subpackage has a Variable-length but minimum length
|
||||
* (Used for _HPX)
|
||||
*
|
||||
* ACPI_PTYPE2_REV_FIXED: Revision at start, each subpackage is Fixed-length
|
||||
@ -124,7 +123,8 @@ enum acpi_return_package_types {
|
||||
* These are the names that can actually be evaluated via acpi_evaluate_object.
|
||||
* Not present in this table are the following:
|
||||
*
|
||||
* 1) Predefined/Reserved names that are never evaluated via acpi_evaluate_object:
|
||||
* 1) Predefined/Reserved names that are never evaluated via
|
||||
* acpi_evaluate_object:
|
||||
* _Lxx and _Exx GPE methods
|
||||
* _Qxx EC methods
|
||||
* _T_x compiler temporary variables
|
||||
@ -149,6 +149,8 @@ enum acpi_return_package_types {
|
||||
* information about the expected structure of the package. This information
|
||||
* is saved here (rather than in a separate table) in order to minimize the
|
||||
* overall size of the stored data.
|
||||
*
|
||||
* Note: The additional braces are intended to promote portability.
|
||||
*/
|
||||
static const union acpi_predefined_info predefined_names[] = {
|
||||
{{"_AC0", 0, ACPI_RTYPE_INTEGER}},
|
||||
|
@ -347,18 +347,21 @@ extern struct acpi_rsdump_info *acpi_gbl_dump_resource_dispatch[];
|
||||
extern struct acpi_rsdump_info *acpi_gbl_dump_serial_bus_dispatch[];
|
||||
|
||||
/*
|
||||
* rsdump
|
||||
* rsdumpinfo
|
||||
*/
|
||||
extern struct acpi_rsdump_info acpi_rs_dump_irq[];
|
||||
extern struct acpi_rsdump_info acpi_rs_dump_prt[];
|
||||
extern struct acpi_rsdump_info acpi_rs_dump_dma[];
|
||||
extern struct acpi_rsdump_info acpi_rs_dump_start_dpf[];
|
||||
extern struct acpi_rsdump_info acpi_rs_dump_end_dpf[];
|
||||
extern struct acpi_rsdump_info acpi_rs_dump_io[];
|
||||
extern struct acpi_rsdump_info acpi_rs_dump_io_flags[];
|
||||
extern struct acpi_rsdump_info acpi_rs_dump_fixed_io[];
|
||||
extern struct acpi_rsdump_info acpi_rs_dump_vendor[];
|
||||
extern struct acpi_rsdump_info acpi_rs_dump_end_tag[];
|
||||
extern struct acpi_rsdump_info acpi_rs_dump_memory24[];
|
||||
extern struct acpi_rsdump_info acpi_rs_dump_memory32[];
|
||||
extern struct acpi_rsdump_info acpi_rs_dump_memory_flags[];
|
||||
extern struct acpi_rsdump_info acpi_rs_dump_fixed_memory32[];
|
||||
extern struct acpi_rsdump_info acpi_rs_dump_address16[];
|
||||
extern struct acpi_rsdump_info acpi_rs_dump_address32[];
|
||||
@ -372,6 +375,7 @@ extern struct acpi_rsdump_info acpi_rs_dump_common_serial_bus[];
|
||||
extern struct acpi_rsdump_info acpi_rs_dump_i2c_serial_bus[];
|
||||
extern struct acpi_rsdump_info acpi_rs_dump_spi_serial_bus[];
|
||||
extern struct acpi_rsdump_info acpi_rs_dump_uart_serial_bus[];
|
||||
extern struct acpi_rsdump_info acpi_rs_dump_general_flags[];
|
||||
#endif
|
||||
|
||||
#endif /* __ACRESRC_H__ */
|
||||
|
@ -483,39 +483,17 @@ acpi_ut_short_divide(u64 in_dividend,
|
||||
/*
|
||||
* utmisc
|
||||
*/
|
||||
void ut_convert_backslashes(char *pathname);
|
||||
|
||||
const char *acpi_ut_validate_exception(acpi_status status);
|
||||
|
||||
u8 acpi_ut_is_pci_root_bridge(char *id);
|
||||
|
||||
u8 acpi_ut_is_aml_table(struct acpi_table_header *table);
|
||||
|
||||
acpi_status acpi_ut_allocate_owner_id(acpi_owner_id * owner_id);
|
||||
|
||||
void acpi_ut_release_owner_id(acpi_owner_id * owner_id);
|
||||
|
||||
acpi_status
|
||||
acpi_ut_walk_package_tree(union acpi_operand_object *source_object,
|
||||
void *target_object,
|
||||
acpi_pkg_callback walk_callback, void *context);
|
||||
|
||||
void acpi_ut_strupr(char *src_string);
|
||||
|
||||
void acpi_ut_strlwr(char *src_string);
|
||||
|
||||
int acpi_ut_stricmp(char *string1, char *string2);
|
||||
|
||||
void acpi_ut_print_string(char *string, u8 max_length);
|
||||
|
||||
u8 acpi_ut_valid_acpi_name(u32 name);
|
||||
|
||||
void acpi_ut_repair_name(char *name);
|
||||
|
||||
u8 acpi_ut_valid_acpi_char(char character, u32 position);
|
||||
|
||||
acpi_status acpi_ut_strtoul64(char *string, u32 base, u64 *ret_integer);
|
||||
|
||||
/* Values for Base above (16=Hex, 10=Decimal) */
|
||||
|
||||
#define ACPI_ANY_BASE 0
|
||||
@ -531,16 +509,26 @@ acpi_ut_display_init_pathname(u8 type,
|
||||
char *path);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* utownerid - Support for Table/Method Owner IDs
|
||||
*/
|
||||
acpi_status acpi_ut_allocate_owner_id(acpi_owner_id * owner_id);
|
||||
|
||||
void acpi_ut_release_owner_id(acpi_owner_id * owner_id);
|
||||
|
||||
/*
|
||||
* utresrc
|
||||
*/
|
||||
acpi_status
|
||||
acpi_ut_walk_aml_resources(u8 *aml,
|
||||
acpi_ut_walk_aml_resources(struct acpi_walk_state *walk_state,
|
||||
u8 *aml,
|
||||
acpi_size aml_length,
|
||||
acpi_walk_aml_callback user_function,
|
||||
void **context);
|
||||
|
||||
acpi_status acpi_ut_validate_resource(void *aml, u8 *return_index);
|
||||
acpi_status
|
||||
acpi_ut_validate_resource(struct acpi_walk_state *walk_state,
|
||||
void *aml, u8 *return_index);
|
||||
|
||||
u32 acpi_ut_get_descriptor_length(void *aml);
|
||||
|
||||
@ -553,6 +541,27 @@ u8 acpi_ut_get_resource_type(void *aml);
|
||||
acpi_status
|
||||
acpi_ut_get_resource_end_tag(union acpi_operand_object *obj_desc, u8 **end_tag);
|
||||
|
||||
/*
|
||||
* utstring - String and character utilities
|
||||
*/
|
||||
void acpi_ut_strupr(char *src_string);
|
||||
|
||||
void acpi_ut_strlwr(char *src_string);
|
||||
|
||||
int acpi_ut_stricmp(char *string1, char *string2);
|
||||
|
||||
acpi_status acpi_ut_strtoul64(char *string, u32 base, u64 *ret_integer);
|
||||
|
||||
void acpi_ut_print_string(char *string, u8 max_length);
|
||||
|
||||
void ut_convert_backslashes(char *pathname);
|
||||
|
||||
u8 acpi_ut_valid_acpi_name(u32 name);
|
||||
|
||||
u8 acpi_ut_valid_acpi_char(char character, u32 position);
|
||||
|
||||
void acpi_ut_repair_name(char *name);
|
||||
|
||||
/*
|
||||
* utmutex - mutex support
|
||||
*/
|
||||
|
@ -199,6 +199,12 @@ struct aml_resource_fixed_dma {
|
||||
struct aml_resource_large_header {
|
||||
AML_RESOURCE_LARGE_HEADER_COMMON};
|
||||
|
||||
/* General Flags for address space resource descriptors */
|
||||
|
||||
#define ACPI_RESOURCE_FLAG_DEC 2
|
||||
#define ACPI_RESOURCE_FLAG_MIF 4
|
||||
#define ACPI_RESOURCE_FLAG_MAF 8
|
||||
|
||||
struct aml_resource_memory24 {
|
||||
AML_RESOURCE_LARGE_HEADER_COMMON u8 flags;
|
||||
u16 minimum;
|
||||
|
@ -47,7 +47,7 @@
|
||||
#include "acinterp.h"
|
||||
#include "acnamesp.h"
|
||||
#ifdef ACPI_DISASSEMBLER
|
||||
#include <acpi/acdisasm.h>
|
||||
#include "acdisasm.h"
|
||||
#endif
|
||||
|
||||
#define _COMPONENT ACPI_DISPATCHER
|
||||
@ -151,6 +151,7 @@ acpi_ds_create_method_mutex(union acpi_operand_object *method_desc)
|
||||
|
||||
status = acpi_os_create_mutex(&mutex_desc->mutex.os_mutex);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
acpi_ut_delete_object_desc(mutex_desc);
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
@ -378,7 +379,8 @@ acpi_ds_call_control_method(struct acpi_thread_state *thread,
|
||||
*/
|
||||
info = ACPI_ALLOCATE_ZEROED(sizeof(struct acpi_evaluate_info));
|
||||
if (!info) {
|
||||
return_ACPI_STATUS(AE_NO_MEMORY);
|
||||
status = AE_NO_MEMORY;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
info->parameters = &this_walk_state->operands[0];
|
||||
|
@ -388,7 +388,7 @@ acpi_ds_build_internal_package_obj(struct acpi_walk_state *walk_state,
|
||||
union acpi_parse_object *parent;
|
||||
union acpi_operand_object *obj_desc = NULL;
|
||||
acpi_status status = AE_OK;
|
||||
unsigned i;
|
||||
u32 i;
|
||||
u16 index;
|
||||
u16 reference_count;
|
||||
|
||||
@ -703,7 +703,7 @@ acpi_ds_init_object_from_op(struct acpi_walk_state *walk_state,
|
||||
/* Truncate value if we are executing from a 32-bit ACPI table */
|
||||
|
||||
#ifndef ACPI_NO_METHOD_EXECUTION
|
||||
acpi_ex_truncate_for32bit_table(obj_desc);
|
||||
(void)acpi_ex_truncate_for32bit_table(obj_desc);
|
||||
#endif
|
||||
break;
|
||||
|
||||
@ -725,8 +725,18 @@ acpi_ds_init_object_from_op(struct acpi_walk_state *walk_state,
|
||||
case AML_TYPE_LITERAL:
|
||||
|
||||
obj_desc->integer.value = op->common.value.integer;
|
||||
|
||||
#ifndef ACPI_NO_METHOD_EXECUTION
|
||||
acpi_ex_truncate_for32bit_table(obj_desc);
|
||||
if (acpi_ex_truncate_for32bit_table(obj_desc)) {
|
||||
|
||||
/* Warn if we found a 64-bit constant in a 32-bit table */
|
||||
|
||||
ACPI_WARNING((AE_INFO,
|
||||
"Truncated 64-bit constant found in 32-bit table: %8.8X%8.8X => %8.8X",
|
||||
ACPI_FORMAT_UINT64(op->common.
|
||||
value.integer),
|
||||
(u32)obj_desc->integer.value));
|
||||
}
|
||||
#endif
|
||||
break;
|
||||
|
||||
|
@ -486,18 +486,18 @@ acpi_ds_eval_table_region_operands(struct acpi_walk_state *walk_state,
|
||||
ACPI_FUNCTION_TRACE_PTR(ds_eval_table_region_operands, op);
|
||||
|
||||
/*
|
||||
* This is where we evaluate the signature_string and oem_iDString
|
||||
* and oem_table_iDString of the data_table_region declaration
|
||||
* This is where we evaluate the Signature string, oem_id string,
|
||||
* and oem_table_id string of the Data Table Region declaration
|
||||
*/
|
||||
node = op->common.node;
|
||||
|
||||
/* next_op points to signature_string op */
|
||||
/* next_op points to Signature string op */
|
||||
|
||||
next_op = op->common.value.arg;
|
||||
|
||||
/*
|
||||
* Evaluate/create the signature_string and oem_iDString
|
||||
* and oem_table_iDString operands
|
||||
* Evaluate/create the Signature string, oem_id string,
|
||||
* and oem_table_id string operands
|
||||
*/
|
||||
status = acpi_ds_create_operands(walk_state, next_op);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
@ -505,8 +505,8 @@ acpi_ds_eval_table_region_operands(struct acpi_walk_state *walk_state,
|
||||
}
|
||||
|
||||
/*
|
||||
* Resolve the signature_string and oem_iDString
|
||||
* and oem_table_iDString operands
|
||||
* Resolve the Signature string, oem_id string,
|
||||
* and oem_table_id string operands
|
||||
*/
|
||||
status = acpi_ex_resolve_operands(op->common.aml_opcode,
|
||||
ACPI_WALK_OPERANDS, walk_state);
|
||||
|
@ -178,7 +178,7 @@ acpi_ds_is_result_used(union acpi_parse_object * op,
|
||||
|
||||
if (!op) {
|
||||
ACPI_ERROR((AE_INFO, "Null Op"));
|
||||
return_UINT8(TRUE);
|
||||
return_VALUE(TRUE);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -210,7 +210,7 @@ acpi_ds_is_result_used(union acpi_parse_object * op,
|
||||
"At Method level, result of [%s] not used\n",
|
||||
acpi_ps_get_opcode_name(op->common.
|
||||
aml_opcode)));
|
||||
return_UINT8(FALSE);
|
||||
return_VALUE(FALSE);
|
||||
}
|
||||
|
||||
/* Get info on the parent. The root_op is AML_SCOPE */
|
||||
@ -219,7 +219,7 @@ acpi_ds_is_result_used(union acpi_parse_object * op,
|
||||
acpi_ps_get_opcode_info(op->common.parent->common.aml_opcode);
|
||||
if (parent_info->class == AML_CLASS_UNKNOWN) {
|
||||
ACPI_ERROR((AE_INFO, "Unknown parent opcode Op=%p", op));
|
||||
return_UINT8(FALSE);
|
||||
return_VALUE(FALSE);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -307,7 +307,7 @@ acpi_ds_is_result_used(union acpi_parse_object * op,
|
||||
acpi_ps_get_opcode_name(op->common.parent->common.
|
||||
aml_opcode), op));
|
||||
|
||||
return_UINT8(TRUE);
|
||||
return_VALUE(TRUE);
|
||||
|
||||
result_not_used:
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,
|
||||
@ -316,7 +316,7 @@ acpi_ds_is_result_used(union acpi_parse_object * op,
|
||||
acpi_ps_get_opcode_name(op->common.parent->common.
|
||||
aml_opcode), op));
|
||||
|
||||
return_UINT8(FALSE);
|
||||
return_VALUE(FALSE);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
|
@ -149,7 +149,7 @@ acpi_ds_get_predicate_value(struct acpi_walk_state *walk_state,
|
||||
|
||||
/* Truncate the predicate to 32-bits if necessary */
|
||||
|
||||
acpi_ex_truncate_for32bit_table(local_obj_desc);
|
||||
(void)acpi_ex_truncate_for32bit_table(local_obj_desc);
|
||||
|
||||
/*
|
||||
* Save the result of the predicate evaluation on
|
||||
@ -706,7 +706,7 @@ acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *walk_state)
|
||||
* ACPI 2.0 support for 64-bit integers: Truncate numeric
|
||||
* result value if we are executing from a 32-bit ACPI table
|
||||
*/
|
||||
acpi_ex_truncate_for32bit_table(walk_state->result_obj);
|
||||
(void)acpi_ex_truncate_for32bit_table(walk_state->result_obj);
|
||||
|
||||
/*
|
||||
* Check if we just completed the evaluation of a
|
||||
|
@ -50,7 +50,7 @@
|
||||
#include "acnamesp.h"
|
||||
|
||||
#ifdef ACPI_ASL_COMPILER
|
||||
#include <acpi/acdisasm.h>
|
||||
#include "acdisasm.h"
|
||||
#endif
|
||||
|
||||
#define _COMPONENT ACPI_DISPATCHER
|
||||
@ -178,7 +178,8 @@ acpi_ds_load1_begin_op(struct acpi_walk_state * walk_state,
|
||||
* Target of Scope() not found. Generate an External for it, and
|
||||
* insert the name into the namespace.
|
||||
*/
|
||||
acpi_dm_add_to_external_list(path, ACPI_TYPE_DEVICE, 0);
|
||||
acpi_dm_add_to_external_list(op, path, ACPI_TYPE_DEVICE,
|
||||
0);
|
||||
status =
|
||||
acpi_ns_lookup(walk_state->scope_info, path,
|
||||
object_type, ACPI_IMODE_LOAD_PASS1,
|
||||
|
@ -561,8 +561,8 @@ static void ACPI_SYSTEM_XFACE acpi_ev_asynch_execute_gpe_method(void *context)
|
||||
status = AE_NO_MEMORY;
|
||||
} else {
|
||||
/*
|
||||
* Invoke the GPE Method (_Lxx, _Exx) i.e., evaluate the _Lxx/_Exx
|
||||
* control method that corresponds to this GPE
|
||||
* Invoke the GPE Method (_Lxx, _Exx) i.e., evaluate the
|
||||
* _Lxx/_Exx control method that corresponds to this GPE
|
||||
*/
|
||||
info->prefix_node =
|
||||
local_gpe_event_info->dispatch.method_node;
|
||||
@ -707,7 +707,7 @@ acpi_ev_gpe_dispatch(struct acpi_namespace_node *gpe_device,
|
||||
if (ACPI_FAILURE(status)) {
|
||||
ACPI_EXCEPTION((AE_INFO, status,
|
||||
"Unable to clear GPE%02X", gpe_number));
|
||||
return_UINT32(ACPI_INTERRUPT_NOT_HANDLED);
|
||||
return_VALUE(ACPI_INTERRUPT_NOT_HANDLED);
|
||||
}
|
||||
}
|
||||
|
||||
@ -724,7 +724,7 @@ acpi_ev_gpe_dispatch(struct acpi_namespace_node *gpe_device,
|
||||
if (ACPI_FAILURE(status)) {
|
||||
ACPI_EXCEPTION((AE_INFO, status,
|
||||
"Unable to disable GPE%02X", gpe_number));
|
||||
return_UINT32(ACPI_INTERRUPT_NOT_HANDLED);
|
||||
return_VALUE(ACPI_INTERRUPT_NOT_HANDLED);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -765,7 +765,7 @@ acpi_ev_gpe_dispatch(struct acpi_namespace_node *gpe_device,
|
||||
gpe_event_info);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
ACPI_EXCEPTION((AE_INFO, status,
|
||||
"Unable to queue handler for GPE%2X - event disabled",
|
||||
"Unable to queue handler for GPE%02X - event disabled",
|
||||
gpe_number));
|
||||
}
|
||||
break;
|
||||
@ -784,7 +784,7 @@ acpi_ev_gpe_dispatch(struct acpi_namespace_node *gpe_device,
|
||||
break;
|
||||
}
|
||||
|
||||
return_UINT32(ACPI_INTERRUPT_HANDLED);
|
||||
return_VALUE(ACPI_INTERRUPT_HANDLED);
|
||||
}
|
||||
|
||||
#endif /* !ACPI_REDUCED_HARDWARE */
|
||||
|
@ -405,13 +405,13 @@ acpi_ev_create_gpe_block(struct acpi_namespace_node *gpe_device,
|
||||
(*return_gpe_block) = gpe_block;
|
||||
}
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_INIT,
|
||||
"GPE %02X to %02X [%4.4s] %u regs on int 0x%X\n",
|
||||
(u32) gpe_block->block_base_number,
|
||||
(u32) (gpe_block->block_base_number +
|
||||
(gpe_block->gpe_count - 1)),
|
||||
gpe_device->name.ascii, gpe_block->register_count,
|
||||
interrupt_number));
|
||||
ACPI_DEBUG_PRINT_RAW((ACPI_DB_INIT,
|
||||
" Initialized GPE %02X to %02X [%4.4s] %u regs on interrupt 0x%X\n",
|
||||
(u32)gpe_block->block_base_number,
|
||||
(u32)(gpe_block->block_base_number +
|
||||
(gpe_block->gpe_count - 1)),
|
||||
gpe_device->name.ascii, gpe_block->register_count,
|
||||
interrupt_number));
|
||||
|
||||
/* Update global count of currently available GPEs */
|
||||
|
||||
@ -496,9 +496,11 @@ acpi_ev_initialize_gpe_block(struct acpi_gpe_xrupt_info *gpe_xrupt_info,
|
||||
}
|
||||
|
||||
if (gpe_enabled_count) {
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_INIT,
|
||||
"Enabled %u GPEs in this block\n",
|
||||
gpe_enabled_count));
|
||||
ACPI_INFO((AE_INFO,
|
||||
"Enabled %u GPEs in block %02X to %02X",
|
||||
gpe_enabled_count, (u32)gpe_block->block_base_number,
|
||||
(u32)(gpe_block->block_base_number +
|
||||
(gpe_block->gpe_count - 1))));
|
||||
}
|
||||
|
||||
gpe_block->initialized = TRUE;
|
||||
|
@ -86,6 +86,9 @@ acpi_status acpi_ev_gpe_initialize(void)
|
||||
|
||||
ACPI_FUNCTION_TRACE(ev_gpe_initialize);
|
||||
|
||||
ACPI_DEBUG_PRINT_RAW((ACPI_DB_INIT,
|
||||
"Initializing General Purpose Events (GPEs):\n"));
|
||||
|
||||
status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
|
529
drivers/acpi/acpica/evhandler.c
Normal file
529
drivers/acpi/acpica/evhandler.c
Normal file
@ -0,0 +1,529 @@
|
||||
/******************************************************************************
|
||||
*
|
||||
* Module Name: evhandler - Support for Address Space handlers
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2000 - 2012, Intel Corp.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions, and the following disclaimer,
|
||||
* without modification.
|
||||
* 2. Redistributions in binary form must reproduce at minimum a disclaimer
|
||||
* substantially similar to the "NO WARRANTY" disclaimer below
|
||||
* ("Disclaimer") and any redistribution must be conditioned upon
|
||||
* including a substantially similar Disclaimer requirement for further
|
||||
* binary redistribution.
|
||||
* 3. Neither the names of the above-listed copyright holders nor the names
|
||||
* of any contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* Alternatively, this software may be distributed under the terms of the
|
||||
* GNU General Public License ("GPL") version 2 as published by the Free
|
||||
* Software Foundation.
|
||||
*
|
||||
* NO WARRANTY
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGES.
|
||||
*/
|
||||
|
||||
#include <acpi/acpi.h>
|
||||
#include "accommon.h"
|
||||
#include "acevents.h"
|
||||
#include "acnamesp.h"
|
||||
#include "acinterp.h"
|
||||
|
||||
#define _COMPONENT ACPI_EVENTS
|
||||
ACPI_MODULE_NAME("evhandler")
|
||||
|
||||
/* Local prototypes */
|
||||
static acpi_status
|
||||
acpi_ev_install_handler(acpi_handle obj_handle,
|
||||
u32 level, void *context, void **return_value);
|
||||
|
||||
/* These are the address spaces that will get default handlers */
|
||||
|
||||
u8 acpi_gbl_default_address_spaces[ACPI_NUM_DEFAULT_SPACES] = {
|
||||
ACPI_ADR_SPACE_SYSTEM_MEMORY,
|
||||
ACPI_ADR_SPACE_SYSTEM_IO,
|
||||
ACPI_ADR_SPACE_PCI_CONFIG,
|
||||
ACPI_ADR_SPACE_DATA_TABLE
|
||||
};
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ev_install_region_handlers
|
||||
*
|
||||
* PARAMETERS: None
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Installs the core subsystem default address space handlers.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status acpi_ev_install_region_handlers(void)
|
||||
{
|
||||
acpi_status status;
|
||||
u32 i;
|
||||
|
||||
ACPI_FUNCTION_TRACE(ev_install_region_handlers);
|
||||
|
||||
status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
/*
|
||||
* All address spaces (PCI Config, EC, SMBus) are scope dependent and
|
||||
* registration must occur for a specific device.
|
||||
*
|
||||
* In the case of the system memory and IO address spaces there is
|
||||
* currently no device associated with the address space. For these we
|
||||
* use the root.
|
||||
*
|
||||
* We install the default PCI config space handler at the root so that
|
||||
* this space is immediately available even though the we have not
|
||||
* enumerated all the PCI Root Buses yet. This is to conform to the ACPI
|
||||
* specification which states that the PCI config space must be always
|
||||
* available -- even though we are nowhere near ready to find the PCI root
|
||||
* buses at this point.
|
||||
*
|
||||
* NOTE: We ignore AE_ALREADY_EXISTS because this means that a handler
|
||||
* has already been installed (via acpi_install_address_space_handler).
|
||||
* Similar for AE_SAME_HANDLER.
|
||||
*/
|
||||
for (i = 0; i < ACPI_NUM_DEFAULT_SPACES; i++) {
|
||||
status = acpi_ev_install_space_handler(acpi_gbl_root_node,
|
||||
acpi_gbl_default_address_spaces
|
||||
[i],
|
||||
ACPI_DEFAULT_HANDLER,
|
||||
NULL, NULL);
|
||||
switch (status) {
|
||||
case AE_OK:
|
||||
case AE_SAME_HANDLER:
|
||||
case AE_ALREADY_EXISTS:
|
||||
|
||||
/* These exceptions are all OK */
|
||||
|
||||
status = AE_OK;
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
goto unlock_and_exit;
|
||||
}
|
||||
}
|
||||
|
||||
unlock_and_exit:
|
||||
(void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ev_has_default_handler
|
||||
*
|
||||
* PARAMETERS: node - Namespace node for the device
|
||||
* space_id - The address space ID
|
||||
*
|
||||
* RETURN: TRUE if default handler is installed, FALSE otherwise
|
||||
*
|
||||
* DESCRIPTION: Check if the default handler is installed for the requested
|
||||
* space ID.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
u8
|
||||
acpi_ev_has_default_handler(struct acpi_namespace_node *node,
|
||||
acpi_adr_space_type space_id)
|
||||
{
|
||||
union acpi_operand_object *obj_desc;
|
||||
union acpi_operand_object *handler_obj;
|
||||
|
||||
/* Must have an existing internal object */
|
||||
|
||||
obj_desc = acpi_ns_get_attached_object(node);
|
||||
if (obj_desc) {
|
||||
handler_obj = obj_desc->device.handler;
|
||||
|
||||
/* Walk the linked list of handlers for this object */
|
||||
|
||||
while (handler_obj) {
|
||||
if (handler_obj->address_space.space_id == space_id) {
|
||||
if (handler_obj->address_space.handler_flags &
|
||||
ACPI_ADDR_HANDLER_DEFAULT_INSTALLED) {
|
||||
return (TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
handler_obj = handler_obj->address_space.next;
|
||||
}
|
||||
}
|
||||
|
||||
return (FALSE);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ev_install_handler
|
||||
*
|
||||
* PARAMETERS: walk_namespace callback
|
||||
*
|
||||
* DESCRIPTION: This routine installs an address handler into objects that are
|
||||
* of type Region or Device.
|
||||
*
|
||||
* If the Object is a Device, and the device has a handler of
|
||||
* the same type then the search is terminated in that branch.
|
||||
*
|
||||
* This is because the existing handler is closer in proximity
|
||||
* to any more regions than the one we are trying to install.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
static acpi_status
|
||||
acpi_ev_install_handler(acpi_handle obj_handle,
|
||||
u32 level, void *context, void **return_value)
|
||||
{
|
||||
union acpi_operand_object *handler_obj;
|
||||
union acpi_operand_object *next_handler_obj;
|
||||
union acpi_operand_object *obj_desc;
|
||||
struct acpi_namespace_node *node;
|
||||
acpi_status status;
|
||||
|
||||
ACPI_FUNCTION_NAME(ev_install_handler);
|
||||
|
||||
handler_obj = (union acpi_operand_object *)context;
|
||||
|
||||
/* Parameter validation */
|
||||
|
||||
if (!handler_obj) {
|
||||
return (AE_OK);
|
||||
}
|
||||
|
||||
/* Convert and validate the device handle */
|
||||
|
||||
node = acpi_ns_validate_handle(obj_handle);
|
||||
if (!node) {
|
||||
return (AE_BAD_PARAMETER);
|
||||
}
|
||||
|
||||
/*
|
||||
* We only care about regions and objects that are allowed to have
|
||||
* address space handlers
|
||||
*/
|
||||
if ((node->type != ACPI_TYPE_DEVICE) &&
|
||||
(node->type != ACPI_TYPE_REGION) && (node != acpi_gbl_root_node)) {
|
||||
return (AE_OK);
|
||||
}
|
||||
|
||||
/* Check for an existing internal object */
|
||||
|
||||
obj_desc = acpi_ns_get_attached_object(node);
|
||||
if (!obj_desc) {
|
||||
|
||||
/* No object, just exit */
|
||||
|
||||
return (AE_OK);
|
||||
}
|
||||
|
||||
/* Devices are handled different than regions */
|
||||
|
||||
if (obj_desc->common.type == ACPI_TYPE_DEVICE) {
|
||||
|
||||
/* Check if this Device already has a handler for this address space */
|
||||
|
||||
next_handler_obj = obj_desc->device.handler;
|
||||
while (next_handler_obj) {
|
||||
|
||||
/* Found a handler, is it for the same address space? */
|
||||
|
||||
if (next_handler_obj->address_space.space_id ==
|
||||
handler_obj->address_space.space_id) {
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_OPREGION,
|
||||
"Found handler for region [%s] in device %p(%p) "
|
||||
"handler %p\n",
|
||||
acpi_ut_get_region_name
|
||||
(handler_obj->address_space.
|
||||
space_id), obj_desc,
|
||||
next_handler_obj,
|
||||
handler_obj));
|
||||
|
||||
/*
|
||||
* Since the object we found it on was a device, then it
|
||||
* means that someone has already installed a handler for
|
||||
* the branch of the namespace from this device on. Just
|
||||
* bail out telling the walk routine to not traverse this
|
||||
* branch. This preserves the scoping rule for handlers.
|
||||
*/
|
||||
return (AE_CTRL_DEPTH);
|
||||
}
|
||||
|
||||
/* Walk the linked list of handlers attached to this device */
|
||||
|
||||
next_handler_obj = next_handler_obj->address_space.next;
|
||||
}
|
||||
|
||||
/*
|
||||
* As long as the device didn't have a handler for this space we
|
||||
* don't care about it. We just ignore it and proceed.
|
||||
*/
|
||||
return (AE_OK);
|
||||
}
|
||||
|
||||
/* Object is a Region */
|
||||
|
||||
if (obj_desc->region.space_id != handler_obj->address_space.space_id) {
|
||||
|
||||
/* This region is for a different address space, just ignore it */
|
||||
|
||||
return (AE_OK);
|
||||
}
|
||||
|
||||
/*
|
||||
* Now we have a region and it is for the handler's address space type.
|
||||
*
|
||||
* First disconnect region for any previous handler (if any)
|
||||
*/
|
||||
acpi_ev_detach_region(obj_desc, FALSE);
|
||||
|
||||
/* Connect the region to the new handler */
|
||||
|
||||
status = acpi_ev_attach_region(handler_obj, obj_desc, FALSE);
|
||||
return (status);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ev_install_space_handler
|
||||
*
|
||||
* PARAMETERS: node - Namespace node for the device
|
||||
* space_id - The address space ID
|
||||
* handler - Address of the handler
|
||||
* setup - Address of the setup function
|
||||
* context - Value passed to the handler on each access
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Install a handler for all op_regions of a given space_id.
|
||||
* Assumes namespace is locked
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status
|
||||
acpi_ev_install_space_handler(struct acpi_namespace_node * node,
|
||||
acpi_adr_space_type space_id,
|
||||
acpi_adr_space_handler handler,
|
||||
acpi_adr_space_setup setup, void *context)
|
||||
{
|
||||
union acpi_operand_object *obj_desc;
|
||||
union acpi_operand_object *handler_obj;
|
||||
acpi_status status;
|
||||
acpi_object_type type;
|
||||
u8 flags = 0;
|
||||
|
||||
ACPI_FUNCTION_TRACE(ev_install_space_handler);
|
||||
|
||||
/*
|
||||
* This registration is valid for only the types below and the root. This
|
||||
* is where the default handlers get placed.
|
||||
*/
|
||||
if ((node->type != ACPI_TYPE_DEVICE) &&
|
||||
(node->type != ACPI_TYPE_PROCESSOR) &&
|
||||
(node->type != ACPI_TYPE_THERMAL) && (node != acpi_gbl_root_node)) {
|
||||
status = AE_BAD_PARAMETER;
|
||||
goto unlock_and_exit;
|
||||
}
|
||||
|
||||
if (handler == ACPI_DEFAULT_HANDLER) {
|
||||
flags = ACPI_ADDR_HANDLER_DEFAULT_INSTALLED;
|
||||
|
||||
switch (space_id) {
|
||||
case ACPI_ADR_SPACE_SYSTEM_MEMORY:
|
||||
handler = acpi_ex_system_memory_space_handler;
|
||||
setup = acpi_ev_system_memory_region_setup;
|
||||
break;
|
||||
|
||||
case ACPI_ADR_SPACE_SYSTEM_IO:
|
||||
handler = acpi_ex_system_io_space_handler;
|
||||
setup = acpi_ev_io_space_region_setup;
|
||||
break;
|
||||
|
||||
case ACPI_ADR_SPACE_PCI_CONFIG:
|
||||
handler = acpi_ex_pci_config_space_handler;
|
||||
setup = acpi_ev_pci_config_region_setup;
|
||||
break;
|
||||
|
||||
case ACPI_ADR_SPACE_CMOS:
|
||||
handler = acpi_ex_cmos_space_handler;
|
||||
setup = acpi_ev_cmos_region_setup;
|
||||
break;
|
||||
|
||||
case ACPI_ADR_SPACE_PCI_BAR_TARGET:
|
||||
handler = acpi_ex_pci_bar_space_handler;
|
||||
setup = acpi_ev_pci_bar_region_setup;
|
||||
break;
|
||||
|
||||
case ACPI_ADR_SPACE_DATA_TABLE:
|
||||
handler = acpi_ex_data_table_space_handler;
|
||||
setup = NULL;
|
||||
break;
|
||||
|
||||
default:
|
||||
status = AE_BAD_PARAMETER;
|
||||
goto unlock_and_exit;
|
||||
}
|
||||
}
|
||||
|
||||
/* If the caller hasn't specified a setup routine, use the default */
|
||||
|
||||
if (!setup) {
|
||||
setup = acpi_ev_default_region_setup;
|
||||
}
|
||||
|
||||
/* Check for an existing internal object */
|
||||
|
||||
obj_desc = acpi_ns_get_attached_object(node);
|
||||
if (obj_desc) {
|
||||
/*
|
||||
* The attached device object already exists. Make sure the handler
|
||||
* is not already installed.
|
||||
*/
|
||||
handler_obj = obj_desc->device.handler;
|
||||
|
||||
/* Walk the handler list for this device */
|
||||
|
||||
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) {
|
||||
/*
|
||||
* It is (relatively) OK to attempt to install the SAME
|
||||
* handler twice. This can easily happen with the
|
||||
* PCI_Config space.
|
||||
*/
|
||||
status = AE_SAME_HANDLER;
|
||||
goto unlock_and_exit;
|
||||
} else {
|
||||
/* A handler is already installed */
|
||||
|
||||
status = AE_ALREADY_EXISTS;
|
||||
}
|
||||
goto unlock_and_exit;
|
||||
}
|
||||
|
||||
/* Walk the linked list of handlers */
|
||||
|
||||
handler_obj = handler_obj->address_space.next;
|
||||
}
|
||||
} else {
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_OPREGION,
|
||||
"Creating object on Device %p while installing handler\n",
|
||||
node));
|
||||
|
||||
/* obj_desc does not exist, create one */
|
||||
|
||||
if (node->type == ACPI_TYPE_ANY) {
|
||||
type = ACPI_TYPE_DEVICE;
|
||||
} else {
|
||||
type = node->type;
|
||||
}
|
||||
|
||||
obj_desc = acpi_ut_create_internal_object(type);
|
||||
if (!obj_desc) {
|
||||
status = AE_NO_MEMORY;
|
||||
goto unlock_and_exit;
|
||||
}
|
||||
|
||||
/* Init new descriptor */
|
||||
|
||||
obj_desc->common.type = (u8)type;
|
||||
|
||||
/* Attach the new object to the Node */
|
||||
|
||||
status = acpi_ns_attach_object(node, obj_desc, type);
|
||||
|
||||
/* Remove local reference to the object */
|
||||
|
||||
acpi_ut_remove_reference(obj_desc);
|
||||
|
||||
if (ACPI_FAILURE(status)) {
|
||||
goto unlock_and_exit;
|
||||
}
|
||||
}
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_OPREGION,
|
||||
"Installing address handler for region %s(%X) on Device %4.4s %p(%p)\n",
|
||||
acpi_ut_get_region_name(space_id), space_id,
|
||||
acpi_ut_get_node_name(node), node, obj_desc));
|
||||
|
||||
/*
|
||||
* Install the handler
|
||||
*
|
||||
* At this point there is no existing handler. Just allocate the object
|
||||
* for the handler and link it into the list.
|
||||
*/
|
||||
handler_obj =
|
||||
acpi_ut_create_internal_object(ACPI_TYPE_LOCAL_ADDRESS_HANDLER);
|
||||
if (!handler_obj) {
|
||||
status = AE_NO_MEMORY;
|
||||
goto unlock_and_exit;
|
||||
}
|
||||
|
||||
/* Init handler obj */
|
||||
|
||||
handler_obj->address_space.space_id = (u8)space_id;
|
||||
handler_obj->address_space.handler_flags = flags;
|
||||
handler_obj->address_space.region_list = NULL;
|
||||
handler_obj->address_space.node = node;
|
||||
handler_obj->address_space.handler = handler;
|
||||
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.handler;
|
||||
|
||||
/*
|
||||
* The Device object is the first reference on the handler_obj.
|
||||
* Each region that uses the handler adds a reference.
|
||||
*/
|
||||
obj_desc->device.handler = handler_obj;
|
||||
|
||||
/*
|
||||
* Walk the namespace finding all of the regions this
|
||||
* handler will manage.
|
||||
*
|
||||
* Start at the device and search the branch toward
|
||||
* the leaf nodes until either the leaf is encountered or
|
||||
* a device is detected that has an address handler of the
|
||||
* same type.
|
||||
*
|
||||
* In either case, back up and search down the remainder
|
||||
* of the branch
|
||||
*/
|
||||
status = acpi_ns_walk_namespace(ACPI_TYPE_ANY, node, ACPI_UINT32_MAX,
|
||||
ACPI_NS_WALK_UNLOCK,
|
||||
acpi_ev_install_handler, NULL,
|
||||
handler_obj, NULL);
|
||||
|
||||
unlock_and_exit:
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
@ -1,6 +1,6 @@
|
||||
/******************************************************************************
|
||||
*
|
||||
* Module Name: evregion - ACPI address_space (op_region) handler dispatch
|
||||
* Module Name: evregion - Operation Region support
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
@ -50,10 +50,9 @@
|
||||
#define _COMPONENT ACPI_EVENTS
|
||||
ACPI_MODULE_NAME("evregion")
|
||||
|
||||
extern u8 acpi_gbl_default_address_spaces[];
|
||||
|
||||
/* Local prototypes */
|
||||
static u8
|
||||
acpi_ev_has_default_handler(struct acpi_namespace_node *node,
|
||||
acpi_adr_space_type space_id);
|
||||
|
||||
static void acpi_ev_orphan_ec_reg_method(void);
|
||||
|
||||
@ -61,135 +60,6 @@ static acpi_status
|
||||
acpi_ev_reg_run(acpi_handle obj_handle,
|
||||
u32 level, void *context, void **return_value);
|
||||
|
||||
static acpi_status
|
||||
acpi_ev_install_handler(acpi_handle obj_handle,
|
||||
u32 level, void *context, void **return_value);
|
||||
|
||||
/* These are the address spaces that will get default handlers */
|
||||
|
||||
#define ACPI_NUM_DEFAULT_SPACES 4
|
||||
|
||||
static u8 acpi_gbl_default_address_spaces[ACPI_NUM_DEFAULT_SPACES] = {
|
||||
ACPI_ADR_SPACE_SYSTEM_MEMORY,
|
||||
ACPI_ADR_SPACE_SYSTEM_IO,
|
||||
ACPI_ADR_SPACE_PCI_CONFIG,
|
||||
ACPI_ADR_SPACE_DATA_TABLE
|
||||
};
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ev_install_region_handlers
|
||||
*
|
||||
* PARAMETERS: None
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Installs the core subsystem default address space handlers.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status acpi_ev_install_region_handlers(void)
|
||||
{
|
||||
acpi_status status;
|
||||
u32 i;
|
||||
|
||||
ACPI_FUNCTION_TRACE(ev_install_region_handlers);
|
||||
|
||||
status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
/*
|
||||
* All address spaces (PCI Config, EC, SMBus) are scope dependent and
|
||||
* registration must occur for a specific device.
|
||||
*
|
||||
* In the case of the system memory and IO address spaces there is
|
||||
* currently no device associated with the address space. For these we
|
||||
* use the root.
|
||||
*
|
||||
* We install the default PCI config space handler at the root so that
|
||||
* this space is immediately available even though the we have not
|
||||
* enumerated all the PCI Root Buses yet. This is to conform to the ACPI
|
||||
* specification which states that the PCI config space must be always
|
||||
* available -- even though we are nowhere near ready to find the PCI root
|
||||
* buses at this point.
|
||||
*
|
||||
* NOTE: We ignore AE_ALREADY_EXISTS because this means that a handler
|
||||
* has already been installed (via acpi_install_address_space_handler).
|
||||
* Similar for AE_SAME_HANDLER.
|
||||
*/
|
||||
for (i = 0; i < ACPI_NUM_DEFAULT_SPACES; i++) {
|
||||
status = acpi_ev_install_space_handler(acpi_gbl_root_node,
|
||||
acpi_gbl_default_address_spaces
|
||||
[i],
|
||||
ACPI_DEFAULT_HANDLER,
|
||||
NULL, NULL);
|
||||
switch (status) {
|
||||
case AE_OK:
|
||||
case AE_SAME_HANDLER:
|
||||
case AE_ALREADY_EXISTS:
|
||||
|
||||
/* These exceptions are all OK */
|
||||
|
||||
status = AE_OK;
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
goto unlock_and_exit;
|
||||
}
|
||||
}
|
||||
|
||||
unlock_and_exit:
|
||||
(void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ev_has_default_handler
|
||||
*
|
||||
* PARAMETERS: node - Namespace node for the device
|
||||
* space_id - The address space ID
|
||||
*
|
||||
* RETURN: TRUE if default handler is installed, FALSE otherwise
|
||||
*
|
||||
* DESCRIPTION: Check if the default handler is installed for the requested
|
||||
* space ID.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
static u8
|
||||
acpi_ev_has_default_handler(struct acpi_namespace_node *node,
|
||||
acpi_adr_space_type space_id)
|
||||
{
|
||||
union acpi_operand_object *obj_desc;
|
||||
union acpi_operand_object *handler_obj;
|
||||
|
||||
/* Must have an existing internal object */
|
||||
|
||||
obj_desc = acpi_ns_get_attached_object(node);
|
||||
if (obj_desc) {
|
||||
handler_obj = obj_desc->device.handler;
|
||||
|
||||
/* Walk the linked list of handlers for this object */
|
||||
|
||||
while (handler_obj) {
|
||||
if (handler_obj->address_space.space_id == space_id) {
|
||||
if (handler_obj->address_space.handler_flags &
|
||||
ACPI_ADDR_HANDLER_DEFAULT_INSTALLED) {
|
||||
return (TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
handler_obj = handler_obj->address_space.next;
|
||||
}
|
||||
}
|
||||
|
||||
return (FALSE);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ev_initialize_op_regions
|
||||
@ -239,91 +109,6 @@ acpi_status acpi_ev_initialize_op_regions(void)
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ev_execute_reg_method
|
||||
*
|
||||
* PARAMETERS: region_obj - Region object
|
||||
* function - Passed to _REG: On (1) or Off (0)
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Execute _REG method for a region
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status
|
||||
acpi_ev_execute_reg_method(union acpi_operand_object *region_obj, u32 function)
|
||||
{
|
||||
struct acpi_evaluate_info *info;
|
||||
union acpi_operand_object *args[3];
|
||||
union acpi_operand_object *region_obj2;
|
||||
acpi_status status;
|
||||
|
||||
ACPI_FUNCTION_TRACE(ev_execute_reg_method);
|
||||
|
||||
region_obj2 = acpi_ns_get_secondary_object(region_obj);
|
||||
if (!region_obj2) {
|
||||
return_ACPI_STATUS(AE_NOT_EXIST);
|
||||
}
|
||||
|
||||
if (region_obj2->extra.method_REG == NULL) {
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
}
|
||||
|
||||
/* Allocate and initialize the evaluation information block */
|
||||
|
||||
info = ACPI_ALLOCATE_ZEROED(sizeof(struct acpi_evaluate_info));
|
||||
if (!info) {
|
||||
return_ACPI_STATUS(AE_NO_MEMORY);
|
||||
}
|
||||
|
||||
info->prefix_node = region_obj2->extra.method_REG;
|
||||
info->pathname = NULL;
|
||||
info->parameters = args;
|
||||
info->flags = ACPI_IGNORE_RETURN_VALUE;
|
||||
|
||||
/*
|
||||
* The _REG method has two arguments:
|
||||
*
|
||||
* arg0 - Integer:
|
||||
* Operation region space ID Same value as region_obj->Region.space_id
|
||||
*
|
||||
* arg1 - Integer:
|
||||
* connection status 1 for connecting the handler, 0 for disconnecting
|
||||
* the handler (Passed as a parameter)
|
||||
*/
|
||||
args[0] =
|
||||
acpi_ut_create_integer_object((u64) region_obj->region.space_id);
|
||||
if (!args[0]) {
|
||||
status = AE_NO_MEMORY;
|
||||
goto cleanup1;
|
||||
}
|
||||
|
||||
args[1] = acpi_ut_create_integer_object((u64) function);
|
||||
if (!args[1]) {
|
||||
status = AE_NO_MEMORY;
|
||||
goto cleanup2;
|
||||
}
|
||||
|
||||
args[2] = NULL; /* Terminate list */
|
||||
|
||||
/* Execute the method, no return value */
|
||||
|
||||
ACPI_DEBUG_EXEC(acpi_ut_display_init_pathname
|
||||
(ACPI_TYPE_METHOD, info->prefix_node, NULL));
|
||||
|
||||
status = acpi_ns_evaluate(info);
|
||||
acpi_ut_remove_reference(args[1]);
|
||||
|
||||
cleanup2:
|
||||
acpi_ut_remove_reference(args[0]);
|
||||
|
||||
cleanup1:
|
||||
ACPI_FREE(info);
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ev_address_space_dispatch
|
||||
@ -709,351 +494,86 @@ acpi_ev_attach_region(union acpi_operand_object *handler_obj,
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ev_install_handler
|
||||
* FUNCTION: acpi_ev_execute_reg_method
|
||||
*
|
||||
* PARAMETERS: walk_namespace callback
|
||||
*
|
||||
* DESCRIPTION: This routine installs an address handler into objects that are
|
||||
* of type Region or Device.
|
||||
*
|
||||
* If the Object is a Device, and the device has a handler of
|
||||
* the same type then the search is terminated in that branch.
|
||||
*
|
||||
* This is because the existing handler is closer in proximity
|
||||
* to any more regions than the one we are trying to install.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
static acpi_status
|
||||
acpi_ev_install_handler(acpi_handle obj_handle,
|
||||
u32 level, void *context, void **return_value)
|
||||
{
|
||||
union acpi_operand_object *handler_obj;
|
||||
union acpi_operand_object *next_handler_obj;
|
||||
union acpi_operand_object *obj_desc;
|
||||
struct acpi_namespace_node *node;
|
||||
acpi_status status;
|
||||
|
||||
ACPI_FUNCTION_NAME(ev_install_handler);
|
||||
|
||||
handler_obj = (union acpi_operand_object *)context;
|
||||
|
||||
/* Parameter validation */
|
||||
|
||||
if (!handler_obj) {
|
||||
return (AE_OK);
|
||||
}
|
||||
|
||||
/* Convert and validate the device handle */
|
||||
|
||||
node = acpi_ns_validate_handle(obj_handle);
|
||||
if (!node) {
|
||||
return (AE_BAD_PARAMETER);
|
||||
}
|
||||
|
||||
/*
|
||||
* We only care about regions and objects that are allowed to have
|
||||
* address space handlers
|
||||
*/
|
||||
if ((node->type != ACPI_TYPE_DEVICE) &&
|
||||
(node->type != ACPI_TYPE_REGION) && (node != acpi_gbl_root_node)) {
|
||||
return (AE_OK);
|
||||
}
|
||||
|
||||
/* Check for an existing internal object */
|
||||
|
||||
obj_desc = acpi_ns_get_attached_object(node);
|
||||
if (!obj_desc) {
|
||||
|
||||
/* No object, just exit */
|
||||
|
||||
return (AE_OK);
|
||||
}
|
||||
|
||||
/* Devices are handled different than regions */
|
||||
|
||||
if (obj_desc->common.type == ACPI_TYPE_DEVICE) {
|
||||
|
||||
/* Check if this Device already has a handler for this address space */
|
||||
|
||||
next_handler_obj = obj_desc->device.handler;
|
||||
while (next_handler_obj) {
|
||||
|
||||
/* Found a handler, is it for the same address space? */
|
||||
|
||||
if (next_handler_obj->address_space.space_id ==
|
||||
handler_obj->address_space.space_id) {
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_OPREGION,
|
||||
"Found handler for region [%s] in device %p(%p) "
|
||||
"handler %p\n",
|
||||
acpi_ut_get_region_name
|
||||
(handler_obj->address_space.
|
||||
space_id), obj_desc,
|
||||
next_handler_obj,
|
||||
handler_obj));
|
||||
|
||||
/*
|
||||
* Since the object we found it on was a device, then it
|
||||
* means that someone has already installed a handler for
|
||||
* the branch of the namespace from this device on. Just
|
||||
* bail out telling the walk routine to not traverse this
|
||||
* branch. This preserves the scoping rule for handlers.
|
||||
*/
|
||||
return (AE_CTRL_DEPTH);
|
||||
}
|
||||
|
||||
/* Walk the linked list of handlers attached to this device */
|
||||
|
||||
next_handler_obj = next_handler_obj->address_space.next;
|
||||
}
|
||||
|
||||
/*
|
||||
* As long as the device didn't have a handler for this space we
|
||||
* don't care about it. We just ignore it and proceed.
|
||||
*/
|
||||
return (AE_OK);
|
||||
}
|
||||
|
||||
/* Object is a Region */
|
||||
|
||||
if (obj_desc->region.space_id != handler_obj->address_space.space_id) {
|
||||
|
||||
/* This region is for a different address space, just ignore it */
|
||||
|
||||
return (AE_OK);
|
||||
}
|
||||
|
||||
/*
|
||||
* Now we have a region and it is for the handler's address space type.
|
||||
*
|
||||
* First disconnect region for any previous handler (if any)
|
||||
*/
|
||||
acpi_ev_detach_region(obj_desc, FALSE);
|
||||
|
||||
/* Connect the region to the new handler */
|
||||
|
||||
status = acpi_ev_attach_region(handler_obj, obj_desc, FALSE);
|
||||
return (status);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ev_install_space_handler
|
||||
*
|
||||
* PARAMETERS: node - Namespace node for the device
|
||||
* space_id - The address space ID
|
||||
* handler - Address of the handler
|
||||
* setup - Address of the setup function
|
||||
* context - Value passed to the handler on each access
|
||||
* PARAMETERS: region_obj - Region object
|
||||
* function - Passed to _REG: On (1) or Off (0)
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Install a handler for all op_regions of a given space_id.
|
||||
* Assumes namespace is locked
|
||||
* DESCRIPTION: Execute _REG method for a region
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status
|
||||
acpi_ev_install_space_handler(struct acpi_namespace_node * node,
|
||||
acpi_adr_space_type space_id,
|
||||
acpi_adr_space_handler handler,
|
||||
acpi_adr_space_setup setup, void *context)
|
||||
acpi_ev_execute_reg_method(union acpi_operand_object *region_obj, u32 function)
|
||||
{
|
||||
union acpi_operand_object *obj_desc;
|
||||
union acpi_operand_object *handler_obj;
|
||||
struct acpi_evaluate_info *info;
|
||||
union acpi_operand_object *args[3];
|
||||
union acpi_operand_object *region_obj2;
|
||||
acpi_status status;
|
||||
acpi_object_type type;
|
||||
u8 flags = 0;
|
||||
|
||||
ACPI_FUNCTION_TRACE(ev_install_space_handler);
|
||||
ACPI_FUNCTION_TRACE(ev_execute_reg_method);
|
||||
|
||||
region_obj2 = acpi_ns_get_secondary_object(region_obj);
|
||||
if (!region_obj2) {
|
||||
return_ACPI_STATUS(AE_NOT_EXIST);
|
||||
}
|
||||
|
||||
if (region_obj2->extra.method_REG == NULL) {
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
}
|
||||
|
||||
/* Allocate and initialize the evaluation information block */
|
||||
|
||||
info = ACPI_ALLOCATE_ZEROED(sizeof(struct acpi_evaluate_info));
|
||||
if (!info) {
|
||||
return_ACPI_STATUS(AE_NO_MEMORY);
|
||||
}
|
||||
|
||||
info->prefix_node = region_obj2->extra.method_REG;
|
||||
info->pathname = NULL;
|
||||
info->parameters = args;
|
||||
info->flags = ACPI_IGNORE_RETURN_VALUE;
|
||||
|
||||
/*
|
||||
* This registration is valid for only the types below and the root. This
|
||||
* is where the default handlers get placed.
|
||||
*/
|
||||
if ((node->type != ACPI_TYPE_DEVICE) &&
|
||||
(node->type != ACPI_TYPE_PROCESSOR) &&
|
||||
(node->type != ACPI_TYPE_THERMAL) && (node != acpi_gbl_root_node)) {
|
||||
status = AE_BAD_PARAMETER;
|
||||
goto unlock_and_exit;
|
||||
}
|
||||
|
||||
if (handler == ACPI_DEFAULT_HANDLER) {
|
||||
flags = ACPI_ADDR_HANDLER_DEFAULT_INSTALLED;
|
||||
|
||||
switch (space_id) {
|
||||
case ACPI_ADR_SPACE_SYSTEM_MEMORY:
|
||||
handler = acpi_ex_system_memory_space_handler;
|
||||
setup = acpi_ev_system_memory_region_setup;
|
||||
break;
|
||||
|
||||
case ACPI_ADR_SPACE_SYSTEM_IO:
|
||||
handler = acpi_ex_system_io_space_handler;
|
||||
setup = acpi_ev_io_space_region_setup;
|
||||
break;
|
||||
|
||||
case ACPI_ADR_SPACE_PCI_CONFIG:
|
||||
handler = acpi_ex_pci_config_space_handler;
|
||||
setup = acpi_ev_pci_config_region_setup;
|
||||
break;
|
||||
|
||||
case ACPI_ADR_SPACE_CMOS:
|
||||
handler = acpi_ex_cmos_space_handler;
|
||||
setup = acpi_ev_cmos_region_setup;
|
||||
break;
|
||||
|
||||
case ACPI_ADR_SPACE_PCI_BAR_TARGET:
|
||||
handler = acpi_ex_pci_bar_space_handler;
|
||||
setup = acpi_ev_pci_bar_region_setup;
|
||||
break;
|
||||
|
||||
case ACPI_ADR_SPACE_DATA_TABLE:
|
||||
handler = acpi_ex_data_table_space_handler;
|
||||
setup = NULL;
|
||||
break;
|
||||
|
||||
default:
|
||||
status = AE_BAD_PARAMETER;
|
||||
goto unlock_and_exit;
|
||||
}
|
||||
}
|
||||
|
||||
/* If the caller hasn't specified a setup routine, use the default */
|
||||
|
||||
if (!setup) {
|
||||
setup = acpi_ev_default_region_setup;
|
||||
}
|
||||
|
||||
/* Check for an existing internal object */
|
||||
|
||||
obj_desc = acpi_ns_get_attached_object(node);
|
||||
if (obj_desc) {
|
||||
/*
|
||||
* The attached device object already exists. Make sure the handler
|
||||
* is not already installed.
|
||||
*/
|
||||
handler_obj = obj_desc->device.handler;
|
||||
|
||||
/* Walk the handler list for this device */
|
||||
|
||||
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) {
|
||||
/*
|
||||
* It is (relatively) OK to attempt to install the SAME
|
||||
* handler twice. This can easily happen with the
|
||||
* PCI_Config space.
|
||||
*/
|
||||
status = AE_SAME_HANDLER;
|
||||
goto unlock_and_exit;
|
||||
} else {
|
||||
/* A handler is already installed */
|
||||
|
||||
status = AE_ALREADY_EXISTS;
|
||||
}
|
||||
goto unlock_and_exit;
|
||||
}
|
||||
|
||||
/* Walk the linked list of handlers */
|
||||
|
||||
handler_obj = handler_obj->address_space.next;
|
||||
}
|
||||
} else {
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_OPREGION,
|
||||
"Creating object on Device %p while installing handler\n",
|
||||
node));
|
||||
|
||||
/* obj_desc does not exist, create one */
|
||||
|
||||
if (node->type == ACPI_TYPE_ANY) {
|
||||
type = ACPI_TYPE_DEVICE;
|
||||
} else {
|
||||
type = node->type;
|
||||
}
|
||||
|
||||
obj_desc = acpi_ut_create_internal_object(type);
|
||||
if (!obj_desc) {
|
||||
status = AE_NO_MEMORY;
|
||||
goto unlock_and_exit;
|
||||
}
|
||||
|
||||
/* Init new descriptor */
|
||||
|
||||
obj_desc->common.type = (u8) type;
|
||||
|
||||
/* Attach the new object to the Node */
|
||||
|
||||
status = acpi_ns_attach_object(node, obj_desc, type);
|
||||
|
||||
/* Remove local reference to the object */
|
||||
|
||||
acpi_ut_remove_reference(obj_desc);
|
||||
|
||||
if (ACPI_FAILURE(status)) {
|
||||
goto unlock_and_exit;
|
||||
}
|
||||
}
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_OPREGION,
|
||||
"Installing address handler for region %s(%X) on Device %4.4s %p(%p)\n",
|
||||
acpi_ut_get_region_name(space_id), space_id,
|
||||
acpi_ut_get_node_name(node), node, obj_desc));
|
||||
|
||||
/*
|
||||
* Install the handler
|
||||
* The _REG method has two arguments:
|
||||
*
|
||||
* At this point there is no existing handler. Just allocate the object
|
||||
* for the handler and link it into the list.
|
||||
* arg0 - Integer:
|
||||
* Operation region space ID Same value as region_obj->Region.space_id
|
||||
*
|
||||
* arg1 - Integer:
|
||||
* connection status 1 for connecting the handler, 0 for disconnecting
|
||||
* the handler (Passed as a parameter)
|
||||
*/
|
||||
handler_obj =
|
||||
acpi_ut_create_internal_object(ACPI_TYPE_LOCAL_ADDRESS_HANDLER);
|
||||
if (!handler_obj) {
|
||||
args[0] =
|
||||
acpi_ut_create_integer_object((u64)region_obj->region.space_id);
|
||||
if (!args[0]) {
|
||||
status = AE_NO_MEMORY;
|
||||
goto unlock_and_exit;
|
||||
goto cleanup1;
|
||||
}
|
||||
|
||||
/* Init handler obj */
|
||||
args[1] = acpi_ut_create_integer_object((u64)function);
|
||||
if (!args[1]) {
|
||||
status = AE_NO_MEMORY;
|
||||
goto cleanup2;
|
||||
}
|
||||
|
||||
handler_obj->address_space.space_id = (u8) space_id;
|
||||
handler_obj->address_space.handler_flags = flags;
|
||||
handler_obj->address_space.region_list = NULL;
|
||||
handler_obj->address_space.node = node;
|
||||
handler_obj->address_space.handler = handler;
|
||||
handler_obj->address_space.context = context;
|
||||
handler_obj->address_space.setup = setup;
|
||||
args[2] = NULL; /* Terminate list */
|
||||
|
||||
/* Install at head of Device.address_space list */
|
||||
/* Execute the method, no return value */
|
||||
|
||||
handler_obj->address_space.next = obj_desc->device.handler;
|
||||
ACPI_DEBUG_EXEC(acpi_ut_display_init_pathname
|
||||
(ACPI_TYPE_METHOD, info->prefix_node, NULL));
|
||||
|
||||
/*
|
||||
* The Device object is the first reference on the handler_obj.
|
||||
* Each region that uses the handler adds a reference.
|
||||
*/
|
||||
obj_desc->device.handler = handler_obj;
|
||||
status = acpi_ns_evaluate(info);
|
||||
acpi_ut_remove_reference(args[1]);
|
||||
|
||||
/*
|
||||
* Walk the namespace finding all of the regions this
|
||||
* handler will manage.
|
||||
*
|
||||
* Start at the device and search the branch toward
|
||||
* the leaf nodes until either the leaf is encountered or
|
||||
* a device is detected that has an address handler of the
|
||||
* same type.
|
||||
*
|
||||
* In either case, back up and search down the remainder
|
||||
* of the branch
|
||||
*/
|
||||
status = acpi_ns_walk_namespace(ACPI_TYPE_ANY, node, ACPI_UINT32_MAX,
|
||||
ACPI_NS_WALK_UNLOCK,
|
||||
acpi_ev_install_handler, NULL,
|
||||
handler_obj, NULL);
|
||||
cleanup2:
|
||||
acpi_ut_remove_reference(args[0]);
|
||||
|
||||
unlock_and_exit:
|
||||
cleanup1:
|
||||
ACPI_FREE(info);
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
|
@ -89,7 +89,7 @@ static u32 ACPI_SYSTEM_XFACE acpi_ev_sci_xrupt_handler(void *context)
|
||||
*/
|
||||
interrupt_handled |= acpi_ev_gpe_detect(gpe_xrupt_list);
|
||||
|
||||
return_UINT32(interrupt_handled);
|
||||
return_VALUE(interrupt_handled);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
@ -120,7 +120,7 @@ u32 ACPI_SYSTEM_XFACE acpi_ev_gpe_xrupt_handler(void *context)
|
||||
|
||||
interrupt_handled |= acpi_ev_gpe_detect(gpe_xrupt_list);
|
||||
|
||||
return_UINT32(interrupt_handled);
|
||||
return_VALUE(interrupt_handled);
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
|
@ -56,13 +56,13 @@ ACPI_MODULE_NAME("evxface")
|
||||
*
|
||||
* FUNCTION: acpi_install_notify_handler
|
||||
*
|
||||
* PARAMETERS: Device - The device for which notifies will be handled
|
||||
* PARAMETERS: device - The device for which notifies will be handled
|
||||
* handler_type - The type of handler:
|
||||
* ACPI_SYSTEM_NOTIFY: System Handler (00-7F)
|
||||
* ACPI_DEVICE_NOTIFY: Device Handler (80-FF)
|
||||
* ACPI_ALL_NOTIFY: Both System and Device
|
||||
* Handler - Address of the handler
|
||||
* Context - Value passed to the handler on each GPE
|
||||
* handler - Address of the handler
|
||||
* context - Value passed to the handler on each GPE
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
@ -217,12 +217,12 @@ ACPI_EXPORT_SYMBOL(acpi_install_notify_handler)
|
||||
*
|
||||
* FUNCTION: acpi_remove_notify_handler
|
||||
*
|
||||
* PARAMETERS: Device - The device for which the handler is installed
|
||||
* PARAMETERS: device - The device for which the handler is installed
|
||||
* handler_type - The type of handler:
|
||||
* ACPI_SYSTEM_NOTIFY: System Handler (00-7F)
|
||||
* ACPI_DEVICE_NOTIFY: Device Handler (80-FF)
|
||||
* ACPI_ALL_NOTIFY: Both System and Device
|
||||
* Handler - Address of the handler
|
||||
* handler - Address of the handler
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
@ -249,7 +249,8 @@ acpi_remove_notify_handler(acpi_handle device,
|
||||
(handler_type > ACPI_MAX_NOTIFY_HANDLER_TYPE)) {
|
||||
return_ACPI_STATUS(AE_BAD_PARAMETER);
|
||||
}
|
||||
/* Make sure all deferred tasks are completed */
|
||||
|
||||
/* Make sure all deferred notify tasks are completed */
|
||||
|
||||
acpi_os_wait_events_complete();
|
||||
|
||||
@ -596,7 +597,7 @@ acpi_install_gpe_handler(acpi_handle gpe_device,
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
/* Allocate memory for the handler object */
|
||||
/* Allocate and init handler object (before lock) */
|
||||
|
||||
handler = ACPI_ALLOCATE_ZEROED(sizeof(struct acpi_gpe_handler_info));
|
||||
if (!handler) {
|
||||
@ -622,16 +623,15 @@ acpi_install_gpe_handler(acpi_handle gpe_device,
|
||||
goto free_and_exit;
|
||||
}
|
||||
|
||||
/* Allocate and init handler object */
|
||||
|
||||
handler->address = address;
|
||||
handler->context = context;
|
||||
handler->method_node = gpe_event_info->dispatch.method_node;
|
||||
handler->original_flags = gpe_event_info->flags &
|
||||
(ACPI_GPE_XRUPT_TYPE_MASK | ACPI_GPE_DISPATCH_MASK);
|
||||
handler->original_flags = (u8)(gpe_event_info->flags &
|
||||
(ACPI_GPE_XRUPT_TYPE_MASK |
|
||||
ACPI_GPE_DISPATCH_MASK));
|
||||
|
||||
/*
|
||||
* If the GPE is associated with a method, it might have been enabled
|
||||
* If the GPE is associated with a method, it may have been enabled
|
||||
* automatically during initialization, in which case it has to be
|
||||
* disabled now to avoid spurious execution of the handler.
|
||||
*/
|
||||
@ -646,7 +646,7 @@ acpi_install_gpe_handler(acpi_handle gpe_device,
|
||||
|
||||
gpe_event_info->dispatch.handler = handler;
|
||||
|
||||
/* Setup up dispatch flags to indicate handler (vs. method) */
|
||||
/* Setup up dispatch flags to indicate handler (vs. method/notify) */
|
||||
|
||||
gpe_event_info->flags &=
|
||||
~(ACPI_GPE_XRUPT_TYPE_MASK | ACPI_GPE_DISPATCH_MASK);
|
||||
@ -697,7 +697,7 @@ acpi_remove_gpe_handler(acpi_handle gpe_device,
|
||||
return_ACPI_STATUS(AE_BAD_PARAMETER);
|
||||
}
|
||||
|
||||
/* Make sure all deferred tasks are completed */
|
||||
/* Make sure all deferred GPE tasks are completed */
|
||||
|
||||
acpi_os_wait_events_complete();
|
||||
|
||||
@ -747,10 +747,10 @@ acpi_remove_gpe_handler(acpi_handle gpe_device,
|
||||
* enabled, it should be enabled at this point to restore the
|
||||
* post-initialization configuration.
|
||||
*/
|
||||
|
||||
if ((handler->original_flags & ACPI_GPE_DISPATCH_METHOD)
|
||||
&& handler->originally_enabled)
|
||||
if ((handler->original_flags & ACPI_GPE_DISPATCH_METHOD) &&
|
||||
handler->originally_enabled) {
|
||||
(void)acpi_ev_add_gpe_reference(gpe_event_info);
|
||||
}
|
||||
|
||||
/* Now we can free the handler object */
|
||||
|
||||
|
@ -61,7 +61,6 @@ ACPI_MODULE_NAME("evxfevnt")
|
||||
* DESCRIPTION: Transfers the system into ACPI mode.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status acpi_enable(void)
|
||||
{
|
||||
acpi_status status;
|
||||
@ -210,8 +209,8 @@ ACPI_EXPORT_SYMBOL(acpi_enable_event)
|
||||
*
|
||||
* FUNCTION: acpi_disable_event
|
||||
*
|
||||
* PARAMETERS: Event - The fixed eventto be enabled
|
||||
* Flags - Reserved
|
||||
* PARAMETERS: event - The fixed event to be disabled
|
||||
* flags - Reserved
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
|
@ -51,7 +51,7 @@
|
||||
ACPI_MODULE_NAME("evxfgpe")
|
||||
|
||||
#if (!ACPI_REDUCED_HARDWARE) /* Entire module */
|
||||
/******************************************************************************
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_update_all_gpes
|
||||
*
|
||||
@ -172,6 +172,7 @@ acpi_status acpi_disable_gpe(acpi_handle gpe_device, u32 gpe_number)
|
||||
acpi_os_release_lock(acpi_gbl_gpe_lock, flags);
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
ACPI_EXPORT_SYMBOL(acpi_disable_gpe)
|
||||
|
||||
|
||||
@ -225,7 +226,7 @@ acpi_setup_gpe_for_wake(acpi_handle wake_device,
|
||||
ACPI_CAST_PTR(struct acpi_namespace_node, wake_device);
|
||||
}
|
||||
|
||||
/* Validate WakeDevice is of type Device */
|
||||
/* Validate wake_device is of type Device */
|
||||
|
||||
if (device_node->type != ACPI_TYPE_DEVICE) {
|
||||
return_ACPI_STATUS (AE_BAD_PARAMETER);
|
||||
@ -432,8 +433,8 @@ ACPI_EXPORT_SYMBOL(acpi_clear_gpe)
|
||||
*
|
||||
* PARAMETERS: gpe_device - Parent GPE Device. NULL for GPE0/GPE1
|
||||
* gpe_number - GPE level within the GPE block
|
||||
* event_status - Where the current status of the event will
|
||||
* be returned
|
||||
* event_status - Where the current status of the event
|
||||
* will be returned
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
|
@ -48,6 +48,7 @@
|
||||
#include "actables.h"
|
||||
#include "acdispat.h"
|
||||
#include "acevents.h"
|
||||
#include "amlcode.h"
|
||||
|
||||
#define _COMPONENT ACPI_EXECUTER
|
||||
ACPI_MODULE_NAME("exconfig")
|
||||
@ -120,8 +121,11 @@ acpi_ex_add_table(u32 table_index,
|
||||
acpi_ns_exec_module_code_list();
|
||||
acpi_ex_enter_interpreter();
|
||||
|
||||
/* Update GPEs for any new _Lxx/_Exx methods. Ignore errors */
|
||||
|
||||
/*
|
||||
* Update GPEs for any new _Lxx/_Exx methods. Ignore errors. The host is
|
||||
* responsible for discovering any new wake GPEs by running _PRW methods
|
||||
* that may have been loaded by this table.
|
||||
*/
|
||||
status = acpi_tb_get_owner_id(table_index, &owner_id);
|
||||
if (ACPI_SUCCESS(status)) {
|
||||
acpi_ev_update_gpes(owner_id);
|
||||
@ -158,12 +162,12 @@ acpi_ex_load_table_op(struct acpi_walk_state *walk_state,
|
||||
|
||||
ACPI_FUNCTION_TRACE(ex_load_table_op);
|
||||
|
||||
/* Validate lengths for the signature_string, OEMIDString, OEMtable_iD */
|
||||
/* Validate lengths for the Signature, oem_id, and oem_table_id strings */
|
||||
|
||||
if ((operand[0]->string.length > ACPI_NAME_SIZE) ||
|
||||
(operand[1]->string.length > ACPI_OEM_ID_SIZE) ||
|
||||
(operand[2]->string.length > ACPI_OEM_TABLE_ID_SIZE)) {
|
||||
return_ACPI_STATUS(AE_BAD_PARAMETER);
|
||||
return_ACPI_STATUS(AE_AML_STRING_LIMIT);
|
||||
}
|
||||
|
||||
/* Find the ACPI table in the RSDT/XSDT */
|
||||
@ -210,8 +214,8 @@ acpi_ex_load_table_op(struct acpi_walk_state *walk_state,
|
||||
/* parameter_path (optional parameter) */
|
||||
|
||||
if (operand[4]->string.length > 0) {
|
||||
if ((operand[4]->string.pointer[0] != '\\') &&
|
||||
(operand[4]->string.pointer[0] != '^')) {
|
||||
if ((operand[4]->string.pointer[0] != AML_ROOT_PREFIX) &&
|
||||
(operand[4]->string.pointer[0] != AML_PARENT_PREFIX)) {
|
||||
/*
|
||||
* Path is not absolute, so it will be relative to the node
|
||||
* referenced by the root_path_string (or the NS root if omitted)
|
||||
@ -301,7 +305,7 @@ acpi_ex_region_read(union acpi_operand_object *obj_desc, u32 length, u8 *buffer)
|
||||
acpi_ev_address_space_dispatch(obj_desc, NULL, ACPI_READ,
|
||||
region_offset, 8, &value);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return status;
|
||||
return (status);
|
||||
}
|
||||
|
||||
*buffer = (u8)value;
|
||||
@ -309,7 +313,7 @@ acpi_ex_region_read(union acpi_operand_object *obj_desc, u32 length, u8 *buffer)
|
||||
region_offset++;
|
||||
}
|
||||
|
||||
return AE_OK;
|
||||
return (AE_OK);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
|
@ -176,7 +176,7 @@ acpi_ex_convert_to_integer(union acpi_operand_object *obj_desc,
|
||||
|
||||
/* Save the Result */
|
||||
|
||||
acpi_ex_truncate_for32bit_table(return_desc);
|
||||
(void)acpi_ex_truncate_for32bit_table(return_desc);
|
||||
*result_desc = return_desc;
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
}
|
||||
|
@ -464,9 +464,8 @@ void acpi_ex_dump_operand(union acpi_operand_object *obj_desc, u32 depth)
|
||||
|
||||
ACPI_FUNCTION_NAME(ex_dump_operand)
|
||||
|
||||
if (!
|
||||
((ACPI_LV_EXEC & acpi_dbg_level)
|
||||
&& (_COMPONENT & acpi_dbg_layer))) {
|
||||
/* Check if debug output enabled */
|
||||
if (!ACPI_IS_DEBUG_ENABLED(ACPI_LV_EXEC, _COMPONENT)) {
|
||||
return;
|
||||
}
|
||||
|
||||
@ -811,9 +810,10 @@ void acpi_ex_dump_namespace_node(struct acpi_namespace_node *node, u32 flags)
|
||||
ACPI_FUNCTION_ENTRY();
|
||||
|
||||
if (!flags) {
|
||||
if (!
|
||||
((ACPI_LV_OBJECTS & acpi_dbg_level)
|
||||
&& (_COMPONENT & acpi_dbg_layer))) {
|
||||
|
||||
/* Check if debug output enabled */
|
||||
|
||||
if (!ACPI_IS_DEBUG_ENABLED(ACPI_LV_OBJECTS, _COMPONENT)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
@ -999,9 +999,10 @@ acpi_ex_dump_object_descriptor(union acpi_operand_object *obj_desc, u32 flags)
|
||||
}
|
||||
|
||||
if (!flags) {
|
||||
if (!
|
||||
((ACPI_LV_OBJECTS & acpi_dbg_level)
|
||||
&& (_COMPONENT & acpi_dbg_layer))) {
|
||||
|
||||
/* Check if debug output enabled */
|
||||
|
||||
if (!ACPI_IS_DEBUG_ENABLED(ACPI_LV_OBJECTS, _COMPONENT)) {
|
||||
return_VOID;
|
||||
}
|
||||
}
|
||||
|
@ -329,7 +329,6 @@ acpi_ex_access_region(union acpi_operand_object *obj_desc,
|
||||
static u8
|
||||
acpi_ex_register_overflow(union acpi_operand_object *obj_desc, u64 value)
|
||||
{
|
||||
ACPI_FUNCTION_NAME(ex_register_overflow);
|
||||
|
||||
if (obj_desc->common_field.bit_length >= ACPI_INTEGER_BIT_SIZE) {
|
||||
/*
|
||||
|
@ -377,7 +377,8 @@ acpi_ex_release_mutex(union acpi_operand_object *obj_desc,
|
||||
return_ACPI_STATUS(AE_AML_MUTEX_NOT_ACQUIRED);
|
||||
}
|
||||
|
||||
/* Must have a valid thread. */
|
||||
/* Must have a valid thread ID */
|
||||
|
||||
if (!walk_state->thread) {
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"Cannot release Mutex [%4.4s], null thread info",
|
||||
|
@ -948,13 +948,7 @@ acpi_status acpi_ex_opcode_1A_0T_1R(struct acpi_walk_state *walk_state)
|
||||
*/
|
||||
return_desc =
|
||||
acpi_ut_create_integer_object((u64)
|
||||
temp_desc->
|
||||
buffer.
|
||||
pointer
|
||||
[operand
|
||||
[0]->
|
||||
reference.
|
||||
value]);
|
||||
temp_desc->buffer.pointer[operand[0]->reference.value]);
|
||||
if (!return_desc) {
|
||||
status = AE_NO_MEMORY;
|
||||
goto cleanup;
|
||||
|
@ -276,7 +276,7 @@ acpi_ex_decode_field_access(union acpi_operand_object *obj_desc,
|
||||
/* Invalid field access type */
|
||||
|
||||
ACPI_ERROR((AE_INFO, "Unknown field access type 0x%X", access));
|
||||
return_UINT32(0);
|
||||
return_VALUE(0);
|
||||
}
|
||||
|
||||
if (obj_desc->common.type == ACPI_TYPE_BUFFER_FIELD) {
|
||||
@ -289,7 +289,7 @@ acpi_ex_decode_field_access(union acpi_operand_object *obj_desc,
|
||||
}
|
||||
|
||||
*return_byte_alignment = byte_alignment;
|
||||
return_UINT32(bit_length);
|
||||
return_VALUE(bit_length);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
|
@ -142,9 +142,9 @@ acpi_ex_system_memory_space_handler(u32 function,
|
||||
}
|
||||
|
||||
/*
|
||||
* Attempt to map from the requested address to the end of the region.
|
||||
* However, we will never map more than one page, nor will we cross
|
||||
* a page boundary.
|
||||
* October 2009: Attempt to map from the requested address to the
|
||||
* end of the region. However, we will never map more than one
|
||||
* page, nor will we cross a page boundary.
|
||||
*/
|
||||
map_length = (acpi_size)
|
||||
((mem_info->address + mem_info->length) - address);
|
||||
@ -154,12 +154,15 @@ acpi_ex_system_memory_space_handler(u32 function,
|
||||
* a page boundary, just map up to the page boundary, do not cross.
|
||||
* On some systems, crossing a page boundary while mapping regions
|
||||
* can cause warnings if the pages have different attributes
|
||||
* due to resource management
|
||||
* due to resource management.
|
||||
*
|
||||
* This has the added benefit of constraining a single mapping to
|
||||
* one page, which is similar to the original code that used a 4k
|
||||
* maximum window.
|
||||
*/
|
||||
page_boundary_map_length =
|
||||
ACPI_ROUND_UP(address, ACPI_DEFAULT_PAGE_SIZE) - address;
|
||||
|
||||
if (!page_boundary_map_length) {
|
||||
if (page_boundary_map_length == 0) {
|
||||
page_boundary_map_length = ACPI_DEFAULT_PAGE_SIZE;
|
||||
}
|
||||
|
||||
@ -236,19 +239,19 @@ acpi_ex_system_memory_space_handler(u32 function,
|
||||
|
||||
switch (bit_width) {
|
||||
case 8:
|
||||
ACPI_SET8(logical_addr_ptr) = (u8) * value;
|
||||
ACPI_SET8(logical_addr_ptr, *value);
|
||||
break;
|
||||
|
||||
case 16:
|
||||
ACPI_SET16(logical_addr_ptr) = (u16) * value;
|
||||
ACPI_SET16(logical_addr_ptr, *value);
|
||||
break;
|
||||
|
||||
case 32:
|
||||
ACPI_SET32(logical_addr_ptr) = (u32) * value;
|
||||
ACPI_SET32(logical_addr_ptr, *value);
|
||||
break;
|
||||
|
||||
case 64:
|
||||
ACPI_SET64(logical_addr_ptr) = (u64) * value;
|
||||
ACPI_SET64(logical_addr_ptr, *value);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -487,14 +487,33 @@ acpi_ex_store_object_to_node(union acpi_operand_object *source_desc,
|
||||
default:
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
|
||||
"Storing %s (%p) directly into node (%p) with no implicit conversion\n",
|
||||
"Storing [%s] (%p) directly into node [%s] (%p)"
|
||||
" with no implicit conversion\n",
|
||||
acpi_ut_get_object_type_name(source_desc),
|
||||
source_desc, node));
|
||||
source_desc,
|
||||
acpi_ut_get_object_type_name(target_desc),
|
||||
node));
|
||||
|
||||
/* No conversions for all other types. Just attach the source object */
|
||||
/*
|
||||
* No conversions for all other types. Directly store a copy of
|
||||
* the source object. NOTE: This is a departure from the ACPI
|
||||
* spec, which states "If conversion is impossible, abort the
|
||||
* running control method".
|
||||
*
|
||||
* This code implements "If conversion is impossible, treat the
|
||||
* Store operation as a CopyObject".
|
||||
*/
|
||||
status =
|
||||
acpi_ut_copy_iobject_to_iobject(source_desc, &new_desc,
|
||||
walk_state);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
status = acpi_ns_attach_object(node, source_desc,
|
||||
source_desc->common.type);
|
||||
status =
|
||||
acpi_ns_attach_object(node, new_desc,
|
||||
new_desc->common.type);
|
||||
acpi_ut_remove_reference(new_desc);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -253,7 +253,7 @@ acpi_ex_store_object_to_object(union acpi_operand_object *source_desc,
|
||||
|
||||
/* Truncate value if we are executing from a 32-bit ACPI table */
|
||||
|
||||
acpi_ex_truncate_for32bit_table(dest_desc);
|
||||
(void)acpi_ex_truncate_for32bit_table(dest_desc);
|
||||
break;
|
||||
|
||||
case ACPI_TYPE_STRING:
|
||||
|
@ -202,35 +202,39 @@ void acpi_ex_relinquish_interpreter(void)
|
||||
*
|
||||
* PARAMETERS: obj_desc - Object to be truncated
|
||||
*
|
||||
* RETURN: none
|
||||
* RETURN: TRUE if a truncation was performed, FALSE otherwise.
|
||||
*
|
||||
* DESCRIPTION: Truncate an ACPI Integer to 32 bits if the execution mode is
|
||||
* 32-bit, as determined by the revision of the DSDT.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
void acpi_ex_truncate_for32bit_table(union acpi_operand_object *obj_desc)
|
||||
u8 acpi_ex_truncate_for32bit_table(union acpi_operand_object *obj_desc)
|
||||
{
|
||||
|
||||
ACPI_FUNCTION_ENTRY();
|
||||
|
||||
/*
|
||||
* Object must be a valid number and we must be executing
|
||||
* a control method. NS node could be there for AML_INT_NAMEPATH_OP.
|
||||
* a control method. Object could be NS node for AML_INT_NAMEPATH_OP.
|
||||
*/
|
||||
if ((!obj_desc) ||
|
||||
(ACPI_GET_DESCRIPTOR_TYPE(obj_desc) != ACPI_DESC_TYPE_OPERAND) ||
|
||||
(obj_desc->common.type != ACPI_TYPE_INTEGER)) {
|
||||
return;
|
||||
return (FALSE);
|
||||
}
|
||||
|
||||
if (acpi_gbl_integer_byte_width == 4) {
|
||||
if ((acpi_gbl_integer_byte_width == 4) &&
|
||||
(obj_desc->integer.value > (u64)ACPI_UINT32_MAX)) {
|
||||
/*
|
||||
* We are running a method that exists in a 32-bit ACPI table.
|
||||
* We are executing in a 32-bit ACPI table.
|
||||
* Truncate the value to 32 bits by zeroing out the upper 32-bit field
|
||||
*/
|
||||
obj_desc->integer.value &= (u64) ACPI_UINT32_MAX;
|
||||
obj_desc->integer.value &= (u64)ACPI_UINT32_MAX;
|
||||
return (TRUE);
|
||||
}
|
||||
|
||||
return (FALSE);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
@ -336,7 +340,7 @@ static u32 acpi_ex_digits_needed(u64 value, u32 base)
|
||||
/* u64 is unsigned, so we don't worry about a '-' prefix */
|
||||
|
||||
if (value == 0) {
|
||||
return_UINT32(1);
|
||||
return_VALUE(1);
|
||||
}
|
||||
|
||||
current_value = value;
|
||||
@ -350,7 +354,7 @@ static u32 acpi_ex_digits_needed(u64 value, u32 base)
|
||||
num_digits++;
|
||||
}
|
||||
|
||||
return_UINT32(num_digits);
|
||||
return_VALUE(num_digits);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
|
@ -108,8 +108,7 @@ acpi_status acpi_hw_set_mode(u32 mode)
|
||||
* enable bits to default
|
||||
*/
|
||||
status = acpi_hw_write_port(acpi_gbl_FADT.smi_command,
|
||||
(u32) acpi_gbl_FADT.acpi_disable,
|
||||
8);
|
||||
(u32)acpi_gbl_FADT.acpi_disable, 8);
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
|
||||
"Attempting to enable Legacy (non-ACPI) mode\n"));
|
||||
break;
|
||||
@ -152,18 +151,18 @@ u32 acpi_hw_get_mode(void)
|
||||
* system does not support mode transition.
|
||||
*/
|
||||
if (!acpi_gbl_FADT.smi_command) {
|
||||
return_UINT32(ACPI_SYS_MODE_ACPI);
|
||||
return_VALUE(ACPI_SYS_MODE_ACPI);
|
||||
}
|
||||
|
||||
status = acpi_read_bit_register(ACPI_BITREG_SCI_ENABLE, &value);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_UINT32(ACPI_SYS_MODE_LEGACY);
|
||||
return_VALUE(ACPI_SYS_MODE_LEGACY);
|
||||
}
|
||||
|
||||
if (value) {
|
||||
return_UINT32(ACPI_SYS_MODE_ACPI);
|
||||
return_VALUE(ACPI_SYS_MODE_ACPI);
|
||||
} else {
|
||||
return_UINT32(ACPI_SYS_MODE_LEGACY);
|
||||
return_VALUE(ACPI_SYS_MODE_LEGACY);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -200,7 +200,6 @@ acpi_status acpi_hw_extended_wake_prep(u8 sleep_state)
|
||||
* FUNCTION: acpi_hw_extended_wake
|
||||
*
|
||||
* PARAMETERS: sleep_state - Which sleep state we just exited
|
||||
* flags - Reserved, set to zero
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
|
@ -69,8 +69,10 @@ acpi_hw_enable_wakeup_gpe_block(struct acpi_gpe_xrupt_info *gpe_xrupt_info,
|
||||
|
||||
u32 acpi_hw_get_gpe_register_bit(struct acpi_gpe_event_info *gpe_event_info)
|
||||
{
|
||||
return (u32)1 << (gpe_event_info->gpe_number -
|
||||
gpe_event_info->register_info->base_gpe_number);
|
||||
|
||||
return ((u32)1 <<
|
||||
(gpe_event_info->gpe_number -
|
||||
gpe_event_info->register_info->base_gpe_number));
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
|
@ -44,7 +44,6 @@
|
||||
|
||||
#include <acpi/acpi.h>
|
||||
#include "accommon.h"
|
||||
#include "acnamesp.h"
|
||||
#include "acevents.h"
|
||||
|
||||
#define _COMPONENT ACPI_HARDWARE
|
||||
@ -364,8 +363,7 @@ acpi_status acpi_hw_write_pm1_control(u32 pm1a_control, u32 pm1b_control)
|
||||
* DESCRIPTION: Read from the specified ACPI register
|
||||
*
|
||||
******************************************************************************/
|
||||
acpi_status
|
||||
acpi_hw_register_read(u32 register_id, u32 * return_value)
|
||||
acpi_status acpi_hw_register_read(u32 register_id, u32 *return_value)
|
||||
{
|
||||
u32 value = 0;
|
||||
acpi_status status;
|
||||
@ -485,7 +483,7 @@ acpi_status acpi_hw_register_write(u32 register_id, u32 value)
|
||||
&acpi_gbl_xpm1b_status);
|
||||
break;
|
||||
|
||||
case ACPI_REGISTER_PM1_ENABLE: /* PM1 A/B: 16-bit access */
|
||||
case ACPI_REGISTER_PM1_ENABLE: /* PM1 A/B: 16-bit access each */
|
||||
|
||||
status = acpi_hw_write_multiple(value,
|
||||
&acpi_gbl_xpm1a_enable,
|
||||
|
@ -45,7 +45,6 @@
|
||||
#include <acpi/acpi.h>
|
||||
#include <linux/acpi.h>
|
||||
#include "accommon.h"
|
||||
#include <linux/module.h>
|
||||
|
||||
#define _COMPONENT ACPI_HARDWARE
|
||||
ACPI_MODULE_NAME("hwsleep")
|
||||
@ -178,7 +177,7 @@ acpi_status acpi_hw_legacy_sleep(u8 sleep_state)
|
||||
* to still read the right value. Ideally, this block would go
|
||||
* away entirely.
|
||||
*/
|
||||
acpi_os_stall(10000000);
|
||||
acpi_os_stall(10 * ACPI_USEC_PER_SEC);
|
||||
|
||||
status = acpi_hw_register_write(ACPI_REGISTER_PM1_CONTROL,
|
||||
sleep_enable_reg_info->
|
||||
@ -323,7 +322,8 @@ acpi_status acpi_hw_legacy_wake(u8 sleep_state)
|
||||
* and use it to determine whether the system is rebooting or
|
||||
* resuming. Clear WAK_STS for compatibility.
|
||||
*/
|
||||
acpi_write_bit_register(ACPI_BITREG_WAKE_STATUS, 1);
|
||||
(void)acpi_write_bit_register(ACPI_BITREG_WAKE_STATUS,
|
||||
ACPI_CLEAR_STATUS);
|
||||
acpi_gbl_system_awake_and_running = TRUE;
|
||||
|
||||
/* Enable power button */
|
||||
|
@ -176,10 +176,11 @@ acpi_get_timer_duration(u32 start_ticks, u32 end_ticks, u32 * time_elapsed)
|
||||
/*
|
||||
* Compute Duration (Requires a 64-bit multiply and divide):
|
||||
*
|
||||
* time_elapsed = (delta_ticks * 1000000) / PM_TIMER_FREQUENCY;
|
||||
* time_elapsed (microseconds) =
|
||||
* (delta_ticks * ACPI_USEC_PER_SEC) / ACPI_PM_TIMER_FREQUENCY;
|
||||
*/
|
||||
status = acpi_ut_short_divide(((u64) delta_ticks) * 1000000,
|
||||
PM_TIMER_FREQUENCY, "ient, NULL);
|
||||
status = acpi_ut_short_divide(((u64)delta_ticks) * ACPI_USEC_PER_SEC,
|
||||
ACPI_PM_TIMER_FREQUENCY, "ient, NULL);
|
||||
|
||||
*time_elapsed = (u32) quotient;
|
||||
return_ACPI_STATUS(status);
|
||||
|
@ -135,7 +135,7 @@ acpi_hw_validate_io_request(acpi_io_address address, u32 bit_width)
|
||||
if ((bit_width != 8) && (bit_width != 16) && (bit_width != 32)) {
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"Bad BitWidth parameter: %8.8X", bit_width));
|
||||
return AE_BAD_PARAMETER;
|
||||
return (AE_BAD_PARAMETER);
|
||||
}
|
||||
|
||||
port_info = acpi_protected_ports;
|
||||
@ -234,11 +234,11 @@ acpi_status acpi_hw_read_port(acpi_io_address address, u32 *value, u32 width)
|
||||
status = acpi_hw_validate_io_request(address, width);
|
||||
if (ACPI_SUCCESS(status)) {
|
||||
status = acpi_os_read_port(address, value, width);
|
||||
return status;
|
||||
return (status);
|
||||
}
|
||||
|
||||
if (status != AE_AML_ILLEGAL_ADDRESS) {
|
||||
return status;
|
||||
return (status);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -253,7 +253,7 @@ acpi_status acpi_hw_read_port(acpi_io_address address, u32 *value, u32 width)
|
||||
if (acpi_hw_validate_io_request(address, 8) == AE_OK) {
|
||||
status = acpi_os_read_port(address, &one_byte, 8);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return status;
|
||||
return (status);
|
||||
}
|
||||
|
||||
*value |= (one_byte << i);
|
||||
@ -262,7 +262,7 @@ acpi_status acpi_hw_read_port(acpi_io_address address, u32 *value, u32 width)
|
||||
address++;
|
||||
}
|
||||
|
||||
return AE_OK;
|
||||
return (AE_OK);
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
@ -297,11 +297,11 @@ acpi_status acpi_hw_write_port(acpi_io_address address, u32 value, u32 width)
|
||||
status = acpi_hw_validate_io_request(address, width);
|
||||
if (ACPI_SUCCESS(status)) {
|
||||
status = acpi_os_write_port(address, value, width);
|
||||
return status;
|
||||
return (status);
|
||||
}
|
||||
|
||||
if (status != AE_AML_ILLEGAL_ADDRESS) {
|
||||
return status;
|
||||
return (status);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -317,12 +317,12 @@ acpi_status acpi_hw_write_port(acpi_io_address address, u32 value, u32 width)
|
||||
status =
|
||||
acpi_os_write_port(address, (value >> i) & 0xFF, 8);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return status;
|
||||
return (status);
|
||||
}
|
||||
}
|
||||
|
||||
address++;
|
||||
}
|
||||
|
||||
return AE_OK;
|
||||
return (AE_OK);
|
||||
}
|
||||
|
@ -80,10 +80,10 @@ acpi_status acpi_reset(void)
|
||||
|
||||
if (reset_reg->space_id == ACPI_ADR_SPACE_SYSTEM_IO) {
|
||||
/*
|
||||
* For I/O space, write directly to the OSL. This
|
||||
* bypasses the port validation mechanism, which may
|
||||
* block a valid write to the reset register. Spec
|
||||
* section 4.7.3.6 requires register width to be 8.
|
||||
* For I/O space, write directly to the OSL. This bypasses the port
|
||||
* validation mechanism, which may block a valid write to the reset
|
||||
* register.
|
||||
* Spec section 4.7.3.6 requires register width to be 8.
|
||||
*/
|
||||
status =
|
||||
acpi_os_write_port((acpi_io_address) reset_reg->address,
|
||||
@ -333,7 +333,7 @@ ACPI_EXPORT_SYMBOL(acpi_read_bit_register)
|
||||
* FUNCTION: acpi_write_bit_register
|
||||
*
|
||||
* PARAMETERS: register_id - ID of ACPI Bit Register to access
|
||||
* Value - Value to write to the register, in bit
|
||||
* value - Value to write to the register, in bit
|
||||
* position zero. The bit is automatically
|
||||
* shifted to the correct position.
|
||||
*
|
||||
|
@ -41,9 +41,9 @@
|
||||
* POSSIBILITY OF SUCH DAMAGES.
|
||||
*/
|
||||
|
||||
#include <linux/export.h>
|
||||
#include <acpi/acpi.h>
|
||||
#include "accommon.h"
|
||||
#include <linux/module.h>
|
||||
|
||||
#define _COMPONENT ACPI_HARDWARE
|
||||
ACPI_MODULE_NAME("hwxfsleep")
|
||||
@ -207,7 +207,7 @@ acpi_status asmlinkage acpi_enter_sleep_state_s4bios(void)
|
||||
(u32)acpi_gbl_FADT.s4_bios_request, 8);
|
||||
|
||||
do {
|
||||
acpi_os_stall(1000);
|
||||
acpi_os_stall(ACPI_USEC_PER_MSEC);
|
||||
status =
|
||||
acpi_read_bit_register(ACPI_BITREG_WAKE_STATUS, &in_value);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
@ -350,7 +350,7 @@ ACPI_EXPORT_SYMBOL(acpi_enter_sleep_state_prep)
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Enter a system sleep state (see ACPI 2.0 spec p 231)
|
||||
* DESCRIPTION: Enter a system sleep state
|
||||
* THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED
|
||||
*
|
||||
******************************************************************************/
|
||||
@ -382,8 +382,9 @@ ACPI_EXPORT_SYMBOL(acpi_enter_sleep_state)
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Perform the first state of OS-independent ACPI cleanup after a
|
||||
* sleep.
|
||||
* Called with interrupts DISABLED.
|
||||
* sleep. Called with interrupts DISABLED.
|
||||
* We break wake/resume into 2 stages so that OSPM can handle
|
||||
* various OS-specific tasks between the two steps.
|
||||
*
|
||||
******************************************************************************/
|
||||
acpi_status acpi_leave_sleep_state_prep(u8 sleep_state)
|
||||
|
@ -44,6 +44,7 @@
|
||||
#include <acpi/acpi.h>
|
||||
#include "accommon.h"
|
||||
#include "acnamesp.h"
|
||||
#include <acpi/acoutput.h>
|
||||
|
||||
#define _COMPONENT ACPI_NAMESPACE
|
||||
ACPI_MODULE_NAME("nsdump")
|
||||
@ -77,8 +78,9 @@ void acpi_ns_print_pathname(u32 num_segments, char *pathname)
|
||||
|
||||
ACPI_FUNCTION_NAME(ns_print_pathname);
|
||||
|
||||
if (!(acpi_dbg_level & ACPI_LV_NAMES)
|
||||
|| !(acpi_dbg_layer & ACPI_NAMESPACE)) {
|
||||
/* Check if debug output enabled */
|
||||
|
||||
if (!ACPI_IS_DEBUG_ENABLED(ACPI_LV_NAMES, ACPI_NAMESPACE)) {
|
||||
return;
|
||||
}
|
||||
|
||||
@ -127,7 +129,7 @@ acpi_ns_dump_pathname(acpi_handle handle, char *msg, u32 level, u32 component)
|
||||
|
||||
/* Do this only if the requested debug level and component are enabled */
|
||||
|
||||
if (!(acpi_dbg_level & level) || !(acpi_dbg_layer & component)) {
|
||||
if (!ACPI_IS_DEBUG_ENABLED(level, component)) {
|
||||
return_VOID;
|
||||
}
|
||||
|
||||
@ -729,5 +731,5 @@ void acpi_ns_dump_tables(acpi_handle search_base, u32 max_depth)
|
||||
ACPI_OWNER_ID_MAX, search_handle);
|
||||
return_VOID;
|
||||
}
|
||||
#endif /* _ACPI_ASL_COMPILER */
|
||||
#endif /* defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER) */
|
||||
#endif
|
||||
#endif
|
||||
|
@ -42,7 +42,6 @@
|
||||
*/
|
||||
|
||||
#include <acpi/acpi.h>
|
||||
#include "accommon.h"
|
||||
|
||||
/* TBD: This entire module is apparently obsolete and should be removed */
|
||||
|
||||
|
@ -46,7 +46,6 @@
|
||||
#include "acnamesp.h"
|
||||
#include "acdispat.h"
|
||||
#include "acinterp.h"
|
||||
#include <linux/nmi.h>
|
||||
|
||||
#define _COMPONENT ACPI_NAMESPACE
|
||||
ACPI_MODULE_NAME("nsinit")
|
||||
@ -87,7 +86,7 @@ acpi_status acpi_ns_initialize_objects(void)
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,
|
||||
"**** Starting initialization of namespace objects ****\n"));
|
||||
ACPI_DEBUG_PRINT_RAW((ACPI_DB_INIT,
|
||||
"Completing Region/Field/Buffer/Package initialization:"));
|
||||
"Completing Region/Field/Buffer/Package initialization:\n"));
|
||||
|
||||
/* Set all init info to zero */
|
||||
|
||||
@ -103,7 +102,7 @@ acpi_status acpi_ns_initialize_objects(void)
|
||||
}
|
||||
|
||||
ACPI_DEBUG_PRINT_RAW((ACPI_DB_INIT,
|
||||
"\nInitialized %u/%u Regions %u/%u Fields %u/%u "
|
||||
" Initialized %u/%u Regions %u/%u Fields %u/%u "
|
||||
"Buffers %u/%u Packages (%u nodes)\n",
|
||||
info.op_region_init, info.op_region_count,
|
||||
info.field_init, info.field_count,
|
||||
@ -150,7 +149,7 @@ acpi_status acpi_ns_initialize_devices(void)
|
||||
|
||||
ACPI_DEBUG_PRINT_RAW((ACPI_DB_INIT,
|
||||
"Initializing Device/Processor/Thermal objects "
|
||||
"by executing _INI methods:"));
|
||||
"and executing _INI/_STA methods:\n"));
|
||||
|
||||
/* Tree analysis: find all subtrees that contain _INI methods */
|
||||
|
||||
@ -208,7 +207,7 @@ acpi_status acpi_ns_initialize_devices(void)
|
||||
}
|
||||
|
||||
ACPI_DEBUG_PRINT_RAW((ACPI_DB_INIT,
|
||||
"\nExecuted %u _INI methods requiring %u _STA executions "
|
||||
" Executed %u _INI methods requiring %u _STA executions "
|
||||
"(examined %u objects)\n",
|
||||
info.num_INI, info.num_STA, info.device_count));
|
||||
|
||||
@ -349,14 +348,6 @@ acpi_ns_init_one_object(acpi_handle obj_handle,
|
||||
acpi_ut_get_type_name(type)));
|
||||
}
|
||||
|
||||
/*
|
||||
* Print a dot for each object unless we are going to print the entire
|
||||
* pathname
|
||||
*/
|
||||
if (!(acpi_dbg_level & ACPI_LV_INIT_NAMES)) {
|
||||
ACPI_DEBUG_PRINT_RAW((ACPI_DB_INIT, "."));
|
||||
}
|
||||
|
||||
/*
|
||||
* We ignore errors from above, and always return OK, since we don't want
|
||||
* to abort the walk on any single error.
|
||||
@ -572,20 +563,10 @@ acpi_ns_init_one_device(acpi_handle obj_handle,
|
||||
info->parameters = NULL;
|
||||
info->flags = ACPI_IGNORE_RETURN_VALUE;
|
||||
|
||||
/*
|
||||
* Some hardware relies on this being executed as atomically
|
||||
* as possible (without an NMI being received in the middle of
|
||||
* this) - so disable NMIs and initialize the device:
|
||||
*/
|
||||
status = acpi_ns_evaluate(info);
|
||||
|
||||
if (ACPI_SUCCESS(status)) {
|
||||
walk_info->num_INI++;
|
||||
|
||||
if ((acpi_dbg_level <= ACPI_LV_ALL_EXCEPTIONS) &&
|
||||
(!(acpi_dbg_level & ACPI_LV_INFO))) {
|
||||
ACPI_DEBUG_PRINT_RAW((ACPI_DB_INIT, "."));
|
||||
}
|
||||
}
|
||||
#ifdef ACPI_DEBUG_OUTPUT
|
||||
else if (status != AE_NOT_FOUND) {
|
||||
|
@ -126,7 +126,8 @@ acpi_ns_build_external_path(struct acpi_namespace_node *node,
|
||||
* the node, In external format (name segments separated by path
|
||||
* separators.)
|
||||
*
|
||||
* DESCRIPTION: Used for debug printing in acpi_ns_search_table().
|
||||
* DESCRIPTION: Used to obtain the full pathname to a namespace node, usually
|
||||
* for error and debug statements.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
|
@ -1,7 +1,6 @@
|
||||
/******************************************************************************
|
||||
*
|
||||
* Module Name: nspredef - Validation of ACPI predefined methods and objects
|
||||
* $Revision: 1.1 $
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
@ -73,27 +72,6 @@ ACPI_MODULE_NAME("nspredef")
|
||||
*
|
||||
******************************************************************************/
|
||||
/* Local prototypes */
|
||||
static acpi_status
|
||||
acpi_ns_check_package(struct acpi_predefined_data *data,
|
||||
union acpi_operand_object **return_object_ptr);
|
||||
|
||||
static acpi_status
|
||||
acpi_ns_check_package_list(struct acpi_predefined_data *data,
|
||||
const union acpi_predefined_info *package,
|
||||
union acpi_operand_object **elements, u32 count);
|
||||
|
||||
static acpi_status
|
||||
acpi_ns_check_package_elements(struct acpi_predefined_data *data,
|
||||
union acpi_operand_object **elements,
|
||||
u8 type1,
|
||||
u32 count1,
|
||||
u8 type2, u32 count2, u32 start_index);
|
||||
|
||||
static acpi_status
|
||||
acpi_ns_check_object_type(struct acpi_predefined_data *data,
|
||||
union acpi_operand_object **return_object_ptr,
|
||||
u32 expected_btypes, u32 package_index);
|
||||
|
||||
static acpi_status
|
||||
acpi_ns_check_reference(struct acpi_predefined_data *data,
|
||||
union acpi_operand_object *return_object);
|
||||
@ -148,7 +126,7 @@ acpi_ns_check_predefined_names(struct acpi_namespace_node *node,
|
||||
|
||||
pathname = acpi_ns_get_external_pathname(node);
|
||||
if (!pathname) {
|
||||
return AE_OK; /* Could not get pathname, ignore */
|
||||
return (AE_OK); /* Could not get pathname, ignore */
|
||||
}
|
||||
|
||||
/*
|
||||
@ -406,564 +384,6 @@ const union acpi_predefined_info *acpi_ns_check_for_predefined_name(struct
|
||||
return (NULL); /* Not found */
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ns_check_package
|
||||
*
|
||||
* PARAMETERS: data - Pointer to validation data structure
|
||||
* return_object_ptr - Pointer to the object returned from the
|
||||
* evaluation of a method or object
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Check a returned package object for the correct count and
|
||||
* correct type of all sub-objects.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
static acpi_status
|
||||
acpi_ns_check_package(struct acpi_predefined_data *data,
|
||||
union acpi_operand_object **return_object_ptr)
|
||||
{
|
||||
union acpi_operand_object *return_object = *return_object_ptr;
|
||||
const union acpi_predefined_info *package;
|
||||
union acpi_operand_object **elements;
|
||||
acpi_status status = AE_OK;
|
||||
u32 expected_count;
|
||||
u32 count;
|
||||
u32 i;
|
||||
|
||||
ACPI_FUNCTION_NAME(ns_check_package);
|
||||
|
||||
/* The package info for this name is in the next table entry */
|
||||
|
||||
package = data->predefined + 1;
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_NAMES,
|
||||
"%s Validating return Package of Type %X, Count %X\n",
|
||||
data->pathname, package->ret_info.type,
|
||||
return_object->package.count));
|
||||
|
||||
/*
|
||||
* For variable-length Packages, we can safely remove all embedded
|
||||
* and trailing NULL package elements
|
||||
*/
|
||||
acpi_ns_remove_null_elements(data, package->ret_info.type,
|
||||
return_object);
|
||||
|
||||
/* Extract package count and elements array */
|
||||
|
||||
elements = return_object->package.elements;
|
||||
count = return_object->package.count;
|
||||
|
||||
/* The package must have at least one element, else invalid */
|
||||
|
||||
if (!count) {
|
||||
ACPI_WARN_PREDEFINED((AE_INFO, data->pathname, data->node_flags,
|
||||
"Return Package has no elements (empty)"));
|
||||
|
||||
return (AE_AML_OPERAND_VALUE);
|
||||
}
|
||||
|
||||
/*
|
||||
* Decode the type of the expected package contents
|
||||
*
|
||||
* PTYPE1 packages contain no subpackages
|
||||
* PTYPE2 packages contain sub-packages
|
||||
*/
|
||||
switch (package->ret_info.type) {
|
||||
case ACPI_PTYPE1_FIXED:
|
||||
|
||||
/*
|
||||
* The package count is fixed and there are no sub-packages
|
||||
*
|
||||
* If package is too small, exit.
|
||||
* If package is larger than expected, issue warning but continue
|
||||
*/
|
||||
expected_count =
|
||||
package->ret_info.count1 + package->ret_info.count2;
|
||||
if (count < expected_count) {
|
||||
goto package_too_small;
|
||||
} else if (count > expected_count) {
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_REPAIR,
|
||||
"%s: Return Package is larger than needed - "
|
||||
"found %u, expected %u\n",
|
||||
data->pathname, count,
|
||||
expected_count));
|
||||
}
|
||||
|
||||
/* Validate all elements of the returned package */
|
||||
|
||||
status = acpi_ns_check_package_elements(data, elements,
|
||||
package->ret_info.
|
||||
object_type1,
|
||||
package->ret_info.
|
||||
count1,
|
||||
package->ret_info.
|
||||
object_type2,
|
||||
package->ret_info.
|
||||
count2, 0);
|
||||
break;
|
||||
|
||||
case ACPI_PTYPE1_VAR:
|
||||
|
||||
/*
|
||||
* The package count is variable, there are no sub-packages, and all
|
||||
* elements must be of the same type
|
||||
*/
|
||||
for (i = 0; i < count; i++) {
|
||||
status = acpi_ns_check_object_type(data, elements,
|
||||
package->ret_info.
|
||||
object_type1, i);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
}
|
||||
elements++;
|
||||
}
|
||||
break;
|
||||
|
||||
case ACPI_PTYPE1_OPTION:
|
||||
|
||||
/*
|
||||
* The package count is variable, there are no sub-packages. There are
|
||||
* a fixed number of required elements, and a variable number of
|
||||
* optional elements.
|
||||
*
|
||||
* Check if package is at least as large as the minimum required
|
||||
*/
|
||||
expected_count = package->ret_info3.count;
|
||||
if (count < expected_count) {
|
||||
goto package_too_small;
|
||||
}
|
||||
|
||||
/* Variable number of sub-objects */
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
if (i < package->ret_info3.count) {
|
||||
|
||||
/* These are the required package elements (0, 1, or 2) */
|
||||
|
||||
status =
|
||||
acpi_ns_check_object_type(data, elements,
|
||||
package->
|
||||
ret_info3.
|
||||
object_type[i],
|
||||
i);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
}
|
||||
} else {
|
||||
/* These are the optional package elements */
|
||||
|
||||
status =
|
||||
acpi_ns_check_object_type(data, elements,
|
||||
package->
|
||||
ret_info3.
|
||||
tail_object_type,
|
||||
i);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
}
|
||||
}
|
||||
elements++;
|
||||
}
|
||||
break;
|
||||
|
||||
case ACPI_PTYPE2_REV_FIXED:
|
||||
|
||||
/* First element is the (Integer) revision */
|
||||
|
||||
status = acpi_ns_check_object_type(data, elements,
|
||||
ACPI_RTYPE_INTEGER, 0);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
}
|
||||
|
||||
elements++;
|
||||
count--;
|
||||
|
||||
/* Examine the sub-packages */
|
||||
|
||||
status =
|
||||
acpi_ns_check_package_list(data, package, elements, count);
|
||||
break;
|
||||
|
||||
case ACPI_PTYPE2_PKG_COUNT:
|
||||
|
||||
/* First element is the (Integer) count of sub-packages to follow */
|
||||
|
||||
status = acpi_ns_check_object_type(data, elements,
|
||||
ACPI_RTYPE_INTEGER, 0);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
}
|
||||
|
||||
/*
|
||||
* Count cannot be larger than the parent package length, but allow it
|
||||
* to be smaller. The >= accounts for the Integer above.
|
||||
*/
|
||||
expected_count = (u32) (*elements)->integer.value;
|
||||
if (expected_count >= count) {
|
||||
goto package_too_small;
|
||||
}
|
||||
|
||||
count = expected_count;
|
||||
elements++;
|
||||
|
||||
/* Examine the sub-packages */
|
||||
|
||||
status =
|
||||
acpi_ns_check_package_list(data, package, elements, count);
|
||||
break;
|
||||
|
||||
case ACPI_PTYPE2:
|
||||
case ACPI_PTYPE2_FIXED:
|
||||
case ACPI_PTYPE2_MIN:
|
||||
case ACPI_PTYPE2_COUNT:
|
||||
case ACPI_PTYPE2_FIX_VAR:
|
||||
|
||||
/*
|
||||
* These types all return a single Package that consists of a
|
||||
* variable number of sub-Packages.
|
||||
*
|
||||
* First, ensure that the first element is a sub-Package. If not,
|
||||
* the BIOS may have incorrectly returned the object as a single
|
||||
* package instead of a Package of Packages (a common error if
|
||||
* there is only one entry). We may be able to repair this by
|
||||
* wrapping the returned Package with a new outer Package.
|
||||
*/
|
||||
if (*elements
|
||||
&& ((*elements)->common.type != ACPI_TYPE_PACKAGE)) {
|
||||
|
||||
/* Create the new outer package and populate it */
|
||||
|
||||
status =
|
||||
acpi_ns_wrap_with_package(data, return_object,
|
||||
return_object_ptr);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
}
|
||||
|
||||
/* Update locals to point to the new package (of 1 element) */
|
||||
|
||||
return_object = *return_object_ptr;
|
||||
elements = return_object->package.elements;
|
||||
count = 1;
|
||||
}
|
||||
|
||||
/* Examine the sub-packages */
|
||||
|
||||
status =
|
||||
acpi_ns_check_package_list(data, package, elements, count);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
/* Should not get here if predefined info table is correct */
|
||||
|
||||
ACPI_WARN_PREDEFINED((AE_INFO, data->pathname, data->node_flags,
|
||||
"Invalid internal return type in table entry: %X",
|
||||
package->ret_info.type));
|
||||
|
||||
return (AE_AML_INTERNAL);
|
||||
}
|
||||
|
||||
return (status);
|
||||
|
||||
package_too_small:
|
||||
|
||||
/* Error exit for the case with an incorrect package count */
|
||||
|
||||
ACPI_WARN_PREDEFINED((AE_INFO, data->pathname, data->node_flags,
|
||||
"Return Package is too small - found %u elements, expected %u",
|
||||
count, expected_count));
|
||||
|
||||
return (AE_AML_OPERAND_VALUE);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ns_check_package_list
|
||||
*
|
||||
* PARAMETERS: data - Pointer to validation data structure
|
||||
* package - Pointer to package-specific info for method
|
||||
* elements - Element list of parent package. All elements
|
||||
* of this list should be of type Package.
|
||||
* count - Count of subpackages
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Examine a list of subpackages
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
static acpi_status
|
||||
acpi_ns_check_package_list(struct acpi_predefined_data *data,
|
||||
const union acpi_predefined_info *package,
|
||||
union acpi_operand_object **elements, u32 count)
|
||||
{
|
||||
union acpi_operand_object *sub_package;
|
||||
union acpi_operand_object **sub_elements;
|
||||
acpi_status status;
|
||||
u32 expected_count;
|
||||
u32 i;
|
||||
u32 j;
|
||||
|
||||
/*
|
||||
* Validate each sub-Package in the parent Package
|
||||
*
|
||||
* NOTE: assumes list of sub-packages contains no NULL elements.
|
||||
* Any NULL elements should have been removed by earlier call
|
||||
* to acpi_ns_remove_null_elements.
|
||||
*/
|
||||
for (i = 0; i < count; i++) {
|
||||
sub_package = *elements;
|
||||
sub_elements = sub_package->package.elements;
|
||||
data->parent_package = sub_package;
|
||||
|
||||
/* Each sub-object must be of type Package */
|
||||
|
||||
status = acpi_ns_check_object_type(data, &sub_package,
|
||||
ACPI_RTYPE_PACKAGE, i);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
}
|
||||
|
||||
/* Examine the different types of expected sub-packages */
|
||||
|
||||
data->parent_package = sub_package;
|
||||
switch (package->ret_info.type) {
|
||||
case ACPI_PTYPE2:
|
||||
case ACPI_PTYPE2_PKG_COUNT:
|
||||
case ACPI_PTYPE2_REV_FIXED:
|
||||
|
||||
/* Each subpackage has a fixed number of elements */
|
||||
|
||||
expected_count =
|
||||
package->ret_info.count1 + package->ret_info.count2;
|
||||
if (sub_package->package.count < expected_count) {
|
||||
goto package_too_small;
|
||||
}
|
||||
|
||||
status =
|
||||
acpi_ns_check_package_elements(data, sub_elements,
|
||||
package->ret_info.
|
||||
object_type1,
|
||||
package->ret_info.
|
||||
count1,
|
||||
package->ret_info.
|
||||
object_type2,
|
||||
package->ret_info.
|
||||
count2, 0);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
}
|
||||
break;
|
||||
|
||||
case ACPI_PTYPE2_FIX_VAR:
|
||||
/*
|
||||
* Each subpackage has a fixed number of elements and an
|
||||
* optional element
|
||||
*/
|
||||
expected_count =
|
||||
package->ret_info.count1 + package->ret_info.count2;
|
||||
if (sub_package->package.count < expected_count) {
|
||||
goto package_too_small;
|
||||
}
|
||||
|
||||
status =
|
||||
acpi_ns_check_package_elements(data, sub_elements,
|
||||
package->ret_info.
|
||||
object_type1,
|
||||
package->ret_info.
|
||||
count1,
|
||||
package->ret_info.
|
||||
object_type2,
|
||||
sub_package->package.
|
||||
count -
|
||||
package->ret_info.
|
||||
count1, 0);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
}
|
||||
break;
|
||||
|
||||
case ACPI_PTYPE2_FIXED:
|
||||
|
||||
/* Each sub-package has a fixed length */
|
||||
|
||||
expected_count = package->ret_info2.count;
|
||||
if (sub_package->package.count < expected_count) {
|
||||
goto package_too_small;
|
||||
}
|
||||
|
||||
/* Check the type of each sub-package element */
|
||||
|
||||
for (j = 0; j < expected_count; j++) {
|
||||
status =
|
||||
acpi_ns_check_object_type(data,
|
||||
&sub_elements[j],
|
||||
package->
|
||||
ret_info2.
|
||||
object_type[j],
|
||||
j);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case ACPI_PTYPE2_MIN:
|
||||
|
||||
/* Each sub-package has a variable but minimum length */
|
||||
|
||||
expected_count = package->ret_info.count1;
|
||||
if (sub_package->package.count < expected_count) {
|
||||
goto package_too_small;
|
||||
}
|
||||
|
||||
/* Check the type of each sub-package element */
|
||||
|
||||
status =
|
||||
acpi_ns_check_package_elements(data, sub_elements,
|
||||
package->ret_info.
|
||||
object_type1,
|
||||
sub_package->package.
|
||||
count, 0, 0, 0);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
}
|
||||
break;
|
||||
|
||||
case ACPI_PTYPE2_COUNT:
|
||||
|
||||
/*
|
||||
* First element is the (Integer) count of elements, including
|
||||
* the count field (the ACPI name is num_elements)
|
||||
*/
|
||||
status = acpi_ns_check_object_type(data, sub_elements,
|
||||
ACPI_RTYPE_INTEGER,
|
||||
0);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
}
|
||||
|
||||
/*
|
||||
* Make sure package is large enough for the Count and is
|
||||
* is as large as the minimum size
|
||||
*/
|
||||
expected_count = (u32)(*sub_elements)->integer.value;
|
||||
if (sub_package->package.count < expected_count) {
|
||||
goto package_too_small;
|
||||
}
|
||||
if (sub_package->package.count <
|
||||
package->ret_info.count1) {
|
||||
expected_count = package->ret_info.count1;
|
||||
goto package_too_small;
|
||||
}
|
||||
if (expected_count == 0) {
|
||||
/*
|
||||
* Either the num_entries element was originally zero or it was
|
||||
* a NULL element and repaired to an Integer of value zero.
|
||||
* In either case, repair it by setting num_entries to be the
|
||||
* actual size of the subpackage.
|
||||
*/
|
||||
expected_count = sub_package->package.count;
|
||||
(*sub_elements)->integer.value = expected_count;
|
||||
}
|
||||
|
||||
/* Check the type of each sub-package element */
|
||||
|
||||
status =
|
||||
acpi_ns_check_package_elements(data,
|
||||
(sub_elements + 1),
|
||||
package->ret_info.
|
||||
object_type1,
|
||||
(expected_count - 1),
|
||||
0, 0, 1);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
}
|
||||
break;
|
||||
|
||||
default: /* Should not get here, type was validated by caller */
|
||||
|
||||
return (AE_AML_INTERNAL);
|
||||
}
|
||||
|
||||
elements++;
|
||||
}
|
||||
|
||||
return (AE_OK);
|
||||
|
||||
package_too_small:
|
||||
|
||||
/* The sub-package count was smaller than required */
|
||||
|
||||
ACPI_WARN_PREDEFINED((AE_INFO, data->pathname, data->node_flags,
|
||||
"Return Sub-Package[%u] is too small - found %u elements, expected %u",
|
||||
i, sub_package->package.count, expected_count));
|
||||
|
||||
return (AE_AML_OPERAND_VALUE);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ns_check_package_elements
|
||||
*
|
||||
* PARAMETERS: data - Pointer to validation data structure
|
||||
* elements - Pointer to the package elements array
|
||||
* type1 - Object type for first group
|
||||
* count1 - Count for first group
|
||||
* type2 - Object type for second group
|
||||
* count2 - Count for second group
|
||||
* start_index - Start of the first group of elements
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Check that all elements of a package are of the correct object
|
||||
* type. Supports up to two groups of different object types.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
static acpi_status
|
||||
acpi_ns_check_package_elements(struct acpi_predefined_data *data,
|
||||
union acpi_operand_object **elements,
|
||||
u8 type1,
|
||||
u32 count1,
|
||||
u8 type2, u32 count2, u32 start_index)
|
||||
{
|
||||
union acpi_operand_object **this_element = elements;
|
||||
acpi_status status;
|
||||
u32 i;
|
||||
|
||||
/*
|
||||
* Up to two groups of package elements are supported by the data
|
||||
* structure. All elements in each group must be of the same type.
|
||||
* The second group can have a count of zero.
|
||||
*/
|
||||
for (i = 0; i < count1; i++) {
|
||||
status = acpi_ns_check_object_type(data, this_element,
|
||||
type1, i + start_index);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
}
|
||||
this_element++;
|
||||
}
|
||||
|
||||
for (i = 0; i < count2; i++) {
|
||||
status = acpi_ns_check_object_type(data, this_element,
|
||||
type2,
|
||||
(i + count1 + start_index));
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
}
|
||||
this_element++;
|
||||
}
|
||||
|
||||
return (AE_OK);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ns_check_object_type
|
||||
@ -983,7 +403,7 @@ acpi_ns_check_package_elements(struct acpi_predefined_data *data,
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
static acpi_status
|
||||
acpi_status
|
||||
acpi_ns_check_object_type(struct acpi_predefined_data *data,
|
||||
union acpi_operand_object **return_object_ptr,
|
||||
u32 expected_btypes, u32 package_index)
|
||||
|
621
drivers/acpi/acpica/nsprepkg.c
Normal file
621
drivers/acpi/acpica/nsprepkg.c
Normal file
@ -0,0 +1,621 @@
|
||||
/******************************************************************************
|
||||
*
|
||||
* Module Name: nsprepkg - Validation of package objects for predefined names
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2000 - 2012, Intel Corp.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions, and the following disclaimer,
|
||||
* without modification.
|
||||
* 2. Redistributions in binary form must reproduce at minimum a disclaimer
|
||||
* substantially similar to the "NO WARRANTY" disclaimer below
|
||||
* ("Disclaimer") and any redistribution must be conditioned upon
|
||||
* including a substantially similar Disclaimer requirement for further
|
||||
* binary redistribution.
|
||||
* 3. Neither the names of the above-listed copyright holders nor the names
|
||||
* of any contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* Alternatively, this software may be distributed under the terms of the
|
||||
* GNU General Public License ("GPL") version 2 as published by the Free
|
||||
* Software Foundation.
|
||||
*
|
||||
* NO WARRANTY
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGES.
|
||||
*/
|
||||
|
||||
#include <acpi/acpi.h>
|
||||
#include "accommon.h"
|
||||
#include "acnamesp.h"
|
||||
#include "acpredef.h"
|
||||
|
||||
#define _COMPONENT ACPI_NAMESPACE
|
||||
ACPI_MODULE_NAME("nsprepkg")
|
||||
|
||||
/* Local prototypes */
|
||||
static acpi_status
|
||||
acpi_ns_check_package_list(struct acpi_predefined_data *data,
|
||||
const union acpi_predefined_info *package,
|
||||
union acpi_operand_object **elements, u32 count);
|
||||
|
||||
static acpi_status
|
||||
acpi_ns_check_package_elements(struct acpi_predefined_data *data,
|
||||
union acpi_operand_object **elements,
|
||||
u8 type1,
|
||||
u32 count1,
|
||||
u8 type2, u32 count2, u32 start_index);
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ns_check_package
|
||||
*
|
||||
* PARAMETERS: data - Pointer to validation data structure
|
||||
* return_object_ptr - Pointer to the object returned from the
|
||||
* evaluation of a method or object
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Check a returned package object for the correct count and
|
||||
* correct type of all sub-objects.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status
|
||||
acpi_ns_check_package(struct acpi_predefined_data *data,
|
||||
union acpi_operand_object **return_object_ptr)
|
||||
{
|
||||
union acpi_operand_object *return_object = *return_object_ptr;
|
||||
const union acpi_predefined_info *package;
|
||||
union acpi_operand_object **elements;
|
||||
acpi_status status = AE_OK;
|
||||
u32 expected_count;
|
||||
u32 count;
|
||||
u32 i;
|
||||
|
||||
ACPI_FUNCTION_NAME(ns_check_package);
|
||||
|
||||
/* The package info for this name is in the next table entry */
|
||||
|
||||
package = data->predefined + 1;
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_NAMES,
|
||||
"%s Validating return Package of Type %X, Count %X\n",
|
||||
data->pathname, package->ret_info.type,
|
||||
return_object->package.count));
|
||||
|
||||
/*
|
||||
* For variable-length Packages, we can safely remove all embedded
|
||||
* and trailing NULL package elements
|
||||
*/
|
||||
acpi_ns_remove_null_elements(data, package->ret_info.type,
|
||||
return_object);
|
||||
|
||||
/* Extract package count and elements array */
|
||||
|
||||
elements = return_object->package.elements;
|
||||
count = return_object->package.count;
|
||||
|
||||
/* The package must have at least one element, else invalid */
|
||||
|
||||
if (!count) {
|
||||
ACPI_WARN_PREDEFINED((AE_INFO, data->pathname, data->node_flags,
|
||||
"Return Package has no elements (empty)"));
|
||||
|
||||
return (AE_AML_OPERAND_VALUE);
|
||||
}
|
||||
|
||||
/*
|
||||
* Decode the type of the expected package contents
|
||||
*
|
||||
* PTYPE1 packages contain no subpackages
|
||||
* PTYPE2 packages contain sub-packages
|
||||
*/
|
||||
switch (package->ret_info.type) {
|
||||
case ACPI_PTYPE1_FIXED:
|
||||
|
||||
/*
|
||||
* The package count is fixed and there are no sub-packages
|
||||
*
|
||||
* If package is too small, exit.
|
||||
* If package is larger than expected, issue warning but continue
|
||||
*/
|
||||
expected_count =
|
||||
package->ret_info.count1 + package->ret_info.count2;
|
||||
if (count < expected_count) {
|
||||
goto package_too_small;
|
||||
} else if (count > expected_count) {
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_REPAIR,
|
||||
"%s: Return Package is larger than needed - "
|
||||
"found %u, expected %u\n",
|
||||
data->pathname, count,
|
||||
expected_count));
|
||||
}
|
||||
|
||||
/* Validate all elements of the returned package */
|
||||
|
||||
status = acpi_ns_check_package_elements(data, elements,
|
||||
package->ret_info.
|
||||
object_type1,
|
||||
package->ret_info.
|
||||
count1,
|
||||
package->ret_info.
|
||||
object_type2,
|
||||
package->ret_info.
|
||||
count2, 0);
|
||||
break;
|
||||
|
||||
case ACPI_PTYPE1_VAR:
|
||||
|
||||
/*
|
||||
* The package count is variable, there are no sub-packages, and all
|
||||
* elements must be of the same type
|
||||
*/
|
||||
for (i = 0; i < count; i++) {
|
||||
status = acpi_ns_check_object_type(data, elements,
|
||||
package->ret_info.
|
||||
object_type1, i);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
}
|
||||
elements++;
|
||||
}
|
||||
break;
|
||||
|
||||
case ACPI_PTYPE1_OPTION:
|
||||
|
||||
/*
|
||||
* The package count is variable, there are no sub-packages. There are
|
||||
* a fixed number of required elements, and a variable number of
|
||||
* optional elements.
|
||||
*
|
||||
* Check if package is at least as large as the minimum required
|
||||
*/
|
||||
expected_count = package->ret_info3.count;
|
||||
if (count < expected_count) {
|
||||
goto package_too_small;
|
||||
}
|
||||
|
||||
/* Variable number of sub-objects */
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
if (i < package->ret_info3.count) {
|
||||
|
||||
/* These are the required package elements (0, 1, or 2) */
|
||||
|
||||
status =
|
||||
acpi_ns_check_object_type(data, elements,
|
||||
package->
|
||||
ret_info3.
|
||||
object_type[i],
|
||||
i);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
}
|
||||
} else {
|
||||
/* These are the optional package elements */
|
||||
|
||||
status =
|
||||
acpi_ns_check_object_type(data, elements,
|
||||
package->
|
||||
ret_info3.
|
||||
tail_object_type,
|
||||
i);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
}
|
||||
}
|
||||
elements++;
|
||||
}
|
||||
break;
|
||||
|
||||
case ACPI_PTYPE2_REV_FIXED:
|
||||
|
||||
/* First element is the (Integer) revision */
|
||||
|
||||
status = acpi_ns_check_object_type(data, elements,
|
||||
ACPI_RTYPE_INTEGER, 0);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
}
|
||||
|
||||
elements++;
|
||||
count--;
|
||||
|
||||
/* Examine the sub-packages */
|
||||
|
||||
status =
|
||||
acpi_ns_check_package_list(data, package, elements, count);
|
||||
break;
|
||||
|
||||
case ACPI_PTYPE2_PKG_COUNT:
|
||||
|
||||
/* First element is the (Integer) count of sub-packages to follow */
|
||||
|
||||
status = acpi_ns_check_object_type(data, elements,
|
||||
ACPI_RTYPE_INTEGER, 0);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
}
|
||||
|
||||
/*
|
||||
* Count cannot be larger than the parent package length, but allow it
|
||||
* to be smaller. The >= accounts for the Integer above.
|
||||
*/
|
||||
expected_count = (u32)(*elements)->integer.value;
|
||||
if (expected_count >= count) {
|
||||
goto package_too_small;
|
||||
}
|
||||
|
||||
count = expected_count;
|
||||
elements++;
|
||||
|
||||
/* Examine the sub-packages */
|
||||
|
||||
status =
|
||||
acpi_ns_check_package_list(data, package, elements, count);
|
||||
break;
|
||||
|
||||
case ACPI_PTYPE2:
|
||||
case ACPI_PTYPE2_FIXED:
|
||||
case ACPI_PTYPE2_MIN:
|
||||
case ACPI_PTYPE2_COUNT:
|
||||
case ACPI_PTYPE2_FIX_VAR:
|
||||
|
||||
/*
|
||||
* These types all return a single Package that consists of a
|
||||
* variable number of sub-Packages.
|
||||
*
|
||||
* First, ensure that the first element is a sub-Package. If not,
|
||||
* the BIOS may have incorrectly returned the object as a single
|
||||
* package instead of a Package of Packages (a common error if
|
||||
* there is only one entry). We may be able to repair this by
|
||||
* wrapping the returned Package with a new outer Package.
|
||||
*/
|
||||
if (*elements
|
||||
&& ((*elements)->common.type != ACPI_TYPE_PACKAGE)) {
|
||||
|
||||
/* Create the new outer package and populate it */
|
||||
|
||||
status =
|
||||
acpi_ns_wrap_with_package(data, return_object,
|
||||
return_object_ptr);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
}
|
||||
|
||||
/* Update locals to point to the new package (of 1 element) */
|
||||
|
||||
return_object = *return_object_ptr;
|
||||
elements = return_object->package.elements;
|
||||
count = 1;
|
||||
}
|
||||
|
||||
/* Examine the sub-packages */
|
||||
|
||||
status =
|
||||
acpi_ns_check_package_list(data, package, elements, count);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
/* Should not get here if predefined info table is correct */
|
||||
|
||||
ACPI_WARN_PREDEFINED((AE_INFO, data->pathname, data->node_flags,
|
||||
"Invalid internal return type in table entry: %X",
|
||||
package->ret_info.type));
|
||||
|
||||
return (AE_AML_INTERNAL);
|
||||
}
|
||||
|
||||
return (status);
|
||||
|
||||
package_too_small:
|
||||
|
||||
/* Error exit for the case with an incorrect package count */
|
||||
|
||||
ACPI_WARN_PREDEFINED((AE_INFO, data->pathname, data->node_flags,
|
||||
"Return Package is too small - found %u elements, expected %u",
|
||||
count, expected_count));
|
||||
|
||||
return (AE_AML_OPERAND_VALUE);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ns_check_package_list
|
||||
*
|
||||
* PARAMETERS: data - Pointer to validation data structure
|
||||
* package - Pointer to package-specific info for method
|
||||
* elements - Element list of parent package. All elements
|
||||
* of this list should be of type Package.
|
||||
* count - Count of subpackages
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Examine a list of subpackages
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
static acpi_status
|
||||
acpi_ns_check_package_list(struct acpi_predefined_data *data,
|
||||
const union acpi_predefined_info *package,
|
||||
union acpi_operand_object **elements, u32 count)
|
||||
{
|
||||
union acpi_operand_object *sub_package;
|
||||
union acpi_operand_object **sub_elements;
|
||||
acpi_status status;
|
||||
u32 expected_count;
|
||||
u32 i;
|
||||
u32 j;
|
||||
|
||||
/*
|
||||
* Validate each sub-Package in the parent Package
|
||||
*
|
||||
* NOTE: assumes list of sub-packages contains no NULL elements.
|
||||
* Any NULL elements should have been removed by earlier call
|
||||
* to acpi_ns_remove_null_elements.
|
||||
*/
|
||||
for (i = 0; i < count; i++) {
|
||||
sub_package = *elements;
|
||||
sub_elements = sub_package->package.elements;
|
||||
data->parent_package = sub_package;
|
||||
|
||||
/* Each sub-object must be of type Package */
|
||||
|
||||
status = acpi_ns_check_object_type(data, &sub_package,
|
||||
ACPI_RTYPE_PACKAGE, i);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
}
|
||||
|
||||
/* Examine the different types of expected sub-packages */
|
||||
|
||||
data->parent_package = sub_package;
|
||||
switch (package->ret_info.type) {
|
||||
case ACPI_PTYPE2:
|
||||
case ACPI_PTYPE2_PKG_COUNT:
|
||||
case ACPI_PTYPE2_REV_FIXED:
|
||||
|
||||
/* Each subpackage has a fixed number of elements */
|
||||
|
||||
expected_count =
|
||||
package->ret_info.count1 + package->ret_info.count2;
|
||||
if (sub_package->package.count < expected_count) {
|
||||
goto package_too_small;
|
||||
}
|
||||
|
||||
status =
|
||||
acpi_ns_check_package_elements(data, sub_elements,
|
||||
package->ret_info.
|
||||
object_type1,
|
||||
package->ret_info.
|
||||
count1,
|
||||
package->ret_info.
|
||||
object_type2,
|
||||
package->ret_info.
|
||||
count2, 0);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
}
|
||||
break;
|
||||
|
||||
case ACPI_PTYPE2_FIX_VAR:
|
||||
/*
|
||||
* Each subpackage has a fixed number of elements and an
|
||||
* optional element
|
||||
*/
|
||||
expected_count =
|
||||
package->ret_info.count1 + package->ret_info.count2;
|
||||
if (sub_package->package.count < expected_count) {
|
||||
goto package_too_small;
|
||||
}
|
||||
|
||||
status =
|
||||
acpi_ns_check_package_elements(data, sub_elements,
|
||||
package->ret_info.
|
||||
object_type1,
|
||||
package->ret_info.
|
||||
count1,
|
||||
package->ret_info.
|
||||
object_type2,
|
||||
sub_package->package.
|
||||
count -
|
||||
package->ret_info.
|
||||
count1, 0);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
}
|
||||
break;
|
||||
|
||||
case ACPI_PTYPE2_FIXED:
|
||||
|
||||
/* Each sub-package has a fixed length */
|
||||
|
||||
expected_count = package->ret_info2.count;
|
||||
if (sub_package->package.count < expected_count) {
|
||||
goto package_too_small;
|
||||
}
|
||||
|
||||
/* Check the type of each sub-package element */
|
||||
|
||||
for (j = 0; j < expected_count; j++) {
|
||||
status =
|
||||
acpi_ns_check_object_type(data,
|
||||
&sub_elements[j],
|
||||
package->
|
||||
ret_info2.
|
||||
object_type[j],
|
||||
j);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case ACPI_PTYPE2_MIN:
|
||||
|
||||
/* Each sub-package has a variable but minimum length */
|
||||
|
||||
expected_count = package->ret_info.count1;
|
||||
if (sub_package->package.count < expected_count) {
|
||||
goto package_too_small;
|
||||
}
|
||||
|
||||
/* Check the type of each sub-package element */
|
||||
|
||||
status =
|
||||
acpi_ns_check_package_elements(data, sub_elements,
|
||||
package->ret_info.
|
||||
object_type1,
|
||||
sub_package->package.
|
||||
count, 0, 0, 0);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
}
|
||||
break;
|
||||
|
||||
case ACPI_PTYPE2_COUNT:
|
||||
|
||||
/*
|
||||
* First element is the (Integer) count of elements, including
|
||||
* the count field (the ACPI name is num_elements)
|
||||
*/
|
||||
status = acpi_ns_check_object_type(data, sub_elements,
|
||||
ACPI_RTYPE_INTEGER,
|
||||
0);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
}
|
||||
|
||||
/*
|
||||
* Make sure package is large enough for the Count and is
|
||||
* is as large as the minimum size
|
||||
*/
|
||||
expected_count = (u32)(*sub_elements)->integer.value;
|
||||
if (sub_package->package.count < expected_count) {
|
||||
goto package_too_small;
|
||||
}
|
||||
if (sub_package->package.count <
|
||||
package->ret_info.count1) {
|
||||
expected_count = package->ret_info.count1;
|
||||
goto package_too_small;
|
||||
}
|
||||
if (expected_count == 0) {
|
||||
/*
|
||||
* Either the num_entries element was originally zero or it was
|
||||
* a NULL element and repaired to an Integer of value zero.
|
||||
* In either case, repair it by setting num_entries to be the
|
||||
* actual size of the subpackage.
|
||||
*/
|
||||
expected_count = sub_package->package.count;
|
||||
(*sub_elements)->integer.value = expected_count;
|
||||
}
|
||||
|
||||
/* Check the type of each sub-package element */
|
||||
|
||||
status =
|
||||
acpi_ns_check_package_elements(data,
|
||||
(sub_elements + 1),
|
||||
package->ret_info.
|
||||
object_type1,
|
||||
(expected_count - 1),
|
||||
0, 0, 1);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
}
|
||||
break;
|
||||
|
||||
default: /* Should not get here, type was validated by caller */
|
||||
|
||||
return (AE_AML_INTERNAL);
|
||||
}
|
||||
|
||||
elements++;
|
||||
}
|
||||
|
||||
return (AE_OK);
|
||||
|
||||
package_too_small:
|
||||
|
||||
/* The sub-package count was smaller than required */
|
||||
|
||||
ACPI_WARN_PREDEFINED((AE_INFO, data->pathname, data->node_flags,
|
||||
"Return Sub-Package[%u] is too small - found %u elements, expected %u",
|
||||
i, sub_package->package.count, expected_count));
|
||||
|
||||
return (AE_AML_OPERAND_VALUE);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ns_check_package_elements
|
||||
*
|
||||
* PARAMETERS: data - Pointer to validation data structure
|
||||
* elements - Pointer to the package elements array
|
||||
* type1 - Object type for first group
|
||||
* count1 - Count for first group
|
||||
* type2 - Object type for second group
|
||||
* count2 - Count for second group
|
||||
* start_index - Start of the first group of elements
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Check that all elements of a package are of the correct object
|
||||
* type. Supports up to two groups of different object types.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
static acpi_status
|
||||
acpi_ns_check_package_elements(struct acpi_predefined_data *data,
|
||||
union acpi_operand_object **elements,
|
||||
u8 type1,
|
||||
u32 count1,
|
||||
u8 type2, u32 count2, u32 start_index)
|
||||
{
|
||||
union acpi_operand_object **this_element = elements;
|
||||
acpi_status status;
|
||||
u32 i;
|
||||
|
||||
/*
|
||||
* Up to two groups of package elements are supported by the data
|
||||
* structure. All elements in each group must be of the same type.
|
||||
* The second group can have a count of zero.
|
||||
*/
|
||||
for (i = 0; i < count1; i++) {
|
||||
status = acpi_ns_check_object_type(data, this_element,
|
||||
type1, i + start_index);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
}
|
||||
this_element++;
|
||||
}
|
||||
|
||||
for (i = 0; i < count2; i++) {
|
||||
status = acpi_ns_check_object_type(data, this_element,
|
||||
type2,
|
||||
(i + count1 + start_index));
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
}
|
||||
this_element++;
|
||||
}
|
||||
|
||||
return (AE_OK);
|
||||
}
|
@ -55,7 +55,8 @@ ACPI_MODULE_NAME("nsrepair2")
|
||||
*/
|
||||
typedef
|
||||
acpi_status(*acpi_repair_function) (struct acpi_predefined_data *data,
|
||||
union acpi_operand_object **return_object_ptr);
|
||||
union acpi_operand_object
|
||||
**return_object_ptr);
|
||||
|
||||
typedef struct acpi_repair_info {
|
||||
char name[ACPI_NAME_SIZE];
|
||||
|
@ -328,6 +328,11 @@ acpi_ns_search_and_enter(u32 target_name,
|
||||
if ((status == AE_OK) && (flags & ACPI_NS_ERROR_IF_FOUND)) {
|
||||
status = AE_ALREADY_EXISTS;
|
||||
}
|
||||
#ifdef ACPI_ASL_COMPILER
|
||||
if (*return_node && (*return_node)->type == ACPI_TYPE_ANY) {
|
||||
(*return_node)->flags |= ANOBJ_IS_EXTERNAL;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Either found it or there was an error: finished either way */
|
||||
|
||||
|
@ -46,14 +46,11 @@
|
||||
#include "accommon.h"
|
||||
#include "acnamesp.h"
|
||||
#include "amlcode.h"
|
||||
#include "actables.h"
|
||||
|
||||
#define _COMPONENT ACPI_NAMESPACE
|
||||
ACPI_MODULE_NAME("nsutils")
|
||||
|
||||
/* Local prototypes */
|
||||
static u8 acpi_ns_valid_path_separator(char sep);
|
||||
|
||||
#ifdef ACPI_OBSOLETE_FUNCTIONS
|
||||
acpi_name acpi_ns_find_parent_name(struct acpi_namespace_node *node_to_search);
|
||||
#endif
|
||||
@ -97,42 +94,6 @@ acpi_ns_print_node_pathname(struct acpi_namespace_node *node,
|
||||
}
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ns_valid_root_prefix
|
||||
*
|
||||
* PARAMETERS: prefix - Character to be checked
|
||||
*
|
||||
* RETURN: TRUE if a valid prefix
|
||||
*
|
||||
* DESCRIPTION: Check if a character is a valid ACPI Root prefix
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
u8 acpi_ns_valid_root_prefix(char prefix)
|
||||
{
|
||||
|
||||
return ((u8) (prefix == '\\'));
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ns_valid_path_separator
|
||||
*
|
||||
* PARAMETERS: sep - Character to be checked
|
||||
*
|
||||
* RETURN: TRUE if a valid path separator
|
||||
*
|
||||
* DESCRIPTION: Check if a character is a valid ACPI path separator
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
static u8 acpi_ns_valid_path_separator(char sep)
|
||||
{
|
||||
|
||||
return ((u8) (sep == '.'));
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ns_get_type
|
||||
@ -151,10 +112,10 @@ acpi_object_type acpi_ns_get_type(struct acpi_namespace_node * node)
|
||||
|
||||
if (!node) {
|
||||
ACPI_WARNING((AE_INFO, "Null Node parameter"));
|
||||
return_UINT32(ACPI_TYPE_ANY);
|
||||
return_VALUE(ACPI_TYPE_ANY);
|
||||
}
|
||||
|
||||
return_UINT32((acpi_object_type) node->type);
|
||||
return_VALUE(node->type);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
@ -179,10 +140,10 @@ u32 acpi_ns_local(acpi_object_type type)
|
||||
/* Type code out of range */
|
||||
|
||||
ACPI_WARNING((AE_INFO, "Invalid Object Type 0x%X", type));
|
||||
return_UINT32(ACPI_NS_NORMAL);
|
||||
return_VALUE(ACPI_NS_NORMAL);
|
||||
}
|
||||
|
||||
return_UINT32((u32) acpi_gbl_ns_properties[type] & ACPI_NS_LOCAL);
|
||||
return_VALUE(acpi_gbl_ns_properties[type] & ACPI_NS_LOCAL);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
@ -218,19 +179,19 @@ void acpi_ns_get_internal_name_length(struct acpi_namestring_info *info)
|
||||
*
|
||||
* strlen() + 1 covers the first name_seg, which has no path separator
|
||||
*/
|
||||
if (acpi_ns_valid_root_prefix(*next_external_char)) {
|
||||
if (ACPI_IS_ROOT_PREFIX(*next_external_char)) {
|
||||
info->fully_qualified = TRUE;
|
||||
next_external_char++;
|
||||
|
||||
/* Skip redundant root_prefix, like \\_SB.PCI0.SBRG.EC0 */
|
||||
|
||||
while (acpi_ns_valid_root_prefix(*next_external_char)) {
|
||||
while (ACPI_IS_ROOT_PREFIX(*next_external_char)) {
|
||||
next_external_char++;
|
||||
}
|
||||
} else {
|
||||
/* Handle Carat prefixes */
|
||||
|
||||
while (*next_external_char == '^') {
|
||||
while (ACPI_IS_PARENT_PREFIX(*next_external_char)) {
|
||||
info->num_carats++;
|
||||
next_external_char++;
|
||||
}
|
||||
@ -244,7 +205,7 @@ void acpi_ns_get_internal_name_length(struct acpi_namestring_info *info)
|
||||
if (*next_external_char) {
|
||||
info->num_segments = 1;
|
||||
for (i = 0; next_external_char[i]; i++) {
|
||||
if (acpi_ns_valid_path_separator(next_external_char[i])) {
|
||||
if (ACPI_IS_PATH_SEPARATOR(next_external_char[i])) {
|
||||
info->num_segments++;
|
||||
}
|
||||
}
|
||||
@ -282,7 +243,7 @@ acpi_status acpi_ns_build_internal_name(struct acpi_namestring_info *info)
|
||||
/* Setup the correct prefixes, counts, and pointers */
|
||||
|
||||
if (info->fully_qualified) {
|
||||
internal_name[0] = '\\';
|
||||
internal_name[0] = AML_ROOT_PREFIX;
|
||||
|
||||
if (num_segments <= 1) {
|
||||
result = &internal_name[1];
|
||||
@ -302,7 +263,7 @@ acpi_status acpi_ns_build_internal_name(struct acpi_namestring_info *info)
|
||||
i = 0;
|
||||
if (info->num_carats) {
|
||||
for (i = 0; i < info->num_carats; i++) {
|
||||
internal_name[i] = '^';
|
||||
internal_name[i] = AML_PARENT_PREFIX;
|
||||
}
|
||||
}
|
||||
|
||||
@ -322,7 +283,7 @@ acpi_status acpi_ns_build_internal_name(struct acpi_namestring_info *info)
|
||||
|
||||
for (; num_segments; num_segments--) {
|
||||
for (i = 0; i < ACPI_NAME_SIZE; i++) {
|
||||
if (acpi_ns_valid_path_separator(*external_name) ||
|
||||
if (ACPI_IS_PATH_SEPARATOR(*external_name) ||
|
||||
(*external_name == 0)) {
|
||||
|
||||
/* Pad the segment with underscore(s) if segment is short */
|
||||
@ -339,7 +300,7 @@ acpi_status acpi_ns_build_internal_name(struct acpi_namestring_info *info)
|
||||
|
||||
/* Now we must have a path separator, or the pathname is bad */
|
||||
|
||||
if (!acpi_ns_valid_path_separator(*external_name) &&
|
||||
if (!ACPI_IS_PATH_SEPARATOR(*external_name) &&
|
||||
(*external_name != 0)) {
|
||||
return_ACPI_STATUS(AE_BAD_PATHNAME);
|
||||
}
|
||||
@ -457,13 +418,13 @@ acpi_ns_externalize_name(u32 internal_name_length,
|
||||
/* Check for a prefix (one '\' | one or more '^') */
|
||||
|
||||
switch (internal_name[0]) {
|
||||
case '\\':
|
||||
case AML_ROOT_PREFIX:
|
||||
prefix_length = 1;
|
||||
break;
|
||||
|
||||
case '^':
|
||||
case AML_PARENT_PREFIX:
|
||||
for (i = 0; i < internal_name_length; i++) {
|
||||
if (internal_name[i] == '^') {
|
||||
if (ACPI_IS_PARENT_PREFIX(internal_name[i])) {
|
||||
prefix_length = i + 1;
|
||||
} else {
|
||||
break;
|
||||
@ -664,17 +625,17 @@ void acpi_ns_terminate(void)
|
||||
|
||||
u32 acpi_ns_opens_scope(acpi_object_type type)
|
||||
{
|
||||
ACPI_FUNCTION_TRACE_STR(ns_opens_scope, acpi_ut_get_type_name(type));
|
||||
ACPI_FUNCTION_ENTRY();
|
||||
|
||||
if (!acpi_ut_valid_object_type(type)) {
|
||||
if (type > ACPI_TYPE_LOCAL_MAX) {
|
||||
|
||||
/* type code out of range */
|
||||
|
||||
ACPI_WARNING((AE_INFO, "Invalid Object Type 0x%X", type));
|
||||
return_UINT32(ACPI_NS_NORMAL);
|
||||
return (ACPI_NS_NORMAL);
|
||||
}
|
||||
|
||||
return_UINT32(((u32) acpi_gbl_ns_properties[type]) & ACPI_NS_NEWSCOPE);
|
||||
return (((u32)acpi_gbl_ns_properties[type]) & ACPI_NS_NEWSCOPE);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
@ -710,6 +671,8 @@ acpi_ns_get_node(struct acpi_namespace_node *prefix_node,
|
||||
|
||||
ACPI_FUNCTION_TRACE_PTR(ns_get_node, ACPI_CAST_PTR(char, pathname));
|
||||
|
||||
/* Simplest case is a null pathname */
|
||||
|
||||
if (!pathname) {
|
||||
*return_node = prefix_node;
|
||||
if (!prefix_node) {
|
||||
@ -718,6 +681,13 @@ acpi_ns_get_node(struct acpi_namespace_node *prefix_node,
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
}
|
||||
|
||||
/* Quick check for a reference to the root */
|
||||
|
||||
if (ACPI_IS_ROOT_PREFIX(pathname[0]) && (!pathname[1])) {
|
||||
*return_node = acpi_gbl_root_node;
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
}
|
||||
|
||||
/* Convert path to internal representation */
|
||||
|
||||
status = acpi_ns_internalize_name(pathname, &internal_path);
|
||||
|
@ -76,12 +76,12 @@ struct acpi_namespace_node *acpi_ns_get_next_node(struct acpi_namespace_node
|
||||
|
||||
/* It's really the parent's _scope_ that we want */
|
||||
|
||||
return parent_node->child;
|
||||
return (parent_node->child);
|
||||
}
|
||||
|
||||
/* Otherwise just return the next peer */
|
||||
|
||||
return child_node->peer;
|
||||
return (child_node->peer);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
|
@ -236,7 +236,7 @@ acpi_evaluate_object(acpi_handle handle,
|
||||
* 2) No handle, not fully qualified pathname (error)
|
||||
* 3) Valid handle
|
||||
*/
|
||||
if ((pathname) && (acpi_ns_valid_root_prefix(pathname[0]))) {
|
||||
if ((pathname) && (ACPI_IS_ROOT_PREFIX(pathname[0]))) {
|
||||
|
||||
/* The path is fully qualified, just evaluate by name */
|
||||
|
||||
@ -492,7 +492,7 @@ acpi_walk_namespace(acpi_object_type type,
|
||||
*/
|
||||
status = acpi_ut_acquire_read_lock(&acpi_gbl_namespace_rw_lock);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return status;
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -550,7 +550,7 @@ acpi_ns_get_device_callback(acpi_handle obj_handle,
|
||||
|
||||
status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
return (status);
|
||||
}
|
||||
|
||||
node = acpi_ns_validate_handle(obj_handle);
|
||||
@ -602,17 +602,22 @@ acpi_ns_get_device_callback(acpi_handle obj_handle,
|
||||
|
||||
/* Walk the CID list */
|
||||
|
||||
found = 0;
|
||||
found = FALSE;
|
||||
for (i = 0; i < cid->count; i++) {
|
||||
if (ACPI_STRCMP(cid->ids[i].string, info->hid)
|
||||
== 0) {
|
||||
found = 1;
|
||||
|
||||
/* Found a matching CID */
|
||||
|
||||
found = TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
ACPI_FREE(cid);
|
||||
if (!found)
|
||||
if (!found) {
|
||||
return (AE_OK);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -107,7 +107,7 @@ acpi_get_handle(acpi_handle parent,
|
||||
*
|
||||
* Error for <null Parent + relative path>
|
||||
*/
|
||||
if (acpi_ns_valid_root_prefix(pathname[0])) {
|
||||
if (ACPI_IS_ROOT_PREFIX(pathname[0])) {
|
||||
|
||||
/* Pathname is fully qualified (starts with '\') */
|
||||
|
||||
@ -290,7 +290,7 @@ acpi_get_object_info(acpi_handle handle,
|
||||
|
||||
status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
goto cleanup;
|
||||
return (status);
|
||||
}
|
||||
|
||||
node = acpi_ns_validate_handle(handle);
|
||||
@ -539,14 +539,14 @@ acpi_status acpi_install_method(u8 *buffer)
|
||||
/* Parameter validation */
|
||||
|
||||
if (!buffer) {
|
||||
return AE_BAD_PARAMETER;
|
||||
return (AE_BAD_PARAMETER);
|
||||
}
|
||||
|
||||
/* Table must be a DSDT or SSDT */
|
||||
|
||||
if (!ACPI_COMPARE_NAME(table->signature, ACPI_SIG_DSDT) &&
|
||||
!ACPI_COMPARE_NAME(table->signature, ACPI_SIG_SSDT)) {
|
||||
return AE_BAD_HEADER;
|
||||
return (AE_BAD_HEADER);
|
||||
}
|
||||
|
||||
/* First AML opcode in the table must be a control method */
|
||||
@ -554,7 +554,7 @@ acpi_status acpi_install_method(u8 *buffer)
|
||||
parser_state.aml = buffer + sizeof(struct acpi_table_header);
|
||||
opcode = acpi_ps_peek_opcode(&parser_state);
|
||||
if (opcode != AML_METHOD_OP) {
|
||||
return AE_BAD_PARAMETER;
|
||||
return (AE_BAD_PARAMETER);
|
||||
}
|
||||
|
||||
/* Extract method information from the raw AML */
|
||||
@ -572,13 +572,13 @@ acpi_status acpi_install_method(u8 *buffer)
|
||||
*/
|
||||
aml_buffer = ACPI_ALLOCATE(aml_length);
|
||||
if (!aml_buffer) {
|
||||
return AE_NO_MEMORY;
|
||||
return (AE_NO_MEMORY);
|
||||
}
|
||||
|
||||
method_obj = acpi_ut_create_internal_object(ACPI_TYPE_METHOD);
|
||||
if (!method_obj) {
|
||||
ACPI_FREE(aml_buffer);
|
||||
return AE_NO_MEMORY;
|
||||
return (AE_NO_MEMORY);
|
||||
}
|
||||
|
||||
/* Lock namespace for acpi_ns_lookup, we may be creating a new node */
|
||||
@ -644,12 +644,12 @@ acpi_status acpi_install_method(u8 *buffer)
|
||||
/* Remove local reference to the method object */
|
||||
|
||||
acpi_ut_remove_reference(method_obj);
|
||||
return status;
|
||||
return (status);
|
||||
|
||||
error_exit:
|
||||
|
||||
ACPI_FREE(aml_buffer);
|
||||
ACPI_FREE(method_obj);
|
||||
return status;
|
||||
return (status);
|
||||
}
|
||||
ACPI_EXPORT_SYMBOL(acpi_install_method)
|
||||
|
@ -108,7 +108,7 @@ acpi_ps_get_next_package_length(struct acpi_parse_state *parser_state)
|
||||
/* Byte 0 is a special case, either bits [0:3] or [0:5] are used */
|
||||
|
||||
package_length |= (aml[0] & byte_zero_mask);
|
||||
return_UINT32(package_length);
|
||||
return_VALUE(package_length);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
@ -162,7 +162,7 @@ char *acpi_ps_get_next_namestring(struct acpi_parse_state *parser_state)
|
||||
|
||||
/* Point past any namestring prefix characters (backslash or carat) */
|
||||
|
||||
while (acpi_ps_is_prefix_char(*end)) {
|
||||
while (ACPI_IS_ROOT_PREFIX(*end) || ACPI_IS_PARENT_PREFIX(*end)) {
|
||||
end++;
|
||||
}
|
||||
|
||||
@ -798,7 +798,8 @@ acpi_ps_get_next_arg(struct acpi_walk_state *walk_state,
|
||||
subop = acpi_ps_peek_opcode(parser_state);
|
||||
if (subop == 0 ||
|
||||
acpi_ps_is_leading_char(subop) ||
|
||||
acpi_ps_is_prefix_char(subop)) {
|
||||
ACPI_IS_ROOT_PREFIX(subop) ||
|
||||
ACPI_IS_PARENT_PREFIX(subop)) {
|
||||
|
||||
/* null_name or name_string */
|
||||
|
||||
|
@ -58,350 +58,15 @@
|
||||
#define _COMPONENT ACPI_PARSER
|
||||
ACPI_MODULE_NAME("psloop")
|
||||
|
||||
static u32 acpi_gbl_depth = 0;
|
||||
|
||||
/* Local prototypes */
|
||||
|
||||
static acpi_status acpi_ps_get_aml_opcode(struct acpi_walk_state *walk_state);
|
||||
|
||||
static acpi_status
|
||||
acpi_ps_build_named_op(struct acpi_walk_state *walk_state,
|
||||
u8 * aml_op_start,
|
||||
union acpi_parse_object *unnamed_op,
|
||||
union acpi_parse_object **op);
|
||||
|
||||
static acpi_status
|
||||
acpi_ps_create_op(struct acpi_walk_state *walk_state,
|
||||
u8 * aml_op_start, union acpi_parse_object **new_op);
|
||||
|
||||
static acpi_status
|
||||
acpi_ps_get_arguments(struct acpi_walk_state *walk_state,
|
||||
u8 * aml_op_start, union acpi_parse_object *op);
|
||||
|
||||
static acpi_status
|
||||
acpi_ps_complete_op(struct acpi_walk_state *walk_state,
|
||||
union acpi_parse_object **op, acpi_status status);
|
||||
|
||||
static acpi_status
|
||||
acpi_ps_complete_final_op(struct acpi_walk_state *walk_state,
|
||||
union acpi_parse_object *op, acpi_status status);
|
||||
|
||||
static void
|
||||
acpi_ps_link_module_code(union acpi_parse_object *parent_op,
|
||||
u8 *aml_start, u32 aml_length, acpi_owner_id owner_id);
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ps_get_aml_opcode
|
||||
*
|
||||
* PARAMETERS: walk_state - Current state
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Extract the next AML opcode from the input stream.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
static acpi_status acpi_ps_get_aml_opcode(struct acpi_walk_state *walk_state)
|
||||
{
|
||||
|
||||
ACPI_FUNCTION_TRACE_PTR(ps_get_aml_opcode, walk_state);
|
||||
|
||||
walk_state->aml_offset =
|
||||
(u32) ACPI_PTR_DIFF(walk_state->parser_state.aml,
|
||||
walk_state->parser_state.aml_start);
|
||||
walk_state->opcode = acpi_ps_peek_opcode(&(walk_state->parser_state));
|
||||
|
||||
/*
|
||||
* First cut to determine what we have found:
|
||||
* 1) A valid AML opcode
|
||||
* 2) A name string
|
||||
* 3) An unknown/invalid opcode
|
||||
*/
|
||||
walk_state->op_info = acpi_ps_get_opcode_info(walk_state->opcode);
|
||||
|
||||
switch (walk_state->op_info->class) {
|
||||
case AML_CLASS_ASCII:
|
||||
case AML_CLASS_PREFIX:
|
||||
/*
|
||||
* Starts with a valid prefix or ASCII char, this is a name
|
||||
* string. Convert the bare name string to a namepath.
|
||||
*/
|
||||
walk_state->opcode = AML_INT_NAMEPATH_OP;
|
||||
walk_state->arg_types = ARGP_NAMESTRING;
|
||||
break;
|
||||
|
||||
case AML_CLASS_UNKNOWN:
|
||||
|
||||
/* The opcode is unrecognized. Complain and skip unknown opcodes */
|
||||
|
||||
if (walk_state->pass_number == 2) {
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"Unknown opcode 0x%.2X at table offset 0x%.4X, ignoring",
|
||||
walk_state->opcode,
|
||||
(u32)(walk_state->aml_offset +
|
||||
sizeof(struct acpi_table_header))));
|
||||
|
||||
ACPI_DUMP_BUFFER(walk_state->parser_state.aml - 16, 48);
|
||||
|
||||
#ifdef ACPI_ASL_COMPILER
|
||||
/*
|
||||
* This is executed for the disassembler only. Output goes
|
||||
* to the disassembled ASL output file.
|
||||
*/
|
||||
acpi_os_printf
|
||||
("/*\nError: Unknown opcode 0x%.2X at table offset 0x%.4X, context:\n",
|
||||
walk_state->opcode,
|
||||
(u32)(walk_state->aml_offset +
|
||||
sizeof(struct acpi_table_header)));
|
||||
|
||||
/* Dump the context surrounding the invalid opcode */
|
||||
|
||||
acpi_ut_dump_buffer(((u8 *)walk_state->parser_state.
|
||||
aml - 16), 48, DB_BYTE_DISPLAY,
|
||||
walk_state->aml_offset +
|
||||
sizeof(struct acpi_table_header) -
|
||||
16);
|
||||
acpi_os_printf(" */\n");
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Increment past one-byte or two-byte opcode */
|
||||
|
||||
walk_state->parser_state.aml++;
|
||||
if (walk_state->opcode > 0xFF) { /* Can only happen if first byte is 0x5B */
|
||||
walk_state->parser_state.aml++;
|
||||
}
|
||||
|
||||
return_ACPI_STATUS(AE_CTRL_PARSE_CONTINUE);
|
||||
|
||||
default:
|
||||
|
||||
/* Found opcode info, this is a normal opcode */
|
||||
|
||||
walk_state->parser_state.aml +=
|
||||
acpi_ps_get_opcode_size(walk_state->opcode);
|
||||
walk_state->arg_types = walk_state->op_info->parse_args;
|
||||
break;
|
||||
}
|
||||
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ps_build_named_op
|
||||
*
|
||||
* PARAMETERS: walk_state - Current state
|
||||
* aml_op_start - Begin of named Op in AML
|
||||
* unnamed_op - Early Op (not a named Op)
|
||||
* op - Returned Op
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Parse a named Op
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
static acpi_status
|
||||
acpi_ps_build_named_op(struct acpi_walk_state *walk_state,
|
||||
u8 * aml_op_start,
|
||||
union acpi_parse_object *unnamed_op,
|
||||
union acpi_parse_object **op)
|
||||
{
|
||||
acpi_status status = AE_OK;
|
||||
union acpi_parse_object *arg = NULL;
|
||||
|
||||
ACPI_FUNCTION_TRACE_PTR(ps_build_named_op, walk_state);
|
||||
|
||||
unnamed_op->common.value.arg = NULL;
|
||||
unnamed_op->common.arg_list_length = 0;
|
||||
unnamed_op->common.aml_opcode = walk_state->opcode;
|
||||
|
||||
/*
|
||||
* Get and append arguments until we find the node that contains
|
||||
* the name (the type ARGP_NAME).
|
||||
*/
|
||||
while (GET_CURRENT_ARG_TYPE(walk_state->arg_types) &&
|
||||
(GET_CURRENT_ARG_TYPE(walk_state->arg_types) != ARGP_NAME)) {
|
||||
status =
|
||||
acpi_ps_get_next_arg(walk_state,
|
||||
&(walk_state->parser_state),
|
||||
GET_CURRENT_ARG_TYPE(walk_state->
|
||||
arg_types), &arg);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
acpi_ps_append_arg(unnamed_op, arg);
|
||||
INCREMENT_ARG_LIST(walk_state->arg_types);
|
||||
}
|
||||
|
||||
/*
|
||||
* Make sure that we found a NAME and didn't run out of arguments
|
||||
*/
|
||||
if (!GET_CURRENT_ARG_TYPE(walk_state->arg_types)) {
|
||||
return_ACPI_STATUS(AE_AML_NO_OPERAND);
|
||||
}
|
||||
|
||||
/* We know that this arg is a name, move to next arg */
|
||||
|
||||
INCREMENT_ARG_LIST(walk_state->arg_types);
|
||||
|
||||
/*
|
||||
* Find the object. This will either insert the object into
|
||||
* the namespace or simply look it up
|
||||
*/
|
||||
walk_state->op = NULL;
|
||||
|
||||
status = walk_state->descending_callback(walk_state, op);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
ACPI_EXCEPTION((AE_INFO, status, "During name lookup/catalog"));
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
if (!*op) {
|
||||
return_ACPI_STATUS(AE_CTRL_PARSE_CONTINUE);
|
||||
}
|
||||
|
||||
status = acpi_ps_next_parse_state(walk_state, *op, status);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
if (status == AE_CTRL_PENDING) {
|
||||
return_ACPI_STATUS(AE_CTRL_PARSE_PENDING);
|
||||
}
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
acpi_ps_append_arg(*op, unnamed_op->common.value.arg);
|
||||
acpi_gbl_depth++;
|
||||
|
||||
if ((*op)->common.aml_opcode == AML_REGION_OP ||
|
||||
(*op)->common.aml_opcode == AML_DATA_REGION_OP) {
|
||||
/*
|
||||
* Defer final parsing of an operation_region body, because we don't
|
||||
* have enough info in the first pass to parse it correctly (i.e.,
|
||||
* there may be method calls within the term_arg elements of the body.)
|
||||
*
|
||||
* However, we must continue parsing because the opregion is not a
|
||||
* standalone package -- we don't know where the end is at this point.
|
||||
*
|
||||
* (Length is unknown until parse of the body complete)
|
||||
*/
|
||||
(*op)->named.data = aml_op_start;
|
||||
(*op)->named.length = 0;
|
||||
}
|
||||
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ps_create_op
|
||||
*
|
||||
* PARAMETERS: walk_state - Current state
|
||||
* aml_op_start - Op start in AML
|
||||
* new_op - Returned Op
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Get Op from AML
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
static acpi_status
|
||||
acpi_ps_create_op(struct acpi_walk_state *walk_state,
|
||||
u8 * aml_op_start, union acpi_parse_object **new_op)
|
||||
{
|
||||
acpi_status status = AE_OK;
|
||||
union acpi_parse_object *op;
|
||||
union acpi_parse_object *named_op = NULL;
|
||||
union acpi_parse_object *parent_scope;
|
||||
u8 argument_count;
|
||||
const struct acpi_opcode_info *op_info;
|
||||
|
||||
ACPI_FUNCTION_TRACE_PTR(ps_create_op, walk_state);
|
||||
|
||||
status = acpi_ps_get_aml_opcode(walk_state);
|
||||
if (status == AE_CTRL_PARSE_CONTINUE) {
|
||||
return_ACPI_STATUS(AE_CTRL_PARSE_CONTINUE);
|
||||
}
|
||||
|
||||
/* Create Op structure and append to parent's argument list */
|
||||
|
||||
walk_state->op_info = acpi_ps_get_opcode_info(walk_state->opcode);
|
||||
op = acpi_ps_alloc_op(walk_state->opcode);
|
||||
if (!op) {
|
||||
return_ACPI_STATUS(AE_NO_MEMORY);
|
||||
}
|
||||
|
||||
if (walk_state->op_info->flags & AML_NAMED) {
|
||||
status =
|
||||
acpi_ps_build_named_op(walk_state, aml_op_start, op,
|
||||
&named_op);
|
||||
acpi_ps_free_op(op);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
*new_op = named_op;
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
}
|
||||
|
||||
/* Not a named opcode, just allocate Op and append to parent */
|
||||
|
||||
if (walk_state->op_info->flags & AML_CREATE) {
|
||||
/*
|
||||
* Backup to beginning of create_XXXfield declaration
|
||||
* body_length is unknown until we parse the body
|
||||
*/
|
||||
op->named.data = aml_op_start;
|
||||
op->named.length = 0;
|
||||
}
|
||||
|
||||
if (walk_state->opcode == AML_BANK_FIELD_OP) {
|
||||
/*
|
||||
* Backup to beginning of bank_field declaration
|
||||
* body_length is unknown until we parse the body
|
||||
*/
|
||||
op->named.data = aml_op_start;
|
||||
op->named.length = 0;
|
||||
}
|
||||
|
||||
parent_scope = acpi_ps_get_parent_scope(&(walk_state->parser_state));
|
||||
acpi_ps_append_arg(parent_scope, op);
|
||||
|
||||
if (parent_scope) {
|
||||
op_info =
|
||||
acpi_ps_get_opcode_info(parent_scope->common.aml_opcode);
|
||||
if (op_info->flags & AML_HAS_TARGET) {
|
||||
argument_count =
|
||||
acpi_ps_get_argument_count(op_info->type);
|
||||
if (parent_scope->common.arg_list_length >
|
||||
argument_count) {
|
||||
op->common.flags |= ACPI_PARSEOP_TARGET;
|
||||
}
|
||||
} else if (parent_scope->common.aml_opcode == AML_INCREMENT_OP) {
|
||||
op->common.flags |= ACPI_PARSEOP_TARGET;
|
||||
}
|
||||
}
|
||||
|
||||
if (walk_state->descending_callback != NULL) {
|
||||
/*
|
||||
* Find the object. This will either insert the object into
|
||||
* the namespace or simply look it up
|
||||
*/
|
||||
walk_state->op = *new_op = op;
|
||||
|
||||
status = walk_state->descending_callback(walk_state, &op);
|
||||
status = acpi_ps_next_parse_state(walk_state, op, status);
|
||||
if (status == AE_CTRL_PENDING) {
|
||||
status = AE_CTRL_PARSE_PENDING;
|
||||
}
|
||||
}
|
||||
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ps_get_arguments
|
||||
@ -709,288 +374,6 @@ acpi_ps_link_module_code(union acpi_parse_object *parent_op,
|
||||
}
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ps_complete_op
|
||||
*
|
||||
* PARAMETERS: walk_state - Current state
|
||||
* op - Returned Op
|
||||
* status - Parse status before complete Op
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Complete Op
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
static acpi_status
|
||||
acpi_ps_complete_op(struct acpi_walk_state *walk_state,
|
||||
union acpi_parse_object **op, acpi_status status)
|
||||
{
|
||||
acpi_status status2;
|
||||
|
||||
ACPI_FUNCTION_TRACE_PTR(ps_complete_op, walk_state);
|
||||
|
||||
/*
|
||||
* Finished one argument of the containing scope
|
||||
*/
|
||||
walk_state->parser_state.scope->parse_scope.arg_count--;
|
||||
|
||||
/* Close this Op (will result in parse subtree deletion) */
|
||||
|
||||
status2 = acpi_ps_complete_this_op(walk_state, *op);
|
||||
if (ACPI_FAILURE(status2)) {
|
||||
return_ACPI_STATUS(status2);
|
||||
}
|
||||
|
||||
*op = NULL;
|
||||
|
||||
switch (status) {
|
||||
case AE_OK:
|
||||
break;
|
||||
|
||||
case AE_CTRL_TRANSFER:
|
||||
|
||||
/* We are about to transfer to a called method */
|
||||
|
||||
walk_state->prev_op = NULL;
|
||||
walk_state->prev_arg_types = walk_state->arg_types;
|
||||
return_ACPI_STATUS(status);
|
||||
|
||||
case AE_CTRL_END:
|
||||
|
||||
acpi_ps_pop_scope(&(walk_state->parser_state), op,
|
||||
&walk_state->arg_types,
|
||||
&walk_state->arg_count);
|
||||
|
||||
if (*op) {
|
||||
walk_state->op = *op;
|
||||
walk_state->op_info =
|
||||
acpi_ps_get_opcode_info((*op)->common.aml_opcode);
|
||||
walk_state->opcode = (*op)->common.aml_opcode;
|
||||
|
||||
status = walk_state->ascending_callback(walk_state);
|
||||
status =
|
||||
acpi_ps_next_parse_state(walk_state, *op, status);
|
||||
|
||||
status2 = acpi_ps_complete_this_op(walk_state, *op);
|
||||
if (ACPI_FAILURE(status2)) {
|
||||
return_ACPI_STATUS(status2);
|
||||
}
|
||||
}
|
||||
|
||||
status = AE_OK;
|
||||
break;
|
||||
|
||||
case AE_CTRL_BREAK:
|
||||
case AE_CTRL_CONTINUE:
|
||||
|
||||
/* Pop off scopes until we find the While */
|
||||
|
||||
while (!(*op) || ((*op)->common.aml_opcode != AML_WHILE_OP)) {
|
||||
acpi_ps_pop_scope(&(walk_state->parser_state), op,
|
||||
&walk_state->arg_types,
|
||||
&walk_state->arg_count);
|
||||
}
|
||||
|
||||
/* Close this iteration of the While loop */
|
||||
|
||||
walk_state->op = *op;
|
||||
walk_state->op_info =
|
||||
acpi_ps_get_opcode_info((*op)->common.aml_opcode);
|
||||
walk_state->opcode = (*op)->common.aml_opcode;
|
||||
|
||||
status = walk_state->ascending_callback(walk_state);
|
||||
status = acpi_ps_next_parse_state(walk_state, *op, status);
|
||||
|
||||
status2 = acpi_ps_complete_this_op(walk_state, *op);
|
||||
if (ACPI_FAILURE(status2)) {
|
||||
return_ACPI_STATUS(status2);
|
||||
}
|
||||
|
||||
status = AE_OK;
|
||||
break;
|
||||
|
||||
case AE_CTRL_TERMINATE:
|
||||
|
||||
/* Clean up */
|
||||
do {
|
||||
if (*op) {
|
||||
status2 =
|
||||
acpi_ps_complete_this_op(walk_state, *op);
|
||||
if (ACPI_FAILURE(status2)) {
|
||||
return_ACPI_STATUS(status2);
|
||||
}
|
||||
|
||||
acpi_ut_delete_generic_state
|
||||
(acpi_ut_pop_generic_state
|
||||
(&walk_state->control_state));
|
||||
}
|
||||
|
||||
acpi_ps_pop_scope(&(walk_state->parser_state), op,
|
||||
&walk_state->arg_types,
|
||||
&walk_state->arg_count);
|
||||
|
||||
} while (*op);
|
||||
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
|
||||
default: /* All other non-AE_OK status */
|
||||
|
||||
do {
|
||||
if (*op) {
|
||||
status2 =
|
||||
acpi_ps_complete_this_op(walk_state, *op);
|
||||
if (ACPI_FAILURE(status2)) {
|
||||
return_ACPI_STATUS(status2);
|
||||
}
|
||||
}
|
||||
|
||||
acpi_ps_pop_scope(&(walk_state->parser_state), op,
|
||||
&walk_state->arg_types,
|
||||
&walk_state->arg_count);
|
||||
|
||||
} while (*op);
|
||||
|
||||
#if 0
|
||||
/*
|
||||
* TBD: Cleanup parse ops on error
|
||||
*/
|
||||
if (*op == NULL) {
|
||||
acpi_ps_pop_scope(parser_state, op,
|
||||
&walk_state->arg_types,
|
||||
&walk_state->arg_count);
|
||||
}
|
||||
#endif
|
||||
walk_state->prev_op = NULL;
|
||||
walk_state->prev_arg_types = walk_state->arg_types;
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
/* This scope complete? */
|
||||
|
||||
if (acpi_ps_has_completed_scope(&(walk_state->parser_state))) {
|
||||
acpi_ps_pop_scope(&(walk_state->parser_state), op,
|
||||
&walk_state->arg_types,
|
||||
&walk_state->arg_count);
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_PARSE, "Popped scope, Op=%p\n", *op));
|
||||
} else {
|
||||
*op = NULL;
|
||||
}
|
||||
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ps_complete_final_op
|
||||
*
|
||||
* PARAMETERS: walk_state - Current state
|
||||
* op - Current Op
|
||||
* status - Current parse status before complete last
|
||||
* Op
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Complete last Op.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
static acpi_status
|
||||
acpi_ps_complete_final_op(struct acpi_walk_state *walk_state,
|
||||
union acpi_parse_object *op, acpi_status status)
|
||||
{
|
||||
acpi_status status2;
|
||||
|
||||
ACPI_FUNCTION_TRACE_PTR(ps_complete_final_op, walk_state);
|
||||
|
||||
/*
|
||||
* Complete the last Op (if not completed), and clear the scope stack.
|
||||
* It is easily possible to end an AML "package" with an unbounded number
|
||||
* of open scopes (such as when several ASL blocks are closed with
|
||||
* sequential closing braces). We want to terminate each one cleanly.
|
||||
*/
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_PARSE, "AML package complete at Op %p\n",
|
||||
op));
|
||||
do {
|
||||
if (op) {
|
||||
if (walk_state->ascending_callback != NULL) {
|
||||
walk_state->op = op;
|
||||
walk_state->op_info =
|
||||
acpi_ps_get_opcode_info(op->common.
|
||||
aml_opcode);
|
||||
walk_state->opcode = op->common.aml_opcode;
|
||||
|
||||
status =
|
||||
walk_state->ascending_callback(walk_state);
|
||||
status =
|
||||
acpi_ps_next_parse_state(walk_state, op,
|
||||
status);
|
||||
if (status == AE_CTRL_PENDING) {
|
||||
status =
|
||||
acpi_ps_complete_op(walk_state, &op,
|
||||
AE_OK);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
}
|
||||
|
||||
if (status == AE_CTRL_TERMINATE) {
|
||||
status = AE_OK;
|
||||
|
||||
/* Clean up */
|
||||
do {
|
||||
if (op) {
|
||||
status2 =
|
||||
acpi_ps_complete_this_op
|
||||
(walk_state, op);
|
||||
if (ACPI_FAILURE
|
||||
(status2)) {
|
||||
return_ACPI_STATUS
|
||||
(status2);
|
||||
}
|
||||
}
|
||||
|
||||
acpi_ps_pop_scope(&
|
||||
(walk_state->
|
||||
parser_state),
|
||||
&op,
|
||||
&walk_state->
|
||||
arg_types,
|
||||
&walk_state->
|
||||
arg_count);
|
||||
|
||||
} while (op);
|
||||
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
else if (ACPI_FAILURE(status)) {
|
||||
|
||||
/* First error is most important */
|
||||
|
||||
(void)
|
||||
acpi_ps_complete_this_op(walk_state,
|
||||
op);
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
}
|
||||
|
||||
status2 = acpi_ps_complete_this_op(walk_state, op);
|
||||
if (ACPI_FAILURE(status2)) {
|
||||
return_ACPI_STATUS(status2);
|
||||
}
|
||||
}
|
||||
|
||||
acpi_ps_pop_scope(&(walk_state->parser_state), &op,
|
||||
&walk_state->arg_types,
|
||||
&walk_state->arg_count);
|
||||
|
||||
} while (op);
|
||||
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ps_parse_loop
|
||||
@ -1177,10 +560,6 @@ acpi_status acpi_ps_parse_loop(struct acpi_walk_state *walk_state)
|
||||
walk_state->op_info =
|
||||
acpi_ps_get_opcode_info(op->common.aml_opcode);
|
||||
if (walk_state->op_info->flags & AML_NAMED) {
|
||||
if (acpi_gbl_depth) {
|
||||
acpi_gbl_depth--;
|
||||
}
|
||||
|
||||
if (op->common.aml_opcode == AML_REGION_OP ||
|
||||
op->common.aml_opcode == AML_DATA_REGION_OP) {
|
||||
/*
|
||||
|
647
drivers/acpi/acpica/psobject.c
Normal file
647
drivers/acpi/acpica/psobject.c
Normal file
@ -0,0 +1,647 @@
|
||||
/******************************************************************************
|
||||
*
|
||||
* Module Name: psobject - Support for parse objects
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2000 - 2012, Intel Corp.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions, and the following disclaimer,
|
||||
* without modification.
|
||||
* 2. Redistributions in binary form must reproduce at minimum a disclaimer
|
||||
* substantially similar to the "NO WARRANTY" disclaimer below
|
||||
* ("Disclaimer") and any redistribution must be conditioned upon
|
||||
* including a substantially similar Disclaimer requirement for further
|
||||
* binary redistribution.
|
||||
* 3. Neither the names of the above-listed copyright holders nor the names
|
||||
* of any contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* Alternatively, this software may be distributed under the terms of the
|
||||
* GNU General Public License ("GPL") version 2 as published by the Free
|
||||
* Software Foundation.
|
||||
*
|
||||
* NO WARRANTY
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGES.
|
||||
*/
|
||||
|
||||
#include <acpi/acpi.h>
|
||||
#include "accommon.h"
|
||||
#include "acparser.h"
|
||||
#include "amlcode.h"
|
||||
|
||||
#define _COMPONENT ACPI_PARSER
|
||||
ACPI_MODULE_NAME("psobject")
|
||||
|
||||
/* Local prototypes */
|
||||
static acpi_status acpi_ps_get_aml_opcode(struct acpi_walk_state *walk_state);
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ps_get_aml_opcode
|
||||
*
|
||||
* PARAMETERS: walk_state - Current state
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Extract the next AML opcode from the input stream.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
static acpi_status acpi_ps_get_aml_opcode(struct acpi_walk_state *walk_state)
|
||||
{
|
||||
|
||||
ACPI_FUNCTION_TRACE_PTR(ps_get_aml_opcode, walk_state);
|
||||
|
||||
walk_state->aml_offset =
|
||||
(u32)ACPI_PTR_DIFF(walk_state->parser_state.aml,
|
||||
walk_state->parser_state.aml_start);
|
||||
walk_state->opcode = acpi_ps_peek_opcode(&(walk_state->parser_state));
|
||||
|
||||
/*
|
||||
* First cut to determine what we have found:
|
||||
* 1) A valid AML opcode
|
||||
* 2) A name string
|
||||
* 3) An unknown/invalid opcode
|
||||
*/
|
||||
walk_state->op_info = acpi_ps_get_opcode_info(walk_state->opcode);
|
||||
|
||||
switch (walk_state->op_info->class) {
|
||||
case AML_CLASS_ASCII:
|
||||
case AML_CLASS_PREFIX:
|
||||
/*
|
||||
* Starts with a valid prefix or ASCII char, this is a name
|
||||
* string. Convert the bare name string to a namepath.
|
||||
*/
|
||||
walk_state->opcode = AML_INT_NAMEPATH_OP;
|
||||
walk_state->arg_types = ARGP_NAMESTRING;
|
||||
break;
|
||||
|
||||
case AML_CLASS_UNKNOWN:
|
||||
|
||||
/* The opcode is unrecognized. Complain and skip unknown opcodes */
|
||||
|
||||
if (walk_state->pass_number == 2) {
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"Unknown opcode 0x%.2X at table offset 0x%.4X, ignoring",
|
||||
walk_state->opcode,
|
||||
(u32)(walk_state->aml_offset +
|
||||
sizeof(struct acpi_table_header))));
|
||||
|
||||
ACPI_DUMP_BUFFER((walk_state->parser_state.aml - 16),
|
||||
48);
|
||||
|
||||
#ifdef ACPI_ASL_COMPILER
|
||||
/*
|
||||
* This is executed for the disassembler only. Output goes
|
||||
* to the disassembled ASL output file.
|
||||
*/
|
||||
acpi_os_printf
|
||||
("/*\nError: Unknown opcode 0x%.2X at table offset 0x%.4X, context:\n",
|
||||
walk_state->opcode,
|
||||
(u32)(walk_state->aml_offset +
|
||||
sizeof(struct acpi_table_header)));
|
||||
|
||||
/* Dump the context surrounding the invalid opcode */
|
||||
|
||||
acpi_ut_dump_buffer(((u8 *)walk_state->parser_state.
|
||||
aml - 16), 48, DB_BYTE_DISPLAY,
|
||||
(walk_state->aml_offset +
|
||||
sizeof(struct acpi_table_header) -
|
||||
16));
|
||||
acpi_os_printf(" */\n");
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Increment past one-byte or two-byte opcode */
|
||||
|
||||
walk_state->parser_state.aml++;
|
||||
if (walk_state->opcode > 0xFF) { /* Can only happen if first byte is 0x5B */
|
||||
walk_state->parser_state.aml++;
|
||||
}
|
||||
|
||||
return_ACPI_STATUS(AE_CTRL_PARSE_CONTINUE);
|
||||
|
||||
default:
|
||||
|
||||
/* Found opcode info, this is a normal opcode */
|
||||
|
||||
walk_state->parser_state.aml +=
|
||||
acpi_ps_get_opcode_size(walk_state->opcode);
|
||||
walk_state->arg_types = walk_state->op_info->parse_args;
|
||||
break;
|
||||
}
|
||||
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ps_build_named_op
|
||||
*
|
||||
* PARAMETERS: walk_state - Current state
|
||||
* aml_op_start - Begin of named Op in AML
|
||||
* unnamed_op - Early Op (not a named Op)
|
||||
* op - Returned Op
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Parse a named Op
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status
|
||||
acpi_ps_build_named_op(struct acpi_walk_state *walk_state,
|
||||
u8 *aml_op_start,
|
||||
union acpi_parse_object *unnamed_op,
|
||||
union acpi_parse_object **op)
|
||||
{
|
||||
acpi_status status = AE_OK;
|
||||
union acpi_parse_object *arg = NULL;
|
||||
|
||||
ACPI_FUNCTION_TRACE_PTR(ps_build_named_op, walk_state);
|
||||
|
||||
unnamed_op->common.value.arg = NULL;
|
||||
unnamed_op->common.arg_list_length = 0;
|
||||
unnamed_op->common.aml_opcode = walk_state->opcode;
|
||||
|
||||
/*
|
||||
* Get and append arguments until we find the node that contains
|
||||
* the name (the type ARGP_NAME).
|
||||
*/
|
||||
while (GET_CURRENT_ARG_TYPE(walk_state->arg_types) &&
|
||||
(GET_CURRENT_ARG_TYPE(walk_state->arg_types) != ARGP_NAME)) {
|
||||
status =
|
||||
acpi_ps_get_next_arg(walk_state,
|
||||
&(walk_state->parser_state),
|
||||
GET_CURRENT_ARG_TYPE(walk_state->
|
||||
arg_types), &arg);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
acpi_ps_append_arg(unnamed_op, arg);
|
||||
INCREMENT_ARG_LIST(walk_state->arg_types);
|
||||
}
|
||||
|
||||
/*
|
||||
* Make sure that we found a NAME and didn't run out of arguments
|
||||
*/
|
||||
if (!GET_CURRENT_ARG_TYPE(walk_state->arg_types)) {
|
||||
return_ACPI_STATUS(AE_AML_NO_OPERAND);
|
||||
}
|
||||
|
||||
/* We know that this arg is a name, move to next arg */
|
||||
|
||||
INCREMENT_ARG_LIST(walk_state->arg_types);
|
||||
|
||||
/*
|
||||
* Find the object. This will either insert the object into
|
||||
* the namespace or simply look it up
|
||||
*/
|
||||
walk_state->op = NULL;
|
||||
|
||||
status = walk_state->descending_callback(walk_state, op);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
ACPI_EXCEPTION((AE_INFO, status, "During name lookup/catalog"));
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
if (!*op) {
|
||||
return_ACPI_STATUS(AE_CTRL_PARSE_CONTINUE);
|
||||
}
|
||||
|
||||
status = acpi_ps_next_parse_state(walk_state, *op, status);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
if (status == AE_CTRL_PENDING) {
|
||||
return_ACPI_STATUS(AE_CTRL_PARSE_PENDING);
|
||||
}
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
acpi_ps_append_arg(*op, unnamed_op->common.value.arg);
|
||||
|
||||
if ((*op)->common.aml_opcode == AML_REGION_OP ||
|
||||
(*op)->common.aml_opcode == AML_DATA_REGION_OP) {
|
||||
/*
|
||||
* Defer final parsing of an operation_region body, because we don't
|
||||
* have enough info in the first pass to parse it correctly (i.e.,
|
||||
* there may be method calls within the term_arg elements of the body.)
|
||||
*
|
||||
* However, we must continue parsing because the opregion is not a
|
||||
* standalone package -- we don't know where the end is at this point.
|
||||
*
|
||||
* (Length is unknown until parse of the body complete)
|
||||
*/
|
||||
(*op)->named.data = aml_op_start;
|
||||
(*op)->named.length = 0;
|
||||
}
|
||||
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ps_create_op
|
||||
*
|
||||
* PARAMETERS: walk_state - Current state
|
||||
* aml_op_start - Op start in AML
|
||||
* new_op - Returned Op
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Get Op from AML
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status
|
||||
acpi_ps_create_op(struct acpi_walk_state *walk_state,
|
||||
u8 *aml_op_start, union acpi_parse_object **new_op)
|
||||
{
|
||||
acpi_status status = AE_OK;
|
||||
union acpi_parse_object *op;
|
||||
union acpi_parse_object *named_op = NULL;
|
||||
union acpi_parse_object *parent_scope;
|
||||
u8 argument_count;
|
||||
const struct acpi_opcode_info *op_info;
|
||||
|
||||
ACPI_FUNCTION_TRACE_PTR(ps_create_op, walk_state);
|
||||
|
||||
status = acpi_ps_get_aml_opcode(walk_state);
|
||||
if (status == AE_CTRL_PARSE_CONTINUE) {
|
||||
return_ACPI_STATUS(AE_CTRL_PARSE_CONTINUE);
|
||||
}
|
||||
|
||||
/* Create Op structure and append to parent's argument list */
|
||||
|
||||
walk_state->op_info = acpi_ps_get_opcode_info(walk_state->opcode);
|
||||
op = acpi_ps_alloc_op(walk_state->opcode);
|
||||
if (!op) {
|
||||
return_ACPI_STATUS(AE_NO_MEMORY);
|
||||
}
|
||||
|
||||
if (walk_state->op_info->flags & AML_NAMED) {
|
||||
status =
|
||||
acpi_ps_build_named_op(walk_state, aml_op_start, op,
|
||||
&named_op);
|
||||
acpi_ps_free_op(op);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
*new_op = named_op;
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
}
|
||||
|
||||
/* Not a named opcode, just allocate Op and append to parent */
|
||||
|
||||
if (walk_state->op_info->flags & AML_CREATE) {
|
||||
/*
|
||||
* Backup to beginning of create_XXXfield declaration
|
||||
* body_length is unknown until we parse the body
|
||||
*/
|
||||
op->named.data = aml_op_start;
|
||||
op->named.length = 0;
|
||||
}
|
||||
|
||||
if (walk_state->opcode == AML_BANK_FIELD_OP) {
|
||||
/*
|
||||
* Backup to beginning of bank_field declaration
|
||||
* body_length is unknown until we parse the body
|
||||
*/
|
||||
op->named.data = aml_op_start;
|
||||
op->named.length = 0;
|
||||
}
|
||||
|
||||
parent_scope = acpi_ps_get_parent_scope(&(walk_state->parser_state));
|
||||
acpi_ps_append_arg(parent_scope, op);
|
||||
|
||||
if (parent_scope) {
|
||||
op_info =
|
||||
acpi_ps_get_opcode_info(parent_scope->common.aml_opcode);
|
||||
if (op_info->flags & AML_HAS_TARGET) {
|
||||
argument_count =
|
||||
acpi_ps_get_argument_count(op_info->type);
|
||||
if (parent_scope->common.arg_list_length >
|
||||
argument_count) {
|
||||
op->common.flags |= ACPI_PARSEOP_TARGET;
|
||||
}
|
||||
} else if (parent_scope->common.aml_opcode == AML_INCREMENT_OP) {
|
||||
op->common.flags |= ACPI_PARSEOP_TARGET;
|
||||
}
|
||||
}
|
||||
|
||||
if (walk_state->descending_callback != NULL) {
|
||||
/*
|
||||
* Find the object. This will either insert the object into
|
||||
* the namespace or simply look it up
|
||||
*/
|
||||
walk_state->op = *new_op = op;
|
||||
|
||||
status = walk_state->descending_callback(walk_state, &op);
|
||||
status = acpi_ps_next_parse_state(walk_state, op, status);
|
||||
if (status == AE_CTRL_PENDING) {
|
||||
status = AE_CTRL_PARSE_PENDING;
|
||||
}
|
||||
}
|
||||
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ps_complete_op
|
||||
*
|
||||
* PARAMETERS: walk_state - Current state
|
||||
* op - Returned Op
|
||||
* status - Parse status before complete Op
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Complete Op
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status
|
||||
acpi_ps_complete_op(struct acpi_walk_state *walk_state,
|
||||
union acpi_parse_object **op, acpi_status status)
|
||||
{
|
||||
acpi_status status2;
|
||||
|
||||
ACPI_FUNCTION_TRACE_PTR(ps_complete_op, walk_state);
|
||||
|
||||
/*
|
||||
* Finished one argument of the containing scope
|
||||
*/
|
||||
walk_state->parser_state.scope->parse_scope.arg_count--;
|
||||
|
||||
/* Close this Op (will result in parse subtree deletion) */
|
||||
|
||||
status2 = acpi_ps_complete_this_op(walk_state, *op);
|
||||
if (ACPI_FAILURE(status2)) {
|
||||
return_ACPI_STATUS(status2);
|
||||
}
|
||||
|
||||
*op = NULL;
|
||||
|
||||
switch (status) {
|
||||
case AE_OK:
|
||||
break;
|
||||
|
||||
case AE_CTRL_TRANSFER:
|
||||
|
||||
/* We are about to transfer to a called method */
|
||||
|
||||
walk_state->prev_op = NULL;
|
||||
walk_state->prev_arg_types = walk_state->arg_types;
|
||||
return_ACPI_STATUS(status);
|
||||
|
||||
case AE_CTRL_END:
|
||||
|
||||
acpi_ps_pop_scope(&(walk_state->parser_state), op,
|
||||
&walk_state->arg_types,
|
||||
&walk_state->arg_count);
|
||||
|
||||
if (*op) {
|
||||
walk_state->op = *op;
|
||||
walk_state->op_info =
|
||||
acpi_ps_get_opcode_info((*op)->common.aml_opcode);
|
||||
walk_state->opcode = (*op)->common.aml_opcode;
|
||||
|
||||
status = walk_state->ascending_callback(walk_state);
|
||||
status =
|
||||
acpi_ps_next_parse_state(walk_state, *op, status);
|
||||
|
||||
status2 = acpi_ps_complete_this_op(walk_state, *op);
|
||||
if (ACPI_FAILURE(status2)) {
|
||||
return_ACPI_STATUS(status2);
|
||||
}
|
||||
}
|
||||
|
||||
status = AE_OK;
|
||||
break;
|
||||
|
||||
case AE_CTRL_BREAK:
|
||||
case AE_CTRL_CONTINUE:
|
||||
|
||||
/* Pop off scopes until we find the While */
|
||||
|
||||
while (!(*op) || ((*op)->common.aml_opcode != AML_WHILE_OP)) {
|
||||
acpi_ps_pop_scope(&(walk_state->parser_state), op,
|
||||
&walk_state->arg_types,
|
||||
&walk_state->arg_count);
|
||||
}
|
||||
|
||||
/* Close this iteration of the While loop */
|
||||
|
||||
walk_state->op = *op;
|
||||
walk_state->op_info =
|
||||
acpi_ps_get_opcode_info((*op)->common.aml_opcode);
|
||||
walk_state->opcode = (*op)->common.aml_opcode;
|
||||
|
||||
status = walk_state->ascending_callback(walk_state);
|
||||
status = acpi_ps_next_parse_state(walk_state, *op, status);
|
||||
|
||||
status2 = acpi_ps_complete_this_op(walk_state, *op);
|
||||
if (ACPI_FAILURE(status2)) {
|
||||
return_ACPI_STATUS(status2);
|
||||
}
|
||||
|
||||
status = AE_OK;
|
||||
break;
|
||||
|
||||
case AE_CTRL_TERMINATE:
|
||||
|
||||
/* Clean up */
|
||||
do {
|
||||
if (*op) {
|
||||
status2 =
|
||||
acpi_ps_complete_this_op(walk_state, *op);
|
||||
if (ACPI_FAILURE(status2)) {
|
||||
return_ACPI_STATUS(status2);
|
||||
}
|
||||
|
||||
acpi_ut_delete_generic_state
|
||||
(acpi_ut_pop_generic_state
|
||||
(&walk_state->control_state));
|
||||
}
|
||||
|
||||
acpi_ps_pop_scope(&(walk_state->parser_state), op,
|
||||
&walk_state->arg_types,
|
||||
&walk_state->arg_count);
|
||||
|
||||
} while (*op);
|
||||
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
|
||||
default: /* All other non-AE_OK status */
|
||||
|
||||
do {
|
||||
if (*op) {
|
||||
status2 =
|
||||
acpi_ps_complete_this_op(walk_state, *op);
|
||||
if (ACPI_FAILURE(status2)) {
|
||||
return_ACPI_STATUS(status2);
|
||||
}
|
||||
}
|
||||
|
||||
acpi_ps_pop_scope(&(walk_state->parser_state), op,
|
||||
&walk_state->arg_types,
|
||||
&walk_state->arg_count);
|
||||
|
||||
} while (*op);
|
||||
|
||||
#if 0
|
||||
/*
|
||||
* TBD: Cleanup parse ops on error
|
||||
*/
|
||||
if (*op == NULL) {
|
||||
acpi_ps_pop_scope(parser_state, op,
|
||||
&walk_state->arg_types,
|
||||
&walk_state->arg_count);
|
||||
}
|
||||
#endif
|
||||
walk_state->prev_op = NULL;
|
||||
walk_state->prev_arg_types = walk_state->arg_types;
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
/* This scope complete? */
|
||||
|
||||
if (acpi_ps_has_completed_scope(&(walk_state->parser_state))) {
|
||||
acpi_ps_pop_scope(&(walk_state->parser_state), op,
|
||||
&walk_state->arg_types,
|
||||
&walk_state->arg_count);
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_PARSE, "Popped scope, Op=%p\n", *op));
|
||||
} else {
|
||||
*op = NULL;
|
||||
}
|
||||
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ps_complete_final_op
|
||||
*
|
||||
* PARAMETERS: walk_state - Current state
|
||||
* op - Current Op
|
||||
* status - Current parse status before complete last
|
||||
* Op
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Complete last Op.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status
|
||||
acpi_ps_complete_final_op(struct acpi_walk_state *walk_state,
|
||||
union acpi_parse_object *op, acpi_status status)
|
||||
{
|
||||
acpi_status status2;
|
||||
|
||||
ACPI_FUNCTION_TRACE_PTR(ps_complete_final_op, walk_state);
|
||||
|
||||
/*
|
||||
* Complete the last Op (if not completed), and clear the scope stack.
|
||||
* It is easily possible to end an AML "package" with an unbounded number
|
||||
* of open scopes (such as when several ASL blocks are closed with
|
||||
* sequential closing braces). We want to terminate each one cleanly.
|
||||
*/
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_PARSE, "AML package complete at Op %p\n",
|
||||
op));
|
||||
do {
|
||||
if (op) {
|
||||
if (walk_state->ascending_callback != NULL) {
|
||||
walk_state->op = op;
|
||||
walk_state->op_info =
|
||||
acpi_ps_get_opcode_info(op->common.
|
||||
aml_opcode);
|
||||
walk_state->opcode = op->common.aml_opcode;
|
||||
|
||||
status =
|
||||
walk_state->ascending_callback(walk_state);
|
||||
status =
|
||||
acpi_ps_next_parse_state(walk_state, op,
|
||||
status);
|
||||
if (status == AE_CTRL_PENDING) {
|
||||
status =
|
||||
acpi_ps_complete_op(walk_state, &op,
|
||||
AE_OK);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
}
|
||||
|
||||
if (status == AE_CTRL_TERMINATE) {
|
||||
status = AE_OK;
|
||||
|
||||
/* Clean up */
|
||||
do {
|
||||
if (op) {
|
||||
status2 =
|
||||
acpi_ps_complete_this_op
|
||||
(walk_state, op);
|
||||
if (ACPI_FAILURE
|
||||
(status2)) {
|
||||
return_ACPI_STATUS
|
||||
(status2);
|
||||
}
|
||||
}
|
||||
|
||||
acpi_ps_pop_scope(&
|
||||
(walk_state->
|
||||
parser_state),
|
||||
&op,
|
||||
&walk_state->
|
||||
arg_types,
|
||||
&walk_state->
|
||||
arg_count);
|
||||
|
||||
} while (op);
|
||||
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
else if (ACPI_FAILURE(status)) {
|
||||
|
||||
/* First error is most important */
|
||||
|
||||
(void)
|
||||
acpi_ps_complete_this_op(walk_state,
|
||||
op);
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
}
|
||||
|
||||
status2 = acpi_ps_complete_this_op(walk_state, op);
|
||||
if (ACPI_FAILURE(status2)) {
|
||||
return_ACPI_STATUS(status2);
|
||||
}
|
||||
}
|
||||
|
||||
acpi_ps_pop_scope(&(walk_state->parser_state), &op,
|
||||
&walk_state->arg_types,
|
||||
&walk_state->arg_count);
|
||||
|
||||
} while (op);
|
||||
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
@ -43,16 +43,12 @@
|
||||
|
||||
#include <acpi/acpi.h>
|
||||
#include "accommon.h"
|
||||
#include "acparser.h"
|
||||
#include "acopcode.h"
|
||||
#include "amlcode.h"
|
||||
|
||||
#define _COMPONENT ACPI_PARSER
|
||||
ACPI_MODULE_NAME("psopcode")
|
||||
|
||||
static const u8 acpi_gbl_argument_count[] =
|
||||
{ 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 6 };
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* NAME: acpi_gbl_aml_op_info
|
||||
@ -63,7 +59,6 @@ static const u8 acpi_gbl_argument_count[] =
|
||||
* the operand type.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
/*
|
||||
* Summary of opcode types/flags
|
||||
*
|
||||
@ -181,7 +176,6 @@ static const u8 acpi_gbl_argument_count[] =
|
||||
AML_CREATE_QWORD_FIELD_OP
|
||||
|
||||
******************************************************************************/
|
||||
|
||||
/*
|
||||
* Master Opcode information table. A summary of everything we know about each
|
||||
* opcode, all in one place.
|
||||
@ -656,169 +650,3 @@ const struct acpi_opcode_info acpi_gbl_aml_op_info[AML_NUM_OPCODES] = {
|
||||
|
||||
/*! [End] no source code translation !*/
|
||||
};
|
||||
|
||||
/*
|
||||
* This table is directly indexed by the opcodes, and returns an
|
||||
* index into the table above
|
||||
*/
|
||||
static const u8 acpi_gbl_short_op_index[256] = {
|
||||
/* 0 1 2 3 4 5 6 7 */
|
||||
/* 8 9 A B C D E F */
|
||||
/* 0x00 */ 0x00, 0x01, _UNK, _UNK, _UNK, _UNK, 0x02, _UNK,
|
||||
/* 0x08 */ 0x03, _UNK, 0x04, 0x05, 0x06, 0x07, 0x6E, _UNK,
|
||||
/* 0x10 */ 0x08, 0x09, 0x0a, 0x6F, 0x0b, _UNK, _UNK, _UNK,
|
||||
/* 0x18 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
|
||||
/* 0x20 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
|
||||
/* 0x28 */ _UNK, _UNK, _UNK, _UNK, _UNK, 0x63, _PFX, _PFX,
|
||||
/* 0x30 */ 0x67, 0x66, 0x68, 0x65, 0x69, 0x64, 0x6A, 0x7D,
|
||||
/* 0x38 */ 0x7F, 0x80, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
|
||||
/* 0x40 */ _UNK, _ASC, _ASC, _ASC, _ASC, _ASC, _ASC, _ASC,
|
||||
/* 0x48 */ _ASC, _ASC, _ASC, _ASC, _ASC, _ASC, _ASC, _ASC,
|
||||
/* 0x50 */ _ASC, _ASC, _ASC, _ASC, _ASC, _ASC, _ASC, _ASC,
|
||||
/* 0x58 */ _ASC, _ASC, _ASC, _UNK, _PFX, _UNK, _PFX, _ASC,
|
||||
/* 0x60 */ 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13,
|
||||
/* 0x68 */ 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, _UNK,
|
||||
/* 0x70 */ 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22,
|
||||
/* 0x78 */ 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a,
|
||||
/* 0x80 */ 0x2b, 0x2c, 0x2d, 0x2e, 0x70, 0x71, 0x2f, 0x30,
|
||||
/* 0x88 */ 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x72,
|
||||
/* 0x90 */ 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x73, 0x74,
|
||||
/* 0x98 */ 0x75, 0x76, _UNK, _UNK, 0x77, 0x78, 0x79, 0x7A,
|
||||
/* 0xA0 */ 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x60, 0x61,
|
||||
/* 0xA8 */ 0x62, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
|
||||
/* 0xB0 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
|
||||
/* 0xB8 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
|
||||
/* 0xC0 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
|
||||
/* 0xC8 */ _UNK, _UNK, _UNK, _UNK, 0x44, _UNK, _UNK, _UNK,
|
||||
/* 0xD0 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
|
||||
/* 0xD8 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
|
||||
/* 0xE0 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
|
||||
/* 0xE8 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
|
||||
/* 0xF0 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
|
||||
/* 0xF8 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, 0x45,
|
||||
};
|
||||
|
||||
/*
|
||||
* This table is indexed by the second opcode of the extended opcode
|
||||
* pair. It returns an index into the opcode table (acpi_gbl_aml_op_info)
|
||||
*/
|
||||
static const u8 acpi_gbl_long_op_index[NUM_EXTENDED_OPCODE] = {
|
||||
/* 0 1 2 3 4 5 6 7 */
|
||||
/* 8 9 A B C D E F */
|
||||
/* 0x00 */ _UNK, 0x46, 0x47, _UNK, _UNK, _UNK, _UNK, _UNK,
|
||||
/* 0x08 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
|
||||
/* 0x10 */ _UNK, _UNK, 0x48, 0x49, _UNK, _UNK, _UNK, _UNK,
|
||||
/* 0x18 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, 0x7B,
|
||||
/* 0x20 */ 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51,
|
||||
/* 0x28 */ 0x52, 0x53, 0x54, _UNK, _UNK, _UNK, _UNK, _UNK,
|
||||
/* 0x30 */ 0x55, 0x56, 0x57, 0x7e, _UNK, _UNK, _UNK, _UNK,
|
||||
/* 0x38 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
|
||||
/* 0x40 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
|
||||
/* 0x48 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
|
||||
/* 0x50 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
|
||||
/* 0x58 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
|
||||
/* 0x60 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
|
||||
/* 0x68 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
|
||||
/* 0x70 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
|
||||
/* 0x78 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
|
||||
/* 0x80 */ 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
|
||||
/* 0x88 */ 0x7C,
|
||||
};
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ps_get_opcode_info
|
||||
*
|
||||
* PARAMETERS: opcode - The AML opcode
|
||||
*
|
||||
* RETURN: A pointer to the info about the opcode.
|
||||
*
|
||||
* DESCRIPTION: Find AML opcode description based on the opcode.
|
||||
* NOTE: This procedure must ALWAYS return a valid pointer!
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
const struct acpi_opcode_info *acpi_ps_get_opcode_info(u16 opcode)
|
||||
{
|
||||
ACPI_FUNCTION_NAME(ps_get_opcode_info);
|
||||
|
||||
/*
|
||||
* Detect normal 8-bit opcode or extended 16-bit opcode
|
||||
*/
|
||||
if (!(opcode & 0xFF00)) {
|
||||
|
||||
/* Simple (8-bit) opcode: 0-255, can't index beyond table */
|
||||
|
||||
return (&acpi_gbl_aml_op_info
|
||||
[acpi_gbl_short_op_index[(u8) opcode]]);
|
||||
}
|
||||
|
||||
if (((opcode & 0xFF00) == AML_EXTENDED_OPCODE) &&
|
||||
(((u8) opcode) <= MAX_EXTENDED_OPCODE)) {
|
||||
|
||||
/* Valid extended (16-bit) opcode */
|
||||
|
||||
return (&acpi_gbl_aml_op_info
|
||||
[acpi_gbl_long_op_index[(u8) opcode]]);
|
||||
}
|
||||
|
||||
/* Unknown AML opcode */
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
|
||||
"Unknown AML opcode [%4.4X]\n", opcode));
|
||||
|
||||
return (&acpi_gbl_aml_op_info[_UNK]);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ps_get_opcode_name
|
||||
*
|
||||
* PARAMETERS: opcode - The AML opcode
|
||||
*
|
||||
* RETURN: A pointer to the name of the opcode (ASCII String)
|
||||
* Note: Never returns NULL.
|
||||
*
|
||||
* DESCRIPTION: Translate an opcode into a human-readable string
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
char *acpi_ps_get_opcode_name(u16 opcode)
|
||||
{
|
||||
#if defined(ACPI_DISASSEMBLER) || defined (ACPI_DEBUG_OUTPUT)
|
||||
|
||||
const struct acpi_opcode_info *op;
|
||||
|
||||
op = acpi_ps_get_opcode_info(opcode);
|
||||
|
||||
/* Always guaranteed to return a valid pointer */
|
||||
|
||||
return (op->name);
|
||||
|
||||
#else
|
||||
return ("OpcodeName unavailable");
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ps_get_argument_count
|
||||
*
|
||||
* PARAMETERS: op_type - Type associated with the AML opcode
|
||||
*
|
||||
* RETURN: Argument count
|
||||
*
|
||||
* DESCRIPTION: Obtain the number of expected arguments for an AML opcode
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
u8 acpi_ps_get_argument_count(u32 op_type)
|
||||
{
|
||||
|
||||
if (op_type <= AML_TYPE_EXEC_6A_0T_1R) {
|
||||
return (acpi_gbl_argument_count[op_type]);
|
||||
}
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
223
drivers/acpi/acpica/psopinfo.c
Normal file
223
drivers/acpi/acpica/psopinfo.c
Normal file
@ -0,0 +1,223 @@
|
||||
/******************************************************************************
|
||||
*
|
||||
* Module Name: psopinfo - AML opcode information functions and dispatch tables
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2000 - 2012, Intel Corp.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions, and the following disclaimer,
|
||||
* without modification.
|
||||
* 2. Redistributions in binary form must reproduce at minimum a disclaimer
|
||||
* substantially similar to the "NO WARRANTY" disclaimer below
|
||||
* ("Disclaimer") and any redistribution must be conditioned upon
|
||||
* including a substantially similar Disclaimer requirement for further
|
||||
* binary redistribution.
|
||||
* 3. Neither the names of the above-listed copyright holders nor the names
|
||||
* of any contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* Alternatively, this software may be distributed under the terms of the
|
||||
* GNU General Public License ("GPL") version 2 as published by the Free
|
||||
* Software Foundation.
|
||||
*
|
||||
* NO WARRANTY
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGES.
|
||||
*/
|
||||
|
||||
#include <acpi/acpi.h>
|
||||
#include "accommon.h"
|
||||
#include "acparser.h"
|
||||
#include "acopcode.h"
|
||||
#include "amlcode.h"
|
||||
|
||||
#define _COMPONENT ACPI_PARSER
|
||||
ACPI_MODULE_NAME("psopinfo")
|
||||
|
||||
extern const u8 acpi_gbl_short_op_index[];
|
||||
extern const u8 acpi_gbl_long_op_index[];
|
||||
|
||||
static const u8 acpi_gbl_argument_count[] =
|
||||
{ 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 6 };
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ps_get_opcode_info
|
||||
*
|
||||
* PARAMETERS: opcode - The AML opcode
|
||||
*
|
||||
* RETURN: A pointer to the info about the opcode.
|
||||
*
|
||||
* DESCRIPTION: Find AML opcode description based on the opcode.
|
||||
* NOTE: This procedure must ALWAYS return a valid pointer!
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
const struct acpi_opcode_info *acpi_ps_get_opcode_info(u16 opcode)
|
||||
{
|
||||
ACPI_FUNCTION_NAME(ps_get_opcode_info);
|
||||
|
||||
/*
|
||||
* Detect normal 8-bit opcode or extended 16-bit opcode
|
||||
*/
|
||||
if (!(opcode & 0xFF00)) {
|
||||
|
||||
/* Simple (8-bit) opcode: 0-255, can't index beyond table */
|
||||
|
||||
return (&acpi_gbl_aml_op_info
|
||||
[acpi_gbl_short_op_index[(u8)opcode]]);
|
||||
}
|
||||
|
||||
if (((opcode & 0xFF00) == AML_EXTENDED_OPCODE) &&
|
||||
(((u8)opcode) <= MAX_EXTENDED_OPCODE)) {
|
||||
|
||||
/* Valid extended (16-bit) opcode */
|
||||
|
||||
return (&acpi_gbl_aml_op_info
|
||||
[acpi_gbl_long_op_index[(u8)opcode]]);
|
||||
}
|
||||
|
||||
/* Unknown AML opcode */
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
|
||||
"Unknown AML opcode [%4.4X]\n", opcode));
|
||||
|
||||
return (&acpi_gbl_aml_op_info[_UNK]);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ps_get_opcode_name
|
||||
*
|
||||
* PARAMETERS: opcode - The AML opcode
|
||||
*
|
||||
* RETURN: A pointer to the name of the opcode (ASCII String)
|
||||
* Note: Never returns NULL.
|
||||
*
|
||||
* DESCRIPTION: Translate an opcode into a human-readable string
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
char *acpi_ps_get_opcode_name(u16 opcode)
|
||||
{
|
||||
#if defined(ACPI_DISASSEMBLER) || defined (ACPI_DEBUG_OUTPUT)
|
||||
|
||||
const struct acpi_opcode_info *op;
|
||||
|
||||
op = acpi_ps_get_opcode_info(opcode);
|
||||
|
||||
/* Always guaranteed to return a valid pointer */
|
||||
|
||||
return (op->name);
|
||||
|
||||
#else
|
||||
return ("OpcodeName unavailable");
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ps_get_argument_count
|
||||
*
|
||||
* PARAMETERS: op_type - Type associated with the AML opcode
|
||||
*
|
||||
* RETURN: Argument count
|
||||
*
|
||||
* DESCRIPTION: Obtain the number of expected arguments for an AML opcode
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
u8 acpi_ps_get_argument_count(u32 op_type)
|
||||
{
|
||||
|
||||
if (op_type <= AML_TYPE_EXEC_6A_0T_1R) {
|
||||
return (acpi_gbl_argument_count[op_type]);
|
||||
}
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* This table is directly indexed by the opcodes It returns
|
||||
* an index into the opcode table (acpi_gbl_aml_op_info)
|
||||
*/
|
||||
const u8 acpi_gbl_short_op_index[256] = {
|
||||
/* 0 1 2 3 4 5 6 7 */
|
||||
/* 8 9 A B C D E F */
|
||||
/* 0x00 */ 0x00, 0x01, _UNK, _UNK, _UNK, _UNK, 0x02, _UNK,
|
||||
/* 0x08 */ 0x03, _UNK, 0x04, 0x05, 0x06, 0x07, 0x6E, _UNK,
|
||||
/* 0x10 */ 0x08, 0x09, 0x0a, 0x6F, 0x0b, _UNK, _UNK, _UNK,
|
||||
/* 0x18 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
|
||||
/* 0x20 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
|
||||
/* 0x28 */ _UNK, _UNK, _UNK, _UNK, _UNK, 0x63, _PFX, _PFX,
|
||||
/* 0x30 */ 0x67, 0x66, 0x68, 0x65, 0x69, 0x64, 0x6A, 0x7D,
|
||||
/* 0x38 */ 0x7F, 0x80, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
|
||||
/* 0x40 */ _UNK, _ASC, _ASC, _ASC, _ASC, _ASC, _ASC, _ASC,
|
||||
/* 0x48 */ _ASC, _ASC, _ASC, _ASC, _ASC, _ASC, _ASC, _ASC,
|
||||
/* 0x50 */ _ASC, _ASC, _ASC, _ASC, _ASC, _ASC, _ASC, _ASC,
|
||||
/* 0x58 */ _ASC, _ASC, _ASC, _UNK, _PFX, _UNK, _PFX, _ASC,
|
||||
/* 0x60 */ 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13,
|
||||
/* 0x68 */ 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, _UNK,
|
||||
/* 0x70 */ 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22,
|
||||
/* 0x78 */ 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a,
|
||||
/* 0x80 */ 0x2b, 0x2c, 0x2d, 0x2e, 0x70, 0x71, 0x2f, 0x30,
|
||||
/* 0x88 */ 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x72,
|
||||
/* 0x90 */ 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x73, 0x74,
|
||||
/* 0x98 */ 0x75, 0x76, _UNK, _UNK, 0x77, 0x78, 0x79, 0x7A,
|
||||
/* 0xA0 */ 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x60, 0x61,
|
||||
/* 0xA8 */ 0x62, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
|
||||
/* 0xB0 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
|
||||
/* 0xB8 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
|
||||
/* 0xC0 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
|
||||
/* 0xC8 */ _UNK, _UNK, _UNK, _UNK, 0x44, _UNK, _UNK, _UNK,
|
||||
/* 0xD0 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
|
||||
/* 0xD8 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
|
||||
/* 0xE0 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
|
||||
/* 0xE8 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
|
||||
/* 0xF0 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
|
||||
/* 0xF8 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, 0x45,
|
||||
};
|
||||
|
||||
/*
|
||||
* This table is indexed by the second opcode of the extended opcode
|
||||
* pair. It returns an index into the opcode table (acpi_gbl_aml_op_info)
|
||||
*/
|
||||
const u8 acpi_gbl_long_op_index[NUM_EXTENDED_OPCODE] = {
|
||||
/* 0 1 2 3 4 5 6 7 */
|
||||
/* 8 9 A B C D E F */
|
||||
/* 0x00 */ _UNK, 0x46, 0x47, _UNK, _UNK, _UNK, _UNK, _UNK,
|
||||
/* 0x08 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
|
||||
/* 0x10 */ _UNK, _UNK, 0x48, 0x49, _UNK, _UNK, _UNK, _UNK,
|
||||
/* 0x18 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, 0x7B,
|
||||
/* 0x20 */ 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51,
|
||||
/* 0x28 */ 0x52, 0x53, 0x54, _UNK, _UNK, _UNK, _UNK, _UNK,
|
||||
/* 0x30 */ 0x55, 0x56, 0x57, 0x7e, _UNK, _UNK, _UNK, _UNK,
|
||||
/* 0x38 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
|
||||
/* 0x40 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
|
||||
/* 0x48 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
|
||||
/* 0x50 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
|
||||
/* 0x58 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
|
||||
/* 0x60 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
|
||||
/* 0x68 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
|
||||
/* 0x70 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
|
||||
/* 0x78 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
|
||||
/* 0x80 */ 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
|
||||
/* 0x88 */ 0x7C,
|
||||
};
|
@ -201,14 +201,6 @@ u8 acpi_ps_is_leading_char(u32 c)
|
||||
return ((u8) (c == '_' || (c >= 'A' && c <= 'Z')));
|
||||
}
|
||||
|
||||
/*
|
||||
* Is "c" a namestring prefix character?
|
||||
*/
|
||||
u8 acpi_ps_is_prefix_char(u32 c)
|
||||
{
|
||||
return ((u8) (c == '\\' || c == '^'));
|
||||
}
|
||||
|
||||
/*
|
||||
* Get op's name (4-byte name segment) or 0 if unnamed
|
||||
*/
|
||||
|
@ -84,7 +84,7 @@ static u8 acpi_rs_count_set_bits(u16 bit_field)
|
||||
bit_field &= (u16) (bit_field - 1);
|
||||
}
|
||||
|
||||
return bits_set;
|
||||
return (bits_set);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
@ -407,7 +407,9 @@ acpi_rs_get_list_length(u8 * aml_buffer,
|
||||
|
||||
/* Validate the Resource Type and Resource Length */
|
||||
|
||||
status = acpi_ut_validate_resource(aml_buffer, &resource_index);
|
||||
status =
|
||||
acpi_ut_validate_resource(NULL, aml_buffer,
|
||||
&resource_index);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
/*
|
||||
* Exit on failure. Cannot continue because the descriptor length
|
||||
|
@ -98,7 +98,7 @@ acpi_buffer_to_resource(u8 *aml_buffer,
|
||||
|
||||
/* Perform the AML-to-Resource conversion */
|
||||
|
||||
status = acpi_ut_walk_aml_resources(aml_buffer, aml_buffer_length,
|
||||
status = acpi_ut_walk_aml_resources(NULL, aml_buffer, aml_buffer_length,
|
||||
acpi_rs_convert_aml_to_resources,
|
||||
¤t_resource_ptr);
|
||||
if (status == AE_AML_NO_RESOURCE_END_TAG) {
|
||||
@ -174,7 +174,7 @@ acpi_rs_create_resource_list(union acpi_operand_object *aml_buffer,
|
||||
/* Do the conversion */
|
||||
|
||||
resource = output_buffer->pointer;
|
||||
status = acpi_ut_walk_aml_resources(aml_start, aml_buffer_length,
|
||||
status = acpi_ut_walk_aml_resources(NULL, aml_start, aml_buffer_length,
|
||||
acpi_rs_convert_aml_to_resources,
|
||||
&resource);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
@ -480,8 +480,7 @@ acpi_rs_create_aml_resources(struct acpi_resource *linked_list_buffer,
|
||||
status = acpi_rs_get_aml_length(linked_list_buffer, &aml_size_needed);
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_INFO, "AmlSizeNeeded=%X, %s\n",
|
||||
(u32) aml_size_needed,
|
||||
acpi_format_exception(status)));
|
||||
(u32)aml_size_needed, acpi_format_exception(status)));
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
@ -77,419 +77,16 @@ static void acpi_rs_dump_address_common(union acpi_resource_data *resource);
|
||||
static void
|
||||
acpi_rs_dump_descriptor(void *resource, struct acpi_rsdump_info *table);
|
||||
|
||||
#define ACPI_RSD_OFFSET(f) (u8) ACPI_OFFSET (union acpi_resource_data,f)
|
||||
#define ACPI_PRT_OFFSET(f) (u8) ACPI_OFFSET (struct acpi_pci_routing_table,f)
|
||||
#define ACPI_RSD_TABLE_SIZE(name) (sizeof(name) / sizeof (struct acpi_rsdump_info))
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* Resource Descriptor info tables
|
||||
*
|
||||
* Note: The first table entry must be a Title or Literal and must contain
|
||||
* the table length (number of table entries)
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
struct acpi_rsdump_info acpi_rs_dump_irq[7] = {
|
||||
{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_irq), "IRQ", NULL},
|
||||
{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(irq.descriptor_length),
|
||||
"Descriptor Length", NULL},
|
||||
{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(irq.triggering), "Triggering",
|
||||
acpi_gbl_he_decode},
|
||||
{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(irq.polarity), "Polarity",
|
||||
acpi_gbl_ll_decode},
|
||||
{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(irq.sharable), "Sharing",
|
||||
acpi_gbl_shr_decode},
|
||||
{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(irq.interrupt_count),
|
||||
"Interrupt Count", NULL},
|
||||
{ACPI_RSD_SHORTLIST, ACPI_RSD_OFFSET(irq.interrupts[0]),
|
||||
"Interrupt List", NULL}
|
||||
};
|
||||
|
||||
struct acpi_rsdump_info acpi_rs_dump_dma[6] = {
|
||||
{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_dma), "DMA", NULL},
|
||||
{ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET(dma.type), "Speed",
|
||||
acpi_gbl_typ_decode},
|
||||
{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(dma.bus_master), "Mastering",
|
||||
acpi_gbl_bm_decode},
|
||||
{ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET(dma.transfer), "Transfer Type",
|
||||
acpi_gbl_siz_decode},
|
||||
{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(dma.channel_count), "Channel Count",
|
||||
NULL},
|
||||
{ACPI_RSD_SHORTLIST, ACPI_RSD_OFFSET(dma.channels[0]), "Channel List",
|
||||
NULL}
|
||||
};
|
||||
|
||||
struct acpi_rsdump_info acpi_rs_dump_start_dpf[4] = {
|
||||
{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_start_dpf),
|
||||
"Start-Dependent-Functions", NULL},
|
||||
{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(start_dpf.descriptor_length),
|
||||
"Descriptor Length", NULL},
|
||||
{ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET(start_dpf.compatibility_priority),
|
||||
"Compatibility Priority", acpi_gbl_config_decode},
|
||||
{ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET(start_dpf.performance_robustness),
|
||||
"Performance/Robustness", acpi_gbl_config_decode}
|
||||
};
|
||||
|
||||
struct acpi_rsdump_info acpi_rs_dump_end_dpf[1] = {
|
||||
{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_end_dpf),
|
||||
"End-Dependent-Functions", NULL}
|
||||
};
|
||||
|
||||
struct acpi_rsdump_info acpi_rs_dump_io[6] = {
|
||||
{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_io), "I/O", NULL},
|
||||
{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(io.io_decode), "Address Decoding",
|
||||
acpi_gbl_io_decode},
|
||||
{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(io.minimum), "Address Minimum", NULL},
|
||||
{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(io.maximum), "Address Maximum", NULL},
|
||||
{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(io.alignment), "Alignment", NULL},
|
||||
{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(io.address_length), "Address Length",
|
||||
NULL}
|
||||
};
|
||||
|
||||
struct acpi_rsdump_info acpi_rs_dump_fixed_io[3] = {
|
||||
{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_fixed_io),
|
||||
"Fixed I/O", NULL},
|
||||
{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(fixed_io.address), "Address", NULL},
|
||||
{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(fixed_io.address_length),
|
||||
"Address Length", NULL}
|
||||
};
|
||||
|
||||
struct acpi_rsdump_info acpi_rs_dump_vendor[3] = {
|
||||
{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_vendor),
|
||||
"Vendor Specific", NULL},
|
||||
{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(vendor.byte_length), "Length", NULL},
|
||||
{ACPI_RSD_LONGLIST, ACPI_RSD_OFFSET(vendor.byte_data[0]), "Vendor Data",
|
||||
NULL}
|
||||
};
|
||||
|
||||
struct acpi_rsdump_info acpi_rs_dump_end_tag[1] = {
|
||||
{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_end_tag), "EndTag",
|
||||
NULL}
|
||||
};
|
||||
|
||||
struct acpi_rsdump_info acpi_rs_dump_memory24[6] = {
|
||||
{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_memory24),
|
||||
"24-Bit Memory Range", NULL},
|
||||
{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(memory24.write_protect),
|
||||
"Write Protect", acpi_gbl_rw_decode},
|
||||
{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(memory24.minimum), "Address Minimum",
|
||||
NULL},
|
||||
{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(memory24.maximum), "Address Maximum",
|
||||
NULL},
|
||||
{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(memory24.alignment), "Alignment",
|
||||
NULL},
|
||||
{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(memory24.address_length),
|
||||
"Address Length", NULL}
|
||||
};
|
||||
|
||||
struct acpi_rsdump_info acpi_rs_dump_memory32[6] = {
|
||||
{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_memory32),
|
||||
"32-Bit Memory Range", NULL},
|
||||
{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(memory32.write_protect),
|
||||
"Write Protect", acpi_gbl_rw_decode},
|
||||
{ACPI_RSD_UINT32, ACPI_RSD_OFFSET(memory32.minimum), "Address Minimum",
|
||||
NULL},
|
||||
{ACPI_RSD_UINT32, ACPI_RSD_OFFSET(memory32.maximum), "Address Maximum",
|
||||
NULL},
|
||||
{ACPI_RSD_UINT32, ACPI_RSD_OFFSET(memory32.alignment), "Alignment",
|
||||
NULL},
|
||||
{ACPI_RSD_UINT32, ACPI_RSD_OFFSET(memory32.address_length),
|
||||
"Address Length", NULL}
|
||||
};
|
||||
|
||||
struct acpi_rsdump_info acpi_rs_dump_fixed_memory32[4] = {
|
||||
{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_fixed_memory32),
|
||||
"32-Bit Fixed Memory Range", NULL},
|
||||
{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(fixed_memory32.write_protect),
|
||||
"Write Protect", acpi_gbl_rw_decode},
|
||||
{ACPI_RSD_UINT32, ACPI_RSD_OFFSET(fixed_memory32.address), "Address",
|
||||
NULL},
|
||||
{ACPI_RSD_UINT32, ACPI_RSD_OFFSET(fixed_memory32.address_length),
|
||||
"Address Length", NULL}
|
||||
};
|
||||
|
||||
struct acpi_rsdump_info acpi_rs_dump_address16[8] = {
|
||||
{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_address16),
|
||||
"16-Bit WORD Address Space", NULL},
|
||||
{ACPI_RSD_ADDRESS, 0, NULL, NULL},
|
||||
{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(address16.granularity), "Granularity",
|
||||
NULL},
|
||||
{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(address16.minimum), "Address Minimum",
|
||||
NULL},
|
||||
{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(address16.maximum), "Address Maximum",
|
||||
NULL},
|
||||
{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(address16.translation_offset),
|
||||
"Translation Offset", NULL},
|
||||
{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(address16.address_length),
|
||||
"Address Length", NULL},
|
||||
{ACPI_RSD_SOURCE, ACPI_RSD_OFFSET(address16.resource_source), NULL, NULL}
|
||||
};
|
||||
|
||||
struct acpi_rsdump_info acpi_rs_dump_address32[8] = {
|
||||
{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_address32),
|
||||
"32-Bit DWORD Address Space", NULL},
|
||||
{ACPI_RSD_ADDRESS, 0, NULL, NULL},
|
||||
{ACPI_RSD_UINT32, ACPI_RSD_OFFSET(address32.granularity), "Granularity",
|
||||
NULL},
|
||||
{ACPI_RSD_UINT32, ACPI_RSD_OFFSET(address32.minimum), "Address Minimum",
|
||||
NULL},
|
||||
{ACPI_RSD_UINT32, ACPI_RSD_OFFSET(address32.maximum), "Address Maximum",
|
||||
NULL},
|
||||
{ACPI_RSD_UINT32, ACPI_RSD_OFFSET(address32.translation_offset),
|
||||
"Translation Offset", NULL},
|
||||
{ACPI_RSD_UINT32, ACPI_RSD_OFFSET(address32.address_length),
|
||||
"Address Length", NULL},
|
||||
{ACPI_RSD_SOURCE, ACPI_RSD_OFFSET(address32.resource_source), NULL, NULL}
|
||||
};
|
||||
|
||||
struct acpi_rsdump_info acpi_rs_dump_address64[8] = {
|
||||
{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_address64),
|
||||
"64-Bit QWORD Address Space", NULL},
|
||||
{ACPI_RSD_ADDRESS, 0, NULL, NULL},
|
||||
{ACPI_RSD_UINT64, ACPI_RSD_OFFSET(address64.granularity), "Granularity",
|
||||
NULL},
|
||||
{ACPI_RSD_UINT64, ACPI_RSD_OFFSET(address64.minimum), "Address Minimum",
|
||||
NULL},
|
||||
{ACPI_RSD_UINT64, ACPI_RSD_OFFSET(address64.maximum), "Address Maximum",
|
||||
NULL},
|
||||
{ACPI_RSD_UINT64, ACPI_RSD_OFFSET(address64.translation_offset),
|
||||
"Translation Offset", NULL},
|
||||
{ACPI_RSD_UINT64, ACPI_RSD_OFFSET(address64.address_length),
|
||||
"Address Length", NULL},
|
||||
{ACPI_RSD_SOURCE, ACPI_RSD_OFFSET(address64.resource_source), NULL, NULL}
|
||||
};
|
||||
|
||||
struct acpi_rsdump_info acpi_rs_dump_ext_address64[8] = {
|
||||
{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_ext_address64),
|
||||
"64-Bit Extended Address Space", NULL},
|
||||
{ACPI_RSD_ADDRESS, 0, NULL, NULL},
|
||||
{ACPI_RSD_UINT64, ACPI_RSD_OFFSET(ext_address64.granularity),
|
||||
"Granularity", NULL},
|
||||
{ACPI_RSD_UINT64, ACPI_RSD_OFFSET(ext_address64.minimum),
|
||||
"Address Minimum", NULL},
|
||||
{ACPI_RSD_UINT64, ACPI_RSD_OFFSET(ext_address64.maximum),
|
||||
"Address Maximum", NULL},
|
||||
{ACPI_RSD_UINT64, ACPI_RSD_OFFSET(ext_address64.translation_offset),
|
||||
"Translation Offset", NULL},
|
||||
{ACPI_RSD_UINT64, ACPI_RSD_OFFSET(ext_address64.address_length),
|
||||
"Address Length", NULL},
|
||||
{ACPI_RSD_UINT64, ACPI_RSD_OFFSET(ext_address64.type_specific),
|
||||
"Type-Specific Attribute", NULL}
|
||||
};
|
||||
|
||||
struct acpi_rsdump_info acpi_rs_dump_ext_irq[8] = {
|
||||
{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_ext_irq),
|
||||
"Extended IRQ", NULL},
|
||||
{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(extended_irq.producer_consumer),
|
||||
"Type", acpi_gbl_consume_decode},
|
||||
{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(extended_irq.triggering),
|
||||
"Triggering", acpi_gbl_he_decode},
|
||||
{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(extended_irq.polarity), "Polarity",
|
||||
acpi_gbl_ll_decode},
|
||||
{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(extended_irq.sharable), "Sharing",
|
||||
acpi_gbl_shr_decode},
|
||||
{ACPI_RSD_SOURCE, ACPI_RSD_OFFSET(extended_irq.resource_source), NULL,
|
||||
NULL},
|
||||
{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(extended_irq.interrupt_count),
|
||||
"Interrupt Count", NULL},
|
||||
{ACPI_RSD_DWORDLIST, ACPI_RSD_OFFSET(extended_irq.interrupts[0]),
|
||||
"Interrupt List", NULL}
|
||||
};
|
||||
|
||||
struct acpi_rsdump_info acpi_rs_dump_generic_reg[6] = {
|
||||
{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_generic_reg),
|
||||
"Generic Register", NULL},
|
||||
{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(generic_reg.space_id), "Space ID",
|
||||
NULL},
|
||||
{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(generic_reg.bit_width), "Bit Width",
|
||||
NULL},
|
||||
{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(generic_reg.bit_offset), "Bit Offset",
|
||||
NULL},
|
||||
{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(generic_reg.access_size),
|
||||
"Access Size", NULL},
|
||||
{ACPI_RSD_UINT64, ACPI_RSD_OFFSET(generic_reg.address), "Address", NULL}
|
||||
};
|
||||
|
||||
struct acpi_rsdump_info acpi_rs_dump_gpio[16] = {
|
||||
{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_gpio), "GPIO", NULL},
|
||||
{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(gpio.revision_id), "RevisionId", NULL},
|
||||
{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(gpio.connection_type),
|
||||
"ConnectionType", acpi_gbl_ct_decode},
|
||||
{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(gpio.producer_consumer),
|
||||
"ProducerConsumer", acpi_gbl_consume_decode},
|
||||
{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(gpio.pin_config), "PinConfig",
|
||||
acpi_gbl_ppc_decode},
|
||||
{ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET(gpio.sharable), "Sharable",
|
||||
acpi_gbl_shr_decode},
|
||||
{ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET(gpio.io_restriction),
|
||||
"IoRestriction", acpi_gbl_ior_decode},
|
||||
{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(gpio.triggering), "Triggering",
|
||||
acpi_gbl_he_decode},
|
||||
{ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET(gpio.polarity), "Polarity",
|
||||
acpi_gbl_ll_decode},
|
||||
{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(gpio.drive_strength), "DriveStrength",
|
||||
NULL},
|
||||
{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(gpio.debounce_timeout),
|
||||
"DebounceTimeout", NULL},
|
||||
{ACPI_RSD_SOURCE, ACPI_RSD_OFFSET(gpio.resource_source),
|
||||
"ResourceSource", NULL},
|
||||
{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(gpio.pin_table_length),
|
||||
"PinTableLength", NULL},
|
||||
{ACPI_RSD_WORDLIST, ACPI_RSD_OFFSET(gpio.pin_table), "PinTable", NULL},
|
||||
{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(gpio.vendor_length), "VendorLength",
|
||||
NULL},
|
||||
{ACPI_RSD_SHORTLISTX, ACPI_RSD_OFFSET(gpio.vendor_data), "VendorData",
|
||||
NULL},
|
||||
};
|
||||
|
||||
struct acpi_rsdump_info acpi_rs_dump_fixed_dma[4] = {
|
||||
{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_fixed_dma),
|
||||
"FixedDma", NULL},
|
||||
{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(fixed_dma.request_lines),
|
||||
"RequestLines", NULL},
|
||||
{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(fixed_dma.channels), "Channels",
|
||||
NULL},
|
||||
{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(fixed_dma.width), "TransferWidth",
|
||||
acpi_gbl_dts_decode},
|
||||
};
|
||||
|
||||
#define ACPI_RS_DUMP_COMMON_SERIAL_BUS \
|
||||
{ACPI_RSD_UINT8, ACPI_RSD_OFFSET (common_serial_bus.revision_id), "RevisionId", NULL}, \
|
||||
{ACPI_RSD_UINT8, ACPI_RSD_OFFSET (common_serial_bus.type), "Type", acpi_gbl_sbt_decode}, \
|
||||
{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (common_serial_bus.producer_consumer), "ProducerConsumer", acpi_gbl_consume_decode}, \
|
||||
{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (common_serial_bus.slave_mode), "SlaveMode", acpi_gbl_sm_decode}, \
|
||||
{ACPI_RSD_UINT8, ACPI_RSD_OFFSET (common_serial_bus.type_revision_id), "TypeRevisionId", NULL}, \
|
||||
{ACPI_RSD_UINT16, ACPI_RSD_OFFSET (common_serial_bus.type_data_length), "TypeDataLength", NULL}, \
|
||||
{ACPI_RSD_SOURCE, ACPI_RSD_OFFSET (common_serial_bus.resource_source), "ResourceSource", NULL}, \
|
||||
{ACPI_RSD_UINT16, ACPI_RSD_OFFSET (common_serial_bus.vendor_length), "VendorLength", NULL}, \
|
||||
{ACPI_RSD_SHORTLISTX,ACPI_RSD_OFFSET (common_serial_bus.vendor_data), "VendorData", NULL},
|
||||
|
||||
struct acpi_rsdump_info acpi_rs_dump_common_serial_bus[10] = {
|
||||
{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_common_serial_bus),
|
||||
"Common Serial Bus", NULL},
|
||||
ACPI_RS_DUMP_COMMON_SERIAL_BUS
|
||||
};
|
||||
|
||||
struct acpi_rsdump_info acpi_rs_dump_i2c_serial_bus[13] = {
|
||||
{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_i2c_serial_bus),
|
||||
"I2C Serial Bus", NULL},
|
||||
ACPI_RS_DUMP_COMMON_SERIAL_BUS {ACPI_RSD_1BITFLAG,
|
||||
ACPI_RSD_OFFSET(i2c_serial_bus.
|
||||
access_mode),
|
||||
"AccessMode", acpi_gbl_am_decode},
|
||||
{ACPI_RSD_UINT32, ACPI_RSD_OFFSET(i2c_serial_bus.connection_speed),
|
||||
"ConnectionSpeed", NULL},
|
||||
{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(i2c_serial_bus.slave_address),
|
||||
"SlaveAddress", NULL},
|
||||
};
|
||||
|
||||
struct acpi_rsdump_info acpi_rs_dump_spi_serial_bus[17] = {
|
||||
{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_spi_serial_bus),
|
||||
"Spi Serial Bus", NULL},
|
||||
ACPI_RS_DUMP_COMMON_SERIAL_BUS {ACPI_RSD_1BITFLAG,
|
||||
ACPI_RSD_OFFSET(spi_serial_bus.
|
||||
wire_mode), "WireMode",
|
||||
acpi_gbl_wm_decode},
|
||||
{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(spi_serial_bus.device_polarity),
|
||||
"DevicePolarity", acpi_gbl_dp_decode},
|
||||
{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(spi_serial_bus.data_bit_length),
|
||||
"DataBitLength", NULL},
|
||||
{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(spi_serial_bus.clock_phase),
|
||||
"ClockPhase", acpi_gbl_cph_decode},
|
||||
{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(spi_serial_bus.clock_polarity),
|
||||
"ClockPolarity", acpi_gbl_cpo_decode},
|
||||
{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(spi_serial_bus.device_selection),
|
||||
"DeviceSelection", NULL},
|
||||
{ACPI_RSD_UINT32, ACPI_RSD_OFFSET(spi_serial_bus.connection_speed),
|
||||
"ConnectionSpeed", NULL},
|
||||
};
|
||||
|
||||
struct acpi_rsdump_info acpi_rs_dump_uart_serial_bus[19] = {
|
||||
{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_uart_serial_bus),
|
||||
"Uart Serial Bus", NULL},
|
||||
ACPI_RS_DUMP_COMMON_SERIAL_BUS {ACPI_RSD_2BITFLAG,
|
||||
ACPI_RSD_OFFSET(uart_serial_bus.
|
||||
flow_control),
|
||||
"FlowControl", acpi_gbl_fc_decode},
|
||||
{ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET(uart_serial_bus.stop_bits),
|
||||
"StopBits", acpi_gbl_sb_decode},
|
||||
{ACPI_RSD_3BITFLAG, ACPI_RSD_OFFSET(uart_serial_bus.data_bits),
|
||||
"DataBits", acpi_gbl_bpb_decode},
|
||||
{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(uart_serial_bus.endian), "Endian",
|
||||
acpi_gbl_ed_decode},
|
||||
{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(uart_serial_bus.parity), "Parity",
|
||||
acpi_gbl_pt_decode},
|
||||
{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(uart_serial_bus.lines_enabled),
|
||||
"LinesEnabled", NULL},
|
||||
{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(uart_serial_bus.rx_fifo_size),
|
||||
"RxFifoSize", NULL},
|
||||
{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(uart_serial_bus.tx_fifo_size),
|
||||
"TxFifoSize", NULL},
|
||||
{ACPI_RSD_UINT32, ACPI_RSD_OFFSET(uart_serial_bus.default_baud_rate),
|
||||
"ConnectionSpeed", NULL},
|
||||
};
|
||||
|
||||
/*
|
||||
* Tables used for common address descriptor flag fields
|
||||
*/
|
||||
static struct acpi_rsdump_info acpi_rs_dump_general_flags[5] = {
|
||||
{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_general_flags), NULL,
|
||||
NULL},
|
||||
{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(address.producer_consumer),
|
||||
"Consumer/Producer", acpi_gbl_consume_decode},
|
||||
{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(address.decode), "Address Decode",
|
||||
acpi_gbl_dec_decode},
|
||||
{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(address.min_address_fixed),
|
||||
"Min Relocatability", acpi_gbl_min_decode},
|
||||
{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(address.max_address_fixed),
|
||||
"Max Relocatability", acpi_gbl_max_decode}
|
||||
};
|
||||
|
||||
static struct acpi_rsdump_info acpi_rs_dump_memory_flags[5] = {
|
||||
{ACPI_RSD_LITERAL, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_memory_flags),
|
||||
"Resource Type", (void *)"Memory Range"},
|
||||
{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(address.info.mem.write_protect),
|
||||
"Write Protect", acpi_gbl_rw_decode},
|
||||
{ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET(address.info.mem.caching),
|
||||
"Caching", acpi_gbl_mem_decode},
|
||||
{ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET(address.info.mem.range_type),
|
||||
"Range Type", acpi_gbl_mtp_decode},
|
||||
{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(address.info.mem.translation),
|
||||
"Translation", acpi_gbl_ttp_decode}
|
||||
};
|
||||
|
||||
static struct acpi_rsdump_info acpi_rs_dump_io_flags[4] = {
|
||||
{ACPI_RSD_LITERAL, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_io_flags),
|
||||
"Resource Type", (void *)"I/O Range"},
|
||||
{ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET(address.info.io.range_type),
|
||||
"Range Type", acpi_gbl_rng_decode},
|
||||
{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(address.info.io.translation),
|
||||
"Translation", acpi_gbl_ttp_decode},
|
||||
{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(address.info.io.translation_type),
|
||||
"Translation Type", acpi_gbl_trs_decode}
|
||||
};
|
||||
|
||||
/*
|
||||
* Table used to dump _PRT contents
|
||||
*/
|
||||
static struct acpi_rsdump_info acpi_rs_dump_prt[5] = {
|
||||
{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_prt), NULL, NULL},
|
||||
{ACPI_RSD_UINT64, ACPI_PRT_OFFSET(address), "Address", NULL},
|
||||
{ACPI_RSD_UINT32, ACPI_PRT_OFFSET(pin), "Pin", NULL},
|
||||
{ACPI_RSD_STRING, ACPI_PRT_OFFSET(source[0]), "Source", NULL},
|
||||
{ACPI_RSD_UINT32, ACPI_PRT_OFFSET(source_index), "Source Index", NULL}
|
||||
};
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_rs_dump_descriptor
|
||||
*
|
||||
* PARAMETERS: Resource
|
||||
* PARAMETERS: resource - Buffer containing the resource
|
||||
* table - Table entry to decode the resource
|
||||
*
|
||||
* RETURN: None
|
||||
*
|
||||
* DESCRIPTION:
|
||||
* DESCRIPTION: Dump a resource descriptor based on a dump table entry.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
@ -654,7 +251,8 @@ acpi_rs_dump_descriptor(void *resource, struct acpi_rsdump_info *table)
|
||||
/*
|
||||
* Optional resource_source for Address resources
|
||||
*/
|
||||
acpi_rs_dump_resource_source(ACPI_CAST_PTR(struct
|
||||
acpi_rs_dump_resource_source(ACPI_CAST_PTR
|
||||
(struct
|
||||
acpi_resource_source,
|
||||
target));
|
||||
break;
|
||||
@ -765,8 +363,9 @@ void acpi_rs_dump_resource_list(struct acpi_resource *resource_list)
|
||||
|
||||
ACPI_FUNCTION_ENTRY();
|
||||
|
||||
if (!(acpi_dbg_level & ACPI_LV_RESOURCES)
|
||||
|| !(_COMPONENT & acpi_dbg_layer)) {
|
||||
/* Check if debug output enabled */
|
||||
|
||||
if (!ACPI_IS_DEBUG_ENABLED(ACPI_LV_RESOURCES, _COMPONENT)) {
|
||||
return;
|
||||
}
|
||||
|
||||
@ -827,8 +426,9 @@ void acpi_rs_dump_irq_list(u8 * route_table)
|
||||
|
||||
ACPI_FUNCTION_ENTRY();
|
||||
|
||||
if (!(acpi_dbg_level & ACPI_LV_RESOURCES)
|
||||
|| !(_COMPONENT & acpi_dbg_layer)) {
|
||||
/* Check if debug output enabled */
|
||||
|
||||
if (!ACPI_IS_DEBUG_ENABLED(ACPI_LV_RESOURCES, _COMPONENT)) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
454
drivers/acpi/acpica/rsdumpinfo.c
Normal file
454
drivers/acpi/acpica/rsdumpinfo.c
Normal file
@ -0,0 +1,454 @@
|
||||
/*******************************************************************************
|
||||
*
|
||||
* Module Name: rsdumpinfo - Tables used to display resource descriptors.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2000 - 2012, Intel Corp.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions, and the following disclaimer,
|
||||
* without modification.
|
||||
* 2. Redistributions in binary form must reproduce at minimum a disclaimer
|
||||
* substantially similar to the "NO WARRANTY" disclaimer below
|
||||
* ("Disclaimer") and any redistribution must be conditioned upon
|
||||
* including a substantially similar Disclaimer requirement for further
|
||||
* binary redistribution.
|
||||
* 3. Neither the names of the above-listed copyright holders nor the names
|
||||
* of any contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* Alternatively, this software may be distributed under the terms of the
|
||||
* GNU General Public License ("GPL") version 2 as published by the Free
|
||||
* Software Foundation.
|
||||
*
|
||||
* NO WARRANTY
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGES.
|
||||
*/
|
||||
|
||||
#include <acpi/acpi.h>
|
||||
#include "accommon.h"
|
||||
#include "acresrc.h"
|
||||
|
||||
#define _COMPONENT ACPI_RESOURCES
|
||||
ACPI_MODULE_NAME("rsdumpinfo")
|
||||
|
||||
#if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER)
|
||||
#define ACPI_RSD_OFFSET(f) (u8) ACPI_OFFSET (union acpi_resource_data,f)
|
||||
#define ACPI_PRT_OFFSET(f) (u8) ACPI_OFFSET (struct acpi_pci_routing_table,f)
|
||||
#define ACPI_RSD_TABLE_SIZE(name) (sizeof(name) / sizeof (struct acpi_rsdump_info))
|
||||
/*******************************************************************************
|
||||
*
|
||||
* Resource Descriptor info tables
|
||||
*
|
||||
* Note: The first table entry must be a Title or Literal and must contain
|
||||
* the table length (number of table entries)
|
||||
*
|
||||
******************************************************************************/
|
||||
struct acpi_rsdump_info acpi_rs_dump_irq[7] = {
|
||||
{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_irq), "IRQ", NULL},
|
||||
{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(irq.descriptor_length),
|
||||
"Descriptor Length", NULL},
|
||||
{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(irq.triggering), "Triggering",
|
||||
acpi_gbl_he_decode},
|
||||
{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(irq.polarity), "Polarity",
|
||||
acpi_gbl_ll_decode},
|
||||
{ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET(irq.sharable), "Sharing",
|
||||
acpi_gbl_shr_decode},
|
||||
{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(irq.interrupt_count),
|
||||
"Interrupt Count", NULL},
|
||||
{ACPI_RSD_SHORTLIST, ACPI_RSD_OFFSET(irq.interrupts[0]),
|
||||
"Interrupt List", NULL}
|
||||
};
|
||||
|
||||
struct acpi_rsdump_info acpi_rs_dump_dma[6] = {
|
||||
{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_dma), "DMA", NULL},
|
||||
{ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET(dma.type), "Speed",
|
||||
acpi_gbl_typ_decode},
|
||||
{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(dma.bus_master), "Mastering",
|
||||
acpi_gbl_bm_decode},
|
||||
{ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET(dma.transfer), "Transfer Type",
|
||||
acpi_gbl_siz_decode},
|
||||
{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(dma.channel_count), "Channel Count",
|
||||
NULL},
|
||||
{ACPI_RSD_SHORTLIST, ACPI_RSD_OFFSET(dma.channels[0]), "Channel List",
|
||||
NULL}
|
||||
};
|
||||
|
||||
struct acpi_rsdump_info acpi_rs_dump_start_dpf[4] = {
|
||||
{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_start_dpf),
|
||||
"Start-Dependent-Functions", NULL},
|
||||
{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(start_dpf.descriptor_length),
|
||||
"Descriptor Length", NULL},
|
||||
{ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET(start_dpf.compatibility_priority),
|
||||
"Compatibility Priority", acpi_gbl_config_decode},
|
||||
{ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET(start_dpf.performance_robustness),
|
||||
"Performance/Robustness", acpi_gbl_config_decode}
|
||||
};
|
||||
|
||||
struct acpi_rsdump_info acpi_rs_dump_end_dpf[1] = {
|
||||
{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_end_dpf),
|
||||
"End-Dependent-Functions", NULL}
|
||||
};
|
||||
|
||||
struct acpi_rsdump_info acpi_rs_dump_io[6] = {
|
||||
{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_io), "I/O", NULL},
|
||||
{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(io.io_decode), "Address Decoding",
|
||||
acpi_gbl_io_decode},
|
||||
{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(io.minimum), "Address Minimum", NULL},
|
||||
{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(io.maximum), "Address Maximum", NULL},
|
||||
{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(io.alignment), "Alignment", NULL},
|
||||
{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(io.address_length), "Address Length",
|
||||
NULL}
|
||||
};
|
||||
|
||||
struct acpi_rsdump_info acpi_rs_dump_fixed_io[3] = {
|
||||
{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_fixed_io),
|
||||
"Fixed I/O", NULL},
|
||||
{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(fixed_io.address), "Address", NULL},
|
||||
{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(fixed_io.address_length),
|
||||
"Address Length", NULL}
|
||||
};
|
||||
|
||||
struct acpi_rsdump_info acpi_rs_dump_vendor[3] = {
|
||||
{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_vendor),
|
||||
"Vendor Specific", NULL},
|
||||
{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(vendor.byte_length), "Length", NULL},
|
||||
{ACPI_RSD_LONGLIST, ACPI_RSD_OFFSET(vendor.byte_data[0]), "Vendor Data",
|
||||
NULL}
|
||||
};
|
||||
|
||||
struct acpi_rsdump_info acpi_rs_dump_end_tag[1] = {
|
||||
{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_end_tag), "EndTag",
|
||||
NULL}
|
||||
};
|
||||
|
||||
struct acpi_rsdump_info acpi_rs_dump_memory24[6] = {
|
||||
{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_memory24),
|
||||
"24-Bit Memory Range", NULL},
|
||||
{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(memory24.write_protect),
|
||||
"Write Protect", acpi_gbl_rw_decode},
|
||||
{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(memory24.minimum), "Address Minimum",
|
||||
NULL},
|
||||
{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(memory24.maximum), "Address Maximum",
|
||||
NULL},
|
||||
{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(memory24.alignment), "Alignment",
|
||||
NULL},
|
||||
{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(memory24.address_length),
|
||||
"Address Length", NULL}
|
||||
};
|
||||
|
||||
struct acpi_rsdump_info acpi_rs_dump_memory32[6] = {
|
||||
{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_memory32),
|
||||
"32-Bit Memory Range", NULL},
|
||||
{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(memory32.write_protect),
|
||||
"Write Protect", acpi_gbl_rw_decode},
|
||||
{ACPI_RSD_UINT32, ACPI_RSD_OFFSET(memory32.minimum), "Address Minimum",
|
||||
NULL},
|
||||
{ACPI_RSD_UINT32, ACPI_RSD_OFFSET(memory32.maximum), "Address Maximum",
|
||||
NULL},
|
||||
{ACPI_RSD_UINT32, ACPI_RSD_OFFSET(memory32.alignment), "Alignment",
|
||||
NULL},
|
||||
{ACPI_RSD_UINT32, ACPI_RSD_OFFSET(memory32.address_length),
|
||||
"Address Length", NULL}
|
||||
};
|
||||
|
||||
struct acpi_rsdump_info acpi_rs_dump_fixed_memory32[4] = {
|
||||
{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_fixed_memory32),
|
||||
"32-Bit Fixed Memory Range", NULL},
|
||||
{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(fixed_memory32.write_protect),
|
||||
"Write Protect", acpi_gbl_rw_decode},
|
||||
{ACPI_RSD_UINT32, ACPI_RSD_OFFSET(fixed_memory32.address), "Address",
|
||||
NULL},
|
||||
{ACPI_RSD_UINT32, ACPI_RSD_OFFSET(fixed_memory32.address_length),
|
||||
"Address Length", NULL}
|
||||
};
|
||||
|
||||
struct acpi_rsdump_info acpi_rs_dump_address16[8] = {
|
||||
{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_address16),
|
||||
"16-Bit WORD Address Space", NULL},
|
||||
{ACPI_RSD_ADDRESS, 0, NULL, NULL},
|
||||
{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(address16.granularity), "Granularity",
|
||||
NULL},
|
||||
{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(address16.minimum), "Address Minimum",
|
||||
NULL},
|
||||
{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(address16.maximum), "Address Maximum",
|
||||
NULL},
|
||||
{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(address16.translation_offset),
|
||||
"Translation Offset", NULL},
|
||||
{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(address16.address_length),
|
||||
"Address Length", NULL},
|
||||
{ACPI_RSD_SOURCE, ACPI_RSD_OFFSET(address16.resource_source), NULL, NULL}
|
||||
};
|
||||
|
||||
struct acpi_rsdump_info acpi_rs_dump_address32[8] = {
|
||||
{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_address32),
|
||||
"32-Bit DWORD Address Space", NULL},
|
||||
{ACPI_RSD_ADDRESS, 0, NULL, NULL},
|
||||
{ACPI_RSD_UINT32, ACPI_RSD_OFFSET(address32.granularity), "Granularity",
|
||||
NULL},
|
||||
{ACPI_RSD_UINT32, ACPI_RSD_OFFSET(address32.minimum), "Address Minimum",
|
||||
NULL},
|
||||
{ACPI_RSD_UINT32, ACPI_RSD_OFFSET(address32.maximum), "Address Maximum",
|
||||
NULL},
|
||||
{ACPI_RSD_UINT32, ACPI_RSD_OFFSET(address32.translation_offset),
|
||||
"Translation Offset", NULL},
|
||||
{ACPI_RSD_UINT32, ACPI_RSD_OFFSET(address32.address_length),
|
||||
"Address Length", NULL},
|
||||
{ACPI_RSD_SOURCE, ACPI_RSD_OFFSET(address32.resource_source), NULL, NULL}
|
||||
};
|
||||
|
||||
struct acpi_rsdump_info acpi_rs_dump_address64[8] = {
|
||||
{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_address64),
|
||||
"64-Bit QWORD Address Space", NULL},
|
||||
{ACPI_RSD_ADDRESS, 0, NULL, NULL},
|
||||
{ACPI_RSD_UINT64, ACPI_RSD_OFFSET(address64.granularity), "Granularity",
|
||||
NULL},
|
||||
{ACPI_RSD_UINT64, ACPI_RSD_OFFSET(address64.minimum), "Address Minimum",
|
||||
NULL},
|
||||
{ACPI_RSD_UINT64, ACPI_RSD_OFFSET(address64.maximum), "Address Maximum",
|
||||
NULL},
|
||||
{ACPI_RSD_UINT64, ACPI_RSD_OFFSET(address64.translation_offset),
|
||||
"Translation Offset", NULL},
|
||||
{ACPI_RSD_UINT64, ACPI_RSD_OFFSET(address64.address_length),
|
||||
"Address Length", NULL},
|
||||
{ACPI_RSD_SOURCE, ACPI_RSD_OFFSET(address64.resource_source), NULL, NULL}
|
||||
};
|
||||
|
||||
struct acpi_rsdump_info acpi_rs_dump_ext_address64[8] = {
|
||||
{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_ext_address64),
|
||||
"64-Bit Extended Address Space", NULL},
|
||||
{ACPI_RSD_ADDRESS, 0, NULL, NULL},
|
||||
{ACPI_RSD_UINT64, ACPI_RSD_OFFSET(ext_address64.granularity),
|
||||
"Granularity", NULL},
|
||||
{ACPI_RSD_UINT64, ACPI_RSD_OFFSET(ext_address64.minimum),
|
||||
"Address Minimum", NULL},
|
||||
{ACPI_RSD_UINT64, ACPI_RSD_OFFSET(ext_address64.maximum),
|
||||
"Address Maximum", NULL},
|
||||
{ACPI_RSD_UINT64, ACPI_RSD_OFFSET(ext_address64.translation_offset),
|
||||
"Translation Offset", NULL},
|
||||
{ACPI_RSD_UINT64, ACPI_RSD_OFFSET(ext_address64.address_length),
|
||||
"Address Length", NULL},
|
||||
{ACPI_RSD_UINT64, ACPI_RSD_OFFSET(ext_address64.type_specific),
|
||||
"Type-Specific Attribute", NULL}
|
||||
};
|
||||
|
||||
struct acpi_rsdump_info acpi_rs_dump_ext_irq[8] = {
|
||||
{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_ext_irq),
|
||||
"Extended IRQ", NULL},
|
||||
{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(extended_irq.producer_consumer),
|
||||
"Type", acpi_gbl_consume_decode},
|
||||
{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(extended_irq.triggering),
|
||||
"Triggering", acpi_gbl_he_decode},
|
||||
{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(extended_irq.polarity), "Polarity",
|
||||
acpi_gbl_ll_decode},
|
||||
{ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET(extended_irq.sharable), "Sharing",
|
||||
acpi_gbl_shr_decode},
|
||||
{ACPI_RSD_SOURCE, ACPI_RSD_OFFSET(extended_irq.resource_source), NULL,
|
||||
NULL},
|
||||
{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(extended_irq.interrupt_count),
|
||||
"Interrupt Count", NULL},
|
||||
{ACPI_RSD_DWORDLIST, ACPI_RSD_OFFSET(extended_irq.interrupts[0]),
|
||||
"Interrupt List", NULL}
|
||||
};
|
||||
|
||||
struct acpi_rsdump_info acpi_rs_dump_generic_reg[6] = {
|
||||
{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_generic_reg),
|
||||
"Generic Register", NULL},
|
||||
{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(generic_reg.space_id), "Space ID",
|
||||
NULL},
|
||||
{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(generic_reg.bit_width), "Bit Width",
|
||||
NULL},
|
||||
{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(generic_reg.bit_offset), "Bit Offset",
|
||||
NULL},
|
||||
{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(generic_reg.access_size),
|
||||
"Access Size", NULL},
|
||||
{ACPI_RSD_UINT64, ACPI_RSD_OFFSET(generic_reg.address), "Address", NULL}
|
||||
};
|
||||
|
||||
struct acpi_rsdump_info acpi_rs_dump_gpio[16] = {
|
||||
{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_gpio), "GPIO", NULL},
|
||||
{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(gpio.revision_id), "RevisionId", NULL},
|
||||
{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(gpio.connection_type),
|
||||
"ConnectionType", acpi_gbl_ct_decode},
|
||||
{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(gpio.producer_consumer),
|
||||
"ProducerConsumer", acpi_gbl_consume_decode},
|
||||
{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(gpio.pin_config), "PinConfig",
|
||||
acpi_gbl_ppc_decode},
|
||||
{ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET(gpio.sharable), "Sharing",
|
||||
acpi_gbl_shr_decode},
|
||||
{ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET(gpio.io_restriction),
|
||||
"IoRestriction", acpi_gbl_ior_decode},
|
||||
{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(gpio.triggering), "Triggering",
|
||||
acpi_gbl_he_decode},
|
||||
{ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET(gpio.polarity), "Polarity",
|
||||
acpi_gbl_ll_decode},
|
||||
{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(gpio.drive_strength), "DriveStrength",
|
||||
NULL},
|
||||
{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(gpio.debounce_timeout),
|
||||
"DebounceTimeout", NULL},
|
||||
{ACPI_RSD_SOURCE, ACPI_RSD_OFFSET(gpio.resource_source),
|
||||
"ResourceSource", NULL},
|
||||
{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(gpio.pin_table_length),
|
||||
"PinTableLength", NULL},
|
||||
{ACPI_RSD_WORDLIST, ACPI_RSD_OFFSET(gpio.pin_table), "PinTable", NULL},
|
||||
{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(gpio.vendor_length), "VendorLength",
|
||||
NULL},
|
||||
{ACPI_RSD_SHORTLISTX, ACPI_RSD_OFFSET(gpio.vendor_data), "VendorData",
|
||||
NULL},
|
||||
};
|
||||
|
||||
struct acpi_rsdump_info acpi_rs_dump_fixed_dma[4] = {
|
||||
{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_fixed_dma),
|
||||
"FixedDma", NULL},
|
||||
{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(fixed_dma.request_lines),
|
||||
"RequestLines", NULL},
|
||||
{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(fixed_dma.channels), "Channels",
|
||||
NULL},
|
||||
{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(fixed_dma.width), "TransferWidth",
|
||||
acpi_gbl_dts_decode},
|
||||
};
|
||||
|
||||
#define ACPI_RS_DUMP_COMMON_SERIAL_BUS \
|
||||
{ACPI_RSD_UINT8, ACPI_RSD_OFFSET (common_serial_bus.revision_id), "RevisionId", NULL}, \
|
||||
{ACPI_RSD_UINT8, ACPI_RSD_OFFSET (common_serial_bus.type), "Type", acpi_gbl_sbt_decode}, \
|
||||
{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (common_serial_bus.producer_consumer), "ProducerConsumer", acpi_gbl_consume_decode}, \
|
||||
{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (common_serial_bus.slave_mode), "SlaveMode", acpi_gbl_sm_decode}, \
|
||||
{ACPI_RSD_UINT8, ACPI_RSD_OFFSET (common_serial_bus.type_revision_id), "TypeRevisionId", NULL}, \
|
||||
{ACPI_RSD_UINT16, ACPI_RSD_OFFSET (common_serial_bus.type_data_length), "TypeDataLength", NULL}, \
|
||||
{ACPI_RSD_SOURCE, ACPI_RSD_OFFSET (common_serial_bus.resource_source), "ResourceSource", NULL}, \
|
||||
{ACPI_RSD_UINT16, ACPI_RSD_OFFSET (common_serial_bus.vendor_length), "VendorLength", NULL}, \
|
||||
{ACPI_RSD_SHORTLISTX,ACPI_RSD_OFFSET (common_serial_bus.vendor_data), "VendorData", NULL},
|
||||
|
||||
struct acpi_rsdump_info acpi_rs_dump_common_serial_bus[10] = {
|
||||
{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_common_serial_bus),
|
||||
"Common Serial Bus", NULL},
|
||||
ACPI_RS_DUMP_COMMON_SERIAL_BUS
|
||||
};
|
||||
|
||||
struct acpi_rsdump_info acpi_rs_dump_i2c_serial_bus[13] = {
|
||||
{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_i2c_serial_bus),
|
||||
"I2C Serial Bus", NULL},
|
||||
ACPI_RS_DUMP_COMMON_SERIAL_BUS {ACPI_RSD_1BITFLAG,
|
||||
ACPI_RSD_OFFSET(i2c_serial_bus.
|
||||
access_mode),
|
||||
"AccessMode", acpi_gbl_am_decode},
|
||||
{ACPI_RSD_UINT32, ACPI_RSD_OFFSET(i2c_serial_bus.connection_speed),
|
||||
"ConnectionSpeed", NULL},
|
||||
{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(i2c_serial_bus.slave_address),
|
||||
"SlaveAddress", NULL},
|
||||
};
|
||||
|
||||
struct acpi_rsdump_info acpi_rs_dump_spi_serial_bus[17] = {
|
||||
{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_spi_serial_bus),
|
||||
"Spi Serial Bus", NULL},
|
||||
ACPI_RS_DUMP_COMMON_SERIAL_BUS {ACPI_RSD_1BITFLAG,
|
||||
ACPI_RSD_OFFSET(spi_serial_bus.
|
||||
wire_mode), "WireMode",
|
||||
acpi_gbl_wm_decode},
|
||||
{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(spi_serial_bus.device_polarity),
|
||||
"DevicePolarity", acpi_gbl_dp_decode},
|
||||
{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(spi_serial_bus.data_bit_length),
|
||||
"DataBitLength", NULL},
|
||||
{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(spi_serial_bus.clock_phase),
|
||||
"ClockPhase", acpi_gbl_cph_decode},
|
||||
{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(spi_serial_bus.clock_polarity),
|
||||
"ClockPolarity", acpi_gbl_cpo_decode},
|
||||
{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(spi_serial_bus.device_selection),
|
||||
"DeviceSelection", NULL},
|
||||
{ACPI_RSD_UINT32, ACPI_RSD_OFFSET(spi_serial_bus.connection_speed),
|
||||
"ConnectionSpeed", NULL},
|
||||
};
|
||||
|
||||
struct acpi_rsdump_info acpi_rs_dump_uart_serial_bus[19] = {
|
||||
{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_uart_serial_bus),
|
||||
"Uart Serial Bus", NULL},
|
||||
ACPI_RS_DUMP_COMMON_SERIAL_BUS {ACPI_RSD_2BITFLAG,
|
||||
ACPI_RSD_OFFSET(uart_serial_bus.
|
||||
flow_control),
|
||||
"FlowControl", acpi_gbl_fc_decode},
|
||||
{ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET(uart_serial_bus.stop_bits),
|
||||
"StopBits", acpi_gbl_sb_decode},
|
||||
{ACPI_RSD_3BITFLAG, ACPI_RSD_OFFSET(uart_serial_bus.data_bits),
|
||||
"DataBits", acpi_gbl_bpb_decode},
|
||||
{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(uart_serial_bus.endian), "Endian",
|
||||
acpi_gbl_ed_decode},
|
||||
{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(uart_serial_bus.parity), "Parity",
|
||||
acpi_gbl_pt_decode},
|
||||
{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(uart_serial_bus.lines_enabled),
|
||||
"LinesEnabled", NULL},
|
||||
{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(uart_serial_bus.rx_fifo_size),
|
||||
"RxFifoSize", NULL},
|
||||
{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(uart_serial_bus.tx_fifo_size),
|
||||
"TxFifoSize", NULL},
|
||||
{ACPI_RSD_UINT32, ACPI_RSD_OFFSET(uart_serial_bus.default_baud_rate),
|
||||
"ConnectionSpeed", NULL},
|
||||
};
|
||||
|
||||
/*
|
||||
* Tables used for common address descriptor flag fields
|
||||
*/
|
||||
struct acpi_rsdump_info acpi_rs_dump_general_flags[5] = {
|
||||
{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_general_flags), NULL,
|
||||
NULL},
|
||||
{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(address.producer_consumer),
|
||||
"Consumer/Producer", acpi_gbl_consume_decode},
|
||||
{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(address.decode), "Address Decode",
|
||||
acpi_gbl_dec_decode},
|
||||
{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(address.min_address_fixed),
|
||||
"Min Relocatability", acpi_gbl_min_decode},
|
||||
{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(address.max_address_fixed),
|
||||
"Max Relocatability", acpi_gbl_max_decode}
|
||||
};
|
||||
|
||||
struct acpi_rsdump_info acpi_rs_dump_memory_flags[5] = {
|
||||
{ACPI_RSD_LITERAL, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_memory_flags),
|
||||
"Resource Type", (void *)"Memory Range"},
|
||||
{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(address.info.mem.write_protect),
|
||||
"Write Protect", acpi_gbl_rw_decode},
|
||||
{ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET(address.info.mem.caching),
|
||||
"Caching", acpi_gbl_mem_decode},
|
||||
{ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET(address.info.mem.range_type),
|
||||
"Range Type", acpi_gbl_mtp_decode},
|
||||
{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(address.info.mem.translation),
|
||||
"Translation", acpi_gbl_ttp_decode}
|
||||
};
|
||||
|
||||
struct acpi_rsdump_info acpi_rs_dump_io_flags[4] = {
|
||||
{ACPI_RSD_LITERAL, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_io_flags),
|
||||
"Resource Type", (void *)"I/O Range"},
|
||||
{ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET(address.info.io.range_type),
|
||||
"Range Type", acpi_gbl_rng_decode},
|
||||
{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(address.info.io.translation),
|
||||
"Translation", acpi_gbl_ttp_decode},
|
||||
{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(address.info.io.translation_type),
|
||||
"Translation Type", acpi_gbl_trs_decode}
|
||||
};
|
||||
|
||||
/*
|
||||
* Table used to dump _PRT contents
|
||||
*/
|
||||
struct acpi_rsdump_info acpi_rs_dump_prt[5] = {
|
||||
{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_prt), NULL, NULL},
|
||||
{ACPI_RSD_UINT64, ACPI_PRT_OFFSET(address), "Address", NULL},
|
||||
{ACPI_RSD_UINT32, ACPI_PRT_OFFSET(pin), "Pin", NULL},
|
||||
{ACPI_RSD_STRING, ACPI_PRT_OFFSET(source[0]), "Source", NULL},
|
||||
{ACPI_RSD_UINT32, ACPI_PRT_OFFSET(source_index), "Source Index", NULL}
|
||||
};
|
||||
|
||||
#endif
|
@ -53,7 +53,7 @@ ACPI_MODULE_NAME("rsirq")
|
||||
* acpi_rs_get_irq
|
||||
*
|
||||
******************************************************************************/
|
||||
struct acpi_rsconvert_info acpi_rs_get_irq[8] = {
|
||||
struct acpi_rsconvert_info acpi_rs_get_irq[9] = {
|
||||
{ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_IRQ,
|
||||
ACPI_RS_SIZE(struct acpi_resource_irq),
|
||||
ACPI_RSC_TABLE_SIZE(acpi_rs_get_irq)},
|
||||
@ -80,41 +80,7 @@ struct acpi_rsconvert_info acpi_rs_get_irq[8] = {
|
||||
|
||||
{ACPI_RSC_EXIT_NE, ACPI_RSC_COMPARE_AML_LENGTH, 0, 3},
|
||||
|
||||
/* Get flags: Triggering[0], Polarity[3], Sharing[4] */
|
||||
|
||||
{ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.irq.triggering),
|
||||
AML_OFFSET(irq.flags),
|
||||
0},
|
||||
|
||||
{ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.irq.polarity),
|
||||
AML_OFFSET(irq.flags),
|
||||
3},
|
||||
|
||||
{ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.irq.sharable),
|
||||
AML_OFFSET(irq.flags),
|
||||
4}
|
||||
};
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* acpi_rs_set_irq
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
struct acpi_rsconvert_info acpi_rs_set_irq[13] = {
|
||||
/* Start with a default descriptor of length 3 */
|
||||
|
||||
{ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_IRQ,
|
||||
sizeof(struct aml_resource_irq),
|
||||
ACPI_RSC_TABLE_SIZE(acpi_rs_set_irq)},
|
||||
|
||||
/* Convert interrupt list to 16-bit IRQ bitmask */
|
||||
|
||||
{ACPI_RSC_BITMASK16, ACPI_RS_OFFSET(data.irq.interrupts[0]),
|
||||
AML_OFFSET(irq.irq_mask),
|
||||
ACPI_RS_OFFSET(data.irq.interrupt_count)},
|
||||
|
||||
/* Set the flags byte */
|
||||
/* Get flags: Triggering[0], Polarity[3], Sharing[4], Wake[5] */
|
||||
|
||||
{ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.irq.triggering),
|
||||
AML_OFFSET(irq.flags),
|
||||
@ -128,6 +94,48 @@ struct acpi_rsconvert_info acpi_rs_set_irq[13] = {
|
||||
AML_OFFSET(irq.flags),
|
||||
4},
|
||||
|
||||
{ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.irq.wake_capable),
|
||||
AML_OFFSET(irq.flags),
|
||||
5}
|
||||
};
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* acpi_rs_set_irq
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
struct acpi_rsconvert_info acpi_rs_set_irq[14] = {
|
||||
/* Start with a default descriptor of length 3 */
|
||||
|
||||
{ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_IRQ,
|
||||
sizeof(struct aml_resource_irq),
|
||||
ACPI_RSC_TABLE_SIZE(acpi_rs_set_irq)},
|
||||
|
||||
/* Convert interrupt list to 16-bit IRQ bitmask */
|
||||
|
||||
{ACPI_RSC_BITMASK16, ACPI_RS_OFFSET(data.irq.interrupts[0]),
|
||||
AML_OFFSET(irq.irq_mask),
|
||||
ACPI_RS_OFFSET(data.irq.interrupt_count)},
|
||||
|
||||
/* Set flags: Triggering[0], Polarity[3], Sharing[4], Wake[5] */
|
||||
|
||||
{ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.irq.triggering),
|
||||
AML_OFFSET(irq.flags),
|
||||
0},
|
||||
|
||||
{ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.irq.polarity),
|
||||
AML_OFFSET(irq.flags),
|
||||
3},
|
||||
|
||||
{ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.irq.sharable),
|
||||
AML_OFFSET(irq.flags),
|
||||
4},
|
||||
|
||||
{ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.irq.wake_capable),
|
||||
AML_OFFSET(irq.flags),
|
||||
5},
|
||||
|
||||
/*
|
||||
* All done if the output descriptor length is required to be 3
|
||||
* (i.e., optimization to 2 bytes cannot be attempted)
|
||||
@ -181,7 +189,7 @@ struct acpi_rsconvert_info acpi_rs_set_irq[13] = {
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
struct acpi_rsconvert_info acpi_rs_convert_ext_irq[9] = {
|
||||
struct acpi_rsconvert_info acpi_rs_convert_ext_irq[10] = {
|
||||
{ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_EXTENDED_IRQ,
|
||||
ACPI_RS_SIZE(struct acpi_resource_extended_irq),
|
||||
ACPI_RSC_TABLE_SIZE(acpi_rs_convert_ext_irq)},
|
||||
@ -190,8 +198,10 @@ struct acpi_rsconvert_info acpi_rs_convert_ext_irq[9] = {
|
||||
sizeof(struct aml_resource_extended_irq),
|
||||
0},
|
||||
|
||||
/* Flag bits */
|
||||
|
||||
/*
|
||||
* Flags: Producer/Consumer[0], Triggering[1], Polarity[2],
|
||||
* Sharing[3], Wake[4]
|
||||
*/
|
||||
{ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.extended_irq.producer_consumer),
|
||||
AML_OFFSET(extended_irq.flags),
|
||||
0},
|
||||
@ -208,19 +218,21 @@ struct acpi_rsconvert_info acpi_rs_convert_ext_irq[9] = {
|
||||
AML_OFFSET(extended_irq.flags),
|
||||
3},
|
||||
|
||||
{ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.extended_irq.wake_capable),
|
||||
AML_OFFSET(extended_irq.flags),
|
||||
4},
|
||||
|
||||
/* IRQ Table length (Byte4) */
|
||||
|
||||
{ACPI_RSC_COUNT, ACPI_RS_OFFSET(data.extended_irq.interrupt_count),
|
||||
AML_OFFSET(extended_irq.interrupt_count),
|
||||
sizeof(u32)}
|
||||
,
|
||||
sizeof(u32)},
|
||||
|
||||
/* Copy every IRQ in the table, each is 32 bits */
|
||||
|
||||
{ACPI_RSC_MOVE32, ACPI_RS_OFFSET(data.extended_irq.interrupts[0]),
|
||||
AML_OFFSET(extended_irq.interrupts[0]),
|
||||
0}
|
||||
,
|
||||
0},
|
||||
|
||||
/* Optional resource_source (Index and String) */
|
||||
|
||||
@ -285,7 +297,6 @@ struct acpi_rsconvert_info acpi_rs_convert_fixed_dma[4] = {
|
||||
* request_lines
|
||||
* Channels
|
||||
*/
|
||||
|
||||
{ACPI_RSC_MOVE16, ACPI_RS_OFFSET(data.fixed_dma.request_lines),
|
||||
AML_OFFSET(fixed_dma.request_lines),
|
||||
2},
|
||||
@ -293,5 +304,4 @@ struct acpi_rsconvert_info acpi_rs_convert_fixed_dma[4] = {
|
||||
{ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.fixed_dma.width),
|
||||
AML_OFFSET(fixed_dma.width),
|
||||
1},
|
||||
|
||||
};
|
||||
|
@ -217,9 +217,10 @@ acpi_rs_convert_resources_to_aml(struct acpi_resource *resource,
|
||||
|
||||
/* Perform final sanity check on the new AML resource descriptor */
|
||||
|
||||
status =
|
||||
acpi_ut_validate_resource(ACPI_CAST_PTR
|
||||
(union aml_resource, aml), NULL);
|
||||
status = acpi_ut_validate_resource(NULL,
|
||||
ACPI_CAST_PTR(union
|
||||
aml_resource,
|
||||
aml), NULL);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
@ -156,8 +156,7 @@ struct acpi_rsconvert_info acpi_rs_get_vendor_small[3] = {
|
||||
|
||||
{ACPI_RSC_COUNT16, ACPI_RS_OFFSET(data.vendor.byte_length),
|
||||
0,
|
||||
sizeof(u8)}
|
||||
,
|
||||
sizeof(u8)},
|
||||
|
||||
/* Vendor data */
|
||||
|
||||
@ -181,8 +180,7 @@ struct acpi_rsconvert_info acpi_rs_get_vendor_large[3] = {
|
||||
|
||||
{ACPI_RSC_COUNT16, ACPI_RS_OFFSET(data.vendor.byte_length),
|
||||
0,
|
||||
sizeof(u8)}
|
||||
,
|
||||
sizeof(u8)},
|
||||
|
||||
/* Vendor data */
|
||||
|
||||
|
@ -136,30 +136,30 @@ acpi_rs_convert_aml_to_resource(struct acpi_resource *resource,
|
||||
/*
|
||||
* Mask and shift the flag bit
|
||||
*/
|
||||
ACPI_SET8(destination) = (u8)
|
||||
((ACPI_GET8(source) >> info->value) & 0x01);
|
||||
ACPI_SET8(destination,
|
||||
((ACPI_GET8(source) >> info->value) & 0x01));
|
||||
break;
|
||||
|
||||
case ACPI_RSC_2BITFLAG:
|
||||
/*
|
||||
* Mask and shift the flag bits
|
||||
*/
|
||||
ACPI_SET8(destination) = (u8)
|
||||
((ACPI_GET8(source) >> info->value) & 0x03);
|
||||
ACPI_SET8(destination,
|
||||
((ACPI_GET8(source) >> info->value) & 0x03));
|
||||
break;
|
||||
|
||||
case ACPI_RSC_3BITFLAG:
|
||||
/*
|
||||
* Mask and shift the flag bits
|
||||
*/
|
||||
ACPI_SET8(destination) = (u8)
|
||||
((ACPI_GET8(source) >> info->value) & 0x07);
|
||||
ACPI_SET8(destination,
|
||||
((ACPI_GET8(source) >> info->value) & 0x07));
|
||||
break;
|
||||
|
||||
case ACPI_RSC_COUNT:
|
||||
|
||||
item_count = ACPI_GET8(source);
|
||||
ACPI_SET8(destination) = (u8) item_count;
|
||||
ACPI_SET8(destination, item_count);
|
||||
|
||||
resource->length = resource->length +
|
||||
(info->value * (item_count - 1));
|
||||
@ -168,7 +168,7 @@ acpi_rs_convert_aml_to_resource(struct acpi_resource *resource,
|
||||
case ACPI_RSC_COUNT16:
|
||||
|
||||
item_count = aml_resource_length;
|
||||
ACPI_SET16(destination) = item_count;
|
||||
ACPI_SET16(destination, item_count);
|
||||
|
||||
resource->length = resource->length +
|
||||
(info->value * (item_count - 1));
|
||||
@ -181,13 +181,13 @@ acpi_rs_convert_aml_to_resource(struct acpi_resource *resource,
|
||||
|
||||
resource->length = resource->length + item_count;
|
||||
item_count = item_count / 2;
|
||||
ACPI_SET16(destination) = item_count;
|
||||
ACPI_SET16(destination, item_count);
|
||||
break;
|
||||
|
||||
case ACPI_RSC_COUNT_GPIO_VEN:
|
||||
|
||||
item_count = ACPI_GET8(source);
|
||||
ACPI_SET8(destination) = (u8)item_count;
|
||||
ACPI_SET8(destination, item_count);
|
||||
|
||||
resource->length = resource->length +
|
||||
(info->value * item_count);
|
||||
@ -216,7 +216,7 @@ acpi_rs_convert_aml_to_resource(struct acpi_resource *resource,
|
||||
}
|
||||
|
||||
resource->length = resource->length + item_count;
|
||||
ACPI_SET16(destination) = item_count;
|
||||
ACPI_SET16(destination, item_count);
|
||||
break;
|
||||
|
||||
case ACPI_RSC_COUNT_SERIAL_VEN:
|
||||
@ -224,7 +224,7 @@ acpi_rs_convert_aml_to_resource(struct acpi_resource *resource,
|
||||
item_count = ACPI_GET16(source) - info->value;
|
||||
|
||||
resource->length = resource->length + item_count;
|
||||
ACPI_SET16(destination) = item_count;
|
||||
ACPI_SET16(destination, item_count);
|
||||
break;
|
||||
|
||||
case ACPI_RSC_COUNT_SERIAL_RES:
|
||||
@ -234,7 +234,7 @@ acpi_rs_convert_aml_to_resource(struct acpi_resource *resource,
|
||||
- ACPI_GET16(source) - info->value;
|
||||
|
||||
resource->length = resource->length + item_count;
|
||||
ACPI_SET16(destination) = item_count;
|
||||
ACPI_SET16(destination, item_count);
|
||||
break;
|
||||
|
||||
case ACPI_RSC_LENGTH:
|
||||
@ -385,7 +385,7 @@ acpi_rs_convert_aml_to_resource(struct acpi_resource *resource,
|
||||
}
|
||||
|
||||
target = ACPI_ADD_PTR(char, resource, info->value);
|
||||
ACPI_SET8(target) = (u8) item_count;
|
||||
ACPI_SET8(target, item_count);
|
||||
break;
|
||||
|
||||
case ACPI_RSC_BITMASK16:
|
||||
@ -401,7 +401,7 @@ acpi_rs_convert_aml_to_resource(struct acpi_resource *resource,
|
||||
}
|
||||
|
||||
target = ACPI_ADD_PTR(char, resource, info->value);
|
||||
ACPI_SET8(target) = (u8) item_count;
|
||||
ACPI_SET8(target, item_count);
|
||||
break;
|
||||
|
||||
case ACPI_RSC_EXIT_NE:
|
||||
@ -514,37 +514,40 @@ acpi_rs_convert_resource_to_aml(struct acpi_resource *resource,
|
||||
/*
|
||||
* Clear the flag byte
|
||||
*/
|
||||
ACPI_SET8(destination) = 0;
|
||||
ACPI_SET8(destination, 0);
|
||||
break;
|
||||
|
||||
case ACPI_RSC_1BITFLAG:
|
||||
/*
|
||||
* Mask and shift the flag bit
|
||||
*/
|
||||
ACPI_SET8(destination) |= (u8)
|
||||
((ACPI_GET8(source) & 0x01) << info->value);
|
||||
ACPI_SET_BIT(*ACPI_CAST8(destination), (u8)
|
||||
((ACPI_GET8(source) & 0x01) << info->
|
||||
value));
|
||||
break;
|
||||
|
||||
case ACPI_RSC_2BITFLAG:
|
||||
/*
|
||||
* Mask and shift the flag bits
|
||||
*/
|
||||
ACPI_SET8(destination) |= (u8)
|
||||
((ACPI_GET8(source) & 0x03) << info->value);
|
||||
ACPI_SET_BIT(*ACPI_CAST8(destination), (u8)
|
||||
((ACPI_GET8(source) & 0x03) << info->
|
||||
value));
|
||||
break;
|
||||
|
||||
case ACPI_RSC_3BITFLAG:
|
||||
/*
|
||||
* Mask and shift the flag bits
|
||||
*/
|
||||
ACPI_SET8(destination) |= (u8)
|
||||
((ACPI_GET8(source) & 0x07) << info->value);
|
||||
ACPI_SET_BIT(*ACPI_CAST8(destination), (u8)
|
||||
((ACPI_GET8(source) & 0x07) << info->
|
||||
value));
|
||||
break;
|
||||
|
||||
case ACPI_RSC_COUNT:
|
||||
|
||||
item_count = ACPI_GET8(source);
|
||||
ACPI_SET8(destination) = (u8) item_count;
|
||||
ACPI_SET8(destination, item_count);
|
||||
|
||||
aml_length =
|
||||
(u16) (aml_length +
|
||||
@ -561,18 +564,18 @@ acpi_rs_convert_resource_to_aml(struct acpi_resource *resource,
|
||||
case ACPI_RSC_COUNT_GPIO_PIN:
|
||||
|
||||
item_count = ACPI_GET16(source);
|
||||
ACPI_SET16(destination) = (u16)aml_length;
|
||||
ACPI_SET16(destination, aml_length);
|
||||
|
||||
aml_length = (u16)(aml_length + item_count * 2);
|
||||
target = ACPI_ADD_PTR(void, aml, info->value);
|
||||
ACPI_SET16(target) = (u16)aml_length;
|
||||
ACPI_SET16(target, aml_length);
|
||||
acpi_rs_set_resource_length(aml_length, aml);
|
||||
break;
|
||||
|
||||
case ACPI_RSC_COUNT_GPIO_VEN:
|
||||
|
||||
item_count = ACPI_GET16(source);
|
||||
ACPI_SET16(destination) = (u16)item_count;
|
||||
ACPI_SET16(destination, item_count);
|
||||
|
||||
aml_length =
|
||||
(u16)(aml_length + (info->value * item_count));
|
||||
@ -584,7 +587,7 @@ acpi_rs_convert_resource_to_aml(struct acpi_resource *resource,
|
||||
/* Set resource source string length */
|
||||
|
||||
item_count = ACPI_GET16(source);
|
||||
ACPI_SET16(destination) = (u16)aml_length;
|
||||
ACPI_SET16(destination, aml_length);
|
||||
|
||||
/* Compute offset for the Vendor Data */
|
||||
|
||||
@ -594,7 +597,7 @@ acpi_rs_convert_resource_to_aml(struct acpi_resource *resource,
|
||||
/* Set vendor offset only if there is vendor data */
|
||||
|
||||
if (resource->data.gpio.vendor_length) {
|
||||
ACPI_SET16(target) = (u16)aml_length;
|
||||
ACPI_SET16(target, aml_length);
|
||||
}
|
||||
|
||||
acpi_rs_set_resource_length(aml_length, aml);
|
||||
@ -603,7 +606,7 @@ acpi_rs_convert_resource_to_aml(struct acpi_resource *resource,
|
||||
case ACPI_RSC_COUNT_SERIAL_VEN:
|
||||
|
||||
item_count = ACPI_GET16(source);
|
||||
ACPI_SET16(destination) = item_count + info->value;
|
||||
ACPI_SET16(destination, item_count + info->value);
|
||||
aml_length = (u16)(aml_length + item_count);
|
||||
acpi_rs_set_resource_length(aml_length, aml);
|
||||
break;
|
||||
@ -686,7 +689,8 @@ acpi_rs_convert_resource_to_aml(struct acpi_resource *resource,
|
||||
* Optional resource_source (Index and String)
|
||||
*/
|
||||
aml_length =
|
||||
acpi_rs_set_resource_source(aml, (acpi_rs_length)
|
||||
acpi_rs_set_resource_source(aml,
|
||||
(acpi_rs_length)
|
||||
aml_length, source);
|
||||
acpi_rs_set_resource_length(aml_length, aml);
|
||||
break;
|
||||
@ -706,10 +710,12 @@ acpi_rs_convert_resource_to_aml(struct acpi_resource *resource,
|
||||
/*
|
||||
* 8-bit encoded bitmask (DMA macro)
|
||||
*/
|
||||
ACPI_SET8(destination) = (u8)
|
||||
acpi_rs_encode_bitmask(source,
|
||||
*ACPI_ADD_PTR(u8, resource,
|
||||
info->value));
|
||||
ACPI_SET8(destination,
|
||||
acpi_rs_encode_bitmask(source,
|
||||
*ACPI_ADD_PTR(u8,
|
||||
resource,
|
||||
info->
|
||||
value)));
|
||||
break;
|
||||
|
||||
case ACPI_RSC_BITMASK16:
|
||||
|
@ -53,7 +53,7 @@ ACPI_MODULE_NAME("rsserial")
|
||||
* acpi_rs_convert_gpio
|
||||
*
|
||||
******************************************************************************/
|
||||
struct acpi_rsconvert_info acpi_rs_convert_gpio[17] = {
|
||||
struct acpi_rsconvert_info acpi_rs_convert_gpio[18] = {
|
||||
{ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_GPIO,
|
||||
ACPI_RS_SIZE(struct acpi_resource_gpio),
|
||||
ACPI_RSC_TABLE_SIZE(acpi_rs_convert_gpio)},
|
||||
@ -75,10 +75,14 @@ struct acpi_rsconvert_info acpi_rs_convert_gpio[17] = {
|
||||
AML_OFFSET(gpio.flags),
|
||||
0},
|
||||
|
||||
{ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET(data.gpio.sharable),
|
||||
{ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.gpio.sharable),
|
||||
AML_OFFSET(gpio.int_flags),
|
||||
3},
|
||||
|
||||
{ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.gpio.wake_capable),
|
||||
AML_OFFSET(gpio.int_flags),
|
||||
4},
|
||||
|
||||
{ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET(data.gpio.io_restriction),
|
||||
AML_OFFSET(gpio.int_flags),
|
||||
0},
|
||||
|
@ -108,7 +108,7 @@ u16 acpi_rs_encode_bitmask(u8 * list, u8 count)
|
||||
mask |= (0x1 << list[i]);
|
||||
}
|
||||
|
||||
return mask;
|
||||
return (mask);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
@ -358,8 +358,10 @@ acpi_rs_get_resource_source(acpi_rs_length resource_length,
|
||||
*
|
||||
* Zero the entire area of the buffer.
|
||||
*/
|
||||
total_length = (u32)
|
||||
ACPI_STRLEN(ACPI_CAST_PTR(char, &aml_resource_source[1])) + 1;
|
||||
total_length =
|
||||
(u32)
|
||||
ACPI_STRLEN(ACPI_CAST_PTR(char, &aml_resource_source[1])) +
|
||||
1;
|
||||
total_length = (u32) ACPI_ROUND_UP_TO_NATIVE_WORD(total_length);
|
||||
|
||||
ACPI_MEMSET(resource_source->string_ptr, 0, total_length);
|
||||
@ -675,7 +677,9 @@ acpi_rs_get_method_data(acpi_handle handle,
|
||||
/* Execute the method, no parameters */
|
||||
|
||||
status =
|
||||
acpi_ut_evaluate_object(handle, path, ACPI_BTYPE_BUFFER, &obj_desc);
|
||||
acpi_ut_evaluate_object(ACPI_CAST_PTR
|
||||
(struct acpi_namespace_node, handle), path,
|
||||
ACPI_BTYPE_BUFFER, &obj_desc);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
@ -423,7 +423,7 @@ ACPI_EXPORT_SYMBOL(acpi_resource_to_address64)
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Walk a resource template for the specified evice to find a
|
||||
* DESCRIPTION: Walk a resource template for the specified device to find a
|
||||
* vendor-defined resource that matches the supplied UUID and
|
||||
* UUID subtype. Returns a struct acpi_resource of type Vendor.
|
||||
*
|
||||
@ -522,57 +522,42 @@ acpi_rs_match_vendor_resource(struct acpi_resource *resource, void *context)
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_walk_resources
|
||||
* FUNCTION: acpi_walk_resource_buffer
|
||||
*
|
||||
* PARAMETERS: device_handle - Handle to the device object for the
|
||||
* device we are querying
|
||||
* name - Method name of the resources we want.
|
||||
* (METHOD_NAME__CRS, METHOD_NAME__PRS, or
|
||||
* METHOD_NAME__AEI)
|
||||
* PARAMETERS: buffer - Formatted buffer returned by one of the
|
||||
* various Get*Resource functions
|
||||
* user_function - Called for each resource
|
||||
* context - Passed to user_function
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Retrieves the current or possible resource list for the
|
||||
* specified device. The user_function is called once for
|
||||
* each resource in the list.
|
||||
* DESCRIPTION: Walks the input resource template. The user_function is called
|
||||
* once for each resource in the list.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status
|
||||
acpi_walk_resources(acpi_handle device_handle,
|
||||
char *name,
|
||||
acpi_walk_resource_callback user_function, void *context)
|
||||
acpi_walk_resource_buffer(struct acpi_buffer * buffer,
|
||||
acpi_walk_resource_callback user_function,
|
||||
void *context)
|
||||
{
|
||||
acpi_status status;
|
||||
struct acpi_buffer buffer;
|
||||
acpi_status status = AE_OK;
|
||||
struct acpi_resource *resource;
|
||||
struct acpi_resource *resource_end;
|
||||
|
||||
ACPI_FUNCTION_TRACE(acpi_walk_resources);
|
||||
ACPI_FUNCTION_TRACE(acpi_walk_resource_buffer);
|
||||
|
||||
/* Parameter validation */
|
||||
|
||||
if (!device_handle || !user_function || !name ||
|
||||
(!ACPI_COMPARE_NAME(name, METHOD_NAME__CRS) &&
|
||||
!ACPI_COMPARE_NAME(name, METHOD_NAME__PRS) &&
|
||||
!ACPI_COMPARE_NAME(name, METHOD_NAME__AEI))) {
|
||||
if (!buffer || !buffer->pointer || !user_function) {
|
||||
return_ACPI_STATUS(AE_BAD_PARAMETER);
|
||||
}
|
||||
|
||||
/* Get the _CRS/_PRS/_AEI resource list */
|
||||
/* Buffer contains the resource list and length */
|
||||
|
||||
buffer.length = ACPI_ALLOCATE_LOCAL_BUFFER;
|
||||
status = acpi_rs_get_method_data(device_handle, name, &buffer);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
/* Buffer now contains the resource list */
|
||||
|
||||
resource = ACPI_CAST_PTR(struct acpi_resource, buffer.pointer);
|
||||
resource = ACPI_CAST_PTR(struct acpi_resource, buffer->pointer);
|
||||
resource_end =
|
||||
ACPI_ADD_PTR(struct acpi_resource, buffer.pointer, buffer.length);
|
||||
ACPI_ADD_PTR(struct acpi_resource, buffer->pointer, buffer->length);
|
||||
|
||||
/* Walk the resource list until the end_tag is found (or buffer end) */
|
||||
|
||||
@ -606,11 +591,63 @@ acpi_walk_resources(acpi_handle device_handle,
|
||||
|
||||
/* Get the next resource descriptor */
|
||||
|
||||
resource =
|
||||
ACPI_ADD_PTR(struct acpi_resource, resource,
|
||||
resource->length);
|
||||
resource = ACPI_NEXT_RESOURCE(resource);
|
||||
}
|
||||
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
ACPI_EXPORT_SYMBOL(acpi_walk_resource_buffer)
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_walk_resources
|
||||
*
|
||||
* PARAMETERS: device_handle - Handle to the device object for the
|
||||
* device we are querying
|
||||
* name - Method name of the resources we want.
|
||||
* (METHOD_NAME__CRS, METHOD_NAME__PRS, or
|
||||
* METHOD_NAME__AEI)
|
||||
* user_function - Called for each resource
|
||||
* context - Passed to user_function
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Retrieves the current or possible resource list for the
|
||||
* specified device. The user_function is called once for
|
||||
* each resource in the list.
|
||||
*
|
||||
******************************************************************************/
|
||||
acpi_status
|
||||
acpi_walk_resources(acpi_handle device_handle,
|
||||
char *name,
|
||||
acpi_walk_resource_callback user_function, void *context)
|
||||
{
|
||||
acpi_status status;
|
||||
struct acpi_buffer buffer;
|
||||
|
||||
ACPI_FUNCTION_TRACE(acpi_walk_resources);
|
||||
|
||||
/* Parameter validation */
|
||||
|
||||
if (!device_handle || !user_function || !name ||
|
||||
(!ACPI_COMPARE_NAME(name, METHOD_NAME__CRS) &&
|
||||
!ACPI_COMPARE_NAME(name, METHOD_NAME__PRS) &&
|
||||
!ACPI_COMPARE_NAME(name, METHOD_NAME__AEI))) {
|
||||
return_ACPI_STATUS(AE_BAD_PARAMETER);
|
||||
}
|
||||
|
||||
/* Get the _CRS/_PRS/_AEI resource list */
|
||||
|
||||
buffer.length = ACPI_ALLOCATE_LOCAL_BUFFER;
|
||||
status = acpi_rs_get_method_data(device_handle, name, &buffer);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
/* Walk the resource list and cleanup */
|
||||
|
||||
status = acpi_walk_resource_buffer(&buffer, user_function, context);
|
||||
ACPI_FREE(buffer.pointer);
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
@ -172,6 +172,7 @@ static struct acpi_fadt_pm_info fadt_pm_info_table[] = {
|
||||
* FUNCTION: acpi_tb_init_generic_address
|
||||
*
|
||||
* PARAMETERS: generic_address - GAS struct to be initialized
|
||||
* space_id - ACPI Space ID for this register
|
||||
* byte_width - Width of this register
|
||||
* address - Address of the register
|
||||
*
|
||||
@ -407,8 +408,8 @@ static void acpi_tb_convert_fadt(void)
|
||||
* should be zero are indeed zero. This will workaround BIOSs that
|
||||
* inadvertently place values in these fields.
|
||||
*
|
||||
* The ACPI 1.0 reserved fields that will be zeroed are the bytes located at
|
||||
* offset 45, 55, 95, and the word located at offset 109, 110.
|
||||
* The ACPI 1.0 reserved fields that will be zeroed are the bytes located
|
||||
* at offset 45, 55, 95, and the word located at offset 109, 110.
|
||||
*
|
||||
* Note: The FADT revision value is unreliable. Only the length can be
|
||||
* trusted.
|
||||
|
@ -147,7 +147,7 @@ acpi_status acpi_tb_initialize_facs(void)
|
||||
ACPI_CAST_INDIRECT_PTR(struct
|
||||
acpi_table_header,
|
||||
&acpi_gbl_FACS));
|
||||
return status;
|
||||
return (status);
|
||||
}
|
||||
#endif /* !ACPI_REDUCED_HARDWARE */
|
||||
|
||||
|
@ -44,7 +44,6 @@
|
||||
#include <linux/export.h>
|
||||
#include <acpi/acpi.h>
|
||||
#include "accommon.h"
|
||||
#include "acnamesp.h"
|
||||
#include "actables.h"
|
||||
|
||||
#define _COMPONENT ACPI_TABLES
|
||||
@ -437,7 +436,7 @@ ACPI_EXPORT_SYMBOL(acpi_get_table_by_index)
|
||||
*
|
||||
******************************************************************************/
|
||||
acpi_status
|
||||
acpi_install_table_handler(acpi_tbl_handler handler, void *context)
|
||||
acpi_install_table_handler(acpi_table_handler handler, void *context)
|
||||
{
|
||||
acpi_status status;
|
||||
|
||||
@ -483,7 +482,7 @@ ACPI_EXPORT_SYMBOL(acpi_install_table_handler)
|
||||
* DESCRIPTION: Remove table event handler
|
||||
*
|
||||
******************************************************************************/
|
||||
acpi_status acpi_remove_table_handler(acpi_tbl_handler handler)
|
||||
acpi_status acpi_remove_table_handler(acpi_table_handler handler)
|
||||
{
|
||||
acpi_status status;
|
||||
|
||||
|
@ -192,7 +192,7 @@ static acpi_status acpi_tb_load_namespace(void)
|
||||
(void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES);
|
||||
}
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_INIT, "ACPI Tables successfully acquired\n"));
|
||||
ACPI_INFO((AE_INFO, "All ACPI Tables successfully acquired"));
|
||||
|
||||
unlock_and_exit:
|
||||
(void)acpi_ut_release_mutex(ACPI_MTX_TABLES);
|
||||
|
@ -214,7 +214,7 @@ acpi_ut_check_address_range(acpi_adr_space_type space_id,
|
||||
|
||||
if ((space_id != ACPI_ADR_SPACE_SYSTEM_MEMORY) &&
|
||||
(space_id != ACPI_ADR_SPACE_SYSTEM_IO)) {
|
||||
return_UINT32(0);
|
||||
return_VALUE(0);
|
||||
}
|
||||
|
||||
range_info = acpi_gbl_address_range_list[space_id];
|
||||
@ -256,7 +256,7 @@ acpi_ut_check_address_range(acpi_adr_space_type space_id,
|
||||
range_info = range_info->next;
|
||||
}
|
||||
|
||||
return_UINT32(overlap_count);
|
||||
return_VALUE(overlap_count);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
|
@ -785,7 +785,7 @@ acpi_ut_copy_simple_object(union acpi_operand_object *source_desc,
|
||||
|
||||
status = acpi_os_create_mutex(&dest_desc->mutex.os_mutex);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return status;
|
||||
return (status);
|
||||
}
|
||||
break;
|
||||
|
||||
@ -795,7 +795,7 @@ acpi_ut_copy_simple_object(union acpi_operand_object *source_desc,
|
||||
&dest_desc->event.
|
||||
os_semaphore);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return status;
|
||||
return (status);
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -166,11 +166,9 @@ acpi_debug_print(u32 requested_debug_level,
|
||||
acpi_thread_id thread_id;
|
||||
va_list args;
|
||||
|
||||
/*
|
||||
* Stay silent if the debug level or component ID is disabled
|
||||
*/
|
||||
if (!(requested_debug_level & acpi_dbg_level) ||
|
||||
!(component_id & acpi_dbg_layer)) {
|
||||
/* Check if debug output enabled */
|
||||
|
||||
if (!ACPI_IS_DEBUG_ENABLED(requested_debug_level, component_id)) {
|
||||
return;
|
||||
}
|
||||
|
||||
@ -236,8 +234,9 @@ acpi_debug_print_raw(u32 requested_debug_level,
|
||||
{
|
||||
va_list args;
|
||||
|
||||
if (!(requested_debug_level & acpi_dbg_level) ||
|
||||
!(component_id & acpi_dbg_layer)) {
|
||||
/* Check if debug output enabled */
|
||||
|
||||
if (!ACPI_IS_DEBUG_ENABLED(requested_debug_level, component_id)) {
|
||||
return;
|
||||
}
|
||||
|
||||
@ -272,9 +271,13 @@ acpi_ut_trace(u32 line_number,
|
||||
acpi_gbl_nesting_level++;
|
||||
acpi_ut_track_stack_ptr();
|
||||
|
||||
acpi_debug_print(ACPI_LV_FUNCTIONS,
|
||||
line_number, function_name, module_name, component_id,
|
||||
"%s\n", acpi_gbl_fn_entry_str);
|
||||
/* Check if enabled up-front for performance */
|
||||
|
||||
if (ACPI_IS_DEBUG_ENABLED(ACPI_LV_FUNCTIONS, component_id)) {
|
||||
acpi_debug_print(ACPI_LV_FUNCTIONS,
|
||||
line_number, function_name, module_name,
|
||||
component_id, "%s\n", acpi_gbl_fn_entry_str);
|
||||
}
|
||||
}
|
||||
|
||||
ACPI_EXPORT_SYMBOL(acpi_ut_trace)
|
||||
@ -304,9 +307,14 @@ acpi_ut_trace_ptr(u32 line_number,
|
||||
acpi_gbl_nesting_level++;
|
||||
acpi_ut_track_stack_ptr();
|
||||
|
||||
acpi_debug_print(ACPI_LV_FUNCTIONS,
|
||||
line_number, function_name, module_name, component_id,
|
||||
"%s %p\n", acpi_gbl_fn_entry_str, pointer);
|
||||
/* Check if enabled up-front for performance */
|
||||
|
||||
if (ACPI_IS_DEBUG_ENABLED(ACPI_LV_FUNCTIONS, component_id)) {
|
||||
acpi_debug_print(ACPI_LV_FUNCTIONS,
|
||||
line_number, function_name, module_name,
|
||||
component_id, "%s %p\n", acpi_gbl_fn_entry_str,
|
||||
pointer);
|
||||
}
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
@ -335,9 +343,14 @@ acpi_ut_trace_str(u32 line_number,
|
||||
acpi_gbl_nesting_level++;
|
||||
acpi_ut_track_stack_ptr();
|
||||
|
||||
acpi_debug_print(ACPI_LV_FUNCTIONS,
|
||||
line_number, function_name, module_name, component_id,
|
||||
"%s %s\n", acpi_gbl_fn_entry_str, string);
|
||||
/* Check if enabled up-front for performance */
|
||||
|
||||
if (ACPI_IS_DEBUG_ENABLED(ACPI_LV_FUNCTIONS, component_id)) {
|
||||
acpi_debug_print(ACPI_LV_FUNCTIONS,
|
||||
line_number, function_name, module_name,
|
||||
component_id, "%s %s\n", acpi_gbl_fn_entry_str,
|
||||
string);
|
||||
}
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
@ -366,9 +379,14 @@ acpi_ut_trace_u32(u32 line_number,
|
||||
acpi_gbl_nesting_level++;
|
||||
acpi_ut_track_stack_ptr();
|
||||
|
||||
acpi_debug_print(ACPI_LV_FUNCTIONS,
|
||||
line_number, function_name, module_name, component_id,
|
||||
"%s %08X\n", acpi_gbl_fn_entry_str, integer);
|
||||
/* Check if enabled up-front for performance */
|
||||
|
||||
if (ACPI_IS_DEBUG_ENABLED(ACPI_LV_FUNCTIONS, component_id)) {
|
||||
acpi_debug_print(ACPI_LV_FUNCTIONS,
|
||||
line_number, function_name, module_name,
|
||||
component_id, "%s %08X\n",
|
||||
acpi_gbl_fn_entry_str, integer);
|
||||
}
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
@ -393,9 +411,13 @@ acpi_ut_exit(u32 line_number,
|
||||
const char *module_name, u32 component_id)
|
||||
{
|
||||
|
||||
acpi_debug_print(ACPI_LV_FUNCTIONS,
|
||||
line_number, function_name, module_name, component_id,
|
||||
"%s\n", acpi_gbl_fn_exit_str);
|
||||
/* Check if enabled up-front for performance */
|
||||
|
||||
if (ACPI_IS_DEBUG_ENABLED(ACPI_LV_FUNCTIONS, component_id)) {
|
||||
acpi_debug_print(ACPI_LV_FUNCTIONS,
|
||||
line_number, function_name, module_name,
|
||||
component_id, "%s\n", acpi_gbl_fn_exit_str);
|
||||
}
|
||||
|
||||
acpi_gbl_nesting_level--;
|
||||
}
|
||||
@ -425,17 +447,23 @@ acpi_ut_status_exit(u32 line_number,
|
||||
u32 component_id, acpi_status status)
|
||||
{
|
||||
|
||||
if (ACPI_SUCCESS(status)) {
|
||||
acpi_debug_print(ACPI_LV_FUNCTIONS,
|
||||
line_number, function_name, module_name,
|
||||
component_id, "%s %s\n", acpi_gbl_fn_exit_str,
|
||||
acpi_format_exception(status));
|
||||
} else {
|
||||
acpi_debug_print(ACPI_LV_FUNCTIONS,
|
||||
line_number, function_name, module_name,
|
||||
component_id, "%s ****Exception****: %s\n",
|
||||
acpi_gbl_fn_exit_str,
|
||||
acpi_format_exception(status));
|
||||
/* Check if enabled up-front for performance */
|
||||
|
||||
if (ACPI_IS_DEBUG_ENABLED(ACPI_LV_FUNCTIONS, component_id)) {
|
||||
if (ACPI_SUCCESS(status)) {
|
||||
acpi_debug_print(ACPI_LV_FUNCTIONS,
|
||||
line_number, function_name,
|
||||
module_name, component_id, "%s %s\n",
|
||||
acpi_gbl_fn_exit_str,
|
||||
acpi_format_exception(status));
|
||||
} else {
|
||||
acpi_debug_print(ACPI_LV_FUNCTIONS,
|
||||
line_number, function_name,
|
||||
module_name, component_id,
|
||||
"%s ****Exception****: %s\n",
|
||||
acpi_gbl_fn_exit_str,
|
||||
acpi_format_exception(status));
|
||||
}
|
||||
}
|
||||
|
||||
acpi_gbl_nesting_level--;
|
||||
@ -465,10 +493,15 @@ acpi_ut_value_exit(u32 line_number,
|
||||
const char *module_name, u32 component_id, u64 value)
|
||||
{
|
||||
|
||||
acpi_debug_print(ACPI_LV_FUNCTIONS,
|
||||
line_number, function_name, module_name, component_id,
|
||||
"%s %8.8X%8.8X\n", acpi_gbl_fn_exit_str,
|
||||
ACPI_FORMAT_UINT64(value));
|
||||
/* Check if enabled up-front for performance */
|
||||
|
||||
if (ACPI_IS_DEBUG_ENABLED(ACPI_LV_FUNCTIONS, component_id)) {
|
||||
acpi_debug_print(ACPI_LV_FUNCTIONS,
|
||||
line_number, function_name, module_name,
|
||||
component_id, "%s %8.8X%8.8X\n",
|
||||
acpi_gbl_fn_exit_str,
|
||||
ACPI_FORMAT_UINT64(value));
|
||||
}
|
||||
|
||||
acpi_gbl_nesting_level--;
|
||||
}
|
||||
@ -497,9 +530,14 @@ acpi_ut_ptr_exit(u32 line_number,
|
||||
const char *module_name, u32 component_id, u8 *ptr)
|
||||
{
|
||||
|
||||
acpi_debug_print(ACPI_LV_FUNCTIONS,
|
||||
line_number, function_name, module_name, component_id,
|
||||
"%s %p\n", acpi_gbl_fn_exit_str, ptr);
|
||||
/* Check if enabled up-front for performance */
|
||||
|
||||
if (ACPI_IS_DEBUG_ENABLED(ACPI_LV_FUNCTIONS, component_id)) {
|
||||
acpi_debug_print(ACPI_LV_FUNCTIONS,
|
||||
line_number, function_name, module_name,
|
||||
component_id, "%s %p\n", acpi_gbl_fn_exit_str,
|
||||
ptr);
|
||||
}
|
||||
|
||||
acpi_gbl_nesting_level--;
|
||||
}
|
||||
|
@ -340,7 +340,7 @@ void acpi_ut_delete_internal_object_list(union acpi_operand_object **obj_list)
|
||||
{
|
||||
union acpi_operand_object **internal_obj;
|
||||
|
||||
ACPI_FUNCTION_TRACE(ut_delete_internal_object_list);
|
||||
ACPI_FUNCTION_ENTRY();
|
||||
|
||||
/* Walk the null-terminated internal list */
|
||||
|
||||
@ -351,7 +351,7 @@ void acpi_ut_delete_internal_object_list(union acpi_operand_object **obj_list)
|
||||
/* Free the combined parameter pointer list and object array */
|
||||
|
||||
ACPI_FREE(obj_list);
|
||||
return_VOID;
|
||||
return;
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
@ -484,7 +484,7 @@ acpi_ut_update_object_reference(union acpi_operand_object *object, u16 action)
|
||||
union acpi_generic_state *state;
|
||||
u32 i;
|
||||
|
||||
ACPI_FUNCTION_TRACE_PTR(ut_update_object_reference, object);
|
||||
ACPI_FUNCTION_NAME(ut_update_object_reference);
|
||||
|
||||
while (object) {
|
||||
|
||||
@ -493,7 +493,7 @@ acpi_ut_update_object_reference(union acpi_operand_object *object, u16 action)
|
||||
if (ACPI_GET_DESCRIPTOR_TYPE(object) == ACPI_DESC_TYPE_NAMED) {
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_ALLOCATIONS,
|
||||
"Object %p is NS handle\n", object));
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
return (AE_OK);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -530,18 +530,42 @@ acpi_ut_update_object_reference(union acpi_operand_object *object, u16 action)
|
||||
*/
|
||||
for (i = 0; i < object->package.count; i++) {
|
||||
/*
|
||||
* Push each element onto the stack for later processing.
|
||||
* Note: There can be null elements within the package,
|
||||
* these are simply ignored
|
||||
* Null package elements are legal and can be simply
|
||||
* ignored.
|
||||
*/
|
||||
status =
|
||||
acpi_ut_create_update_state_and_push
|
||||
(object->package.elements[i], action,
|
||||
&state_list);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
goto error_exit;
|
||||
next_object = object->package.elements[i];
|
||||
if (!next_object) {
|
||||
continue;
|
||||
}
|
||||
|
||||
switch (next_object->common.type) {
|
||||
case ACPI_TYPE_INTEGER:
|
||||
case ACPI_TYPE_STRING:
|
||||
case ACPI_TYPE_BUFFER:
|
||||
/*
|
||||
* For these very simple sub-objects, we can just
|
||||
* update the reference count here and continue.
|
||||
* Greatly increases performance of this operation.
|
||||
*/
|
||||
acpi_ut_update_ref_count(next_object,
|
||||
action);
|
||||
break;
|
||||
|
||||
default:
|
||||
/*
|
||||
* For complex sub-objects, push them onto the stack
|
||||
* for later processing (this eliminates recursion.)
|
||||
*/
|
||||
status =
|
||||
acpi_ut_create_update_state_and_push
|
||||
(next_object, action, &state_list);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
goto error_exit;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
next_object = NULL;
|
||||
break;
|
||||
|
||||
case ACPI_TYPE_BUFFER_FIELD:
|
||||
@ -619,7 +643,7 @@ acpi_ut_update_object_reference(union acpi_operand_object *object, u16 action)
|
||||
}
|
||||
}
|
||||
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
return (AE_OK);
|
||||
|
||||
error_exit:
|
||||
|
||||
@ -633,7 +657,7 @@ acpi_ut_update_object_reference(union acpi_operand_object *object, u16 action)
|
||||
acpi_ut_delete_generic_state(state);
|
||||
}
|
||||
|
||||
return_ACPI_STATUS(status);
|
||||
return (status);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
@ -652,12 +676,12 @@ acpi_ut_update_object_reference(union acpi_operand_object *object, u16 action)
|
||||
void acpi_ut_add_reference(union acpi_operand_object *object)
|
||||
{
|
||||
|
||||
ACPI_FUNCTION_TRACE_PTR(ut_add_reference, object);
|
||||
ACPI_FUNCTION_NAME(ut_add_reference);
|
||||
|
||||
/* Ensure that we have a valid object */
|
||||
|
||||
if (!acpi_ut_valid_internal_object(object)) {
|
||||
return_VOID;
|
||||
return;
|
||||
}
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_ALLOCATIONS,
|
||||
@ -667,7 +691,7 @@ void acpi_ut_add_reference(union acpi_operand_object *object)
|
||||
/* Increment the reference count */
|
||||
|
||||
(void)acpi_ut_update_object_reference(object, REF_INCREMENT);
|
||||
return_VOID;
|
||||
return;
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
@ -685,7 +709,7 @@ void acpi_ut_add_reference(union acpi_operand_object *object)
|
||||
void acpi_ut_remove_reference(union acpi_operand_object *object)
|
||||
{
|
||||
|
||||
ACPI_FUNCTION_TRACE_PTR(ut_remove_reference, object);
|
||||
ACPI_FUNCTION_NAME(ut_remove_reference);
|
||||
|
||||
/*
|
||||
* Allow a NULL pointer to be passed in, just ignore it. This saves
|
||||
@ -694,13 +718,13 @@ void acpi_ut_remove_reference(union acpi_operand_object *object)
|
||||
*/
|
||||
if (!object ||
|
||||
(ACPI_GET_DESCRIPTOR_TYPE(object) == ACPI_DESC_TYPE_NAMED)) {
|
||||
return_VOID;
|
||||
return;
|
||||
}
|
||||
|
||||
/* Ensure that we have a valid object */
|
||||
|
||||
if (!acpi_ut_valid_internal_object(object)) {
|
||||
return_VOID;
|
||||
return;
|
||||
}
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_ALLOCATIONS,
|
||||
@ -713,5 +737,5 @@ void acpi_ut_remove_reference(union acpi_operand_object *object)
|
||||
* of all subobjects!)
|
||||
*/
|
||||
(void)acpi_ut_update_object_reference(object, REF_DECREMENT);
|
||||
return_VOID;
|
||||
return;
|
||||
}
|
||||
|
@ -68,7 +68,7 @@ ACPI_MODULE_NAME("uteval")
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status
|
||||
acpi_ut_evaluate_object(struct acpi_namespace_node *prefix_node,
|
||||
acpi_ut_evaluate_object(struct acpi_namespace_node * prefix_node,
|
||||
char *path,
|
||||
u32 expected_return_btypes,
|
||||
union acpi_operand_object **return_desc)
|
||||
|
@ -293,11 +293,11 @@ acpi_status acpi_ut_init_globals(void)
|
||||
|
||||
/* GPE support */
|
||||
|
||||
acpi_gbl_all_gpes_initialized = FALSE;
|
||||
acpi_gbl_gpe_xrupt_list_head = NULL;
|
||||
acpi_gbl_gpe_fadt_blocks[0] = NULL;
|
||||
acpi_gbl_gpe_fadt_blocks[1] = NULL;
|
||||
acpi_current_gpe_count = 0;
|
||||
acpi_gbl_all_gpes_initialized = FALSE;
|
||||
|
||||
acpi_gbl_global_event_handler = NULL;
|
||||
|
||||
@ -357,17 +357,24 @@ acpi_status acpi_ut_init_globals(void)
|
||||
acpi_gbl_root_node_struct.peer = NULL;
|
||||
acpi_gbl_root_node_struct.object = NULL;
|
||||
|
||||
#ifdef ACPI_DISASSEMBLER
|
||||
acpi_gbl_external_list = NULL;
|
||||
#endif
|
||||
|
||||
#ifdef ACPI_DEBUG_OUTPUT
|
||||
acpi_gbl_lowest_stack_pointer = ACPI_CAST_PTR(acpi_size, ACPI_SIZE_MAX);
|
||||
#endif
|
||||
|
||||
#ifdef ACPI_DBG_TRACK_ALLOCATIONS
|
||||
acpi_gbl_display_final_mem_stats = FALSE;
|
||||
acpi_gbl_disable_mem_tracking = FALSE;
|
||||
#endif
|
||||
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
}
|
||||
|
||||
/* Public globals */
|
||||
|
||||
ACPI_EXPORT_SYMBOL(acpi_gbl_FADT)
|
||||
ACPI_EXPORT_SYMBOL(acpi_dbg_level)
|
||||
ACPI_EXPORT_SYMBOL(acpi_dbg_layer)
|
||||
|
@ -66,11 +66,11 @@ acpi_status acpi_ut_create_rw_lock(struct acpi_rw_lock *lock)
|
||||
lock->num_readers = 0;
|
||||
status = acpi_os_create_mutex(&lock->reader_mutex);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return status;
|
||||
return (status);
|
||||
}
|
||||
|
||||
status = acpi_os_create_mutex(&lock->writer_mutex);
|
||||
return status;
|
||||
return (status);
|
||||
}
|
||||
|
||||
void acpi_ut_delete_rw_lock(struct acpi_rw_lock *lock)
|
||||
@ -108,7 +108,7 @@ acpi_status acpi_ut_acquire_read_lock(struct acpi_rw_lock *lock)
|
||||
|
||||
status = acpi_os_acquire_mutex(lock->reader_mutex, ACPI_WAIT_FOREVER);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return status;
|
||||
return (status);
|
||||
}
|
||||
|
||||
/* Acquire the write lock only for the first reader */
|
||||
@ -121,7 +121,7 @@ acpi_status acpi_ut_acquire_read_lock(struct acpi_rw_lock *lock)
|
||||
}
|
||||
|
||||
acpi_os_release_mutex(lock->reader_mutex);
|
||||
return status;
|
||||
return (status);
|
||||
}
|
||||
|
||||
acpi_status acpi_ut_release_read_lock(struct acpi_rw_lock *lock)
|
||||
@ -130,7 +130,7 @@ acpi_status acpi_ut_release_read_lock(struct acpi_rw_lock *lock)
|
||||
|
||||
status = acpi_os_acquire_mutex(lock->reader_mutex, ACPI_WAIT_FOREVER);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return status;
|
||||
return (status);
|
||||
}
|
||||
|
||||
/* Release the write lock only for the very last reader */
|
||||
@ -141,7 +141,7 @@ acpi_status acpi_ut_release_read_lock(struct acpi_rw_lock *lock)
|
||||
}
|
||||
|
||||
acpi_os_release_mutex(lock->reader_mutex);
|
||||
return status;
|
||||
return (status);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
@ -165,7 +165,7 @@ acpi_status acpi_ut_acquire_write_lock(struct acpi_rw_lock *lock)
|
||||
acpi_status status;
|
||||
|
||||
status = acpi_os_acquire_mutex(lock->writer_mutex, ACPI_WAIT_FOREVER);
|
||||
return status;
|
||||
return (status);
|
||||
}
|
||||
|
||||
void acpi_ut_release_write_lock(struct acpi_rw_lock *lock)
|
||||
|
@ -48,36 +48,6 @@
|
||||
#define _COMPONENT ACPI_UTILITIES
|
||||
ACPI_MODULE_NAME("utmisc")
|
||||
|
||||
#if defined ACPI_ASL_COMPILER || defined ACPI_EXEC_APP
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: ut_convert_backslashes
|
||||
*
|
||||
* PARAMETERS: pathname - File pathname string to be converted
|
||||
*
|
||||
* RETURN: Modifies the input Pathname
|
||||
*
|
||||
* DESCRIPTION: Convert all backslashes (0x5C) to forward slashes (0x2F) within
|
||||
* the entire input file pathname string.
|
||||
*
|
||||
******************************************************************************/
|
||||
void ut_convert_backslashes(char *pathname)
|
||||
{
|
||||
|
||||
if (!pathname) {
|
||||
return;
|
||||
}
|
||||
|
||||
while (*pathname) {
|
||||
if (*pathname == '\\') {
|
||||
*pathname = '/';
|
||||
}
|
||||
|
||||
pathname++;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ut_is_pci_root_bridge
|
||||
@ -89,7 +59,6 @@ void ut_convert_backslashes(char *pathname)
|
||||
* DESCRIPTION: Determine if the input ID is a PCI Root Bridge ID.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
u8 acpi_ut_is_pci_root_bridge(char *id)
|
||||
{
|
||||
|
||||
@ -134,362 +103,6 @@ u8 acpi_ut_is_aml_table(struct acpi_table_header *table)
|
||||
return (FALSE);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ut_allocate_owner_id
|
||||
*
|
||||
* PARAMETERS: owner_id - Where the new owner ID is returned
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Allocate a table or method owner ID. The owner ID is used to
|
||||
* track objects created by the table or method, to be deleted
|
||||
* when the method exits or the table is unloaded.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status acpi_ut_allocate_owner_id(acpi_owner_id * owner_id)
|
||||
{
|
||||
u32 i;
|
||||
u32 j;
|
||||
u32 k;
|
||||
acpi_status status;
|
||||
|
||||
ACPI_FUNCTION_TRACE(ut_allocate_owner_id);
|
||||
|
||||
/* Guard against multiple allocations of ID to the same location */
|
||||
|
||||
if (*owner_id) {
|
||||
ACPI_ERROR((AE_INFO, "Owner ID [0x%2.2X] already exists",
|
||||
*owner_id));
|
||||
return_ACPI_STATUS(AE_ALREADY_EXISTS);
|
||||
}
|
||||
|
||||
/* Mutex for the global ID mask */
|
||||
|
||||
status = acpi_ut_acquire_mutex(ACPI_MTX_CACHES);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
/*
|
||||
* Find a free owner ID, cycle through all possible IDs on repeated
|
||||
* allocations. (ACPI_NUM_OWNERID_MASKS + 1) because first index may have
|
||||
* to be scanned twice.
|
||||
*/
|
||||
for (i = 0, j = acpi_gbl_last_owner_id_index;
|
||||
i < (ACPI_NUM_OWNERID_MASKS + 1); i++, j++) {
|
||||
if (j >= ACPI_NUM_OWNERID_MASKS) {
|
||||
j = 0; /* Wraparound to start of mask array */
|
||||
}
|
||||
|
||||
for (k = acpi_gbl_next_owner_id_offset; k < 32; k++) {
|
||||
if (acpi_gbl_owner_id_mask[j] == ACPI_UINT32_MAX) {
|
||||
|
||||
/* There are no free IDs in this mask */
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
if (!(acpi_gbl_owner_id_mask[j] & (1 << k))) {
|
||||
/*
|
||||
* Found a free ID. The actual ID is the bit index plus one,
|
||||
* making zero an invalid Owner ID. Save this as the last ID
|
||||
* allocated and update the global ID mask.
|
||||
*/
|
||||
acpi_gbl_owner_id_mask[j] |= (1 << k);
|
||||
|
||||
acpi_gbl_last_owner_id_index = (u8)j;
|
||||
acpi_gbl_next_owner_id_offset = (u8)(k + 1);
|
||||
|
||||
/*
|
||||
* Construct encoded ID from the index and bit position
|
||||
*
|
||||
* Note: Last [j].k (bit 255) is never used and is marked
|
||||
* permanently allocated (prevents +1 overflow)
|
||||
*/
|
||||
*owner_id =
|
||||
(acpi_owner_id) ((k + 1) + ACPI_MUL_32(j));
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_VALUES,
|
||||
"Allocated OwnerId: %2.2X\n",
|
||||
(unsigned int)*owner_id));
|
||||
goto exit;
|
||||
}
|
||||
}
|
||||
|
||||
acpi_gbl_next_owner_id_offset = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* All owner_ids have been allocated. This typically should
|
||||
* not happen since the IDs are reused after deallocation. The IDs are
|
||||
* allocated upon table load (one per table) and method execution, and
|
||||
* they are released when a table is unloaded or a method completes
|
||||
* execution.
|
||||
*
|
||||
* If this error happens, there may be very deep nesting of invoked control
|
||||
* methods, or there may be a bug where the IDs are not released.
|
||||
*/
|
||||
status = AE_OWNER_ID_LIMIT;
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"Could not allocate new OwnerId (255 max), AE_OWNER_ID_LIMIT"));
|
||||
|
||||
exit:
|
||||
(void)acpi_ut_release_mutex(ACPI_MTX_CACHES);
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ut_release_owner_id
|
||||
*
|
||||
* PARAMETERS: owner_id_ptr - Pointer to a previously allocated owner_ID
|
||||
*
|
||||
* RETURN: None. No error is returned because we are either exiting a
|
||||
* control method or unloading a table. Either way, we would
|
||||
* ignore any error anyway.
|
||||
*
|
||||
* DESCRIPTION: Release a table or method owner ID. Valid IDs are 1 - 255
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
void acpi_ut_release_owner_id(acpi_owner_id * owner_id_ptr)
|
||||
{
|
||||
acpi_owner_id owner_id = *owner_id_ptr;
|
||||
acpi_status status;
|
||||
u32 index;
|
||||
u32 bit;
|
||||
|
||||
ACPI_FUNCTION_TRACE_U32(ut_release_owner_id, owner_id);
|
||||
|
||||
/* Always clear the input owner_id (zero is an invalid ID) */
|
||||
|
||||
*owner_id_ptr = 0;
|
||||
|
||||
/* Zero is not a valid owner_ID */
|
||||
|
||||
if (owner_id == 0) {
|
||||
ACPI_ERROR((AE_INFO, "Invalid OwnerId: 0x%2.2X", owner_id));
|
||||
return_VOID;
|
||||
}
|
||||
|
||||
/* Mutex for the global ID mask */
|
||||
|
||||
status = acpi_ut_acquire_mutex(ACPI_MTX_CACHES);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_VOID;
|
||||
}
|
||||
|
||||
/* Normalize the ID to zero */
|
||||
|
||||
owner_id--;
|
||||
|
||||
/* Decode ID to index/offset pair */
|
||||
|
||||
index = ACPI_DIV_32(owner_id);
|
||||
bit = 1 << ACPI_MOD_32(owner_id);
|
||||
|
||||
/* Free the owner ID only if it is valid */
|
||||
|
||||
if (acpi_gbl_owner_id_mask[index] & bit) {
|
||||
acpi_gbl_owner_id_mask[index] ^= bit;
|
||||
} else {
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"Release of non-allocated OwnerId: 0x%2.2X",
|
||||
owner_id + 1));
|
||||
}
|
||||
|
||||
(void)acpi_ut_release_mutex(ACPI_MTX_CACHES);
|
||||
return_VOID;
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ut_strupr (strupr)
|
||||
*
|
||||
* PARAMETERS: src_string - The source string to convert
|
||||
*
|
||||
* RETURN: None
|
||||
*
|
||||
* DESCRIPTION: Convert string to uppercase
|
||||
*
|
||||
* NOTE: This is not a POSIX function, so it appears here, not in utclib.c
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
void acpi_ut_strupr(char *src_string)
|
||||
{
|
||||
char *string;
|
||||
|
||||
ACPI_FUNCTION_ENTRY();
|
||||
|
||||
if (!src_string) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* Walk entire string, uppercasing the letters */
|
||||
|
||||
for (string = src_string; *string; string++) {
|
||||
*string = (char)ACPI_TOUPPER(*string);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
#ifdef ACPI_ASL_COMPILER
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ut_strlwr (strlwr)
|
||||
*
|
||||
* PARAMETERS: src_string - The source string to convert
|
||||
*
|
||||
* RETURN: None
|
||||
*
|
||||
* DESCRIPTION: Convert string to lowercase
|
||||
*
|
||||
* NOTE: This is not a POSIX function, so it appears here, not in utclib.c
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
void acpi_ut_strlwr(char *src_string)
|
||||
{
|
||||
char *string;
|
||||
|
||||
ACPI_FUNCTION_ENTRY();
|
||||
|
||||
if (!src_string) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* Walk entire string, lowercasing the letters */
|
||||
|
||||
for (string = src_string; *string; string++) {
|
||||
*string = (char)ACPI_TOLOWER(*string);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ut_stricmp
|
||||
*
|
||||
* PARAMETERS: string1 - first string to compare
|
||||
* string2 - second string to compare
|
||||
*
|
||||
* RETURN: int that signifies string relationship. Zero means strings
|
||||
* are equal.
|
||||
*
|
||||
* DESCRIPTION: Implementation of the non-ANSI stricmp function (compare
|
||||
* strings with no case sensitivity)
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
int acpi_ut_stricmp(char *string1, char *string2)
|
||||
{
|
||||
int c1;
|
||||
int c2;
|
||||
|
||||
do {
|
||||
c1 = tolower((int)*string1);
|
||||
c2 = tolower((int)*string2);
|
||||
|
||||
string1++;
|
||||
string2++;
|
||||
}
|
||||
while ((c1 == c2) && (c1));
|
||||
|
||||
return (c1 - c2);
|
||||
}
|
||||
#endif
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ut_print_string
|
||||
*
|
||||
* PARAMETERS: string - Null terminated ASCII string
|
||||
* max_length - Maximum output length
|
||||
*
|
||||
* RETURN: None
|
||||
*
|
||||
* DESCRIPTION: Dump an ASCII string with support for ACPI-defined escape
|
||||
* sequences.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
void acpi_ut_print_string(char *string, u8 max_length)
|
||||
{
|
||||
u32 i;
|
||||
|
||||
if (!string) {
|
||||
acpi_os_printf("<\"NULL STRING PTR\">");
|
||||
return;
|
||||
}
|
||||
|
||||
acpi_os_printf("\"");
|
||||
for (i = 0; string[i] && (i < max_length); i++) {
|
||||
|
||||
/* Escape sequences */
|
||||
|
||||
switch (string[i]) {
|
||||
case 0x07:
|
||||
acpi_os_printf("\\a"); /* BELL */
|
||||
break;
|
||||
|
||||
case 0x08:
|
||||
acpi_os_printf("\\b"); /* BACKSPACE */
|
||||
break;
|
||||
|
||||
case 0x0C:
|
||||
acpi_os_printf("\\f"); /* FORMFEED */
|
||||
break;
|
||||
|
||||
case 0x0A:
|
||||
acpi_os_printf("\\n"); /* LINEFEED */
|
||||
break;
|
||||
|
||||
case 0x0D:
|
||||
acpi_os_printf("\\r"); /* CARRIAGE RETURN */
|
||||
break;
|
||||
|
||||
case 0x09:
|
||||
acpi_os_printf("\\t"); /* HORIZONTAL TAB */
|
||||
break;
|
||||
|
||||
case 0x0B:
|
||||
acpi_os_printf("\\v"); /* VERTICAL TAB */
|
||||
break;
|
||||
|
||||
case '\'': /* Single Quote */
|
||||
case '\"': /* Double Quote */
|
||||
case '\\': /* Backslash */
|
||||
acpi_os_printf("\\%c", (int)string[i]);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
/* Check for printable character or hex escape */
|
||||
|
||||
if (ACPI_IS_PRINT(string[i])) {
|
||||
/* This is a normal character */
|
||||
|
||||
acpi_os_printf("%c", (int)string[i]);
|
||||
} else {
|
||||
/* All others will be Hex escapes */
|
||||
|
||||
acpi_os_printf("\\x%2.2X", (s32) string[i]);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
acpi_os_printf("\"");
|
||||
|
||||
if (i == max_length && string[i]) {
|
||||
acpi_os_printf("...");
|
||||
}
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ut_dword_byte_swap
|
||||
@ -559,379 +172,6 @@ void acpi_ut_set_integer_width(u8 revision)
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef ACPI_DEBUG_OUTPUT
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ut_display_init_pathname
|
||||
*
|
||||
* PARAMETERS: type - Object type of the node
|
||||
* obj_handle - Handle whose pathname will be displayed
|
||||
* path - Additional path string to be appended.
|
||||
* (NULL if no extra path)
|
||||
*
|
||||
* RETURN: acpi_status
|
||||
*
|
||||
* DESCRIPTION: Display full pathname of an object, DEBUG ONLY
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
void
|
||||
acpi_ut_display_init_pathname(u8 type,
|
||||
struct acpi_namespace_node *obj_handle,
|
||||
char *path)
|
||||
{
|
||||
acpi_status status;
|
||||
struct acpi_buffer buffer;
|
||||
|
||||
ACPI_FUNCTION_ENTRY();
|
||||
|
||||
/* Only print the path if the appropriate debug level is enabled */
|
||||
|
||||
if (!(acpi_dbg_level & ACPI_LV_INIT_NAMES)) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* Get the full pathname to the node */
|
||||
|
||||
buffer.length = ACPI_ALLOCATE_LOCAL_BUFFER;
|
||||
status = acpi_ns_handle_to_pathname(obj_handle, &buffer);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* Print what we're doing */
|
||||
|
||||
switch (type) {
|
||||
case ACPI_TYPE_METHOD:
|
||||
acpi_os_printf("Executing ");
|
||||
break;
|
||||
|
||||
default:
|
||||
acpi_os_printf("Initializing ");
|
||||
break;
|
||||
}
|
||||
|
||||
/* Print the object type and pathname */
|
||||
|
||||
acpi_os_printf("%-12s %s",
|
||||
acpi_ut_get_type_name(type), (char *)buffer.pointer);
|
||||
|
||||
/* Extra path is used to append names like _STA, _INI, etc. */
|
||||
|
||||
if (path) {
|
||||
acpi_os_printf(".%s", path);
|
||||
}
|
||||
acpi_os_printf("\n");
|
||||
|
||||
ACPI_FREE(buffer.pointer);
|
||||
}
|
||||
#endif
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ut_valid_acpi_char
|
||||
*
|
||||
* PARAMETERS: char - The character to be examined
|
||||
* position - Byte position (0-3)
|
||||
*
|
||||
* RETURN: TRUE if the character is valid, FALSE otherwise
|
||||
*
|
||||
* DESCRIPTION: Check for a valid ACPI character. Must be one of:
|
||||
* 1) Upper case alpha
|
||||
* 2) numeric
|
||||
* 3) underscore
|
||||
*
|
||||
* We allow a '!' as the last character because of the ASF! table
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
u8 acpi_ut_valid_acpi_char(char character, u32 position)
|
||||
{
|
||||
|
||||
if (!((character >= 'A' && character <= 'Z') ||
|
||||
(character >= '0' && character <= '9') || (character == '_'))) {
|
||||
|
||||
/* Allow a '!' in the last position */
|
||||
|
||||
if (character == '!' && position == 3) {
|
||||
return (TRUE);
|
||||
}
|
||||
|
||||
return (FALSE);
|
||||
}
|
||||
|
||||
return (TRUE);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ut_valid_acpi_name
|
||||
*
|
||||
* PARAMETERS: name - The name to be examined
|
||||
*
|
||||
* RETURN: TRUE if the name is valid, FALSE otherwise
|
||||
*
|
||||
* DESCRIPTION: Check for a valid ACPI name. Each character must be one of:
|
||||
* 1) Upper case alpha
|
||||
* 2) numeric
|
||||
* 3) underscore
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
u8 acpi_ut_valid_acpi_name(u32 name)
|
||||
{
|
||||
u32 i;
|
||||
|
||||
ACPI_FUNCTION_ENTRY();
|
||||
|
||||
for (i = 0; i < ACPI_NAME_SIZE; i++) {
|
||||
if (!acpi_ut_valid_acpi_char
|
||||
((ACPI_CAST_PTR(char, &name))[i], i)) {
|
||||
return (FALSE);
|
||||
}
|
||||
}
|
||||
|
||||
return (TRUE);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ut_repair_name
|
||||
*
|
||||
* PARAMETERS: name - The ACPI name to be repaired
|
||||
*
|
||||
* RETURN: Repaired version of the name
|
||||
*
|
||||
* DESCRIPTION: Repair an ACPI name: Change invalid characters to '*' and
|
||||
* return the new name. NOTE: the Name parameter must reside in
|
||||
* read/write memory, cannot be a const.
|
||||
*
|
||||
* An ACPI Name must consist of valid ACPI characters. We will repair the name
|
||||
* if necessary because we don't want to abort because of this, but we want
|
||||
* all namespace names to be printable. A warning message is appropriate.
|
||||
*
|
||||
* This issue came up because there are in fact machines that exhibit
|
||||
* this problem, and we want to be able to enable ACPI support for them,
|
||||
* even though there are a few bad names.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
void acpi_ut_repair_name(char *name)
|
||||
{
|
||||
u32 i;
|
||||
u8 found_bad_char = FALSE;
|
||||
u32 original_name;
|
||||
|
||||
ACPI_FUNCTION_NAME(ut_repair_name);
|
||||
|
||||
ACPI_MOVE_NAME(&original_name, name);
|
||||
|
||||
/* Check each character in the name */
|
||||
|
||||
for (i = 0; i < ACPI_NAME_SIZE; i++) {
|
||||
if (acpi_ut_valid_acpi_char(name[i], i)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
/*
|
||||
* Replace a bad character with something printable, yet technically
|
||||
* still invalid. This prevents any collisions with existing "good"
|
||||
* names in the namespace.
|
||||
*/
|
||||
name[i] = '*';
|
||||
found_bad_char = TRUE;
|
||||
}
|
||||
|
||||
if (found_bad_char) {
|
||||
|
||||
/* Report warning only if in strict mode or debug mode */
|
||||
|
||||
if (!acpi_gbl_enable_interpreter_slack) {
|
||||
ACPI_WARNING((AE_INFO,
|
||||
"Found bad character(s) in name, repaired: [%4.4s]\n",
|
||||
name));
|
||||
} else {
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
|
||||
"Found bad character(s) in name, repaired: [%4.4s]\n",
|
||||
name));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ut_strtoul64
|
||||
*
|
||||
* PARAMETERS: string - Null terminated string
|
||||
* base - Radix of the string: 16 or ACPI_ANY_BASE;
|
||||
* ACPI_ANY_BASE means 'in behalf of to_integer'
|
||||
* ret_integer - Where the converted integer is returned
|
||||
*
|
||||
* RETURN: Status and Converted value
|
||||
*
|
||||
* DESCRIPTION: Convert a string into an unsigned value. Performs either a
|
||||
* 32-bit or 64-bit conversion, depending on the current mode
|
||||
* of the interpreter.
|
||||
* NOTE: Does not support Octal strings, not needed.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status acpi_ut_strtoul64(char *string, u32 base, u64 *ret_integer)
|
||||
{
|
||||
u32 this_digit = 0;
|
||||
u64 return_value = 0;
|
||||
u64 quotient;
|
||||
u64 dividend;
|
||||
u32 to_integer_op = (base == ACPI_ANY_BASE);
|
||||
u32 mode32 = (acpi_gbl_integer_byte_width == 4);
|
||||
u8 valid_digits = 0;
|
||||
u8 sign_of0x = 0;
|
||||
u8 term = 0;
|
||||
|
||||
ACPI_FUNCTION_TRACE_STR(ut_stroul64, string);
|
||||
|
||||
switch (base) {
|
||||
case ACPI_ANY_BASE:
|
||||
case 16:
|
||||
break;
|
||||
|
||||
default:
|
||||
/* Invalid Base */
|
||||
return_ACPI_STATUS(AE_BAD_PARAMETER);
|
||||
}
|
||||
|
||||
if (!string) {
|
||||
goto error_exit;
|
||||
}
|
||||
|
||||
/* Skip over any white space in the buffer */
|
||||
|
||||
while ((*string) && (ACPI_IS_SPACE(*string) || *string == '\t')) {
|
||||
string++;
|
||||
}
|
||||
|
||||
if (to_integer_op) {
|
||||
/*
|
||||
* Base equal to ACPI_ANY_BASE means 'ToInteger operation case'.
|
||||
* We need to determine if it is decimal or hexadecimal.
|
||||
*/
|
||||
if ((*string == '0') && (ACPI_TOLOWER(*(string + 1)) == 'x')) {
|
||||
sign_of0x = 1;
|
||||
base = 16;
|
||||
|
||||
/* Skip over the leading '0x' */
|
||||
string += 2;
|
||||
} else {
|
||||
base = 10;
|
||||
}
|
||||
}
|
||||
|
||||
/* Any string left? Check that '0x' is not followed by white space. */
|
||||
|
||||
if (!(*string) || ACPI_IS_SPACE(*string) || *string == '\t') {
|
||||
if (to_integer_op) {
|
||||
goto error_exit;
|
||||
} else {
|
||||
goto all_done;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Perform a 32-bit or 64-bit conversion, depending upon the current
|
||||
* execution mode of the interpreter
|
||||
*/
|
||||
dividend = (mode32) ? ACPI_UINT32_MAX : ACPI_UINT64_MAX;
|
||||
|
||||
/* Main loop: convert the string to a 32- or 64-bit integer */
|
||||
|
||||
while (*string) {
|
||||
if (ACPI_IS_DIGIT(*string)) {
|
||||
|
||||
/* Convert ASCII 0-9 to Decimal value */
|
||||
|
||||
this_digit = ((u8)*string) - '0';
|
||||
} else if (base == 10) {
|
||||
|
||||
/* Digit is out of range; possible in to_integer case only */
|
||||
|
||||
term = 1;
|
||||
} else {
|
||||
this_digit = (u8)ACPI_TOUPPER(*string);
|
||||
if (ACPI_IS_XDIGIT((char)this_digit)) {
|
||||
|
||||
/* Convert ASCII Hex char to value */
|
||||
|
||||
this_digit = this_digit - 'A' + 10;
|
||||
} else {
|
||||
term = 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (term) {
|
||||
if (to_integer_op) {
|
||||
goto error_exit;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
} else if ((valid_digits == 0) && (this_digit == 0)
|
||||
&& !sign_of0x) {
|
||||
|
||||
/* Skip zeros */
|
||||
string++;
|
||||
continue;
|
||||
}
|
||||
|
||||
valid_digits++;
|
||||
|
||||
if (sign_of0x
|
||||
&& ((valid_digits > 16)
|
||||
|| ((valid_digits > 8) && mode32))) {
|
||||
/*
|
||||
* This is to_integer operation case.
|
||||
* No any restrictions for string-to-integer conversion,
|
||||
* see ACPI spec.
|
||||
*/
|
||||
goto error_exit;
|
||||
}
|
||||
|
||||
/* Divide the digit into the correct position */
|
||||
|
||||
(void)acpi_ut_short_divide((dividend - (u64)this_digit),
|
||||
base, "ient, NULL);
|
||||
|
||||
if (return_value > quotient) {
|
||||
if (to_integer_op) {
|
||||
goto error_exit;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return_value *= base;
|
||||
return_value += this_digit;
|
||||
string++;
|
||||
}
|
||||
|
||||
/* All done, normal exit */
|
||||
|
||||
all_done:
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "Converted value: %8.8X%8.8X\n",
|
||||
ACPI_FORMAT_UINT64(return_value)));
|
||||
|
||||
*ret_integer = return_value;
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
|
||||
error_exit:
|
||||
/* Base was set/validated above */
|
||||
|
||||
if (base == 10) {
|
||||
return_ACPI_STATUS(AE_BAD_DECIMAL_CONSTANT);
|
||||
} else {
|
||||
return_ACPI_STATUS(AE_BAD_HEX_CONSTANT);
|
||||
}
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ut_create_update_state_and_push
|
||||
@ -1097,3 +337,71 @@ acpi_ut_walk_package_tree(union acpi_operand_object *source_object,
|
||||
|
||||
return_ACPI_STATUS(AE_AML_INTERNAL);
|
||||
}
|
||||
|
||||
#ifdef ACPI_DEBUG_OUTPUT
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ut_display_init_pathname
|
||||
*
|
||||
* PARAMETERS: type - Object type of the node
|
||||
* obj_handle - Handle whose pathname will be displayed
|
||||
* path - Additional path string to be appended.
|
||||
* (NULL if no extra path)
|
||||
*
|
||||
* RETURN: acpi_status
|
||||
*
|
||||
* DESCRIPTION: Display full pathname of an object, DEBUG ONLY
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
void
|
||||
acpi_ut_display_init_pathname(u8 type,
|
||||
struct acpi_namespace_node *obj_handle,
|
||||
char *path)
|
||||
{
|
||||
acpi_status status;
|
||||
struct acpi_buffer buffer;
|
||||
|
||||
ACPI_FUNCTION_ENTRY();
|
||||
|
||||
/* Only print the path if the appropriate debug level is enabled */
|
||||
|
||||
if (!(acpi_dbg_level & ACPI_LV_INIT_NAMES)) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* Get the full pathname to the node */
|
||||
|
||||
buffer.length = ACPI_ALLOCATE_LOCAL_BUFFER;
|
||||
status = acpi_ns_handle_to_pathname(obj_handle, &buffer);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* Print what we're doing */
|
||||
|
||||
switch (type) {
|
||||
case ACPI_TYPE_METHOD:
|
||||
acpi_os_printf("Executing ");
|
||||
break;
|
||||
|
||||
default:
|
||||
acpi_os_printf("Initializing ");
|
||||
break;
|
||||
}
|
||||
|
||||
/* Print the object type and pathname */
|
||||
|
||||
acpi_os_printf("%-12s %s",
|
||||
acpi_ut_get_type_name(type), (char *)buffer.pointer);
|
||||
|
||||
/* Extra path is used to append names like _STA, _INI, etc. */
|
||||
|
||||
if (path) {
|
||||
acpi_os_printf(".%s", path);
|
||||
}
|
||||
acpi_os_printf("\n");
|
||||
|
||||
ACPI_FREE(buffer.pointer);
|
||||
}
|
||||
#endif
|
||||
|
@ -419,7 +419,7 @@ void acpi_ut_delete_object_desc(union acpi_operand_object *object)
|
||||
{
|
||||
ACPI_FUNCTION_TRACE_PTR(ut_delete_object_desc, object);
|
||||
|
||||
/* Object must be a union acpi_operand_object */
|
||||
/* Object must be of type union acpi_operand_object */
|
||||
|
||||
if (ACPI_GET_DESCRIPTOR_TYPE(object) != ACPI_DESC_TYPE_OPERAND) {
|
||||
ACPI_ERROR((AE_INFO,
|
||||
|
218
drivers/acpi/acpica/utownerid.c
Normal file
218
drivers/acpi/acpica/utownerid.c
Normal file
@ -0,0 +1,218 @@
|
||||
/*******************************************************************************
|
||||
*
|
||||
* Module Name: utownerid - Support for Table/Method Owner IDs
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2000 - 2012, Intel Corp.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions, and the following disclaimer,
|
||||
* without modification.
|
||||
* 2. Redistributions in binary form must reproduce at minimum a disclaimer
|
||||
* substantially similar to the "NO WARRANTY" disclaimer below
|
||||
* ("Disclaimer") and any redistribution must be conditioned upon
|
||||
* including a substantially similar Disclaimer requirement for further
|
||||
* binary redistribution.
|
||||
* 3. Neither the names of the above-listed copyright holders nor the names
|
||||
* of any contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* Alternatively, this software may be distributed under the terms of the
|
||||
* GNU General Public License ("GPL") version 2 as published by the Free
|
||||
* Software Foundation.
|
||||
*
|
||||
* NO WARRANTY
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGES.
|
||||
*/
|
||||
|
||||
#include <acpi/acpi.h>
|
||||
#include "accommon.h"
|
||||
#include "acnamesp.h"
|
||||
|
||||
#define _COMPONENT ACPI_UTILITIES
|
||||
ACPI_MODULE_NAME("utownerid")
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ut_allocate_owner_id
|
||||
*
|
||||
* PARAMETERS: owner_id - Where the new owner ID is returned
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Allocate a table or method owner ID. The owner ID is used to
|
||||
* track objects created by the table or method, to be deleted
|
||||
* when the method exits or the table is unloaded.
|
||||
*
|
||||
******************************************************************************/
|
||||
acpi_status acpi_ut_allocate_owner_id(acpi_owner_id * owner_id)
|
||||
{
|
||||
u32 i;
|
||||
u32 j;
|
||||
u32 k;
|
||||
acpi_status status;
|
||||
|
||||
ACPI_FUNCTION_TRACE(ut_allocate_owner_id);
|
||||
|
||||
/* Guard against multiple allocations of ID to the same location */
|
||||
|
||||
if (*owner_id) {
|
||||
ACPI_ERROR((AE_INFO, "Owner ID [0x%2.2X] already exists",
|
||||
*owner_id));
|
||||
return_ACPI_STATUS(AE_ALREADY_EXISTS);
|
||||
}
|
||||
|
||||
/* Mutex for the global ID mask */
|
||||
|
||||
status = acpi_ut_acquire_mutex(ACPI_MTX_CACHES);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
/*
|
||||
* Find a free owner ID, cycle through all possible IDs on repeated
|
||||
* allocations. (ACPI_NUM_OWNERID_MASKS + 1) because first index may have
|
||||
* to be scanned twice.
|
||||
*/
|
||||
for (i = 0, j = acpi_gbl_last_owner_id_index;
|
||||
i < (ACPI_NUM_OWNERID_MASKS + 1); i++, j++) {
|
||||
if (j >= ACPI_NUM_OWNERID_MASKS) {
|
||||
j = 0; /* Wraparound to start of mask array */
|
||||
}
|
||||
|
||||
for (k = acpi_gbl_next_owner_id_offset; k < 32; k++) {
|
||||
if (acpi_gbl_owner_id_mask[j] == ACPI_UINT32_MAX) {
|
||||
|
||||
/* There are no free IDs in this mask */
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
if (!(acpi_gbl_owner_id_mask[j] & (1 << k))) {
|
||||
/*
|
||||
* Found a free ID. The actual ID is the bit index plus one,
|
||||
* making zero an invalid Owner ID. Save this as the last ID
|
||||
* allocated and update the global ID mask.
|
||||
*/
|
||||
acpi_gbl_owner_id_mask[j] |= (1 << k);
|
||||
|
||||
acpi_gbl_last_owner_id_index = (u8)j;
|
||||
acpi_gbl_next_owner_id_offset = (u8)(k + 1);
|
||||
|
||||
/*
|
||||
* Construct encoded ID from the index and bit position
|
||||
*
|
||||
* Note: Last [j].k (bit 255) is never used and is marked
|
||||
* permanently allocated (prevents +1 overflow)
|
||||
*/
|
||||
*owner_id =
|
||||
(acpi_owner_id) ((k + 1) + ACPI_MUL_32(j));
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_VALUES,
|
||||
"Allocated OwnerId: %2.2X\n",
|
||||
(unsigned int)*owner_id));
|
||||
goto exit;
|
||||
}
|
||||
}
|
||||
|
||||
acpi_gbl_next_owner_id_offset = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* All owner_ids have been allocated. This typically should
|
||||
* not happen since the IDs are reused after deallocation. The IDs are
|
||||
* allocated upon table load (one per table) and method execution, and
|
||||
* they are released when a table is unloaded or a method completes
|
||||
* execution.
|
||||
*
|
||||
* If this error happens, there may be very deep nesting of invoked control
|
||||
* methods, or there may be a bug where the IDs are not released.
|
||||
*/
|
||||
status = AE_OWNER_ID_LIMIT;
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"Could not allocate new OwnerId (255 max), AE_OWNER_ID_LIMIT"));
|
||||
|
||||
exit:
|
||||
(void)acpi_ut_release_mutex(ACPI_MTX_CACHES);
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ut_release_owner_id
|
||||
*
|
||||
* PARAMETERS: owner_id_ptr - Pointer to a previously allocated owner_ID
|
||||
*
|
||||
* RETURN: None. No error is returned because we are either exiting a
|
||||
* control method or unloading a table. Either way, we would
|
||||
* ignore any error anyway.
|
||||
*
|
||||
* DESCRIPTION: Release a table or method owner ID. Valid IDs are 1 - 255
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
void acpi_ut_release_owner_id(acpi_owner_id * owner_id_ptr)
|
||||
{
|
||||
acpi_owner_id owner_id = *owner_id_ptr;
|
||||
acpi_status status;
|
||||
u32 index;
|
||||
u32 bit;
|
||||
|
||||
ACPI_FUNCTION_TRACE_U32(ut_release_owner_id, owner_id);
|
||||
|
||||
/* Always clear the input owner_id (zero is an invalid ID) */
|
||||
|
||||
*owner_id_ptr = 0;
|
||||
|
||||
/* Zero is not a valid owner_ID */
|
||||
|
||||
if (owner_id == 0) {
|
||||
ACPI_ERROR((AE_INFO, "Invalid OwnerId: 0x%2.2X", owner_id));
|
||||
return_VOID;
|
||||
}
|
||||
|
||||
/* Mutex for the global ID mask */
|
||||
|
||||
status = acpi_ut_acquire_mutex(ACPI_MTX_CACHES);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_VOID;
|
||||
}
|
||||
|
||||
/* Normalize the ID to zero */
|
||||
|
||||
owner_id--;
|
||||
|
||||
/* Decode ID to index/offset pair */
|
||||
|
||||
index = ACPI_DIV_32(owner_id);
|
||||
bit = 1 << ACPI_MOD_32(owner_id);
|
||||
|
||||
/* Free the owner ID only if it is valid */
|
||||
|
||||
if (acpi_gbl_owner_id_mask[index] & bit) {
|
||||
acpi_gbl_owner_id_mask[index] ^= bit;
|
||||
} else {
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"Release of non-allocated OwnerId: 0x%2.2X",
|
||||
owner_id + 1));
|
||||
}
|
||||
|
||||
(void)acpi_ut_release_mutex(ACPI_MTX_CACHES);
|
||||
return_VOID;
|
||||
}
|
@ -127,7 +127,9 @@ const char *acpi_gbl_rw_decode[] = {
|
||||
|
||||
const char *acpi_gbl_shr_decode[] = {
|
||||
"Exclusive",
|
||||
"Shared"
|
||||
"Shared",
|
||||
"ExclusiveAndWake", /* ACPI 5.0 */
|
||||
"SharedAndWake" /* ACPI 5.0 */
|
||||
};
|
||||
|
||||
const char *acpi_gbl_siz_decode[] = {
|
||||
@ -383,26 +385,16 @@ static const u8 acpi_gbl_resource_types[] = {
|
||||
ACPI_VARIABLE_LENGTH /* 0E *serial_bus */
|
||||
};
|
||||
|
||||
/*
|
||||
* For the iASL compiler/disassembler, we don't want any error messages
|
||||
* because the disassembler uses the resource validation code to determine
|
||||
* if Buffer objects are actually Resource Templates.
|
||||
*/
|
||||
#ifdef ACPI_ASL_COMPILER
|
||||
#define ACPI_RESOURCE_ERROR(plist)
|
||||
#else
|
||||
#define ACPI_RESOURCE_ERROR(plist) ACPI_ERROR(plist)
|
||||
#endif
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ut_walk_aml_resources
|
||||
*
|
||||
* PARAMETERS: aml - Pointer to the raw AML resource template
|
||||
* aml_length - Length of the entire template
|
||||
* user_function - Called once for each descriptor found. If
|
||||
* NULL, a pointer to the end_tag is returned
|
||||
* context - Passed to user_function
|
||||
* PARAMETERS: walk_state - Current walk info
|
||||
* PARAMETERS: aml - Pointer to the raw AML resource template
|
||||
* aml_length - Length of the entire template
|
||||
* user_function - Called once for each descriptor found. If
|
||||
* NULL, a pointer to the end_tag is returned
|
||||
* context - Passed to user_function
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
@ -412,7 +404,8 @@ static const u8 acpi_gbl_resource_types[] = {
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status
|
||||
acpi_ut_walk_aml_resources(u8 * aml,
|
||||
acpi_ut_walk_aml_resources(struct acpi_walk_state *walk_state,
|
||||
u8 *aml,
|
||||
acpi_size aml_length,
|
||||
acpi_walk_aml_callback user_function, void **context)
|
||||
{
|
||||
@ -441,7 +434,8 @@ acpi_ut_walk_aml_resources(u8 * aml,
|
||||
|
||||
/* Validate the Resource Type and Resource Length */
|
||||
|
||||
status = acpi_ut_validate_resource(aml, &resource_index);
|
||||
status =
|
||||
acpi_ut_validate_resource(walk_state, aml, &resource_index);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
/*
|
||||
* Exit on failure. Cannot continue because the descriptor length
|
||||
@ -498,7 +492,8 @@ acpi_ut_walk_aml_resources(u8 * aml,
|
||||
|
||||
/* Insert an end_tag anyway. acpi_rs_get_list_length always leaves room */
|
||||
|
||||
(void)acpi_ut_validate_resource(end_tag, &resource_index);
|
||||
(void)acpi_ut_validate_resource(walk_state, end_tag,
|
||||
&resource_index);
|
||||
status =
|
||||
user_function(end_tag, 2, offset, resource_index, context);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
@ -513,9 +508,10 @@ acpi_ut_walk_aml_resources(u8 * aml,
|
||||
*
|
||||
* FUNCTION: acpi_ut_validate_resource
|
||||
*
|
||||
* PARAMETERS: aml - Pointer to the raw AML resource descriptor
|
||||
* return_index - Where the resource index is returned. NULL
|
||||
* if the index is not required.
|
||||
* PARAMETERS: walk_state - Current walk info
|
||||
* aml - Pointer to the raw AML resource descriptor
|
||||
* return_index - Where the resource index is returned. NULL
|
||||
* if the index is not required.
|
||||
*
|
||||
* RETURN: Status, and optionally the Index into the global resource tables
|
||||
*
|
||||
@ -525,7 +521,9 @@ acpi_ut_walk_aml_resources(u8 * aml,
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status acpi_ut_validate_resource(void *aml, u8 * return_index)
|
||||
acpi_status
|
||||
acpi_ut_validate_resource(struct acpi_walk_state *walk_state,
|
||||
void *aml, u8 *return_index)
|
||||
{
|
||||
union aml_resource *aml_resource;
|
||||
u8 resource_type;
|
||||
@ -627,10 +625,12 @@ acpi_status acpi_ut_validate_resource(void *aml, u8 * return_index)
|
||||
if ((aml_resource->common_serial_bus.type == 0) ||
|
||||
(aml_resource->common_serial_bus.type >
|
||||
AML_RESOURCE_MAX_SERIALBUSTYPE)) {
|
||||
ACPI_RESOURCE_ERROR((AE_INFO,
|
||||
"Invalid/unsupported SerialBus resource descriptor: BusType 0x%2.2X",
|
||||
aml_resource->common_serial_bus.
|
||||
type));
|
||||
if (walk_state) {
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"Invalid/unsupported SerialBus resource descriptor: BusType 0x%2.2X",
|
||||
aml_resource->common_serial_bus.
|
||||
type));
|
||||
}
|
||||
return (AE_AML_INVALID_RESOURCE_TYPE);
|
||||
}
|
||||
}
|
||||
@ -645,18 +645,22 @@ acpi_status acpi_ut_validate_resource(void *aml, u8 * return_index)
|
||||
|
||||
invalid_resource:
|
||||
|
||||
ACPI_RESOURCE_ERROR((AE_INFO,
|
||||
"Invalid/unsupported resource descriptor: Type 0x%2.2X",
|
||||
resource_type));
|
||||
if (walk_state) {
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"Invalid/unsupported resource descriptor: Type 0x%2.2X",
|
||||
resource_type));
|
||||
}
|
||||
return (AE_AML_INVALID_RESOURCE_TYPE);
|
||||
|
||||
bad_resource_length:
|
||||
|
||||
ACPI_RESOURCE_ERROR((AE_INFO,
|
||||
"Invalid resource descriptor length: Type "
|
||||
"0x%2.2X, Length 0x%4.4X, MinLength 0x%4.4X",
|
||||
resource_type, resource_length,
|
||||
minimum_resource_length));
|
||||
if (walk_state) {
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"Invalid resource descriptor length: Type "
|
||||
"0x%2.2X, Length 0x%4.4X, MinLength 0x%4.4X",
|
||||
resource_type, resource_length,
|
||||
minimum_resource_length));
|
||||
}
|
||||
return (AE_AML_BAD_RESOURCE_LENGTH);
|
||||
}
|
||||
|
||||
@ -800,8 +804,7 @@ u32 acpi_ut_get_descriptor_length(void *aml)
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status
|
||||
acpi_ut_get_resource_end_tag(union acpi_operand_object * obj_desc,
|
||||
u8 ** end_tag)
|
||||
acpi_ut_get_resource_end_tag(union acpi_operand_object *obj_desc, u8 **end_tag)
|
||||
{
|
||||
acpi_status status;
|
||||
|
||||
@ -816,7 +819,7 @@ acpi_ut_get_resource_end_tag(union acpi_operand_object * obj_desc,
|
||||
|
||||
/* Validate the template and get a pointer to the end_tag */
|
||||
|
||||
status = acpi_ut_walk_aml_resources(obj_desc->buffer.pointer,
|
||||
status = acpi_ut_walk_aml_resources(NULL, obj_desc->buffer.pointer,
|
||||
obj_desc->buffer.length, NULL,
|
||||
(void **)end_tag);
|
||||
|
||||
|
@ -97,14 +97,13 @@ void
|
||||
acpi_ut_push_generic_state(union acpi_generic_state **list_head,
|
||||
union acpi_generic_state *state)
|
||||
{
|
||||
ACPI_FUNCTION_TRACE(ut_push_generic_state);
|
||||
ACPI_FUNCTION_ENTRY();
|
||||
|
||||
/* Push the state object onto the front of the list (stack) */
|
||||
|
||||
state->common.next = *list_head;
|
||||
*list_head = state;
|
||||
|
||||
return_VOID;
|
||||
return;
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
@ -124,7 +123,7 @@ union acpi_generic_state *acpi_ut_pop_generic_state(union acpi_generic_state
|
||||
{
|
||||
union acpi_generic_state *state;
|
||||
|
||||
ACPI_FUNCTION_TRACE(ut_pop_generic_state);
|
||||
ACPI_FUNCTION_ENTRY();
|
||||
|
||||
/* Remove the state object at the head of the list (stack) */
|
||||
|
||||
@ -136,7 +135,7 @@ union acpi_generic_state *acpi_ut_pop_generic_state(union acpi_generic_state
|
||||
*list_head = state->common.next;
|
||||
}
|
||||
|
||||
return_PTR(state);
|
||||
return (state);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
@ -186,13 +185,13 @@ struct acpi_thread_state *acpi_ut_create_thread_state(void)
|
||||
{
|
||||
union acpi_generic_state *state;
|
||||
|
||||
ACPI_FUNCTION_TRACE(ut_create_thread_state);
|
||||
ACPI_FUNCTION_ENTRY();
|
||||
|
||||
/* Create the generic state object */
|
||||
|
||||
state = acpi_ut_create_generic_state();
|
||||
if (!state) {
|
||||
return_PTR(NULL);
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
/* Init fields specific to the update struct */
|
||||
@ -207,7 +206,7 @@ struct acpi_thread_state *acpi_ut_create_thread_state(void)
|
||||
state->thread.thread_id = (acpi_thread_id) 1;
|
||||
}
|
||||
|
||||
return_PTR((struct acpi_thread_state *)state);
|
||||
return ((struct acpi_thread_state *)state);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
@ -230,13 +229,13 @@ union acpi_generic_state *acpi_ut_create_update_state(union acpi_operand_object
|
||||
{
|
||||
union acpi_generic_state *state;
|
||||
|
||||
ACPI_FUNCTION_TRACE_PTR(ut_create_update_state, object);
|
||||
ACPI_FUNCTION_ENTRY();
|
||||
|
||||
/* Create the generic state object */
|
||||
|
||||
state = acpi_ut_create_generic_state();
|
||||
if (!state) {
|
||||
return_PTR(NULL);
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
/* Init fields specific to the update struct */
|
||||
@ -244,8 +243,7 @@ union acpi_generic_state *acpi_ut_create_update_state(union acpi_operand_object
|
||||
state->common.descriptor_type = ACPI_DESC_TYPE_STATE_UPDATE;
|
||||
state->update.object = object;
|
||||
state->update.value = action;
|
||||
|
||||
return_PTR(state);
|
||||
return (state);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
@ -267,13 +265,13 @@ union acpi_generic_state *acpi_ut_create_pkg_state(void *internal_object,
|
||||
{
|
||||
union acpi_generic_state *state;
|
||||
|
||||
ACPI_FUNCTION_TRACE_PTR(ut_create_pkg_state, internal_object);
|
||||
ACPI_FUNCTION_ENTRY();
|
||||
|
||||
/* Create the generic state object */
|
||||
|
||||
state = acpi_ut_create_generic_state();
|
||||
if (!state) {
|
||||
return_PTR(NULL);
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
/* Init fields specific to the update struct */
|
||||
@ -283,8 +281,7 @@ union acpi_generic_state *acpi_ut_create_pkg_state(void *internal_object,
|
||||
state->pkg.dest_object = external_object;
|
||||
state->pkg.index = index;
|
||||
state->pkg.num_packages = 1;
|
||||
|
||||
return_PTR(state);
|
||||
return (state);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
@ -304,21 +301,20 @@ union acpi_generic_state *acpi_ut_create_control_state(void)
|
||||
{
|
||||
union acpi_generic_state *state;
|
||||
|
||||
ACPI_FUNCTION_TRACE(ut_create_control_state);
|
||||
ACPI_FUNCTION_ENTRY();
|
||||
|
||||
/* Create the generic state object */
|
||||
|
||||
state = acpi_ut_create_generic_state();
|
||||
if (!state) {
|
||||
return_PTR(NULL);
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
/* Init fields specific to the control struct */
|
||||
|
||||
state->common.descriptor_type = ACPI_DESC_TYPE_STATE_CONTROL;
|
||||
state->common.state = ACPI_CONTROL_CONDITIONAL_EXECUTING;
|
||||
|
||||
return_PTR(state);
|
||||
return (state);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
@ -336,12 +332,12 @@ union acpi_generic_state *acpi_ut_create_control_state(void)
|
||||
|
||||
void acpi_ut_delete_generic_state(union acpi_generic_state *state)
|
||||
{
|
||||
ACPI_FUNCTION_TRACE(ut_delete_generic_state);
|
||||
ACPI_FUNCTION_ENTRY();
|
||||
|
||||
/* Ignore null state */
|
||||
|
||||
if (state) {
|
||||
(void)acpi_os_release_object(acpi_gbl_state_cache, state);
|
||||
}
|
||||
return_VOID;
|
||||
return;
|
||||
}
|
||||
|
574
drivers/acpi/acpica/utstring.c
Normal file
574
drivers/acpi/acpica/utstring.c
Normal file
@ -0,0 +1,574 @@
|
||||
/*******************************************************************************
|
||||
*
|
||||
* Module Name: utstring - Common functions for strings and characters
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2000 - 2012, Intel Corp.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions, and the following disclaimer,
|
||||
* without modification.
|
||||
* 2. Redistributions in binary form must reproduce at minimum a disclaimer
|
||||
* substantially similar to the "NO WARRANTY" disclaimer below
|
||||
* ("Disclaimer") and any redistribution must be conditioned upon
|
||||
* including a substantially similar Disclaimer requirement for further
|
||||
* binary redistribution.
|
||||
* 3. Neither the names of the above-listed copyright holders nor the names
|
||||
* of any contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* Alternatively, this software may be distributed under the terms of the
|
||||
* GNU General Public License ("GPL") version 2 as published by the Free
|
||||
* Software Foundation.
|
||||
*
|
||||
* NO WARRANTY
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGES.
|
||||
*/
|
||||
|
||||
#include <acpi/acpi.h>
|
||||
#include "accommon.h"
|
||||
#include "acnamesp.h"
|
||||
|
||||
#define _COMPONENT ACPI_UTILITIES
|
||||
ACPI_MODULE_NAME("utstring")
|
||||
|
||||
/*
|
||||
* Non-ANSI C library functions - strlwr, strupr, stricmp, and a 64-bit
|
||||
* version of strtoul.
|
||||
*/
|
||||
#ifdef ACPI_ASL_COMPILER
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ut_strlwr (strlwr)
|
||||
*
|
||||
* PARAMETERS: src_string - The source string to convert
|
||||
*
|
||||
* RETURN: None
|
||||
*
|
||||
* DESCRIPTION: Convert string to lowercase
|
||||
*
|
||||
* NOTE: This is not a POSIX function, so it appears here, not in utclib.c
|
||||
*
|
||||
******************************************************************************/
|
||||
void acpi_ut_strlwr(char *src_string)
|
||||
{
|
||||
char *string;
|
||||
|
||||
ACPI_FUNCTION_ENTRY();
|
||||
|
||||
if (!src_string) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* Walk entire string, lowercasing the letters */
|
||||
|
||||
for (string = src_string; *string; string++) {
|
||||
*string = (char)ACPI_TOLOWER(*string);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ut_stricmp (stricmp)
|
||||
*
|
||||
* PARAMETERS: string1 - first string to compare
|
||||
* string2 - second string to compare
|
||||
*
|
||||
* RETURN: int that signifies string relationship. Zero means strings
|
||||
* are equal.
|
||||
*
|
||||
* DESCRIPTION: Implementation of the non-ANSI stricmp function (compare
|
||||
* strings with no case sensitivity)
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
int acpi_ut_stricmp(char *string1, char *string2)
|
||||
{
|
||||
int c1;
|
||||
int c2;
|
||||
|
||||
do {
|
||||
c1 = tolower((int)*string1);
|
||||
c2 = tolower((int)*string2);
|
||||
|
||||
string1++;
|
||||
string2++;
|
||||
}
|
||||
while ((c1 == c2) && (c1));
|
||||
|
||||
return (c1 - c2);
|
||||
}
|
||||
#endif
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ut_strupr (strupr)
|
||||
*
|
||||
* PARAMETERS: src_string - The source string to convert
|
||||
*
|
||||
* RETURN: None
|
||||
*
|
||||
* DESCRIPTION: Convert string to uppercase
|
||||
*
|
||||
* NOTE: This is not a POSIX function, so it appears here, not in utclib.c
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
void acpi_ut_strupr(char *src_string)
|
||||
{
|
||||
char *string;
|
||||
|
||||
ACPI_FUNCTION_ENTRY();
|
||||
|
||||
if (!src_string) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* Walk entire string, uppercasing the letters */
|
||||
|
||||
for (string = src_string; *string; string++) {
|
||||
*string = (char)ACPI_TOUPPER(*string);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ut_strtoul64
|
||||
*
|
||||
* PARAMETERS: string - Null terminated string
|
||||
* base - Radix of the string: 16 or ACPI_ANY_BASE;
|
||||
* ACPI_ANY_BASE means 'in behalf of to_integer'
|
||||
* ret_integer - Where the converted integer is returned
|
||||
*
|
||||
* RETURN: Status and Converted value
|
||||
*
|
||||
* DESCRIPTION: Convert a string into an unsigned value. Performs either a
|
||||
* 32-bit or 64-bit conversion, depending on the current mode
|
||||
* of the interpreter.
|
||||
* NOTE: Does not support Octal strings, not needed.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status acpi_ut_strtoul64(char *string, u32 base, u64 *ret_integer)
|
||||
{
|
||||
u32 this_digit = 0;
|
||||
u64 return_value = 0;
|
||||
u64 quotient;
|
||||
u64 dividend;
|
||||
u32 to_integer_op = (base == ACPI_ANY_BASE);
|
||||
u32 mode32 = (acpi_gbl_integer_byte_width == 4);
|
||||
u8 valid_digits = 0;
|
||||
u8 sign_of0x = 0;
|
||||
u8 term = 0;
|
||||
|
||||
ACPI_FUNCTION_TRACE_STR(ut_stroul64, string);
|
||||
|
||||
switch (base) {
|
||||
case ACPI_ANY_BASE:
|
||||
case 16:
|
||||
break;
|
||||
|
||||
default:
|
||||
/* Invalid Base */
|
||||
return_ACPI_STATUS(AE_BAD_PARAMETER);
|
||||
}
|
||||
|
||||
if (!string) {
|
||||
goto error_exit;
|
||||
}
|
||||
|
||||
/* Skip over any white space in the buffer */
|
||||
|
||||
while ((*string) && (ACPI_IS_SPACE(*string) || *string == '\t')) {
|
||||
string++;
|
||||
}
|
||||
|
||||
if (to_integer_op) {
|
||||
/*
|
||||
* Base equal to ACPI_ANY_BASE means 'ToInteger operation case'.
|
||||
* We need to determine if it is decimal or hexadecimal.
|
||||
*/
|
||||
if ((*string == '0') && (ACPI_TOLOWER(*(string + 1)) == 'x')) {
|
||||
sign_of0x = 1;
|
||||
base = 16;
|
||||
|
||||
/* Skip over the leading '0x' */
|
||||
string += 2;
|
||||
} else {
|
||||
base = 10;
|
||||
}
|
||||
}
|
||||
|
||||
/* Any string left? Check that '0x' is not followed by white space. */
|
||||
|
||||
if (!(*string) || ACPI_IS_SPACE(*string) || *string == '\t') {
|
||||
if (to_integer_op) {
|
||||
goto error_exit;
|
||||
} else {
|
||||
goto all_done;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Perform a 32-bit or 64-bit conversion, depending upon the current
|
||||
* execution mode of the interpreter
|
||||
*/
|
||||
dividend = (mode32) ? ACPI_UINT32_MAX : ACPI_UINT64_MAX;
|
||||
|
||||
/* Main loop: convert the string to a 32- or 64-bit integer */
|
||||
|
||||
while (*string) {
|
||||
if (ACPI_IS_DIGIT(*string)) {
|
||||
|
||||
/* Convert ASCII 0-9 to Decimal value */
|
||||
|
||||
this_digit = ((u8)*string) - '0';
|
||||
} else if (base == 10) {
|
||||
|
||||
/* Digit is out of range; possible in to_integer case only */
|
||||
|
||||
term = 1;
|
||||
} else {
|
||||
this_digit = (u8)ACPI_TOUPPER(*string);
|
||||
if (ACPI_IS_XDIGIT((char)this_digit)) {
|
||||
|
||||
/* Convert ASCII Hex char to value */
|
||||
|
||||
this_digit = this_digit - 'A' + 10;
|
||||
} else {
|
||||
term = 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (term) {
|
||||
if (to_integer_op) {
|
||||
goto error_exit;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
} else if ((valid_digits == 0) && (this_digit == 0)
|
||||
&& !sign_of0x) {
|
||||
|
||||
/* Skip zeros */
|
||||
string++;
|
||||
continue;
|
||||
}
|
||||
|
||||
valid_digits++;
|
||||
|
||||
if (sign_of0x
|
||||
&& ((valid_digits > 16)
|
||||
|| ((valid_digits > 8) && mode32))) {
|
||||
/*
|
||||
* This is to_integer operation case.
|
||||
* No any restrictions for string-to-integer conversion,
|
||||
* see ACPI spec.
|
||||
*/
|
||||
goto error_exit;
|
||||
}
|
||||
|
||||
/* Divide the digit into the correct position */
|
||||
|
||||
(void)acpi_ut_short_divide((dividend - (u64)this_digit),
|
||||
base, "ient, NULL);
|
||||
|
||||
if (return_value > quotient) {
|
||||
if (to_integer_op) {
|
||||
goto error_exit;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return_value *= base;
|
||||
return_value += this_digit;
|
||||
string++;
|
||||
}
|
||||
|
||||
/* All done, normal exit */
|
||||
|
||||
all_done:
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "Converted value: %8.8X%8.8X\n",
|
||||
ACPI_FORMAT_UINT64(return_value)));
|
||||
|
||||
*ret_integer = return_value;
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
|
||||
error_exit:
|
||||
/* Base was set/validated above */
|
||||
|
||||
if (base == 10) {
|
||||
return_ACPI_STATUS(AE_BAD_DECIMAL_CONSTANT);
|
||||
} else {
|
||||
return_ACPI_STATUS(AE_BAD_HEX_CONSTANT);
|
||||
}
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ut_print_string
|
||||
*
|
||||
* PARAMETERS: string - Null terminated ASCII string
|
||||
* max_length - Maximum output length
|
||||
*
|
||||
* RETURN: None
|
||||
*
|
||||
* DESCRIPTION: Dump an ASCII string with support for ACPI-defined escape
|
||||
* sequences.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
void acpi_ut_print_string(char *string, u8 max_length)
|
||||
{
|
||||
u32 i;
|
||||
|
||||
if (!string) {
|
||||
acpi_os_printf("<\"NULL STRING PTR\">");
|
||||
return;
|
||||
}
|
||||
|
||||
acpi_os_printf("\"");
|
||||
for (i = 0; string[i] && (i < max_length); i++) {
|
||||
|
||||
/* Escape sequences */
|
||||
|
||||
switch (string[i]) {
|
||||
case 0x07:
|
||||
acpi_os_printf("\\a"); /* BELL */
|
||||
break;
|
||||
|
||||
case 0x08:
|
||||
acpi_os_printf("\\b"); /* BACKSPACE */
|
||||
break;
|
||||
|
||||
case 0x0C:
|
||||
acpi_os_printf("\\f"); /* FORMFEED */
|
||||
break;
|
||||
|
||||
case 0x0A:
|
||||
acpi_os_printf("\\n"); /* LINEFEED */
|
||||
break;
|
||||
|
||||
case 0x0D:
|
||||
acpi_os_printf("\\r"); /* CARRIAGE RETURN */
|
||||
break;
|
||||
|
||||
case 0x09:
|
||||
acpi_os_printf("\\t"); /* HORIZONTAL TAB */
|
||||
break;
|
||||
|
||||
case 0x0B:
|
||||
acpi_os_printf("\\v"); /* VERTICAL TAB */
|
||||
break;
|
||||
|
||||
case '\'': /* Single Quote */
|
||||
case '\"': /* Double Quote */
|
||||
case '\\': /* Backslash */
|
||||
acpi_os_printf("\\%c", (int)string[i]);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
/* Check for printable character or hex escape */
|
||||
|
||||
if (ACPI_IS_PRINT(string[i])) {
|
||||
/* This is a normal character */
|
||||
|
||||
acpi_os_printf("%c", (int)string[i]);
|
||||
} else {
|
||||
/* All others will be Hex escapes */
|
||||
|
||||
acpi_os_printf("\\x%2.2X", (s32) string[i]);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
acpi_os_printf("\"");
|
||||
|
||||
if (i == max_length && string[i]) {
|
||||
acpi_os_printf("...");
|
||||
}
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ut_valid_acpi_char
|
||||
*
|
||||
* PARAMETERS: char - The character to be examined
|
||||
* position - Byte position (0-3)
|
||||
*
|
||||
* RETURN: TRUE if the character is valid, FALSE otherwise
|
||||
*
|
||||
* DESCRIPTION: Check for a valid ACPI character. Must be one of:
|
||||
* 1) Upper case alpha
|
||||
* 2) numeric
|
||||
* 3) underscore
|
||||
*
|
||||
* We allow a '!' as the last character because of the ASF! table
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
u8 acpi_ut_valid_acpi_char(char character, u32 position)
|
||||
{
|
||||
|
||||
if (!((character >= 'A' && character <= 'Z') ||
|
||||
(character >= '0' && character <= '9') || (character == '_'))) {
|
||||
|
||||
/* Allow a '!' in the last position */
|
||||
|
||||
if (character == '!' && position == 3) {
|
||||
return (TRUE);
|
||||
}
|
||||
|
||||
return (FALSE);
|
||||
}
|
||||
|
||||
return (TRUE);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ut_valid_acpi_name
|
||||
*
|
||||
* PARAMETERS: name - The name to be examined
|
||||
*
|
||||
* RETURN: TRUE if the name is valid, FALSE otherwise
|
||||
*
|
||||
* DESCRIPTION: Check for a valid ACPI name. Each character must be one of:
|
||||
* 1) Upper case alpha
|
||||
* 2) numeric
|
||||
* 3) underscore
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
u8 acpi_ut_valid_acpi_name(u32 name)
|
||||
{
|
||||
u32 i;
|
||||
|
||||
ACPI_FUNCTION_ENTRY();
|
||||
|
||||
for (i = 0; i < ACPI_NAME_SIZE; i++) {
|
||||
if (!acpi_ut_valid_acpi_char
|
||||
((ACPI_CAST_PTR(char, &name))[i], i)) {
|
||||
return (FALSE);
|
||||
}
|
||||
}
|
||||
|
||||
return (TRUE);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ut_repair_name
|
||||
*
|
||||
* PARAMETERS: name - The ACPI name to be repaired
|
||||
*
|
||||
* RETURN: Repaired version of the name
|
||||
*
|
||||
* DESCRIPTION: Repair an ACPI name: Change invalid characters to '*' and
|
||||
* return the new name. NOTE: the Name parameter must reside in
|
||||
* read/write memory, cannot be a const.
|
||||
*
|
||||
* An ACPI Name must consist of valid ACPI characters. We will repair the name
|
||||
* if necessary because we don't want to abort because of this, but we want
|
||||
* all namespace names to be printable. A warning message is appropriate.
|
||||
*
|
||||
* This issue came up because there are in fact machines that exhibit
|
||||
* this problem, and we want to be able to enable ACPI support for them,
|
||||
* even though there are a few bad names.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
void acpi_ut_repair_name(char *name)
|
||||
{
|
||||
u32 i;
|
||||
u8 found_bad_char = FALSE;
|
||||
u32 original_name;
|
||||
|
||||
ACPI_FUNCTION_NAME(ut_repair_name);
|
||||
|
||||
ACPI_MOVE_NAME(&original_name, name);
|
||||
|
||||
/* Check each character in the name */
|
||||
|
||||
for (i = 0; i < ACPI_NAME_SIZE; i++) {
|
||||
if (acpi_ut_valid_acpi_char(name[i], i)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
/*
|
||||
* Replace a bad character with something printable, yet technically
|
||||
* still invalid. This prevents any collisions with existing "good"
|
||||
* names in the namespace.
|
||||
*/
|
||||
name[i] = '*';
|
||||
found_bad_char = TRUE;
|
||||
}
|
||||
|
||||
if (found_bad_char) {
|
||||
|
||||
/* Report warning only if in strict mode or debug mode */
|
||||
|
||||
if (!acpi_gbl_enable_interpreter_slack) {
|
||||
ACPI_WARNING((AE_INFO,
|
||||
"Invalid character(s) in name (0x%.8X), repaired: [%4.4s]",
|
||||
original_name, name));
|
||||
} else {
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
|
||||
"Invalid character(s) in name (0x%.8X), repaired: [%4.4s]",
|
||||
original_name, name));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#if defined ACPI_ASL_COMPILER || defined ACPI_EXEC_APP
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: ut_convert_backslashes
|
||||
*
|
||||
* PARAMETERS: pathname - File pathname string to be converted
|
||||
*
|
||||
* RETURN: Modifies the input Pathname
|
||||
*
|
||||
* DESCRIPTION: Convert all backslashes (0x5C) to forward slashes (0x2F) within
|
||||
* the entire input file pathname string.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
void ut_convert_backslashes(char *pathname)
|
||||
{
|
||||
|
||||
if (!pathname) {
|
||||
return;
|
||||
}
|
||||
|
||||
while (*pathname) {
|
||||
if (*pathname == '\\') {
|
||||
*pathname = '/';
|
||||
}
|
||||
|
||||
pathname++;
|
||||
}
|
||||
}
|
||||
#endif
|
@ -436,10 +436,10 @@ acpi_ut_remove_allocation(struct acpi_debug_mem_block *allocation,
|
||||
struct acpi_memory_list *mem_list;
|
||||
acpi_status status;
|
||||
|
||||
ACPI_FUNCTION_TRACE(ut_remove_allocation);
|
||||
ACPI_FUNCTION_NAME(ut_remove_allocation);
|
||||
|
||||
if (acpi_gbl_disable_mem_tracking) {
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
return (AE_OK);
|
||||
}
|
||||
|
||||
mem_list = acpi_gbl_global_list;
|
||||
@ -450,12 +450,12 @@ acpi_ut_remove_allocation(struct acpi_debug_mem_block *allocation,
|
||||
ACPI_ERROR((module, line,
|
||||
"Empty allocation list, nothing to free!"));
|
||||
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
return (AE_OK);
|
||||
}
|
||||
|
||||
status = acpi_ut_acquire_mutex(ACPI_MTX_MEMORY);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
return (status);
|
||||
}
|
||||
|
||||
/* Unlink */
|
||||
@ -470,15 +470,15 @@ acpi_ut_remove_allocation(struct acpi_debug_mem_block *allocation,
|
||||
(allocation->next)->previous = allocation->previous;
|
||||
}
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_ALLOCATIONS, "Freeing %p, size 0%X\n",
|
||||
&allocation->user_space, allocation->size));
|
||||
|
||||
/* Mark the segment as deleted */
|
||||
|
||||
ACPI_MEMSET(&allocation->user_space, 0xEA, allocation->size);
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_ALLOCATIONS, "Freeing size 0%X\n",
|
||||
allocation->size));
|
||||
|
||||
status = acpi_ut_release_mutex(ACPI_MTX_MEMORY);
|
||||
return_ACPI_STATUS(status);
|
||||
return (status);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
|
@ -44,11 +44,7 @@
|
||||
#include <linux/export.h>
|
||||
#include <acpi/acpi.h>
|
||||
#include "accommon.h"
|
||||
#include "acevents.h"
|
||||
#include "acnamesp.h"
|
||||
#include "acdebug.h"
|
||||
#include "actables.h"
|
||||
#include "acinterp.h"
|
||||
|
||||
#define _COMPONENT ACPI_UTILITIES
|
||||
ACPI_MODULE_NAME("utxface")
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user