linux-pci.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [Patch v1 1/3] ACPI: add callback prepare() into acpi_hotplug_handler
@ 2014-01-18  2:48 Jiang Liu
  2014-01-18  2:48 ` [Patch v1 2/3] ACPI, PCI: reuse ACPI hotplug framework to support PCI host bridge hotplug Jiang Liu
                   ` (2 more replies)
  0 siblings, 3 replies; 8+ messages in thread
From: Jiang Liu @ 2014-01-18  2:48 UTC (permalink / raw)
  To: Rafael J . Wysocki, Bjorn Helgaas, Toshi Kani, Yinghai Lu,
	Yijing Wang, Len Brown, Rafael J. Wysocki, Robert Moore, Lv Zheng
  Cc: Jiang Liu, linux-acpi, linux-pci, linux-kernel, devel

Add callback prepare() into acpi_hotplug_handler, which will get called
at the very beginning of ACPI hotplug event handler. The ACPI core will
ignore the event if prepare() returns NOTIFY_STOP.

Signed-off-by: Jiang Liu <jiang.liu@linux.intel.com>
---
 drivers/acpi/scan.c     |    4 ++++
 include/acpi/acpi_bus.h |    1 +
 2 files changed, 5 insertions(+)

diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c
index fd39459..6b0f419 100644
--- a/drivers/acpi/scan.c
+++ b/drivers/acpi/scan.c
@@ -392,6 +392,10 @@ static void acpi_hotplug_notify_cb(acpi_handle handle, u32 type, void *data)
 	struct acpi_device *adev;
 	acpi_status status;
 
+	if (handler->prepare &&
+	    handler->prepare(handle, type, data) == NOTIFY_STOP)
+		return;
+
 	if (!handler->hotplug.enabled)
 		return acpi_hotplug_unsupported(handle, type);
 
