Skip to content

Commit

Permalink
Merge tag 'acpi-4.19-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 more ACPI updates from Rafael Wysocki:
 "These update the ACPICA code in the kernel to the most recent upstream
  revision (which includes a regression fix and other improvements),
  make ACPICA clear the status of all ACPI events when entering sleep
  states (to restore the previous behavior) and update the ACPI
  operation region driver for the CrystalCove PMIC.

  Specifics:

   - Update the ACPICA code in the kernel to upstream revision 20180810
     including:
      * Fix for AML parser regression causing it to mishandle opcodes
        that open a scope upon parse failures (Erik Schmauss)
      * Fix for a reference counting issue on large systems (Erik
        Schmauss)
      * Fix to discard values coming from register reads that have
        failed (Erik Schmauss)
      * Two acpiexec fixes (Bob Moore, Erik Schmauss)
      * Debugger cleanup (Bob Moore)
      * Cleanup of duplicate table error message (Bob Moore)
      * Cleanup of hex detection in the utilities (Erik Schmauss)

   - Make ACPICA clear the status of all ACPI events when entering sleep
     states again to avoid functional regressions (Rafael Wysocki)

   - Update the ACPI operation region driver for the CrystalCove PMIC to
     cover all of the known operation region fields (Hans de Goede)"

* tag 'acpi-4.19-rc1-2' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm:
  ACPI / PMIC: CrystalCove: Extend PMOP support to support all possible fields
  ACPICA: Clear status of all events when entering sleep states
  ACPICA: Update version to 20180810
  ACPICA: acpiexec: fix a small memory leak regression
  ACPICA: Reference Counts: increase max to 0x4000 for large servers
  ACPICA: Reference count: add additional debugging details
  ACPICA: acpi_exec: fixing -fi option
  ACPICA: Debugger: Cleanup interface to the AML disassembler
  ACPICA: AML Parser: skip opcodes that open a scope upon parse failure
  ACPICA: Utilities: split hex detection into smaller functions
  ACPICA: Update an error message for a duplicate table
  ACPICA: ACPICA: add status check for acpi_hw_read before assigning return value
  ACPICA: AML Parser: ignore all exceptions resulting from incorrect AML during table load
  • Loading branch information
