All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v6 0/6] ACPI: Add _OST support for ACPI hotplug
@ 2012-06-26 20:42 Toshi Kani
  2012-06-26 20:42 ` [PATCH v6 1/6] ACPI: Add an interface to evaluate _OST Toshi Kani
                   ` (6 more replies)
  0 siblings, 7 replies; 17+ messages in thread
From: Toshi Kani @ 2012-06-26 20:42 UTC (permalink / raw)
  To: lenb, linux-acpi
  Cc: bhelgaas, shuahkhan, liuj97, andi, isimatu.yasuaki, linux-kernel,
	Toshi Kani

 * This version updates to use pr_<level> over printk to accommodate
   checkpatch update since this patchset was accepted in -next.

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

This _OST support is enabled when all relevant ACPI hotplug operations,
such as CPU, memory and container hotplug, are enabled. This assures
consistent behavior among the 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.

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.

v6:
 - Updated to use pr_<level> over printk.

v5:
 - Updated change log in patch 5/6.

v4:
 - Removed CONFIG_ACPI_HOTPLUG_OST option.

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 (6):
 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/acpi_memhotplug.c  |   43 ++++++++++++++++++++++-------
 drivers/acpi/bus.c              |    4 +++
 drivers/acpi/container.c        |   43 +++++++++++++++++++----------
 drivers/acpi/processor_driver.c |   28 +++++++++++++-----
 drivers/acpi/scan.c             |   57 ++++++++++++++++++++++++++++++++------
 drivers/acpi/utils.c            |   42 ++++++++++++++++++++++++++++
 include/acpi/acpi_bus.h         |   12 +++++++-
 include/linux/acpi.h            |   40 ++++++++++++++++++++++++++-
 8 files changed, 224 insertions(+), 45 deletions(-)

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

* [PATCH v6 1/6] ACPI: Add an interface to evaluate _OST
  2012-06-26 20:42 [PATCH v6 0/6] ACPI: Add _OST support for ACPI hotplug Toshi Kani
@ 2012-06-26 20:42 ` Toshi Kani
  2012-06-26 20:42 ` [PATCH v6 2/6] ACPI: Add _OST support for sysfs eject Toshi Kani
                   ` (5 subsequent siblings)
  6 siblings, 0 replies; 17+ messages in thread
From: Toshi Kani @ 2012-06-26 20:42 UTC (permalink / raw)
  To: lenb, linux-acpi
  Cc: bhelgaas, shuahkhan, liuj97, andi, isimatu.yasuaki, linux-kernel,
	Toshi Kani

Added acpi_evaluate_hotplug_opt(). All ACPI hotplug handlers must call
this function when evaluating _OST for hotplug operations. If the
platform does not support _OST, this function returns AE_NOT_FOUND and
has no effect on the platform.

ACPI_HOTPLUG_OST is defined when all relevant ACPI hotplug operations,
such as CPU, memory and container hotplug, are enabled. This assures
consistent behavior among the hotplug operations with regarding the
_OST support. When ACPI_HOTPLUG_OST is not defined, this function is
a no-op.

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

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.

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/utils.c    |   42 ++++++++++++++++++++++++++++++++++++++++++
 include/acpi/acpi_bus.h |    3 +++
 include/linux/acpi.h    |   40 +++++++++++++++++++++++++++++++++++++++-
 3 files changed, 84 insertions(+), 1 deletions(-)

diff --git a/drivers/acpi/utils.c b/drivers/acpi/utils.c
index adbbc1c..3e87c9c 100644
--- a/drivers/acpi/utils.c
+++ b/drivers/acpi/utils.c
@@ -412,3 +412,45 @@ out:
 	return status;
 }
 EXPORT_SYMBOL(acpi_get_physical_device_location);
+
+/**
+ * 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)
+ *
+ * Evaluate _OST for hotplug operations. All ACPI hotplug handlers
+ * must call this function when evaluating _OST for hotplug operations.
+ * When the platform does not support _OST, this function has no effect.
+ */
+acpi_status
+acpi_evaluate_hotplug_ost(acpi_handle handle, u32 source_event,
+		u32 status_code, struct acpi_buffer *status_buf)
+{
+#ifdef 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 9e6e1c6..1d9e432 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);
 
 struct acpi_pld {
 	unsigned int revision:7; /* 0 */
diff --git a/include/linux/acpi.h b/include/linux/acpi.h
index f421dd8..b2b4d2a 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,44 @@ extern bool osc_sb_apei_support_acked;
 
 extern acpi_status acpi_pci_osc_control_set(acpi_handle handle,
 					     u32 *mask, u32 req);
+
+/* Enable _OST when all relevant hotplug operations are enabled */
+#if defined(CONFIG_ACPI_HOTPLUG_CPU) &&			\
+	(defined(CONFIG_ACPI_HOTPLUG_MEMORY) ||		\
+	 defined(CONFIG_ACPI_HOTPLUG_MEMORY_MODULE)) &&	\
+	(defined(CONFIG_ACPI_CONTAINER) ||		\
+	 defined(CONFIG_ACPI_CONTAINER_MODULE))
+#define ACPI_HOTPLUG_OST
+#endif
+
+/* _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] 17+ messages in thread

* [PATCH v6 2/6] ACPI: Add _OST support for sysfs eject
  2012-06-26 20:42 [PATCH v6 0/6] ACPI: Add _OST support for ACPI hotplug Toshi Kani
  2012-06-26 20:42 ` [PATCH v6 1/6] ACPI: Add an interface to evaluate _OST Toshi Kani
