📄 uteval.c
字号:
status = acpi_ut_evaluate_object(device_node, METHOD_NAME__HID, ACPI_BTYPE_INTEGER | ACPI_BTYPE_STRING, &obj_desc); if (ACPI_FAILURE(status)) { return_ACPI_STATUS(status); } if (ACPI_GET_OBJECT_TYPE(obj_desc) == ACPI_TYPE_INTEGER) { /* Convert the Numeric HID to string */ acpi_ex_eisa_id_to_string((u32) obj_desc->integer.value, hid->value); } else { /* Copy the String HID from the returned object */ acpi_ut_copy_id_string(hid->value, obj_desc->string.pointer, sizeof(hid->value)); } /* On exit, we must delete the return object */ acpi_ut_remove_reference(obj_desc); return_ACPI_STATUS(status);}/******************************************************************************* * * FUNCTION: acpi_ut_translate_one_cid * * PARAMETERS: obj_desc - _CID object, must be integer or string * one_cid - Where the CID string is returned * * RETURN: Status * * DESCRIPTION: Return a numeric or string _CID value as a string. * (Compatible ID) * * NOTE: Assumes a maximum _CID string length of * ACPI_MAX_CID_LENGTH. * ******************************************************************************/static acpi_statusacpi_ut_translate_one_cid(union acpi_operand_object *obj_desc, struct acpi_compatible_id *one_cid){ switch (ACPI_GET_OBJECT_TYPE(obj_desc)) { case ACPI_TYPE_INTEGER: /* Convert the Numeric CID to string */ acpi_ex_eisa_id_to_string((u32) obj_desc->integer.value, one_cid->value); return (AE_OK); case ACPI_TYPE_STRING: if (obj_desc->string.length > ACPI_MAX_CID_LENGTH) { return (AE_AML_STRING_LIMIT); } /* Copy the String CID from the returned object */ acpi_ut_copy_id_string(one_cid->value, obj_desc->string.pointer, ACPI_MAX_CID_LENGTH); return (AE_OK); default: return (AE_TYPE); }}/******************************************************************************* * * FUNCTION: acpi_ut_execute_CID * * PARAMETERS: device_node - Node for the device * return_cid_list - Where the CID list is returned * * RETURN: Status * * DESCRIPTION: Executes the _CID control method that returns one or more * compatible hardware IDs for the device. * * NOTE: Internal function, no parameter validation * ******************************************************************************/acpi_statusacpi_ut_execute_CID(struct acpi_namespace_node * device_node, struct acpi_compatible_id_list ** return_cid_list){ union acpi_operand_object *obj_desc; acpi_status status; u32 count; u32 size; struct acpi_compatible_id_list *cid_list; acpi_native_uint i; ACPI_FUNCTION_TRACE("ut_execute_CID"); /* Evaluate the _CID method for this device */ status = acpi_ut_evaluate_object(device_node, METHOD_NAME__CID, ACPI_BTYPE_INTEGER | ACPI_BTYPE_STRING | ACPI_BTYPE_PACKAGE, &obj_desc); if (ACPI_FAILURE(status)) { return_ACPI_STATUS(status); } /* Get the number of _CIDs returned */ count = 1; if (ACPI_GET_OBJECT_TYPE(obj_desc) == ACPI_TYPE_PACKAGE) { count = obj_desc->package.count; } /* Allocate a worst-case buffer for the _CIDs */ size = (((count - 1) * sizeof(struct acpi_compatible_id)) + sizeof(struct acpi_compatible_id_list)); cid_list = ACPI_MEM_CALLOCATE((acpi_size) size); if (!cid_list) { return_ACPI_STATUS(AE_NO_MEMORY); } /* Init CID list */ cid_list->count = count; cid_list->size = size; /* * A _CID can return either a single compatible ID or a package of * compatible IDs. Each compatible ID can be one of the following: * 1) Integer (32 bit compressed EISA ID) or * 2) String (PCI ID format, e.g. "PCI\VEN_vvvv&DEV_dddd&SUBSYS_ssssssss") */ /* The _CID object can be either a single CID or a package (list) of CIDs */ if (ACPI_GET_OBJECT_TYPE(obj_desc) == ACPI_TYPE_PACKAGE) { /* Translate each package element */ for (i = 0; i < count; i++) { status = acpi_ut_translate_one_cid(obj_desc->package. elements[i], &cid_list->id[i]); if (ACPI_FAILURE(status)) { break; } } } else { /* Only one CID, translate to a string */ status = acpi_ut_translate_one_cid(obj_desc, cid_list->id); } /* Cleanup on error */ if (ACPI_FAILURE(status)) { ACPI_MEM_FREE(cid_list); } else { *return_cid_list = cid_list; } /* On exit, we must delete the _CID return object */ acpi_ut_remove_reference(obj_desc); return_ACPI_STATUS(status);}/******************************************************************************* * * FUNCTION: acpi_ut_execute_UID * * PARAMETERS: device_node - Node for the device * Uid - Where the UID is returned * * RETURN: Status * * DESCRIPTION: Executes the _UID control method that returns the hardware * ID of the device. * * NOTE: Internal function, no parameter validation * ******************************************************************************/acpi_statusacpi_ut_execute_UID(struct acpi_namespace_node *device_node, struct acpi_device_id *uid){ union acpi_operand_object *obj_desc; acpi_status status; ACPI_FUNCTION_TRACE("ut_execute_UID"); status = acpi_ut_evaluate_object(device_node, METHOD_NAME__UID, ACPI_BTYPE_INTEGER | ACPI_BTYPE_STRING, &obj_desc); if (ACPI_FAILURE(status)) { return_ACPI_STATUS(status); } if (ACPI_GET_OBJECT_TYPE(obj_desc) == ACPI_TYPE_INTEGER) { /* Convert the Numeric UID to string */ acpi_ex_unsigned_integer_to_string(obj_desc->integer.value, uid->value); } else { /* Copy the String UID from the returned object */ acpi_ut_copy_id_string(uid->value, obj_desc->string.pointer, sizeof(uid->value)); } /* On exit, we must delete the return object */ acpi_ut_remove_reference(obj_desc); return_ACPI_STATUS(status);}/******************************************************************************* * * FUNCTION: acpi_ut_execute_STA * * PARAMETERS: device_node - Node for the device * Flags - Where the status flags are returned * * RETURN: Status * * DESCRIPTION: Executes _STA for selected device and stores results in * *Flags. * * NOTE: Internal function, no parameter validation * ******************************************************************************/acpi_statusacpi_ut_execute_STA(struct acpi_namespace_node *device_node, u32 * flags){ union acpi_operand_object *obj_desc; acpi_status status; ACPI_FUNCTION_TRACE("ut_execute_STA"); status = acpi_ut_evaluate_object(device_node, METHOD_NAME__STA, ACPI_BTYPE_INTEGER, &obj_desc); if (ACPI_FAILURE(status)) { if (AE_NOT_FOUND == status) { ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "_STA on %4.4s was not found, assuming device is present\n", acpi_ut_get_node_name(device_node))); *flags = 0x0F; status = AE_OK; } return_ACPI_STATUS(status); } /* Extract the status flags */ *flags = (u32) obj_desc->integer.value; /* On exit, we must delete the return object */ acpi_ut_remove_reference(obj_desc); return_ACPI_STATUS(status);}/******************************************************************************* * * FUNCTION: acpi_ut_execute_Sxds * * PARAMETERS: device_node - Node for the device * Flags - Where the status flags are returned * * RETURN: Status * * DESCRIPTION: Executes _STA for selected device and stores results in * *Flags. * * NOTE: Internal function, no parameter validation * ******************************************************************************/acpi_statusacpi_ut_execute_sxds(struct acpi_namespace_node *device_node, u8 * highest){ union acpi_operand_object *obj_desc; acpi_status status; u32 i; ACPI_FUNCTION_TRACE("ut_execute_Sxds"); for (i = 0; i < 4; i++) { highest[i] = 0xFF; status = acpi_ut_evaluate_object(device_node, (char *) acpi_gbl_highest_dstate_names [i], ACPI_BTYPE_INTEGER, &obj_desc); if (ACPI_FAILURE(status)) { if (status != AE_NOT_FOUND) { ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "%s on Device %4.4s, %s\n", (char *) acpi_gbl_highest_dstate_names [i], acpi_ut_get_node_name (device_node), acpi_format_exception (status))); return_ACPI_STATUS(status); } } else { /* Extract the Dstate value */ highest[i] = (u8) obj_desc->integer.value; /* Delete the return object */ acpi_ut_remove_reference(obj_desc); } } return_ACPI_STATUS(AE_OK);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -