Skip to content

Commit

Permalink
Merge branch 'acpica'
Browse files Browse the repository at this point in the history
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
  • Loading branch information
Rafael J. Wysocki committed Jun 13, 2018
2 parents fb14590 + ad584b4 commit 6744553
Show file tree
Hide file tree
Showing 14 changed files with 187 additions and 21 deletions.
1 change: 1 addition & 0 deletions drivers/acpi/acpica/dbnames.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
23 changes: 22 additions & 1 deletion drivers/acpi/acpica/dbobject.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 */

Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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");
Expand Down
12 changes: 9 additions & 3 deletions drivers/acpi/acpica/dsdebug.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down
11 changes: 11 additions & 0 deletions drivers/acpi/acpica/exconfig.c
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down
3 changes: 3 additions & 0 deletions drivers/acpi/acpica/nsdump.c
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,7 @@ acpi_ns_dump_one_object(acpi_handle obj_handle,
}

type = this_node->type;
info->count++;

/* Check if the owner matches */

Expand Down Expand Up @@ -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;
Expand All @@ -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);
}

Expand Down
51 changes: 50 additions & 1 deletion drivers/acpi/acpica/psloop.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down Expand Up @@ -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;
}
}
Expand Down
30 changes: 30 additions & 0 deletions drivers/acpi/acpica/psobject.c
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
#include "acparser.h"
#include "amlcode.h"
#include "acconvert.h"
#include "acnamesp.h"

#define _COMPONENT ACPI_PARSER
ACPI_MODULE_NAME("psobject")
Expand Down Expand Up @@ -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)) {
Expand All @@ -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);
}

Expand Down
34 changes: 31 additions & 3 deletions drivers/acpi/acpica/pswalk.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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;
}
}
Expand All @@ -69,6 +96,7 @@ void acpi_ps_delete_parse_tree(union acpi_parse_object *subtree_root)
if (next) {
op = next;
} else {
level--;
op = parent;
}
}
Expand Down
10 changes: 5 additions & 5 deletions drivers/acpi/acpica/uterror.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down
1 change: 1 addition & 0 deletions drivers/acpi/acpica/utosi.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 */

Expand Down
4 changes: 3 additions & 1 deletion include/acpi/acoutput.h
Original file line number Diff line number Diff line change
Expand Up @@ -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] */
Expand Down Expand Up @@ -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)
Expand Down
2 changes: 1 addition & 1 deletion include/acpi/acpixf.h
Original file line number Diff line number Diff line change
Expand Up @@ -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>
Expand Down
Loading

0 comments on commit 6744553

Please sign in to comment.