@ 2012-06-26 20:42 ` Toshi Kani
  2012-07-05 11:16     ` Yasuaki Ishimatsu
  2012-06-26 20:42 ` [PATCH v6 3/6] ACPI: Add _OST support for ACPI CPU hotplug Toshi Kani
                   ` (4 subsequent siblings)
  6 siblings, 1 reply; 17+ messages in thread
From: Toshi Kani @ 2012-06-26 20:42 UTC (permalink / raw)
  To: lenb, linux-acpi
  Cc: bhelgaas, shuahkhan, liuj97, andi, isimatu.yasuaki, 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

Signed-off-by: Toshi Kani <toshi.kani@hp.com>
---
 drivers/acpi/scan.c     |   57 +++++++++++++++++++++++++++++++++++++++-------
 include/acpi/acpi_bus.h |    9 ++++++-
 2 files changed, 56 insertions(+), 10 deletions(-)

diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c
index c8a1f3b..dbdb9fc 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,20 @@ 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)
+			pr_warn(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 +164,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 +181,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 1d9e432..b22b774 100644
--- a/include/acpi/acpi_bus.h
+++ b/include/acpi/acpi_bus.h
@@ -182,7 +182,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 */
@@ -334,6 +335,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 *);
@@ -371,6 +377,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);
-- 
1.7.7.6

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

* [PATCH v6 3/6] ACPI: Add _OST support for ACPI CPU hotplug
  2012-06-26 20:42 [PATCH v6 0/6] ACPI: Add _OST support for ACPI hotplug Toshi Kani
  2012-06-26 20:42 ` [PATCH v6 1/6] ACPI: Add an interface to evaluate _OST Toshi Kani
  2012-06-26 20:42 ` [PATCH v6 2/6] ACPI: Add _OST support for sysfs eject Toshi Kani
@ 2012-06-26 20:42 ` Toshi Kani
  2012-06-26 20:42 ` [PATCH v6 4/6] ACPI: Add _OST support for ACPI memory hotplug Toshi Kani
                   ` (3 subsequent siblings)
  6 siblings, 0 replies; 17+ messages in thread
From: Toshi Kani @ 2012-06-26 20:42 UTC (permalink / raw)
  To: lenb, linux-acpi
  Cc: bhelgaas, shuahkhan, liuj97, andi, isimatu.yasuaki, 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..f9fa1b2 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) {
+			pr_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] 17+ messages in thread

* [PATCH v6 4/6] ACPI: Add _OST support for ACPI memory hotplug
  2012-06-26 20:42 [PATCH v6 0/6] ACPI: Add _OST support for ACPI hotplug Toshi Kani
                   ` (2 preceding siblings ...)
  2012-06-26 20:42 ` [PATCH v6 3/6] ACPI: Add _OST support for ACPI CPU hotplug Toshi Kani
@ 2012-06-26 20:42 ` Toshi Kani
  2012-06-26 20:42 ` [PATCH v6 5/6] ACPI: Add _OST support for ACPI container hotplug Toshi Kani
                   ` (2 subsequent siblings)
  6 siblings, 0 replies; 17+ messages in thread
