summaryrefslogtreecommitdiffstats
path: root/sys/dev/acpi/amdgpio.c
diff options
context:
space:
mode:
authorjsg <jsg@openbsd.org>2020-01-26 00:11:42 +0000
committerjsg <jsg@openbsd.org>2020-01-26 00:11:42 +0000
commit8ffdb2b1db37b780d4efe88ff71c25c7e79e7b7c (patch)
treecedd651182788cf899b07460f3a67a831e2a37c3 /sys/dev/acpi/amdgpio.c
parentunbreak unittests for recent API / source file changes (diff)
downloadwireguard-openbsd-8ffdb2b1db37b780d4efe88ff71c25c7e79e7b7c.tar.xz
wireguard-openbsd-8ffdb2b1db37b780d4efe88ff71c25c7e79e7b7c.zip
In amdgpio_pin_intr() disable pins a pending interrupt is seen for which
have no interrupt handler registered. Avoids interrupt storm on Matebook D reported by brynet@ From James Hastings. ok kettenis@ brynet@
Diffstat (limited to 'sys/dev/acpi/amdgpio.c')
-rw-r--r--sys/dev/acpi/amdgpio.c32
1 files changed, 20 insertions, 12 deletions
diff --git a/sys/dev/acpi/amdgpio.c b/sys/dev/acpi/amdgpio.c
index 3c125552604..5971fd44508 100644
--- a/sys/dev/acpi/amdgpio.c
+++ b/sys/dev/acpi/amdgpio.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: amdgpio.c,v 1.1 2019/12/23 08:05:42 kettenis Exp $ */
+/* $OpenBSD: amdgpio.c,v 1.2 2020/01/26 00:11:42 jsg Exp $ */
/*
* Copyright (c) 2016 Mark Kettenis
* Copyright (c) 2019 James Hastings
@@ -260,20 +260,28 @@ int
amdgpio_pin_intr(struct amdgpio_softc *sc, int pin)
{
uint32_t reg;
+ int rc = 0;
reg = bus_space_read_4(sc->sc_memt, sc->sc_memh, pin * 4);
- if (!(reg & AMDGPIO_CONF_INT_STS) ||
- !(reg & AMDGPIO_CONF_INT_MASK))
- return 0;
-
- if (sc->sc_pin_ih[pin].ih_func)
- sc->sc_pin_ih[pin].ih_func(sc->sc_pin_ih[pin].ih_arg);
-
- /* Clear interrupt */
- reg = bus_space_read_4(sc->sc_memt, sc->sc_memh, pin * 4);
- bus_space_write_4(sc->sc_memt, sc->sc_memh, pin * 4, reg);
+ if (reg & AMDGPIO_CONF_INT_STS) {
+ if (sc->sc_pin_ih[pin].ih_func) {
+ sc->sc_pin_ih[pin].ih_func(sc->sc_pin_ih[pin].ih_arg);
+
+ /* Clear interrupt */
+ reg = bus_space_read_4(sc->sc_memt, sc->sc_memh,
+ pin * 4);
+ bus_space_write_4(sc->sc_memt, sc->sc_memh,
+ pin * 4, reg);
+ rc = 1;
+ } else {
+ /* Mask unhandled interrupt */
+ reg &= ~(AMDGPIO_CONF_INT_MASK | AMDGPIO_CONF_INT_EN);
+ bus_space_write_4(sc->sc_memt, sc->sc_memh,
+ pin * 4, reg);
+ }
+ }
- return 1;
+ return rc;
}
int