All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v3 0/7] ACPI: Add _OST support for ACPI hotplug
@ 2012-05-11 16:36 Toshi Kani
  2012-05-11 16:36 ` [PATCH v3 1/7] ACPI: Add CONFIG_HOTPLUG_OST option Toshi Kani
                   ` (7 more replies)
  0 siblings, 8 replies; 11+ messages in thread
From: Toshi Kani @ 2012-05-11 16:36 UTC (permalink / raw)
  To: lenb, linux-acpi; +Cc: bhelgaas, shuahkhan, liuj97, linux-kernel, Toshi Kani

This patchset supports ACPI OSPM Status Indication (_OST) method for
ACPI CPU/memory/container hotplug operations and sysfs eject. After
ACPI hotplug operation has completed, OSPM calls _OST to indicate the
result of the operation to the platform. If _OST is not present, this
patchset has no effect on the platform.

This _OST support can be enabled or disabled with a new config option
CONFIG_ACPI_HOTPLUG_OST. This option is disabled by default. When
this option is disabled, this patchset has no effect on the platform.

Some platforms may require the OS to support _OST in order to support
ACPI hotplug operations. For example, if a platform has the management
console where user can request a hotplug operation from, this _OST
support would be required for the management console to show the result
of the hotplug request to user.

The _OST definition can be found in section 6.3.5 of ACPI 5.0 spec.
The HPPF spec below also describes hotplug flows with _OST.

  DIG64 Hot-Plug & Partitioning Flow (HPPF) Specification R1.0
  http://www.dig64.org/home/DIG64_HPPF_R1_0.pdf

The changes have been tested with simulated _OST methods.

v3:
 - Added more descriptions to the change logs.

v2:
 - Added CONFIG_ACPI_HOTPLUG_OST option. 
 - Added _OST support for container hotplug and sysfs eject.
 - Reordered patchset to enable _OST support bit of _OSC in the 
   last patch.

---
Toshi Kani (7):
 ACPI: Add CONFIG_HOTPLUG_OST option
 ACPI: Add an interface to evaluate _OST
 ACPI: Add _OST support for sysfs eject
 ACPI: Add _OST support for ACPI CPU hotplug
 ACPI: Add _OST support for ACPI memory hotplug
 ACPI: Add _OST support for ACPI container hotplug
 ACPI: Set hotplug _OST support bit to _OSC

 drivers/acpi/Kconfig            |   14 +++++++++
 drivers/acpi/acpi_memhotplug.c  |   43 +++++++++++++++++++++-------
 drivers/acpi/bus.c              |    4 +++
 drivers/acpi/container.c        |   43 +++++++++++++++++++----------
 drivers/acpi/processor_driver.c |   28 +++++++++++++-----
 drivers/acpi/scan.c             |   58 +++++++++++++++++++++++++++++++++------
 drivers/acpi/utils.c            |   38 +++++++++++++++++++++++++
 include/acpi/acpi_bus.h         |   12 +++++++-
 include/linux/acpi.h            |   31 ++++++++++++++++++++-
 9 files changed, 226 insertions(+), 45 deletions(-)

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [PATCH v3 1/7] ACPI: Add CONFIG_HOTPLUG_OST option
  2012-05-11 16:36 [PATCH v3 0/7] ACPI: Add _OST support for ACPI hotplug Toshi Kani
@ 2012-05-11 16:36 ` Toshi Kani
  2012-05-11 16:36 ` [PATCH v3 2/7] ACPI: Add an interface to evaluate _OST Toshi Kani
                   ` (6 subsequent siblings)
  7 siblings, 0 replies; 11+ messages in thread
From: Toshi Kani @ 2012-05-11 16:36 UTC (permalink / raw)
  To: lenb, linux-acpi; +Cc: bhelgaas, shuahkhan, liuj97, linux-kernel, Toshi Kani

Added CONFIG_ACPI_HOTPLUG_OPT option. When this config option is disabled,
this patchset has no effect on the platform. This option is disabled by
default. The dependency list assures consistent behavior among CPU, memory
and container hotplug operations with regarding the _OST support.

Some platforms may require the OS to support _OST in order to support
ACPI hotplug operations. For example, if a platform has the management
console where user can request a hotplug operation from, this _OST support
would be required for the management console to show the result of the
hotplug request to user.

ACPI PCI hotplug is not enhanced to support _OST at this time since it is
a legacy method being replaced by PCI native hotplug. _OST support for
ACPI PCI hotplug may be added in future if necessary.

Signed-off-by: Toshi Kani <toshi.kani@hp.com>
---
 drivers/acpi/Kconfig |   14 ++++++++++++++
 1 files changed, 14 insertions(+), 0 deletions(-)

diff --git a/drivers/acpi/Kconfig b/drivers/acpi/Kconfig
index 47768ff..d318c5e 100644
--- a/drivers/acpi/Kconfig
+++ b/drivers/acpi/Kconfig
@@ -351,6 +351,20 @@ config ACPI_HOTPLUG_MEMORY
 	  To compile this driver as a module, choose M here:
 	  the module will be called acpi_memhotplug.
 
+config ACPI_HOTPLUG_OST
+	bool "Hotplug Status Indication Support"
+	depends on ACPI_HOTPLUG_CPU
+	depends on ACPI_HOTPLUG_MEMORY
+	depends on ACPI_CONTAINER
+	default n
+	help
+	  This option enables the use of the ACPI OSPM Status Indication
+          (_OST), if available, for the platform to determine the status
+	  of various hotplug operations. Some platforms may require that
+	  this option be enabled to track the status of hotplug operations.
+	  This option has no effect when the platform does not support
+	  _OST.
+
 config ACPI_SBS
 	tristate "Smart Battery System"
 	depends on X86
-- 
1.7.7.6

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH v3 2/7] ACPI: Add an interface to evaluate _OST
  2012-05-11 16:36 [PATCH v3 0/7] ACPI: Add _OST support for ACPI hotplug Toshi Kani
  2012-05-11 16:36 ` [PATCH v3 1/7] ACPI: Add CONFIG_HOTPLUG_OST option Toshi Kani