From: Toshi Kani @ 2012-06-26 20:42 UTC (permalink / raw)
  To: lenb, linux-acpi
  Cc: bhelgaas, shuahkhan, liuj97, andi, isimatu.yasuaki, 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..06c55cd 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)) {
+			pr_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)) {
+			pr_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] 17+ messages in thread

* [PATCH v6 5/6] ACPI: Add _OST support for ACPI container hotplug
  2012-06-26 20:42 [PATCH v6 0/6] ACPI: Add _OST support for ACPI hotplug Toshi Kani
                   ` (3 preceding siblings ...)
  2012-06-26 20:42 ` [PATCH v6 4/6] ACPI: Add _OST support for ACPI memory hotplug Toshi Kani
@ 2012-06-26 20:42 ` Toshi Kani
  2012-06-27  6:05     ` Yasuaki Ishimatsu
  2012-06-26 20:42 ` [PATCH v6 6/6] ACPI: Set hotplug _OST support bit to _OSC Toshi Kani
  2012-07-16 12:52 ` [PATCH v6 0/6] ACPI: Add _OST support for ACPI hotplug Prarit Bhargava
  6 siblings, 1 reply; 17+ messages in thread
From: Toshi Kani @ 2012-06-26 20:42 UTC (permalink / raw)
  To: lenb, linux-acpi
  Cc: bhelgaas, shuahkhan, liuj97, andi, isimatu.yasuaki, 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 except that the hot-add case will
