Merge branch 'acpica'

* acpica: (53 commits)
  ACPICA: Use designated initializers
  ACPICA: Update version to 20170531
  ACPICA: Update a couple of debug output messages
  ACPICA: acpiexec: enhance local signal handler
  ACPICA: Simplify output for the ACPI Debug Object
  ACPICA: Unix application OSL: Correctly handle control-c (EINTR)
  ACPICA: Improvements for debug output only
  ACPICA: Disassembler: allow conflicting external declarations to be emitted.
  ACPICA: Disassembler: add external op to namespace on first pass
  ACPICA: Disassembler: prevent external op's from opening a new scope
  ACPICA: Changed Gbl_disasm_flag to acpi_gbl_disasm_flag
  ACPICA: Changing External to a named object
  ACPICA: Update two error messages to emit control method name
  ACPICA: Fix for Device/Thermal objects with ObjectType and DerefOf
  ACPICA: Comment update: spelling/format. No functional change
  ACPICA: Update comments, no functional change
  ACPICA: Split resource descriptor decode strings to a new file
  ACPICA: Remove extraneous status check
  ACPICA: Export the public mutex interfaces
  ACPICA: Disassembler: Abort on an invalid/unknown AML opcode
  ...
This commit is contained in:
Rafael J. Wysocki 2017-07-03 14:24:28 +02:00
commit 80abc82e6c
61 changed files with 2031 additions and 434 deletions

View file

@ -172,6 +172,7 @@ acpi-y += \
utosi.o \
utownerid.o \
utpredef.o \
utresdecode.o \
utresrc.o \
utstate.o \
utstring.o \

View file