@ 2012-05-11 16:36 ` Toshi Kani
  2012-05-11 16:36 ` [PATCH v3 3/7] ACPI: Add _OST support for sysfs eject Toshi Kani
                   ` (5 subsequent siblings)
  7 siblings, 0 replies; 11+ messages in thread
From: Toshi Kani @ 2012-05-11 16:36 UTC (permalink / raw)
  To: lenb, linux-acpi; +Cc: bhelgaas, shuahkhan, liuj97, linux-kernel, Toshi Kani

Added acpi_evaluate_hotplug_opt(). All ACPI hotplug handlers must call
this function when evaluating _OST for hotplug operations. 

When CONFIG_ACPI_HOTPLUG_OST is disabled, this function is a no-op and
has no effect on the platform.

When _OST is not present on the platform, this function returns
AE_NOT_FOUND and has no effect on the platform.

Signed-off-by: Toshi Kani <toshi.kani@hp.com>
---
 drivers/acpi/utils.c    |   38 ++++++++++++++++++++++++++++++++++++++
 include/acpi/acpi_bus.h |    3 +++
 2 files changed, 41 insertions(+), 0 deletions(-)

diff --git a/drivers/acpi/utils.c b/drivers/acpi/utils.c
index b002a47..39d7349 100644
--- a/drivers/acpi/utils.c
+++ b/drivers/acpi/utils.c
@@ -382,3 +382,41 @@ acpi_evaluate_reference(acpi_handle handle,
 }
 
 EXPORT_SYMBOL(acpi_evaluate_reference);
+
+/*
+ * acpi_evaluate_hotplug_ost: Evaluate _OST for hotplug operations
+ * @handle: ACPI device handle
+ * @source_event: source event code
+ * @status_code: status code
+ * @status_buf: optional detailed information (NULL if none)
+ */
+acpi_status
+acpi_evaluate_hotplug_ost(acpi_handle handle, u32 source_event,
+		u32 status_code, struct acpi_buffer *status_buf)
+{
+#ifdef CONFIG_ACPI_HOTPLUG_OST
+	union acpi_object params[3] = {
+		{.type = ACPI_TYPE_INTEGER,},
+		{.type = ACPI_TYPE_INTEGER,},
+		{.type = ACPI_TYPE_BUFFER,}
+	};
+	struct acpi_object_list arg_list = {3, params};
+	acpi_status status;
+
+	params[0].integer.value = source_event;
+	params[1].integer.value = status_code;
+	if (status_buf != NULL) {
+		params[2].buffer.pointer = status_buf->pointer;
+		params[2].buffer.length = status_buf->length;
+	} else {
+		params[2].buffer.pointer = NULL;
+		params[2].buffer.length = 0;
+	}
+
+	status = acpi_evaluate_object(handle, "_OST", &arg_list, NULL);
+	return status;
+#else
+	return AE_OK;
+#endif
+}
+EXPORT_SYMBOL(acpi_evaluate_hotplug_ost);
diff --git a/include/acpi/acpi_bus.h b/include/acpi/acpi_bus.h
index f1c8ca6..7309113 100644
--- a/include/acpi/acpi_bus.h
+++ b/include/acpi/acpi_bus.h
@@ -50,6 +50,9 @@ acpi_evaluate_reference(acpi_handle handle,
 			acpi_string pathname,
 			struct acpi_object_list *arguments,
 			struct acpi_handle_list *list);
+acpi_status
+acpi_evaluate_hotplug_ost(acpi_handle handle, u32 source_event,
+			u32 status_code, struct acpi_buffer *status_buf);
 
 #ifdef CONFIG_ACPI
 
-- 
1.7.7.6

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH v3 3/7] ACPI: Add _OST support for sysfs eject
  2012-05-11 16:36 [PATCH v3 0/7] ACPI: Add _OST support for ACPI hotplug Toshi Kani
  2012-05-11 16:36 ` [PATCH v3 1/7] ACPI: Add CONFIG_HOTPLUG_OST option Toshi Kani
  2012-05-11 16:36 ` [PATCH v3 2/7] ACPI: Add an interface to evaluate _OST Toshi Kani
@ 2012-05-11 16:36 ` Toshi Kani
  2012-05-11 16:37 ` [PATCH v3 4/7] ACPI: Add _OST support for ACPI CPU hotplug Toshi Kani
                   ` (4 subsequent siblings)
  7 siblings, 0 replies; 11+ messages in thread
From: Toshi Kani @ 2012-05-11 16:36 UTC (permalink / raw)
  To: lenb, linux-acpi; +Cc: bhelgaas, shuahkhan, liuj97, linux-kernel, Toshi Kani