fail a request whenever device is set. This makes the error check
to be more comprehensive.

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..01a986d 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) {
+			pr_warn("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] 17+ messages in thread

* [PATCH v6 6/6] ACPI: Set hotplug _OST support bit to _OSC
  2012-06-26 20:42 [PATCH v6 0/6] ACPI: Add _OST support for ACPI hotplug Toshi Kani
                   ` (4 preceding siblings ...)
  2012-06-26 20:42 ` [PATCH v6 5/6] ACPI: Add _OST support for ACPI container hotplug Toshi Kani
@ 2012-06-26 20:42 ` Toshi Kani
  2012-07-16 12:52 ` [PATCH v6 0/6] ACPI: Add _OST support for ACPI hotplug Prarit Bhargava
  6 siblings, 0 replies; 17+ messages in thread
From: Toshi Kani @ 2012-06-26 20:42 UTC (permalink / raw)
  To: lenb, linux-acpi
  Cc: bhelgaas, shuahkhan, liuj97, andi, isimatu.yasuaki, linux-kernel,
	Toshi Kani

When ACPI_HOTPLUG_OST is defined, 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 adceafd..9628652 100644
--- a/drivers/acpi/bus.c
+++ b/drivers/acpi/bus.c
@@ -574,6 +574,10 @@ static void acpi_bus_osc_support(void)
 	capbuf[OSC_SUPPORT_TYPE] |= OSC_SB_PPC_OST_SUPPORT;
 #endif
 
+#ifdef 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] 17+ messages in thread

* Re: [PATCH v6 5/6] ACPI: Add _OST support for ACPI container hotplug
  2012-06-26 20:42 ` [PATCH v6 5/6] ACPI: Add _OST support for ACPI container hotplug Toshi Kani
@ 2012-06-27  6:05     ` Yasuaki Ishimatsu
  0 siblings, 0 replies; 17+ messages in thread
From: Yasuaki Ishimatsu @ 2012-06-27  6:05 UTC (permalink / raw)
  To: Toshi Kani
  Cc: lenb, linux-acpi, bhelgaas, shuahkhan, liuj97, andi, linux-kernel

2012/06/27 5:42, Toshi Kani wrote:
> Changed container_notify_cb() to call ACPI _OST method when ACPI
> container hotplug operation has completed. Slightly restructured
> the code with the same logic except that the hot-add case will
> fail a request whenever device is set. This makes the error check
> to be more comprehensive.
> 
> 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>

Thank you for updating the change log.

Reviewed-by: <isimatu.yasuaki@jp.fujitsu.com>


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

* Re: [PATCH v6 5/6] ACPI: Add _OST support for ACPI container hotplug
@ 2012-06-27  6:05     ` Yasuaki Ishimatsu
  0 siblings, 0 replies; 17+ messages in thread
From: Yasuaki Ishimatsu @ 2012-06-27  6:05 UTC (permalink / raw)
  To: Toshi Kani
  Cc: lenb, linux-acpi, bhelgaas, shuahkhan, liuj97, andi, linux-kernel

2012/06/27 5:42, Toshi Kani wrote:
> Changed container_notify_cb() to call ACPI _OST method when ACPI
> container hotplug operation has completed. Slightly restructured
> the code with the same logic except that the hot-add case will
> fail a request whenever device is set. This makes the error check
> to be more comprehensive.
> 
> 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>

Thank you for updating the change log.

Reviewed-by: <isimatu.yasuaki@jp.fujitsu.com>


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

* Re: [PATCH v6 5/6] ACPI: Add _OST support for ACPI container hotplug
  2012-06-27  6:05     ` Yasuaki Ishimatsu
  (?)
@ 2012-06-27 15:37     ` Toshi Kani
  -1 siblings, 0 replies; 17+ messages in thread
From: Toshi Kani @ 2012-06-27 15:37 UTC (permalink / raw)
  To: Yasuaki Ishimatsu
  Cc: lenb, linux-acpi, bhelgaas, shuahkhan, liuj97, andi, linux-kernel

On Wed, 2012-06-27 at 15:05 +0900, Yasuaki Ishimatsu wrote:
> 2012/06/27 5:42, Toshi Kani wrote:
> > Changed container_notify_cb() to call ACPI _OST method when ACPI
> > container hotplug operation has completed. Slightly restructured
> > the code with the same logic except that the hot-add case will
> > fail a request whenever device is set. This makes the error check
> > to be more comprehensive.
> > 
> > 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>
> 
> Thank you for updating the change log.
> 
> Reviewed-by: <isimatu.yasuaki@jp.fujitsu.com>

Thanks Yasuaki for reviewing!
-Toshi


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

* Re: [PATCH v6 2/6] ACPI: Add _OST support for sysfs eject
  2012-06-26 20:42 ` [PATCH v6 2/6] ACPI: Add _OST support for sysfs eject Toshi Kani
@ 2012-07-05 11:16     ` Yasuaki Ishimatsu
  0 siblings, 0 replies; 17+ messages in thread
From: Yasuaki Ishimatsu @ 2012-07-05 11:16 UTC (permalink / raw)
  To: Toshi Kani
  Cc: lenb, linux-acpi, bhelgaas, shuahkhan, liuj97, andi, linux-kernel

Hi Toshi,

2012/06/27 5:42, Toshi Kani wrote:
> 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
> 
> Signed-off-by: Toshi Kani <toshi.kani@hp.com>
> ---
>   drivers/acpi/scan.c     |   57 +++++++++++++++++++++++++++++++++++++++-------
>   include/acpi/acpi_bus.h |    9 ++++++-
>   2 files changed, 56 insertions(+), 10 deletions(-)
> 
> diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c
> index c8a1f3b..dbdb9fc 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,20 @@ 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)
> +			pr_warn(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;
>   }

When I read your patch named [PATCH] ACPI: Add ACPI CPU hot-remove support,
a question about this patch appeared.

The question is :
Why does not acpi_bus_hot_remove_device() inform firmware of
ACPI_OST_SC_SUCCESS, when it succeeded? Are thre any reasons?

If you have already discussed my question, please let me know the log.

Thanks,
Yasuaki Ishimatsu


>   
> @@ -144,6 +164,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 +181,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 1d9e432..b22b774 100644
> --- a/include/acpi/acpi_bus.h
> +++ b/include/acpi/acpi_bus.h
> @@ -182,7 +182,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 */
> @@ -334,6 +335,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 *);
> @@ -371,6 +377,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);
> 




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

* Re: [PATCH v6 2/6] ACPI: Add _OST support for sysfs eject
@ 2012-07-05 11:16     ` Yasuaki Ishimatsu
  0 siblings, 0 replies; 17+ messages in thread
From: Yasuaki Ishimatsu @ 2012-07-05 11:16 UTC (permalink / raw)
  To: Toshi Kani
  Cc: lenb, linux-acpi, bhelgaas, shuahkhan, liuj97, andi, linux-kernel

Hi Toshi,

2012/06/27 5:42, Toshi Kani wrote:
> 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
> 
> Signed-off-by: Toshi Kani <toshi.kani@hp.com>
> ---
>   drivers/acpi/scan.c     |   57 +++++++++++++++++++++++++++++++++++++++-------
>   include/acpi/acpi_bus.h |    9 ++++++-
>   2 files changed, 56 insertions(+), 10 deletions(-)
> 
> diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c
> index c8a1f3b..dbdb9fc 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,20 @@ 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)
> +			pr_warn(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;
>   }

When I read your patch named [PATCH] ACPI: Add ACPI CPU hot-remove support,
a question about this patch appeared.

The question is :
Why does not acpi_bus_hot_remove_device() inform firmware of
ACPI_OST_SC_SUCCESS, when it succeeded? Are thre any reasons?

If you have already discussed my question, please let me know the log.

Thanks,
Yasuaki Ishimatsu


>   
> @@ -144,6 +164,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 +181,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 1d9e432..b22b774 100644
> --- a/include/acpi/acpi_bus.h
> +++ b/include/acpi/acpi_bus.h
> @@ -182,7 +182,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 */
> @@ -334,6 +335,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 *);
> @@ -371,6 +377,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);
> 




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