@ -158,8 +158,8 @@ acpi_dm_finish_namespace_load(union acpi_parse_object *parse_tree_root,
acpi_owner_id owner_id);
void
acpi_dm_convert_resource_indexes(union acpi_parse_object *parse_tree_root,
struct acpi_namespace_node *namespace_root);
acpi_dm_convert_parse_objects(union acpi_parse_object *parse_tree_root,
struct acpi_namespace_node *namespace_root);
/*
* adfile

View file

@ -315,6 +315,7 @@ ACPI_INIT_GLOBAL(u8, acpi_gbl_force_aml_disassembly, FALSE);
ACPI_INIT_GLOBAL(u8, acpi_gbl_dm_opt_verbose, TRUE);
ACPI_INIT_GLOBAL(u8, acpi_gbl_dm_emit_external_opcodes, FALSE);
ACPI_INIT_GLOBAL(u8, acpi_gbl_do_disassembler_optimizations, TRUE);
ACPI_INIT_GLOBAL(ACPI_PARSE_OBJECT_LIST, *acpi_gbl_temp_list_head, NULL);
ACPI_GLOBAL(u8, acpi_gbl_dm_opt_disasm);
ACPI_GLOBAL(u8, acpi_gbl_dm_opt_listing);
@ -368,6 +369,8 @@ ACPI_GLOBAL(const char, *acpi_gbl_pld_vertical_position_list[]);
ACPI_GLOBAL(const char, *acpi_gbl_pld_horizontal_position_list[]);
ACPI_GLOBAL(const char, *acpi_gbl_pld_shape_list[]);
ACPI_INIT_GLOBAL(u8, acpi_gbl_disasm_flag, FALSE);
#endif
/*

View file

@ -859,7 +859,7 @@ ACPI_PARSE_COMMON};
* and bytelists.
*/
struct acpi_parse_obj_named {
ACPI_PARSE_COMMON u8 *path;
ACPI_PARSE_COMMON char *path;
u8 *data; /* AML body or bytelist data */
u32 length; /* AML length */
u32 name; /* 4-byte name or zero if no name */
@ -1142,8 +1142,13 @@ struct acpi_port_info {
#define ACPI_RESOURCE_NAME_ADDRESS64 0x8A
#define ACPI_RESOURCE_NAME_EXTENDED_ADDRESS64 0x8B
#define ACPI_RESOURCE_NAME_GPIO 0x8C
#define ACPI_RESOURCE_NAME_PIN_FUNCTION 0x8D
#define ACPI_RESOURCE_NAME_SERIAL_BUS 0x8E
#define ACPI_RESOURCE_NAME_LARGE_MAX 0x8E
#define ACPI_RESOURCE_NAME_PIN_CONFIG 0x8F
#define ACPI_RESOURCE_NAME_PIN_GROUP 0x90
#define ACPI_RESOURCE_NAME_PIN_GROUP_FUNCTION 0x91
#define ACPI_RESOURCE_NAME_PIN_GROUP_CONFIG 0x92
#define ACPI_RESOURCE_NAME_LARGE_MAX 0x92
/*****************************************************************************
*
@ -1176,12 +1181,18 @@ struct acpi_external_list {
#define ACPI_EXT_INTERNAL_PATH_ALLOCATED 0x04 /* Deallocate internal path on completion */
#define ACPI_EXT_EXTERNAL_EMITTED 0x08 /* External() statement has been emitted */
#define ACPI_EXT_ORIGIN_FROM_OPCODE 0x10 /* External came from a External() opcode */
#define ACPI_EXT_CONFLICTING_DECLARATION 0x20 /* External has a conflicting declaration within AML */
struct acpi_external_file {
char *path;
struct acpi_external_file *next;
};
struct acpi_parse_object_list {
union acpi_parse_object *op;
struct acpi_parse_object_list *next;
};
/*****************************************************************************
*
* Debugger

View file

@ -112,7 +112,7 @@
#define ARGP_DWORD_OP ARGP_LIST1 (ARGP_DWORDDATA)
#define ARGP_ELSE_OP ARGP_LIST2 (ARGP_PKGLENGTH, ARGP_TERMLIST)
#define ARGP_EVENT_OP ARGP_LIST1 (ARGP_NAME)
#define ARGP_EXTERNAL_OP ARGP_LIST3 (ARGP_NAMESTRING, ARGP_BYTEDATA, ARGP_BYTEDATA)
#define ARGP_EXTERNAL_OP ARGP_LIST3 (ARGP_NAME, ARGP_BYTEDATA, ARGP_BYTEDATA)
#define ARGP_FATAL_OP ARGP_LIST3 (ARGP_BYTEDATA, ARGP_DWORDDATA, ARGP_TERMARG)
#define ARGP_FIELD_OP ARGP_LIST4 (ARGP_PKGLENGTH, ARGP_NAMESTRING, ARGP_BYTEDATA, ARGP_FIELDLIST)
#define ARGP_FIND_SET_LEFT_BIT_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TARGET)

View file

@ -581,6 +581,9 @@ const union acpi_predefined_info acpi_gbl_predefined_methods[] = {
{{"_HID", METHOD_0ARGS,
METHOD_RETURNS(ACPI_RTYPE_INTEGER | ACPI_RTYPE_STRING)}},
{{"_HMA", METHOD_0ARGS,
METHOD_RETURNS(ACPI_RTYPE_BUFFER)}},
{{"_HOT", METHOD_0ARGS,
METHOD_RETURNS(ACPI_RTYPE_INTEGER)}},
@ -626,6 +629,19 @@ const union acpi_predefined_info acpi_gbl_predefined_methods[] = {
ACPI_RTYPE_INTEGER | ACPI_RTYPE_BUFFER | ACPI_RTYPE_STRING,
10, 0),
{{"_LSI", METHOD_0ARGS,
METHOD_RETURNS(ACPI_RTYPE_PACKAGE)}},
PACKAGE_INFO(ACPI_PTYPE1_FIXED, ACPI_RTYPE_INTEGER, 3, 0, 0, 0),
{{"_LSR", METHOD_2ARGS(ACPI_TYPE_INTEGER, ACPI_TYPE_INTEGER),
METHOD_RETURNS(ACPI_RTYPE_PACKAGE)}},
PACKAGE_INFO(ACPI_PTYPE1_FIXED, ACPI_RTYPE_INTEGER, 1,
ACPI_RTYPE_BUFFER, 1, 0),
{{"_LSW",
METHOD_3ARGS(ACPI_TYPE_INTEGER, ACPI_TYPE_INTEGER, ACPI_TYPE_BUFFER),
METHOD_RETURNS(ACPI_RTYPE_INTEGER)}},
{{"_MAT", METHOD_0ARGS,
METHOD_RETURNS(ACPI_RTYPE_BUFFER)}},

View file

@ -148,7 +148,10 @@ typedef enum {
ACPI_RSD_UINT16,
ACPI_RSD_UINT32,
ACPI_RSD_UINT64,
ACPI_RSD_WORDLIST
ACPI_RSD_WORDLIST,
ACPI_RSD_LABEL,
ACPI_RSD_SOURCE_LABEL,
} ACPI_RSDUMP_OPCODES;
/* restore default alignment */
@ -329,6 +332,11 @@ extern struct acpi_rsconvert_info acpi_rs_convert_fixed_dma[];
extern struct acpi_rsconvert_info acpi_rs_convert_i2c_serial_bus[];
extern struct acpi_rsconvert_info acpi_rs_convert_spi_serial_bus[];
extern struct acpi_rsconvert_info acpi_rs_convert_uart_serial_bus[];
extern struct acpi_rsconvert_info acpi_rs_convert_pin_function[];
extern struct acpi_rsconvert_info acpi_rs_convert_pin_config[];
extern struct acpi_rsconvert_info acpi_rs_convert_pin_group[];
extern struct acpi_rsconvert_info acpi_rs_convert_pin_group_function[];
extern struct acpi_rsconvert_info acpi_rs_convert_pin_group_config[];
/* These resources require separate get/set tables */
@ -372,12 +380,17 @@ extern struct acpi_rsdump_info acpi_rs_dump_ext_address64[];
extern struct acpi_rsdump_info acpi_rs_dump_ext_irq[];
extern struct acpi_rsdump_info acpi_rs_dump_generic_reg[];
extern struct acpi_rsdump_info acpi_rs_dump_gpio[];
extern struct acpi_rsdump_info acpi_rs_dump_pin_function[];
extern struct acpi_rsdump_info acpi_rs_dump_fixed_dma[];
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[];
extern struct acpi_rsdump_info acpi_rs_dump_pin_config[];
extern struct acpi_rsdump_info acpi_rs_dump_pin_group[];
extern struct acpi_rsdump_info acpi_rs_dump_pin_group_function[];
extern struct acpi_rsdump_info acpi_rs_dump_pin_group_config[];
#endif
#endif /* __ACRESRC_H__ */

View file

@ -85,6 +85,7 @@ extern const char *acpi_gbl_bpb_decode[];
extern const char *acpi_gbl_sb_decode[];
extern const char *acpi_gbl_fc_decode[];
extern const char *acpi_gbl_pt_decode[];
extern const char *acpi_gbl_ptyp_decode[];
#endif
/*

View file

@ -313,6 +313,11 @@
* #A is the number of required arguments
* #T is the number of target operands
* #R indicates whether there is a return value
*
* These types are used for the top-level dispatch of the AML
* opcode. They group similar operators that can share common
* front-end code before dispatch to the final code that implements
* the operator.
*/
/*
@ -353,42 +358,42 @@
* The opcode Type is used in a dispatch table, do not change
* or add anything new without updating the table.
*/
#define AML_TYPE_EXEC_0A_0T_1R 0x00
#define AML_TYPE_EXEC_1A_0T_0R 0x01 /* Monadic1 */
#define AML_TYPE_EXEC_1A_0T_1R 0x02 /* Monadic2 */
#define AML_TYPE_EXEC_1A_1T_0R 0x03
#define AML_TYPE_EXEC_1A_1T_1R 0x04 /* monadic2_r */
#define AML_TYPE_EXEC_2A_0T_0R 0x05 /* Dyadic1 */
#define AML_TYPE_EXEC_2A_0T_1R 0x06 /* Dyadic2 */
#define AML_TYPE_EXEC_2A_1T_1R 0x07 /* dyadic2_r */
#define AML_TYPE_EXEC_2A_2T_1R 0x08
#define AML_TYPE_EXEC_3A_0T_0R 0x09
#define AML_TYPE_EXEC_3A_1T_1R 0x0A
#define AML_TYPE_EXEC_6A_0T_1R 0x0B
#define AML_TYPE_EXEC_0A_0T_1R 0x00 /* 0 Args, 0 Target, 1 ret_val */
#define AML_TYPE_EXEC_1A_0T_0R 0x01 /* 1 Args, 0 Target, 0 ret_val */
#define AML_TYPE_EXEC_1A_0T_1R 0x02 /* 1 Args, 0 Target, 1 ret_val */
#define AML_TYPE_EXEC_1A_1T_0R 0x03 /* 1 Args, 1 Target, 0 ret_val */
#define AML_TYPE_EXEC_1A_1T_1R 0x04 /* 1 Args, 1 Target, 1 ret_val */
#define AML_TYPE_EXEC_2A_0T_0R 0x05 /* 2 Args, 0 Target, 0 ret_val */
#define AML_TYPE_EXEC_2A_0T_1R 0x06 /* 2 Args, 0 Target, 1 ret_val */
#define AML_TYPE_EXEC_2A_1T_1R 0x07 /* 2 Args, 1 Target, 1 ret_val */
#define AML_TYPE_EXEC_2A_2T_1R 0x08 /* 2 Args, 2 Target, 1 ret_val */
#define AML_TYPE_EXEC_3A_0T_0R 0x09 /* 3 Args, 0 Target, 0 ret_val */
#define AML_TYPE_EXEC_3A_1T_1R 0x0A /* 3 Args, 1 Target, 1 ret_val */
#define AML_TYPE_EXEC_6A_0T_1R 0x0B /* 6 Args, 0 Target, 1 ret_val */
/* End of types used in dispatch table */
#define AML_TYPE_LITERAL 0x0B
#define AML_TYPE_CONSTANT 0x0C
#define AML_TYPE_METHOD_ARGUMENT 0x0D
#define AML_TYPE_LOCAL_VARIABLE 0x0E
#define AML_TYPE_DATA_TERM 0x0F
#define AML_TYPE_LITERAL 0x0C
#define AML_TYPE_CONSTANT 0x0D
#define AML_TYPE_METHOD_ARGUMENT 0x0E
#define AML_TYPE_LOCAL_VARIABLE 0x0F
#define AML_TYPE_DATA_TERM 0x10
/* Generic for an op that returns a value */
#define AML_TYPE_METHOD_CALL 0x10
#define AML_TYPE_METHOD_CALL 0x11
/* Miscellaneous types */
#define AML_TYPE_CREATE_FIELD 0x11
#define AML_TYPE_CREATE_OBJECT 0x12
#define AML_TYPE_CONTROL 0x13
#define AML_TYPE_NAMED_NO_OBJ 0x14
#define AML_TYPE_NAMED_FIELD 0x15
#define AML_TYPE_NAMED_SIMPLE 0x16
#define AML_TYPE_NAMED_COMPLEX 0x17
#define AML_TYPE_RETURN 0x18
#define AML_TYPE_UNDEFINED 0x19
#define AML_TYPE_BOGUS 0x1A
#define AML_TYPE_CREATE_FIELD 0x12
#define AML_TYPE_CREATE_OBJECT 0x13
#define AML_TYPE_CONTROL 0x14
#define AML_TYPE_NAMED_NO_OBJ 0x15
#define AML_TYPE_NAMED_FIELD 0x16
#define AML_TYPE_NAMED_SIMPLE 0x17
#define AML_TYPE_NAMED_COMPLEX 0x18
#define AML_TYPE_RETURN 0x19
#define AML_TYPE_UNDEFINED 0x1A
#define AML_TYPE_BOGUS 0x1B
/* AML Package Length encodings */

View file

@ -65,6 +65,7 @@
#define ACPI_RESTAG_DRIVESTRENGTH "_DRS"
#define ACPI_RESTAG_ENDIANNESS "_END"
#define ACPI_RESTAG_FLOWCONTROL "_FLC"
#define ACPI_RESTAG_FUNCTION "_FUN"
#define ACPI_RESTAG_GRANULARITY "_GRA"
#define ACPI_RESTAG_INTERRUPT "_INT"
#define ACPI_RESTAG_INTERRUPTLEVEL "_LL_" /* active_lo(1), active_hi(0) */
@ -84,6 +85,8 @@
#define ACPI_RESTAG_PHASE "_PHA"
#define ACPI_RESTAG_PIN "_PIN"
#define ACPI_RESTAG_PINCONFIG "_PPI"
#define ACPI_RESTAG_PINCONFIG_TYPE "_TYP"
#define ACPI_RESTAG_PINCONFIG_VALUE "_VAL"
#define ACPI_RESTAG_POLARITY "_POL"
#define ACPI_RESTAG_REGISTERBITOFFSET "_RBO"
#define ACPI_RESTAG_REGISTERBITWIDTH "_RBW"
@ -404,6 +407,102 @@ struct aml_resource_uart_serialbus {
#define AML_RESOURCE_UART_TYPE_REVISION 1 /* ACPI 5.0 */
#define AML_RESOURCE_UART_MIN_DATA_LEN 10
struct aml_resource_pin_function {
AML_RESOURCE_LARGE_HEADER_COMMON u8 revision_id;
u16 flags;
u8 pin_config;
u16 function_number;
u16 pin_table_offset;
u8 res_source_index;
u16 res_source_offset;
u16 vendor_offset;
u16 vendor_length;
/*
* Optional fields follow immediately:
* 1) PIN list (Words)
* 2) Resource Source String
* 3) Vendor Data bytes
*/
};
#define AML_RESOURCE_PIN_FUNCTION_REVISION 1 /* ACPI 6.2 */
struct aml_resource_pin_config {
AML_RESOURCE_LARGE_HEADER_COMMON u8 revision_id;
u16 flags;
u8 pin_config_type;
u32 pin_config_value;
u16 pin_table_offset;
u8 res_source_index;
u16 res_source_offset;
u16 vendor_offset;
u16 vendor_length;
/*
* Optional fields follow immediately:
* 1) PIN list (Words)
* 2) Resource Source String
* 3) Vendor Data bytes
*/
};
#define AML_RESOURCE_PIN_CONFIG_REVISION 1 /* ACPI 6.2 */
struct aml_resource_pin_group {
AML_RESOURCE_LARGE_HEADER_COMMON u8 revision_id;
u16 flags;
u16 pin_table_offset;
u16 label_offset;
u16 vendor_offset;
u16 vendor_length;
/*
* Optional fields follow immediately:
* 1) PIN list (Words)
* 2) Resource Label String
* 3) Vendor Data bytes
*/
};
#define AML_RESOURCE_PIN_GROUP_REVISION 1 /* ACPI 6.2 */
struct aml_resource_pin_group_function {
AML_RESOURCE_LARGE_HEADER_COMMON u8 revision_id;
u16 flags;
u16 function_number;
u8 res_source_index;
u16 res_source_offset;
u16 res_source_label_offset;
u16 vendor_offset;
u16 vendor_length;
/*
* Optional fields follow immediately:
* 1) Resource Source String
* 2) Resource Source Label String
* 3) Vendor Data bytes
*/
};
#define AML_RESOURCE_PIN_GROUP_FUNCTION_REVISION 1 /* ACPI 6.2 */
struct aml_resource_pin_group_config {
AML_RESOURCE_LARGE_HEADER_COMMON u8 revision_id;
u16 flags;
u8 pin_config_type;
u32 pin_config_value;
u8 res_source_index;
u16 res_source_offset;
u16 res_source_label_offset;
u16 vendor_offset;
u16 vendor_length;
/*
* Optional fields follow immediately:
* 1) Resource Source String
* 2) Resource Source Label String
* 3) Vendor Data bytes
*/
};
#define AML_RESOURCE_PIN_GROUP_CONFIG_REVISION 1 /* ACPI 6.2 */
/* restore default alignment */
#pragma pack()
@ -446,6 +545,11 @@ union aml_resource {
struct aml_resource_spi_serialbus spi_serial_bus;
struct aml_resource_uart_serialbus uart_serial_bus;
struct aml_resource_common_serialbus common_serial_bus;
struct aml_resource_pin_function pin_function;
struct aml_resource_pin_config pin_config;
struct aml_resource_pin_group pin_group;
struct aml_resource_pin_group_function pin_group_function;
struct aml_resource_pin_group_config pin_group_config;
/* Utility overlays */

View file

@ -181,6 +181,18 @@ acpi_db_execute_method(struct acpi_db_method_info *info,
acpi_gbl_method_executing = FALSE;
if (ACPI_FAILURE(status)) {
if ((status == AE_ABORT_METHOD) || acpi_gbl_abort_method) {
/* Clear the abort and fall back to the debugger prompt */
ACPI_EXCEPTION((AE_INFO, status,
"Aborting top-level method"));
acpi_gbl_abort_method = FALSE;
status = AE_OK;
goto cleanup;
}
ACPI_EXCEPTION((AE_INFO, status,
"while executing %s from debugger",
info->pathname));

View file

@ -448,7 +448,7 @@ void acpi_db_decode_locals(struct acpi_walk_state *walk_state)
if (display_locals) {
acpi_os_printf
("\nInitialized Local Variables for method [%4.4s]:\n",
("\nInitialized Local Variables for Method [%4.4s]:\n",
acpi_ut_get_node_name(node));
for (i = 0; i < ACPI_METHOD_NUM_LOCALS; i++) {
@ -461,7 +461,7 @@ void acpi_db_decode_locals(struct acpi_walk_state *walk_state)
}
} else {
acpi_os_printf
("No Local Variables are initialized for method [%4.4s]\n",
("No Local Variables are initialized for Method [%4.4s]\n",
acpi_ut_get_node_name(node));
}
}
@ -515,7 +515,7 @@ void acpi_db_decode_arguments(struct acpi_walk_state *walk_state)
acpi_os_printf("Initialized Arguments for Method [%4.4s]: "
"(%X arguments defined for method invocation)\n",
acpi_ut_get_node_name(node),
obj_desc->method.param_count);
node->object->method.param_count);
for (i = 0; i < ACPI_METHOD_NUM_ARGS; i++) {
obj_desc = walk_state->arguments[i].object;

View file

@ -244,7 +244,7 @@ acpi_db_single_step(struct acpi_walk_state *walk_state,
if ((acpi_gbl_db_output_to_file) ||
(acpi_dbg_level & ACPI_LV_PARSE)) {
acpi_os_printf
("\n[AmlDebug] Next AML Opcode to execute:\n");
("\nAML Debug: Next AML Opcode to execute:\n");
}
/*

View file

@ -82,7 +82,7 @@ acpi_ds_execute_arguments(struct acpi_namespace_node *node,
union acpi_parse_object *op;
struct acpi_walk_state *walk_state;
ACPI_FUNCTION_TRACE(ds_execute_arguments);
ACPI_FUNCTION_TRACE_PTR(ds_execute_arguments, aml_start);
/* Allocate a new parser op to be the root of the parsed tree */
@ -338,7 +338,8 @@ acpi_status acpi_ds_get_package_arguments(union acpi_operand_object *obj_desc)
return_ACPI_STATUS(AE_AML_INTERNAL);
}
ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "Package Arg Init\n"));
ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "Package Argument Init, AML Ptr: %p\n",
obj_desc->package.aml_start));
/* Execute the AML code for the term_arg arguments */

View file

@ -196,6 +196,7 @@ acpi_ds_dump_method_stack(acpi_status status,
op->common.next = NULL;
#ifdef ACPI_DISASSEMBLER
acpi_os_printf("Failed at ");
acpi_dm_disassemble(next_walk_state, op,
ACPI_UINT32_MAX);
#endif

View file

@ -212,6 +212,7 @@ acpi_status
acpi_ds_method_error(acpi_status status, struct acpi_walk_state *walk_state)
{
u32 aml_offset;
acpi_name name = 0;
ACPI_FUNCTION_ENTRY();
@ -237,10 +238,13 @@ acpi_ds_method_error(acpi_status status, struct acpi_walk_state *walk_state)
walk_state->parser_state.
aml_start);
status = acpi_gbl_exception_handler(status,
walk_state->method_node ?
walk_state->method_node->
name.integer : 0,
if (walk_state->method_node) {
name = walk_state->method_node->name.integer;
} else if (walk_state->deferred_node) {
name = walk_state->deferred_node->name.integer;
}
status = acpi_gbl_exception_handler(status, name,
walk_state->opcode,
aml_offset, NULL);
acpi_ex_enter_interpreter();

View file

@ -227,13 +227,12 @@ acpi_ds_init_buffer_field(u16 aml_opcode,
/* Entire field must fit within the current length of the buffer */
if ((bit_offset + bit_count) > (8 * (u32) buffer_desc->buffer.length)) {
if ((bit_offset + bit_count) > (8 * (u32)buffer_desc->buffer.length)) {
ACPI_ERROR((AE_INFO,
"Field [%4.4s] at %u exceeds Buffer [%4.4s] size %u (bits)",
acpi_ut_get_node_name(result_desc),
bit_offset + bit_count,
acpi_ut_get_node_name(buffer_desc->buffer.node),
8 * (u32) buffer_desc->buffer.length));
"Field [%4.4s] at bit offset/length %u/%u "
"exceeds size of target Buffer (%u bits)",
acpi_ut_get_node_name(result_desc), bit_offset,
bit_count, 8 * (u32)buffer_desc->buffer.length));
status = AE_AML_BUFFER_LIMIT;
goto cleanup;
}

View file

@ -633,15 +633,6 @@ acpi_ds_create_operand(struct acpi_walk_state *walk_state,
if ((op_info->flags & AML_HAS_RETVAL) ||
(arg->common.flags & ACPI_PARSEOP_IN_STACK)) {
ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,
"Argument previously created, already stacked\n"));
acpi_db_display_argument_object(walk_state->
operands[walk_state->
num_operands -
1],
walk_state);
/*
* Use value that was already previously returned
* by the evaluation of this argument

View file

@ -576,8 +576,8 @@ acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *walk_state)
case AML_TYPE_CREATE_OBJECT:
ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
"Executing CreateObject (Buffer/Package) Op=%p\n",
op));
"Executing CreateObject (Buffer/Package) Op=%p AMLPtr=%p\n",
op, op->named.data));
switch (op->common.parent->common.aml_opcode) {
case AML_NAME_OP:

View file

@ -397,7 +397,7 @@ acpi_ds_load1_begin_op(struct acpi_walk_state *walk_state,
/* Initialize the op */
#if (defined (ACPI_NO_METHOD_EXECUTION) || defined (ACPI_CONSTANT_EVAL_ONLY))
op->named.path = ACPI_CAST_PTR(u8, path);
op->named.path = path;
#endif
if (node) {
@ -434,6 +434,10 @@ acpi_status acpi_ds_load1_end_op(struct acpi_walk_state *walk_state)
acpi_object_type object_type;
acpi_status status = AE_OK;
#ifdef ACPI_ASL_COMPILER
u8 param_count;
#endif
ACPI_FUNCTION_TRACE(ds_load1_end_op);
op = walk_state->op;
@ -514,6 +518,38 @@ acpi_status acpi_ds_load1_end_op(struct acpi_walk_state *walk_state)
}
}
}
#ifdef ACPI_ASL_COMPILER
/*
* For external opcode, get the object type from the argument and
* get the parameter count from the argument's next.
*/
if (acpi_gbl_disasm_flag &&
op->common.node && op->common.aml_opcode == AML_EXTERNAL_OP) {
/*
* Note, if this external is not a method
* Op->Common.Value.Arg->Common.Next->Common.Value.Integer == 0
* Therefore, param_count will be 0.
*/
param_count =
(u8)op->common.value.arg->common.next->common.value.integer;
object_type = (u8)op->common.value.arg->common.value.integer;
op->common.node->flags |= ANOBJ_IS_EXTERNAL;
op->common.node->type = (u8)object_type;
acpi_dm_create_subobject_for_external((u8)object_type,
&op->common.node,
param_count);
/*
* Add the external to the external list because we may be
* emitting code based off of the items within the external list.
*/
acpi_dm_add_op_to_external_list(op, op->named.path,
(u8)object_type, param_count,
ACPI_EXT_ORIGIN_FROM_OPCODE |
ACPI_EXT_RESOLVED_REFERENCE);
}
#endif
/*
* If we are executing a method, do not create any namespace objects
@ -563,7 +599,9 @@ acpi_status acpi_ds_load1_end_op(struct acpi_walk_state *walk_state)
/* Pop the scope stack (only if loading a table) */
if (!walk_state->method_node && acpi_ns_opens_scope(object_type)) {
if (!walk_state->method_node &&
op->common.aml_opcode != AML_EXTERNAL_OP &&
acpi_ns_opens_scope(object_type)) {
ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,
"(%s): Popping scope for Op %p\n",
acpi_ut_get_type_name(object_type), op));

View file

@ -310,6 +310,22 @@ acpi_ds_load2_begin_op(struct acpi_walk_state *walk_state,
flags |= ACPI_NS_TEMPORARY;
}
}
#ifdef ACPI_ASL_COMPILER
/*
* Do not open a scope for AML_EXTERNAL_OP
* acpi_ns_lookup can open a new scope based on the object type
* of this op. AML_EXTERNAL_OP is a declaration rather than a
* definition. In the case that this external is a method object,
* acpi_ns_lookup will open a new scope. However, an AML_EXTERNAL_OP
* associated with the ACPI_TYPE_METHOD is a declaration, rather than
* a definition. Flags is set to avoid opening a scope for any
* AML_EXTERNAL_OP.
*/
if (walk_state->opcode == AML_EXTERNAL_OP) {
flags |= ACPI_NS_DONT_OPEN_SCOPE;
}
#endif
/* Add new entry or lookup existing entry */

View file

@ -180,6 +180,12 @@ acpi_status acpi_enable_event(u32 event, u32 flags)
ACPI_FUNCTION_TRACE(acpi_enable_event);
/* If Hardware Reduced flag is set, there are no fixed events */
if (acpi_gbl_reduced_hardware) {
return_ACPI_STATUS(AE_OK);
}
/* Decode the Fixed Event */
if (event > ACPI_EVENT_MAX) {
@ -237,6 +243,12 @@ acpi_status acpi_disable_event(u32 event, u32 flags)
ACPI_FUNCTION_TRACE(acpi_disable_event);
/* If Hardware Reduced flag is set, there are no fixed events */
if (acpi_gbl_reduced_hardware) {
return_ACPI_STATUS(AE_OK);
}
/* Decode the Fixed Event */
if (event > ACPI_EVENT_MAX) {
@ -290,6 +302,12 @@ acpi_status acpi_clear_event(u32 event)
ACPI_FUNCTION_TRACE(acpi_clear_event);
/* If Hardware Reduced flag is set, there are no fixed events */
if (acpi_gbl_reduced_hardware) {
return_ACPI_STATUS(AE_OK);
}
/* Decode the Fixed Event */
if (event > ACPI_EVENT_MAX) {

View file

@ -117,10 +117,10 @@ acpi_ex_do_debug_object(union acpi_operand_object *source_desc,
timer = ((u32)acpi_os_get_timer() / 10);
timer &= 0x03FFFFFF;
acpi_os_printf("[ACPI Debug T=0x%8.8X] %*s", timer,
acpi_os_printf("ACPI Debug: T=0x%8.8X %*s", timer,
level, " ");
} else {
acpi_os_printf("[ACPI Debug] %*s", level, " ");
acpi_os_printf("ACPI Debug: %*s", level, " ");
}
}

View file

@ -645,10 +645,12 @@ void acpi_ex_dump_operand(union acpi_operand_object *obj_desc, u32 depth)
/* obj_desc is a valid object */
if (depth > 0) {
ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "%*s[%u] %p ",
depth, " ", depth, obj_desc));
ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "%*s[%u] %p Refs=%u ",
depth, " ", depth, obj_desc,
obj_desc->common.reference_count));
} else {
ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "%p ", obj_desc));
ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "%p Refs=%u ",
obj_desc, obj_desc->common.reference_count));
}
/* Decode object type */
@ -690,8 +692,11 @@ void acpi_ex_dump_operand(union acpi_operand_object *obj_desc, u32 depth)
case ACPI_REFCLASS_NAME:
acpi_os_printf("- [%4.4s]\n",
obj_desc->reference.node->name.ascii);
acpi_ut_repair_name(obj_desc->reference.node->name.
ascii);
acpi_os_printf("- [%4.4s] (Node %p)\n",
obj_desc->reference.node->name.ascii,
obj_desc->reference.node);
break;
case ACPI_REFCLASS_ARG:
@ -999,9 +1004,15 @@ static void acpi_ex_dump_reference_obj(union acpi_operand_object *obj_desc)
status = acpi_ns_handle_to_pathname(obj_desc->reference.node,
&ret_buf, TRUE);
if (ACPI_FAILURE(status)) {
acpi_os_printf(" Could not convert name to pathname\n");
acpi_os_printf
(" Could not convert name to pathname: %s\n",
acpi_format_exception(status));
} else {
acpi_os_printf("%s\n", (char *)ret_buf.pointer);
acpi_os_printf("%s: %s\n",
acpi_ut_get_type_name(obj_desc->
reference.node->
type),
(char *)ret_buf.pointer);
ACPI_FREE(ret_buf.pointer);
}
} else if (obj_desc->reference.object) {
@ -1111,9 +1122,8 @@ acpi_ex_dump_package_obj(union acpi_operand_object *obj_desc,
case ACPI_TYPE_LOCAL_REFERENCE:
acpi_os_printf("[Object Reference] Type [%s] %2.2X",
acpi_ut_get_reference_name(obj_desc),
obj_desc->reference.class);
acpi_os_printf("[Object Reference] Class [%s]",
acpi_ut_get_reference_name(obj_desc));
acpi_ex_dump_reference_obj(obj_desc);
break;

View file

@ -921,13 +921,26 @@ acpi_status acpi_ex_opcode_1A_0T_1R(struct acpi_walk_state *walk_state)
* This is a deref_of (object_reference)
* Get the actual object from the Node (This is the dereference).
* This case may only happen when a local_x or arg_x is
* dereferenced above.
* dereferenced above, or for references to device and
* thermal objects.
*/
return_desc = acpi_ns_get_attached_object((struct
acpi_namespace_node
*)
operand[0]);
acpi_ut_add_reference(return_desc);
switch (((struct acpi_namespace_node *)operand[0])->
type) {
case ACPI_TYPE_DEVICE:
case ACPI_TYPE_THERMAL:
/* These types have no node subobject, return the NS node */
return_desc = operand[0];
break;
default:
/* For most types, get the object attached to the node */
return_desc = acpi_ns_get_attached_object((struct acpi_namespace_node *)operand[0]);
acpi_ut_add_reference(return_desc);
break;
}
} else {
/*
* This must be a reference object produced by either the

View file

@ -368,11 +368,24 @@ acpi_ex_resolve_multiple(struct acpi_walk_state *walk_state,
*)obj_desc);
}
if (!obj_desc) {
ACPI_ERROR((AE_INFO,
"[%4.4s] Node is unresolved or uninitialized",
acpi_ut_get_node_name(node)));
return_ACPI_STATUS(AE_AML_UNINITIALIZED_NODE);
switch (type) {
case ACPI_TYPE_DEVICE:
case ACPI_TYPE_THERMAL:
/* These types have no attached subobject */
break;
default:
/* All other types require a subobject */
if (!obj_desc) {
ACPI_ERROR((AE_INFO,
"[%4.4s] Node is unresolved or uninitialized",
acpi_ut_get_node_name(node)));
return_ACPI_STATUS(AE_AML_UNINITIALIZED_NODE);
}
break;
}
break;

View file

@ -70,11 +70,15 @@ static acpi_status acpi_hw_sleep_dispatch(u8 sleep_state, u32 function_id);
/* Legacy functions are optional, based upon ACPI_REDUCED_HARDWARE */
static struct acpi_sleep_functions acpi_sleep_dispatch[] = {
{ACPI_HW_OPTIONAL_FUNCTION(acpi_hw_legacy_sleep),
acpi_hw_extended_sleep},
{ACPI_HW_OPTIONAL_FUNCTION(acpi_hw_legacy_wake_prep),
acpi_hw_extended_wake_prep},
{ACPI_HW_OPTIONAL_FUNCTION(acpi_hw_legacy_wake), acpi_hw_extended_wake}
{ACPI_STRUCT_INIT(legacy_function,
ACPI_HW_OPTIONAL_FUNCTION(acpi_hw_legacy_sleep)),
ACPI_STRUCT_INIT(extended_function, acpi_hw_extended_sleep) },
{ACPI_STRUCT_INIT(legacy_function,
ACPI_HW_OPTIONAL_FUNCTION(acpi_hw_legacy_wake_prep)),
ACPI_STRUCT_INIT(extended_function, acpi_hw_extended_wake_prep) },
{ACPI_STRUCT_INIT(legacy_function,
ACPI_HW_OPTIONAL_FUNCTION(acpi_hw_legacy_wake)),
ACPI_STRUCT_INIT(extended_function, acpi_hw_extended_wake) }
};
/*

View file

@ -47,6 +47,10 @@
#include "acnamesp.h"
#include "acdispat.h"
#ifdef ACPI_ASL_COMPILER
#include "acdisasm.h"
#endif
#define _COMPONENT ACPI_NAMESPACE
ACPI_MODULE_NAME("nsaccess")
@ -580,6 +584,29 @@ acpi_ns_lookup(union acpi_generic_state *scope_info,
(char *)&current_node->name,
current_node));
}
#ifdef ACPI_ASL_COMPILER
/*
* If this ACPI name already exists within the namespace as an
* external declaration, then mark the external as a conflicting
* declaration and proceed to process the current node as if it did
* not exist in the namespace. If this node is not processed as
* normal, then it could cause improper namespace resolution
* by failing to open a new scope.
*/
if (acpi_gbl_disasm_flag &&
(status == AE_ALREADY_EXISTS) &&
((this_node->flags & ANOBJ_IS_EXTERNAL) ||
(walk_state
&& walk_state->opcode == AML_EXTERNAL_OP))) {
this_node->flags &= ~ANOBJ_IS_EXTERNAL;
this_node->type = (u8)this_search_type;
if (walk_state->opcode != AML_EXTERNAL_OP) {
acpi_dm_mark_external_conflict
(this_node);
}
break;
}
#endif
*return_node = this_node;
return_ACPI_STATUS(status);

View file

@ -190,9 +190,6 @@ acpi_ns_handle_to_pathname(acpi_handle target_handle,
(void)acpi_ns_build_normalized_path(node, buffer->pointer,
required_size, no_trailing);
if (ACPI_FAILURE(status)) {
return_ACPI_STATUS(status);
}
ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "%s [%X]\n",
(char *)buffer->pointer, (u32) required_size));

