mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	acpi/processor: Implement DEVICE operator for processor enumeration
ACPI allows to declare processors either with the PROCESSOR or with the DEVICE operator. The current implementation handles only the PROCESSOR operator. On a system which uses the DEVICE operator for processor enumeration the evaluation fails. Check for the ACPI type of the ACPI handle and evaluate PROCESSOR and DEVICE types separately. Signed-off-by: Dou Liyang <douly.fnst@cn.fujitsu.com> Tested-by: Xiaolong Ye <xiaolong.ye@intel.com> Cc: rjw@rjwysocki.net Cc: linux-acpi@vger.kernel.org Cc: guzheng1@huawei.com Cc: izumi.taku@jp.fujitsu.com Cc: lenb@kernel.org Link: http://lkml.kernel.org/r/1488528147-2279-5-git-send-email-douly.fnst@cn.fujitsu.com Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
This commit is contained in:
		
							parent
							
								
									2b85b3d229
								
							
						
					
					
						commit
						8c8cb30f49
					
				
					 1 changed files with 32 additions and 7 deletions
				
			
		| 
						 | 
					@ -633,25 +633,50 @@ static acpi_status __init acpi_processor_ids_walk(acpi_handle handle,
 | 
				
			||||||
						  void **rv)
 | 
											  void **rv)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	acpi_status status;
 | 
						acpi_status status;
 | 
				
			||||||
 | 
						acpi_object_type acpi_type;
 | 
				
			||||||
 | 
						unsigned long long uid;
 | 
				
			||||||
	union acpi_object object = { 0 };
 | 
						union acpi_object object = { 0 };
 | 
				
			||||||
	struct acpi_buffer buffer = { sizeof(union acpi_object), &object };
 | 
						struct acpi_buffer buffer = { sizeof(union acpi_object), &object };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						status = acpi_get_type(handle, &acpi_type);
 | 
				
			||||||
 | 
						if (ACPI_FAILURE(status))
 | 
				
			||||||
 | 
							return false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						switch (acpi_type) {
 | 
				
			||||||
 | 
						case ACPI_TYPE_PROCESSOR:
 | 
				
			||||||
		status = acpi_evaluate_object(handle, NULL, NULL, &buffer);
 | 
							status = acpi_evaluate_object(handle, NULL, NULL, &buffer);
 | 
				
			||||||
		if (ACPI_FAILURE(status))
 | 
							if (ACPI_FAILURE(status))
 | 
				
			||||||
		acpi_handle_info(handle, "Not get the processor object\n");
 | 
								goto err;
 | 
				
			||||||
	else
 | 
							uid = object.processor.proc_id;
 | 
				
			||||||
		processor_validated_ids_update(object.processor.proc_id);
 | 
							break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return AE_OK;
 | 
						case ACPI_TYPE_DEVICE:
 | 
				
			||||||
 | 
							status = acpi_evaluate_integer(handle, "_UID", NULL, &uid);
 | 
				
			||||||
 | 
							if (ACPI_FAILURE(status))
 | 
				
			||||||
 | 
								goto err;
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
						default:
 | 
				
			||||||
 | 
							goto err;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void __init acpi_processor_check_duplicates(void)
 | 
						processor_validated_ids_update(uid);
 | 
				
			||||||
 | 
						return true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					err:
 | 
				
			||||||
 | 
						acpi_handle_info(handle, "Invalid processor object\n");
 | 
				
			||||||
 | 
						return false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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_walk_namespace(ACPI_TYPE_PROCESSOR, ACPI_ROOT_OBJECT,
 | 
				
			||||||
						ACPI_UINT32_MAX,
 | 
											ACPI_UINT32_MAX,
 | 
				
			||||||
						acpi_processor_ids_walk,
 | 
											acpi_processor_ids_walk,
 | 
				
			||||||
						NULL, NULL, NULL);
 | 
											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 __init acpi_processor_validate_proc_id(int proc_id)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue