forked from Minki/linux
Merge branch 'acpica'
ACPICA update to upstream revision 20180531 (including an important AML parser fix and updates related to IORT) and a change to start responding to the "Windows 2017.2" _OSI string. * acpica: ACPICA: Recognize the _OSI string "Windows 2017.2" ACPICA: Update version to 20180531 ACPICA: Interpreter: Begin deprecation of Unload operator ACPICA: AML parser: attempt to continue loading table after error ACPICA: Debugger: Reduce verbosity for module-level code errors. ACPICA: AML Parser: Add debug option to dump parse trees ACPICA: Debugger: Add count of namespace nodes after namespace dump ACPICA: IORT: Add PMCG node supprt ACPICA: IORT: Update for revision D
This commit is contained in:
commit
674455326e
@ -322,6 +322,7 @@ acpi_db_walk_and_match_name(acpi_handle obj_handle,
|
||||
acpi_os_printf("Could Not get pathname for object %p\n",
|
||||
obj_handle);
|
||||
} else {
|
||||
info.count = 0;
|
||||
info.owner_id = ACPI_OWNER_ID_MAX;
|
||||
info.debug_level = ACPI_UINT32_MAX;
|
||||
info.display_type = ACPI_DISPLAY_SUMMARY | ACPI_DISPLAY_SHORT;
|
||||
|
@ -35,6 +35,15 @@ void
|
||||
acpi_db_dump_method_info(acpi_status status, struct acpi_walk_state *walk_state)
|
||||
{
|
||||
struct acpi_thread_state *thread;
|
||||
struct acpi_namespace_node *node;
|
||||
|
||||
node = walk_state->method_node;
|
||||
|
||||
/* There are no locals or arguments for the module-level code case */
|
||||
|
||||
if (node == acpi_gbl_root_node) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* Ignore control codes, they are not errors */
|
||||
|
||||
@ -384,8 +393,14 @@ void acpi_db_decode_locals(struct acpi_walk_state *walk_state)
|
||||
struct acpi_namespace_node *node;
|
||||
u8 display_locals = FALSE;
|
||||
|
||||
obj_desc = walk_state->method_desc;
|
||||
node = walk_state->method_node;
|
||||
obj_desc = walk_state->method_desc;
|
||||
|
||||
/* There are no locals for the module-level code case */
|
||||
|
||||
if (node == acpi_gbl_root_node) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!node) {
|
||||
acpi_os_printf
|
||||
@ -452,6 +467,12 @@ void acpi_db_decode_arguments(struct acpi_walk_state *walk_state)
|
||||
node = walk_state->method_node;
|
||||
obj_desc = walk_state->method_desc;
|
||||
|
||||
/* There are no arguments for the module-level code case */
|
||||
|
||||
if (node == acpi_gbl_root_node) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!node) {
|
||||
acpi_os_printf
|
||||
("No method node (Executing subtree for buffer or opregion)\n");
|
||||
|
@ -162,9 +162,15 @@ acpi_ds_dump_method_stack(acpi_status status,
|
||||
op->common.next = NULL;
|
||||
|
||||
#ifdef ACPI_DISASSEMBLER
|
||||
acpi_os_printf("Failed at ");
|
||||
acpi_dm_disassemble(next_walk_state, op,
|
||||
ACPI_UINT32_MAX);
|
||||
if (walk_state->method_node !=
|
||||
acpi_gbl_root_node) {
|
||||
|
||||
/* More verbose if not module-level code */
|
||||
|
||||
acpi_os_printf("Failed at ");
|
||||
acpi_dm_disassemble(next_walk_state, op,
|
||||
ACPI_UINT32_MAX);
|
||||
}
|
||||
#endif
|
||||
op->common.next = next;
|
||||
}
|
||||
|
@ -489,6 +489,17 @@ acpi_status acpi_ex_unload_table(union acpi_operand_object *ddb_handle)
|
||||
*/
|
||||
ACPI_WARNING((AE_INFO, "Received request to unload an ACPI table"));
|
||||
|
||||
/*
|
||||
* May 2018: Unload is no longer supported for the following reasons:
|
||||
* 1) A correct implementation on some hosts may not be possible.
|
||||
* 2) Other ACPI implementations do not correctly/fully support it.
|
||||
* 3) It requires host device driver support which does not exist.
|
||||
* (To properly support namespace unload out from underneath.)
|
||||
* 4) This AML operator has never been seen in the field.
|
||||
*/
|
||||
ACPI_EXCEPTION((AE_INFO, AE_NOT_IMPLEMENTED,
|
||||
"AML Unload operator is not supported"));
|
||||
|
||||
/*
|
||||
* Validate the handle
|
||||
* Although the handle is partially validated in acpi_ex_reconfiguration()
|
||||
|
@ -170,6 +170,7 @@ acpi_ns_dump_one_object(acpi_handle obj_handle,
|
||||
}
|
||||
|
||||
type = this_node->type;
|
||||
info->count++;
|
||||
|
||||
/* Check if the owner matches */
|
||||
|
||||
@ -639,6 +640,7 @@ acpi_ns_dump_objects(acpi_object_type type,
|
||||
return;
|
||||
}
|
||||
|
||||
info.count = 0;
|
||||
info.debug_level = ACPI_LV_TABLES;
|
||||
info.owner_id = owner_id;
|
||||
info.display_type = display_type;
|
||||
@ -649,6 +651,7 @@ acpi_ns_dump_objects(acpi_object_type type,
|
||||
acpi_ns_dump_one_object, NULL,
|
||||
(void *)&info, NULL);
|
||||
|
||||
acpi_os_printf("\nNamespace node count: %u\n\n", info.count);
|
||||
(void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
|
||||
}
|
||||
|
||||
|
@ -515,6 +515,22 @@ acpi_status acpi_ps_parse_loop(struct acpi_walk_state *walk_state)
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
if (walk_state->opcode == AML_SCOPE_OP) {
|
||||
/*
|
||||
* If the scope op fails to parse, skip the body of the
|
||||
* scope op because the parse failure indicates that the
|
||||
* device may not exist.
|
||||
*/
|
||||
walk_state->parser_state.aml =
|
||||
walk_state->aml + 1;
|
||||
walk_state->parser_state.aml =
|
||||
acpi_ps_get_next_package_end
|
||||
(&walk_state->parser_state);
|
||||
walk_state->aml =
|
||||
walk_state->parser_state.aml;
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"Skipping Scope block"));
|
||||
}
|
||||
|
||||
continue;
|
||||
}
|
||||
@ -557,7 +573,40 @@ acpi_status acpi_ps_parse_loop(struct acpi_walk_state *walk_state)
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
if ((walk_state->control_state) &&
|
||||
((walk_state->control_state->control.
|
||||
opcode == AML_IF_OP)
|
||||
|| (walk_state->control_state->control.
|
||||
opcode == AML_WHILE_OP))) {
|
||||
/*
|
||||
* If the if/while op fails to parse, we will skip parsing
|
||||
* the body of the op.
|
||||
*/
|
||||
parser_state->aml =
|
||||
walk_state->control_state->control.
|
||||
aml_predicate_start + 1;
|
||||
parser_state->aml =
|
||||
acpi_ps_get_next_package_end
|
||||
(parser_state);
|
||||
walk_state->aml = parser_state->aml;
|
||||
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"Skipping While/If block"));
|
||||
if (*walk_state->aml == AML_ELSE_OP) {
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"Skipping Else block"));
|
||||
walk_state->parser_state.aml =
|
||||
walk_state->aml + 1;
|
||||
walk_state->parser_state.aml =
|
||||
acpi_ps_get_next_package_end
|
||||
(parser_state);
|
||||
walk_state->aml =
|
||||
parser_state->aml;
|
||||
}
|
||||
ACPI_FREE(acpi_ut_pop_generic_state
|
||||
(&walk_state->control_state));
|
||||
}
|
||||
op = NULL;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
@ -12,6 +12,7 @@
|
||||
#include "acparser.h"
|
||||
#include "amlcode.h"
|
||||
#include "acconvert.h"
|
||||
#include "acnamesp.h"
|
||||
|
||||
#define _COMPONENT ACPI_PARSER
|
||||
ACPI_MODULE_NAME("psobject")
|
||||
@ -549,6 +550,21 @@ acpi_ps_complete_op(struct acpi_walk_state *walk_state,
|
||||
|
||||
do {
|
||||
if (*op) {
|
||||
/*
|
||||
* These Opcodes need to be removed from the namespace because they
|
||||
* get created even if these opcodes cannot be created due to
|
||||
* errors.
|
||||
*/
|
||||
if (((*op)->common.aml_opcode == AML_REGION_OP)
|
||||
|| ((*op)->common.aml_opcode ==
|
||||
AML_DATA_REGION_OP)) {
|
||||
acpi_ns_delete_children((*op)->common.
|
||||
node);
|
||||
acpi_ns_remove_node((*op)->common.node);
|
||||
(*op)->common.node = NULL;
|
||||
acpi_ps_delete_parse_tree(*op);
|
||||
}
|
||||
|
||||
status2 =
|
||||
acpi_ps_complete_this_op(walk_state, *op);
|
||||
if (ACPI_FAILURE(status2)) {
|
||||
@ -574,6 +590,20 @@ acpi_ps_complete_op(struct acpi_walk_state *walk_state,
|
||||
#endif
|
||||
walk_state->prev_op = NULL;
|
||||
walk_state->prev_arg_types = walk_state->arg_types;
|
||||
|
||||
if (walk_state->parse_flags & ACPI_PARSE_MODULE_LEVEL) {
|
||||
/*
|
||||
* There was something that went wrong while executing code at the
|
||||
* module-level. We need to skip parsing whatever caused the
|
||||
* error and keep going. One runtime error during the table load
|
||||
* should not cause the entire table to not be loaded. This is
|
||||
* because there could be correct AML beyond the parts that caused
|
||||
* the runtime error.
|
||||
*/
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"Ignore error and continue table load"));
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
}
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
|
@ -25,22 +25,48 @@ ACPI_MODULE_NAME("pswalk")
|
||||
* DESCRIPTION: Delete a portion of or an entire parse tree.
|
||||
*
|
||||
******************************************************************************/
|
||||
#include "amlcode.h"
|
||||
void acpi_ps_delete_parse_tree(union acpi_parse_object *subtree_root)
|
||||
{
|
||||
union acpi_parse_object *op = subtree_root;
|
||||
union acpi_parse_object *next = NULL;
|
||||
union acpi_parse_object *parent = NULL;
|
||||
u32 level = 0;
|
||||
|
||||
ACPI_FUNCTION_TRACE_PTR(ps_delete_parse_tree, subtree_root);
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_PARSE_TREES, " root %p\n", subtree_root));
|
||||
|
||||
/* Visit all nodes in the subtree */
|
||||
|
||||
while (op) {
|
||||
|
||||
/* Check if we are not ascending */
|
||||
|
||||
if (op != parent) {
|
||||
|
||||
/* This is the descending case */
|
||||
|
||||
if (ACPI_IS_DEBUG_ENABLED
|
||||
(ACPI_LV_PARSE_TREES, _COMPONENT)) {
|
||||
|
||||
/* This debug option will print the entire parse tree */
|
||||
|
||||
acpi_os_printf(" %*.s%s %p", (level * 4),
|
||||
" ",
|
||||
acpi_ps_get_opcode_name(op->
|
||||
common.
|
||||
aml_opcode),
|
||||
op);
|
||||
|
||||
if (op->named.aml_opcode == AML_INT_NAMEPATH_OP) {
|
||||
acpi_os_printf(" %4.4s",
|
||||
op->common.value.string);
|
||||
}
|
||||
if (op->named.aml_opcode == AML_STRING_OP) {
|
||||
acpi_os_printf(" %s",
|
||||
op->common.value.string);
|
||||
}
|
||||
acpi_os_printf("\n");
|
||||
}
|
||||
|
||||
/* Look for an argument or child of the current op */
|
||||
|
||||
next = acpi_ps_get_arg(op, 0);
|
||||
@ -49,6 +75,7 @@ void acpi_ps_delete_parse_tree(union acpi_parse_object *subtree_root)
|
||||
/* Still going downward in tree (Op is not completed yet) */
|
||||
|
||||
op = next;
|
||||
level++;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
@ -69,6 +96,7 @@ void acpi_ps_delete_parse_tree(union acpi_parse_object *subtree_root)
|
||||
if (next) {
|
||||
op = next;
|
||||
} else {
|
||||
level--;
|
||||
op = parent;
|
||||
}
|
||||
}
|
||||
|
@ -182,20 +182,20 @@ acpi_ut_prefixed_namespace_error(const char *module_name,
|
||||
switch (lookup_status) {
|
||||
case AE_ALREADY_EXISTS:
|
||||
|
||||
acpi_os_printf(ACPI_MSG_BIOS_ERROR);
|
||||
acpi_os_printf("\n" ACPI_MSG_BIOS_ERROR);
|
||||
message = "Failure creating";
|
||||
break;
|
||||
|
||||
case AE_NOT_FOUND:
|
||||
|
||||
acpi_os_printf(ACPI_MSG_BIOS_ERROR);
|
||||
message = "Failure looking up";
|
||||
acpi_os_printf("\n" ACPI_MSG_BIOS_ERROR);
|
||||
message = "Could not resolve";
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
acpi_os_printf(ACPI_MSG_ERROR);
|
||||
message = "Failure looking up";
|
||||
acpi_os_printf("\n" ACPI_MSG_ERROR);
|
||||
message = "Failure resolving";
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -69,6 +69,7 @@ static struct acpi_interface_info acpi_default_supported_interfaces[] = {
|
||||
{"Windows 2015", NULL, 0, ACPI_OSI_WIN_10}, /* Windows 10 - Added 03/2015 */
|
||||
{"Windows 2016", NULL, 0, ACPI_OSI_WIN_10_RS1}, /* Windows 10 version 1607 - Added 12/2017 */
|
||||
{"Windows 2017", NULL, 0, ACPI_OSI_WIN_10_RS2}, /* Windows 10 version 1703 - Added 12/2017 */
|
||||
{"Windows 2017.2", NULL, 0, ACPI_OSI_WIN_10_RS3}, /* Windows 10 version 1709 - Added 02/2018 */
|
||||
|
||||
/* Feature Group Strings */
|
||||
|
||||
|
@ -80,7 +80,8 @@
|
||||
#define ACPI_LV_ALLOCATIONS 0x00100000
|
||||
#define ACPI_LV_FUNCTIONS 0x00200000
|
||||
#define ACPI_LV_OPTIMIZATIONS 0x00400000
|
||||
#define ACPI_LV_VERBOSITY2 0x00700000 | ACPI_LV_VERBOSITY1
|
||||
#define ACPI_LV_PARSE_TREES 0x00800000
|
||||
#define ACPI_LV_VERBOSITY2 0x00F00000 | ACPI_LV_VERBOSITY1
|
||||
#define ACPI_LV_ALL ACPI_LV_VERBOSITY2
|
||||
|
||||
/* Trace verbosity level 3 [Threading, I/O, and Interrupts] */
|
||||
@ -131,6 +132,7 @@
|
||||
#define ACPI_DB_TABLES ACPI_DEBUG_LEVEL (ACPI_LV_TABLES)
|
||||
#define ACPI_DB_FUNCTIONS ACPI_DEBUG_LEVEL (ACPI_LV_FUNCTIONS)
|
||||
#define ACPI_DB_OPTIMIZATIONS ACPI_DEBUG_LEVEL (ACPI_LV_OPTIMIZATIONS)
|
||||
#define ACPI_DB_PARSE_TREES ACPI_DEBUG_LEVEL (ACPI_LV_PARSE_TREES)
|
||||
#define ACPI_DB_VALUES ACPI_DEBUG_LEVEL (ACPI_LV_VALUES)
|
||||
#define ACPI_DB_OBJECTS ACPI_DEBUG_LEVEL (ACPI_LV_OBJECTS)
|
||||
#define ACPI_DB_ALLOCATIONS ACPI_DEBUG_LEVEL (ACPI_LV_ALLOCATIONS)
|
||||
|
@ -12,7 +12,7 @@
|
||||
|
||||
/* Current ACPICA subsystem version in YYYYMMDD format */
|
||||
|
||||
#define ACPI_CA_VERSION 0x20180508
|
||||
#define ACPI_CA_VERSION 0x20180531
|
||||
|
||||
#include <acpi/acconfig.h>
|
||||
#include <acpi/actypes.h>
|
||||
|
@ -67,7 +67,7 @@
|
||||
* IORT - IO Remapping Table
|
||||
*
|
||||
* Conforms to "IO Remapping Table System Software on ARM Platforms",
|
||||
* Document number: ARM DEN 0049C, May 2017
|
||||
* Document number: ARM DEN 0049D, March 2018
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
@ -98,7 +98,8 @@ enum acpi_iort_node_type {
|
||||
ACPI_IORT_NODE_NAMED_COMPONENT = 0x01,
|
||||
ACPI_IORT_NODE_PCI_ROOT_COMPLEX = 0x02,
|
||||
ACPI_IORT_NODE_SMMU = 0x03,
|
||||
ACPI_IORT_NODE_SMMU_V3 = 0x04
|
||||
ACPI_IORT_NODE_SMMU_V3 = 0x04,
|
||||
ACPI_IORT_NODE_PMCG = 0x05
|
||||
};
|
||||
|
||||
struct acpi_iort_id_mapping {
|
||||
@ -152,10 +153,17 @@ struct acpi_iort_named_component {
|
||||
char device_name[1]; /* Path of namespace object */
|
||||
};
|
||||
|
||||
/* Masks for Flags field above */
|
||||
|
||||
#define ACPI_IORT_NC_STALL_SUPPORTED (1)
|
||||
#define ACPI_IORT_NC_PASID_BITS (31<<1)
|
||||
|
||||
struct acpi_iort_root_complex {
|
||||
u64 memory_properties; /* Memory access properties */
|
||||
u32 ats_attribute;
|
||||
u32 pci_segment_number;
|
||||
u8 memory_address_limit; /* Memory address size limit */
|
||||
u8 reserved[3]; /* Reserved, must be zero */
|
||||
};
|
||||
|
||||
/* Values for ats_attribute field above */
|
||||
@ -209,9 +217,7 @@ struct acpi_iort_smmu_v3 {
|
||||
u32 pri_gsiv;
|
||||
u32 gerr_gsiv;
|
||||
u32 sync_gsiv;
|
||||
u8 pxm;
|
||||
u8 reserved1;
|
||||
u16 reserved2;
|
||||
u32 pxm;
|
||||
u32 id_mapping_index;
|
||||
};
|
||||
|
||||
@ -224,9 +230,16 @@ struct acpi_iort_smmu_v3 {
|
||||
/* Masks for Flags field above */
|
||||
|
||||
#define ACPI_IORT_SMMU_V3_COHACC_OVERRIDE (1)
|
||||
#define ACPI_IORT_SMMU_V3_HTTU_OVERRIDE (1<<1)
|
||||
#define ACPI_IORT_SMMU_V3_HTTU_OVERRIDE (3<<1)
|
||||
#define ACPI_IORT_SMMU_V3_PXM_VALID (1<<3)
|
||||
|
||||
struct acpi_iort_pmcg {
|
||||
u64 page0_base_address;
|
||||
u32 overflow_gsiv;
|
||||
u32 node_reference;
|
||||
u64 page1_base_address;
|
||||
};
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* IVRS - I/O Virtualization Reporting Structure
|
||||
|
@ -1272,6 +1272,7 @@ typedef enum {
|
||||
#define ACPI_OSI_WIN_10 0x0D
|
||||
#define ACPI_OSI_WIN_10_RS1 0x0E
|
||||
#define ACPI_OSI_WIN_10_RS2 0x0F
|
||||
#define ACPI_OSI_WIN_10_RS3 0x10
|
||||
|
||||
/* Definitions of getopt */
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user