Changed acpi_bus_hot_remove_device() to support _OST. This function is
also changed to global so that it can be called from hotplug notify
handlers to perform hot-remove operation.

Changed acpi_eject_store(), which is the sysfs eject handler. It checks
eject_pending to see if the request was originated from ACPI eject
notification. If not, it calls _OST(0x103,84,) per Figure 6-37 in ACPI
5.0 spec.

Added eject_pending bit to acpi_device_flags. This bit is set when the
kernel has received an ACPI eject notification, but does not initiate
its hot-remove operation by itself.

Added struct acpi_eject_event. This structure is used to pass extended
information to acpi_bus_hot_remove_device(), which has a single argument
to support asynchronous call.

Added macro definitions of _OST source events and status codes.
Also renamed OSC_SB_CPUHP_OST_SUPPORT to OSC_SB_HOTPLUG_OST_SUPPORT
since this _OSC bit is not specific to CPU hotplug. This bit is
defined in Table 6-147 of ACPI 5.0 as follows.

  Bits:       3
  Field Name: Insertion / Ejection _OST Processing Support
  Definition: This bit is set if OSPM will evaluate the _OST
              object defined under a device when processing
              insertion and ejection source event codes.

Signed-off-by: Toshi Kani <toshi.kani@hp.com>
---
 drivers/acpi/scan.c     |   58 +++++++++++++++++++++++++++++++++++++++-------
 include/acpi/acpi_bus.h |    9 ++++++-
 include/linux/acpi.h    |   31 ++++++++++++++++++++++++-
 3 files changed, 87 insertions(+), 11 deletions(-)

diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c
index 7417267..84ba717 100644
--- a/drivers/acpi/scan.c
+++ b/drivers/acpi/scan.c
@@ -83,19 +83,29 @@ acpi_device_modalias_show(struct device *dev, struct device_attribute *attr, cha
 }
 static DEVICE_ATTR(modalias, 0444, acpi_device_modalias_show, NULL);
 
-static void acpi_bus_hot_remove_device(void *context)
+/*
+ * acpi_bus_hot_remove_device: hot-remove a device and its children
+ * @context: struct acpi_eject_event pointer (freed in this func)
+ *
+ * Hot-remove a device and its children. This function frees up the
+ * memory space passed by arg context, so that the caller may call
+ * this function asynchronously through acpi_os_hotplug_execute().
+ */
+void acpi_bus_hot_remove_device(void *context)
 {
+	struct acpi_eject_event *ej_event = (struct acpi_eject_event *) context;
 	struct acpi_device *device;
-	acpi_handle handle = context;
+	acpi_handle handle = ej_event->handle;
 	struct acpi_object_list arg_list;
 	union acpi_object arg;
 	acpi_status status = AE_OK;
+	u32 ost_code = ACPI_OST_SC_NON_SPECIFIC_FAILURE; /* default */
 
 	if (acpi_bus_get_device(handle, &device))
-		return;
+		goto err_out;
 
 	if (!device)
-		return;
+		goto err_out;
 
 	ACPI_DEBUG_PRINT((ACPI_DB_INFO,
 		"Hot-removing device %s...\n", dev_name(&device->dev)));
@@ -103,7 +113,7 @@ static void acpi_bus_hot_remove_device(void *context)
 	if (acpi_bus_trim(device, 1)) {
 		printk(KERN_ERR PREFIX
 				"Removing device failed\n");
-		return;
+		goto err_out;
 	}
 
 	/* power off device */
@@ -129,10 +139,21 @@ static void acpi_bus_hot_remove_device(void *context)
 	 * TBD: _EJD support.
 	 */
 	status = acpi_evaluate_object(handle, "_EJ0", &arg_list, NULL);
-	if (ACPI_FAILURE(status))
-		printk(KERN_WARNING PREFIX
-				"Eject device failed\n");
+	if (ACPI_FAILURE(status)) {
+		if (status != AE_NOT_FOUND)
+			printk(KERN_WARNING PREFIX
+					"Eject device failed\n");
+		goto err_out;
+	}
+
+	kfree(context);
+	return;
 
+err_out:
+	/* Inform firmware the hot-remove operation has completed w/ error */
+	(void) acpi_evaluate_hotplug_ost(handle,
+				ej_event->event, ost_code, NULL);
+	kfree(context);
 	return;
 }
 
