Module Name:    src
Committed By:   jmcneill
Date:           Fri Nov 16 23:05:50 UTC 2018

Modified Files:
        src/sys/dev/acpi: acpi_intr.h acpi_util.c sdhc_acpi.c
        src/sys/dev/i2c: ihidev.c

Log Message:
Use acpi_md_intr_establish/disestablish to handle device IRQs. The existing
code abused AcpiOsInstallInterruptHandler, which is meant for installing
the SCI handler.


To generate a diff of this commit:
cvs rdiff -u -r1.2 -r1.3 src/sys/dev/acpi/acpi_intr.h
cvs rdiff -u -r1.13 -r1.14 src/sys/dev/acpi/acpi_util.c
cvs rdiff -u -r1.5 -r1.6 src/sys/dev/acpi/sdhc_acpi.c
cvs rdiff -u -r1.6 -r1.7 src/sys/dev/i2c/ihidev.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_intr.h
diff -u src/sys/dev/acpi/acpi_intr.h:1.2 src/sys/dev/acpi/acpi_intr.h:1.3
--- src/sys/dev/acpi/acpi_intr.h:1.2	Tue Mar 20 12:14:52 2018
+++ src/sys/dev/acpi/acpi_intr.h	Fri Nov 16 23:05:50 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: acpi_intr.h,v 1.2 2018/03/20 12:14:52 bouyer Exp $ */
+/* $NetBSD: acpi_intr.h,v 1.3 2018/11/16 23:05:50 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2017 The NetBSD Foundation, Inc.
@@ -28,7 +28,7 @@
  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  * POSSIBILITY OF SUCH DAMAGE.
  */
-void *		acpi_intr_establish(device_t, uint64_t,
-		    unsigned int (*intr)(void *), void *, const char *);
-void 		acpi_intr_disestablish(void *, unsigned int (*intr)(void *));
+void *		acpi_intr_establish(device_t, uint64_t, int, bool,
+		    int (*intr)(void *), void *, const char *);
+void 		acpi_intr_disestablish(void *);
 const char * 	acpi_intr_string(void *, char *, size_t len);