Linus Torvalds committed Aug 22, 2018
2 parents dfec4a8 + d1f3ab5 commit df2def4
Show file tree
Hide file tree
Showing 19 changed files with 260 additions and 56 deletions.
1 change: 1 addition & 0 deletions drivers/acpi/acpica/aclocal.h
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,7 @@ struct acpi_namespace_node {
#define ANOBJ_SUBTREE_HAS_INI 0x10 /* Used to optimize device initialization */
#define ANOBJ_EVALUATED 0x20 /* Set on first evaluation of node */
#define ANOBJ_ALLOCATED_BUFFER 0x40 /* Method AML buffer is dynamic (install_method) */
#define ANOBJ_NODE_EARLY_INIT 0x80 /* acpi_exec only: Node was create via init file (-fi) */

#define ANOBJ_IS_EXTERNAL 0x08 /* iASL only: This object created via External() */
#define ANOBJ_METHOD_NO_RETVAL 0x10 /* iASL only: Method has no return value */
Expand Down
17 changes: 9 additions & 8 deletions drivers/acpi/acpica/acnamesp.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,14 +25,15 @@
/* Flags for acpi_ns_lookup, acpi_ns_search_and_enter */

#define ACPI_NS_NO_UPSEARCH 0
#define ACPI_NS_SEARCH_PARENT 0x01
#define ACPI_NS_DONT_OPEN_SCOPE 0x02
#define ACPI_NS_NO_PEER_SEARCH 0x04
#define ACPI_NS_ERROR_IF_FOUND 0x08
#define ACPI_NS_PREFIX_IS_SCOPE 0x10
#define ACPI_NS_EXTERNAL 0x20
#define ACPI_NS_TEMPORARY 0x40
#define ACPI_NS_OVERRIDE_IF_FOUND 0x80
#define ACPI_NS_SEARCH_PARENT 0x0001
#define ACPI_NS_DONT_OPEN_SCOPE 0x0002
#define ACPI_NS_NO_PEER_SEARCH 0x0004
#define ACPI_NS_ERROR_IF_FOUND 0x0008
#define ACPI_NS_PREFIX_IS_SCOPE 0x0010
#define ACPI_NS_EXTERNAL 0x0020
#define ACPI_NS_TEMPORARY 0x0040
#define ACPI_NS_OVERRIDE_IF_FOUND 0x0080
#define ACPI_NS_EARLY_INIT 0x0100

/* Flags for acpi_ns_walk_namespace */

Expand Down
2 changes: 2 additions & 0 deletions drivers/acpi/acpica/acutils.h
Original file line number Diff line number Diff line change
Expand Up @@ -180,6 +180,8 @@ char acpi_ut_remove_leading_zeros(char **string);

u8 acpi_ut_detect_hex_prefix(char **string);

void acpi_ut_remove_hex_prefix(char **string);

u8 acpi_ut_detect_octal_prefix(char **string);

/*
Expand Down
10 changes: 10 additions & 0 deletions drivers/acpi/acpica/dbinput.c
Original file line number Diff line number Diff line change
Expand Up @@ -763,7 +763,12 @@ acpi_db_command_dispatch(char *input_buffer,
case CMD_DISASSEMBLE:
case CMD_DISASM:

#ifdef ACPI_DISASSEMBLER
(void)acpi_db_disassemble_method(acpi_gbl_db_args[1]);
#else
acpi_os_printf
("The AML Disassembler is not configured/present\n");
#endif
break;

case CMD_DUMP:
Expand Down Expand Up @@ -872,7 +877,12 @@ acpi_db_command_dispatch(char *input_buffer,

case CMD_LIST:

#ifdef ACPI_DISASSEMBLER
acpi_db_disassemble_aml(acpi_gbl_db_args[1], op);
#else
acpi_os_printf
("The AML Disassembler is not configured/present\n");
#endif
break;

case CMD_LOCKS:
Expand Down
8 changes: 3 additions & 5 deletions drivers/acpi/acpica/dbmethod.c
Original file line number Diff line number Diff line change
Expand Up @@ -216,6 +216,7 @@ void acpi_db_set_method_data(char *type_arg, char *index_arg, char *value_arg)
acpi_ut_remove_reference(obj_desc);
}

#ifdef ACPI_DISASSEMBLER
/*******************************************************************************
*
* FUNCTION: acpi_db_disassemble_aml
Expand All @@ -242,9 +243,8 @@ void acpi_db_disassemble_aml(char *statements, union acpi_parse_object *op)
if (statements) {
num_statements = strtoul(statements, NULL, 0);
}
#ifdef ACPI_DISASSEMBLER

acpi_dm_disassemble(NULL, op, num_statements);
#endif
}

/*******************************************************************************
Expand Down Expand Up @@ -317,16 +317,13 @@ acpi_status acpi_db_disassemble_method(char *name)
walk_state->parse_flags |= ACPI_PARSE_DISASSEMBLE;

status = acpi_ps_parse_aml(walk_state);

#ifdef ACPI_DISASSEMBLER
(void)acpi_dm_parse_deferred_ops(op);

/* Now we can disassemble the method */

acpi_gbl_dm_opt_verbose = FALSE;
acpi_dm_disassemble(NULL, op, 0);
acpi_gbl_dm_opt_verbose = TRUE;
#endif

acpi_ps_delete_parse_tree(op);

Expand All @@ -337,6 +334,7 @@ acpi_status acpi_db_disassemble_method(char *name)
acpi_ut_release_owner_id(&obj_desc->method.owner_id);
return (AE_OK);
}
#endif

/*******************************************************************************
*
Expand Down
10 changes: 9 additions & 1 deletion drivers/acpi/acpica/dbxface.c
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
#include "amlcode.h"
#include "acdebug.h"
#include "acinterp.h"
#include "acparser.h"

#define _COMPONENT ACPI_CA_DEBUGGER
ACPI_MODULE_NAME("dbxface")
Expand Down Expand Up @@ -262,10 +263,17 @@ acpi_db_single_step(struct acpi_walk_state *walk_state,
}
}

/* Now we can display it */
/* Now we can disassemble and display it */

#ifdef ACPI_DISASSEMBLER
acpi_dm_disassemble(walk_state, display_op, ACPI_UINT32_MAX);
#else
/*
* The AML Disassembler is not configured - at least we can
* display the opcode value and name
*/
acpi_os_printf("AML Opcode: %4.4X %s\n", op->common.aml_opcode,
acpi_ps_get_opcode_name(op->common.aml_opcode));
#endif