@@ -144,6 +165,7 @@ acpi_eject_store(struct device *d, struct device_attribute *attr,
 	acpi_status status;
 	acpi_object_type type = 0;
 	struct acpi_device *acpi_device = to_acpi_device(d);
+	struct acpi_eject_event *ej_event;
 
 	if ((!count) || (buf[0] != '1')) {
 		return -EINVAL;
@@ -160,7 +182,25 @@ acpi_eject_store(struct device *d, struct device_attribute *attr,
 		goto err;
 	}
 
-	acpi_os_hotplug_execute(acpi_bus_hot_remove_device, acpi_device->handle);
+	ej_event = kmalloc(sizeof(*ej_event), GFP_KERNEL);
+	if (!ej_event) {
+		ret = -ENOMEM;
+		goto err;
+	}
+
+	ej_event->handle = acpi_device->handle;
+	if (acpi_device->flags.eject_pending) {
+		/* event originated from ACPI eject notification */
+		ej_event->event = ACPI_NOTIFY_EJECT_REQUEST;
+		acpi_device->flags.eject_pending = 0;
+	} else {
+		/* event originated from user */
+		ej_event->event = ACPI_OST_EC_OSPM_EJECT;
+		(void) acpi_evaluate_hotplug_ost(ej_event->handle,
+			ej_event->event, ACPI_OST_SC_EJECT_IN_PROGRESS, NULL);
+	}
+
+	acpi_os_hotplug_execute(acpi_bus_hot_remove_device, (void *)ej_event);
 err:
 	return ret;
 }
diff --git a/include/acpi/acpi_bus.h b/include/acpi/acpi_bus.h
index 7309113..b836800 100644
--- a/include/acpi/acpi_bus.h
+++ b/include/acpi/acpi_bus.h
@@ -151,7 +151,8 @@ struct acpi_device_flags {
 	u32 suprise_removal_ok:1;
 	u32 power_manageable:1;
 	u32 performance_manageable:1;
-	u32 reserved:24;
+	u32 eject_pending:1;
+	u32 reserved:23;
 };
 
 /* File System */
@@ -303,6 +304,11 @@ struct acpi_bus_event {
 	u32 data;
 };
 
+struct acpi_eject_event {
+	acpi_handle	handle;
+	u32		event;
+};
+
 extern struct kobject *acpi_kobj;
 extern int acpi_bus_generate_netlink_event(const char*, const char*, u8, int);
 void acpi_bus_private_data_handler(acpi_handle, void *);
@@ -340,6 +346,7 @@ int acpi_bus_register_driver(struct acpi_driver *driver);
 void acpi_bus_unregister_driver(struct acpi_driver *driver);
 int acpi_bus_add(struct acpi_device **child, struct acpi_device *parent,
 		 acpi_handle handle, int type);
+void acpi_bus_hot_remove_device(void *context);
 int acpi_bus_trim(struct acpi_device *start, int rmdevice);
 int acpi_bus_start(struct acpi_device *device);
 acpi_status acpi_bus_get_ejd(acpi_handle handle, acpi_handle * ejd);
diff --git a/include/linux/acpi.h b/include/linux/acpi.h
index f421dd8..a4b1d3d 100644
--- a/include/linux/acpi.h
+++ b/include/linux/acpi.h
@@ -277,7 +277,7 @@ acpi_status acpi_run_osc(acpi_handle handle, struct acpi_osc_context *context);
 #define OSC_SB_PAD_SUPPORT		1
 #define OSC_SB_PPC_OST_SUPPORT		2
 #define OSC_SB_PR3_SUPPORT		4
-#define OSC_SB_CPUHP_OST_SUPPORT	8
+#define OSC_SB_HOTPLUG_OST_SUPPORT	8
 #define OSC_SB_APEI_SUPPORT		16
 
 extern bool osc_sb_apei_support_acked;
@@ -309,6 +309,35 @@ extern bool osc_sb_apei_support_acked;
 
 extern acpi_status acpi_pci_osc_control_set(acpi_handle handle,
 					     u32 *mask, u32 req);
+
+/* _OST Source Event Code (OSPM Action) */
+#define ACPI_OST_EC_OSPM_SHUTDOWN		0x100
+#define ACPI_OST_EC_OSPM_EJECT			0x103
+#define ACPI_OST_EC_OSPM_INSERTION		0x200
+
+/* _OST General Processing Status Code */
+#define ACPI_OST_SC_SUCCESS			0x0
+#define ACPI_OST_SC_NON_SPECIFIC_FAILURE	0x1
+#define ACPI_OST_SC_UNRECOGNIZED_NOTIFY		0x2
+
+/* _OST OS Shutdown Processing (0x100) Status Code */
+#define ACPI_OST_SC_OS_SHUTDOWN_DENIED		0x80
+#define ACPI_OST_SC_OS_SHUTDOWN_IN_PROGRESS	0x81
+#define ACPI_OST_SC_OS_SHUTDOWN_COMPLETED	0x82
+#define ACPI_OST_SC_OS_SHUTDOWN_NOT_SUPPORTED	0x83
+
+/* _OST Ejection Request (0x3, 0x103) Status Code */
+#define ACPI_OST_SC_EJECT_NOT_SUPPORTED		0x80
+#define ACPI_OST_SC_DEVICE_IN_USE		0x81
+#define ACPI_OST_SC_DEVICE_BUSY			0x82
+#define ACPI_OST_SC_EJECT_DEPENDENCY_BUSY	0x83
+#define ACPI_OST_SC_EJECT_IN_PROGRESS		0x84
+
+/* _OST Insertion Request (0x200) Status Code */
+#define ACPI_OST_SC_INSERT_IN_PROGRESS		0x80
+#define ACPI_OST_SC_DRIVER_LOAD_FAILURE		0x81
+#define ACPI_OST_SC_INSERT_NOT_SUPPORTED	0x82
+
 extern void acpi_early_init(void);
 
 extern int acpi_nvs_register(__u64 start, __u64 size);
-- 
1.7.7.6

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH v3 4/7] ACPI: Add _OST support for ACPI CPU hotplug
  2012-05-11 16:36 [PATCH v3 0/7] ACPI: Add _OST support for ACPI hotplug Toshi Kani
                   ` (2 preceding siblings ...)
  2012-05-11 16:36 ` [PATCH v3 3/7] ACPI: Add _OST support for sysfs eject Toshi Kani