Index: src/sys/dev/acpi/acpi_util.c
diff -u src/sys/dev/acpi/acpi_util.c:1.13 src/sys/dev/acpi/acpi_util.c:1.14
--- src/sys/dev/acpi/acpi_util.c:1.13	Fri Oct 12 23:25:29 2018
+++ src/sys/dev/acpi/acpi_util.c	Fri Nov 16 23:05:50 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: acpi_util.c,v 1.13 2018/10/12 23:25:29 jmcneill Exp $ */
+/*	$NetBSD: acpi_util.c,v 1.14 2018/11/16 23:05:50 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2003, 2007 The NetBSD Foundation, Inc.
@@ -65,7 +65,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: acpi_util.c,v 1.13 2018/10/12 23:25:29 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: acpi_util.c,v 1.14 2018/11/16 23:05:50 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/kmem.h>
@@ -75,6 +75,8 @@ __KERNEL_RCSID(0, "$NetBSD: acpi_util.c,
 #include <dev/acpi/acpivar.h>
 #include <dev/acpi/acpi_intr.h>
 
+#include <machine/acpi_machdep.h>
+
 #define _COMPONENT	ACPI_BUS_COMPONENT
 ACPI_MODULE_NAME	("acpi_util")
 
@@ -550,18 +552,19 @@ out:
 struct acpi_irq_handler {
 	ACPI_HANDLE aih_hdl;
 	uint32_t aih_irq;
-	int (*aih_intr)(void *);
+	void *aih_ih;
 };
 
 void *
-acpi_intr_establish(device_t dev, uint64_t c,
-    unsigned int (*intr)(void *), void *iarg, const char *xname)
+acpi_intr_establish(device_t dev, uint64_t c, int ipl, bool mpsafe,
+    int (*intr)(void *), void *iarg, const char *xname)
 {
 	ACPI_STATUS rv;
 	ACPI_HANDLE hdl = (void *)(uintptr_t)c;
 	struct acpi_resources res;
 	struct acpi_irq *irq;
 	struct acpi_irq_handler *aih = NULL;
+	void *ih;
 
 	rv = acpi_resource_parse(dev, hdl, "_CRS", &res,
 	    &acpi_resource_parse_ops_quiet);
@@ -572,30 +575,28 @@ acpi_intr_establish(device_t dev, uint64
 	if (irq == NULL)
 		goto end;
 
-	aih = kmem_alloc(sizeof(struct acpi_irq_handler), KM_NOSLEEP);
-	if (aih == NULL)
+	const int type = (irq->ar_type == ACPI_EDGE_SENSITIVE) ? IST_EDGE : IST_LEVEL;
+	ih = acpi_md_intr_establish(irq->ar_irq, ipl, type, intr, iarg, mpsafe, xname);
+	if (ih == NULL)
 		goto end;
 
+	aih = kmem_alloc(sizeof(struct acpi_irq_handler), KM_SLEEP);
 	aih->aih_hdl = hdl;
 	aih->aih_irq = irq->ar_irq;
-	rv = AcpiOsInstallInterruptHandler_xname(irq->ar_irq, intr, iarg, xname);
-	if (ACPI_FAILURE(rv)) {
-		kmem_free(aih, sizeof(struct acpi_irq_handler));
-		aih = NULL;
-	}
+	aih->aih_ih = ih;
+
 end:
 	acpi_resource_cleanup(&res);
 	return aih;
 }
 
 void
-acpi_intr_disestablish(void *c, unsigned int (*intr)(void *))
+acpi_intr_disestablish(void *c)
 {
 	struct acpi_irq_handler *aih = c;
 
-	AcpiOsRemoveInterruptHandler(aih->aih_irq, intr);
+	acpi_md_intr_disestablish(aih->aih_ih);
 	kmem_free(aih, sizeof(struct acpi_irq_handler));
-	return;
 }
 
 const char *

Index: src/sys/dev/acpi/sdhc_acpi.c
diff -u src/sys/dev/acpi/sdhc_acpi.c:1.5 src/sys/dev/acpi/sdhc_acpi.c:1.6
--- src/sys/dev/acpi/sdhc_acpi.c:1.5	Tue May  8 03:27:17 2018
+++ src/sys/dev/acpi/sdhc_acpi.c	Fri Nov 16 23:05:50 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: sdhc_acpi.c,v 1.5 2018/05/08 03:27:17 mlelstv Exp $	*/
+/*	$NetBSD: sdhc_acpi.c,v 1.6 2018/11/16 23:05:50 jmcneill Exp $	*/
 
 /*
  * Copyright (c) 2016 Kimihiro Nonaka <non...@netbsd.org>
@@ -26,7 +26,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sdhc_acpi.c,v 1.5 2018/05/08 03:27:17 mlelstv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sdhc_acpi.c,v 1.6 2018/11/16 23:05:50 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/device.h>
@@ -35,6 +35,7 @@ __KERNEL_RCSID(0, "$NetBSD: sdhc_acpi.c,
 
 #include <dev/acpi/acpireg.h>
 #include <dev/acpi/acpivar.h>
+#include <dev/acpi/acpi_intr.h>
 
 #include <dev/sdmmc/sdhcreg.h>
 #include <dev/sdmmc/sdhcvar.h>
@@ -53,7 +54,7 @@ struct sdhc_acpi_softc {
 	bus_space_tag_t sc_memt;
 	bus_space_handle_t sc_memh;
 	bus_size_t sc_memsize;
-	int sc_irq;
+	void *sc_ih;
 
 	ACPI_HANDLE sc_crs, sc_srs;
 	ACPI_BUFFER sc_crs_buffer;
@@ -62,7 +63,6 @@ struct sdhc_acpi_softc {
 CFATTACH_DECL_NEW(sdhc_acpi, sizeof(struct sdhc_acpi_softc),
     sdhc_acpi_match, sdhc_acpi_attach, sdhc_acpi_detach, NULL);
 
-static uint32_t	sdhc_acpi_intr(void *);
 static void	sdhc_acpi_intel_emmc_hw_reset(struct sdhc_softc *,
 		    struct sdhc_host *);
 
@@ -140,7 +140,6 @@ sdhc_acpi_attach(device_t parent, device
 	sc->sc.sc_dmat = aa->aa_dmat;
 	sc->sc.sc_host = NULL;
 	sc->sc_memt = aa->aa_memt;
-	sc->sc_irq = -1;
 
 	slot = sdhc_acpi_find_slot(aa->aa_node->ad_devinfo);
 	if (slot->type == SLOT_TYPE_EMMC)
@@ -180,14 +179,13 @@ sdhc_acpi_attach(device_t parent, device
 		goto cleanup;
 	}
 
-	/* XXX acpi_intr_establish? */
-	rv = AcpiOsInstallInterruptHandler(irq->ar_irq, sdhc_acpi_intr, sc);
-	if (ACPI_FAILURE(rv)) {
+	sc->sc_ih = acpi_intr_establish(self, (uint64_t)aa->aa_node->ad_handle,
+	    IPL_BIO, false, sdhc_intr, &sc->sc, device_xname(self));
+	if (sc->sc_ih == NULL) {
 		aprint_error_dev(self,
 		    "couldn't establish interrupt handler\n");
 		goto unmap;
 	}
-	sc->sc_irq = irq->ar_irq;
 
 	sc->sc.sc_host = kmem_zalloc(sizeof(struct sdhc_host *), KM_NOSLEEP);
 	if (sc->sc.sc_host == NULL) {
@@ -217,10 +215,9 @@ fail:
 		kmem_free(sc->sc.sc_host, sizeof(struct sdhc_host *));
 	sc->sc.sc_host = NULL;
 intr_disestablish:
-	if (sc->sc_irq >= 0)
-		/* XXX acpi_intr_disestablish? */
-		AcpiOsRemoveInterruptHandler(sc->sc_irq, sdhc_acpi_intr);
-	sc->sc_irq = -1;
+	if (sc->sc_ih != NULL)
+		acpi_intr_disestablish(sc->sc_ih);
+	sc->sc_ih = NULL;
 unmap:
 	bus_space_unmap(sc->sc_memt, sc->sc_memh, sc->sc_memsize);
 	sc->sc_memsize = 0;
@@ -243,9 +240,8 @@ sdhc_acpi_detach(device_t self, int flag
 	if (rv)
 		return rv;
 
-	if (sc->sc_irq >= 0)
-		/* XXX acpi_intr_disestablish? */
-		AcpiOsRemoveInterruptHandler(sc->sc_irq, sdhc_acpi_intr);
+	if (sc->sc_ih != NULL)
+		acpi_intr_disestablish(sc->sc_ih);
 
 	if (sc->sc.sc_host != NULL)
 		kmem_free(sc->sc.sc_host, sizeof(struct sdhc_host *));
@@ -275,16 +271,6 @@ sdhc_acpi_resume(device_t self, const pm
 	return sdhc_resume(self, qual);
 }
 
-static uint32_t
-sdhc_acpi_intr(void *context)
-{
-	struct sdhc_acpi_softc *sc = context;
-
-	if (!sdhc_intr(&sc->sc))
-		return ACPI_INTERRUPT_NOT_HANDLED;
-	return ACPI_INTERRUPT_HANDLED;
-}
-
 static void
 sdhc_acpi_intel_emmc_hw_reset(struct sdhc_softc *sc, struct sdhc_host *hp)
 {

Index: src/sys/dev/i2c/ihidev.c
diff -u src/sys/dev/i2c/ihidev.c:1.6 src/sys/dev/i2c/ihidev.c:1.7
--- src/sys/dev/i2c/ihidev.c:1.6	Thu Nov 15 23:01:45 2018
+++ src/sys/dev/i2c/ihidev.c	Fri Nov 16 23:05:50 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: ihidev.c,v 1.6 2018/11/15 23:01:45 jakllsch Exp $ */
+/* $NetBSD: ihidev.c,v 1.7 2018/11/16 23:05:50 jmcneill Exp $ */
 /* $OpenBSD ihidev.c,v 1.13 2017/04/08 02:57:23 deraadt Exp $ */
 
 /*-
@@ -54,7 +54,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ihidev.c,v 1.6 2018/11/15 23:01:45 jakllsch Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ihidev.c,v 1.7 2018/11/16 23:05:50 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -112,7 +112,7 @@ CFATTACH_DECL_NEW(ihidev, sizeof(struct 
 static bool	ihidev_suspend(device_t, const pmf_qual_t *);
 static bool	ihidev_resume(device_t, const pmf_qual_t *);
 static int	ihidev_hid_command(struct ihidev_softc *, int, void *, bool);
-static unsigned int ihidev_intr(void *);
+static int	ihidev_intr(void *);
 static int	ihidev_reset(struct ihidev_softc *, bool);
 static int	ihidev_hid_desc_parse(struct ihidev_softc *);
 
@@ -208,8 +208,8 @@ ihidev_attach(device_t parent, device_t 
 	{
 		char buf[100];
 
-		sc->sc_ih = acpi_intr_establish(self,
-		    sc->sc_phandle, ihidev_intr, sc, device_xname(self));
+		sc->sc_ih = acpi_intr_establish(self, sc->sc_phandle, IPL_TTY,
+		    false, ihidev_intr, sc, device_xname(self));
 		if (sc->sc_ih == NULL)
 			aprint_error_dev(self, "can't establish interrupt\n");
 		aprint_normal_dev(self, "interrupting at %s\n",
@@ -264,7 +264,7 @@ ihidev_detach(device_t self, int flags)
 	mutex_enter(&sc->sc_intr_lock);
 #if NACPICA > 0
 	if (sc->sc_ih != NULL)
-		acpi_intr_disestablish(sc->sc_ih, ihidev_intr);
+		acpi_intr_disestablish(sc->sc_ih);
 #endif
 	if (ihidev_hid_command(sc, I2C_HID_CMD_SET_POWER,
 	    &I2C_HID_POWER_OFF, true))
@@ -651,7 +651,7 @@ ihidev_hid_desc_parse(struct ihidev_soft
 	return (0);
 }
 
-static unsigned int
+static int
 ihidev_intr(void *arg)
 {
 	struct ihidev_softc *sc = arg;

Reply via email to