if ((op->common.aml_opcode == AML_IF_OP) ||
Expand Down
34 changes: 33 additions & 1 deletion drivers/acpi/acpica/dsfield.c
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,10 @@
#include "acnamesp.h"
#include "acparser.h"

#ifdef ACPI_EXEC_APP
#include "aecommon.h"
#endif

#define _COMPONENT ACPI_DISPATCHER
ACPI_MODULE_NAME("dsfield")

Expand Down Expand Up @@ -259,6 +263,13 @@ acpi_ds_get_field_names(struct acpi_create_field_info *info,
u64 position;
union acpi_parse_object *child;

#ifdef ACPI_EXEC_APP
u64 value = 0;
union acpi_operand_object *result_desc;
union acpi_operand_object *obj_desc;
char *name_path;
#endif

ACPI_FUNCTION_TRACE_PTR(ds_get_field_names, info);

/* First field starts at bit zero */
Expand Down Expand Up @@ -391,6 +402,25 @@ acpi_ds_get_field_names(struct acpi_create_field_info *info,
if (ACPI_FAILURE(status)) {
return_ACPI_STATUS(status);
}
#ifdef ACPI_EXEC_APP
name_path =
acpi_ns_get_external_pathname(info->
field_node);
obj_desc =
acpi_ut_create_integer_object
(value);
if (ACPI_SUCCESS
(ae_lookup_init_file_entry
(name_path, &value))) {
acpi_ex_write_data_to_field
(obj_desc,
acpi_ns_get_attached_object
(info->field_node),
&result_desc);
}
acpi_ut_remove_reference(obj_desc);
ACPI_FREE(name_path);
#endif
}
}

Expand Down Expand Up @@ -573,7 +603,9 @@ acpi_ds_init_field_objects(union acpi_parse_object *op,
!(walk_state->parse_flags & ACPI_PARSE_MODULE_LEVEL)) {
flags |= ACPI_NS_TEMPORARY;
}

#ifdef ACPI_EXEC_APP
flags |= ACPI_NS_OVERRIDE_IF_FOUND;
#endif
/*
* Walk the list of entries in the field_list
* Note: field_list can be of zero length. In this case, Arg will be NULL.
Expand Down
9 changes: 7 additions & 2 deletions drivers/acpi/acpica/hwregs.c
Original file line number Diff line number Diff line change
Expand Up @@ -528,13 +528,18 @@ acpi_status acpi_hw_register_read(u32 register_id, u32 *return_value)

status =
acpi_hw_read(&value64, &acpi_gbl_FADT.xpm2_control_block);
value = (u32)value64;
if (ACPI_SUCCESS(status)) {
value = (u32)value64;
}
break;

case ACPI_REGISTER_PM_TIMER: /* 32-bit access */

status = acpi_hw_read(&value64, &acpi_gbl_FADT.xpm_timer_block);
value = (u32)value64;
if (ACPI_SUCCESS(status)) {
value = (u32)value64;
}

break;

case ACPI_REGISTER_SMI_COMMAND_BLOCK: /* 8-bit access */
Expand Down
11 changes: 3 additions & 8 deletions drivers/acpi/acpica/hwsleep.c
Original file line number Diff line number Diff line change
Expand Up @@ -56,14 +56,9 @@ acpi_status acpi_hw_legacy_sleep(u8 sleep_state)
if (ACPI_FAILURE(status)) {
return_ACPI_STATUS(status);
}
/*
* If the target sleep state is S5, clear all GPEs and fixed events too
*/
if (sleep_state == ACPI_STATE_S5) {
status = acpi_hw_clear_acpi_status();
if (ACPI_FAILURE(status)) {
return_ACPI_STATUS(status);
}
status = acpi_hw_clear_acpi_status();
if (ACPI_FAILURE(status)) {
return_ACPI_STATUS(status);
}
acpi_gbl_system_awake_and_running = FALSE;

Expand Down
13 changes: 13 additions & 0 deletions drivers/acpi/acpica/nsaccess.c
Original file line number Diff line number Diff line change
Expand Up @@ -558,6 +558,14 @@ acpi_ns_lookup(union acpi_generic_state *scope_info,
(char *)&current_node->name,
current_node));
}
#ifdef ACPI_EXEC_APP
if ((status == AE_ALREADY_EXISTS) &&
(this_node->flags & ANOBJ_NODE_EARLY_INIT)) {
this_node->flags &= ~ANOBJ_NODE_EARLY_INIT;
status = AE_OK;
}
#endif

#ifdef ACPI_ASL_COMPILER
/*
* If this ACPI name already exists within the namespace as an
Expand Down Expand Up @@ -676,6 +684,11 @@ acpi_ns_lookup(union acpi_generic_state *scope_info,
}
}
}
#ifdef ACPI_EXEC_APP
if (flags & ACPI_NS_EARLY_INIT) {
this_node->flags |= ANOBJ_NODE_EARLY_INIT;
}
#endif

*return_node = this_node;
return_ACPI_STATUS(AE_OK);
Expand Down
43 changes: 24 additions & 19 deletions drivers/acpi/acpica/psloop.c
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
#include "acdispat.h"
#include "amlcode.h"
#include "acconvert.h"
#include "acnamesp.h"

#define _COMPONENT ACPI_PARSER
ACPI_MODULE_NAME("psloop")
Expand Down Expand Up @@ -527,21 +528,25 @@ 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 (acpi_ns_opens_scope
(acpi_ps_get_opcode_info
(walk_state->opcode)->object_type)) {
/*
* 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.
* If the scope/device op fails to parse, skip the body of
* the scope op because the parse failure indicates that
* the device may not exist.
*/
ACPI_ERROR((AE_INFO,
"Skip parsing opcode %s",
acpi_ps_get_opcode_name
(walk_state->opcode)));
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 @@ -709,20 +714,20 @@ acpi_status acpi_ps_parse_loop(struct acpi_walk_state *walk_state)
} else
if ((walk_state->
parse_flags & ACPI_PARSE_MODULE_LEVEL)
&& status != AE_CTRL_TRANSFER
&& ACPI_FAILURE(status)) {
&& (ACPI_AML_EXCEPTION(status)
|| status == AE_ALREADY_EXISTS
|| status == AE_NOT_FOUND)) {
/*
* ACPI_PARSE_MODULE_LEVEL flag means that we are currently
* loading a table by executing it as a control method.
* However, if we encounter an error while loading the table,
* we need to keep trying to load the table rather than
* aborting the table load (setting the status to AE_OK
* continues the table load). If we get a failure at this
* point, it means that the dispatcher got an error while
* processing Op (most likely an AML operand error) or a
* control method was called from module level and the
* dispatcher returned AE_CTRL_TRANSFER. In the latter case,
* leave the status alone, there's nothing wrong with it.
* ACPI_PARSE_MODULE_LEVEL flag means that we
* are currently loading a table by executing
* it as a control method. However, if we
* encounter an error while loading the table,
* we need to keep trying to load the table
* rather than aborting the table load (setting
* the status to AE_OK continues the table
* load). If we get a failure at this point, it
* means that the dispatcher got an error while
* trying to execute the Op.
*/
status = AE_OK;
}
Expand Down
4 changes: 2 additions & 2 deletions drivers/acpi/acpica/tbdata.c
Original file line number Diff line number Diff line change
Expand Up @@ -516,9 +516,9 @@ acpi_tb_verify_temp_table(struct acpi_table_desc *table_desc,
acpi_tb_check_duplication(table_desc, table_index);
if (ACPI_FAILURE(status)) {
if (status != AE_CTRL_TERMINATE) {
ACPI_EXCEPTION((AE_INFO, AE_NO_MEMORY,
ACPI_EXCEPTION((AE_INFO, status,
"%4.4s 0x%8.8X%8.8X"
" Table is duplicated",
" Table is already loaded",
acpi_ut_valid_nameseg
(table_desc->signature.
ascii) ? table_desc->
Expand Down
7 changes: 5 additions & 2 deletions drivers/acpi/acpica/utdelete.c
Original file line number Diff line number Diff line change
Expand Up @@ -355,6 +355,7 @@ acpi_ut_update_ref_count(union acpi_operand_object *object, u32 action)
u16 original_count;
u16 new_count = 0;
acpi_cpu_flags lock_flags;
char *message;

ACPI_FUNCTION_NAME(ut_update_ref_count);

Expand Down Expand Up @@ -391,6 +392,7 @@ acpi_ut_update_ref_count(union acpi_operand_object *object, u32 action)
object, object->common.type,
acpi_ut_get_object_type_name(object),
new_count));
message = "Incremement";
break;

case REF_DECREMENT:
Expand Down Expand Up @@ -420,6 +422,7 @@ acpi_ut_update_ref_count(union acpi_operand_object *object, u32 action)
if (new_count == 0) {
acpi_ut_delete_internal_obj(object);
}
message = "Decrement";
break;

default:
Expand All @@ -436,8 +439,8 @@ acpi_ut_update_ref_count(union acpi_operand_object *object, u32 action)
*/
if (new_count > ACPI_MAX_REFERENCE_COUNT) {
ACPI_WARNING((AE_INFO,
"Large Reference Count (0x%X) in object %p, Type=0x%.2X",
new_count, object, object->common.type));
"Large Reference Count (0x%X) in object %p, Type=0x%.2X Operation=%s",
new_count, object, object->common.type, message));
}
}

Expand Down
Loading

0 comments on commit df2def4

Please sign in to comment.