@ 2012-05-11 16:37 ` Toshi Kani
  2012-05-11 16:37 ` [PATCH v3 5/7] ACPI: Add _OST support for ACPI memory hotplug Toshi Kani
                   ` (3 subsequent siblings)
  7 siblings, 0 replies; 11+ messages in thread
From: Toshi Kani @ 2012-05-11 16:37 UTC (permalink / raw)
  To: lenb, linux-acpi; +Cc: bhelgaas, shuahkhan, liuj97, linux-kernel, Toshi Kani

Changed acpi_processor_hotplug_notify() to call ACPI _OST method
when ACPI CPU hotplug operation has completed.

Signed-off-by: Toshi Kani <toshi.kani@hp.com>
---
 drivers/acpi/processor_driver.c |   28 ++++++++++++++++++++--------
 1 files changed, 20 insertions(+), 8 deletions(-)

diff --git a/drivers/acpi/processor_driver.c b/drivers/acpi/processor_driver.c
index 0734086..971c454 100644
--- a/drivers/acpi/processor_driver.c
+++ b/drivers/acpi/processor_driver.c
@@ -701,9 +701,9 @@ static void acpi_processor_hotplug_notify(acpi_handle handle,
 {
 	struct acpi_processor *pr;
 	struct acpi_device *device = NULL;
+	u32 ost_code = ACPI_OST_SC_NON_SPECIFIC_FAILURE; /* default */
 	int result;
 
-
 	switch (event) {
 	case ACPI_NOTIFY_BUS_CHECK:
 	case ACPI_NOTIFY_DEVICE_CHECK:
@@ -715,14 +715,18 @@ static void acpi_processor_hotplug_notify(acpi_handle handle,
 		if (!is_processor_present(handle))
 			break;
 
-		if (acpi_bus_get_device(handle, &device)) {
-			result = acpi_processor_device_add(handle, &device);
-			if (result)
-				printk(KERN_ERR PREFIX
-					    "Unable to add the device\n");
+		if (!acpi_bus_get_device(handle, &device))
+			break;
+
+		result = acpi_processor_device_add(handle, &device);
+		if (result) {
+			printk(KERN_ERR PREFIX "Unable to add the device\n");
 			break;
 		}
+
+		ost_code = ACPI_OST_SC_SUCCESS;
 		break;
+
 	case ACPI_NOTIFY_EJECT_REQUEST:
 		ACPI_DEBUG_PRINT((ACPI_DB_INFO,
 				  "received ACPI_NOTIFY_EJECT_REQUEST\n"));
@@ -736,15 +740,23 @@ static void acpi_processor_hotplug_notify(acpi_handle handle,
 		if (!pr) {
 			printk(KERN_ERR PREFIX
 				    "Driver data is NULL, dropping EJECT\n");
-			return;
+			break;
 		}
+
+		/* REVISIT: update when eject is supported */
+		ost_code = ACPI_OST_SC_EJECT_NOT_SUPPORTED;
 		break;
+
 	default:
 		ACPI_DEBUG_PRINT((ACPI_DB_INFO,
 				  "Unsupported event [0x%x]\n", event));
-		break;
+
+		/* non-hotplug event; possibly handled by other handler */
+		return;
 	}
 
+	/* Inform firmware that the hotplug operation has completed */
+	(void) acpi_evaluate_hotplug_ost(handle, event, ost_code, NULL);
 	return;
 }
 
-- 
1.7.7.6

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH v3 5/7] ACPI: Add _OST support for ACPI memory hotplug
  2012-05-11 16:36 [PATCH v3 0/7] ACPI: Add _OST support for ACPI hotplug Toshi Kani
                   ` (3 preceding siblings ...)
  2012-05-11 16:37 ` [PATCH v3 4/7] ACPI: Add _OST support for ACPI CPU hotplug Toshi Kani
@ 2012-05-11 16:37 ` Toshi Kani
  2012-05-11 16:37 ` [PATCH v3 6/7] ACPI: Add _OST support for ACPI container hotplug Toshi Kani
                   ` (2 subsequent siblings)
  7 siblings, 0 replies; 11+ messages in thread
From: Toshi Kani @ 2012-05-11 16:37 UTC (permalink / raw)
  To: lenb, linux-acpi; +Cc: bhelgaas, shuahkhan, liuj97, linux-kernel, Toshi Kani

Changed acpi_memory_device_notify() to call ACPI _OST method
when ACPI memory hotplug operation has completed.

Signed-off-by: Toshi Kani <toshi.kani@hp.com>
---
 drivers/acpi/acpi_memhotplug.c |   43 +++++++++++++++++++++++++++++----------
 1 files changed, 32 insertions(+), 11 deletions(-)

diff --git a/drivers/acpi/acpi_memhotplug.c b/drivers/acpi/acpi_memhotplug.c
index d985713..24c807f 100644
--- a/drivers/acpi/acpi_memhotplug.c
+++ b/drivers/acpi/acpi_memhotplug.c
@@ -341,7 +341,7 @@ static void acpi_memory_device_notify(acpi_handle handle, u32 event, void *data)
 {
 	struct acpi_memory_device *mem_device;
 	struct acpi_device *device;
-
+	u32 ost_code = ACPI_OST_SC_NON_SPECIFIC_FAILURE; /* default */
 
 	switch (event) {
 	case ACPI_NOTIFY_BUS_CHECK:
@@ -354,15 +354,20 @@ static void acpi_memory_device_notify(acpi_handle handle, u32 event, void *data)
 					  "\nReceived DEVICE CHECK notification for device\n"));
 		if (acpi_memory_get_device(handle, &mem_device)) {
 			printk(KERN_ERR PREFIX "Cannot find driver data\n");
-			return;
+			break;
 		}
 