View file

@ -89,7 +89,7 @@ acpi_ns_print_node_pathname(struct acpi_namespace_node *node,
acpi_os_printf("%s ", message);
}
acpi_os_printf("[%s] (Node %p)", (char *)buffer.pointer, node);
acpi_os_printf("%s", (char *)buffer.pointer);
ACPI_FREE(buffer.pointer);
}
}

View file

@ -85,6 +85,8 @@ acpi_evaluate_object_typed(acpi_handle handle,
{
acpi_status status;
u8 free_buffer_on_error = FALSE;
acpi_handle target_handle;
char *full_pathname;
ACPI_FUNCTION_TRACE(acpi_evaluate_object_typed);
@ -98,38 +100,51 @@ acpi_evaluate_object_typed(acpi_handle handle,
free_buffer_on_error = TRUE;
}
/* Evaluate the object */
status = acpi_evaluate_object(handle, pathname,
external_params, return_buffer);
status = acpi_get_handle(handle, pathname, &target_handle);
if (ACPI_FAILURE(status)) {
return_ACPI_STATUS(status);
}
/* Type ANY means "don't care" */
full_pathname = acpi_ns_get_external_pathname(target_handle);
if (!full_pathname) {
return_ACPI_STATUS(AE_NO_MEMORY);
}
/* Evaluate the object */
status = acpi_evaluate_object(target_handle, NULL, external_params,
return_buffer);
if (ACPI_FAILURE(status)) {
goto exit;
}
/* Type ANY means "don't care about return value type" */
if (return_type == ACPI_TYPE_ANY) {
return_ACPI_STATUS(AE_OK);
goto exit;
}
if (return_buffer->length == 0) {
/* Error because caller specifically asked for a return value */
ACPI_ERROR((AE_INFO, "No return value"));
return_ACPI_STATUS(AE_NULL_OBJECT);
ACPI_ERROR((AE_INFO, "%s did not return any object",
full_pathname));
status = AE_NULL_OBJECT;
goto exit;
}
/* Examine the object type returned from evaluate_object */
if (((union acpi_object *)return_buffer->pointer)->type == return_type) {
return_ACPI_STATUS(AE_OK);
goto exit;
}
/* Return object type does not match requested type */
ACPI_ERROR((AE_INFO,
"Incorrect return type [%s] requested [%s]",
"Incorrect return type from %s - received [%s], requested [%s]",
full_pathname,
acpi_ut_get_type_name(((union acpi_object *)return_buffer->
pointer)->type),
acpi_ut_get_type_name(return_type)));
@ -147,7 +162,11 @@ acpi_evaluate_object_typed(acpi_handle handle,
}
return_buffer->length = 0;
return_ACPI_STATUS(AE_TYPE);
status = AE_TYPE;
exit:
ACPI_FREE(full_pathname);
return_ACPI_STATUS(status);
}
ACPI_EXPORT_SYMBOL(acpi_evaluate_object_typed)

View file

@ -122,6 +122,9 @@ static acpi_status acpi_ps_get_aml_opcode(struct acpi_walk_state *walk_state)
(u32)(aml_offset +
sizeof(struct acpi_table_header)));
ACPI_ERROR((AE_INFO,
"Aborting disassembly, AML byte code is corrupt"));
/* Dump the context surrounding the invalid opcode */
acpi_ut_dump_buffer(((u8 *)walk_state->parser_state.
@ -130,6 +133,14 @@ static acpi_status acpi_ps_get_aml_opcode(struct acpi_walk_state *walk_state)
sizeof(struct acpi_table_header) -
16));
acpi_os_printf(" */\n");
/*
* Just abort the disassembly, cannot continue because the
* parser is essentially lost. The disassembler can then
* randomly fail because an ill-constructed parse tree
* can result.
*/
return_ACPI_STATUS(AE_AML_BAD_OPCODE);
#endif
}
@ -331,6 +342,9 @@ acpi_ps_create_op(struct acpi_walk_state *walk_state,
if (status == AE_CTRL_PARSE_CONTINUE) {
return_ACPI_STATUS(AE_CTRL_PARSE_CONTINUE);
}
if (ACPI_FAILURE(status)) {
return_ACPI_STATUS(status);
}
/* Create Op structure and append to parent's argument list */

View file

@ -650,9 +650,11 @@ const struct acpi_opcode_info acpi_gbl_aml_op_info[AML_NUM_OPCODES] = {
/* ACPI 6.0 opcodes */
/* 81 */ ACPI_OP("External", ARGP_EXTERNAL_OP, ARGI_EXTERNAL_OP,
ACPI_TYPE_ANY, AML_CLASS_EXECUTE, /* ? */
AML_TYPE_EXEC_3A_0T_0R, AML_FLAGS_EXEC_3A_0T_0R),
/* 81 */ ACPI_OP("External", ARGP_EXTERNAL_OP, ARGI_EXTERNAL_OP,
ACPI_TYPE_ANY, AML_CLASS_NAMED_OBJECT,
AML_TYPE_NAMED_SIMPLE,
AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE |
AML_NSNODE | AML_NAMED),
/* 82 */ ACPI_OP("Comment", ARGP_COMMENT_OP, ARGI_COMMENT_OP,
ACPI_TYPE_STRING, AML_CLASS_ARGUMENT,
AML_TYPE_LITERAL, AML_CONSTANT)

View file

@ -56,6 +56,7 @@
#include "acdispat.h"
#include "amlcode.h"
#include "acinterp.h"
#include "acnamesp.h"
#define _COMPONENT ACPI_PARSER
ACPI_MODULE_NAME("psparse")
@ -538,9 +539,16 @@ acpi_status acpi_ps_parse_aml(struct acpi_walk_state *walk_state)
/* Either the method parse or actual execution failed */
acpi_ex_exit_interpreter();
ACPI_ERROR_METHOD("Method parse/execution failed",
walk_state->method_node, NULL,
status);
if (status == AE_ABORT_METHOD) {
acpi_ns_print_node_pathname(walk_state->
method_node,
"Method aborted:");
acpi_os_printf("\n");
} else {
ACPI_ERROR_METHOD
("Method parse/execution failed",
walk_state->method_node, NULL, status);
}
acpi_ex_enter_interpreter();
/* Check for possible multi-thread reentrancy problem */

View file

@ -340,6 +340,22 @@ acpi_rs_get_aml_length(struct acpi_resource *resource,
break;
case ACPI_RESOURCE_TYPE_PIN_FUNCTION:
total_size = (acpi_rs_length)(total_size +
(resource->data.
pin_function.
pin_table_length * 2) +
resource->data.
pin_function.
resource_source.
string_length +
resource->data.
pin_function.
vendor_length);
break;
case ACPI_RESOURCE_TYPE_SERIAL_BUS:
total_size =
@ -359,6 +375,67 @@ acpi_rs_get_aml_length(struct acpi_resource *resource,
break;
case ACPI_RESOURCE_TYPE_PIN_CONFIG:
total_size = (acpi_rs_length)(total_size +
(resource->data.
pin_config.
pin_table_length * 2) +
resource->data.pin_config.
resource_source.
string_length +
resource->data.pin_config.
vendor_length);
break;
case ACPI_RESOURCE_TYPE_PIN_GROUP:
total_size = (acpi_rs_length)(total_size +
(resource->data.pin_group.
pin_table_length * 2) +
resource->data.pin_group.
resource_label.
string_length +
resource->data.pin_group.
vendor_length);
break;
case ACPI_RESOURCE_TYPE_PIN_GROUP_FUNCTION:
total_size = (acpi_rs_length)(total_size +
resource->data.
pin_group_function.
resource_source.
string_length +
resource->data.
pin_group_function.
resource_source_label.
string_length +
resource->data.
pin_group_function.
vendor_length);
break;
case ACPI_RESOURCE_TYPE_PIN_GROUP_CONFIG:
total_size = (acpi_rs_length)(total_size +
resource->data.
pin_group_config.
resource_source.
string_length +
resource->data.
pin_group_config.
resource_source_label.
string_length +
resource->data.
pin_group_config.
vendor_length);
break;
default:
break;
@ -537,6 +614,24 @@ acpi_rs_get_list_length(u8 *aml_buffer,
}
break;
case ACPI_RESOURCE_NAME_PIN_FUNCTION:
/* Vendor data is optional */
if (aml_resource->pin_function.vendor_length) {
extra_struct_bytes +=
aml_resource->pin_function.vendor_offset -
aml_resource->pin_function.
pin_table_offset +
aml_resource->pin_function.vendor_length;
} else {
extra_struct_bytes +=
aml_resource->large_header.resource_length +
sizeof(struct aml_resource_large_header) -
aml_resource->pin_function.pin_table_offset;
}
break;
case ACPI_RESOURCE_NAME_SERIAL_BUS:
minimum_aml_resource_length =
@ -547,6 +642,50 @@ acpi_rs_get_list_length(u8 *aml_buffer,
minimum_aml_resource_length;
break;
case ACPI_RESOURCE_NAME_PIN_CONFIG:
/* Vendor data is optional */
if (aml_resource->pin_config.vendor_length) {
extra_struct_bytes +=
aml_resource->pin_config.vendor_offset -
aml_resource->pin_config.pin_table_offset +
aml_resource->pin_config.vendor_length;
} else {
extra_struct_bytes +=
aml_resource->large_header.resource_length +
sizeof(struct aml_resource_large_header) -
aml_resource->pin_config.pin_table_offset;
}
break;
case ACPI_RESOURCE_NAME_PIN_GROUP:
extra_struct_bytes +=
aml_resource->pin_group.vendor_offset -
aml_resource->pin_group.pin_table_offset +
aml_resource->pin_group.vendor_length;
break;
case ACPI_RESOURCE_NAME_PIN_GROUP_FUNCTION:
extra_struct_bytes +=
aml_resource->pin_group_function.vendor_offset -
aml_resource->pin_group_function.res_source_offset +
aml_resource->pin_group_function.vendor_length;
break;
case ACPI_RESOURCE_NAME_PIN_GROUP_CONFIG:
extra_struct_bytes +=
aml_resource->pin_group_config.vendor_offset -
aml_resource->pin_group_config.res_source_offset +
aml_resource->pin_group_config.vendor_length;
break;
default:
break;

View file

@ -75,6 +75,10 @@ static void acpi_rs_dump_short_byte_list(u8 length, u8 *data);
static void
acpi_rs_dump_resource_source(struct acpi_resource_source *resource_source);
static void
acpi_rs_dump_resource_label(char *title,
struct acpi_resource_label *resource_label);
static void acpi_rs_dump_address_common(union acpi_resource_data *resource);
static void
@ -371,6 +375,26 @@ acpi_rs_dump_descriptor(void *resource, struct acpi_rsdump_info *table)
target));
break;
case ACPI_RSD_LABEL:
/*
* resource_label
*/
acpi_rs_dump_resource_label("Resource Label",
ACPI_CAST_PTR(struct
acpi_resource_label,
target));
break;
case ACPI_RSD_SOURCE_LABEL:
/*
* resource_source_label
*/
acpi_rs_dump_resource_label("Resource Source Label",
ACPI_CAST_PTR(struct
acpi_resource_label,
target));
break;
default:
acpi_os_printf("**** Invalid table opcode [%X] ****\n",
@ -412,6 +436,30 @@ acpi_rs_dump_resource_source(struct acpi_resource_source *resource_source)
resource_source->string_ptr : "[Not Specified]");
}
/*******************************************************************************
*
* FUNCTION: acpi_rs_dump_resource_label
*
* PARAMETERS: title - Title of the dumped resource field
* resource_label - Pointer to a Resource Label struct
*
* RETURN: None
*
* DESCRIPTION: Common routine for dumping the resource_label
*
******************************************************************************/
static void
acpi_rs_dump_resource_label(char *title,
struct acpi_resource_label *resource_label)
{
ACPI_FUNCTION_ENTRY();
acpi_rs_out_string(title,
resource_label->string_ptr ?
resource_label->string_ptr : "[Not Specified]");
}
/*******************************************************************************
*
* FUNCTION: acpi_rs_dump_address_common

View file

@ -314,6 +314,120 @@ struct acpi_rsdump_info acpi_rs_dump_gpio[16] = {
NULL},
};
struct acpi_rsdump_info acpi_rs_dump_pin_function[10] = {
{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_pin_function),
"PinFunction", NULL},
{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(pin_function.revision_id),
"RevisionId", NULL},
{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(pin_function.pin_config), "PinConfig",
acpi_gbl_ppc_decode},
{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(pin_function.sharable), "Sharing",
acpi_gbl_shr_decode},
{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(pin_function.function_number),
"FunctionNumber", NULL},
{ACPI_RSD_SOURCE, ACPI_RSD_OFFSET(pin_function.resource_source),
"ResourceSource", NULL},
{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(pin_function.pin_table_length),
"PinTableLength", NULL},
{ACPI_RSD_WORDLIST, ACPI_RSD_OFFSET(pin_function.pin_table), "PinTable",
NULL},
{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(pin_function.vendor_length),
"VendorLength", NULL},
{ACPI_RSD_SHORTLISTX, ACPI_RSD_OFFSET(pin_function.vendor_data),
"VendorData", NULL},
};
struct acpi_rsdump_info acpi_rs_dump_pin_config[11] = {
{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_pin_config),
"PinConfig", NULL},
{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(pin_config.revision_id), "RevisionId",
NULL},
{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(pin_config.producer_consumer),
"ProducerConsumer", acpi_gbl_consume_decode},
{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(pin_config.sharable), "Sharing",
acpi_gbl_shr_decode},
{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(pin_config.pin_config_type),
"PinConfigType", NULL},
{ACPI_RSD_UINT32, ACPI_RSD_OFFSET(pin_config.pin_config_value),
"PinConfigValue", NULL},
{ACPI_RSD_SOURCE, ACPI_RSD_OFFSET(pin_config.resource_source),
"ResourceSource", NULL},
{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(pin_config.pin_table_length),
"PinTableLength", NULL},
{ACPI_RSD_WORDLIST, ACPI_RSD_OFFSET(pin_config.pin_table), "PinTable",
NULL},
{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(pin_config.vendor_length),
"VendorLength", NULL},
{ACPI_RSD_SHORTLISTX, ACPI_RSD_OFFSET(pin_config.vendor_data),
"VendorData", NULL},
};
struct acpi_rsdump_info acpi_rs_dump_pin_group[8] = {
{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_pin_group),
"PinGroup", NULL},
{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(pin_group.revision_id), "RevisionId",
NULL},
{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(pin_group.producer_consumer),
"ProducerConsumer", acpi_gbl_consume_decode},
{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(pin_group.pin_table_length),
"PinTableLength", NULL},
{ACPI_RSD_WORDLIST, ACPI_RSD_OFFSET(pin_group.pin_table), "PinTable",
NULL},
{ACPI_RSD_LABEL, ACPI_RSD_OFFSET(pin_group.resource_label),
"ResourceLabel", NULL},
{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(pin_group.vendor_length),
"VendorLength", NULL},
{ACPI_RSD_SHORTLISTX, ACPI_RSD_OFFSET(pin_group.vendor_data),
"VendorData", NULL},
};
struct acpi_rsdump_info acpi_rs_dump_pin_group_function[9] = {
{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_pin_group_function),
"PinGroupFunction", NULL},
{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(pin_group_function.revision_id),
"RevisionId", NULL},
{ACPI_RSD_1BITFLAG,
ACPI_RSD_OFFSET(pin_group_function.producer_consumer),
"ProducerConsumer", acpi_gbl_consume_decode},
{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(pin_group_function.sharable),
"Sharing", acpi_gbl_shr_decode},
{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(pin_group_function.function_number),
"FunctionNumber", NULL},
{ACPI_RSD_SOURCE_LABEL,
ACPI_RSD_OFFSET(pin_group_function.resource_source_label),
"ResourceSourceLabel", NULL},
{ACPI_RSD_SOURCE, ACPI_RSD_OFFSET(pin_group_function.resource_source),
"ResourceSource", NULL},
{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(pin_group_function.vendor_length),
"VendorLength", NULL},
{ACPI_RSD_SHORTLISTX, ACPI_RSD_OFFSET(pin_group_function.vendor_data),
"VendorData", NULL},
};
struct acpi_rsdump_info acpi_rs_dump_pin_group_config[10] = {
{ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE(acpi_rs_dump_pin_group_config),
"PinGroupConfig", NULL},
{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(pin_group_config.revision_id),
"RevisionId", NULL},
{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(pin_group_config.producer_consumer),
"ProducerConsumer", acpi_gbl_consume_decode},
{ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET(pin_group_config.sharable),
"Sharing", acpi_gbl_shr_decode},
{ACPI_RSD_UINT8, ACPI_RSD_OFFSET(pin_group_config.pin_config_type),
"PinConfigType", NULL},
{ACPI_RSD_UINT32, ACPI_RSD_OFFSET(pin_group_config.pin_config_value),
"PinConfigValue", NULL},
{ACPI_RSD_SOURCE_LABEL,
ACPI_RSD_OFFSET(pin_group_config.resource_source_label),
"ResourceSourceLabel", NULL},
{ACPI_RSD_SOURCE, ACPI_RSD_OFFSET(pin_group_config.resource_source),
"ResourceSource", NULL},
{ACPI_RSD_UINT16, ACPI_RSD_OFFSET(pin_group_config.vendor_length),
"VendorLength", NULL},
{ACPI_RSD_SHORTLISTX, ACPI_RSD_OFFSET(pin_group_config.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},

View file

@ -80,6 +80,11 @@ struct acpi_rsconvert_info *acpi_gbl_set_resource_dispatch[] = {
acpi_rs_convert_gpio, /* 0x11, ACPI_RESOURCE_TYPE_GPIO */
acpi_rs_convert_fixed_dma, /* 0x12, ACPI_RESOURCE_TYPE_FIXED_DMA */
NULL, /* 0x13, ACPI_RESOURCE_TYPE_SERIAL_BUS - Use subtype table below */
acpi_rs_convert_pin_function, /* 0x14, ACPI_RESOURCE_TYPE_PIN_FUNCTION */
acpi_rs_convert_pin_config, /* 0x15, ACPI_RESOURCE_TYPE_PIN_CONFIG */
acpi_rs_convert_pin_group, /* 0x16, ACPI_RESOURCE_TYPE_PIN_GROUP */
acpi_rs_convert_pin_group_function, /* 0x17, ACPI_RESOURCE_TYPE_PIN_GROUP_FUNCTION */
acpi_rs_convert_pin_group_config, /* 0x18, ACPI_RESOURCE_TYPE_PIN_GROUP_CONFIG */
};
/* Dispatch tables for AML-to-resource (Get Resource) conversion functions */
@ -119,8 +124,12 @@ struct acpi_rsconvert_info *acpi_gbl_get_resource_dispatch[] = {
acpi_rs_convert_address64, /* 0x0A, ACPI_RESOURCE_NAME_ADDRESS64 */
acpi_rs_convert_ext_address64, /* 0x0B, ACPI_RESOURCE_NAME_EXTENDED_ADDRESS64 */
acpi_rs_convert_gpio, /* 0x0C, ACPI_RESOURCE_NAME_GPIO */
NULL, /* 0x0D, Reserved */
acpi_rs_convert_pin_function, /* 0x0D, ACPI_RESOURCE_NAME_PIN_FUNCTION */
NULL, /* 0x0E, ACPI_RESOURCE_NAME_SERIAL_BUS - Use subtype table below */
acpi_rs_convert_pin_config, /* 0x0F, ACPI_RESOURCE_NAME_PIN_CONFIG */
acpi_rs_convert_pin_group, /* 0x10, ACPI_RESOURCE_NAME_PIN_GROUP */
acpi_rs_convert_pin_group_function, /* 0x11, ACPI_RESOURCE_NAME_PIN_GROUP_FUNCTION */
acpi_rs_convert_pin_group_config, /* 0x12, ACPI_RESOURCE_NAME_PIN_GROUP_CONFIG */
};
/* Subtype table for serial_bus -- I2C, SPI, and UART */
@ -157,6 +166,11 @@ struct acpi_rsdump_info *acpi_gbl_dump_resource_dispatch[] = {
acpi_rs_dump_gpio, /* ACPI_RESOURCE_TYPE_GPIO */
acpi_rs_dump_fixed_dma, /* ACPI_RESOURCE_TYPE_FIXED_DMA */
NULL, /* ACPI_RESOURCE_TYPE_SERIAL_BUS */
acpi_rs_dump_pin_function, /* ACPI_RESOURCE_TYPE_PIN_FUNCTION */
acpi_rs_dump_pin_config, /* ACPI_RESOURCE_TYPE_PIN_CONFIG */
acpi_rs_dump_pin_group, /* ACPI_RESOURCE_TYPE_PIN_GROUP */
acpi_rs_dump_pin_group_function, /* ACPI_RESOURCE_TYPE_PIN_GROUP_FUNCTION */
acpi_rs_dump_pin_group_config, /* ACPI_RESOURCE_TYPE_PIN_GROUP_CONFIG */
};
struct acpi_rsdump_info *acpi_gbl_dump_serial_bus_dispatch[] = {
@ -193,6 +207,11 @@ const u8 acpi_gbl_aml_resource_sizes[] = {
sizeof(struct aml_resource_gpio), /* ACPI_RESOURCE_TYPE_GPIO */
sizeof(struct aml_resource_fixed_dma), /* ACPI_RESOURCE_TYPE_FIXED_DMA */
sizeof(struct aml_resource_common_serialbus), /* ACPI_RESOURCE_TYPE_SERIAL_BUS */
sizeof(struct aml_resource_pin_function), /* ACPI_RESOURCE_TYPE_PIN_FUNCTION */
sizeof(struct aml_resource_pin_config), /* ACPI_RESOURCE_TYPE_PIN_CONFIG */
sizeof(struct aml_resource_pin_group), /* ACPI_RESOURCE_TYPE_PIN_GROUP */
sizeof(struct aml_resource_pin_group_function), /* ACPI_RESOURCE_TYPE_PIN_GROUP_FUNCTION */
sizeof(struct aml_resource_pin_group_config), /* ACPI_RESOURCE_TYPE_PIN_GROUP_CONFIG */
};
const u8 acpi_gbl_resource_struct_sizes[] = {
@ -230,7 +249,12 @@ const u8 acpi_gbl_resource_struct_sizes[] = {
ACPI_RS_SIZE(struct acpi_resource_address64),
ACPI_RS_SIZE(struct acpi_resource_extended_address64),
ACPI_RS_SIZE(struct acpi_resource_gpio),
ACPI_RS_SIZE(struct acpi_resource_common_serialbus)
ACPI_RS_SIZE(struct acpi_resource_pin_function),
ACPI_RS_SIZE(struct acpi_resource_common_serialbus),
ACPI_RS_SIZE(struct acpi_resource_pin_config),
ACPI_RS_SIZE(struct acpi_resource_pin_group),
ACPI_RS_SIZE(struct acpi_resource_pin_group_function),
ACPI_RS_SIZE(struct acpi_resource_pin_group_config),
};
const u8 acpi_gbl_aml_resource_serial_bus_sizes[] = {

View file

@ -596,9 +596,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, aml_length);
}
ACPI_SET16(target, aml_length);
acpi_rs_set_resource_length(aml_length, aml);
break;

View file

@ -145,6 +145,82 @@ struct acpi_rsconvert_info acpi_rs_convert_gpio[18] = {
0},
};
/*******************************************************************************
*
* acpi_rs_convert_pinfunction
*
******************************************************************************/
struct acpi_rsconvert_info acpi_rs_convert_pin_function[13] = {
{ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_PIN_FUNCTION,
ACPI_RS_SIZE(struct acpi_resource_pin_function),
ACPI_RSC_TABLE_SIZE(acpi_rs_convert_pin_function)},
{ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_PIN_FUNCTION,
sizeof(struct aml_resource_pin_function),
0},
{ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.pin_function.revision_id),
AML_OFFSET(pin_function.revision_id),
1},
{ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.pin_function.sharable),
AML_OFFSET(pin_function.flags),
0},
{ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.pin_function.pin_config),
AML_OFFSET(pin_function.pin_config),
1},
{ACPI_RSC_MOVE16, ACPI_RS_OFFSET(data.pin_function.function_number),
AML_OFFSET(pin_function.function_number),
2},
/* Pin Table */
/*
* It is OK to use GPIO operations here because none of them refer GPIO
* structures directly but instead use offsets given here.
*/
{ACPI_RSC_COUNT_GPIO_PIN,
ACPI_RS_OFFSET(data.pin_function.pin_table_length),
AML_OFFSET(pin_function.pin_table_offset),
AML_OFFSET(pin_function.res_source_offset)},
{ACPI_RSC_MOVE_GPIO_PIN, ACPI_RS_OFFSET(data.pin_function.pin_table),
AML_OFFSET(pin_function.pin_table_offset),
0},
/* Resource Source */
{ACPI_RSC_MOVE8,
ACPI_RS_OFFSET(data.pin_function.resource_source.index),
AML_OFFSET(pin_function.res_source_index),
1},
{ACPI_RSC_COUNT_GPIO_RES,
ACPI_RS_OFFSET(data.pin_function.resource_source.string_length),
AML_OFFSET(pin_function.res_source_offset),
AML_OFFSET(pin_function.vendor_offset)},
{ACPI_RSC_MOVE_GPIO_RES,
ACPI_RS_OFFSET(data.pin_function.resource_source.string_ptr),
AML_OFFSET(pin_function.res_source_offset),
0},
/* Vendor Data */
{ACPI_RSC_COUNT_GPIO_VEN,
ACPI_RS_OFFSET(data.pin_function.vendor_length),
AML_OFFSET(pin_function.vendor_length),
1},
{ACPI_RSC_MOVE_GPIO_RES, ACPI_RS_OFFSET(data.pin_function.vendor_data),
AML_OFFSET(pin_function.vendor_offset),
0},
};
/*******************************************************************************
*
* acpi_rs_convert_i2c_serial_bus
@ -458,3 +534,300 @@ struct acpi_rsconvert_info acpi_rs_convert_uart_serial_bus[23] = {
AML_OFFSET(uart_serial_bus.default_baud_rate),
1},
};
/*******************************************************************************
*
* acpi_rs_convert_pin_config
*
******************************************************************************/
struct acpi_rsconvert_info acpi_rs_convert_pin_config[14] = {
{ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_PIN_CONFIG,
ACPI_RS_SIZE(struct acpi_resource_pin_config),
ACPI_RSC_TABLE_SIZE(acpi_rs_convert_pin_config)},
{ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_PIN_CONFIG,
sizeof(struct aml_resource_pin_config),
0},
{ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.pin_config.revision_id),
AML_OFFSET(pin_config.revision_id),
1},
{ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.pin_config.sharable),
AML_OFFSET(pin_config.flags),
0},
{ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.pin_config.producer_consumer),
AML_OFFSET(pin_config.flags),
1},
{ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.pin_config.pin_config_type),
AML_OFFSET(pin_config.pin_config_type),
1},
{ACPI_RSC_MOVE32, ACPI_RS_OFFSET(data.pin_config.pin_config_value),
AML_OFFSET(pin_config.pin_config_value),
1},
/* Pin Table */
/*
* It is OK to use GPIO operations here because none of them refer GPIO
* structures directly but instead use offsets given here.
*/
{ACPI_RSC_COUNT_GPIO_PIN,
ACPI_RS_OFFSET(data.pin_config.pin_table_length),
AML_OFFSET(pin_config.pin_table_offset),
AML_OFFSET(pin_config.res_source_offset)},
{ACPI_RSC_MOVE_GPIO_PIN, ACPI_RS_OFFSET(data.pin_config.pin_table),
AML_OFFSET(pin_config.pin_table_offset),
0},
/* Resource Source */
{ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.pin_config.resource_source.index),
AML_OFFSET(pin_config.res_source_index),
1},
{ACPI_RSC_COUNT_GPIO_RES,
ACPI_RS_OFFSET(data.pin_config.resource_source.string_length),
AML_OFFSET(pin_config.res_source_offset),
AML_OFFSET(pin_config.vendor_offset)},
{ACPI_RSC_MOVE_GPIO_RES,
ACPI_RS_OFFSET(data.pin_config.resource_source.string_ptr),
AML_OFFSET(pin_config.res_source_offset),
0},
/* Vendor Data */
{ACPI_RSC_COUNT_GPIO_VEN, ACPI_RS_OFFSET(data.pin_config.vendor_length),
AML_OFFSET(pin_config.vendor_length),
1},
{ACPI_RSC_MOVE_GPIO_RES, ACPI_RS_OFFSET(data.pin_config.vendor_data),
AML_OFFSET(pin_config.vendor_offset),
0},
};
/*******************************************************************************
*
* acpi_rs_convert_pin_group
*
******************************************************************************/
struct acpi_rsconvert_info acpi_rs_convert_pin_group[10] = {
{ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_PIN_GROUP,
ACPI_RS_SIZE(struct acpi_resource_pin_group),
ACPI_RSC_TABLE_SIZE(acpi_rs_convert_pin_group)},
{ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_PIN_GROUP,
sizeof(struct aml_resource_pin_group),
0},
{ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.pin_group.revision_id),
AML_OFFSET(pin_group.revision_id),
1},
{ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.pin_group.producer_consumer),
AML_OFFSET(pin_group.flags),
0},
/* Pin Table */
/*
* It is OK to use GPIO operations here because none of them refer GPIO
* structures directly but instead use offsets given here.
*/
{ACPI_RSC_COUNT_GPIO_PIN,
ACPI_RS_OFFSET(data.pin_group.pin_table_length),
AML_OFFSET(pin_group.pin_table_offset),
AML_OFFSET(pin_group.label_offset)},
{ACPI_RSC_MOVE_GPIO_PIN, ACPI_RS_OFFSET(data.pin_group.pin_table),
AML_OFFSET(pin_group.pin_table_offset),
0},
/* Resource Label */
{ACPI_RSC_COUNT_GPIO_RES,
ACPI_RS_OFFSET(data.pin_group.resource_label.string_length),
AML_OFFSET(pin_group.label_offset),
AML_OFFSET(pin_group.vendor_offset)},
{ACPI_RSC_MOVE_GPIO_RES,
ACPI_RS_OFFSET(data.pin_group.resource_label.string_ptr),
AML_OFFSET(pin_group.label_offset),
0},
/* Vendor Data */
{ACPI_RSC_COUNT_GPIO_VEN, ACPI_RS_OFFSET(data.pin_group.vendor_length),
AML_OFFSET(pin_group.vendor_length),
1},
{ACPI_RSC_MOVE_GPIO_RES, ACPI_RS_OFFSET(data.pin_group.vendor_data),
AML_OFFSET(pin_group.vendor_offset),
0},
};
/*******************************************************************************
*
* acpi_rs_convert_pin_group_function
*
******************************************************************************/
struct acpi_rsconvert_info acpi_rs_convert_pin_group_function[13] = {
{ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_PIN_GROUP_FUNCTION,
ACPI_RS_SIZE(struct acpi_resource_pin_group_function),
ACPI_RSC_TABLE_SIZE(acpi_rs_convert_pin_group_function)},
{ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_PIN_GROUP_FUNCTION,
sizeof(struct aml_resource_pin_group_function),
0},
{ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.pin_group_function.revision_id),
AML_OFFSET(pin_group_function.revision_id),
1},
{ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.pin_group_function.sharable),
AML_OFFSET(pin_group_function.flags),
0},
{ACPI_RSC_1BITFLAG,
ACPI_RS_OFFSET(data.pin_group_function.producer_consumer),
AML_OFFSET(pin_group_function.flags),
1},
{ACPI_RSC_MOVE16,
ACPI_RS_OFFSET(data.pin_group_function.function_number),
AML_OFFSET(pin_group_function.function_number),
1},
/* Resource Source */
{ACPI_RSC_MOVE8,
ACPI_RS_OFFSET(data.pin_group_function.resource_source.index),
AML_OFFSET(pin_group_function.res_source_index),
1},
{ACPI_RSC_COUNT_GPIO_RES,
ACPI_RS_OFFSET(data.pin_group_function.resource_source.string_length),
AML_OFFSET(pin_group_function.res_source_offset),
AML_OFFSET(pin_group_function.res_source_label_offset)},
{ACPI_RSC_MOVE_GPIO_RES,
ACPI_RS_OFFSET(data.pin_group_function.resource_source.string_ptr),
AML_OFFSET(pin_group_function.res_source_offset),
0},
/* Resource Source Label */
{ACPI_RSC_COUNT_GPIO_RES,
ACPI_RS_OFFSET(data.pin_group_function.resource_source_label.
string_length),
AML_OFFSET(pin_group_function.res_source_label_offset),
AML_OFFSET(pin_group_function.vendor_offset)},
{ACPI_RSC_MOVE_GPIO_RES,
ACPI_RS_OFFSET(data.pin_group_function.resource_source_label.
string_ptr),
AML_OFFSET(pin_group_function.res_source_label_offset),
0},
/* Vendor Data */
{ACPI_RSC_COUNT_GPIO_VEN,
ACPI_RS_OFFSET(data.pin_group_function.vendor_length),
AML_OFFSET(pin_group_function.vendor_length),
1},
{ACPI_RSC_MOVE_GPIO_RES,
ACPI_RS_OFFSET(data.pin_group_function.vendor_data),
AML_OFFSET(pin_group_function.vendor_offset),
0},
};
/*******************************************************************************
*
* acpi_rs_convert_pin_group_config
*
******************************************************************************/
struct acpi_rsconvert_info acpi_rs_convert_pin_group_config[14] = {
{ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_PIN_GROUP_CONFIG,
ACPI_RS_SIZE(struct acpi_resource_pin_group_config),
ACPI_RSC_TABLE_SIZE(acpi_rs_convert_pin_group_config)},
{ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_PIN_GROUP_CONFIG,
sizeof(struct aml_resource_pin_group_config),
0},
{ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.pin_group_config.revision_id),
AML_OFFSET(pin_group_config.revision_id),
1},
{ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.pin_group_config.sharable),
AML_OFFSET(pin_group_config.flags),
0},
{ACPI_RSC_1BITFLAG,
ACPI_RS_OFFSET(data.pin_group_config.producer_consumer),
AML_OFFSET(pin_group_config.flags),
1},
{ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.pin_group_config.pin_config_type),
AML_OFFSET(pin_group_config.pin_config_type),
1},
{ACPI_RSC_MOVE32,
ACPI_RS_OFFSET(data.pin_group_config.pin_config_value),
AML_OFFSET(pin_group_config.pin_config_value),
1},
/* Resource Source */
{ACPI_RSC_MOVE8,
ACPI_RS_OFFSET(data.pin_group_config.resource_source.index),
AML_OFFSET(pin_group_config.res_source_index),
1},
{ACPI_RSC_COUNT_GPIO_RES,
ACPI_RS_OFFSET(data.pin_group_config.resource_source.string_length),
AML_OFFSET(pin_group_config.res_source_offset),
AML_OFFSET(pin_group_config.res_source_label_offset)},
{ACPI_RSC_MOVE_GPIO_RES,
ACPI_RS_OFFSET(data.pin_group_config.resource_source.string_ptr),
AML_OFFSET(pin_group_config.res_source_offset),
0},
/* Resource Source Label */
{ACPI_RSC_COUNT_GPIO_RES,
ACPI_RS_OFFSET(data.pin_group_config.resource_source_label.
string_length),
AML_OFFSET(pin_group_config.res_source_label_offset),
AML_OFFSET(pin_group_config.vendor_offset)},
{ACPI_RSC_MOVE_GPIO_RES,
ACPI_RS_OFFSET(data.pin_group_config.resource_source_label.string_ptr),
AML_OFFSET(pin_group_config.res_source_label_offset),
0},
/* Vendor Data */
{ACPI_RSC_COUNT_GPIO_VEN,
ACPI_RS_OFFSET(data.pin_group_config.vendor_length),
AML_OFFSET(pin_group_config.vendor_length),
1},
{ACPI_RSC_MOVE_GPIO_RES,
ACPI_RS_OFFSET(data.pin_group_config.vendor_data),
AML_OFFSET(pin_group_config.vendor_offset),
0},
};

