diff options
author | 2020-01-26 00:11:42 +0000 | |
---|---|---|
committer | 2020-01-26 00:11:42 +0000 | |
commit | 8ffdb2b1db37b780d4efe88ff71c25c7e79e7b7c (patch) | |
tree | cedd651182788cf899b07460f3a67a831e2a37c3 /sys/dev/acpi/amdgpio.c | |
parent | unbreak unittests for recent API / source file changes (diff) | |
download | wireguard-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.c | 32 |
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 |