Module Name: src Committed By: jmcneill Date: Thu Jan 30 00:42:47 UTC 2025
Modified Files: src/sys/dev/acpi: xhci_acpi.c src/sys/dev/usb: xhci.c xhcivar.h Log Message: xhci: Always do 32-bit accesses for platform (ACPI) XHCI devices. The XHCI IP found in the CIX CD8180 throws an serror for any access that is not 32-bit aligned. Let's add an XHCI_32BIT_ACCESS flag and set it unconditionally for platform devices as there are only a handful of non- 32-bit accesses at init time. To generate a diff of this commit: cvs rdiff -u -r1.14 -r1.15 src/sys/dev/acpi/xhci_acpi.c cvs rdiff -u -r1.186 -r1.187 src/sys/dev/usb/xhci.c cvs rdiff -u -r1.24 -r1.25 src/sys/dev/usb/xhcivar.h 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/xhci_acpi.c diff -u src/sys/dev/acpi/xhci_acpi.c:1.14 src/sys/dev/acpi/xhci_acpi.c:1.15 --- src/sys/dev/acpi/xhci_acpi.c:1.14 Mon Dec 9 22:15:33 2024 +++ src/sys/dev/acpi/xhci_acpi.c Thu Jan 30 00:42:47 2025 @@ -1,4 +1,4 @@ -/* $NetBSD: xhci_acpi.c,v 1.14 2024/12/09 22:15:33 jmcneill Exp $ */ +/* $NetBSD: xhci_acpi.c,v 1.15 2025/01/30 00:42:47 jmcneill Exp $ */ /*- * Copyright (c) 2018 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: xhci_acpi.c,v 1.14 2024/12/09 22:15:33 jmcneill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: xhci_acpi.c,v 1.15 2025/01/30 00:42:47 jmcneill Exp $"); #include <sys/param.h> #include <sys/bus.h> @@ -112,7 +112,7 @@ xhci_acpi_attach(device_t parent, device sc->sc_dev = self; sc->sc_bus.ub_hcpriv = sc; sc->sc_bus.ub_revision = USBREV_3_0; - sc->sc_quirks = 0; + sc->sc_quirks = XHCI_32BIT_ACCESS; sc->sc_vendor_init = xhci_acpi_init; rv = acpi_resource_parse(sc->sc_dev, asc->sc_handle, "_CRS", Index: src/sys/dev/usb/xhci.c diff -u src/sys/dev/usb/xhci.c:1.186 src/sys/dev/usb/xhci.c:1.187 --- src/sys/dev/usb/xhci.c:1.186 Thu Jan 9 10:17:22 2025 +++ src/sys/dev/usb/xhci.c Thu Jan 30 00:42:47 2025 @@ -1,4 +1,4 @@ -/* $NetBSD: xhci.c,v 1.186 2025/01/09 10:17:22 jmcneill Exp $ */ +/* $NetBSD: xhci.c,v 1.187 2025/01/30 00:42:47 jmcneill Exp $ */ /* * Copyright (c) 2013 Jonathan A. Kollasch @@ -34,7 +34,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: xhci.c,v 1.186 2025/01/09 10:17:22 jmcneill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: xhci.c,v 1.187 2025/01/30 00:42:47 jmcneill Exp $"); #ifdef _KERNEL_OPT #include "opt_usb.h" @@ -287,13 +287,25 @@ static const struct usbd_pipe_methods xh static inline uint32_t xhci_read_1(const struct xhci_softc * const sc, bus_size_t offset) { - return bus_space_read_1(sc->sc_iot, sc->sc_ioh, offset); + if (ISSET(sc->sc_quirks, XHCI_32BIT_ACCESS)) { + uint32_t val; + val = bus_space_read_4(sc->sc_iot, sc->sc_ioh, offset & ~3); + return (val >> ((offset & 3) * NBBY)) & 0xff; + } else { + return bus_space_read_1(sc->sc_iot, sc->sc_ioh, offset); + } } static inline uint32_t xhci_read_2(const struct xhci_softc * const sc, bus_size_t offset) { - return bus_space_read_2(sc->sc_iot, sc->sc_ioh, offset); + if (ISSET(sc->sc_quirks, XHCI_32BIT_ACCESS)) { + uint32_t val; + val = bus_space_read_4(sc->sc_iot, sc->sc_ioh, offset & ~3); + return (val >> ((offset & 3) * NBBY)) & 0xffff; + } else { + return bus_space_read_2(sc->sc_iot, sc->sc_ioh, offset); + } } static inline uint32_t @@ -306,7 +318,16 @@ static inline void xhci_write_1(const struct xhci_softc * const sc, bus_size_t offset, uint32_t value) { - bus_space_write_1(sc->sc_iot, sc->sc_ioh, offset, value); + if (ISSET(sc->sc_quirks, XHCI_32BIT_ACCESS)) { + const uint32_t mask = 0xffU << ((offset & 3) * NBBY); + uint32_t val; + val = bus_space_read_4(sc->sc_iot, sc->sc_ioh, offset & ~3); + val &= ~mask; + val |= __SHIFTIN(value, mask); + bus_space_write_4(sc->sc_iot, sc->sc_ioh, offset & ~3, val); + } else { + bus_space_write_1(sc->sc_iot, sc->sc_ioh, offset, value); + } } #if 0 /* unused */ Index: src/sys/dev/usb/xhcivar.h diff -u src/sys/dev/usb/xhcivar.h:1.24 src/sys/dev/usb/xhcivar.h:1.25 --- src/sys/dev/usb/xhcivar.h:1.24 Sun Apr 9 20:41:29 2023 +++ src/sys/dev/usb/xhcivar.h Thu Jan 30 00:42:47 2025 @@ -1,4 +1,4 @@ -/* $NetBSD: xhcivar.h,v 1.24 2023/04/09 20:41:29 riastradh Exp $ */ +/* $NetBSD: xhcivar.h,v 1.25 2025/01/30 00:42:47 jmcneill Exp $ */ /* * Copyright (c) 2013 Jonathan A. Kollasch @@ -149,6 +149,7 @@ struct xhci_softc { int sc_quirks; #define XHCI_QUIRK_INTEL __BIT(0) /* Intel xhci chip */ #define XHCI_DEFERRED_START __BIT(1) +#define XHCI_32BIT_ACCESS __BIT(2) uint32_t sc_hcc; /* copy of HCCPARAMS1 */ uint32_t sc_hcc2; /* copy of HCCPARAMS2 */