diff --git a/include/acpi/acpi_bus.h b/include/acpi/acpi_bus.h
index ddabed1..09a73bd 100644
--- a/include/acpi/acpi_bus.h
+++ b/include/acpi/acpi_bus.h
@@ -113,6 +113,7 @@ static inline struct acpi_hotplug_profile *to_acpi_hotplug_profile(
 struct acpi_scan_handler {
 	const struct acpi_device_id *ids;
 	struct list_head list_node;
+	int (*prepare)(acpi_handle handle, u32 type, void *context);
 	int (*attach)(struct acpi_device *dev, const struct acpi_device_id *id);
 	void (*detach)(struct acpi_device *dev);
 	struct acpi_hotplug_profile hotplug;
-- 
1.7.10.4


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

* [Patch v1 2/3] ACPI, PCI: reuse ACPI hotplug framework to support PCI host bridge hotplug
  2014-01-18  2:48 [Patch v1 1/3] ACPI: add callback prepare() into acpi_hotplug_handler Jiang Liu
@ 2014-01-18  2:48 ` Jiang Liu
  2014-01-18  3:23   ` Yinghai Lu
  2014-01-18  2:48 ` [Patch v1 3/3] ACPI: kill field 'ignore' in acpi_hotplug_profile Jiang Liu
  2014-01-21 21:14 ` [Patch v1 1/3] ACPI: add callback prepare() into acpi_hotplug_handler Toshi Kani
  2 siblings, 1 reply; 8+ messages in thread
From: Jiang Liu @ 2014-01-18  2:48 UTC (permalink / raw)
  To: Rafael J . Wysocki, Bjorn Helgaas, Toshi Kani, Yinghai Lu,
	Yijing Wang, Len Brown, Rafael J. Wysocki
  Cc: Jiang Liu, linux-acpi, linux-pci, linux-kernel

Reuse ACPI hotplug framework to support PCI host bridge hotplug, this
makes PCI host bridge hotplug implementation simpler and more clear.

It also fixes a bug in support of PCI host bridge hot-addition.
Currently pci_root driver fails to install notification handler for
PCI host bridge absent at boot time because acpi_is_root_bridge()
returns false if no ACPI device created for handle. So PCI host
bridge hot-addition event will just be ignored by system.

Signed-off-by: Jiang Liu <jiang.liu@linux.intel.com>
---
 drivers/acpi/internal.h |    1 -
 drivers/acpi/pci_root.c |  117 +++++++----------------------------------------
 drivers/acpi/scan.c     |    2 -
 3 files changed, 17 insertions(+), 103 deletions(-)

diff --git a/drivers/acpi/internal.h b/drivers/acpi/internal.h
index a29739c..03efa56 100644
--- a/drivers/acpi/internal.h
+++ b/drivers/acpi/internal.h
@@ -28,7 +28,6 @@ int init_acpi_device_notify(void);
 int acpi_scan_init(void);
 void acpi_pci_root_init(void);
 void acpi_pci_link_init(void);
-void acpi_pci_root_hp_init(void);
 void acpi_processor_init(void);
 void acpi_platform_init(void);
 int acpi_sysfs_init(void);
diff --git a/drivers/acpi/pci_root.c b/drivers/acpi/pci_root.c
index 20360e4..6f6e6c1 100644
--- a/drivers/acpi/pci_root.c
+++ b/drivers/acpi/pci_root.c
@@ -50,6 +50,7 @@ ACPI_MODULE_NAME("pci_root");
 static int acpi_pci_root_add(struct acpi_device *device,
 			     const struct acpi_device_id *not_used);
 static void acpi_pci_root_remove(struct acpi_device *device);
+static int handle_hotplug_event_root(acpi_handle handle, u32 type, void *ctx);
 
 #define ACPI_PCIE_REQ_SUPPORT (OSC_PCI_EXT_CONFIG_SUPPORT \
 				| OSC_PCI_ASPM_SUPPORT \
@@ -61,12 +62,14 @@ static const struct acpi_device_id root_device_ids[] = {
 	{"", 0},
 };
 
+
 static struct acpi_scan_handler pci_root_handler = {
 	.ids = root_device_ids,
+	.prepare = handle_hotplug_event_root,
 	.attach = acpi_pci_root_add,
 	.detach = acpi_pci_root_remove,
 	.hotplug = {
-		.ignore = true,
+		.enabled = true,
 	},
 };
 
@@ -627,113 +630,27 @@ void __init acpi_pci_root_init(void)
 
 	if (!acpi_pci_disabled) {
 		pci_acpi_crs_quirks();
-		acpi_scan_add_handler(&pci_root_handler);
-	}
-}
-/* Support root bridge hotplug */
-
-static void handle_root_bridge_insertion(acpi_handle handle)
-{
-	struct acpi_device *device;
-
-	if (!acpi_bus_get_device(handle, &device)) {
-		dev_printk(KERN_DEBUG, &device->dev,
-			   "acpi device already exists; ignoring notify\n");
-		return;
+		acpi_scan_add_handler_with_hotplug(&pci_root_handler,
+						   "pci_hostbridge");
 	}
-
-	if (acpi_bus_scan(handle))
-		acpi_handle_err(handle, "cannot add bridge to acpi list\n");
 }
 
-static void hotplug_event_root(void *data, u32 type)
+static int handle_hotplug_event_root(acpi_handle handle, u32 type, void *ctx)
 {
-	acpi_handle handle = data;
+	int ret = NOTIFY_OK;
 	struct acpi_pci_root *root;
 
-	acpi_scan_lock_acquire();
-
-	root = acpi_pci_find_root(handle);
-
-	switch (type) {
-	case ACPI_NOTIFY_BUS_CHECK:
-		/* bus enumerate */
-		acpi_handle_printk(KERN_DEBUG, handle,
-				   "Bus check notify on %s\n", __func__);
-		if (root)
+	if (type == ACPI_NOTIFY_BUS_CHECK) {
+		acpi_scan_lock_acquire();
+		root = acpi_pci_find_root(handle);
+		if (root) {
+			acpi_handle_printk(KERN_DEBUG, handle,
+				"Bus check notify on %s\n", __func__);
 			acpiphp_check_host_bridge(handle);
-		else
-			handle_root_bridge_insertion(handle);
-
-		break;
-
-	case ACPI_NOTIFY_DEVICE_CHECK:
-		/* device check */
-		acpi_handle_printk(KERN_DEBUG, handle,
-				   "Device check notify on %s\n", __func__);
-		if (!root)
-			handle_root_bridge_insertion(handle);
-		break;
-
-	case ACPI_NOTIFY_EJECT_REQUEST:
-		/* request device eject */
-		acpi_handle_printk(KERN_DEBUG, handle,
-				   "Device eject notify on %s\n", __func__);
-		if (!root)
-			break;
-
-		get_device(&root->device->dev);
-
+			ret = NOTIFY_STOP;
+		}
 		acpi_scan_lock_release();
-
-		acpi_bus_device_eject(root->device, ACPI_NOTIFY_EJECT_REQUEST);
-		return;
-	default:
-		acpi_handle_warn(handle,
-				 "notify_handler: unknown event type 0x%x\n",
-				 type);
-		break;
 	}
 
-	acpi_scan_lock_release();
-}
-
-static void handle_hotplug_event_root(acpi_handle handle, u32 type,
-					void *context)
-{
-	acpi_hotplug_execute(hotplug_event_root, handle, type);
-}
-
-static acpi_status __init
-find_root_bridges(acpi_handle handle, u32 lvl, void *context, void **rv)
-{
-	acpi_status status;
-	int *count = (int *)context;
-
-	if (!acpi_is_root_bridge(handle))
-		return AE_OK;
-
-	(*count)++;
-
-	status = acpi_install_notify_handler(handle, ACPI_SYSTEM_NOTIFY,
-					handle_hotplug_event_root, NULL);
-	if (ACPI_FAILURE(status))
-		acpi_handle_printk(KERN_DEBUG, handle,
-			"notify handler is not installed, exit status: %u\n",
-			 (unsigned int)status);
-	else
-		acpi_handle_printk(KERN_DEBUG, handle,
-				   "notify handler is installed\n");
-
-	return AE_OK;
-}
-
-void __init acpi_pci_root_hp_init(void)
-{
-	int num = 0;
-
-	acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT,
-		ACPI_UINT32_MAX, find_root_bridges, NULL, &num, NULL);
-
-	printk(KERN_DEBUG "Found %d acpi root devices\n", num);
+	return ret;
 }
diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c
index 6b0f419..d83e0ff 100644
--- a/drivers/acpi/scan.c
+++ b/drivers/acpi/scan.c
@@ -2057,8 +2057,6 @@ int __init acpi_scan_init(void)
 
 	acpi_update_all_gpes();
 
-	acpi_pci_root_hp_init();
-
  out:
 	mutex_unlock(&acpi_scan_lock);
 	return result;
-- 
1.7.10.4


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

* [Patch v1 3/3] ACPI: kill field 'ignore' in acpi_hotplug_profile
  2014-01-18  2:48 [Patch v1 1/3] ACPI: add callback prepare() into acpi_hotplug_handler Jiang Liu
  2014-01-18  2:48 ` [Patch v1 2/3] ACPI, PCI: reuse ACPI hotplug framework to support PCI host bridge hotplug Jiang Liu
@ 2014-01-18  2:48 ` Jiang Liu
  2014-01-21 21:14 ` [Patch v1 1/3] ACPI: add callback prepare() into acpi_hotplug_handler Toshi Kani
  2 siblings, 0 replies; 8+ messages in thread
From: Jiang Liu @ 2014-01-18  2:48 UTC (permalink / raw)
  To: Rafael J . Wysocki, Bjorn Helgaas, Toshi Kani, Yinghai Lu,
	Yijing Wang, Len Brown, Rafael J. Wysocki, Robert Moore, Lv Zheng
  Cc: Jiang Liu, linux-acpi, linux-pci, linux-kernel, devel

Field 'ignore' in acpi_hotplug_profile is introduced by "ca499fc87ed945
ACPI / hotplug: Fix conflicted PCI bridge notify handlers" to support
PCI host bridge hotplug. Now it's useless, so kill it.

Signed-off-by: Jiang Liu <jiang.liu@linux.intel.com>
---
 drivers/acpi/scan.c     |    2 +-
 include/acpi/acpi_bus.h |    1 -
 2 files changed, 1 insertion(+), 2 deletions(-)

diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c
index d83e0ff..b932ae6 100644
--- a/drivers/acpi/scan.c
+++ b/drivers/acpi/scan.c
@@ -1776,7 +1776,7 @@ static void acpi_scan_init_hotplug(acpi_handle handle, int type)
 	 */
 	list_for_each_entry(hwid, &pnp.ids, list) {
 		handler = acpi_scan_match_handler(hwid->id, NULL);
-		if (handler && !handler->hotplug.ignore) {
+		if (handler) {
 			acpi_install_notify_handler(handle, ACPI_SYSTEM_NOTIFY,
 					acpi_hotplug_notify_cb, handler);
 			break;
diff --git a/include/acpi/acpi_bus.h b/include/acpi/acpi_bus.h
index 09a73bd..d1f6ebd 100644
--- a/include/acpi/acpi_bus.h
+++ b/include/acpi/acpi_bus.h
@@ -100,7 +100,6 @@ enum acpi_hotplug_mode {
 struct acpi_hotplug_profile {
 	struct kobject kobj;
 	bool enabled:1;
-	bool ignore:1;
 	enum acpi_hotplug_mode mode;
 };
 
-- 
1.7.10.4


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

* Re: [Patch v1 2/3] ACPI, PCI: reuse ACPI hotplug framework to support PCI host bridge hotplug
  2014-01-18  2:48 ` [Patch v1 2/3] ACPI, PCI: reuse ACPI hotplug framework to support PCI host bridge hotplug Jiang Liu
@ 2014-01-18  3:23   ` Yinghai Lu
  2014-01-18  3:48     ` Jiang Liu
  0 siblings, 1 reply; 8+ messages in thread
From: Yinghai Lu @ 2014-01-18  3:23 UTC (permalink / raw)
  To: Jiang Liu
  Cc: Rafael J . Wysocki, Bjorn Helgaas, Toshi Kani, Yijing Wang,
	Len Brown, Rafael J. Wysocki, ACPI Devel Maling List,
	linux-pci@vger.kernel.org, Linux Kernel Mailing List

On Fri, Jan 17, 2014 at 6:48 PM, Jiang Liu <jiang.liu@linux.intel.com> wrote:
> Reuse ACPI hotplug framework to support PCI host bridge hotplug, this
> makes PCI host bridge hotplug implementation simpler and more clear.
>
> It also fixes a bug in support of PCI host bridge hot-addition.
> Currently pci_root driver fails to install notification handler for
> PCI host bridge absent at boot time because acpi_is_root_bridge()
> returns false if no ACPI device created for handle. So PCI host
> bridge hot-addition event will just be ignored by system.
>
> Signed-off-by: Jiang Liu <jiang.liu@linux.intel.com>

is the same as

commit 3338db0057ed9f554050bd06863731c515d79672
Author: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Date:   Fri Nov 22 21:55:20 2013 +0100

    ACPI / hotplug: Make ACPI PCI root hotplug use common hotplug code

in rafael tree pm/linux-next for 3.14?

> ---
>  drivers/acpi/internal.h |    1 -
>  drivers/acpi/pci_root.c |  117 +++++++----------------------------------------
>  drivers/acpi/scan.c     |    2 -
>  3 files changed, 17 insertions(+), 103 deletions(-)
>
> diff --git a/drivers/acpi/internal.h b/drivers/acpi/internal.h
> index a29739c..03efa56 100644
> --- a/drivers/acpi/internal.h
> +++ b/drivers/acpi/internal.h
> @@ -28,7 +28,6 @@ int init_acpi_device_notify(void);
>  int acpi_scan_init(void);
>  void acpi_pci_root_init(void);
>  void acpi_pci_link_init(void);
> -void acpi_pci_root_hp_init(void);
>  void acpi_processor_init(void);
>  void acpi_platform_init(void);
>  int acpi_sysfs_init(void);
> diff --git a/drivers/acpi/pci_root.c b/drivers/acpi/pci_root.c
> index 20360e4..6f6e6c1 100644
> --- a/drivers/acpi/pci_root.c
> +++ b/drivers/acpi/pci_root.c
> @@ -50,6 +50,7 @@ ACPI_MODULE_NAME("pci_root");
>  static int acpi_pci_root_add(struct acpi_device *device,
>                              const struct acpi_device_id *not_used);
>  static void acpi_pci_root_remove(struct acpi_device *device);
> +static int handle_hotplug_event_root(acpi_handle handle, u32 type, void *ctx);
>
>  #define ACPI_PCIE_REQ_SUPPORT (OSC_PCI_EXT_CONFIG_SUPPORT \
>                                 | OSC_PCI_ASPM_SUPPORT \
> @@ -61,12 +62,14 @@ static const struct acpi_device_id root_device_ids[] = {
>         {"", 0},
>  };
>
> +
>  static struct acpi_scan_handler pci_root_handler = {
>         .ids = root_device_ids,
> +       .prepare = handle_hotplug_event_root,
>         .attach = acpi_pci_root_add,
>         .detach = acpi_pci_root_remove,
>         .hotplug = {
> -               .ignore = true,
> +               .enabled = true,
>         },
>  };
>
> @@ -627,113 +630,27 @@ void __init acpi_pci_root_init(void)
>
>         if (!acpi_pci_disabled) {
>                 pci_acpi_crs_quirks();
> -               acpi_scan_add_handler(&pci_root_handler);
> -       }
> -}
> -/* Support root bridge hotplug */
> -
> -static void handle_root_bridge_insertion(acpi_handle handle)
> -{
> -       struct acpi_device *device;
> -
> -       if (!acpi_bus_get_device(handle, &device)) {
> -               dev_printk(KERN_DEBUG, &device->dev,
> -                          "acpi device already exists; ignoring notify\n");
> -               return;
> +               acpi_scan_add_handler_with_hotplug(&pci_root_handler,
> +                                                  "pci_hostbridge");
>         }
> -
> -       if (acpi_bus_scan(handle))
> -               acpi_handle_err(handle, "cannot add bridge to acpi list\n");
>  }
>
> -static void hotplug_event_root(void *data, u32 type)
> +static int handle_hotplug_event_root(acpi_handle handle, u32 type, void *ctx)
>  {
> -       acpi_handle handle = data;
> +       int ret = NOTIFY_OK;
>         struct acpi_pci_root *root;
>
> -       acpi_scan_lock_acquire();
> -
> -       root = acpi_pci_find_root(handle);
> -
> -       switch (type) {
> -       case ACPI_NOTIFY_BUS_CHECK:
> -               /* bus enumerate */
> -               acpi_handle_printk(KERN_DEBUG, handle,
> -                                  "Bus check notify on %s\n", __func__);
> -               if (root)
> +       if (type == ACPI_NOTIFY_BUS_CHECK) {
> +               acpi_scan_lock_acquire();
> +               root = acpi_pci_find_root(handle);
> +               if (root) {
> +                       acpi_handle_printk(KERN_DEBUG, handle,
> +                               "Bus check notify on %s\n", __func__);
>                         acpiphp_check_host_bridge(handle);
> -               else
> -                       handle_root_bridge_insertion(handle);
> -
> -               break;
> -
> -       case ACPI_NOTIFY_DEVICE_CHECK:
> -               /* device check */
> -               acpi_handle_printk(KERN_DEBUG, handle,
> -                                  "Device check notify on %s\n", __func__);
> -               if (!root)
> -                       handle_root_bridge_insertion(handle);
> -               break;
> -
> -       case ACPI_NOTIFY_EJECT_REQUEST:
> -               /* request device eject */
> -               acpi_handle_printk(KERN_DEBUG, handle,
> -                                  "Device eject notify on %s\n", __func__);
> -               if (!root)
> -                       break;
> -
> -               get_device(&root->device->dev);
> -
> +                       ret = NOTIFY_STOP;
> +               }
>                 acpi_scan_lock_release();
> -
> -               acpi_bus_device_eject(root->device, ACPI_NOTIFY_EJECT_REQUEST);
> -               return;
> -       default:
> -               acpi_handle_warn(handle,
> -                                "notify_handler: unknown event type 0x%x\n",
> -                                type);
> -               break;
>         }
>
> -       acpi_scan_lock_release();
> -}
> -
> -static void handle_hotplug_event_root(acpi_handle handle, u32 type,
> -                                       void *context)
> -{
> -       acpi_hotplug_execute(hotplug_event_root, handle, type);
> -}
> -
> -static acpi_status __init
> -find_root_bridges(acpi_handle handle, u32 lvl, void *context, void **rv)
> -{
> -       acpi_status status;
> -       int *count = (int *)context;
> -
> -       if (!acpi_is_root_bridge(handle))
> -               return AE_OK;
> -
> -       (*count)++;
> -
> -       status = acpi_install_notify_handler(handle, ACPI_SYSTEM_NOTIFY,
> -                                       handle_hotplug_event_root, NULL);
> -       if (ACPI_FAILURE(status))
> -               acpi_handle_printk(KERN_DEBUG, handle,
> -                       "notify handler is not installed, exit status: %u\n",
> -                        (unsigned int)status);
> -       else
> -               acpi_handle_printk(KERN_DEBUG, handle,
> -                                  "notify handler is installed\n");
> -
> -       return AE_OK;
> -}
> -
> -void __init acpi_pci_root_hp_init(void)
> -{
> -       int num = 0;
> -
> -       acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT,
> -               ACPI_UINT32_MAX, find_root_bridges, NULL, &num, NULL);
> -
> -       printk(KERN_DEBUG "Found %d acpi root devices\n", num);
> +       return ret;
>  }
> diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c
> index 6b0f419..d83e0ff 100644
> --- a/drivers/acpi/scan.c
> +++ b/drivers/acpi/scan.c
> @@ -2057,8 +2057,6 @@ int __init acpi_scan_init(void)
>
>         acpi_update_all_gpes();
>
> -       acpi_pci_root_hp_init();
> -
>   out:
>         mutex_unlock(&acpi_scan_lock);
>         return result;
> --
> 1.7.10.4
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

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