-		if (!acpi_memory_check_device(mem_device)) {
-			if (acpi_memory_enable_device(mem_device))
-				printk(KERN_ERR PREFIX
-					    "Cannot enable memory device\n");
+		if (acpi_memory_check_device(mem_device))
+			break;
+
+		if (acpi_memory_enable_device(mem_device)) {
+			printk(KERN_ERR PREFIX "Cannot enable memory device\n");
+			break;
 		}
+
+		ost_code = ACPI_OST_SC_SUCCESS;
 		break;
+
 	case ACPI_NOTIFY_EJECT_REQUEST:
 		ACPI_DEBUG_PRINT((ACPI_DB_INFO,
 				  "\nReceived EJECT REQUEST notification for device\n"));
@@ -383,19 +388,35 @@ static void acpi_memory_device_notify(acpi_handle handle, u32 event, void *data)
 		 * TBD: Can also be disabled by Callback registration
 		 *      with generic sysfs driver
 		 */
-		if (acpi_memory_disable_device(mem_device))
-			printk(KERN_ERR PREFIX
-				    "Disable memory device\n");
+		if (acpi_memory_disable_device(mem_device)) {
+			printk(KERN_ERR PREFIX "Disable memory device\n");
+			/*
+			 * If _EJ0 was called but failed, _OST is not
+			 * necessary.
+			 */
+			if (mem_device->state == MEMORY_INVALID_STATE)
+				return;
+
+			break;
+		}
+
 		/*
 		 * TBD: Invoke acpi_bus_remove to cleanup data structures
 		 */
-		break;
+
+		/* _EJ0 succeeded; _OST is not necessary */
+		return;
+
 	default:
 		ACPI_DEBUG_PRINT((ACPI_DB_INFO,
 				  "Unsupported event [0x%x]\n", event));
-		break;
+
+		/* non-hotplug event; possibly handled by other handler */
+		return;
 	}
 
+	/* Inform firmware that the hotplug operation has completed */
+	(void) acpi_evaluate_hotplug_ost(handle, event, ost_code, NULL);
 	return;
 }
 
-- 
1.7.7.6


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH v3 6/7] ACPI: Add _OST support for ACPI container hotplug
  2012-05-11 16:36 [PATCH v3 0/7] ACPI: Add _OST support for ACPI hotplug Toshi Kani
                   ` (4 preceding siblings ...)
  2012-05-11 16:37 ` [PATCH v3 5/7] ACPI: Add _OST support for ACPI memory hotplug Toshi Kani
