[V3] acpi:apei:handle GSIV and GPIO notification types

Message ID 86258A5CC0A3704780874CF6004BA8A62E695201@FRAEML521-MBX.china.huawei.com
State Accepted
Commit 7bf130e4a0653f6cec83a387de5de0c2c9fa4dba
Headers show

Commit Message

Shiju Jose April 19, 2017, 12:03 p.m.
System Controller Interrupts are received by ACPI's error device,
which in turn notifies the GHES code. The same is true of
APEI's GSIV and GPIO notification types.
Add support for GSIV and GPIO sharing the SCI
register/unregister/notifier code.Rename the list and notifier
to show this is no longer just SCI, but anything from the
Hardware Error Device.

Signed-off-by: Shiju Jose <shiju.jose@huawei.com>

[james.morse@arm.com: rewrote commit log]
Signed-off-by: James Morse <james.morse@arm.com>

CC: James Morse <james.morse@arm.com>
CC: Hanjun Guo <guohanjun@huawei.com>
Reviewed-by: James Morse <james.morse@arm.com>

---
 drivers/acpi/apei/ghes.c | 40 ++++++++++++++++++++++++++--------------
 1 file changed, 26 insertions(+), 14 deletions(-)

-- 
1.9.1

--
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

Comments

Baicar, Tyler April 19, 2017, 3:50 p.m. | #1
On 4/19/2017 6:03 AM, Shiju Jose wrote:
> System Controller Interrupts are received by ACPI's error device,

> which in turn notifies the GHES code. The same is true of

> APEI's GSIV and GPIO notification types.

> Add support for GSIV and GPIO sharing the SCI

> register/unregister/notifier code.Rename the list and notifier

> to show this is no longer just SCI, but anything from the

> Hardware Error Device.

>

> Signed-off-by: Shiju Jose <shiju.jose@huawei.com>

> [james.morse@arm.com: rewrote commit log]

> Signed-off-by: James Morse <james.morse@arm.com>

> CC: James Morse <james.morse@arm.com>

> CC: Hanjun Guo <guohanjun@huawei.com>

> Reviewed-by: James Morse <james.morse@arm.com>

Tested-by: Tyler Baicar <tbaicar@codeaurora.org>


Thanks,
Tyler

-- 
Qualcomm Datacenter Technologies, Inc. as an affiliate of Qualcomm Technologies, Inc.
Qualcomm Technologies, Inc. is a member of the Code Aurora Forum,
a Linux Foundation Collaborative Project.

--
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
Borislav Petkov April 19, 2017, 10 p.m. | #2
On Wed, Apr 19, 2017 at 12:03:51PM +0000, Shiju Jose wrote:
> System Controller Interrupts are received by ACPI's error device,

> which in turn notifies the GHES code. The same is true of

> APEI's GSIV and GPIO notification types.

> Add support for GSIV and GPIO sharing the SCI

> register/unregister/notifier code.Rename the list and notifier

> to show this is no longer just SCI, but anything from the

> Hardware Error Device.

> 

> Signed-off-by: Shiju Jose <shiju.jose@huawei.com>

> [james.morse@arm.com: rewrote commit log]

> Signed-off-by: James Morse <james.morse@arm.com>

> CC: James Morse <james.morse@arm.com>

> CC: Hanjun Guo <guohanjun@huawei.com>

> Reviewed-by: James Morse <james.morse@arm.com>

> ---

>  drivers/acpi/apei/ghes.c | 40 ++++++++++++++++++++++++++--------------

>  1 file changed, 26 insertions(+), 14 deletions(-)


Applied, thanks.

-- 
Regards/Gruss,
    Boris.

SUSE Linux GmbH, GF: Felix Imend├Ârffer, Jane Smithard, Graham Norton, HRB 21284 (AG N├╝rnberg)
-- 
--
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

Patch hide | download patch | download mbox

diff --git a/drivers/acpi/apei/ghes.c b/drivers/acpi/apei/ghes.c
index b192b42..652971a 100644
--- a/drivers/acpi/apei/ghes.c
+++ b/drivers/acpi/apei/ghes.c
@@ -89,14 +89,15 @@ 
 module_param_named(disable, ghes_disable, bool, 0);
 
 /*
- * All error sources notified with SCI shares one notifier function,
- * so they need to be linked and checked one by one.  This is applied
- * to NMI too.
+ * All error sources notified with HED(Hardware Error Device)
+ * share a single notifier callback, so they need to be
+ * linked and checked one by one.  This holds true for
+ * NMI too.
  *
  * RCU is used for these lists, so ghes_list_mutex is only used for
  * list changing, not for traversing.
  */