* Re: [Patch v1 2/3] ACPI, PCI: reuse ACPI hotplug framework to support PCI host bridge hotplug
  2014-01-18  3:23   ` Yinghai Lu
@ 2014-01-18  3:48     ` Jiang Liu
  0 siblings, 0 replies; 8+ messages in thread
From: Jiang Liu @ 2014-01-18  3:48 UTC (permalink / raw)
  To: Yinghai Lu
  Cc: Rafael J . Wysocki, Bjorn Helgaas, Toshi Kani, Yijing Wang,
	Len Brown, Rafael J. Wysocki, ACPI Devel Maling List,
	linux-pci@vger.kernel.org, Linux Kernel Mailing List

Hi yinghai,
	Sorry for the noise. I didn't noticed Rafael's work,
so I generated this patchset when encountered this issue
during testing PCI host bridge hotplug. It should achieve
the same goal.
Thanks!
Gerry

On 2014/1/18 11:23, Yinghai Lu wrote:
> ACPI / hotplug: Make ACPI PCI root hotplug use common hotplug code

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

* Re: [Patch v1 1/3] ACPI: add callback prepare() into acpi_hotplug_handler
  2014-01-18  2:48 [Patch v1 1/3] ACPI: add callback prepare() into acpi_hotplug_handler Jiang Liu
  2014-01-18  2:48 ` [Patch v1 2/3] ACPI, PCI: reuse ACPI hotplug framework to support PCI host bridge hotplug Jiang Liu
  2014-01-18  2:48 ` [Patch v1 3/3] ACPI: kill field 'ignore' in acpi_hotplug_profile Jiang Liu