@ 2012-05-11 16:37 ` Toshi Kani
  2012-05-11 16:37 ` [PATCH v3 7/7] ACPI: Set hotplug _OST support bit to _OSC Toshi Kani
  2012-05-11 17:09 ` [PATCH v3 0/7] ACPI: Add _OST support for ACPI hotplug Andi Kleen
  7 siblings, 0 replies; 11+ messages in thread
From: Toshi Kani @ 2012-05-11 16:37 UTC (permalink / raw)
  To: lenb, linux-acpi; +Cc: bhelgaas, shuahkhan, liuj97, linux-kernel, Toshi Kani

Changed container_notify_cb() to call ACPI _OST method when ACPI
container hotplug operation has completed. Slightly restructured
the code with the same logic. The function sets eject_pending bit
for an eject request since it does not initiate hot-remove operation.
This bit is checked by the sysfs eject handler to determine if the
request is originated from an ACPI eject notification.

Signed-off-by: Toshi Kani <toshi.kani@hp.com>
---
 drivers/acpi/container.c |   43 ++++++++++++++++++++++++++++---------------
 1 files changed, 28 insertions(+), 15 deletions(-)

diff --git a/drivers/acpi/container.c b/drivers/acpi/container.c
index 45cd03b..1f9f7d7 100644
--- a/drivers/acpi/container.c
+++ b/drivers/acpi/container.c
@@ -158,9 +158,7 @@ static void container_notify_cb(acpi_handle handle, u32 type, void *context)
 	int result;
 	int present;
 	acpi_status status;
-
-
-	present = is_device_present(handle);
+	u32 ost_code = ACPI_OST_SC_NON_SPECIFIC_FAILURE; /* default */
 
 	switch (type) {
 	case ACPI_NOTIFY_BUS_CHECK:
@@ -169,32 +167,47 @@ static void container_notify_cb(acpi_handle handle, u32 type, void *context)
 		printk(KERN_WARNING "Container driver received %s event\n",
 		       (type == ACPI_NOTIFY_BUS_CHECK) ?
 		       "ACPI_NOTIFY_BUS_CHECK" : "ACPI_NOTIFY_DEVICE_CHECK");
+
+		present = is_device_present(handle);
 		status = acpi_bus_get_device(handle, &device);
-		if (present) {
-			if (ACPI_FAILURE(status) || !device) {
-				result = container_device_add(&device, handle);
-				if (!result)
-					kobject_uevent(&device->dev.kobj,
-						       KOBJ_ONLINE);
-				else
-					printk(KERN_WARNING
-					       "Failed to add container\n");
-			}
-		} else {
+		if (!present) {
 			if (ACPI_SUCCESS(status)) {
 				/* device exist and this is a remove request */
+				device->flags.eject_pending = 1;
 				kobject_uevent(&device->dev.kobj, KOBJ_OFFLINE);
+				return;
 			}
+			break;
+		}
+
+		if (!ACPI_FAILURE(status) || device)
+			break;
+
+		result = container_device_add(&device, handle);
+		if (result) {
+			printk(KERN_WARNING "Failed to add container\n");
+			break;
 		}
+
+		kobject_uevent(&device->dev.kobj, KOBJ_ONLINE);
+		ost_code = ACPI_OST_SC_SUCCESS;
 		break;
+
 	case ACPI_NOTIFY_EJECT_REQUEST:
 		if (!acpi_bus_get_device(handle, &device) && device) {
+			device->flags.eject_pending = 1;
 			kobject_uevent(&device->dev.kobj, KOBJ_OFFLINE);
+			return;
 		}
 		break;
+
 	default:
-		break;
+		/* non-hotplug event; possibly handled by other handler */
+		return;
 	}
+
+	/* Inform firmware that the hotplug operation has completed */
+	(void) acpi_evaluate_hotplug_ost(handle, type, ost_code, NULL);
 	return;
 }
 
-- 
1.7.7.6

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH v3 7/7] ACPI: Set hotplug _OST support bit to _OSC
  2012-05-11 16:36 [PATCH v3 0/7] ACPI: Add _OST support for ACPI hotplug Toshi Kani
                   ` (5 preceding siblings ...)
  2012-05-11 16:37 ` [PATCH v3 6/7] ACPI: Add _OST support for ACPI container hotplug Toshi Kani
@ 2012-05-11 16:37 ` Toshi Kani
  2012-05-11 17:09 ` [PATCH v3 0/7] ACPI: Add _OST support for ACPI hotplug Andi Kleen
  7 siblings, 0 replies; 11+ messages in thread
From: Toshi Kani @ 2012-05-11 16:37 UTC (permalink / raw)
  To: lenb, linux-acpi; +Cc: bhelgaas, shuahkhan, liuj97, linux-kernel, Toshi Kani

When CONFIG_ACPI_HOTPLUG_OST is enabled, set hotplug _OST support bit
OSC_SB_HOTPLUG_OST_SUPPORT to indicate that the OS supports hotplug
_OST by calling the platform-wide ACPI Operating System Capabilities
(_OSC).

Signed-off-by: Toshi Kani <toshi.kani@hp.com>
---
 drivers/acpi/bus.c |    4 ++++
 1 files changed, 4 insertions(+), 0 deletions(-)

diff --git a/drivers/acpi/bus.c b/drivers/acpi/bus.c
index 3263b68..93bf515 100644
--- a/drivers/acpi/bus.c
+++ b/drivers/acpi/bus.c
@@ -544,6 +544,10 @@ static void acpi_bus_osc_support(void)
 	capbuf[OSC_SUPPORT_TYPE] |= OSC_SB_PPC_OST_SUPPORT;
 #endif
 
+#ifdef CONFIG_ACPI_HOTPLUG_OST
+	capbuf[OSC_SUPPORT_TYPE] |= OSC_SB_HOTPLUG_OST_SUPPORT;
+#endif
+
 	if (!ghes_disable)
 		capbuf[OSC_SUPPORT_TYPE] |= OSC_SB_APEI_SUPPORT;
 	if (ACPI_FAILURE(acpi_get_handle(NULL, "\\_SB", &handle)))
-- 
1.7.7.6


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: [PATCH v3 0/7] ACPI: Add _OST support for ACPI hotplug
  2012-05-11 16:36 [PATCH v3 0/7] ACPI: Add _OST support for ACPI hotplug Toshi Kani
                   ` (6 preceding siblings ...)
  2012-05-11 16:37 ` [PATCH v3 7/7] ACPI: Set hotplug _OST support bit to _OSC Toshi Kani
@ 2012-05-11 17:09 ` Andi Kleen
  2012-05-11 17:24   ` Toshi Kani
  7 siblings, 1 reply; 11+ messages in thread
From: Andi Kleen @ 2012-05-11 17:09 UTC (permalink / raw)
  To: Toshi Kani; +Cc: lenb, linux-acpi, bhelgaas, shuahkhan, liuj97, linux-kernel

Toshi Kani <toshi.kani@hp.com> writes:

> This patchset supports ACPI OSPM Status Indication (_OST) method for
> ACPI CPU/memory/container hotplug operations and sysfs eject. After
> ACPI hotplug operation has completed, OSPM calls _OST to indicate the
> result of the operation to the platform. If _OST is not present, this
> patchset has no effect on the platform.
>
> This _OST support can be enabled or disabled with a new config option
> CONFIG_ACPI_HOTPLUG_OST. This option is disabled by default. When
> this option is disabled, this patchset has no effect on the platform.

Does that control compiling in/out significant sized code?

Controlling code behaviour by CONFIG option has been long deprecated.
This is always better done as a runtime option.

Just think what should a distribution who wants to use the same binary
on all systems set.

-Andi

-- 
ak@linux.intel.com -- Speaking for myself only

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v3 0/7] ACPI: Add _OST support for ACPI hotplug
  2012-05-11 17:09 ` [PATCH v3 0/7] ACPI: Add _OST support for ACPI hotplug Andi Kleen