-static LIST_HEAD(ghes_sci);
+static LIST_HEAD(ghes_hed);
 static DEFINE_MUTEX(ghes_list_mutex);
 
 /*
@@ -702,14 +703,14 @@  static irqreturn_t ghes_irq_func(int irq, void *data)
 	return IRQ_HANDLED;
 }
 
-static int ghes_notify_sci(struct notifier_block *this,
-				  unsigned long event, void *data)
+static int ghes_notify_hed(struct notifier_block *this,
+				    unsigned long event, void *data)
 {
 	struct ghes *ghes;
 	int ret = NOTIFY_DONE;
 
 	rcu_read_lock();
-	list_for_each_entry_rcu(ghes, &ghes_sci, list) {
+	list_for_each_entry_rcu(ghes, &ghes_hed, list) {
 		if (!ghes_proc(ghes))
 			ret = NOTIFY_OK;
 	}
@@ -718,8 +719,8 @@  static int ghes_notify_sci(struct notifier_block *this,
 	return ret;
 }
 
-static struct notifier_block ghes_notifier_sci = {
-	.notifier_call = ghes_notify_sci,
+static struct notifier_block ghes_notifier_hed = {
+	.notifier_call = ghes_notify_hed,
 };
 
 #ifdef CONFIG_HAVE_ACPI_APEI_NMI
@@ -966,7 +967,10 @@  static int ghes_probe(struct platform_device *ghes_dev)
 	case ACPI_HEST_NOTIFY_POLLED:
 	case ACPI_HEST_NOTIFY_EXTERNAL:
 	case ACPI_HEST_NOTIFY_SCI:
+	case ACPI_HEST_NOTIFY_GSIV:
+	case ACPI_HEST_NOTIFY_GPIO:
 		break;
+
 	case ACPI_HEST_NOTIFY_NMI:
 		if (!IS_ENABLED(CONFIG_HAVE_ACPI_APEI_NMI)) {
 			pr_warn(GHES_PFX "Generic hardware error source: %d notified via NMI interrupt is not supported!\n",
@@ -1025,13 +1029,17 @@  static int ghes_probe(struct platform_device *ghes_dev)
 			goto err_edac_unreg;
 		}
 		break;
+
 	case ACPI_HEST_NOTIFY_SCI:
+	case ACPI_HEST_NOTIFY_GSIV:
+	case ACPI_HEST_NOTIFY_GPIO:
 		mutex_lock(&ghes_list_mutex);
-		if (list_empty(&ghes_sci))
-			register_acpi_hed_notifier(&ghes_notifier_sci);
-		list_add_rcu(&ghes->list, &ghes_sci);
+		if (list_empty(&ghes_hed))
+			register_acpi_hed_notifier(&ghes_notifier_hed);
+		list_add_rcu(&ghes->list, &ghes_hed);
 		mutex_unlock(&ghes_list_mutex);
 		break;
+
 	case ACPI_HEST_NOTIFY_NMI:
 		ghes_nmi_add(ghes);
 		break;
@@ -1067,13 +1075,17 @@  static int ghes_remove(struct platform_device *ghes_dev)
 	case ACPI_HEST_NOTIFY_EXTERNAL:
 		free_irq(ghes->irq, ghes);
 		break;
+
 	case ACPI_HEST_NOTIFY_SCI:
+	case ACPI_HEST_NOTIFY_GSIV:
+	case ACPI_HEST_NOTIFY_GPIO:
 		mutex_lock(&ghes_list_mutex);
 		list_del_rcu(&ghes->list);
-		if (list_empty(&ghes_sci))
-			unregister_acpi_hed_notifier(&ghes_notifier_sci);
+		if (list_empty(&ghes_hed))
+			unregister_acpi_hed_notifier(&ghes_notifier_hed);
 		mutex_unlock(&ghes_list_mutex);
 		break;
+
 	case ACPI_HEST_NOTIFY_NMI:
 		ghes_nmi_remove(ghes);
 		break;