@ 2014-01-21 21:14 ` Toshi Kani
  2014-01-21 23:17   ` Rafael J. Wysocki
  2 siblings, 1 reply; 8+ messages in thread
From: Toshi Kani @ 2014-01-21 21:14 UTC (permalink / raw)
  To: Jiang Liu
  Cc: Rafael J . Wysocki, Bjorn Helgaas, Yinghai Lu, Yijing Wang,
	Len Brown, Rafael J. Wysocki, Robert Moore, Lv Zheng, linux-acpi,
	linux-pci, linux-kernel, devel

On Sat, 2014-01-18 at 10:48 +0800, Jiang Liu wrote:
> Add callback prepare() into acpi_hotplug_handler, which will get called
> at the very beginning of ACPI hotplug event handler. The ACPI core will
> ignore the event if prepare() returns NOTIFY_STOP.
> 
> Signed-off-by: Jiang Liu <jiang.liu@linux.intel.com>
> ---
>  drivers/acpi/scan.c     |    4 ++++
>  include/acpi/acpi_bus.h |    1 +
>  2 files changed, 5 insertions(+)
> 
> diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c
> index fd39459..6b0f419 100644
> --- a/drivers/acpi/scan.c
> +++ b/drivers/acpi/scan.c
> @@ -392,6 +392,10 @@ static void acpi_hotplug_notify_cb(acpi_handle handle, u32 type, void *data)
>  	struct acpi_device *adev;
>  	acpi_status status;
>  
> +	if (handler->prepare &&
> +	    handler->prepare(handle, type, data) == NOTIFY_STOP)
> +		return;