View file

@ -449,8 +449,8 @@ void acpi_tb_create_local_fadt(struct acpi_table_header *table, u32 length)
* The 64-bit X fields are optional extensions to the original 32-bit FADT
* V1.0 fields. Even if they are present in the FADT, they are optional and
* are unused if the BIOS sets them to zero. Therefore, we must copy/expand
* 32-bit V1.0 fields to the 64-bit X fields if the the 64-bit X field is
* originally zero.
* 32-bit V1.0 fields to the 64-bit X fields if the 64-bit X field is originally
* zero.
*
* For ACPI 1.0 FADTs (that contain no 64-bit addresses), all 32-bit address
* fields are expanded to the corresponding 64-bit X fields in the internal

View file

@ -141,9 +141,9 @@ void acpi_tb_check_dsdt_header(void)
*
* FUNCTION: acpi_tb_copy_dsdt
*
* PARAMETERS: table_desc - Installed table to copy
* PARAMETERS: table_index - Index of installed table to copy
*
* RETURN: None
* RETURN: The copied DSDT
*
* DESCRIPTION: Implements a subsystem option to copy the DSDT to local memory.
* Some very bad BIOSs are known to either corrupt the DSDT or
@ -239,7 +239,7 @@ acpi_tb_get_root_table_entry(u8 *table_entry, u32 table_entry_size)
*
* FUNCTION: acpi_tb_parse_root_table
*
* PARAMETERS: rsdp - Pointer to the RSDP
* PARAMETERS: rsdp_address - Pointer to the RSDP
*
* RETURN: Status
*