* Re: [PATCH v6 2/6] ACPI: Add _OST support for sysfs eject
  2012-07-05 11:16     ` Yasuaki Ishimatsu
  (?)
@ 2012-07-05 14:43     ` Toshi Kani
  2012-07-05 23:37         ` Yasuaki Ishimatsu
  -1 siblings, 1 reply; 17+ messages in thread
From: Toshi Kani @ 2012-07-05 14:43 UTC (permalink / raw)
  To: Yasuaki Ishimatsu
  Cc: lenb, linux-acpi, bhelgaas, shuahkhan, liuj97, andi, linux-kernel

On Thu, 2012-07-05 at 20:16 +0900, Yasuaki Ishimatsu wrote:
> Hi Toshi,
> 
> 2012/06/27 5:42, Toshi Kani wrote:
> > 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
> > 
> > Signed-off-by: Toshi Kani <toshi.kani@hp.com>
> > ---
> >   drivers/acpi/scan.c     |   57 +++++++++++++++++++++++++++++++++++++++-------
> >   include/acpi/acpi_bus.h |    9 ++++++-
> >   2 files changed, 56 insertions(+), 10 deletions(-)
> > 
> > diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c
> > index c8a1f3b..dbdb9fc 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,20 @@ 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)
> > +			pr_warn(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;
> >   }
> 
> When I read your patch named [PATCH] ACPI: Add ACPI CPU hot-remove support,
> a question about this patch appeared.
> 
> The question is :
> Why does not acpi_bus_hot_remove_device() inform firmware of
> ACPI_OST_SC_SUCCESS, when it succeeded? Are thre any reasons?
> 
> If you have already discussed my question, please let me know the log.

Hi Yasuaki,

Please refer Figure 2, page 14, of the following document.  _EJ0
substitutes _OST as it indicates to the firmware that the OS was
successful in offlining.

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

Figure 6-37 of ACPI 5.0 spec also has a similar example flow.

Thanks,
-Toshi


> Thanks,
> Yasuaki Ishimatsu
> 
> 
> >   
> > @@ -144,6 +164,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 +181,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 1d9e432..b22b774 100644
> > --- a/include/acpi/acpi_bus.h
> > +++ b/include/acpi/acpi_bus.h
> > @@ -182,7 +182,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 */
> > @@ -334,6 +335,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 *);
> > @@ -371,6 +377,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);
> > 
> 
> 
> 

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

* Re: [PATCH v6 2/6] ACPI: Add _OST support for sysfs eject
  2012-07-05 14:43     ` Toshi Kani
