Module Name:    src
Committed By:   jmcneill
Date:           Tue Jan 11 10:53:08 UTC 2022

Modified Files:
        src/sys/dev/acpi: acpi_event.c acpi_event.h acpi_ged.c

Log Message:
acpi: ged: Mask interrupts before dispatching handler

For the benefit of GEDs backed by level interrupts, mask the interrupt
source before dispatching the handler to a worker thread and unmask it
after it has been handled.


To generate a diff of this commit:
cvs rdiff -u -r1.1 -r1.2 src/sys/dev/acpi/acpi_event.c \
    src/sys/dev/acpi/acpi_event.h
cvs rdiff -u -r1.3 -r1.4 src/sys/dev/acpi/acpi_ged.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/acpi/acpi_event.c
diff -u src/sys/dev/acpi/acpi_event.c:1.1 src/sys/dev/acpi/acpi_event.c:1.2
--- src/sys/dev/acpi/acpi_event.c:1.1	Mon Oct 22 22:29:35 2018
+++ src/sys/dev/acpi/acpi_event.c	Tue Jan 11 10:53:08 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: acpi_event.c,v 1.1 2018/10/22 22:29:35 jmcneill Exp $ */
+/* $NetBSD: acpi_event.c,v 1.2 2022/01/11 10:53:08 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2018 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: acpi_event.c,v 1.1 2018/10/22 22:29:35 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: acpi_event.c,v 1.2 2022/01/11 10:53:08 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -40,12 +40,14 @@ __KERNEL_RCSID(0, "$NetBSD: acpi_event.c
 #include <dev/acpi/acpireg.h>
 #include <dev/acpi/acpivar.h>
 #include <dev/acpi/acpi_event.h>
+#include <dev/acpi/acpi_intr.h>
 
 struct acpi_event {
 	device_t	ev_dev;
 	ACPI_HANDLE	ev_method;
 	bool		ev_method_evt;
 	UINT16		ev_data;
+	void		*ev_intrcookie;
 };
 
 struct acpi_event_gpio_context {
@@ -68,6 +70,7 @@ acpi_event_create(device_t dev, ACPI_HAN
 	ev->ev_method = NULL;
 	ev->ev_method_evt = false;
 	ev->ev_data = data;
+	ev->ev_intrcookie = NULL;
 
 	if (data <= 255) {
 		snprintf(namebuf, sizeof(namebuf), "_%c%02X", trigchar, data);
@@ -169,13 +172,30 @@ acpi_event_invoke(void *priv)
 	}
 
 	rv = AcpiEvaluateObject(ev->ev_method, NULL, arg, NULL);
-	if (ACPI_FAILURE(rv))
+	if (ACPI_FAILURE(rv)) {
 		device_printf(ev->ev_dev, "failed to handle %s event: %s\n",
 		    acpi_name(ev->ev_method), AcpiFormatException(rv));
+	}
+
+	if (ev->ev_intrcookie != NULL) {
+		acpi_intr_unmask(ev->ev_intrcookie);
+	}
 }
 
 ACPI_STATUS
 acpi_event_notify(struct acpi_event *ev)
 {
+	if (ev->ev_intrcookie != NULL) {
+		acpi_intr_mask(ev->ev_intrcookie);
+	}
+
 	return AcpiOsExecute(OSL_NOTIFY_HANDLER, acpi_event_invoke, ev);
 }
+
+void
+acpi_event_set_intrcookie(struct acpi_event *ev, void *intrcookie)
+{
+	KASSERT(ev->ev_intrcookie == NULL);
+
+	ev->ev_intrcookie = intrcookie;
+}
Index: src/sys/dev/acpi/acpi_event.h
diff -u src/sys/dev/acpi/acpi_event.h:1.1 src/sys/dev/acpi/acpi_event.h:1.2
--- src/sys/dev/acpi/acpi_event.h:1.1	Mon Oct 22 22:29:35 2018
+++ src/sys/dev/acpi/acpi_event.h	Tue Jan 11 10:53:08 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: acpi_event.h,v 1.1 2018/10/22 22:29:35 jmcneill Exp $ */
+/* $NetBSD: acpi_event.h,v 1.2 2022/01/11 10:53:08 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2018 The NetBSD Foundation, Inc.
@@ -39,5 +39,6 @@ ACPI_STATUS	acpi_event_create_gpio(devic
 ACPI_STATUS	acpi_event_create_int(device_t, ACPI_HANDLE,
 		    void (*)(void *, struct acpi_event *, struct acpi_irq *), void *);
 ACPI_STATUS	acpi_event_notify(struct acpi_event *);
+void		acpi_event_set_intrcookie(struct acpi_event *, void *);
 
 #endif /* !_DEV_ACPI_ACPI_EVENT_H */

Index: src/sys/dev/acpi/acpi_ged.c
diff -u src/sys/dev/acpi/acpi_ged.c:1.3 src/sys/dev/acpi/acpi_ged.c:1.4
--- src/sys/dev/acpi/acpi_ged.c:1.3	Fri Jan 29 15:49:55 2021
+++ src/sys/dev/acpi/acpi_ged.c	Tue Jan 11 10:53:08 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: acpi_ged.c,v 1.3 2021/01/29 15:49:55 thorpej Exp $ */
+/* $NetBSD: acpi_ged.c,v 1.4 2022/01/11 10:53:08 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2018 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: acpi_ged.c,v 1.3 2021/01/29 15:49:55 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: acpi_ged.c,v 1.4 2022/01/11 10:53:08 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -87,6 +87,7 @@ acpi_ged_register_event(void *priv, stru
 		aprint_error_dev(dev, "couldn't establish interrupt (irq %d)\n", irq->ar_irq);
 		return;
 	}
+	acpi_event_set_intrcookie(ev, ih);
 }
 
 static int

Reply via email to