diff options
Diffstat (limited to 'drivers/acpi/acpi_processor.c')
| -rw-r--r-- | drivers/acpi/acpi_processor.c | 57 | 
1 files changed, 42 insertions, 15 deletions
diff --git a/drivers/acpi/acpi_processor.c b/drivers/acpi/acpi_processor.c index 4467a8089ab8..0143135b3abe 100644 --- a/drivers/acpi/acpi_processor.c +++ b/drivers/acpi/acpi_processor.c @@ -182,11 +182,6 @@ int __weak arch_register_cpu(int cpu)  void __weak arch_unregister_cpu(int cpu) {} -int __weak acpi_map_cpu2node(acpi_handle handle, int cpu, int physid) -{ -	return -ENODEV; -} -  static int acpi_processor_hotadd_init(struct acpi_processor *pr)  {  	unsigned long long sta; @@ -285,6 +280,13 @@ static int acpi_processor_get_info(struct acpi_device *device)  		pr->acpi_id = value;  	} +	if (acpi_duplicate_processor_id(pr->acpi_id)) { +		dev_err(&device->dev, +			"Failed to get unique processor _UID (0x%x)\n", +			pr->acpi_id); +		return -ENODEV; +	} +  	pr->phys_id = acpi_get_phys_id(pr->handle, device_declaration,  					pr->acpi_id);  	if (invalid_phys_cpuid(pr->phys_id)) @@ -585,7 +587,7 @@ static struct acpi_scan_handler processor_container_handler = {  static int nr_unique_ids __initdata;  /* The number of the duplicate processor IDs */ -static int nr_duplicate_ids __initdata; +static int nr_duplicate_ids;  /* Used to store the unique processor IDs */  static int unique_processor_ids[] __initdata = { @@ -593,7 +595,7 @@ static int unique_processor_ids[] __initdata = {  };  /* Used to store the duplicate processor IDs */ -static int duplicate_processor_ids[] __initdata = { +static int duplicate_processor_ids[] = {  	[0 ... NR_CPUS - 1] = -1,  }; @@ -638,28 +640,53 @@ 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) +bool acpi_duplicate_processor_id(int proc_id)  {  	int i;  | 