@ 2012-07-05 23:37         ` Yasuaki Ishimatsu
  0 siblings, 0 replies; 17+ messages in thread
From: Yasuaki Ishimatsu @ 2012-07-05 23:37 UTC (permalink / raw)
  To: Toshi Kani
  Cc: lenb, linux-acpi, bhelgaas, shuahkhan, liuj97, andi, linux-kernel

Hi Toshi,

2012/07/05 23:43, Toshi Kani wrote:
> On Thu, 2012-07-05 at 20:16 +0900, Yasuaki Ishimatsu wrote:
>> Hi Toshi,
>>
>> 2012/06/27 5:42, Toshi Kani wrote:
>>> 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
>>>
>>> Signed-off-by: Toshi Kani <toshi.kani@hp.com>
>>> ---
>>>    drivers/acpi/scan.c     |   57 +++++++++++++++++++++++++++++++++++++++-------
>>>    include/acpi/acpi_bus.h |    9 ++++++-
>>>    2 files changed, 56 insertions(+), 10 deletions(-)
>>>
>>> diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c
>>> index c8a1f3b..dbdb9fc 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,20 @@ 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)
>>> +			pr_warn(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;
>>>    }
>>
>> When I read your patch named [PATCH] ACPI: Add ACPI CPU hot-remove support,
>> a question about this patch appeared.
>>
>> The question is :
>> Why does not acpi_bus_hot_remove_device() inform firmware of
>> ACPI_OST_SC_SUCCESS, when it succeeded? Are thre any reasons?
>>
>> If you have already discussed my question, please let me know the log.
>
> Hi Yasuaki,
>
> Please refer Figure 2, page 14, of the following document.  _EJ0
> substitutes _OST as it indicates to the firmware that the OS was
> successful in offlining.
>
>    DIG64 Hot-Plug & Partitioning Flow (HPPF) Specification R1.0
>    http://www.dig64.org/home/DIG64_HPPF_R1_0.pdf
>
> Figure 6-37 of ACPI 5.0 spec also has a similar example flow.

My question was solved by the document.

Thanks,
Yasuaki Ishimatsu

>
> Thanks,
> -Toshi
>
>
>> Thanks,
>> Yasuaki Ishimatsu
>>
>>
>>>
>>> @@ -144,6 +164,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 +181,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 1d9e432..b22b774 100644
>>> --- a/include/acpi/acpi_bus.h
>>> +++ b/include/acpi/acpi_bus.h
>>> @@ -182,7 +182,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 */
>>> @@ -334,6 +335,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 *);
>>> @@ -371,6 +377,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);
>>>
>>
>>
>>
>
>




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

* Re: [PATCH v6 2/6] ACPI: Add _OST support for sysfs eject
@ 2012-07-05 23:37         ` Yasuaki Ishimatsu
  0 siblings, 0 replies; 17+ messages in thread
From: Yasuaki Ishimatsu @ 2012-07-05 23:37 UTC (permalink / raw)
  To: Toshi Kani
  Cc: lenb, linux-acpi, bhelgaas, shuahkhan, liuj97, andi, linux-kernel

Hi Toshi,

