Skip to content

Commit

Permalink
Merge tag 'acpi-4.18-rc1-2' of git://git.kernel.org/pub/scm/linux/ker…
Browse files Browse the repository at this point in the history
…nel/git/rafael/linux-pm

Pull additional ACPI updates from Rafael Wysocki:
 "These update the ACPICA code in the kernel to upstream revision
  20180531 including one important AML parser fix and updates related to
  the IORT table, make the kernel recognize the "Windows 2017.2" _OSI
  string and update the customized methods documentation.

  Specifics:

   - Update the ACPICA code in the kernel to upstream revision 20180531
     including:
      * AML parser fix to continue loading tables after detecting an AML
        error (Erik Schmauss).
      * AML parser debug option to dump parse trees (Bob Moore).
      * Debugger updates (Bob Moore).
      * Initial bits of Unload () operator deprecation (Bob Moore).
      * Updates related to the IORT table (Robin Murphy).

   - Make Linux respond to the "Windows 2017.2" _OSI string which
     allows native Thunderbolt enumeration to be used on Dell systems
     and was unsafe before recent changes in the PCI subsystem (Mario
     Limonciello)

   - Update the ACPI method customization feature documentation (Erik
     Schmauss)"

* tag 'acpi-4.18-rc1-2' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm:
  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
  ACPI / Documentation: update ACPI customize method feature docs
  • Loading branch information
Linus Torvalds committed Jun 13, 2018
2 parents d09fcec + 6744553 commit d290ef9
Show file tree
Hide file tree
Showing 15 changed files with 192 additions and 26 deletions.
10 changes: 5 additions & 5 deletions Documentation/acpi/method-customizing.txt
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@ control method rather than override the entire DSDT, because kernel
rebuild/reboot is not needed and test result can be got in minutes.

Note: Only ACPI METHOD can be overridden, any other object types like
"Device", "OperationRegion", are not recognized.
"Device", "OperationRegion", are not recognized. Methods
declared inside scope operators are also not supported.
Note: The same ACPI control method can be overridden for many times,
and it's always the latest one that used by Linux/kernel.
Note: To get the ACPI debug object output (Store (AAAA, Debug)),
Expand All @@ -32,8 +33,6 @@ Note: To get the ACPI debug object output (Store (AAAA, Debug)),

DefinitionBlock ("", "SSDT", 1, "", "", 0x20080715)
{
External (ACON)

Method (\_SB_.AC._PSR, 0, NotSerialized)
{
Store ("In AC _PSR", Debug)
Expand All @@ -42,9 +41,10 @@ Note: To get the ACPI debug object output (Store (AAAA, Debug)),
}
Note that the full pathname of the method in ACPI namespace
should be used.
And remember to use "External" to declare external objects.
e) assemble the file to generate the AML code of the method.
e.g. "iasl psr.asl" (psr.aml is generated as a result)
e.g. "iasl -vw 6084 psr.asl" (psr.aml is generated as a result)
If parameter "-vw 6084" is not supported by your iASL compiler,
please try a newer version.
f) mount debugfs by "mount -t debugfs none /sys/kernel/debug"
g) override the old method via the debugfs by running
"cat /tmp/psr.aml > /sys/kernel/debug/acpi/custom_method"
Expand Down
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 d290ef9

Please sign in to comment.