|
@@ -633,25 +633,50 @@ static acpi_status __init acpi_processor_ids_walk(acpi_handle handle,
|
|
|
void **rv)
|
|
|
{
|
|
|
acpi_status status;
|
|
|
+ acpi_object_type acpi_type;
|
|
|
+ unsigned long long uid;
|
|
|
union acpi_object object = { 0 };
|
|
|
struct acpi_buffer buffer = { sizeof(union acpi_object), &object };
|
|
|
|
|
|
- status = acpi_evaluate_object(handle, NULL, NULL, &buffer);
|
|
|
+ status = acpi_get_type(handle, &acpi_type);
|
|
|
if (ACPI_FAILURE(status))
|
|
|
- acpi_handle_info(handle, "Not get the processor object\n");
|
|
|
- else
|
|
|
- processor_validated_ids_update(object.processor.proc_id);
|
|
|
+ return false;
|
|
|
+
|
|
|
+ switch (acpi_type) {
|
|
|
+ case ACPI_TYPE_PROCESSOR:
|
|
|
+ status = acpi_evaluate_object(handle, NULL, NULL, &buffer);
|
|
|
+ if (ACPI_FAILURE(status))
|
|
|
+ goto err;
|
|
|
+ uid = object.processor.proc_id;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case ACPI_TYPE_DEVICE:
|
|
|
+ status = acpi_evaluate_integer(handle, "_UID", NULL, &uid);
|
|
|
+ if (ACPI_FAILURE(status))
|
|
|
+ goto err;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ goto err;
|
|
|
+ }
|
|
|
+
|
|
|
+ processor_validated_ids_update(uid);
|
|
|
+ return true;
|
|
|
+
|
|
|
+err:
|
|
|
+ acpi_handle_info(handle, "Invalid processor object\n");
|
|
|
+ return false;
|
|
|
|
|
|
- return AE_OK;
|
|
|
}
|
|
|
|
|
|
-static void __init acpi_processor_check_duplicates(void)
|
|
|
+void __init acpi_processor_check_duplicates(void)
|
|
|
{
|
|
|
- /* Search all processor nodes in ACPI namespace */
|
|
|
+ /* check the correctness for all processors in ACPI namespace */
|
|
|
acpi_walk_namespace(ACPI_TYPE_PROCESSOR, ACPI_ROOT_OBJECT,
|
|
|
ACPI_UINT32_MAX,
|
|
|
acpi_processor_ids_walk,
|
|
|
NULL, NULL, NULL);
|
|
|
+ acpi_get_devices(ACPI_PROCESSOR_DEVICE_HID, acpi_processor_ids_walk,
|
|
|
+ NULL, NULL);
|
|
|
}
|
|
|
|
|
|
bool __init acpi_processor_validate_proc_id(int proc_id)
|