2012/07/05 23:43, Toshi Kani wrote:
> On Thu, 2012-07-05 at 20:16 +0900, Yasuaki Ishimatsu wrote:
>> Hi Toshi,
>>
>> 2012/06/27 5:42, Toshi Kani wrote:
>>> 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
>>>
>>> Signed-off-by: Toshi Kani <toshi.kani@hp.com>
>>> ---
>>>    drivers/acpi/scan.c     |   57 +++++++++++++++++++++++++++++++++++++++-------
>>>    include/acpi/acpi_bus.h |    9 ++++++-
>>>    2 files changed, 56 insertions(+), 10 deletions(-)
>>>
>>> diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c
>>> index c8a1f3b..dbdb9fc 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,20 @@ 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)
>>> +			pr_warn(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;
>>>    }
>>
>> When I read your patch named [PATCH] ACPI: Add ACPI CPU hot-remove support,
>> a question about this patch appeared.
>>
>> The question is :
>> Why does not acpi_bus_hot_remove_device() inform firmware of
>> ACPI_OST_SC_SUCCESS, when it succeeded? Are thre any reasons?
>>
>> If you have already discussed my question, please let me know the log.
>
> Hi Yasuaki,
>
> Please refer Figure 2, page 14, of the following document.  _EJ0
> substitutes _OST as it indicates to the firmware that the OS was
> successful in offlining.
>
>    DIG64 Hot-Plug & Partitioning Flow (HPPF) Specification R1.0
>    http://www.dig64.org/home/DIG64_HPPF_R1_0.pdf
>
> Figure 6-37 of ACPI 5.0 spec also has a similar example flow.

My question was solved by the document.

Thanks,
Yasuaki Ishimatsu

>
> Thanks,
> -Toshi
>
>
>> Thanks,
>> Yasuaki Ishimatsu
>>
>>
>>>
>>> @@ -144,6 +164,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 +181,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 1d9e432..b22b774 100644
>>> --- a/include/acpi/acpi_bus.h
>>> +++ b/include/acpi/acpi_bus.h
>>> @@ -182,7 +182,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 */
>>> @@ -334,6 +335,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 *);
>>> @@ -371,6 +377,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);
>>>
>>
>>
>>
>
>




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

* Re: [PATCH v6 0/6] ACPI: Add _OST support for ACPI hotplug
  2012-06-26 20:42 [PATCH v6 0/6] ACPI: Add _OST support for ACPI hotplug Toshi Kani
                   ` (5 preceding siblings ...)
  2012-06-26 20:42 ` [PATCH v6 6/6] ACPI: Set hotplug _OST support bit to _OSC Toshi Kani
@ 2012-07-16 12:52 ` Prarit Bhargava
  2012-07-16 14:50   ` Toshi Kani
  6 siblings, 1 reply; 17+ messages in thread
From: Prarit Bhargava @ 2012-07-16 12:52 UTC (permalink / raw)
  To: Kani, Toshimitsu
  Cc: lenb, linux-acpi, bhelgaas, shuahkhan, liuj97, andi,
	isimatu.yasuaki, linux-kernel

On 01/-10/-28163 02:59 PM, Kani, Toshimitsu wrote:
>  * This version updates to use pr_<level> over printk to accommodate
>    checkpatch update since this patchset was accepted in -next.
> 
> This patchset supports ACPI OSPM Status Indication (_OST) method for
> ACPI CPU/memory/container hotplug operations and sysfs eject. After
> an ACPI hotplug operation has completed, OSPM calls _OST to indicate
> the result of the operation to the platform. If a platform does not
> support _OST, this patchset has no effect on the platform.
> 
> This _OST support is enabled when all relevant ACPI hotplug operations,
> such as CPU, memory and container hotplug, are enabled. This assures
> consistent behavior among the 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.
> 
> 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.
> 
> v6:
>  - Updated to use pr_<level> over printk.
> 
> v5:
>  - Updated change log in patch 5/6.
> 
> v4:
>  - Removed CONFIG_ACPI_HOTPLUG_OST option.
> 
> 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 (6):
>  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

I have a few systems on which I can do some _OST CPU and Memory hotplug.  These
systems are newer Intel systems in which ACPI events can be triggered via
switches to add CPUs.

I tested this patchset with CPU _add_ and haven't seen any issues.