The OS is responsible for calling _OST when it is implemented.  So you
cannot just return here.  See acpi_hotplug_unsupported(handle, type)
next line.  Also, please describe why prepare() needs to be added.

Thanks,
-Toshi



> +
>  	if (!handler->hotplug.enabled)
>  		return acpi_hotplug_unsupported(handle, type);
>  
> diff --git a/include/acpi/acpi_bus.h b/include/acpi/acpi_bus.h
> index ddabed1..09a73bd 100644
> --- a/include/acpi/acpi_bus.h
> +++ b/include/acpi/acpi_bus.h
> @@ -113,6 +113,7 @@ static inline struct acpi_hotplug_profile *to_acpi_hotplug_profile(
>  struct acpi_scan_handler {
>  	const struct acpi_device_id *ids;
>  	struct list_head list_node;
> +	int (*prepare)(acpi_handle handle, u32 type, void *context);
>  	int (*attach)(struct acpi_device *dev, const struct acpi_device_id *id);
>  	void (*detach)(struct acpi_device *dev);
>  	struct acpi_hotplug_profile hotplug;



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

* Re: [Patch v1 1/3] ACPI: add callback prepare() into acpi_hotplug_handler
  2014-01-21 23:17   ` Rafael J. Wysocki
@ 2014-01-21 23:06     ` Toshi Kani
  0 siblings, 0 replies; 8+ messages in thread
From: Toshi Kani @ 2014-01-21 23:06 UTC (permalink / raw)
  To: Rafael J. Wysocki
  Cc: Jiang Liu, Rafael J . Wysocki, Bjorn Helgaas, Yinghai Lu,
	Yijing Wang, Len Brown, Robert Moore, Lv Zheng, linux-acpi,
	linux-pci, linux-kernel, devel

On Wed, 2014-01-22 at 00:17 +0100, Rafael J. Wysocki wrote:
> On Tuesday, January 21, 2014 02:14:57 PM Toshi Kani wrote:
> > On Sat, 2014-01-18 at 10:48 +0800, Jiang Liu wrote:
> > > Add callback prepare() into acpi_hotplug_handler, which will get called
> > > at the very beginning of ACPI hotplug event handler. The ACPI core will
> > > ignore the event if prepare() returns NOTIFY_STOP.
> > > 
> > > Signed-off-by: Jiang Liu <jiang.liu@linux.intel.com>
> > > ---
> > >  drivers/acpi/scan.c     |    4 ++++
> > >  include/acpi/acpi_bus.h |    1 +
> > >  2 files changed, 5 insertions(+)
> > > 
> > > diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c
> > > index fd39459..6b0f419 100644
> > > --- a/drivers/acpi/scan.c
> > > +++ b/drivers/acpi/scan.c
> > > @@ -392,6 +392,10 @@ static void acpi_hotplug_notify_cb(acpi_handle handle, u32 type, void *data)
> > >  	struct acpi_device *adev;
> > >  	acpi_status status;
> > >  
> > > +	if (handler->prepare &&
> > > +	    handler->prepare(handle, type, data) == NOTIFY_STOP)
> > > +		return;
> > 
> > The OS is responsible for calling _OST when it is implemented.  So you
> > cannot just return here.  See acpi_hotplug_unsupported(handle, type)
> > next line.  Also, please describe why prepare() needs to be added.
> 
> I don't think it's needed any more, please see:
> 
> http://marc.info/?l=linux-acpi&m=139001691317575&w=2

Oh, I see.  Thanks!
-Toshi


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

* Re: [Patch v1 1/3] ACPI: add callback prepare() into acpi_hotplug_handler
  2014-01-21 21:14 ` [Patch v1 1/3] ACPI: add callback prepare() into acpi_hotplug_handler Toshi Kani
@ 2014-01-21 23:17   ` Rafael J. Wysocki
  2014-01-21 23:06     ` Toshi Kani
  0 siblings, 1 reply; 8+ messages in thread
From: Rafael J. Wysocki @ 2014-01-21 23:17 UTC (permalink / raw)
  To: Toshi Kani
  Cc: Jiang Liu, Rafael J . Wysocki, Bjorn Helgaas, Yinghai Lu,
	Yijing Wang, Len Brown, Robert Moore, Lv Zheng, linux-acpi,
	linux-pci, linux-kernel, devel

On Tuesday, January 21, 2014 02:14:57 PM Toshi Kani wrote:
> On Sat, 2014-01-18 at 10:48 +0800, Jiang Liu wrote:
> > Add callback prepare() into acpi_hotplug_handler, which will get called
> > at the very beginning of ACPI hotplug event handler. The ACPI core will
> > ignore the event if prepare() returns NOTIFY_STOP.
> > 
> > Signed-off-by: Jiang Liu <jiang.liu@linux.intel.com>
> > ---
> >  drivers/acpi/scan.c     |    4 ++++
> >  include/acpi/acpi_bus.h |    1 +
> >  2 files changed, 5 insertions(+)
> > 
> > diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c
> > index fd39459..6b0f419 100644
> > --- a/drivers/acpi/scan.c
> > +++ b/drivers/acpi/scan.c
> > @@ -392,6 +392,10 @@ static void acpi_hotplug_notify_cb(acpi_handle handle, u32 type, void *data)
> >  	struct acpi_device *adev;
> >  	acpi_status status;
> >  
> > +	if (handler->prepare &&
> > +	    handler->prepare(handle, type, data) == NOTIFY_STOP)
> > +		return;
> 
> The OS is responsible for calling _OST when it is implemented.  So you
> cannot just return here.  See acpi_hotplug_unsupported(handle, type)
> next line.  Also, please describe why prepare() needs to be added.

I don't think it's needed any more, please see:

http://marc.info/?l=linux-acpi&m=139001691317575&w=2

Thanks,
Rafael


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

end of thread, other threads:[~2014-01-21 23:06 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-01-18  2:48 [Patch v1 1/3] ACPI: add callback prepare() into acpi_hotplug_handler Jiang Liu
2014-01-18  2:48 ` [Patch v1 2/3] ACPI, PCI: reuse ACPI hotplug framework to support PCI host bridge hotplug Jiang Liu
2014-01-18  3:23   ` Yinghai Lu
2014-01-18  3:48     ` Jiang Liu
2014-01-18  2:48 ` [Patch v1 3/3] ACPI: kill field 'ignore' in acpi_hotplug_profile Jiang Liu
2014-01-21 21:14 ` [Patch v1 1/3] ACPI: add callback prepare() into acpi_hotplug_handler Toshi Kani
2014-01-21 23:17   ` Rafael J. Wysocki
2014-01-21 23:06     ` Toshi Kani

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).