* [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.