So...

Tested-by: Prarit Bhargava <prarit@redhat.com>

P.

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

* Re: [PATCH v6 0/6] ACPI: Add _OST support for ACPI hotplug
  2012-07-16 12:52 ` [PATCH v6 0/6] ACPI: Add _OST support for ACPI hotplug Prarit Bhargava
@ 2012-07-16 14:50   ` Toshi Kani
  0 siblings, 0 replies; 17+ messages in thread
From: Toshi Kani @ 2012-07-16 14:50 UTC (permalink / raw)
  To: Prarit Bhargava
  Cc: lenb, linux-acpi, bhelgaas, shuahkhan, liuj97, andi,
	isimatu.yasuaki, linux-kernel

On Mon, 2012-07-16 at 08:52 -0400, Prarit Bhargava wrote:
> On 01/-10/-28163 02:59 PM, Kani, Toshimitsu wrote:
> >  * This version updates to use pr_<level> over printk to accommodate
> >    checkpatch update since this patchset was accepted in -next.
> > 
> > This patchset supports ACPI OSPM Status Indication (_OST) method for
> > ACPI CPU/memory/container hotplug operations and sysfs eject. After
> > an ACPI hotplug operation has completed, OSPM calls _OST to indicate
> > the result of the operation to the platform. If a platform does not
> > support _OST, this patchset has no effect on the platform.
> > 
> > This _OST support is enabled when all relevant ACPI hotplug operations,
> > such as CPU, memory and container hotplug, are enabled. This assures
> > consistent behavior among the 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.
> > 
> > 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.
> > 
> > v6:
> >  - Updated to use pr_<level> over printk.
> > 
> > v5:
> >  - Updated change log in patch 5/6.
> > 
> > v4:
> >  - Removed CONFIG_ACPI_HOTPLUG_OST option.
> > 
> > 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 (6):
> >  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
> 
> I have a few systems on which I can do some _OST CPU and Memory hotplug.  These
> systems are newer Intel systems in which ACPI events can be triggered via
> switches to add CPUs.
> 
> I tested this patchset with CPU _add_ and haven't seen any issues.
> 
> So...
> 
> Tested-by: Prarit Bhargava <prarit@redhat.com>

Hi Prarit,

That's great!  Thanks a lot!

-Toshi


> 
> P.



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

end of thread, other threads:[~2012-07-16 14:55 UTC | newest]

Thread overview: 17+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-06-26 20:42 [PATCH v6 0/6] ACPI: Add _OST support for ACPI hotplug Toshi Kani
2012-06-26 20:42 ` [PATCH v6 1/6] ACPI: Add an interface to evaluate _OST Toshi Kani
2012-06-26 20:42 ` [PATCH v6 2/6] ACPI: Add _OST support for sysfs eject Toshi Kani
2012-07-05 11:16   ` Yasuaki Ishimatsu
2012-07-05 11:16     ` Yasuaki Ishimatsu
2012-07-05 14:43     ` Toshi Kani
2012-07-05 23:37       ` Yasuaki Ishimatsu
2012-07-05 23:37         ` Yasuaki Ishimatsu
2012-06-26 20:42 ` [PATCH v6 3/6] ACPI: Add _OST support for ACPI CPU hotplug Toshi Kani
2012-06-26 20:42 ` [PATCH v6 4/6] ACPI: Add _OST support for ACPI memory hotplug Toshi Kani
2012-06-26 20:42 ` [PATCH v6 5/6] ACPI: Add _OST support for ACPI container hotplug Toshi Kani
2012-06-27  6:05   ` Yasuaki Ishimatsu
2012-06-27  6:05     ` Yasuaki Ishimatsu
2012-06-27 15:37     ` Toshi Kani
2012-06-26 20:42 ` [PATCH v6 6/6] ACPI: Set hotplug _OST support bit to _OSC Toshi Kani
2012-07-16 12:52 ` [PATCH v6 0/6] ACPI: Add _OST support for ACPI hotplug Prarit Bhargava
2012-07-16 14:50   ` 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.