diff options
| author | Toshi Kani <toshi.kani@hp.com> | 2012-03-19 13:08:02 -0600 | 
|---|---|---|
| committer | Len Brown <len.brown@intel.com> | 2012-03-30 03:06:51 -0400 | 
| commit | 9f324bda970c599ca35f7be89d9d1bcb96d6053c (patch) | |
| tree | 79cd2b9d07e6b8b43e7346b34150bf1a2559d3fe /drivers/acpi/processor_driver.c | |
| parent | c16fa4f2ad19908a47c63d8fa436a1178438c7e7 (diff) | |
| download | olio-linux-3.10-9f324bda970c599ca35f7be89d9d1bcb96d6053c.tar.xz olio-linux-3.10-9f324bda970c599ca35f7be89d9d1bcb96d6053c.zip  | |
ACPI: Add CPU hotplug support for processor device objects
acpi_processor_install_hotplug_notify() registers processor objects to
receive ACPI CPU hotplug event notifications. This patch additionally
registers processor device objects (ACPI0007) to receive the notifications
as well.
Signed-off-by: Toshi Kani <toshi.kani@hp.com>
Reviewed-by: Bjorn Helgaas <bhelgaas@google.com>
Signed-off-by: Len Brown <len.brown@intel.com>
Diffstat (limited to 'drivers/acpi/processor_driver.c')
| -rw-r--r-- | drivers/acpi/processor_driver.c | 48 | 
1 files changed, 38 insertions, 10 deletions
diff --git a/drivers/acpi/processor_driver.c b/drivers/acpi/processor_driver.c index 8ae05ce1850..50be27739fe 100644 --- a/drivers/acpi/processor_driver.c +++ b/drivers/acpi/processor_driver.c @@ -68,6 +68,7 @@  #define ACPI_PROCESSOR_NOTIFY_PERFORMANCE 0x80  #define ACPI_PROCESSOR_NOTIFY_POWER	0x81  #define ACPI_PROCESSOR_NOTIFY_THROTTLING	0x82 +#define ACPI_PROCESSOR_DEVICE_HID	"ACPI0007"  #define ACPI_PROCESSOR_LIMIT_USER	0  #define ACPI_PROCESSOR_LIMIT_THERMAL	1 @@ -88,7 +89,7 @@ static int acpi_processor_start(struct acpi_processor *pr);  static const struct acpi_device_id processor_device_ids[] = {  	{ACPI_PROCESSOR_OBJECT_HID, 0}, -	{"ACPI0007", 0}, +	{ACPI_PROCESSOR_DEVICE_HID, 0},  	{"", 0},  };  MODULE_DEVICE_TABLE(acpi, processor_device_ids); @@ -741,20 +742,46 @@ static void acpi_processor_hotplug_notify(acpi_handle handle,  	return;  } +static acpi_status is_processor_device(acpi_handle handle) +{ +	struct acpi_device_info *info; +	char *hid; +	acpi_status status; + +	status = acpi_get_object_info(handle, &info); +	if (ACPI_FAILURE(status)) +		return status; + +	if (info->type == ACPI_TYPE_PROCESSOR) { +		kfree(info); +		return AE_OK;	/* found a processor object */ +	} + +	if (!(info->valid & ACPI_VALID_HID)) { +		kfree(info); +		return AE_ERROR; +	} + +	hid = info->hardware_id.string; +	if ((hid == NULL) || strcmp(hid, ACPI_PROCESSOR_DEVICE_HID)) { +		kfree(info); +		return AE_ERROR; +	} + +	kfree(info); +	return AE_OK;	/* found a processor device object */ +} +  static acpi_status  processor_walk_namespace_cb(acpi_handle handle,  			    u32 lvl, void *context, void **rv)  {  	acpi_status status;  	int *action = context; -	acpi_object_type type = 0; -	status = acpi_get_type(handle, &type); +	status = is_processor_device(handle);  	if (ACPI_FAILURE(status)) -		return (AE_OK); - -	if (type != ACPI_TYPE_PROCESSOR) -		return (AE_OK); +		return AE_OK;	/* not a processor; continue to walk */  	switch (*action) {  	case INSTALL_NOTIFY_HANDLER: @@ -772,7 +799,8 @@ processor_walk_namespace_cb(acpi_handle handle,  		break;  	} -	return (AE_OK); +	/* found a processor; skip walking underneath */ +	return AE_CTRL_DEPTH;  }  static acpi_status acpi_processor_hotadd_init(struct acpi_processor *pr) @@ -830,7 +858,7 @@ void acpi_processor_install_hotplug_notify(void)  {  #ifdef CONFIG_ACPI_HOTPLUG_CPU  	int action = INSTALL_NOTIFY_HANDLER; -	acpi_walk_namespace(ACPI_TYPE_PROCESSOR, +	acpi_walk_namespace(ACPI_TYPE_ANY,  			    ACPI_ROOT_OBJECT,  			    ACPI_UINT32_MAX,  			    processor_walk_namespace_cb, NULL, &action, NULL); @@ -843,7 +871,7 @@ void acpi_processor_uninstall_hotplug_notify(void)  {  #ifdef CONFIG_ACPI_HOTPLUG_CPU  	int action = UNINSTALL_NOTIFY_HANDLER; -	acpi_walk_namespace(ACPI_TYPE_PROCESSOR, +	acpi_walk_namespace(ACPI_TYPE_ANY,  			    ACPI_ROOT_OBJECT,  			    ACPI_UINT32_MAX,  			    processor_walk_namespace_cb, NULL, &action, NULL);  |