Merge branches 'acpica' and 'acpi-scan'
* acpica: ACPICA: Update version to 20201113 ACPICA: Interpreter: fix memory leak by using existing buffer ACPICA: Add function trace macros to improve debugging ACPICA: Also handle "orphan" _REG methods for GPIO OpRegions ACPICA: Remove extreaneous "the" in comments ACPICA: Add 5 new UUIDs to the known UUID table * acpi-scan: ACPI: scan: Fix up _DEP-related terminology with supplier/consumer ACPI: scan: Drop INT3396 from acpi_ignore_dep_ids[] ACPI: scan: Add PNP0D80 to the _DEP exceptions list ACPI: scan: Call acpi_get_object_info() from acpi_add_single_object() ACPI: scan: Add acpi_info_matches_hids() helper
This commit is contained in:
commit
b85195b7ec
@ -13,7 +13,7 @@
|
||||
/*
|
||||
* Common set of includes for all ACPICA source files.
|
||||
* We put them here because we don't want to duplicate them
|
||||
* in the the source code again and again.
|
||||
* in the source code again and again.
|
||||
*
|
||||
* Note: The order of these include files is important.
|
||||
*/
|
||||
|
@ -21,7 +21,8 @@ extern u8 acpi_gbl_default_address_spaces[];
|
||||
/* Local prototypes */
|
||||
|
||||
static void
|
||||
acpi_ev_orphan_ec_reg_method(struct acpi_namespace_node *ec_device_node);
|
||||
acpi_ev_execute_orphan_reg_method(struct acpi_namespace_node *device_node,
|
||||
acpi_adr_space_type space_id);
|
||||
|
||||
static acpi_status
|
||||
acpi_ev_reg_run(acpi_handle obj_handle,
|
||||
@ -684,10 +685,12 @@ acpi_ev_execute_reg_methods(struct acpi_namespace_node *node,
|
||||
ACPI_NS_WALK_UNLOCK, acpi_ev_reg_run, NULL,
|
||||
&info, NULL);
|
||||
|
||||
/* Special case for EC: handle "orphan" _REG methods with no region */
|
||||
|
||||
if (space_id == ACPI_ADR_SPACE_EC) {
|
||||
acpi_ev_orphan_ec_reg_method(node);
|
||||
/*
|
||||
* Special case for EC and GPIO: handle "orphan" _REG methods with
|
||||
* no region.
|
||||
*/
|
||||
if (space_id == ACPI_ADR_SPACE_EC || space_id == ACPI_ADR_SPACE_GPIO) {
|
||||
acpi_ev_execute_orphan_reg_method(node, space_id);
|
||||
}
|
||||
|
||||
ACPI_DEBUG_PRINT_RAW((ACPI_DB_NAMES,
|
||||
@ -760,31 +763,28 @@ acpi_ev_reg_run(acpi_handle obj_handle,
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ev_orphan_ec_reg_method
|
||||
* FUNCTION: acpi_ev_execute_orphan_reg_method
|
||||
*
|
||||
* PARAMETERS: ec_device_node - Namespace node for an EC device
|
||||
* PARAMETERS: device_node - Namespace node for an ACPI device
|
||||
* space_id - The address space ID
|
||||
*
|
||||
* RETURN: None
|
||||
*
|
||||
* DESCRIPTION: Execute an "orphan" _REG method that appears under the EC
|
||||
* DESCRIPTION: Execute an "orphan" _REG method that appears under an ACPI
|
||||
* device. This is a _REG method that has no corresponding region
|
||||
* within the EC device scope. The orphan _REG method appears to
|
||||
* have been enabled by the description of the ECDT in the ACPI
|
||||
* specification: "The availability of the region space can be
|
||||
* detected by providing a _REG method object underneath the
|
||||
* Embedded Controller device."
|
||||
*
|
||||
* To quickly access the EC device, we use the ec_device_node used
|
||||
* during EC handler installation. Otherwise, we would need to
|
||||
* perform a time consuming namespace walk, executing _HID
|
||||
* methods to find the EC device.
|
||||
* within the device's scope. ACPI tables depending on these
|
||||
* "orphan" _REG methods have been seen for both EC and GPIO
|
||||
* Operation Regions. Presumably the Windows ACPI implementation
|
||||
* always calls the _REG method independent of the presence of
|
||||
* an actual Operation Region with the correct address space ID.
|
||||
*
|
||||
* MUTEX: Assumes the namespace is locked
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
static void
|
||||
acpi_ev_orphan_ec_reg_method(struct acpi_namespace_node *ec_device_node)
|
||||
acpi_ev_execute_orphan_reg_method(struct acpi_namespace_node *device_node,
|
||||
acpi_adr_space_type space_id)
|
||||
{
|
||||
acpi_handle reg_method;
|
||||
struct acpi_namespace_node *next_node;
|
||||
@ -792,9 +792,9 @@ acpi_ev_orphan_ec_reg_method(struct acpi_namespace_node *ec_device_node)
|
||||
struct acpi_object_list args;
|
||||
union acpi_object objects[2];
|
||||
|
||||
ACPI_FUNCTION_TRACE(ev_orphan_ec_reg_method);
|
||||
ACPI_FUNCTION_TRACE(ev_execute_orphan_reg_method);
|
||||
|
||||
if (!ec_device_node) {
|
||||
if (!device_node) {
|
||||
return_VOID;
|
||||
}
|
||||
|
||||
@ -804,7 +804,7 @@ acpi_ev_orphan_ec_reg_method(struct acpi_namespace_node *ec_device_node)
|
||||
|
||||
/* Get a handle to a _REG method immediately under the EC device */
|
||||
|
||||
status = acpi_get_handle(ec_device_node, METHOD_NAME__REG, ®_method);
|
||||
status = acpi_get_handle(device_node, METHOD_NAME__REG, ®_method);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
goto exit; /* There is no _REG method present */
|
||||
}
|
||||
@ -816,23 +816,23 @@ acpi_ev_orphan_ec_reg_method(struct acpi_namespace_node *ec_device_node)
|
||||
* with other space IDs to be present; but the code below will then
|
||||
* execute the _REG method with the embedded_control space_ID argument.
|
||||
*/
|
||||
next_node = acpi_ns_get_next_node(ec_device_node, NULL);
|
||||
next_node = acpi_ns_get_next_node(device_node, NULL);
|
||||
while (next_node) {
|
||||
if ((next_node->type == ACPI_TYPE_REGION) &&
|
||||
(next_node->object) &&
|
||||
(next_node->object->region.space_id == ACPI_ADR_SPACE_EC)) {
|
||||
(next_node->object->region.space_id == space_id)) {
|
||||
goto exit; /* Do not execute the _REG */
|
||||
}
|
||||
|
||||
next_node = acpi_ns_get_next_node(ec_device_node, next_node);
|
||||
next_node = acpi_ns_get_next_node(device_node, next_node);
|
||||
}
|
||||
|
||||
/* Evaluate the _REG(embedded_control,Connect) method */
|
||||
/* Evaluate the _REG(space_id,Connect) method */
|
||||
|
||||
args.count = 2;
|
||||
args.pointer = objects;
|
||||
objects[0].type = ACPI_TYPE_INTEGER;
|
||||
objects[0].integer.value = ACPI_ADR_SPACE_EC;
|
||||
objects[0].integer.value = space_id;
|
||||
objects[1].type = ACPI_TYPE_INTEGER;
|
||||
objects[1].integer.value = ACPI_REG_CONNECT;
|
||||
|
||||
|
@ -71,11 +71,13 @@ acpi_ns_check_return_value(struct acpi_namespace_node *node,
|
||||
acpi_status status;
|
||||
const union acpi_predefined_info *predefined;
|
||||
|
||||
ACPI_FUNCTION_TRACE(ns_check_return_value);
|
||||
|
||||
/* If not a predefined name, we cannot validate the return object */
|
||||
|
||||
predefined = info->predefined;
|
||||
if (!predefined) {
|
||||
return (AE_OK);
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -83,7 +85,7 @@ acpi_ns_check_return_value(struct acpi_namespace_node *node,
|
||||
* validate the return object
|
||||
*/
|
||||
if ((return_status != AE_OK) && (return_status != AE_CTRL_RETURN_VALUE)) {
|
||||
return (AE_OK);
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -102,7 +104,7 @@ acpi_ns_check_return_value(struct acpi_namespace_node *node,
|
||||
if (acpi_gbl_disable_auto_repair ||
|
||||
(!predefined->info.expected_btypes) ||
|
||||
(predefined->info.expected_btypes == ACPI_RTYPE_ALL)) {
|
||||
return (AE_OK);
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -163,7 +165,7 @@ exit:
|
||||
node->flags |= ANOBJ_EVALUATED;
|
||||
}
|
||||
|
||||
return (status);
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
|
@ -59,7 +59,7 @@ acpi_ns_check_package(struct acpi_evaluate_info *info,
|
||||
u32 count;
|
||||
u32 i;
|
||||
|
||||
ACPI_FUNCTION_NAME(ns_check_package);
|
||||
ACPI_FUNCTION_TRACE(ns_check_package);
|
||||
|
||||
/* The package info for this name is in the next table entry */
|
||||
|
||||
@ -88,14 +88,14 @@ acpi_ns_check_package(struct acpi_evaluate_info *info,
|
||||
*/
|
||||
if (!count) {
|
||||
if (package->ret_info.type == ACPI_PTYPE1_VAR) {
|
||||
return (AE_OK);
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
}
|
||||
|
||||
ACPI_WARN_PREDEFINED((AE_INFO, info->full_pathname,
|
||||
info->node_flags,
|
||||
"Return Package has no elements (empty)"));
|
||||
|
||||
return (AE_AML_OPERAND_VALUE);
|
||||
return_ACPI_STATUS(AE_AML_OPERAND_VALUE);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -152,7 +152,7 @@ acpi_ns_check_package(struct acpi_evaluate_info *info,
|
||||
package->ret_info.
|
||||
object_type1, i);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
elements++;
|
||||
@ -186,7 +186,7 @@ acpi_ns_check_package(struct acpi_evaluate_info *info,
|
||||
object_type[i],
|
||||
i);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
} else {
|
||||
/* These are the optional package elements */
|
||||
@ -198,7 +198,7 @@ acpi_ns_check_package(struct acpi_evaluate_info *info,
|
||||
tail_object_type,
|
||||
i);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
}
|
||||
|
||||
@ -214,7 +214,7 @@ acpi_ns_check_package(struct acpi_evaluate_info *info,
|
||||
acpi_ns_check_object_type(info, elements,
|
||||
ACPI_RTYPE_INTEGER, 0);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
elements++;
|
||||
@ -234,7 +234,7 @@ acpi_ns_check_package(struct acpi_evaluate_info *info,
|
||||
acpi_ns_check_object_type(info, elements,
|
||||
ACPI_RTYPE_INTEGER, 0);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -279,7 +279,7 @@ acpi_ns_check_package(struct acpi_evaluate_info *info,
|
||||
acpi_ns_wrap_with_package(info, return_object,
|
||||
return_object_ptr);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
/* Update locals to point to the new package (of 1 element) */
|
||||
@ -316,7 +316,7 @@ acpi_ns_check_package(struct acpi_evaluate_info *info,
|
||||
package->ret_info.
|
||||
object_type1, 0);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
/* Validate length of the UUID buffer */
|
||||
@ -326,14 +326,14 @@ acpi_ns_check_package(struct acpi_evaluate_info *info,
|
||||
info->full_pathname,
|
||||
info->node_flags,
|
||||
"Invalid length for UUID Buffer"));
|
||||
return (AE_AML_OPERAND_VALUE);
|
||||
return_ACPI_STATUS(AE_AML_OPERAND_VALUE);
|
||||
}
|
||||
|
||||
status = acpi_ns_check_object_type(info, elements + 1,
|
||||
package->ret_info.
|
||||
object_type2, 0);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
elements += 2;
|
||||
@ -350,10 +350,10 @@ acpi_ns_check_package(struct acpi_evaluate_info *info,
|
||||
"Invalid internal return type in table entry: %X",
|
||||
package->ret_info.type));
|
||||
|
||||
return (AE_AML_INTERNAL);
|
||||
return_ACPI_STATUS(AE_AML_INTERNAL);
|
||||
}
|
||||
|
||||
return (status);
|
||||
return_ACPI_STATUS(status);
|
||||
|
||||
package_too_small:
|
||||
|
||||
@ -363,7 +363,7 @@ package_too_small:
|
||||
"Return Package is too small - found %u elements, expected %u",
|
||||
count, expected_count));
|
||||
|
||||
return (AE_AML_OPERAND_VALUE);
|
||||
return_ACPI_STATUS(AE_AML_OPERAND_VALUE);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
@ -708,6 +708,8 @@ acpi_ns_check_package_elements(struct acpi_evaluate_info *info,
|
||||
acpi_status status;
|
||||
u32 i;
|
||||
|
||||
ACPI_FUNCTION_TRACE(ns_check_package_elements);
|
||||
|
||||
/*
|
||||
* Up to two groups of package elements are supported by the data
|
||||
* structure. All elements in each group must be of the same type.
|
||||
@ -717,7 +719,7 @@ acpi_ns_check_package_elements(struct acpi_evaluate_info *info,
|
||||
status = acpi_ns_check_object_type(info, this_element,
|
||||
type1, i + start_index);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
this_element++;
|
||||
@ -728,11 +730,11 @@ acpi_ns_check_package_elements(struct acpi_evaluate_info *info,
|
||||
type2,
|
||||
(i + count1 + start_index));
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
this_element++;
|
||||
}
|
||||
|
||||
return (AE_OK);
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
}
|
||||
|
@ -155,15 +155,17 @@ acpi_ns_complex_repairs(struct acpi_evaluate_info *info,
|
||||
const struct acpi_repair_info *predefined;
|
||||
acpi_status status;
|
||||
|
||||
ACPI_FUNCTION_TRACE(ns_complex_repairs);
|
||||
|
||||
/* Check if this name is in the list of repairable names */
|
||||
|
||||
predefined = acpi_ns_match_complex_repair(node);
|
||||
if (!predefined) {
|
||||
return (validate_status);
|
||||
return_ACPI_STATUS(validate_status);
|
||||
}
|
||||
|
||||
status = predefined->repair_function(info, return_object_ptr);
|
||||
return (status);
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
@ -344,17 +346,19 @@ acpi_ns_repair_CID(struct acpi_evaluate_info *info,
|
||||
u16 original_ref_count;
|
||||
u32 i;
|
||||
|
||||
ACPI_FUNCTION_TRACE(ns_repair_CID);
|
||||
|
||||
/* Check for _CID as a simple string */
|
||||
|
||||
if (return_object->common.type == ACPI_TYPE_STRING) {
|
||||
status = acpi_ns_repair_HID(info, return_object_ptr);
|
||||
return (status);
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
/* Exit if not a Package */
|
||||
|
||||
if (return_object->common.type != ACPI_TYPE_PACKAGE) {
|
||||
return (AE_OK);
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
}
|
||||
|
||||
/* Examine each element of the _CID package */
|
||||
@ -366,7 +370,7 @@ acpi_ns_repair_CID(struct acpi_evaluate_info *info,
|
||||
|
||||
status = acpi_ns_repair_HID(info, element_ptr);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
if (original_element != *element_ptr) {
|
||||
@ -380,7 +384,7 @@ acpi_ns_repair_CID(struct acpi_evaluate_info *info,
|
||||
element_ptr++;
|
||||
}
|
||||
|
||||
return (AE_OK);
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
@ -491,16 +495,15 @@ acpi_ns_repair_HID(struct acpi_evaluate_info *info,
|
||||
union acpi_operand_object **return_object_ptr)
|
||||
{
|
||||
union acpi_operand_object *return_object = *return_object_ptr;
|
||||
union acpi_operand_object *new_string;
|
||||
char *source;
|
||||
char *dest;
|
||||
char *source;
|
||||
|
||||
ACPI_FUNCTION_NAME(ns_repair_HID);
|
||||
|
||||
/* We only care about string _HID objects (not integers) */
|
||||
|
||||
if (return_object->common.type != ACPI_TYPE_STRING) {
|
||||
return (AE_OK);
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
}
|
||||
|
||||
if (return_object->string.length == 0) {
|
||||
@ -511,14 +514,7 @@ acpi_ns_repair_HID(struct acpi_evaluate_info *info,
|
||||
/* Return AE_OK anyway, let driver handle it */
|
||||
|
||||
info->return_flags |= ACPI_OBJECT_REPAIRED;
|
||||
return (AE_OK);
|
||||
}
|
||||
|
||||
/* It is simplest to always create a new string object */
|
||||
|
||||
new_string = acpi_ut_create_string_object(return_object->string.length);
|
||||
if (!new_string) {
|
||||
return (AE_NO_MEMORY);
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -530,7 +526,7 @@ acpi_ns_repair_HID(struct acpi_evaluate_info *info,
|
||||
source = return_object->string.pointer;
|
||||
if (*source == '*') {
|
||||
source++;
|
||||
new_string->string.length--;
|
||||
return_object->string.length--;
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_REPAIR,
|
||||
"%s: Removed invalid leading asterisk\n",
|
||||
@ -545,13 +541,12 @@ acpi_ns_repair_HID(struct acpi_evaluate_info *info,
|
||||
* "NNNN####" where N is an uppercase letter or decimal digit, and
|
||||
* # is a hex digit.
|
||||
*/
|
||||
for (dest = new_string->string.pointer; *source; dest++, source++) {
|
||||
for (dest = return_object->string.pointer; *source; dest++, source++) {
|
||||
*dest = (char)toupper((int)*source);
|
||||
}
|
||||
return_object->string.pointer[return_object->string.length] = 0;
|
||||
|
||||
acpi_ut_remove_reference(return_object);
|
||||
*return_object_ptr = new_string;
|
||||
return (AE_OK);
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
|
@ -105,7 +105,8 @@ struct acpi_device_bus_id {
|
||||
int acpi_device_add(struct acpi_device *device,
|
||||
void (*release)(struct device *));
|
||||
void acpi_init_device_object(struct acpi_device *device, acpi_handle handle,
|
||||
int type, unsigned long long sta);
|
||||
int type, unsigned long long sta,
|
||||
struct acpi_device_info *info);
|
||||
int acpi_device_setup_files(struct acpi_device *dev);
|
||||
void acpi_device_remove_files(struct acpi_device *dev);
|
||||
void acpi_device_add_finalize(struct acpi_device *device);
|
||||
|
@ -939,7 +939,7 @@ int acpi_add_power_resource(acpi_handle handle)
|
||||
|
||||
device = &resource->device;
|
||||
acpi_init_device_object(device, handle, ACPI_BUS_TYPE_POWER,
|
||||
ACPI_STA_DEFAULT);
|
||||
ACPI_STA_DEFAULT, NULL);
|
||||
mutex_init(&resource->resource_lock);
|
||||
INIT_LIST_HEAD(&resource->list_node);
|
||||
INIT_LIST_HEAD(&resource->dependents);
|
||||
|
@ -51,8 +51,8 @@ static u64 spcr_uart_addr;
|
||||
|
||||
struct acpi_dep_data {
|
||||
struct list_head node;
|
||||
acpi_handle master;
|
||||
acpi_handle slave;
|
||||
acpi_handle supplier;
|
||||
acpi_handle consumer;
|
||||
};
|
||||
|
||||
void acpi_scan_lock_acquire(void)
|
||||
@ -719,6 +719,42 @@ int acpi_device_add(struct acpi_device *device,
|
||||
/* --------------------------------------------------------------------------
|
||||
Device Enumeration
|
||||
-------------------------------------------------------------------------- */
|
||||
static bool acpi_info_matches_ids(struct acpi_device_info *info,
|
||||
const char * const ids[])
|
||||
{
|
||||
struct acpi_pnp_device_id_list *cid_list = NULL;
|
||||
int i;
|
||||
|
||||
if (!(info->valid & ACPI_VALID_HID))
|
||||
return false;
|
||||
|
||||
if (info->valid & ACPI_VALID_CID)
|
||||
cid_list = &info->compatible_id_list;
|
||||
|
||||
for (i = 0; ids[i]; i++) {
|
||||
int j;
|
||||
|
||||
if (!strcmp(info->hardware_id.string, ids[i]))
|
||||
return true;
|
||||
|
||||
if (!cid_list)
|
||||
continue;
|
||||
|
||||
for (j = 0; j < cid_list->count; j++) {
|
||||
if (!strcmp(cid_list->ids[j].string, ids[i]))
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/* List of HIDs for which we ignore matching ACPI devices, when checking _DEP lists. */
|
||||
static const char * const acpi_ignore_dep_ids[] = {
|
||||
"PNP0D80", /* Windows-compatible System Power Management Controller */
|
||||
NULL
|
||||
};
|
||||
|
||||
static struct acpi_device *acpi_bus_get_parent(acpi_handle handle)
|
||||
{
|
||||
struct acpi_device *device = NULL;
|
||||
@ -1236,10 +1272,8 @@ static bool acpi_object_is_system_bus(acpi_handle handle)
|
||||
}
|
||||
|
||||
static void acpi_set_pnp_ids(acpi_handle handle, struct acpi_device_pnp *pnp,
|
||||
int device_type)
|
||||
int device_type, struct acpi_device_info *info)
|
||||
{
|
||||
acpi_status status;
|
||||
struct acpi_device_info *info;
|
||||
struct acpi_pnp_device_id_list *cid_list;
|
||||
int i;
|
||||
|
||||
@ -1250,8 +1284,7 @@ static void acpi_set_pnp_ids(acpi_handle handle, struct acpi_device_pnp *pnp,
|
||||
break;
|
||||
}
|
||||
|
||||
status = acpi_get_object_info(handle, &info);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
if (!info) {
|
||||
pr_err(PREFIX "%s: Error reading device info\n",
|
||||
__func__);
|
||||
return;
|
||||
@ -1276,8 +1309,6 @@ static void acpi_set_pnp_ids(acpi_handle handle, struct acpi_device_pnp *pnp,
|
||||
if (info->valid & ACPI_VALID_CLS)
|
||||
acpi_add_id(pnp, info->class_code.string);
|
||||
|
||||
kfree(info);
|
||||
|
||||
/*
|
||||
* Some devices don't reliably have _HIDs & _CIDs, so add
|
||||
* synthetic HIDs to make sure drivers can find them.
|
||||
@ -1583,7 +1614,8 @@ static bool acpi_device_enumeration_by_parent(struct acpi_device *device)
|
||||
}
|
||||
|
||||
void acpi_init_device_object(struct acpi_device *device, acpi_handle handle,
|
||||
int type, unsigned long long sta)
|
||||
int type, unsigned long long sta,
|
||||
struct acpi_device_info *info)
|
||||
{
|
||||
INIT_LIST_HEAD(&device->pnp.ids);
|
||||
device->device_type = type;
|
||||
@ -1592,7 +1624,7 @@ void acpi_init_device_object(struct acpi_device *device, acpi_handle handle,
|
||||
device->fwnode.ops = &acpi_device_fwnode_ops;
|
||||
acpi_set_device_status(device, sta);
|
||||
acpi_device_get_busid(device);
|
||||
acpi_set_pnp_ids(handle, &device->pnp, type);
|
||||
acpi_set_pnp_ids(handle, &device->pnp, type, info);
|
||||
acpi_init_properties(device);
|
||||
acpi_bus_get_flags(device);
|
||||
device->flags.match_driver = false;
|
||||
@ -1620,14 +1652,20 @@ static int acpi_add_single_object(struct acpi_device **child,
|
||||
int result;
|
||||
struct acpi_device *device;
|
||||
struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
|
||||
struct acpi_device_info *info = NULL;
|
||||
|
||||
if (handle != ACPI_ROOT_OBJECT && type == ACPI_BUS_TYPE_DEVICE)
|
||||
acpi_get_object_info(handle, &info);
|
||||
|
||||
device = kzalloc(sizeof(struct acpi_device), GFP_KERNEL);
|
||||
if (!device) {
|
||||
printk(KERN_ERR PREFIX "Memory allocation error\n");
|
||||
kfree(info);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
acpi_init_device_object(device, handle, type, sta);
|
||||
acpi_init_device_object(device, handle, type, sta, info);
|
||||
kfree(info);
|
||||
/*
|
||||
* For ACPI_BUS_TYPE_DEVICE getting the status is delayed till here so
|
||||
* that we can call acpi_bus_get_status() and use its quirk handling.
|
||||
@ -1833,13 +1871,7 @@ static void acpi_device_dep_initialize(struct acpi_device *adev)
|
||||
continue;
|
||||
}
|
||||
|
||||
/*
|
||||
* Skip the dependency of Windows System Power
|
||||
* Management Controller
|
||||
*/
|
||||
skip = info->valid & ACPI_VALID_HID &&
|
||||
!strcmp(info->hardware_id.string, "INT3396");
|
||||
|
||||
skip = acpi_info_matches_ids(info, acpi_ignore_dep_ids);
|
||||
kfree(info);
|
||||
|
||||
if (skip)
|
||||
@ -1849,8 +1881,8 @@ static void acpi_device_dep_initialize(struct acpi_device *adev)
|
||||
if (!dep)
|
||||
return;
|
||||
|
||||
dep->master = dep_devices.handles[i];
|
||||
dep->slave = adev->handle;
|
||||
dep->supplier = dep_devices.handles[i];
|
||||
dep->consumer = adev->handle;
|
||||
adev->dep_unmet++;
|
||||
|
||||
mutex_lock(&acpi_dep_list_lock);
|
||||
@ -2026,8 +2058,8 @@ void acpi_walk_dep_device_list(acpi_handle handle)
|
||||
|
||||
mutex_lock(&acpi_dep_list_lock);
|
||||
list_for_each_entry_safe(dep, tmp, &acpi_dep_list, node) {
|
||||
if (dep->master == handle) {
|
||||
acpi_bus_get_device(dep->slave, &adev);
|
||||
if (dep->supplier == handle) {
|
||||
acpi_bus_get_device(dep->consumer, &adev);
|
||||
if (!adev)
|
||||
continue;
|
||||
|
||||
|
@ -12,7 +12,7 @@
|
||||
|
||||
/* Current ACPICA subsystem version in YYYYMMDD format */
|
||||
|
||||
#define ACPI_CA_VERSION 0x20200925
|
||||
#define ACPI_CA_VERSION 0x20201113
|
||||
|
||||
#include <acpi/acconfig.h>
|
||||
#include <acpi/actypes.h>
|
||||
|
@ -39,6 +39,7 @@
|
||||
|
||||
/* NVDIMM - NFIT table */
|
||||
|
||||
#define UUID_NFIT_DIMM "4309ac30-0d11-11e4-9191-0800200c9a66"
|
||||
#define UUID_VOLATILE_MEMORY "7305944f-fdda-44e3-b16c-3f22d252e5d0"
|
||||
#define UUID_PERSISTENT_MEMORY "66f0d379-b4f3-4074-ac43-0d3318b78cdb"
|
||||
#define UUID_CONTROL_REGION "92f701f6-13b4-405d-910b-299367e8234c"
|
||||
@ -47,6 +48,10 @@
|
||||
#define UUID_VOLATILE_VIRTUAL_CD "3d5abd30-4175-87ce-6d64-d2ade523c4bb"
|
||||
#define UUID_PERSISTENT_VIRTUAL_DISK "5cea02c9-4d07-69d3-269f-4496fbe096f9"
|
||||
#define UUID_PERSISTENT_VIRTUAL_CD "08018188-42cd-bb48-100f-5387d53ded3d"
|
||||
#define UUID_NFIT_DIMM_N_MSFT "1ee68b36-d4bd-4a1a-9a16-4f8e53d46e05"
|
||||
#define UUID_NFIT_DIMM_N_HPE1 "9002c334-acf3-4c0e-9642-a235f0d53bc6"
|
||||
#define UUID_NFIT_DIMM_N_HPE2 "5008664b-b758-41a0-a03c-27c2f2d04f7e"
|
||||
#define UUID_NFIT_DIMM_N_HYPERV "5746c5f2-a9a2-4264-ad0e-e4ddc9e09e80"
|
||||
|
||||
/* Processor Properties (ACPI 6.2) */
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user