mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 12:28:41 +08:00
Merge branch 'for-4.7/acpi6.1' into libnvdimm-for-next
This commit is contained in:
commit
1b982baf75
@ -43,6 +43,7 @@ acpi-y += \
|
||||
evxfregn.o
|
||||
|
||||
acpi-y += \
|
||||
exconcat.o \
|
||||
exconfig.o \
|
||||
exconvrt.o \
|
||||
excreate.o \
|
||||
|
@ -53,7 +53,7 @@
|
||||
#define ACPI_DEBUG_BUFFER_SIZE 0x4000 /* 16K buffer for return objects */
|
||||
|
||||
struct acpi_db_command_info {
|
||||
char *name; /* Command Name */
|
||||
const char *name; /* Command Name */
|
||||
u8 min_args; /* Minimum arguments required */
|
||||
};
|
||||
|
||||
@ -64,7 +64,7 @@ struct acpi_db_command_help {
|
||||
};
|
||||
|
||||
struct acpi_db_argument_info {
|
||||
char *name; /* Argument Name */
|
||||
const char *name; /* Argument Name */
|
||||
};
|
||||
|
||||
struct acpi_db_execute_walk {
|
||||
|
@ -198,8 +198,6 @@ void
|
||||
acpi_ev_detach_region(union acpi_operand_object *region_obj,
|
||||
u8 acpi_ns_is_locked);
|
||||
|
||||
void acpi_ev_associate_reg_method(union acpi_operand_object *region_obj);
|
||||
|
||||
void
|
||||
acpi_ev_execute_reg_methods(struct acpi_namespace_node *node,
|
||||
acpi_adr_space_type space_id, u32 function);
|
||||
|
@ -187,6 +187,8 @@ extern const char *acpi_gbl_sleep_state_names[ACPI_S_STATE_COUNT];
|
||||
extern const char *acpi_gbl_lowest_dstate_names[ACPI_NUM_sx_w_METHODS];
|
||||
extern const char *acpi_gbl_highest_dstate_names[ACPI_NUM_sx_d_METHODS];
|
||||
extern const char *acpi_gbl_region_types[ACPI_NUM_PREDEFINED_REGIONS];
|
||||
extern const char acpi_gbl_lower_hex_digits[];
|
||||
extern const char acpi_gbl_upper_hex_digits[];
|
||||
extern const struct acpi_opcode_info acpi_gbl_aml_op_info[AML_NUM_OPCODES];
|
||||
|
||||
#ifdef ACPI_DBG_TRACK_ALLOCATIONS
|
||||
@ -361,6 +363,15 @@ ACPI_GLOBAL(u32, acpi_gbl_num_objects);
|
||||
|
||||
#endif /* ACPI_DEBUGGER */
|
||||
|
||||
#if defined (ACPI_DISASSEMBLER) || defined (ACPI_ASL_COMPILER)
|
||||
|
||||
ACPI_GLOBAL(const char, *acpi_gbl_pld_panel_list[]);
|
||||
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[]);
|
||||
|
||||
#endif
|
||||
|
||||
/*****************************************************************************
|
||||
*
|
||||
* Application globals
|
||||
|
@ -67,7 +67,7 @@
|
||||
typedef const struct acpi_exdump_info {
|
||||
u8 opcode;
|
||||
u8 offset;
|
||||
char *name;
|
||||
const char *name;
|
||||
|
||||
} acpi_exdump_info;
|
||||
|
||||
|
@ -1096,6 +1096,7 @@ struct acpi_external_list {
|
||||
#define ACPI_EXT_ORIGIN_FROM_FILE 0x02 /* External came from a file */
|
||||
#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 */
|
||||
|
||||
struct acpi_external_file {
|
||||
char *path;
|
||||
|
@ -260,6 +260,10 @@
|
||||
|
||||
#define ACPI_IS_MISALIGNED(value) (((acpi_size) value) & (sizeof(acpi_size)-1))
|
||||
|
||||
/* Generic (power-of-two) rounding */
|
||||
|
||||
#define ACPI_IS_POWER_OF_TWO(a) (((a) & ((a) - 1)) == 0)
|
||||
|
||||
/*
|
||||
* Bitmask creation
|
||||
* Bit positions start at zero.
|
||||
@ -283,10 +287,10 @@
|
||||
/* Generic bitfield macros and masks */
|
||||
|
||||
#define ACPI_GET_BITS(source_ptr, position, mask) \
|
||||
((*source_ptr >> position) & mask)
|
||||
((*(source_ptr) >> (position)) & (mask))
|
||||
|
||||
#define ACPI_SET_BITS(target_ptr, position, mask, value) \
|
||||
(*target_ptr |= ((value & mask) << position))
|
||||
(*(target_ptr) |= (((value) & (mask)) << (position)))
|
||||
|
||||
#define ACPI_1BIT_MASK 0x00000001
|
||||
#define ACPI_2BIT_MASK 0x00000003
|
||||
|
@ -206,9 +206,10 @@ void acpi_ns_dump_tables(acpi_handle search_base, u32 max_depth);
|
||||
void acpi_ns_dump_entry(acpi_handle handle, u32 debug_level);
|
||||
|
||||
void
|
||||
acpi_ns_dump_pathname(acpi_handle handle, char *msg, u32 level, u32 component);
|
||||
acpi_ns_dump_pathname(acpi_handle handle,
|
||||
const char *msg, u32 level, u32 component);
|
||||
|
||||
void acpi_ns_print_pathname(u32 num_segments, char *pathname);
|
||||
void acpi_ns_print_pathname(u32 num_segments, const char *pathname);
|
||||
|
||||
acpi_status
|
||||
acpi_ns_dump_one_object(acpi_handle obj_handle,
|
||||
|
@ -139,7 +139,7 @@ acpi_ps_complete_final_op(struct acpi_walk_state *walk_state,
|
||||
*/
|
||||
const struct acpi_opcode_info *acpi_ps_get_opcode_info(u16 opcode);
|
||||
|
||||
char *acpi_ps_get_opcode_name(u16 opcode);
|
||||
const char *acpi_ps_get_opcode_name(u16 opcode);
|
||||
|
||||
u8 acpi_ps_get_argument_count(u32 op_type);
|
||||
|
||||
|
@ -523,6 +523,9 @@ const union acpi_predefined_info acpi_gbl_predefined_methods[] = {
|
||||
METHOD_RETURNS(ACPI_RTYPE_PACKAGE)}}, /* Fixed-length (4 Int) */
|
||||
PACKAGE_INFO(ACPI_PTYPE1_FIXED, ACPI_RTYPE_INTEGER, 4, 0, 0, 0),
|
||||
|
||||
{{"_FIT", METHOD_0ARGS,
|
||||
METHOD_RETURNS(ACPI_RTYPE_BUFFER)}}, /* ACPI 6.0 */
|
||||
|
||||
{{"_FIX", METHOD_0ARGS,
|
||||
METHOD_RETURNS(ACPI_RTYPE_PACKAGE)}}, /* Variable-length (Ints) */
|
||||
PACKAGE_INFO(ACPI_PTYPE1_VAR, ACPI_RTYPE_INTEGER, 0, 0, 0, 0),
|
||||
@ -1053,6 +1056,12 @@ const union acpi_predefined_info acpi_gbl_predefined_methods[] = {
|
||||
METHOD_RETURNS(ACPI_RTYPE_INTEGER | ACPI_RTYPE_STRING |
|
||||
ACPI_RTYPE_BUFFER)}},
|
||||
|
||||
{{"_WPC", METHOD_0ARGS,
|
||||
METHOD_RETURNS(ACPI_RTYPE_INTEGER)}}, /* ACPI 6.1 */
|
||||
|
||||
{{"_WPP", METHOD_0ARGS,
|
||||
METHOD_RETURNS(ACPI_RTYPE_INTEGER)}}, /* ACPI 6.1 */
|
||||
|
||||
PACKAGE_INFO(0, 0, 0, 0, 0, 0) /* Table terminator */
|
||||
};
|
||||
#else
|
||||
|
@ -124,7 +124,7 @@ typedef enum {
|
||||
typedef const struct acpi_rsdump_info {
|
||||
u8 opcode;
|
||||
u8 offset;
|
||||
char *name;
|
||||
const char *name;
|
||||
const char **pointer;
|
||||
|
||||
} acpi_rsdump_info;
|
||||
@ -209,7 +209,7 @@ acpi_rs_get_prs_method_data(struct acpi_namespace_node *node,
|
||||
|
||||
acpi_status
|
||||
acpi_rs_get_method_data(acpi_handle handle,
|
||||
char *path, struct acpi_buffer *ret_buffer);
|
||||
const char *path, struct acpi_buffer *ret_buffer);
|
||||
|
||||
acpi_status
|
||||
acpi_rs_set_srs_method_data(struct acpi_namespace_node *node,
|
||||
|
@ -184,7 +184,7 @@ struct acpi_evaluate_info {
|
||||
/* The first 3 elements are passed by the caller to acpi_ns_evaluate */
|
||||
|
||||
struct acpi_namespace_node *prefix_node; /* Input: starting node */
|
||||
char *relative_pathname; /* Input: path relative to prefix_node */
|
||||
const char *relative_pathname; /* Input: path relative to prefix_node */
|
||||
union acpi_operand_object **parameters; /* Input: argument list */
|
||||
|
||||
struct acpi_namespace_node *node; /* Resolved node (prefix_node:relative_pathname) */
|
||||
|
@ -175,7 +175,14 @@ 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);
|
||||
acpi_status
|
||||
acpi_ut_strtoul64(char *string,
|
||||
u32 base, u32 max_integer_byte_width, u64 *ret_integer);
|
||||
|
||||
/* Values for max_integer_byte_width above */
|
||||
|
||||
#define ACPI_MAX32_BYTE_WIDTH 4
|
||||
#define ACPI_MAX64_BYTE_WIDTH 8
|
||||
|
||||
/*
|
||||
* utglobal - Global data structures and procedures
|
||||
@ -266,7 +273,8 @@ acpi_ut_trace(u32 line_number,
|
||||
void
|
||||
acpi_ut_trace_ptr(u32 line_number,
|
||||
const char *function_name,
|
||||
const char *module_name, u32 component_id, void *pointer);
|
||||
const char *module_name,
|
||||
u32 component_id, const void *pointer);
|
||||
|
||||
void
|
||||
acpi_ut_trace_u32(u32 line_number,
|
||||
@ -276,7 +284,8 @@ acpi_ut_trace_u32(u32 line_number,
|
||||
void
|
||||
acpi_ut_trace_str(u32 line_number,
|
||||
const char *function_name,
|
||||
const char *module_name, u32 component_id, char *string);
|
||||
const char *module_name,
|
||||
u32 component_id, const char *string);
|
||||
|
||||
void
|
||||
acpi_ut_exit(u32 line_number,
|
||||
@ -335,12 +344,12 @@ void acpi_ut_delete_internal_object_list(union acpi_operand_object **obj_list);
|
||||
*/
|
||||
acpi_status
|
||||
acpi_ut_evaluate_object(struct acpi_namespace_node *prefix_node,
|
||||
char *path,
|
||||
const char *path,
|
||||
u32 expected_return_btypes,
|
||||
union acpi_operand_object **return_desc);
|
||||
|
||||
acpi_status
|
||||
acpi_ut_evaluate_numeric_object(char *object_name,
|
||||
acpi_ut_evaluate_numeric_object(const char *object_name,
|
||||
struct acpi_namespace_node *device_node,
|
||||
u64 *value);
|
||||
|
||||
@ -526,7 +535,7 @@ void acpi_ut_set_integer_width(u8 revision);
|
||||
void
|
||||
acpi_ut_display_init_pathname(u8 type,
|
||||
struct acpi_namespace_node *obj_handle,
|
||||
char *path);
|
||||
const char *path);
|
||||
#endif
|
||||
|
||||
/*
|
||||
@ -628,7 +637,7 @@ void acpi_ut_dump_allocation_info(void);
|
||||
void acpi_ut_dump_allocations(u32 component, const char *module);
|
||||
|
||||
acpi_status
|
||||
acpi_ut_create_list(char *list_name,
|
||||
acpi_ut_create_list(const char *list_name,
|
||||
u16 object_size, struct acpi_memory_list **return_cache);
|
||||
|
||||
#endif /* ACPI_DBG_TRACK_ALLOCATIONS */
|
||||
|
@ -277,7 +277,9 @@ acpi_db_convert_to_object(acpi_object_type type,
|
||||
default:
|
||||
|
||||
object->type = ACPI_TYPE_INTEGER;
|
||||
status = acpi_ut_strtoul64(string, 16, &object->integer.value);
|
||||
status =
|
||||
acpi_ut_strtoul64(string, 16, acpi_gbl_integer_byte_width,
|
||||
&object->integer.value);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -57,12 +57,12 @@ static u32 acpi_db_get_line(char *input_buffer);
|
||||
|
||||
static u32 acpi_db_match_command(char *user_command);
|
||||
|
||||
static void acpi_db_display_command_info(char *command, u8 display_all);
|
||||
static void acpi_db_display_command_info(const char *command, u8 display_all);
|
||||
|
||||
static void acpi_db_display_help(char *command);
|
||||
|
||||
static u8
|
||||
acpi_db_match_command_help(char *command,
|
||||
acpi_db_match_command_help(const char *command,
|
||||
const struct acpi_db_command_help *help);
|
||||
|
||||
/*
|
||||
@ -348,7 +348,7 @@ static const struct acpi_db_command_help acpi_gbl_db_command_help[] = {
|
||||
******************************************************************************/
|
||||
|
||||
static u8
|
||||
acpi_db_match_command_help(char *command,
|
||||
acpi_db_match_command_help(const char *command,
|
||||
const struct acpi_db_command_help *help)
|
||||
{
|
||||
char *invocation = help->invocation;
|
||||
@ -402,7 +402,7 @@ acpi_db_match_command_help(char *command,
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
static void acpi_db_display_command_info(char *command, u8 display_all)
|
||||
static void acpi_db_display_command_info(const char *command, u8 display_all)
|
||||
{
|
||||
const struct acpi_db_command_help *next;
|
||||
u8 matched;
|
||||
@ -656,8 +656,9 @@ static u32 acpi_db_match_command(char *user_command)
|
||||
}
|
||||
|
||||
for (i = CMD_FIRST_VALID; acpi_gbl_db_commands[i].name; i++) {
|
||||
if (strstr(acpi_gbl_db_commands[i].name, user_command) ==
|
||||
acpi_gbl_db_commands[i].name) {
|
||||
if (strstr
|
||||
(ACPI_CAST_PTR(char, acpi_gbl_db_commands[i].name),
|
||||
user_command) == acpi_gbl_db_commands[i].name) {
|
||||
return (i);
|
||||
}
|
||||
}
|
||||
|
@ -56,8 +56,6 @@ acpi_status acpi_db_second_pass_parse(union acpi_parse_object *root);
|
||||
void acpi_db_dump_buffer(u32 address);
|
||||
#endif
|
||||
|
||||
static char *gbl_hex_to_ascii = "0123456789ABCDEF";
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_db_match_argument
|
||||
@ -82,8 +80,9 @@ acpi_db_match_argument(char *user_argument,
|
||||
}
|
||||
|
||||
for (i = 0; arguments[i].name; i++) {
|
||||
if (strstr(arguments[i].name, user_argument) ==
|
||||
arguments[i].name) {
|
||||
if (strstr(ACPI_CAST_PTR(char, arguments[i].name),
|
||||
ACPI_CAST_PTR(char,
|
||||
user_argument)) == arguments[i].name) {
|
||||
return (i);
|
||||
}
|
||||
}
|
||||
@ -339,7 +338,7 @@ void acpi_db_uint32_to_hex_string(u32 value, char *buffer)
|
||||
buffer[8] = '\0';
|
||||
|
||||
for (i = 7; i >= 0; i--) {
|
||||
buffer[i] = gbl_hex_to_ascii[value & 0x0F];
|
||||
buffer[i] = acpi_gbl_upper_hex_digits[value & 0x0F];
|
||||
value = value >> 4;
|
||||
}
|
||||
}
|
||||
|
@ -524,52 +524,6 @@ acpi_ev_attach_region(union acpi_operand_object *handler_obj,
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ev_associate_reg_method
|
||||
*
|
||||
* PARAMETERS: region_obj - Region object
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Find and associate _REG method to a region
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
void acpi_ev_associate_reg_method(union acpi_operand_object *region_obj)
|
||||
{
|
||||
acpi_name *reg_name_ptr = (acpi_name *) METHOD_NAME__REG;
|
||||
struct acpi_namespace_node *method_node;
|
||||
struct acpi_namespace_node *node;
|
||||
union acpi_operand_object *region_obj2;
|
||||
acpi_status status;
|
||||
|
||||
ACPI_FUNCTION_TRACE(ev_associate_reg_method);
|
||||
|
||||
region_obj2 = acpi_ns_get_secondary_object(region_obj);
|
||||
if (!region_obj2) {
|
||||
return_VOID;
|
||||
}
|
||||
|
||||
node = region_obj->region.node->parent;
|
||||
|
||||
/* Find any "_REG" method associated with this region definition */
|
||||
|
||||
status =
|
||||
acpi_ns_search_one_scope(*reg_name_ptr, node, ACPI_TYPE_METHOD,
|
||||
&method_node);
|
||||
if (ACPI_SUCCESS(status)) {
|
||||
/*
|
||||
* The _REG method is optional and there can be only one per region
|
||||
* definition. This will be executed when the handler is attached
|
||||
* or removed
|
||||
*/
|
||||
region_obj2->extra.method_REG = method_node;
|
||||
}
|
||||
|
||||
return_VOID;
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ev_execute_reg_method
|
||||
@ -589,18 +543,42 @@ 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;
|
||||
const acpi_name *reg_name_ptr =
|
||||
ACPI_CAST_PTR(acpi_name, METHOD_NAME__REG);
|
||||
struct acpi_namespace_node *method_node;
|
||||
struct acpi_namespace_node *node;
|
||||
acpi_status status;
|
||||
|
||||
ACPI_FUNCTION_TRACE(ev_execute_reg_method);
|
||||
|
||||
if (!acpi_gbl_namespace_initialized ||
|
||||
region_obj->region.handler == NULL) {
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
}
|
||||
|
||||
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 ||
|
||||
region_obj->region.handler == NULL ||
|
||||
!acpi_gbl_namespace_initialized) {
|
||||
/*
|
||||
* Find any "_REG" method associated with this region definition.
|
||||
* The method should always be updated as this function may be
|
||||
* invoked after a namespace change.
|
||||
*/
|
||||
node = region_obj->region.node->parent;
|
||||
status =
|
||||
acpi_ns_search_one_scope(*reg_name_ptr, node, ACPI_TYPE_METHOD,
|
||||
&method_node);
|
||||
if (ACPI_SUCCESS(status)) {
|
||||
/*
|
||||
* The _REG method is optional and there can be only one per
|
||||
* region definition. This will be executed when the handler is
|
||||
* attached or removed.
|
||||
*/
|
||||
region_obj2->extra.method_REG = method_node;
|
||||
}
|
||||
if (region_obj2->extra.method_REG == NULL) {
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
}
|
||||
|
||||
|
@ -518,7 +518,6 @@ acpi_ev_initialize_region(union acpi_operand_object *region_obj,
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
}
|
||||
|
||||
acpi_ev_associate_reg_method(region_obj);
|
||||
region_obj->common.flags |= AOPOBJ_OBJECT_INITIALIZED;
|
||||
|
||||
node = region_obj->region.node->parent;
|
||||
|
439
drivers/acpi/acpica/exconcat.c
Normal file
439
drivers/acpi/acpica/exconcat.c
Normal file
@ -0,0 +1,439 @@
|
||||
/******************************************************************************
|
||||
*
|
||||
* Module Name: exconcat - Concatenate-type AML operators
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2000 - 2016, 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 "acinterp.h"
|
||||
#include "amlresrc.h"
|
||||
|
||||
#define _COMPONENT ACPI_EXECUTER
|
||||
ACPI_MODULE_NAME("exconcat")
|
||||
|
||||
/* Local Prototypes */
|
||||
static acpi_status
|
||||
acpi_ex_convert_to_object_type_string(union acpi_operand_object *obj_desc,
|
||||
union acpi_operand_object **result_desc);
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ex_do_concatenate
|
||||
*
|
||||
* PARAMETERS: operand0 - First source object
|
||||
* operand1 - Second source object
|
||||
* actual_return_desc - Where to place the return object
|
||||
* walk_state - Current walk state
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Concatenate two objects with the ACPI-defined conversion
|
||||
* rules as necessary.
|
||||
* NOTE:
|
||||
* Per the ACPI spec (up to 6.1), Concatenate only supports Integer,
|
||||
* String, and Buffer objects. However, we support all objects here
|
||||
* as an extension. This improves the usefulness of both Concatenate
|
||||
* and the Printf/Fprintf macros. The extension returns a string
|
||||
* describing the object type for the other objects.
|
||||
* 02/2016.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status
|
||||
acpi_ex_do_concatenate(union acpi_operand_object *operand0,
|
||||
union acpi_operand_object *operand1,
|
||||
union acpi_operand_object **actual_return_desc,
|
||||
struct acpi_walk_state *walk_state)
|
||||
{
|
||||
union acpi_operand_object *local_operand0 = operand0;
|
||||
union acpi_operand_object *local_operand1 = operand1;
|
||||
union acpi_operand_object *temp_operand1 = NULL;
|
||||
union acpi_operand_object *return_desc;
|
||||
char *buffer;
|
||||
acpi_object_type operand0_type;
|
||||
acpi_object_type operand1_type;
|
||||
acpi_status status;
|
||||
|
||||
ACPI_FUNCTION_TRACE(ex_do_concatenate);
|
||||
|
||||
/* Operand 0 preprocessing */
|
||||
|
||||
switch (operand0->common.type) {
|
||||
case ACPI_TYPE_INTEGER:
|
||||
case ACPI_TYPE_STRING:
|
||||
case ACPI_TYPE_BUFFER:
|
||||
|
||||
operand0_type = operand0->common.type;
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
/* For all other types, get the "object type" string */
|
||||
|
||||
status =
|
||||
acpi_ex_convert_to_object_type_string(operand0,
|
||||
&local_operand0);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
operand0_type = ACPI_TYPE_STRING;
|
||||
break;
|
||||
}
|
||||
|
||||
/* Operand 1 preprocessing */
|
||||
|
||||
switch (operand1->common.type) {
|
||||
case ACPI_TYPE_INTEGER:
|
||||
case ACPI_TYPE_STRING:
|
||||
case ACPI_TYPE_BUFFER:
|
||||
|
||||
operand1_type = operand1->common.type;
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
/* For all other types, get the "object type" string */
|
||||
|
||||
status =
|
||||
acpi_ex_convert_to_object_type_string(operand1,
|
||||
&local_operand1);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
operand1_type = ACPI_TYPE_STRING;
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
* Convert the second operand if necessary. The first operand (0)
|
||||
* determines the type of the second operand (1) (See the Data Types
|
||||
* section of the ACPI specification). Both object types are
|
||||
* guaranteed to be either Integer/String/Buffer by the operand
|
||||
* resolution mechanism.
|
||||
*/
|
||||
switch (operand0_type) {
|
||||
case ACPI_TYPE_INTEGER:
|
||||
|
||||
status =
|
||||
acpi_ex_convert_to_integer(local_operand1, &temp_operand1,
|
||||
16);
|
||||
break;
|
||||
|
||||
case ACPI_TYPE_BUFFER:
|
||||
|
||||
status =
|
||||
acpi_ex_convert_to_buffer(local_operand1, &temp_operand1);
|
||||
break;
|
||||
|
||||
case ACPI_TYPE_STRING:
|
||||
|
||||
switch (operand1_type) {
|
||||
case ACPI_TYPE_INTEGER:
|
||||
case ACPI_TYPE_STRING:
|
||||
case ACPI_TYPE_BUFFER:
|
||||
|
||||
/* Other types have already been converted to string */
|
||||
|
||||
status =
|
||||
acpi_ex_convert_to_string(local_operand1,
|
||||
&temp_operand1,
|
||||
ACPI_IMPLICIT_CONVERT_HEX);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
status = AE_OK;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
ACPI_ERROR((AE_INFO, "Invalid object type: 0x%X",
|
||||
operand0->common.type));
|
||||
status = AE_AML_INTERNAL;
|
||||
}
|
||||
|
||||
if (ACPI_FAILURE(status)) {
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
/* Take care with any newly created operand objects */
|
||||
|
||||
if ((local_operand1 != operand1) && (local_operand1 != temp_operand1)) {
|
||||
acpi_ut_remove_reference(local_operand1);
|
||||
}
|
||||
|
||||
local_operand1 = temp_operand1;
|
||||
|
||||
/*
|
||||
* Both operands are now known to be the same object type
|
||||
* (Both are Integer, String, or Buffer), and we can now perform
|
||||
* the concatenation.
|
||||
*
|
||||
* There are three cases to handle, as per the ACPI spec:
|
||||
*
|
||||
* 1) Two Integers concatenated to produce a new Buffer
|
||||
* 2) Two Strings concatenated to produce a new String
|
||||
* 3) Two Buffers concatenated to produce a new Buffer
|
||||
*/
|
||||
switch (operand0_type) {
|
||||
case ACPI_TYPE_INTEGER:
|
||||
|
||||
/* Result of two Integers is a Buffer */
|
||||
/* Need enough buffer space for two integers */
|
||||
|
||||
return_desc = acpi_ut_create_buffer_object((acpi_size)
|
||||
ACPI_MUL_2
|
||||
(acpi_gbl_integer_byte_width));
|
||||
if (!return_desc) {
|
||||
status = AE_NO_MEMORY;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
buffer = (char *)return_desc->buffer.pointer;
|
||||
|
||||
/* Copy the first integer, LSB first */
|
||||
|
||||
memcpy(buffer, &operand0->integer.value,
|
||||
acpi_gbl_integer_byte_width);
|
||||
|
||||
/* Copy the second integer (LSB first) after the first */
|
||||
|
||||
memcpy(buffer + acpi_gbl_integer_byte_width,
|
||||
&local_operand1->integer.value,
|
||||
acpi_gbl_integer_byte_width);
|
||||
break;
|
||||
|
||||
case ACPI_TYPE_STRING:
|
||||
|
||||
/* Result of two Strings is a String */
|
||||
|
||||
return_desc = acpi_ut_create_string_object(((acpi_size)
|
||||
local_operand0->
|
||||
string.length +
|
||||
local_operand1->
|
||||
string.length));
|
||||
if (!return_desc) {
|
||||
status = AE_NO_MEMORY;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
buffer = return_desc->string.pointer;
|
||||
|
||||
/* Concatenate the strings */
|
||||
|
||||
strcpy(buffer, local_operand0->string.pointer);
|
||||
strcat(buffer, local_operand1->string.pointer);
|
||||
break;
|
||||
|
||||
case ACPI_TYPE_BUFFER:
|
||||
|
||||
/* Result of two Buffers is a Buffer */
|
||||
|
||||
return_desc = acpi_ut_create_buffer_object(((acpi_size)
|
||||
operand0->buffer.
|
||||
length +
|
||||
local_operand1->
|
||||
buffer.length));
|
||||
if (!return_desc) {
|
||||
status = AE_NO_MEMORY;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
buffer = (char *)return_desc->buffer.pointer;
|
||||
|
||||
/* Concatenate the buffers */
|
||||
|
||||
memcpy(buffer, operand0->buffer.pointer,
|
||||
operand0->buffer.length);
|
||||
memcpy(buffer + operand0->buffer.length,
|
||||
local_operand1->buffer.pointer,
|
||||
local_operand1->buffer.length);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
/* Invalid object type, should not happen here */
|
||||
|
||||
ACPI_ERROR((AE_INFO, "Invalid object type: 0x%X",
|
||||
operand0->common.type));
|
||||
status = AE_AML_INTERNAL;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
*actual_return_desc = return_desc;
|
||||
|
||||
cleanup:
|
||||
if (local_operand0 != operand0) {
|
||||
acpi_ut_remove_reference(local_operand0);
|
||||
}
|
||||
|
||||
if (local_operand1 != operand1) {
|
||||
acpi_ut_remove_reference(local_operand1);
|
||||
}
|
||||
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ex_convert_to_object_type_string
|
||||
*
|
||||
* PARAMETERS: obj_desc - Object to be converted
|
||||
* return_desc - Where to place the return object
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Convert an object of arbitrary type to a string object that
|
||||
* contains the namestring for the object. Used for the
|
||||
* concatenate operator.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
static acpi_status
|
||||
acpi_ex_convert_to_object_type_string(union acpi_operand_object *obj_desc,
|
||||
union acpi_operand_object **result_desc)
|
||||
{
|
||||
union acpi_operand_object *return_desc;
|
||||
const char *type_string;
|
||||
|
||||
type_string = acpi_ut_get_type_name(obj_desc->common.type);
|
||||
|
||||
return_desc = acpi_ut_create_string_object(((acpi_size) strlen(type_string) + 9)); /* 9 For "[ Object]" */
|
||||
if (!return_desc) {
|
||||
return (AE_NO_MEMORY);
|
||||
}
|
||||
|
||||
strcpy(return_desc->string.pointer, "[");
|
||||
strcat(return_desc->string.pointer, type_string);
|
||||
strcat(return_desc->string.pointer, " Object]");
|
||||
|
||||
*result_desc = return_desc;
|
||||
return (AE_OK);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ex_concat_template
|
||||
*
|
||||
* PARAMETERS: operand0 - First source object
|
||||
* operand1 - Second source object
|
||||
* actual_return_desc - Where to place the return object
|
||||
* walk_state - Current walk state
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Concatenate two resource templates
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status
|
||||
acpi_ex_concat_template(union acpi_operand_object *operand0,
|
||||
union acpi_operand_object *operand1,
|
||||
union acpi_operand_object **actual_return_desc,
|
||||
struct acpi_walk_state * walk_state)
|
||||
{
|
||||
acpi_status status;
|
||||
union acpi_operand_object *return_desc;
|
||||
u8 *new_buf;
|
||||
u8 *end_tag;
|
||||
acpi_size length0;
|
||||
acpi_size length1;
|
||||
acpi_size new_length;
|
||||
|
||||
ACPI_FUNCTION_TRACE(ex_concat_template);
|
||||
|
||||
/*
|
||||
* Find the end_tag descriptor in each resource template.
|
||||
* Note1: returned pointers point TO the end_tag, not past it.
|
||||
* Note2: zero-length buffers are allowed; treated like one end_tag
|
||||
*/
|
||||
|
||||
/* Get the length of the first resource template */
|
||||
|
||||
status = acpi_ut_get_resource_end_tag(operand0, &end_tag);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
length0 = ACPI_PTR_DIFF(end_tag, operand0->buffer.pointer);
|
||||
|
||||
/* Get the length of the second resource template */
|
||||
|
||||
status = acpi_ut_get_resource_end_tag(operand1, &end_tag);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
length1 = ACPI_PTR_DIFF(end_tag, operand1->buffer.pointer);
|
||||
|
||||
/* Combine both lengths, minimum size will be 2 for end_tag */
|
||||
|
||||
new_length = length0 + length1 + sizeof(struct aml_resource_end_tag);
|
||||
|
||||
/* Create a new buffer object for the result (with one end_tag) */
|
||||
|
||||
return_desc = acpi_ut_create_buffer_object(new_length);
|
||||
if (!return_desc) {
|
||||
return_ACPI_STATUS(AE_NO_MEMORY);
|
||||
}
|
||||
|
||||
/*
|
||||
* Copy the templates to the new buffer, 0 first, then 1 follows. One
|
||||
* end_tag descriptor is copied from Operand1.
|
||||
*/
|
||||
new_buf = return_desc->buffer.pointer;
|
||||
memcpy(new_buf, operand0->buffer.pointer, length0);
|
||||
memcpy(new_buf + length0, operand1->buffer.pointer, length1);
|
||||
|
||||
/* Insert end_tag and set the checksum to zero, means "ignore checksum" */
|
||||
|
||||
new_buf[new_length - 1] = 0;
|
||||
new_buf[new_length - 2] = ACPI_RESOURCE_NAME_END_TAG | 1;
|
||||
|
||||
/* Return the completed resource template */
|
||||
|
||||
*actual_return_desc = return_desc;
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
}
|
@ -118,7 +118,9 @@ acpi_ex_add_table(u32 table_index,
|
||||
/* Execute any module-level code that was found in the table */
|
||||
|
||||
acpi_ex_exit_interpreter();
|
||||
acpi_ns_exec_module_code_list();
|
||||
if (acpi_gbl_group_module_level_code) {
|
||||
acpi_ns_exec_module_code_list();
|
||||
}
|
||||
acpi_ex_enter_interpreter();
|
||||
|
||||
/*
|
||||
|
@ -124,7 +124,9 @@ acpi_ex_convert_to_integer(union acpi_operand_object *obj_desc,
|
||||
* of ACPI 3.0) is that the to_integer() operator allows both decimal
|
||||
* and hexadecimal strings (hex prefixed with "0x").
|
||||
*/
|
||||
status = acpi_ut_strtoul64((char *)pointer, flags, &result);
|
||||
status = acpi_ut_strtoul64((char *)pointer, flags,
|
||||
acpi_gbl_integer_byte_width,
|
||||
&result);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
@ -55,9 +55,9 @@ ACPI_MODULE_NAME("exdump")
|
||||
*/
|
||||
#if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER)
|
||||
/* Local prototypes */
|
||||
static void acpi_ex_out_string(char *title, char *value);
|
||||
static void acpi_ex_out_string(const char *title, const char *value);
|
||||
|
||||
static void acpi_ex_out_pointer(char *title, void *value);
|
||||
static void acpi_ex_out_pointer(const char *title, const void *value);
|
||||
|
||||
static void
|
||||
acpi_ex_dump_object(union acpi_operand_object *obj_desc,
|
||||
@ -365,8 +365,7 @@ acpi_ex_dump_object(union acpi_operand_object *obj_desc,
|
||||
struct acpi_exdump_info *info)
|
||||
{
|
||||
u8 *target;
|
||||
char *name;
|
||||
const char *reference_name;
|
||||
const char *name;
|
||||
u8 count;
|
||||
union acpi_operand_object *start;
|
||||
union acpi_operand_object *data = NULL;
|
||||
@ -459,9 +458,9 @@ acpi_ex_dump_object(union acpi_operand_object *obj_desc,
|
||||
|
||||
case ACPI_EXD_REFERENCE:
|
||||
|
||||
reference_name = acpi_ut_get_reference_name(obj_desc);
|
||||
acpi_ex_out_string("Class Name",
|
||||
ACPI_CAST_PTR(char, reference_name));
|
||||
acpi_ut_get_reference_name
|
||||
(obj_desc));
|
||||
acpi_ex_dump_reference_obj(obj_desc);
|
||||
break;
|
||||
|
||||
@ -934,12 +933,12 @@ acpi_ex_dump_operands(union acpi_operand_object **operands,
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
static void acpi_ex_out_string(char *title, char *value)
|
||||
static void acpi_ex_out_string(const char *title, const char *value)
|
||||
{
|
||||
acpi_os_printf("%20s : %s\n", title, value);
|
||||
}
|
||||
|
||||
static void acpi_ex_out_pointer(char *title, void *value)
|
||||
static void acpi_ex_out_pointer(const char *title, const void *value)
|
||||
{
|
||||
acpi_os_printf("%20s : %p\n", title, value);
|
||||
}
|
||||
|
@ -45,7 +45,6 @@
|
||||
#include "accommon.h"
|
||||
#include "acinterp.h"
|
||||
#include "amlcode.h"
|
||||
#include "amlresrc.h"
|
||||
|
||||
#define _COMPONENT ACPI_EXECUTER
|
||||
ACPI_MODULE_NAME("exmisc")
|
||||
@ -138,295 +137,6 @@ acpi_ex_get_object_reference(union acpi_operand_object *obj_desc,
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ex_concat_template
|
||||
*
|
||||
* PARAMETERS: operand0 - First source object
|
||||
* operand1 - Second source object
|
||||
* actual_return_desc - Where to place the return object
|
||||
* walk_state - Current walk state
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Concatenate two resource templates
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status
|
||||
acpi_ex_concat_template(union acpi_operand_object *operand0,
|
||||
union acpi_operand_object *operand1,
|
||||
union acpi_operand_object **actual_return_desc,
|
||||
struct acpi_walk_state *walk_state)
|
||||
{
|
||||
acpi_status status;
|
||||
union acpi_operand_object *return_desc;
|
||||
u8 *new_buf;
|
||||
u8 *end_tag;
|
||||
acpi_size length0;
|
||||
acpi_size length1;
|
||||
acpi_size new_length;
|
||||
|
||||
ACPI_FUNCTION_TRACE(ex_concat_template);
|
||||
|
||||
/*
|
||||
* Find the end_tag descriptor in each resource template.
|
||||
* Note1: returned pointers point TO the end_tag, not past it.
|
||||
* Note2: zero-length buffers are allowed; treated like one end_tag
|
||||
*/
|
||||
|
||||
/* Get the length of the first resource template */
|
||||
|
||||
status = acpi_ut_get_resource_end_tag(operand0, &end_tag);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
length0 = ACPI_PTR_DIFF(end_tag, operand0->buffer.pointer);
|
||||
|
||||
/* Get the length of the second resource template */
|
||||
|
||||
status = acpi_ut_get_resource_end_tag(operand1, &end_tag);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
length1 = ACPI_PTR_DIFF(end_tag, operand1->buffer.pointer);
|
||||
|
||||
/* Combine both lengths, minimum size will be 2 for end_tag */
|
||||
|
||||
new_length = length0 + length1 + sizeof(struct aml_resource_end_tag);
|
||||
|
||||
/* Create a new buffer object for the result (with one end_tag) */
|
||||
|
||||
return_desc = acpi_ut_create_buffer_object(new_length);
|
||||
if (!return_desc) {
|
||||
return_ACPI_STATUS(AE_NO_MEMORY);
|
||||
}
|
||||
|
||||
/*
|
||||
* Copy the templates to the new buffer, 0 first, then 1 follows. One
|
||||
* end_tag descriptor is copied from Operand1.
|
||||
*/
|
||||
new_buf = return_desc->buffer.pointer;
|
||||
memcpy(new_buf, operand0->buffer.pointer, length0);
|
||||
memcpy(new_buf + length0, operand1->buffer.pointer, length1);
|
||||
|
||||
/* Insert end_tag and set the checksum to zero, means "ignore checksum" */
|
||||
|
||||
new_buf[new_length - 1] = 0;
|
||||
new_buf[new_length - 2] = ACPI_RESOURCE_NAME_END_TAG | 1;
|
||||
|
||||
/* Return the completed resource template */
|
||||
|
||||
*actual_return_desc = return_desc;
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ex_do_concatenate
|
||||
*
|
||||
* PARAMETERS: operand0 - First source object
|
||||
* operand1 - Second source object
|
||||
* actual_return_desc - Where to place the return object
|
||||
* walk_state - Current walk state
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Concatenate two objects OF THE SAME TYPE.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status
|
||||
acpi_ex_do_concatenate(union acpi_operand_object *operand0,
|
||||
union acpi_operand_object *operand1,
|
||||
union acpi_operand_object **actual_return_desc,
|
||||
struct acpi_walk_state *walk_state)
|
||||
{
|
||||
union acpi_operand_object *local_operand1 = operand1;
|
||||
union acpi_operand_object *return_desc;
|
||||
char *new_buf;
|
||||
const char *type_string;
|
||||
acpi_status status;
|
||||
|
||||
ACPI_FUNCTION_TRACE(ex_do_concatenate);
|
||||
|
||||
/*
|
||||
* Convert the second operand if necessary. The first operand
|
||||
* determines the type of the second operand, (See the Data Types
|
||||
* section of the ACPI specification.) Both object types are
|
||||
* guaranteed to be either Integer/String/Buffer by the operand
|
||||
* resolution mechanism.
|
||||
*/
|
||||
switch (operand0->common.type) {
|
||||
case ACPI_TYPE_INTEGER:
|
||||
|
||||
status =
|
||||
acpi_ex_convert_to_integer(operand1, &local_operand1, 16);
|
||||
break;
|
||||
|
||||
case ACPI_TYPE_STRING:
|
||||
/*
|
||||
* Per the ACPI spec, Concatenate only supports int/str/buf.
|
||||
* However, we support all objects here as an extension.
|
||||
* This improves the usefulness of the Printf() macro.
|
||||
* 12/2015.
|
||||
*/
|
||||
switch (operand1->common.type) {
|
||||
case ACPI_TYPE_INTEGER:
|
||||
case ACPI_TYPE_STRING:
|
||||
case ACPI_TYPE_BUFFER:
|
||||
|
||||
status =
|
||||
acpi_ex_convert_to_string(operand1, &local_operand1,
|
||||
ACPI_IMPLICIT_CONVERT_HEX);
|
||||
break;
|
||||
|
||||
default:
|
||||
/*
|
||||
* Just emit a string containing the object type.
|
||||
*/
|
||||
type_string =
|
||||
acpi_ut_get_type_name(operand1->common.type);
|
||||
|
||||
local_operand1 = acpi_ut_create_string_object(((acpi_size) strlen(type_string) + 9)); /* 9 For "[Object]" */
|
||||
if (!local_operand1) {
|
||||
status = AE_NO_MEMORY;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
strcpy(local_operand1->string.pointer, "[");
|
||||
strcat(local_operand1->string.pointer, type_string);
|
||||
strcat(local_operand1->string.pointer, " Object]");
|
||||
status = AE_OK;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case ACPI_TYPE_BUFFER:
|
||||
|
||||
status = acpi_ex_convert_to_buffer(operand1, &local_operand1);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
ACPI_ERROR((AE_INFO, "Invalid object type: 0x%X",
|
||||
operand0->common.type));
|
||||
status = AE_AML_INTERNAL;
|
||||
}
|
||||
|
||||
if (ACPI_FAILURE(status)) {
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
/*
|
||||
* Both operands are now known to be the same object type
|
||||
* (Both are Integer, String, or Buffer), and we can now perform the
|
||||
* concatenation.
|
||||
*/
|
||||
|
||||
/*
|
||||
* There are three cases to handle:
|
||||
*
|
||||
* 1) Two Integers concatenated to produce a new Buffer
|
||||
* 2) Two Strings concatenated to produce a new String
|
||||
* 3) Two Buffers concatenated to produce a new Buffer
|
||||
*/
|
||||
switch (operand0->common.type) {
|
||||
case ACPI_TYPE_INTEGER:
|
||||
|
||||
/* Result of two Integers is a Buffer */
|
||||
/* Need enough buffer space for two integers */
|
||||
|
||||
return_desc = acpi_ut_create_buffer_object((acpi_size)
|
||||
ACPI_MUL_2
|
||||
(acpi_gbl_integer_byte_width));
|
||||
if (!return_desc) {
|
||||
status = AE_NO_MEMORY;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
new_buf = (char *)return_desc->buffer.pointer;
|
||||
|
||||
/* Copy the first integer, LSB first */
|
||||
|
||||
memcpy(new_buf, &operand0->integer.value,
|
||||
acpi_gbl_integer_byte_width);
|
||||
|
||||
/* Copy the second integer (LSB first) after the first */
|
||||
|
||||
memcpy(new_buf + acpi_gbl_integer_byte_width,
|
||||
&local_operand1->integer.value,
|
||||
acpi_gbl_integer_byte_width);
|
||||
break;
|
||||
|
||||
case ACPI_TYPE_STRING:
|
||||
|
||||
/* Result of two Strings is a String */
|
||||
|
||||
return_desc = acpi_ut_create_string_object(((acpi_size)
|
||||
operand0->string.
|
||||
length +
|
||||
local_operand1->
|
||||
string.length));
|
||||
if (!return_desc) {
|
||||
status = AE_NO_MEMORY;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
new_buf = return_desc->string.pointer;
|
||||
|
||||
/* Concatenate the strings */
|
||||
|
||||
strcpy(new_buf, operand0->string.pointer);
|
||||
strcat(new_buf, local_operand1->string.pointer);
|
||||
break;
|
||||
|
||||
case ACPI_TYPE_BUFFER:
|
||||
|
||||
/* Result of two Buffers is a Buffer */
|
||||
|
||||
return_desc = acpi_ut_create_buffer_object(((acpi_size)
|
||||
operand0->buffer.
|
||||
length +
|
||||
local_operand1->
|
||||
buffer.length));
|
||||
if (!return_desc) {
|
||||
status = AE_NO_MEMORY;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
new_buf = (char *)return_desc->buffer.pointer;
|
||||
|
||||
/* Concatenate the buffers */
|
||||
|
||||
memcpy(new_buf, operand0->buffer.pointer,
|
||||
operand0->buffer.length);
|
||||
memcpy(new_buf + operand0->buffer.length,
|
||||
local_operand1->buffer.pointer,
|
||||
local_operand1->buffer.length);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
/* Invalid object type, should not happen here */
|
||||
|
||||
ACPI_ERROR((AE_INFO, "Invalid object type: 0x%X",
|
||||
operand0->common.type));
|
||||
status = AE_AML_INTERNAL;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
*actual_return_desc = return_desc;
|
||||
|
||||
cleanup:
|
||||
if (local_operand1 != operand1) {
|
||||
acpi_ut_remove_reference(local_operand1);
|
||||
}
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ex_do_math_op
|
||||
|
@ -301,8 +301,8 @@ static u32 acpi_ex_digits_needed(u64 value, u32 base)
|
||||
*
|
||||
* FUNCTION: acpi_ex_eisa_id_to_string
|
||||
*
|
||||
* PARAMETERS: compressed_id - EISAID to be converted
|
||||
* out_string - Where to put the converted string (8 bytes)
|
||||
* PARAMETERS: out_string - Where to put the converted string (8 bytes)
|
||||
* compressed_id - EISAID to be converted
|
||||
*
|
||||
* RETURN: None
|
||||
*
|
||||
@ -354,7 +354,7 @@ void acpi_ex_eisa_id_to_string(char *out_string, u64 compressed_id)
|
||||
* possible 64-bit integer.
|
||||
* value - Value to be converted
|
||||
*
|
||||
* RETURN: None, string
|
||||
* RETURN: Converted string in out_string
|
||||
*
|
||||
* DESCRIPTION: Convert a 64-bit integer to decimal string representation.
|
||||
* Assumes string buffer is large enough to hold the string. The
|
||||
@ -384,9 +384,9 @@ void acpi_ex_integer_to_string(char *out_string, u64 value)
|
||||
* FUNCTION: acpi_ex_pci_cls_to_string
|
||||
*
|
||||
* PARAMETERS: out_string - Where to put the converted string (7 bytes)
|
||||
* PARAMETERS: class_code - PCI class code to be converted (3 bytes)
|
||||
* class_code - PCI class code to be converted (3 bytes)
|
||||
*
|
||||
* RETURN: None
|
||||
* RETURN: Converted string in out_string
|
||||
*
|
||||
* DESCRIPTION: Convert 3-bytes PCI class code to string representation.
|
||||
* Return buffer must be large enough to hold the string. The
|
||||
@ -417,7 +417,7 @@ void acpi_ex_pci_cls_to_string(char *out_string, u8 class_code[3])
|
||||
*
|
||||
* PARAMETERS: space_id - ID to be validated
|
||||
*
|
||||
* RETURN: TRUE if valid/supported ID.
|
||||
* RETURN: TRUE if space_id is a valid/supported ID.
|
||||
*
|
||||
* DESCRIPTION: Validate an operation region space_ID.
|
||||
*
|
||||
|
@ -83,6 +83,8 @@ acpi_status
|
||||
acpi_hw_validate_register(struct acpi_generic_address *reg,
|
||||
u8 max_bit_width, u64 *address)
|
||||
{
|
||||
u8 bit_width;
|
||||
u8 access_width;
|
||||
|
||||
/* Must have a valid pointer to a GAS structure */
|
||||
|
||||
@ -109,23 +111,26 @@ acpi_hw_validate_register(struct acpi_generic_address *reg,
|
||||
return (AE_SUPPORT);
|
||||
}
|
||||
|
||||
/* Validate the bit_width */
|
||||
/* Validate the access_width */
|
||||
|
||||
if ((reg->bit_width != 8) &&
|
||||
(reg->bit_width != 16) &&
|
||||
(reg->bit_width != 32) && (reg->bit_width != max_bit_width)) {
|
||||
if (reg->access_width > 4) {
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"Unsupported register bit width: 0x%X",
|
||||
reg->bit_width));
|
||||
"Unsupported register access width: 0x%X",
|
||||
reg->access_width));
|
||||
return (AE_SUPPORT);
|
||||
}
|
||||
|
||||
/* Validate the bit_offset. Just a warning for now. */
|
||||
/* Validate the bit_width, convert access_width into number of bits */
|
||||
|
||||
if (reg->bit_offset != 0) {
|
||||
access_width = reg->access_width ? reg->access_width : 1;
|
||||
access_width = 1 << (access_width + 2);
|
||||
bit_width =
|
||||
ACPI_ROUND_UP(reg->bit_offset + reg->bit_width, access_width);
|
||||
if (max_bit_width < bit_width) {
|
||||
ACPI_WARNING((AE_INFO,
|
||||
"Unsupported register bit offset: 0x%X",
|
||||
reg->bit_offset));
|
||||
"Requested bit width 0x%X is smaller than register bit width 0x%X",
|
||||
max_bit_width, bit_width));
|
||||
return (AE_SUPPORT);
|
||||
}
|
||||
|
||||
return (AE_OK);
|
||||
|
@ -504,9 +504,7 @@ acpi_get_sleep_type_data(u8 sleep_state, u8 *sleep_type_a, u8 *sleep_type_b)
|
||||
* Evaluate the \_Sx namespace object containing the register values
|
||||
* for this state
|
||||
*/
|
||||
info->relative_pathname = ACPI_CAST_PTR(char,
|
||||
acpi_gbl_sleep_state_names
|
||||
[sleep_state]);
|
||||
info->relative_pathname = acpi_gbl_sleep_state_names[sleep_state];
|
||||
|
||||
status = acpi_ns_evaluate(info);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
|
@ -107,9 +107,10 @@ acpi_status acpi_ns_root_initialize(void)
|
||||
continue;
|
||||
}
|
||||
|
||||
status = acpi_ns_lookup(NULL, init_val->name, init_val->type,
|
||||
ACPI_IMODE_LOAD_PASS2,
|
||||
ACPI_NS_NO_UPSEARCH, NULL, &new_node);
|
||||
status =
|
||||
acpi_ns_lookup(NULL, (char *)init_val->name, init_val->type,
|
||||
ACPI_IMODE_LOAD_PASS2, ACPI_NS_NO_UPSEARCH,
|
||||
NULL, &new_node);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
ACPI_EXCEPTION((AE_INFO, status,
|
||||
"Could not create predefined name %s",
|
||||
|
@ -79,7 +79,8 @@ acpi_ns_convert_to_integer(union acpi_operand_object *original_object,
|
||||
/* String-to-Integer conversion */
|
||||
|
||||
status = acpi_ut_strtoul64(original_object->string.pointer,
|
||||
ACPI_ANY_BASE, &value);
|
||||
ACPI_ANY_BASE,
|
||||
acpi_gbl_integer_byte_width, &value);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
}
|
||||
|
@ -81,7 +81,7 @@ acpi_ns_get_max_depth(acpi_handle obj_handle,
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
void acpi_ns_print_pathname(u32 num_segments, char *pathname)
|
||||
void acpi_ns_print_pathname(u32 num_segments, const char *pathname)
|
||||
{
|
||||
u32 i;
|
||||
|
||||
@ -114,6 +114,9 @@ void acpi_ns_print_pathname(u32 num_segments, char *pathname)
|
||||
acpi_os_printf("]\n");
|
||||
}
|
||||
|
||||
#ifdef ACPI_OBSOLETE_FUNCTIONS
|
||||
/* Not used at this time, perhaps later */
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ns_dump_pathname
|
||||
@ -131,7 +134,8 @@ void acpi_ns_print_pathname(u32 num_segments, char *pathname)
|
||||
******************************************************************************/
|
||||
|
||||
void
|
||||
acpi_ns_dump_pathname(acpi_handle handle, char *msg, u32 level, u32 component)
|
||||
acpi_ns_dump_pathname(acpi_handle handle,
|
||||
const char *msg, u32 level, u32 component)
|
||||
{
|
||||
|
||||
ACPI_FUNCTION_TRACE(ns_dump_pathname);
|
||||
@ -148,6 +152,7 @@ acpi_ns_dump_pathname(acpi_handle handle, char *msg, u32 level, u32 component)
|
||||
acpi_os_printf("\n");
|
||||
return_VOID;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
|
@ -140,6 +140,7 @@ acpi_status acpi_ns_initialize_devices(u32 flags)
|
||||
{
|
||||
acpi_status status = AE_OK;
|
||||
struct acpi_device_walk_info info;
|
||||
acpi_handle handle;
|
||||
|
||||
ACPI_FUNCTION_TRACE(ns_initialize_devices);
|
||||
|
||||
@ -190,6 +191,27 @@ acpi_status acpi_ns_initialize_devices(u32 flags)
|
||||
if (ACPI_SUCCESS(status)) {
|
||||
info.num_INI++;
|
||||
}
|
||||
|
||||
/*
|
||||
* Execute \_SB._INI.
|
||||
* There appears to be a strict order requirement for \_SB._INI,
|
||||
* which should be evaluated before any _REG evaluations.
|
||||
*/
|
||||
status = acpi_get_handle(NULL, "\\_SB", &handle);
|
||||
if (ACPI_SUCCESS(status)) {
|
||||
memset(info.evaluate_info, 0,
|
||||
sizeof(struct acpi_evaluate_info));
|
||||
info.evaluate_info->prefix_node = handle;
|
||||
info.evaluate_info->relative_pathname =
|
||||
METHOD_NAME__INI;
|
||||
info.evaluate_info->parameters = NULL;
|
||||
info.evaluate_info->flags = ACPI_IGNORE_RETURN_VALUE;
|
||||
|
||||
status = acpi_ns_evaluate(info.evaluate_info);
|
||||
if (ACPI_SUCCESS(status)) {
|
||||
info.num_INI++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
@ -198,6 +220,12 @@ acpi_status acpi_ns_initialize_devices(u32 flags)
|
||||
* Note: Any objects accessed by the _REG methods will be automatically
|
||||
* initialized, even if they contain executable AML (see the call to
|
||||
* acpi_ns_initialize_objects below).
|
||||
*
|
||||
* Note: According to the ACPI specification, we actually needn't execute
|
||||
* _REG for system_memory/system_io operation regions, but for PCI_Config
|
||||
* operation regions, it is required to evaluate _REG for those on a PCI
|
||||
* root bus that doesn't contain _BBN object. So this code is kept here
|
||||
* in order not to break things.
|
||||
*/
|
||||
if (!(flags & ACPI_NO_ADDRESS_SPACE_INIT)) {
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
|
||||
@ -592,33 +620,37 @@ acpi_ns_init_one_device(acpi_handle obj_handle,
|
||||
* Note: We know there is an _INI within this subtree, but it may not be
|
||||
* under this particular device, it may be lower in the branch.
|
||||
*/
|
||||
ACPI_DEBUG_EXEC(acpi_ut_display_init_pathname
|
||||
(ACPI_TYPE_METHOD, device_node, METHOD_NAME__INI));
|
||||
if (!ACPI_COMPARE_NAME(device_node->name.ascii, "_SB_") ||
|
||||
device_node->parent != acpi_gbl_root_node) {
|
||||
ACPI_DEBUG_EXEC(acpi_ut_display_init_pathname
|
||||
(ACPI_TYPE_METHOD, device_node,
|
||||
METHOD_NAME__INI));
|
||||
|
||||
memset(info, 0, sizeof(struct acpi_evaluate_info));
|
||||
info->prefix_node = device_node;
|
||||
info->relative_pathname = METHOD_NAME__INI;
|
||||
info->parameters = NULL;
|
||||
info->flags = ACPI_IGNORE_RETURN_VALUE;
|
||||
memset(info, 0, sizeof(struct acpi_evaluate_info));
|
||||
info->prefix_node = device_node;
|
||||
info->relative_pathname = METHOD_NAME__INI;
|
||||
info->parameters = NULL;
|
||||
info->flags = ACPI_IGNORE_RETURN_VALUE;
|
||||
|
||||
status = acpi_ns_evaluate(info);
|
||||
|
||||
if (ACPI_SUCCESS(status)) {
|
||||
walk_info->num_INI++;
|
||||
}
|
||||
status = acpi_ns_evaluate(info);
|
||||
if (ACPI_SUCCESS(status)) {
|
||||
walk_info->num_INI++;
|
||||
}
|
||||
#ifdef ACPI_DEBUG_OUTPUT
|
||||
else if (status != AE_NOT_FOUND) {
|
||||
else if (status != AE_NOT_FOUND) {
|
||||
|
||||
/* Ignore error and move on to next device */
|
||||
/* Ignore error and move on to next device */
|
||||
|
||||
char *scope_name =
|
||||
acpi_ns_get_normalized_pathname(device_node, TRUE);
|
||||
char *scope_name =
|
||||
acpi_ns_get_normalized_pathname(device_node, TRUE);
|
||||
|
||||
ACPI_EXCEPTION((AE_INFO, status, "during %s._INI execution",
|
||||
scope_name));
|
||||
ACPI_FREE(scope_name);
|
||||
}
|
||||
ACPI_EXCEPTION((AE_INFO, status,
|
||||
"during %s._INI execution",
|
||||
scope_name));
|
||||
ACPI_FREE(scope_name);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Ignore errors from above */
|
||||
|
||||
|
@ -123,8 +123,8 @@ acpi_ns_load_table(u32 table_index, struct acpi_namespace_node *node)
|
||||
(void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
|
||||
acpi_ns_delete_namespace_by_owner(acpi_gbl_root_table_list.
|
||||
tables[table_index].owner_id);
|
||||
acpi_tb_release_owner_id(table_index);
|
||||
|
||||
acpi_tb_release_owner_id(table_index);
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
|
@ -179,6 +179,7 @@ acpi_ns_check_package(struct acpi_evaluate_info *info,
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
}
|
||||
|
||||
elements++;
|
||||
}
|
||||
break;
|
||||
@ -225,6 +226,7 @@ acpi_ns_check_package(struct acpi_evaluate_info *info,
|
||||
return (status);
|
||||
}
|
||||
}
|
||||
|
||||
elements++;
|
||||
}
|
||||
break;
|
||||
@ -569,11 +571,13 @@ acpi_ns_check_package_list(struct acpi_evaluate_info *info,
|
||||
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
|
||||
@ -661,6 +665,7 @@ acpi_ns_check_package_elements(struct acpi_evaluate_info *info,
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
}
|
||||
|
||||
this_element++;
|
||||
}
|
||||
|
||||
@ -671,6 +676,7 @@ acpi_ns_check_package_elements(struct acpi_evaluate_info *info,
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
}
|
||||
|
||||
this_element++;
|
||||
}
|
||||
|
||||
|
@ -158,7 +158,7 @@ const struct acpi_opcode_info *acpi_ps_get_opcode_info(u16 opcode)
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
char *acpi_ps_get_opcode_name(u16 opcode)
|
||||
const char *acpi_ps_get_opcode_name(u16 opcode)
|
||||
{
|
||||
#if defined(ACPI_DISASSEMBLER) || defined (ACPI_DEBUG_OUTPUT)
|
||||
|
||||
|
@ -52,17 +52,17 @@ ACPI_MODULE_NAME("rsdump")
|
||||
* All functions in this module are used by the AML Debugger only
|
||||
*/
|
||||
/* Local prototypes */
|
||||
static void acpi_rs_out_string(char *title, char *value);
|
||||
static void acpi_rs_out_string(const char *title, const char *value);
|
||||
|
||||
static void acpi_rs_out_integer8(char *title, u8 value);
|
||||
static void acpi_rs_out_integer8(const char *title, u8 value);
|
||||
|
||||
static void acpi_rs_out_integer16(char *title, u16 value);
|
||||
static void acpi_rs_out_integer16(const char *title, u16 value);
|
||||
|
||||
static void acpi_rs_out_integer32(char *title, u32 value);
|
||||
static void acpi_rs_out_integer32(const char *title, u32 value);
|
||||
|
||||
static void acpi_rs_out_integer64(char *title, u64 value);
|
||||
static void acpi_rs_out_integer64(const char *title, u64 value);
|
||||
|
||||
static void acpi_rs_out_title(char *title);
|
||||
static void acpi_rs_out_title(const char *title);
|
||||
|
||||
static void acpi_rs_dump_byte_list(u16 length, u8 *data);
|
||||
|
||||
@ -208,7 +208,7 @@ acpi_rs_dump_descriptor(void *resource, struct acpi_rsdump_info *table)
|
||||
{
|
||||
u8 *target = NULL;
|
||||
u8 *previous_target;
|
||||
char *name;
|
||||
const char *name;
|
||||
u8 count;
|
||||
|
||||
/* First table entry must contain the table length (# of table entries) */
|
||||
@ -248,10 +248,8 @@ acpi_rs_dump_descriptor(void *resource, struct acpi_rsdump_info *table)
|
||||
case ACPI_RSD_UINT8:
|
||||
|
||||
if (table->pointer) {
|
||||
acpi_rs_out_string(name, ACPI_CAST_PTR(char,
|
||||
table->
|
||||
pointer
|
||||
[*target]));
|
||||
acpi_rs_out_string(name,
|
||||
table->pointer[*target]);
|
||||
} else {
|
||||
acpi_rs_out_integer8(name, ACPI_GET8(target));
|
||||
}
|
||||
@ -276,26 +274,20 @@ acpi_rs_dump_descriptor(void *resource, struct acpi_rsdump_info *table)
|
||||
|
||||
case ACPI_RSD_1BITFLAG:
|
||||
|
||||
acpi_rs_out_string(name, ACPI_CAST_PTR(char,
|
||||
table->
|
||||
pointer[*target &
|
||||
0x01]));
|
||||
acpi_rs_out_string(name,
|
||||
table->pointer[*target & 0x01]);
|
||||
break;
|
||||
|
||||
case ACPI_RSD_2BITFLAG:
|
||||
|
||||
acpi_rs_out_string(name, ACPI_CAST_PTR(char,
|
||||
table->
|
||||
pointer[*target &
|
||||
0x03]));
|
||||
acpi_rs_out_string(name,
|
||||
table->pointer[*target & 0x03]);
|
||||
break;
|
||||
|
||||
case ACPI_RSD_3BITFLAG:
|
||||
|
||||
acpi_rs_out_string(name, ACPI_CAST_PTR(char,
|
||||
table->
|
||||
pointer[*target &
|
||||
0x07]));
|
||||
acpi_rs_out_string(name,
|
||||
table->pointer[*target & 0x07]);
|
||||
break;
|
||||
|
||||
case ACPI_RSD_SHORTLIST:
|
||||
@ -481,7 +473,7 @@ static void acpi_rs_dump_address_common(union acpi_resource_data *resource)
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
static void acpi_rs_out_string(char *title, char *value)
|
||||
static void acpi_rs_out_string(const char *title, const char *value)
|
||||
{
|
||||
|
||||
acpi_os_printf("%27s : %s", title, value);
|
||||
@ -491,30 +483,30 @@ static void acpi_rs_out_string(char *title, char *value)
|
||||
acpi_os_printf("\n");
|
||||
}
|
||||
|
||||
static void acpi_rs_out_integer8(char *title, u8 value)
|
||||
static void acpi_rs_out_integer8(const char *title, u8 value)
|
||||
{
|
||||
acpi_os_printf("%27s : %2.2X\n", title, value);
|
||||
}
|
||||
|
||||
static void acpi_rs_out_integer16(char *title, u16 value)
|
||||
static void acpi_rs_out_integer16(const char *title, u16 value)
|
||||
{
|
||||
|
||||
acpi_os_printf("%27s : %4.4X\n", title, value);
|
||||
}
|
||||
|
||||
static void acpi_rs_out_integer32(char *title, u32 value)
|
||||
static void acpi_rs_out_integer32(const char *title, u32 value)
|
||||
{
|
||||
|
||||
acpi_os_printf("%27s : %8.8X\n", title, value);
|
||||
}
|
||||
|
||||
static void acpi_rs_out_integer64(char *title, u64 value)
|
||||
static void acpi_rs_out_integer64(const char *title, u64 value)
|
||||
{
|
||||
|
||||
acpi_os_printf("%27s : %8.8X%8.8X\n", title, ACPI_FORMAT_UINT64(value));
|
||||
}
|
||||
|
||||
static void acpi_rs_out_title(char *title)
|
||||
static void acpi_rs_out_title(const char *title)
|
||||
{
|
||||
|
||||
acpi_os_printf("%27s : ", title);
|
||||
|
@ -671,7 +671,7 @@ acpi_rs_get_aei_method_data(struct acpi_namespace_node *node,
|
||||
|
||||
acpi_status
|
||||
acpi_rs_get_method_data(acpi_handle handle,
|
||||
char *path, struct acpi_buffer *ret_buffer)
|
||||
const char *path, struct acpi_buffer *ret_buffer)
|
||||
{
|
||||
union acpi_operand_object *obj_desc;
|
||||
acpi_status status;
|
||||
|
@ -53,7 +53,7 @@ static void
|
||||
acpi_tb_init_generic_address(struct acpi_generic_address *generic_address,
|
||||
u8 space_id,
|
||||
u8 byte_width,
|
||||
u64 address, char *register_name, u8 flags);
|
||||
u64 address, const char *register_name, u8 flags);
|
||||
|
||||
static void acpi_tb_convert_fadt(void);
|
||||
|
||||
@ -65,7 +65,7 @@ acpi_tb_select_address(char *register_name, u32 address32, u64 address64);
|
||||
/* Table for conversion of FADT to common internal format and FADT validation */
|
||||
|
||||
typedef struct acpi_fadt_info {
|
||||
char *name;
|
||||
const char *name;
|
||||
u16 address64;
|
||||
u16 address32;
|
||||
u16 length;
|
||||
@ -192,7 +192,7 @@ static void
|
||||
acpi_tb_init_generic_address(struct acpi_generic_address *generic_address,
|
||||
u8 space_id,
|
||||
u8 byte_width,
|
||||
u64 address, char *register_name, u8 flags)
|
||||
u64 address, const char *register_name, u8 flags)
|
||||
{
|
||||
u8 bit_width;
|
||||
|
||||
@ -385,14 +385,15 @@ void acpi_tb_create_local_fadt(struct acpi_table_header *table, u32 length)
|
||||
{
|
||||
/*
|
||||
* Check if the FADT is larger than the largest table that we expect
|
||||
* (the ACPI 5.0 version). If so, truncate the table, and issue
|
||||
* a warning.
|
||||
* (typically the current ACPI specification version). If so, truncate
|
||||
* the table, and issue a warning.
|
||||
*/
|
||||
if (length > sizeof(struct acpi_table_fadt)) {
|
||||
ACPI_BIOS_WARNING((AE_INFO,
|
||||
"FADT (revision %u) is longer than ACPI 5.0 version, "
|
||||
"FADT (revision %u) is longer than %s length, "
|
||||
"truncating length %u to %u",
|
||||
table->revision, length,
|
||||
table->revision, ACPI_FADT_CONFORMANCE,
|
||||
length,
|
||||
(u32)sizeof(struct acpi_table_fadt)));
|
||||
}
|
||||
|
||||
@ -467,7 +468,7 @@ void acpi_tb_create_local_fadt(struct acpi_table_header *table, u32 length)
|
||||
|
||||
static void acpi_tb_convert_fadt(void)
|
||||
{
|
||||
char *name;
|
||||
const char *name;
|
||||
struct acpi_generic_address *address64;
|
||||
u32 address32;
|
||||
u8 length;
|
||||
@ -646,9 +647,12 @@ static void acpi_tb_convert_fadt(void)
|
||||
if ((address64->address && !length) ||
|
||||
(!address64->address && length)) {
|
||||
ACPI_BIOS_WARNING((AE_INFO,
|
||||
"Optional FADT field %s has zero address or length: "
|
||||
"0x%8.8X%8.8X/0x%X",
|
||||
name,
|
||||
"Optional FADT field %s has valid %s but zero %s: "
|
||||
"0x%8.8X%8.8X/0x%X", name,
|
||||
(length ? "Length" :
|
||||
"Address"),
|
||||
(length ? "Address" :
|
||||
"Length"),
|
||||
ACPI_FORMAT_UINT64
|
||||
(address64->address),
|
||||
length));
|
||||
|
@ -82,7 +82,7 @@ acpi_status __init acpi_load_tables(void)
|
||||
* their customized default region handlers.
|
||||
*/
|
||||
status = acpi_ev_install_region_handlers();
|
||||
if (ACPI_FAILURE(status) && status != AE_ALREADY_EXISTS) {
|
||||
if (ACPI_FAILURE(status)) {
|
||||
ACPI_EXCEPTION((AE_INFO, status,
|
||||
"During Region initialization"));
|
||||
return_ACPI_STATUS(status);
|
||||
|
@ -51,13 +51,9 @@
|
||||
ACPI_MODULE_NAME("utdebug")
|
||||
|
||||
#ifdef ACPI_DEBUG_OUTPUT
|
||||
static acpi_thread_id acpi_gbl_prev_thread_id = (acpi_thread_id) 0xFFFFFFFF;
|
||||
static char *acpi_gbl_fn_entry_str = "----Entry";
|
||||
static char *acpi_gbl_fn_exit_str = "----Exit-";
|
||||
|
||||
/* Local prototypes */
|
||||
|
||||
static const char *acpi_ut_trim_function_name(const char *function_name);
|
||||
static acpi_thread_id acpi_gbl_previous_thread_id = (acpi_thread_id) 0xFFFFFFFF;
|
||||
static const char *acpi_gbl_function_entry_prefix = "----Entry";
|
||||
static const char *acpi_gbl_function_exit_prefix = "----Exit-";
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
@ -178,14 +174,14 @@ acpi_debug_print(u32 requested_debug_level,
|
||||
* Thread tracking and context switch notification
|
||||
*/
|
||||
thread_id = acpi_os_get_thread_id();
|
||||
if (thread_id != acpi_gbl_prev_thread_id) {
|
||||
if (thread_id != acpi_gbl_previous_thread_id) {
|
||||
if (ACPI_LV_THREADS & acpi_dbg_level) {
|
||||
acpi_os_printf
|
||||
("\n**** Context Switch from TID %u to TID %u ****\n\n",
|
||||
(u32)acpi_gbl_prev_thread_id, (u32)thread_id);
|
||||
(u32)acpi_gbl_previous_thread_id, (u32)thread_id);
|
||||
}
|
||||
|
||||
acpi_gbl_prev_thread_id = thread_id;
|
||||
acpi_gbl_previous_thread_id = thread_id;
|
||||
acpi_gbl_nesting_level = 0;
|
||||
}
|
||||
|
||||
@ -287,7 +283,8 @@ acpi_ut_trace(u32 line_number,
|
||||
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);
|
||||
component_id, "%s\n",
|
||||
acpi_gbl_function_entry_prefix);
|
||||
}
|
||||
}
|
||||
|
||||
@ -312,7 +309,8 @@ ACPI_EXPORT_SYMBOL(acpi_ut_trace)
|
||||
void
|
||||
acpi_ut_trace_ptr(u32 line_number,
|
||||
const char *function_name,
|
||||
const char *module_name, u32 component_id, void *pointer)
|
||||
const char *module_name,
|
||||
u32 component_id, const void *pointer)
|
||||
{
|
||||
|
||||
acpi_gbl_nesting_level++;
|
||||
@ -323,8 +321,8 @@ acpi_ut_trace_ptr(u32 line_number,
|
||||
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);
|
||||
component_id, "%s %p\n",
|
||||
acpi_gbl_function_entry_prefix, pointer);
|
||||
}
|
||||
}
|
||||
|
||||
@ -348,7 +346,7 @@ acpi_ut_trace_ptr(u32 line_number,
|
||||
void
|
||||
acpi_ut_trace_str(u32 line_number,
|
||||
const char *function_name,
|
||||
const char *module_name, u32 component_id, char *string)
|
||||
const char *module_name, u32 component_id, const char *string)
|
||||
{
|
||||
|
||||
acpi_gbl_nesting_level++;
|
||||
@ -359,8 +357,8 @@ acpi_ut_trace_str(u32 line_number,
|
||||
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);
|
||||
component_id, "%s %s\n",
|
||||
acpi_gbl_function_entry_prefix, string);
|
||||
}
|
||||
}
|
||||
|
||||
@ -396,7 +394,7 @@ acpi_ut_trace_u32(u32 line_number,
|
||||
acpi_debug_print(ACPI_LV_FUNCTIONS,
|
||||
line_number, function_name, module_name,
|
||||
component_id, "%s %08X\n",
|
||||
acpi_gbl_fn_entry_str, integer);
|
||||
acpi_gbl_function_entry_prefix, integer);
|
||||
}
|
||||
}
|
||||
|
||||
@ -427,7 +425,8 @@ acpi_ut_exit(u32 line_number,
|
||||
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);
|
||||
component_id, "%s\n",
|
||||
acpi_gbl_function_exit_prefix);
|
||||
}
|
||||
|
||||
if (acpi_gbl_nesting_level) {
|
||||
@ -467,14 +466,14 @@ acpi_ut_status_exit(u32 line_number,
|
||||
acpi_debug_print(ACPI_LV_FUNCTIONS,
|
||||
line_number, function_name,
|
||||
module_name, component_id, "%s %s\n",
|
||||
acpi_gbl_fn_exit_str,
|
||||
acpi_gbl_function_exit_prefix,
|
||||
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_gbl_function_exit_prefix,
|
||||
acpi_format_exception(status));
|
||||
}
|
||||
}
|
||||
@ -514,7 +513,7 @@ acpi_ut_value_exit(u32 line_number,
|
||||
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_gbl_function_exit_prefix,
|
||||
ACPI_FORMAT_UINT64(value));
|
||||
}
|
||||
|
||||
@ -552,8 +551,8 @@ acpi_ut_ptr_exit(u32 line_number,
|
||||
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);
|
||||
component_id, "%s %p\n",
|
||||
acpi_gbl_function_exit_prefix, ptr);
|
||||
}
|
||||
|
||||
if (acpi_gbl_nesting_level) {
|
||||
|
@ -446,7 +446,7 @@ const char *acpi_ut_get_mutex_name(u32 mutex_id)
|
||||
|
||||
/* Names for Notify() values, used for debug output */
|
||||
|
||||
static const char *acpi_gbl_generic_notify[ACPI_NOTIFY_MAX + 1] = {
|
||||
static const char *acpi_gbl_generic_notify[ACPI_GENERIC_NOTIFY_MAX + 1] = {
|
||||
/* 00 */ "Bus Check",
|
||||
/* 01 */ "Device Check",
|
||||
/* 02 */ "Device Wake",
|
||||
@ -459,49 +459,53 @@ static const char *acpi_gbl_generic_notify[ACPI_NOTIFY_MAX + 1] = {
|
||||
/* 09 */ "Device PLD Check",
|
||||
/* 0A */ "Reserved",
|
||||
/* 0B */ "System Locality Update",
|
||||
/* 0C */ "Shutdown Request",
|
||||
/* 0C */ "Shutdown Request",
|
||||
/* Reserved in ACPI 6.0 */
|
||||
/* 0D */ "System Resource Affinity Update"
|
||||
};
|
||||
|
||||
static const char *acpi_gbl_device_notify[4] = {
|
||||
static const char *acpi_gbl_device_notify[5] = {
|
||||
/* 80 */ "Status Change",
|
||||
/* 81 */ "Information Change",
|
||||
/* 82 */ "Device-Specific Change",
|
||||
/* 83 */ "Device-Specific Change"
|
||||
/* 83 */ "Device-Specific Change",
|
||||
/* 84 */ "Reserved"
|
||||
};
|
||||
|
||||
static const char *acpi_gbl_processor_notify[4] = {
|
||||
static const char *acpi_gbl_processor_notify[5] = {
|
||||
/* 80 */ "Performance Capability Change",
|
||||
/* 81 */ "C-State Change",
|
||||
/* 82 */ "Throttling Capability Change",
|
||||
/* 83 */ "Device-Specific Change"
|
||||
/* 83 */ "Guaranteed Change",
|
||||
/* 84 */ "Minimum Excursion"
|
||||
};
|
||||
|
||||
static const char *acpi_gbl_thermal_notify[4] = {
|
||||
static const char *acpi_gbl_thermal_notify[5] = {
|
||||
/* 80 */ "Thermal Status Change",
|
||||
/* 81 */ "Thermal Trip Point Change",
|
||||
/* 82 */ "Thermal Device List Change",
|
||||
/* 83 */ "Thermal Relationship Change"
|
||||
/* 83 */ "Thermal Relationship Change",
|
||||
/* 84 */ "Reserved"
|
||||
};
|
||||
|
||||
const char *acpi_ut_get_notify_name(u32 notify_value, acpi_object_type type)
|
||||
{
|
||||
|
||||
/* 00 - 0D are common to all object types */
|
||||
/* 00 - 0D are "common to all object types" (from ACPI Spec) */
|
||||
|
||||
if (notify_value <= ACPI_NOTIFY_MAX) {
|
||||
if (notify_value <= ACPI_GENERIC_NOTIFY_MAX) {
|
||||
return (acpi_gbl_generic_notify[notify_value]);
|
||||
}
|
||||
|
||||
/* 0D - 7F are reserved */
|
||||
/* 0E - 7F are reserved */
|
||||
|
||||
if (notify_value <= ACPI_MAX_SYS_NOTIFY) {
|
||||
return ("Reserved");
|
||||
}
|
||||
|
||||
/* 80 - 83 are per-object-type */
|
||||
/* 80 - 84 are per-object-type */
|
||||
|
||||
if (notify_value <= 0x83) {
|
||||
if (notify_value <= ACPI_SPECIFIC_NOTIFY_MAX) {
|
||||
switch (type) {
|
||||
case ACPI_TYPE_ANY:
|
||||
case ACPI_TYPE_DEVICE:
|
||||
|
@ -69,7 +69,7 @@ ACPI_MODULE_NAME("uteval")
|
||||
|
||||
acpi_status
|
||||
acpi_ut_evaluate_object(struct acpi_namespace_node *prefix_node,
|
||||
char *path,
|
||||
const char *path,
|
||||
u32 expected_return_btypes,
|
||||
union acpi_operand_object **return_desc)
|
||||
{
|
||||
@ -204,7 +204,7 @@ cleanup:
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status
|
||||
acpi_ut_evaluate_numeric_object(char *object_name,
|
||||
acpi_ut_evaluate_numeric_object(const char *object_name,
|
||||
struct acpi_namespace_node *device_node,
|
||||
u64 *value)
|
||||
{
|
||||
|
@ -80,6 +80,11 @@ const char *acpi_gbl_highest_dstate_names[ACPI_NUM_sx_d_METHODS] = {
|
||||
"_S4D"
|
||||
};
|
||||
|
||||
/* Hex-to-ascii */
|
||||
|
||||
const char acpi_gbl_lower_hex_digits[] = "0123456789abcdef";
|
||||
const char acpi_gbl_upper_hex_digits[] = "0123456789ABCDEF";
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* Namespace globals
|
||||
@ -221,6 +226,49 @@ struct acpi_fixed_event_info acpi_gbl_fixed_event_info[ACPI_NUM_FIXED_EVENTS] =
|
||||
};
|
||||
#endif /* !ACPI_REDUCED_HARDWARE */
|
||||
|
||||
#if defined (ACPI_DISASSEMBLER) || defined (ACPI_ASL_COMPILER)
|
||||
|
||||
/* to_pld macro: compile/disassemble strings */
|
||||
|
||||
const char *acpi_gbl_pld_panel_list[] = {
|
||||
"TOP",
|
||||
"BOTTOM",
|
||||
"LEFT",
|
||||
"RIGHT",
|
||||
"FRONT",
|
||||
"BACK",
|
||||
"UNKNOWN",
|
||||
NULL
|
||||
};
|
||||
|
||||
const char *acpi_gbl_pld_vertical_position_list[] = {
|
||||
"UPPER",
|
||||
"CENTER",
|
||||
"LOWER",
|
||||
NULL
|
||||
};
|
||||
|
||||
const char *acpi_gbl_pld_horizontal_position_list[] = {
|
||||
"LEFT",
|
||||
"CENTER",
|
||||
"RIGHT",
|
||||
NULL
|
||||
};
|
||||
|
||||
const char *acpi_gbl_pld_shape_list[] = {
|
||||
"ROUND",
|
||||
"OVAL",
|
||||
"SQUARE",
|
||||
"VERTICALRECTANGLE",
|
||||
"HORIZONTALRECTANGLE",
|
||||
"VERTICALTRAPEZOID",
|
||||
"HORIZONTALTRAPEZOID",
|
||||
"UNKNOWN",
|
||||
"CHAMFERED",
|
||||
NULL
|
||||
};
|
||||
#endif
|
||||
|
||||
/* Public globals */
|
||||
|
||||
ACPI_EXPORT_SYMBOL(acpi_gbl_FADT)
|
||||
|
@ -361,7 +361,7 @@ acpi_ut_walk_package_tree(union acpi_operand_object *source_object,
|
||||
void
|
||||
acpi_ut_display_init_pathname(u8 type,
|
||||
struct acpi_namespace_node *obj_handle,
|
||||
char *path)
|
||||
const char *path)
|
||||
{
|
||||
acpi_status status;
|
||||
struct acpi_buffer buffer;
|
||||
|
@ -205,37 +205,41 @@ acpi_ut_safe_strncat(char *dest,
|
||||
*
|
||||
* 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
|
||||
* PARAMETERS: string - Null terminated string
|
||||
* base - Radix of the string: 16 or 10 or
|
||||
* ACPI_ANY_BASE
|
||||
* max_integer_byte_width - Maximum allowable integer,in bytes:
|
||||
* 4 or 8 (32 or 64 bits)
|
||||
* 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.
|
||||
* 32-bit or 64-bit conversion, depending on the input integer
|
||||
* size (often the current mode of the interpreter).
|
||||
*
|
||||
* NOTES: acpi_gbl_integer_byte_width should be set to the proper width.
|
||||
* NOTES: Negative numbers are not supported, as they are not supported
|
||||
* by ACPI.
|
||||
*
|
||||
* acpi_gbl_integer_byte_width should be set to the proper width.
|
||||
* For the core ACPICA code, this width depends on the DSDT
|
||||
* version. For iASL, the default byte width is always 8.
|
||||
* version. For iASL, the default byte width is always 8 for the
|
||||
* parser, but error checking is performed later to flag cases
|
||||
* where a 64-bit constant is defined in a 32-bit DSDT/SSDT.
|
||||
*
|
||||
* Does not support Octal strings, not needed at this time.
|
||||
*
|
||||
* There is an earlier version of the function after this one,
|
||||
* below. It is slightly different than this one, and the two
|
||||
* may eventually may need to be merged. (01/2016).
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status acpi_ut_strtoul64(char *string, u32 base, u64 *ret_integer)
|
||||
acpi_status
|
||||
acpi_ut_strtoul64(char *string,
|
||||
u32 base, u32 max_integer_byte_width, 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;
|
||||
@ -244,6 +248,7 @@ acpi_status acpi_ut_strtoul64(char *string, u32 base, u64 *ret_integer)
|
||||
|
||||
switch (base) {
|
||||
case ACPI_ANY_BASE:
|
||||
case 10:
|
||||
case 16:
|
||||
|
||||
break;
|
||||
@ -265,9 +270,9 @@ acpi_status acpi_ut_strtoul64(char *string, u32 base, u64 *ret_integer)
|
||||
string++;
|
||||
}
|
||||
|
||||
if (to_integer_op) {
|
||||
if (base == ACPI_ANY_BASE) {
|
||||
/*
|
||||
* Base equal to ACPI_ANY_BASE means 'ToInteger operation case'.
|
||||
* Base equal to ACPI_ANY_BASE means 'Either decimal or hex'.
|
||||
* We need to determine if it is decimal or hexadecimal.
|
||||
*/
|
||||
if ((*string == '0') && (tolower((int)*(string + 1)) == 'x')) {
|
||||
@ -284,7 +289,7 @@ acpi_status acpi_ut_strtoul64(char *string, u32 base, u64 *ret_integer)
|
||||
/* Any string left? Check that '0x' is not followed by white space. */
|
||||
|
||||
if (!(*string) || isspace((int)*string) || *string == '\t') {
|
||||
if (to_integer_op) {
|
||||
if (base == ACPI_ANY_BASE) {
|
||||
goto error_exit;
|
||||
} else {
|
||||
goto all_done;
|
||||
@ -292,10 +297,11 @@ acpi_status acpi_ut_strtoul64(char *string, u32 base, u64 *ret_integer)
|
||||
}
|
||||
|
||||
/*
|
||||
* Perform a 32-bit or 64-bit conversion, depending upon the current
|
||||
* execution mode of the interpreter
|
||||
* Perform a 32-bit or 64-bit conversion, depending upon the input
|
||||
* byte width
|
||||
*/
|
||||
dividend = (mode32) ? ACPI_UINT32_MAX : ACPI_UINT64_MAX;
|
||||
dividend = (max_integer_byte_width <= ACPI_MAX32_BYTE_WIDTH) ?
|
||||
ACPI_UINT32_MAX : ACPI_UINT64_MAX;
|
||||
|
||||
/* Main loop: convert the string to a 32- or 64-bit integer */
|
||||
|
||||
@ -323,7 +329,7 @@ acpi_status acpi_ut_strtoul64(char *string, u32 base, u64 *ret_integer)
|
||||
}
|
||||
|
||||
if (term) {
|
||||
if (to_integer_op) {
|
||||
if (base == ACPI_ANY_BASE) {
|
||||
goto error_exit;
|
||||
} else {
|
||||
break;
|
||||
@ -338,12 +344,13 @@ acpi_status acpi_ut_strtoul64(char *string, u32 base, u64 *ret_integer)
|
||||
|
||||
valid_digits++;
|
||||
|
||||
if (sign_of0x
|
||||
&& ((valid_digits > 16)
|
||||
|| ((valid_digits > 8) && mode32))) {
|
||||
if (sign_of0x && ((valid_digits > 16) ||
|
||||
((valid_digits > 8)
|
||||
&& (max_integer_byte_width <=
|
||||
ACPI_MAX32_BYTE_WIDTH)))) {
|
||||
/*
|
||||
* This is to_integer operation case.
|
||||
* No any restrictions for string-to-integer conversion,
|
||||
* No restrictions for string-to-integer conversion,
|
||||
* see ACPI spec.
|
||||
*/
|
||||
goto error_exit;
|
||||
@ -355,7 +362,7 @@ acpi_status acpi_ut_strtoul64(char *string, u32 base, u64 *ret_integer)
|
||||
"ient, NULL);
|
||||
|
||||
if (return_value > quotient) {
|
||||
if (to_integer_op) {
|
||||
if (base == ACPI_ANY_BASE) {
|
||||
goto error_exit;
|
||||
} else {
|
||||
break;
|
||||
@ -378,7 +385,8 @@ all_done:
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
|
||||
error_exit:
|
||||
/* Base was set/validated above */
|
||||
|
||||
/* Base was set/validated above (10 or 16) */
|
||||
|
||||
if (base == 10) {
|
||||
return_ACPI_STATUS(AE_BAD_DECIMAL_CONSTANT);
|
||||
@ -388,8 +396,7 @@ error_exit:
|
||||
}
|
||||
|
||||
#ifdef _OBSOLETE_FUNCTIONS
|
||||
/* TBD: use version in ACPICA main code base? */
|
||||
/* DONE: 01/2016 */
|
||||
/* Removed: 01/2016 */
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
|
@ -67,11 +67,6 @@ static char *acpi_ut_format_number(char *string,
|
||||
|
||||
static char *acpi_ut_put_number(char *string, u64 number, u8 base, u8 upper);
|
||||
|
||||
/* Module globals */
|
||||
|
||||
static const char acpi_gbl_lower_hex_digits[] = "0123456789abcdef";
|
||||
static const char acpi_gbl_upper_hex_digits[] = "0123456789ABCDEF";
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ut_bound_string_length
|
||||
|
@ -90,7 +90,7 @@ acpi_ut_remove_allocation(struct acpi_debug_mem_block *address,
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status
|
||||
acpi_ut_create_list(char *list_name,
|
||||
acpi_ut_create_list(const char *list_name,
|
||||
u16 object_size, struct acpi_memory_list **return_cache)
|
||||
{
|
||||
struct acpi_memory_list *cache;
|
||||
|
@ -861,7 +861,7 @@ static ssize_t vendor_show(struct device *dev,
|
||||
{
|
||||
struct acpi_nfit_control_region *dcr = to_nfit_dcr(dev);
|
||||
|
||||
return sprintf(buf, "%#x\n", dcr->vendor_id);
|
||||
return sprintf(buf, "0x%04x\n", be16_to_cpu(dcr->vendor_id));
|
||||
}
|
||||
static DEVICE_ATTR_RO(vendor);
|
||||
|
||||
@ -870,7 +870,7 @@ static ssize_t rev_id_show(struct device *dev,
|
||||
{
|
||||
struct acpi_nfit_control_region *dcr = to_nfit_dcr(dev);
|
||||
|
||||
return sprintf(buf, "%#x\n", dcr->revision_id);
|
||||
return sprintf(buf, "0x%04x\n", be16_to_cpu(dcr->revision_id));
|
||||
}
|
||||
static DEVICE_ATTR_RO(rev_id);
|
||||
|
||||
@ -879,10 +879,38 @@ static ssize_t device_show(struct device *dev,
|
||||
{
|
||||
struct acpi_nfit_control_region *dcr = to_nfit_dcr(dev);
|
||||
|
||||
return sprintf(buf, "%#x\n", dcr->device_id);
|
||||
return sprintf(buf, "0x%04x\n", be16_to_cpu(dcr->device_id));
|
||||
}
|
||||
static DEVICE_ATTR_RO(device);
|
||||
|
||||
static ssize_t subsystem_vendor_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct acpi_nfit_control_region *dcr = to_nfit_dcr(dev);
|
||||
|
||||
return sprintf(buf, "0x%04x\n", be16_to_cpu(dcr->subsystem_vendor_id));
|
||||
}
|
||||
static DEVICE_ATTR_RO(subsystem_vendor);
|
||||
|
||||
static ssize_t subsystem_rev_id_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct acpi_nfit_control_region *dcr = to_nfit_dcr(dev);
|
||||
|
||||
return sprintf(buf, "0x%04x\n",
|
||||
be16_to_cpu(dcr->subsystem_revision_id));
|
||||
}
|
||||
static DEVICE_ATTR_RO(subsystem_rev_id);
|
||||
|
||||
static ssize_t subsystem_device_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct acpi_nfit_control_region *dcr = to_nfit_dcr(dev);
|
||||
|
||||
return sprintf(buf, "0x%04x\n", be16_to_cpu(dcr->subsystem_device_id));
|
||||
}
|
||||
static DEVICE_ATTR_RO(subsystem_device);
|
||||
|
||||
static int num_nvdimm_formats(struct nvdimm *nvdimm)
|
||||
{
|
||||
struct nfit_mem *nfit_mem = nvdimm_provider_data(nvdimm);
|
||||
@ -900,7 +928,7 @@ static ssize_t format_show(struct device *dev,
|
||||
{
|
||||
struct acpi_nfit_control_region *dcr = to_nfit_dcr(dev);
|
||||
|
||||
return sprintf(buf, "%#x\n", dcr->code);
|
||||
return sprintf(buf, "0x%04x\n", be16_to_cpu(dcr->code));
|
||||
}
|
||||
static DEVICE_ATTR_RO(format);
|
||||
|
||||
@ -933,7 +961,8 @@ static ssize_t format1_show(struct device *dev,
|
||||
continue;
|
||||
if (nfit_dcr->dcr->code == dcr->code)
|
||||
continue;
|
||||
rc = sprintf(buf, "%#x\n", nfit_dcr->dcr->code);
|
||||
rc = sprintf(buf, "%#x\n",
|
||||
be16_to_cpu(nfit_dcr->dcr->code));
|
||||
break;
|
||||
}
|
||||
if (rc != ENXIO)
|
||||
@ -958,7 +987,7 @@ static ssize_t serial_show(struct device *dev,
|
||||
{
|
||||
struct acpi_nfit_control_region *dcr = to_nfit_dcr(dev);
|
||||
|
||||
return sprintf(buf, "%#x\n", dcr->serial_number);
|
||||
return sprintf(buf, "0x%08x\n", be32_to_cpu(dcr->serial_number));
|
||||
}
|
||||
static DEVICE_ATTR_RO(serial);
|
||||
|
||||
@ -1000,17 +1029,39 @@ static ssize_t flags_show(struct device *dev,
|
||||
}
|
||||
static DEVICE_ATTR_RO(flags);
|
||||
|
||||
static ssize_t id_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct acpi_nfit_control_region *dcr = to_nfit_dcr(dev);
|
||||
|
||||
if (dcr->valid_fields & ACPI_NFIT_CONTROL_MFG_INFO_VALID)
|
||||
return sprintf(buf, "%04x-%02x-%04x-%08x\n",
|
||||
be16_to_cpu(dcr->vendor_id),
|
||||
dcr->manufacturing_location,
|
||||
be16_to_cpu(dcr->manufacturing_date),
|
||||
be32_to_cpu(dcr->serial_number));
|
||||
else
|
||||
return sprintf(buf, "%04x-%08x\n",
|
||||
be16_to_cpu(dcr->vendor_id),
|
||||
be32_to_cpu(dcr->serial_number));
|
||||
}
|
||||
static DEVICE_ATTR_RO(id);
|
||||
|
||||
static struct attribute *acpi_nfit_dimm_attributes[] = {
|
||||
&dev_attr_handle.attr,
|
||||
&dev_attr_phys_id.attr,
|
||||
&dev_attr_vendor.attr,
|
||||
&dev_attr_device.attr,
|
||||
&dev_attr_rev_id.attr,
|
||||
&dev_attr_subsystem_vendor.attr,
|
||||
&dev_attr_subsystem_device.attr,
|
||||
&dev_attr_subsystem_rev_id.attr,
|
||||
&dev_attr_format.attr,
|
||||
&dev_attr_formats.attr,
|
||||
&dev_attr_format1.attr,
|
||||
&dev_attr_serial.attr,
|
||||
&dev_attr_rev_id.attr,
|
||||
&dev_attr_flags.attr,
|
||||
&dev_attr_id.attr,
|
||||
&dev_attr_family.attr,
|
||||
&dev_attr_dsm_mask.attr,
|
||||
NULL,
|
||||
|
@ -52,11 +52,13 @@ enum nfit_uuids {
|
||||
NFIT_UUID_MAX,
|
||||
};
|
||||
|
||||
enum nfit_fic {
|
||||
NFIT_FIC_BYTE = 0x101, /* byte-addressable energy backed */
|
||||
NFIT_FIC_BLK = 0x201, /* block-addressable non-energy backed */
|
||||
NFIT_FIC_BYTEN = 0x301, /* byte-addressable non-energy backed */
|
||||
};
|
||||
/*
|
||||
* Region format interface codes are stored as an array of bytes in the
|
||||
* NFIT DIMM Control Region structure
|
||||
*/
|
||||
#define NFIT_FIC_BYTE cpu_to_be16(0x101) /* byte-addressable energy backed */
|
||||
#define NFIT_FIC_BLK cpu_to_be16(0x201) /* block-addressable non-energy backed */
|
||||
#define NFIT_FIC_BYTEN cpu_to_be16(0x301) /* byte-addressable non-energy backed */
|
||||
|
||||
enum {
|
||||
NFIT_BLK_READ_FLUSH = 1,
|
||||
|
@ -582,7 +582,7 @@ static char acpi_os_name[ACPI_MAX_OVERRIDE_LEN];
|
||||
|
||||
acpi_status
|
||||
acpi_os_predefined_override(const struct acpi_predefined_names *init_val,
|
||||
char **new_val)
|
||||
acpi_string *new_val)
|
||||
{
|
||||
if (!init_val || !new_val)
|
||||
return AE_BAD_PARAMETER;
|
||||
|
@ -96,7 +96,7 @@ acpi_physical_address acpi_os_get_root_pointer(void);
|
||||
#ifndef ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_predefined_override
|
||||
acpi_status
|
||||
acpi_os_predefined_override(const struct acpi_predefined_names *init_val,
|
||||
char **new_val);
|
||||
acpi_string *new_val);
|
||||
#endif
|
||||
|
||||
#ifndef ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_table_override
|
||||
|
@ -46,7 +46,7 @@
|
||||
|
||||
/* Current ACPICA subsystem version in YYYYMMDD format */
|
||||
|
||||
#define ACPI_CA_VERSION 0x20160108
|
||||
#define ACPI_CA_VERSION 0x20160318
|
||||
|
||||
#include <acpi/acconfig.h>
|
||||
#include <acpi/actypes.h>
|
||||
|
@ -223,7 +223,7 @@ struct acpi_table_facs {
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FADT - Fixed ACPI Description Table (Signature "FACP")
|
||||
* Version 4
|
||||
* Version 6
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
@ -413,4 +413,6 @@ struct acpi_table_desc {
|
||||
#define ACPI_FADT_V5_SIZE (u32) (ACPI_FADT_OFFSET (hypervisor_id))
|
||||
#define ACPI_FADT_V6_SIZE (u32) (sizeof (struct acpi_table_fadt))
|
||||
|
||||
#define ACPI_FADT_CONFORMANCE "ACPI 6.1 (FADT version 6)"
|
||||
|
||||
#endif /* __ACTBL_H__ */
|
||||
|
@ -236,7 +236,8 @@ enum acpi_einj_actions {
|
||||
ACPI_EINJ_CHECK_BUSY_STATUS = 6,
|
||||
ACPI_EINJ_GET_COMMAND_STATUS = 7,
|
||||
ACPI_EINJ_SET_ERROR_TYPE_WITH_ADDRESS = 8,
|
||||
ACPI_EINJ_ACTION_RESERVED = 9, /* 9 and greater are reserved */
|
||||
ACPI_EINJ_GET_EXECUTE_TIMINGS = 9,
|
||||
ACPI_EINJ_ACTION_RESERVED = 10, /* 10 and greater are reserved */
|
||||
ACPI_EINJ_TRIGGER_ERROR = 0xFF /* Except for this value */
|
||||
};
|
||||
|
||||
@ -348,7 +349,8 @@ enum acpi_erst_actions {
|
||||
ACPI_ERST_GET_ERROR_RANGE = 13,
|
||||
ACPI_ERST_GET_ERROR_LENGTH = 14,
|
||||
ACPI_ERST_GET_ERROR_ATTRIBUTES = 15,
|
||||
ACPI_ERST_ACTION_RESERVED = 16 /* 16 and greater are reserved */
|
||||
ACPI_ERST_EXECUTE_TIMINGS = 16,
|
||||
ACPI_ERST_ACTION_RESERVED = 17 /* 17 and greater are reserved */
|
||||
};
|
||||
|
||||
/* Values for Instruction field above */
|
||||
@ -427,7 +429,8 @@ enum acpi_hest_types {
|
||||
ACPI_HEST_TYPE_AER_ENDPOINT = 7,
|
||||
ACPI_HEST_TYPE_AER_BRIDGE = 8,
|
||||
ACPI_HEST_TYPE_GENERIC_ERROR = 9,
|
||||
ACPI_HEST_TYPE_RESERVED = 10 /* 10 and greater are reserved */
|
||||
ACPI_HEST_TYPE_GENERIC_ERROR_V2 = 10,
|
||||
ACPI_HEST_TYPE_RESERVED = 11 /* 11 and greater are reserved */
|
||||
};
|
||||
|
||||
/*
|
||||
@ -506,7 +509,11 @@ enum acpi_hest_notify_types {
|
||||
ACPI_HEST_NOTIFY_NMI = 4,
|
||||
ACPI_HEST_NOTIFY_CMCI = 5, /* ACPI 5.0 */
|
||||
ACPI_HEST_NOTIFY_MCE = 6, /* ACPI 5.0 */
|
||||
ACPI_HEST_NOTIFY_RESERVED = 7 /* 7 and greater are reserved */
|
||||
ACPI_HEST_NOTIFY_GPIO = 7, /* ACPI 6.0 */
|
||||
ACPI_HEST_NOTIFY_SEA = 8, /* ACPI 6.1 */
|
||||
ACPI_HEST_NOTIFY_SEI = 9, /* ACPI 6.1 */
|
||||
ACPI_HEST_NOTIFY_GSIV = 10, /* ACPI 6.1 */
|
||||
ACPI_HEST_NOTIFY_RESERVED = 11 /* 11 and greater are reserved */
|
||||
};
|
||||
|
||||
/* Values for config_write_enable bitfield above */
|
||||
@ -603,6 +610,24 @@ struct acpi_hest_generic {
|
||||
u32 error_block_length;
|
||||
};
|
||||
|
||||
/* 10: Generic Hardware Error Source, version 2 */
|
||||
|
||||
struct acpi_hest_generic_v2 {
|
||||
struct acpi_hest_header header;
|
||||
u16 related_source_id;
|
||||
u8 reserved;
|
||||
u8 enabled;
|
||||
u32 records_to_preallocate;
|
||||
u32 max_sections_per_record;
|
||||
u32 max_raw_data_length;
|
||||
struct acpi_generic_address error_status_address;
|
||||
struct acpi_hest_notify notify;
|
||||
u32 error_block_length;
|
||||
struct acpi_generic_address read_ack_register;
|
||||
u64 read_ack_preserve;
|
||||
u64 read_ack_write;
|
||||
};
|
||||
|
||||
/* Generic Error Status block */
|
||||
|
||||
struct acpi_hest_generic_status {
|
||||
@ -634,6 +659,33 @@ struct acpi_hest_generic_data {
|
||||
u8 fru_text[20];
|
||||
};
|
||||
|
||||
/* Extension for revision 0x0300 */
|
||||
|
||||
struct acpi_hest_generic_data_v300 {
|
||||
u8 section_type[16];
|
||||
u32 error_severity;
|
||||
u16 revision;
|
||||
u8 validation_bits;
|
||||
u8 flags;
|
||||
u32 error_data_length;
|
||||
u8 fru_id[16];
|
||||
u8 fru_text[20];
|
||||
u64 time_stamp;
|
||||
};
|
||||
|
||||
/* Values for error_severity above */
|
||||
|
||||
#define ACPI_HEST_GEN_ERROR_RECOVERABLE 0
|
||||
#define ACPI_HEST_GEN_ERROR_FATAL 1
|
||||
#define ACPI_HEST_GEN_ERROR_CORRECTED 2
|
||||
#define ACPI_HEST_GEN_ERROR_NONE 3
|
||||
|
||||
/* Flags for validation_bits above */
|
||||
|
||||
#define ACPI_HEST_GEN_VALID_FRU_ID (1)
|
||||
#define ACPI_HEST_GEN_VALID_FRU_STRING (1<<1)
|
||||
#define ACPI_HEST_GEN_VALID_TIMESTAMP (1<<2)
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* MADT - Multiple APIC Description Table
|
||||
@ -934,7 +986,7 @@ struct acpi_msct_proximity {
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* NFIT - NVDIMM Interface Table (ACPI 6.0)
|
||||
* NFIT - NVDIMM Interface Table (ACPI 6.0+)
|
||||
* Version 1
|
||||
*
|
||||
******************************************************************************/
|
||||
@ -1015,6 +1067,7 @@ struct acpi_nfit_memory_map {
|
||||
#define ACPI_NFIT_MEM_NOT_ARMED (1<<3) /* 03: Memory Device is not armed */
|
||||
#define ACPI_NFIT_MEM_HEALTH_OBSERVED (1<<4) /* 04: Memory Device observed SMART/health events */
|
||||
#define ACPI_NFIT_MEM_HEALTH_ENABLED (1<<5) /* 05: SMART/health events enabled */
|
||||
#define ACPI_NFIT_MEM_MAP_FAILED (1<<6) /* 06: Mapping to SPA failed */
|
||||
|
||||
/* 2: Interleave Structure */
|
||||
|
||||
@ -1046,7 +1099,10 @@ struct acpi_nfit_control_region {
|
||||
u16 subsystem_vendor_id;
|
||||
u16 subsystem_device_id;
|
||||
u16 subsystem_revision_id;
|
||||
u8 reserved[6]; /* Reserved, must be zero */
|
||||
u8 valid_fields;
|
||||
u8 manufacturing_location;
|
||||
u16 manufacturing_date;
|
||||
u8 reserved[2]; /* Reserved, must be zero */
|
||||
u32 serial_number;
|
||||
u16 code;
|
||||
u16 windows;
|
||||
@ -1061,7 +1117,11 @@ struct acpi_nfit_control_region {
|
||||
|
||||
/* Flags */
|
||||
|
||||
#define ACPI_NFIT_CONTROL_BUFFERED (1) /* Block Data Windows implementation is buffered */
|
||||
#define ACPI_NFIT_CONTROL_BUFFERED (1) /* Block Data Windows implementation is buffered */
|
||||
|
||||
/* valid_fields bits */
|
||||
|
||||
#define ACPI_NFIT_CONTROL_MFG_INFO_VALID (1) /* Manufacturing fields are valid */
|
||||
|
||||
/* 5: NVDIMM Block Data Window Region Structure */
|
||||
|
||||
|
@ -321,7 +321,7 @@ struct acpi_csrt_descriptor {
|
||||
* DBG2 - Debug Port Table 2
|
||||
* Version 0 (Both main table and subtables)
|
||||
*
|
||||
* Conforms to "Microsoft Debug Port Table 2 (DBG2)", May 22 2012.
|
||||
* Conforms to "Microsoft Debug Port Table 2 (DBG2)", December 10, 2015
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
@ -371,6 +371,11 @@ struct acpi_dbg2_device {
|
||||
|
||||
#define ACPI_DBG2_16550_COMPATIBLE 0x0000
|
||||
#define ACPI_DBG2_16550_SUBSET 0x0001
|
||||
#define ACPI_DBG2_ARM_PL011 0x0003
|
||||
#define ACPI_DBG2_ARM_SBSA_32BIT 0x000D
|
||||
#define ACPI_DBG2_ARM_SBSA_GENERIC 0x000E
|
||||
#define ACPI_DBG2_ARM_DCC 0x000F
|
||||
#define ACPI_DBG2_BCM2835 0x0010
|
||||
|
||||
#define ACPI_DBG2_1394_STANDARD 0x0000
|
||||
|
||||
@ -399,7 +404,7 @@ struct acpi_table_dbgp {
|
||||
* Version 1
|
||||
*
|
||||
* Conforms to "Intel Virtualization Technology for Directed I/O",
|
||||
* Version 2.2, Sept. 2013
|
||||
* Version 2.3, October 2014
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
@ -413,6 +418,8 @@ struct acpi_table_dmar {
|
||||
/* Masks for Flags field above */
|
||||
|
||||
#define ACPI_DMAR_INTR_REMAP (1)
|
||||
#define ACPI_DMAR_X2APIC_OPT_OUT (1<<1)
|
||||
#define ACPI_DMAR_X2APIC_MODE (1<<2)
|
||||
|
||||
/* DMAR subtable header */
|
||||
|
||||
@ -655,7 +662,7 @@ struct acpi_ibft_target {
|
||||
* IORT - IO Remapping Table
|
||||
*
|
||||
* Conforms to "IO Remapping Table System Software on ARM Platforms",
|
||||
* Document number: ARM DEN 0049A, 2015
|
||||
* Document number: ARM DEN 0049B, October 2015
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
@ -685,7 +692,8 @@ enum acpi_iort_node_type {
|
||||
ACPI_IORT_NODE_ITS_GROUP = 0x00,
|
||||
ACPI_IORT_NODE_NAMED_COMPONENT = 0x01,
|
||||
ACPI_IORT_NODE_PCI_ROOT_COMPLEX = 0x02,
|
||||
ACPI_IORT_NODE_SMMU = 0x03
|
||||
ACPI_IORT_NODE_SMMU = 0x03,
|
||||
ACPI_IORT_NODE_SMMU_V3 = 0x04
|
||||
};
|
||||
|
||||
struct acpi_iort_id_mapping {
|
||||
@ -775,6 +783,23 @@ struct acpi_iort_smmu {
|
||||
#define ACPI_IORT_SMMU_DVM_SUPPORTED (1)
|
||||
#define ACPI_IORT_SMMU_COHERENT_WALK (1<<1)
|
||||
|
||||
struct acpi_iort_smmu_v3 {
|
||||
u64 base_address; /* SMMUv3 base address */
|
||||
u32 flags;
|
||||
u32 reserved;
|
||||
u64 vatos_address;
|
||||
u32 model; /* O: generic SMMUv3 */
|
||||
u32 event_gsiv;
|
||||
u32 pri_gsiv;
|
||||
u32 gerr_gsiv;
|
||||
u32 sync_gsiv;
|
||||
};
|
||||
|
||||
/* Masks for Flags field above */
|
||||
|
||||
#define ACPI_IORT_SMMU_V3_COHACC_OVERRIDE (1)
|
||||
#define ACPI_IORT_SMMU_V3_HTTU_OVERRIDE (1<<1)
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* IVRS - I/O Virtualization Reporting Structure
|
||||
@ -1102,10 +1127,10 @@ struct acpi_table_slic {
|
||||
/*******************************************************************************
|
||||
*
|
||||
* SPCR - Serial Port Console Redirection table
|
||||
* Version 1
|
||||
* Version 2
|
||||
*
|
||||
* Conforms to "Serial Port Console Redirection Table",
|
||||
* Version 1.00, January 11, 2002
|
||||
* Version 1.03, August 10, 2015
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
@ -1137,6 +1162,8 @@ struct acpi_table_spcr {
|
||||
|
||||
#define ACPI_SPCR_DO_NOT_DISABLE (1)
|
||||
|
||||
/* Values for Interface Type: See the definition of the DBG2 table */
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* SPMI - Server Platform Management Interface table
|
||||
|
@ -184,7 +184,7 @@ struct acpi_table_fpdt {
|
||||
struct acpi_table_header header; /* Common ACPI table header */
|
||||
};
|
||||
|
||||
/* FPDT subtable header */
|
||||
/* FPDT subtable header (Performance Record Structure) */
|
||||
|
||||
struct acpi_fpdt_header {
|
||||
u16 type;
|
||||
@ -205,6 +205,57 @@ enum acpi_fpdt_type {
|
||||
|
||||
/* 0: Firmware Basic Boot Performance Record */
|
||||
|
||||
struct acpi_fpdt_boot_pointer {
|
||||
struct acpi_fpdt_header header;
|
||||
u8 reserved[4];
|
||||
u64 address;
|
||||
};
|
||||
|
||||
/* 1: S3 Performance Table Pointer Record */
|
||||
|
||||
struct acpi_fpdt_s3pt_pointer {
|
||||
struct acpi_fpdt_header header;
|
||||
u8 reserved[4];
|
||||
u64 address;
|
||||
};
|
||||
|
||||
/*
|
||||
* S3PT - S3 Performance Table. This table is pointed to by the
|
||||
* S3 Pointer Record above.
|
||||
*/
|
||||
struct acpi_table_s3pt {
|
||||
u8 signature[4]; /* "S3PT" */
|
||||
u32 length;
|
||||
};
|
||||
|
||||
/*
|
||||
* S3PT Subtables (Not part of the actual FPDT)
|
||||
*/
|
||||
|
||||
/* Values for Type field in S3PT header */
|
||||
|
||||
enum acpi_s3pt_type {
|
||||
ACPI_S3PT_TYPE_RESUME = 0,
|
||||
ACPI_S3PT_TYPE_SUSPEND = 1,
|
||||
ACPI_FPDT_BOOT_PERFORMANCE = 2
|
||||
};
|
||||
|
||||
struct acpi_s3pt_resume {
|
||||
struct acpi_fpdt_header header;
|
||||
u32 resume_count;
|
||||
u64 full_resume;
|
||||
u64 average_resume;
|
||||
};
|
||||
|
||||
struct acpi_s3pt_suspend {
|
||||
struct acpi_fpdt_header header;
|
||||
u64 suspend_start;
|
||||
u64 suspend_end;
|
||||
};
|
||||
|
||||
/*
|
||||
* FPDT Boot Performance Record (Not part of the actual FPDT)
|
||||
*/
|
||||
struct acpi_fpdt_boot {
|
||||
struct acpi_fpdt_header header;
|
||||
u8 reserved[4];
|
||||
@ -215,52 +266,6 @@ struct acpi_fpdt_boot {
|
||||
u64 exit_services_exit;
|
||||
};
|
||||
|
||||
/* 1: S3 Performance Table Pointer Record */
|
||||
|
||||
struct acpi_fpdt_s3pt_ptr {
|
||||
struct acpi_fpdt_header header;
|
||||
u8 reserved[4];
|
||||
u64 address;
|
||||
};
|
||||
|
||||
/*
|
||||
* S3PT - S3 Performance Table. This table is pointed to by the
|
||||
* FPDT S3 Pointer Record above.
|
||||
*/
|
||||
struct acpi_table_s3pt {
|
||||
u8 signature[4]; /* "S3PT" */
|
||||
u32 length;
|
||||
};
|
||||
|
||||
/*
|
||||
* S3PT Subtables
|
||||
*/
|
||||
struct acpi_s3pt_header {
|
||||
u16 type;
|
||||
u8 length;
|
||||
u8 revision;
|
||||
};
|
||||
|
||||
/* Values for Type field above */
|
||||
|
||||
enum acpi_s3pt_type {
|
||||
ACPI_S3PT_TYPE_RESUME = 0,
|
||||
ACPI_S3PT_TYPE_SUSPEND = 1
|
||||
};
|
||||
|
||||
struct acpi_s3pt_resume {
|
||||
struct acpi_s3pt_header header;
|
||||
u32 resume_count;
|
||||
u64 full_resume;
|
||||
u64 average_resume;
|
||||
};
|
||||
|
||||
struct acpi_s3pt_suspend {
|
||||
struct acpi_s3pt_header header;
|
||||
u64 suspend_start;
|
||||
u64 suspend_end;
|
||||
};
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* GTDT - Generic Timer Description Table (ACPI 5.1)
|
||||
|
@ -630,7 +630,8 @@ typedef u64 acpi_integer;
|
||||
#define ACPI_NOTIFY_SHUTDOWN_REQUEST (u8) 0x0C
|
||||
#define ACPI_NOTIFY_AFFINITY_UPDATE (u8) 0x0D
|
||||
|
||||
#define ACPI_NOTIFY_MAX 0x0D
|
||||
#define ACPI_GENERIC_NOTIFY_MAX 0x0D
|
||||
#define ACPI_SPECIFIC_NOTIFY_MAX 0x84
|
||||
|
||||
/*
|
||||
* Types associated with ACPI names and objects. The first group of
|
||||
@ -994,7 +995,7 @@ struct acpi_buffer {
|
||||
* Predefined Namespace items
|
||||
*/
|
||||
struct acpi_predefined_names {
|
||||
char *name;
|
||||
const char *name;
|
||||
u8 type;
|
||||
char *val;
|
||||
};
|
||||
@ -1227,7 +1228,7 @@ struct acpi_mem_space_context {
|
||||
* struct acpi_memory_list is used only if the ACPICA local cache is enabled
|
||||
*/
|
||||
struct acpi_memory_list {
|
||||
char *list_name;
|
||||
const char *list_name;
|
||||
void *list_head;
|
||||
u16 object_size;
|
||||
u16 max_depth;
|
||||
|
@ -66,17 +66,28 @@
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
/* Common application configuration. All single threaded except for acpi_exec. */
|
||||
|
||||
#if (defined ACPI_ASL_COMPILER) || \
|
||||
(defined ACPI_BIN_APP) || \
|
||||
(defined ACPI_DUMP_APP) || \
|
||||
(defined ACPI_HELP_APP) || \
|
||||
(defined ACPI_NAMES_APP) || \
|
||||
(defined ACPI_SRC_APP) || \
|
||||
(defined ACPI_XTRACT_APP) || \
|
||||
(defined ACPI_EXAMPLE_APP)
|
||||
#define ACPI_APPLICATION
|
||||
#define ACPI_SINGLE_THREADED
|
||||
#endif
|
||||
|
||||
/* iASL configuration */
|
||||
|
||||
#ifdef ACPI_ASL_COMPILER
|
||||
#define ACPI_APPLICATION
|
||||
#define ACPI_DEBUG_OUTPUT
|
||||
#define ACPI_CONSTANT_EVAL_ONLY
|
||||
#define ACPI_LARGE_NAMESPACE_NODE
|
||||
#define ACPI_DATA_TABLE_DISASSEMBLY
|
||||
#define ACPI_SINGLE_THREADED
|
||||
#define ACPI_32BIT_PHYSICAL_ADDRESS
|
||||
|
||||
#define ACPI_DISASSEMBLER 1
|
||||
#endif
|
||||
|
||||
@ -89,21 +100,6 @@
|
||||
#define ACPI_DBG_TRACK_ALLOCATIONS
|
||||
#endif
|
||||
|
||||
/*
|
||||
* acpi_bin/acpi_dump/acpi_help/acpi_names/acpi_src/acpi_xtract/Example
|
||||
* configuration. All single threaded.
|
||||
*/
|
||||
#if (defined ACPI_BIN_APP) || \
|
||||
(defined ACPI_DUMP_APP) || \
|
||||
(defined ACPI_HELP_APP) || \
|
||||
(defined ACPI_NAMES_APP) || \
|
||||
(defined ACPI_SRC_APP) || \
|
||||
(defined ACPI_XTRACT_APP) || \
|
||||
(defined ACPI_EXAMPLE_APP)
|
||||
#define ACPI_APPLICATION
|
||||
#define ACPI_SINGLE_THREADED
|
||||
#endif
|
||||
|
||||
/* acpi_help configuration. Error messages disabled. */
|
||||
|
||||
#ifdef ACPI_HELP_APP
|
||||
@ -138,11 +134,16 @@
|
||||
#define ACPI_REDUCED_HARDWARE 1
|
||||
#endif
|
||||
|
||||
/* Linkable ACPICA library */
|
||||
/* Linkable ACPICA library. Two versions, one with full debug. */
|
||||
|
||||
#ifdef ACPI_LIBRARY
|
||||
#define ACPI_USE_LOCAL_CACHE
|
||||
#define ACPI_FULL_DEBUG
|
||||
#define ACPI_DEBUGGER 1
|
||||
#define ACPI_DISASSEMBLER 1
|
||||
|
||||
#ifdef _DEBUG
|
||||
#define ACPI_DEBUG_OUTPUT
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* Common for all ACPICA applications */
|
||||
@ -218,6 +219,9 @@
|
||||
#elif defined(__HAIKU__)
|
||||
#include "achaiku.h"
|
||||
|
||||
#elif defined(__QNX__)
|
||||
#include "acqnx.h"
|
||||
|
||||
#else
|
||||
|
||||
/* Unknown environment */
|
||||
|
@ -1,54 +0,0 @@
|
||||
/******************************************************************************
|
||||
*
|
||||
* Name: acmsvcex.h - Extra VC specific defines, etc.
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2000 - 2016, 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.
|
||||
*/
|
||||
|
||||
#ifndef __ACMSVCEX_H__
|
||||
#define __ACMSVCEX_H__
|
||||
|
||||
/* Debug support. */
|
||||
|
||||
#ifdef _DEBUG
|
||||
#define _CRTDBG_MAP_ALLOC /* Enables specific file/lineno for leaks */
|
||||
#include <crtdbg.h>
|
||||
#endif
|
||||
|
||||
#endif /* __ACMSVCEX_H__ */
|
@ -1,49 +0,0 @@
|
||||
/******************************************************************************
|
||||
*
|
||||
* Name: acwinex.h - Extra OS specific defines, etc.
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2000 - 2016, 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.
|
||||
*/
|
||||
|
||||
#ifndef __ACWINEX_H__
|
||||
#define __ACWINEX_H__
|
||||
|
||||
/* Windows uses VC */
|
||||
|
||||
#endif /* __ACWINEX_H__ */
|
@ -54,7 +54,7 @@ ACPI_MODULE_NAME("osunixmap")
|
||||
#ifndef O_BINARY
|
||||
#define O_BINARY 0
|
||||
#endif
|
||||
#if defined(_dragon_fly) || defined(_free_BSD)
|
||||
#if defined(_dragon_fly) || defined(_free_BSD) || defined(_QNX)
|
||||
#define MMAP_FLAGS MAP_SHARED
|
||||
#else
|
||||
#define MMAP_FLAGS MAP_PRIVATE
|
||||
|
@ -286,7 +286,8 @@ int ap_dump_table_by_address(char *ascii_address)
|
||||
|
||||
/* Convert argument to an integer physical address */
|
||||
|
||||
status = acpi_ut_strtoul64(ascii_address, 0, &long_address);
|
||||
status = acpi_ut_strtoul64(ascii_address, ACPI_ANY_BASE,
|
||||
ACPI_MAX64_BYTE_WIDTH, &long_address);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
acpi_log_error("%s: Could not convert to a physical address\n",
|
||||
ascii_address);
|
||||
|
@ -209,7 +209,8 @@ static int ap_do_options(int argc, char **argv)
|
||||
case 'r': /* Dump tables from specified RSDP */
|
||||
|
||||
status =
|
||||
acpi_ut_strtoul64(acpi_gbl_optarg, 0,
|
||||
acpi_ut_strtoul64(acpi_gbl_optarg, ACPI_ANY_BASE,
|
||||
ACPI_MAX64_BYTE_WIDTH,
|
||||
&gbl_rsdp_base);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
acpi_log_error
|
||||
|
Loading…
Reference in New Issue
Block a user