View file

@ -460,9 +460,11 @@ static const char *acpi_gbl_generic_notify[ACPI_GENERIC_NOTIFY_MAX + 1] = {
/* 09 */ "Device PLD Check",
/* 0A */ "Reserved",
/* 0B */ "System Locality Update",
/* 0C */ "Shutdown Request",
/* Reserved in ACPI 6.0 */
/* 0D */ "System Resource Affinity Update"
/* 0C */ "Reserved (was previously Shutdown Request)",
/* Reserved in ACPI 6.0 */
/* 0D */ "System Resource Affinity Update",
/* 0E */ "Heterogeneous Memory Attributes Update"
/* ACPI 6.2 */
};
static const char *acpi_gbl_device_notify[5] = {

View file

@ -104,13 +104,19 @@ acpi_status acpi_ut_allocate_owner_id(acpi_owner_id *owner_id)
break;
}
if (!(acpi_gbl_owner_id_mask[j] & (1 << k))) {
/*
* Note: the u32 cast ensures that 1 is stored as a unsigned
* integer. Omitting the cast may result in 1 being stored as an
* int. Some compilers or runtime error detection may flag this as
* an error.
*/
if (!(acpi_gbl_owner_id_mask[j] & ((u32)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_owner_id_mask[j] |= ((u32)1 << k);
acpi_gbl_last_owner_id_index = (u8)j;
acpi_gbl_next_owner_id_offset = (u8)(k + 1);
@ -201,7 +207,7 @@ void acpi_ut_release_owner_id(acpi_owner_id *owner_id_ptr)
/* Decode ID to index/offset pair */
index = ACPI_DIV_32(owner_id);
bit = 1 << ACPI_MOD_32(owner_id);
bit = (u32)1 << ACPI_MOD_32(owner_id);
/* Free the owner ID only if it is valid */

View file

@ -0,0 +1,315 @@
/*******************************************************************************
*
* Module Name: utresdecode - Resource descriptor keyword strings
*
******************************************************************************/
/*
* Copyright (C) 2000 - 2017, 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_UTILITIES
ACPI_MODULE_NAME("utresdecode")
#if defined (ACPI_DEBUG_OUTPUT) || \
defined (ACPI_DISASSEMBLER) || \
defined (ACPI_DEBUGGER)
/*
* Strings used to decode resource descriptors.
* Used by both the disassembler and the debugger resource dump routines
*/
const char *acpi_gbl_bm_decode[] = {
"NotBusMaster",
"BusMaster"
};
const char *acpi_gbl_config_decode[] = {
"0 - Good Configuration",
"1 - Acceptable Configuration",
"2 - Suboptimal Configuration",
"3 - ***Invalid Configuration***",
};
const char *acpi_gbl_consume_decode[] = {
"ResourceProducer",
"ResourceConsumer"
};
const char *acpi_gbl_dec_decode[] = {
"PosDecode",
"SubDecode"
};
const char *acpi_gbl_he_decode[] = {
"Level",
"Edge"
};
const char *acpi_gbl_io_decode[] = {
"Decode10",
"Decode16"
};
const char *acpi_gbl_ll_decode[] = {
"ActiveHigh",
"ActiveLow",
"ActiveBoth",
"Reserved"
};
const char *acpi_gbl_max_decode[] = {
"MaxNotFixed",
"MaxFixed"
};
const char *acpi_gbl_mem_decode[] = {
"NonCacheable",
"Cacheable",
"WriteCombining",
"Prefetchable"
};
const char *acpi_gbl_min_decode[] = {
"MinNotFixed",
"MinFixed"
};
const char *acpi_gbl_mtp_decode[] = {
"AddressRangeMemory",
"AddressRangeReserved",
"AddressRangeACPI",
"AddressRangeNVS"
};
const char *acpi_gbl_rng_decode[] = {
"InvalidRanges",
"NonISAOnlyRanges",
"ISAOnlyRanges",
"EntireRange"
};
const char *acpi_gbl_rw_decode[] = {
"ReadOnly",
"ReadWrite"
};
const char *acpi_gbl_shr_decode[] = {
"Exclusive",
"Shared",
"ExclusiveAndWake", /* ACPI 5.0 */
"SharedAndWake" /* ACPI 5.0 */
};
const char *acpi_gbl_siz_decode[] = {
"Transfer8",
"Transfer8_16",
"Transfer16",
"InvalidSize"
};
const char *acpi_gbl_trs_decode[] = {
"DenseTranslation",
"SparseTranslation"
};
const char *acpi_gbl_ttp_decode[] = {
"TypeStatic",
"TypeTranslation"
};
const char *acpi_gbl_typ_decode[] = {
"Compatibility",
"TypeA",
"TypeB",
"TypeF"
};
const char *acpi_gbl_ppc_decode[] = {
"PullDefault",
"PullUp",
"PullDown",
"PullNone"
};
const char *acpi_gbl_ior_decode[] = {
"IoRestrictionNone",
"IoRestrictionInputOnly",
"IoRestrictionOutputOnly",
"IoRestrictionNoneAndPreserve"
};
const char *acpi_gbl_dts_decode[] = {
"Width8bit",
"Width16bit",
"Width32bit",
"Width64bit",
"Width128bit",
"Width256bit",
};
/* GPIO connection type */
const char *acpi_gbl_ct_decode[] = {
"Interrupt",
"I/O"
};
/* Serial bus type */
const char *acpi_gbl_sbt_decode[] = {
"/* UNKNOWN serial bus type */",
"I2C",
"SPI",
"UART"
};
/* I2C serial bus access mode */
const char *acpi_gbl_am_decode[] = {
"AddressingMode7Bit",
"AddressingMode10Bit"
};
/* I2C serial bus slave mode */
const char *acpi_gbl_sm_decode[] = {
"ControllerInitiated",
"DeviceInitiated"
};
/* SPI serial bus wire mode */
const char *acpi_gbl_wm_decode[] = {
"FourWireMode",
"ThreeWireMode"
};
/* SPI serial clock phase */
const char *acpi_gbl_cph_decode[] = {
"ClockPhaseFirst",
"ClockPhaseSecond"
};
/* SPI serial bus clock polarity */
const char *acpi_gbl_cpo_decode[] = {
"ClockPolarityLow",
"ClockPolarityHigh"
};
/* SPI serial bus device polarity */
const char *acpi_gbl_dp_decode[] = {
"PolarityLow",
"PolarityHigh"
};
/* UART serial bus endian */
const char *acpi_gbl_ed_decode[] = {
"LittleEndian",
"BigEndian"
};
/* UART serial bus bits per byte */
const char *acpi_gbl_bpb_decode[] = {
"DataBitsFive",
"DataBitsSix",
"DataBitsSeven",
"DataBitsEight",
"DataBitsNine",
"/* UNKNOWN Bits per byte */",
"/* UNKNOWN Bits per byte */",
"/* UNKNOWN Bits per byte */"
};
/* UART serial bus stop bits */
const char *acpi_gbl_sb_decode[] = {
"StopBitsZero",
"StopBitsOne",
"StopBitsOnePlusHalf",
"StopBitsTwo"
};
/* UART serial bus flow control */
const char *acpi_gbl_fc_decode[] = {
"FlowControlNone",
"FlowControlHardware",
"FlowControlXON",
"/* UNKNOWN flow control keyword */"
};
/* UART serial bus parity type */
const char *acpi_gbl_pt_decode[] = {
"ParityTypeNone",
"ParityTypeEven",
"ParityTypeOdd",
"ParityTypeMark",
"ParityTypeSpace",
"/* UNKNOWN parity keyword */",
"/* UNKNOWN parity keyword */",
"/* UNKNOWN parity keyword */"
};
/* pin_config type */
const char *acpi_gbl_ptyp_decode[] = {
"Default",
"Bias Pull-up",
"Bias Pull-down",
"Bias Default",
"Bias Disable",
"Bias High Impedance",
"Bias Bus Hold",
"Drive Open Drain",
"Drive Open Source",
"Drive Push Pull",
"Drive Strength",
"Slew Rate",
"Input Debounce",
"Input Schmitt Trigger",
};
#endif

View file

@ -48,251 +48,6 @@
#define _COMPONENT ACPI_UTILITIES
ACPI_MODULE_NAME("utresrc")
#if defined(ACPI_DEBUG_OUTPUT) || defined (ACPI_DISASSEMBLER) || defined (ACPI_DEBUGGER)
/*
* Strings used to decode resource descriptors.
* Used by both the disassembler and the debugger resource dump routines
*/
const char *acpi_gbl_bm_decode[] = {
"NotBusMaster",
"BusMaster"
};
const char *acpi_gbl_config_decode[] = {
"0 - Good Configuration",
"1 - Acceptable Configuration",
"2 - Suboptimal Configuration",
"3 - ***Invalid Configuration***",
};
const char *acpi_gbl_consume_decode[] = {
"ResourceProducer",
"ResourceConsumer"
};
const char *acpi_gbl_dec_decode[] = {
"PosDecode",
"SubDecode"
};
const char *acpi_gbl_he_decode[] = {
"Level",
"Edge"
};
const char *acpi_gbl_io_decode[] = {
"Decode10",
"Decode16"
};
const char *acpi_gbl_ll_decode[] = {
"ActiveHigh",
"ActiveLow",
"ActiveBoth",
"Reserved"
};
const char *acpi_gbl_max_decode[] = {
"MaxNotFixed",
"MaxFixed"
};
const char *acpi_gbl_mem_decode[] = {
"NonCacheable",
"Cacheable",
"WriteCombining",
"Prefetchable"
};
const char *acpi_gbl_min_decode[] = {
"MinNotFixed",
"MinFixed"
};
const char *acpi_gbl_mtp_decode[] = {
"AddressRangeMemory",
"AddressRangeReserved",
"AddressRangeACPI",
"AddressRangeNVS"
};
const char *acpi_gbl_rng_decode[] = {
"InvalidRanges",
"NonISAOnlyRanges",
"ISAOnlyRanges",
"EntireRange"
};
const char *acpi_gbl_rw_decode[] = {
"ReadOnly",
"ReadWrite"
};
const char *acpi_gbl_shr_decode[] = {
"Exclusive",
"Shared",
"ExclusiveAndWake", /* ACPI 5.0 */
"SharedAndWake" /* ACPI 5.0 */
};
const char *acpi_gbl_siz_decode[] = {
"Transfer8",
"Transfer8_16",
"Transfer16",
"InvalidSize"
};
const char *acpi_gbl_trs_decode[] = {
"DenseTranslation",
"SparseTranslation"
};
const char *acpi_gbl_ttp_decode[] = {
"TypeStatic",
"TypeTranslation"
};
const char *acpi_gbl_typ_decode[] = {
"Compatibility",
"TypeA",
"TypeB",
"TypeF"
};
const char *acpi_gbl_ppc_decode[] = {
"PullDefault",
"PullUp",
"PullDown",
"PullNone"
};
const char *acpi_gbl_ior_decode[] = {
"IoRestrictionNone",
"IoRestrictionInputOnly",
"IoRestrictionOutputOnly",
"IoRestrictionNoneAndPreserve"
};
const char *acpi_gbl_dts_decode[] = {
"Width8bit",
"Width16bit",
"Width32bit",
"Width64bit",
"Width128bit",
"Width256bit",
};
/* GPIO connection type */
const char *acpi_gbl_ct_decode[] = {
"Interrupt",
"I/O"
};
/* Serial bus type */
const char *acpi_gbl_sbt_decode[] = {
"/* UNKNOWN serial bus type */",
"I2C",
"SPI",
"UART"
};
/* I2C serial bus access mode */
const char *acpi_gbl_am_decode[] = {
"AddressingMode7Bit",
"AddressingMode10Bit"
};
/* I2C serial bus slave mode */
const char *acpi_gbl_sm_decode[] = {
"ControllerInitiated",
"DeviceInitiated"
};
/* SPI serial bus wire mode */
const char *acpi_gbl_wm_decode[] = {
"FourWireMode",
"ThreeWireMode"
};
/* SPI serial clock phase */
const char *acpi_gbl_cph_decode[] = {
"ClockPhaseFirst",
"ClockPhaseSecond"
};
/* SPI serial bus clock polarity */
const char *acpi_gbl_cpo_decode[] = {
"ClockPolarityLow",
"ClockPolarityHigh"
};
/* SPI serial bus device polarity */
const char *acpi_gbl_dp_decode[] = {
"PolarityLow",
"PolarityHigh"
};
/* UART serial bus endian */
const char *acpi_gbl_ed_decode[] = {
"LittleEndian",
"BigEndian"
};
/* UART serial bus bits per byte */
const char *acpi_gbl_bpb_decode[] = {
"DataBitsFive",
"DataBitsSix",
"DataBitsSeven",
"DataBitsEight",
"DataBitsNine",
"/* UNKNOWN Bits per byte */",
"/* UNKNOWN Bits per byte */",
"/* UNKNOWN Bits per byte */"
};
/* UART serial bus stop bits */
const char *acpi_gbl_sb_decode[] = {
"StopBitsZero",
"StopBitsOne",
"StopBitsOnePlusHalf",
"StopBitsTwo"
};
/* UART serial bus flow control */
const char *acpi_gbl_fc_decode[] = {
"FlowControlNone",
"FlowControlHardware",
"FlowControlXON",
"/* UNKNOWN flow control keyword */"
};
/* UART serial bus parity type */
const char *acpi_gbl_pt_decode[] = {
"ParityTypeNone",
"ParityTypeEven",
"ParityTypeOdd",
"ParityTypeMark",
"ParityTypeSpace",
"/* UNKNOWN parity keyword */",
"/* UNKNOWN parity keyword */",
"/* UNKNOWN parity keyword */"
};
#endif
/*
* Base sizes of the raw AML resource descriptors, indexed by resource type.
* Zero indicates a reserved (and therefore invalid) resource type.
@ -332,8 +87,12 @@ const u8 acpi_gbl_resource_aml_sizes[] = {
ACPI_AML_SIZE_LARGE(struct aml_resource_address64),
ACPI_AML_SIZE_LARGE(struct aml_resource_extended_address64),
ACPI_AML_SIZE_LARGE(struct aml_resource_gpio),
0,
ACPI_AML_SIZE_LARGE(struct aml_resource_pin_function),
ACPI_AML_SIZE_LARGE(struct aml_resource_common_serialbus),
ACPI_AML_SIZE_LARGE(struct aml_resource_pin_config),
ACPI_AML_SIZE_LARGE(struct aml_resource_pin_group),
ACPI_AML_SIZE_LARGE(struct aml_resource_pin_group_function),
ACPI_AML_SIZE_LARGE(struct aml_resource_pin_group_config),
};
const u8 acpi_gbl_resource_aml_serial_bus_sizes[] = {
@ -384,8 +143,12 @@ static const u8 acpi_gbl_resource_types[] = {
ACPI_VARIABLE_LENGTH, /* 0A Qword* address */
ACPI_FIXED_LENGTH, /* 0B Extended* address */
ACPI_VARIABLE_LENGTH, /* 0C Gpio* */
0,
ACPI_VARIABLE_LENGTH /* 0E *serial_bus */
ACPI_VARIABLE_LENGTH, /* 0D pin_function */
ACPI_VARIABLE_LENGTH, /* 0E *serial_bus */
ACPI_VARIABLE_LENGTH, /* 0F pin_config */
ACPI_VARIABLE_LENGTH, /* 10 pin_group */
ACPI_VARIABLE_LENGTH, /* 11 pin_group_function */
ACPI_VARIABLE_LENGTH, /* 12 pin_group_config */
};
/*******************************************************************************

View file

@ -151,6 +151,8 @@ acpi_acquire_mutex(acpi_handle handle, acpi_string pathname, u16 timeout)
return (status);
}
ACPI_EXPORT_SYMBOL(acpi_acquire_mutex)
/*******************************************************************************
*
* FUNCTION: acpi_release_mutex
@ -167,7 +169,6 @@ acpi_acquire_mutex(acpi_handle handle, acpi_string pathname, u16 timeout)
* not both.
*
******************************************************************************/
acpi_status acpi_release_mutex(acpi_handle handle, acpi_string pathname)
{
acpi_status status;
@ -185,3 +186,5 @@ acpi_status acpi_release_mutex(acpi_handle handle, acpi_string pathname)
acpi_os_release_mutex(mutex_obj->mutex.os_mutex);
return (AE_OK);
}
ACPI_EXPORT_SYMBOL(acpi_release_mutex)