@ 2012-05-11 17:24   ` Toshi Kani
  2012-05-23 23:37     ` Toshi Kani
  0 siblings, 1 reply; 11+ messages in thread
From: Toshi Kani @ 2012-05-11 17:24 UTC (permalink / raw)
  To: Andi Kleen; +Cc: lenb, linux-acpi, bhelgaas, shuahkhan, liuj97, linux-kernel

On Fri, 2012-05-11 at 10:09 -0700, Andi Kleen wrote:
> Toshi Kani <toshi.kani@hp.com> writes:
> 
> > This patchset supports ACPI OSPM Status Indication (_OST) method for
> > ACPI CPU/memory/container hotplug operations and sysfs eject. After
> > ACPI hotplug operation has completed, OSPM calls _OST to indicate the
> > result of the operation to the platform. If _OST is not present, this
> > patchset has no effect on the platform.
> >
> > This _OST support can be enabled or disabled with a new config option
> > CONFIG_ACPI_HOTPLUG_OST. This option is disabled by default. When
> > this option is disabled, this patchset has no effect on the platform.
> 
> Does that control compiling in/out significant sized code?
> 
> Controlling code behaviour by CONFIG option has been long deprecated.
> This is always better done as a runtime option.
> 
> Just think what should a distribution who wants to use the same binary
> on all systems set.

Good question.  The OS needs to tell the platform if it supports _OST at
boot-time, and has to stick with it.  Therefore, this feature may not be
enabled/disabled during run-time.  Another reason is that this feature
depends on ACPI_HOTPLUG_CPU, ACPI_HOTPLUG_MEMORY and ACPI_CONTAINER
config options in order to provide consistent behavior among multiple
hotplug operations with regarding the _OST support.

Thanks,
-Toshi


^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v3 0/7] ACPI: Add _OST support for ACPI hotplug
  2012-05-11 17:24   ` Toshi Kani
@ 2012-05-23 23:37     ` Toshi Kani
  0 siblings, 0 replies; 11+ messages in thread
From: Toshi Kani @ 2012-05-23 23:37 UTC (permalink / raw)
  To: Andi Kleen; +Cc: lenb, linux-acpi, bhelgaas, shuahkhan, liuj97, linux-kernel

On Fri, 2012-05-11 at 17:24 +0000, Kani, Toshimitsu wrote:
> On Fri, 2012-05-11 at 10:09 -0700, Andi Kleen wrote:
> > Toshi Kani <toshi.kani@hp.com> writes:
> > 
> > > This patchset supports ACPI OSPM Status Indication (_OST) method for
> > > ACPI CPU/memory/container hotplug operations and sysfs eject. After
> > > ACPI hotplug operation has completed, OSPM calls _OST to indicate the
> > > result of the operation to the platform. If _OST is not present, this
> > > patchset has no effect on the platform.
> > >
> > > This _OST support can be enabled or disabled with a new config option
> > > CONFIG_ACPI_HOTPLUG_OST. This option is disabled by default. When
> > > this option is disabled, this patchset has no effect on the platform.
> > 
> > Does that control compiling in/out significant sized code?
> > 
> > Controlling code behaviour by CONFIG option has been long deprecated.
> > This is always better done as a runtime option.
> > 
> > Just think what should a distribution who wants to use the same binary
> > on all systems set.
> 
> Good question.  The OS needs to tell the platform if it supports _OST at
> boot-time, and has to stick with it.  Therefore, this feature may not be
> enabled/disabled during run-time.  Another reason is that this feature
> depends on ACPI_HOTPLUG_CPU, ACPI_HOTPLUG_MEMORY and ACPI_CONTAINER
> config options in order to provide consistent behavior among multiple
> hotplug operations with regarding the _OST support.

Hi Andi,

Thinking this further, I have decided to remove this new CONFIG option.
Thanks for your valuable suggestion!

-Toshi


^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2012-05-23 23:40 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-05-11 16:36 [PATCH v3 0/7] ACPI: Add _OST support for ACPI hotplug Toshi Kani
2012-05-11 16:36 ` [PATCH v3 1/7] ACPI: Add CONFIG_HOTPLUG_OST option Toshi Kani
2012-05-11 16:36 ` [PATCH v3 2/7] ACPI: Add an interface to evaluate _OST Toshi Kani
2012-05-11 16:36 ` [PATCH v3 3/7] ACPI: Add _OST support for sysfs eject Toshi Kani
2012-05-11 16:37 ` [PATCH v3 4/7] ACPI: Add _OST support for ACPI CPU hotplug Toshi Kani
2012-05-11 16:37 ` [PATCH v3 5/7] ACPI: Add _OST support for ACPI memory hotplug Toshi Kani
2012-05-11 16:37 ` [PATCH v3 6/7] ACPI: Add _OST support for ACPI container hotplug Toshi Kani
2012-05-11 16:37 ` [PATCH v3 7/7] ACPI: Set hotplug _OST support bit to _OSC Toshi Kani
2012-05-11 17:09 ` [PATCH v3 0/7] ACPI: Add _OST support for ACPI hotplug Andi Kleen
2012-05-11 17:24   ` Toshi Kani
2012-05-23 23:37     ` Toshi Kani

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.