Module Name: src
Committed By: jmcneill
Date: Sat Jan 20 00:51:29 UTC 2024
Modified Files:
src/sys/dev/usb: ehcivar.h
Log Message:
ehci: add EHCIF_32BIT_ACCESS flag to force 32-bit MMIO
To generate a diff of this commit:
cvs rdiff -u -r1.51 -r1.52 src/sys/dev/usb/ehcivar.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/usb/ehcivar.h
diff -u src/sys/dev/usb/ehcivar.h:1.51 src/sys/dev/usb/ehcivar.h:1.52
--- src/sys/dev/usb/ehcivar.h:1.51 Sun Mar 13 11:29:21 2022
+++ src/sys/dev/usb/ehcivar.h Sat Jan 20 00:51:29 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: ehcivar.h,v 1.51 2022/03/13 11:29:21 riastradh Exp $ */
+/* $NetBSD: ehcivar.h,v 1.52 2024/01/20 00:51:29 jmcneill Exp $ */
/*
* Copyright (c) 2001 The NetBSD Foundation, Inc.
@@ -178,6 +178,7 @@ typedef struct ehci_softc {
int sc_flags; /* misc flags */
#define EHCIF_DROPPED_INTR_WORKAROUND 0x01
#define EHCIF_ETTF 0x02 /* Emb. Transaction Translater func. */
+#define EHCIF_32BIT_ACCESS 0x04 /* 32-bit MMIO access req'd */
uint32_t sc_cmd; /* shadow of cmd reg during suspend */
@@ -235,17 +236,75 @@ typedef struct ehci_softc {
int (*sc_vendor_port_status)(struct ehci_softc *, uint32_t, int);
} ehci_softc_t;
-#define EREAD1(sc, a) bus_space_read_1((sc)->iot, (sc)->ioh, (a))
-#define EREAD2(sc, a) bus_space_read_2((sc)->iot, (sc)->ioh, (a))
+static inline uint8_t
+ehci_read_1(struct ehci_softc *sc, u_int offset)
+{
+ if (ISSET(sc->sc_flags, EHCIF_32BIT_ACCESS)) {
+ uint32_t val;
+
+ val = bus_space_read_4(sc->iot, sc->ioh, offset & ~3);
+ return (val >> ((offset & 3) * NBBY)) & 0xff;
+ } else {
+ return bus_space_read_1(sc->iot, sc->ioh, offset);
+ }
+}
+
+static inline uint16_t
+ehci_read_2(struct ehci_softc *sc, u_int offset)
+{
+ if (ISSET(sc->sc_flags, EHCIF_32BIT_ACCESS)) {
+ uint32_t val;
+
+ val = bus_space_read_4(sc->iot, sc->ioh, offset & ~3);
+ return (val >> ((offset & 3) * NBBY)) & 0xffff;
+ } else {
+ return bus_space_read_2(sc->iot, sc->ioh, offset);
+ }
+}
+
+static inline void
+ehci_write_1(struct ehci_softc *sc, u_int offset, uint8_t data)
+{
+ if (ISSET(sc->sc_flags, EHCIF_32BIT_ACCESS)) {
+ const uint32_t mask = 0xffU << ((offset & 3) * NBBY);
+ uint32_t val;
+
+ val = bus_space_read_4(sc->iot, sc->ioh, offset & ~3);
+ val &= ~mask;
+ val |= __SHIFTIN(data, mask);
+ bus_space_write_4(sc->iot, sc->ioh, offset & ~3, val);
+ } else {
+ bus_space_write_1(sc->iot, sc->ioh, offset, data);
+ }
+}
+
+static inline void
+ehci_write_2(struct ehci_softc *sc, u_int offset, uint16_t data)
+{
+ if (ISSET(sc->sc_flags, EHCIF_32BIT_ACCESS)) {
+ const uint32_t mask = 0xffffU << ((offset & 3) * NBBY);
+ uint32_t val;
+
+ val = bus_space_read_4(sc->iot, sc->ioh, offset & ~3);
+ val &= ~mask;
+ val |= __SHIFTIN(data, mask);
+ bus_space_write_4(sc->iot, sc->ioh, offset & ~3, val);
+ } else {
+ bus_space_write_2(sc->iot, sc->ioh, offset, data);
+ }
+}
+
+#define EREAD1(sc, a) ehci_read_1((sc), (a))
+#define EREAD2(sc, a) ehci_read_2((sc), (a))
#define EREAD4(sc, a) bus_space_read_4((sc)->iot, (sc)->ioh, (a))
-#define EWRITE1(sc, a, x) bus_space_write_1((sc)->iot, (sc)->ioh, (a), (x))
-#define EWRITE2(sc, a, x) bus_space_write_2((sc)->iot, (sc)->ioh, (a), (x))
+#define EWRITE1(sc, a, x) ehci_write_1((sc), (a), (x))
+#define EWRITE2(sc, a, x) ehci_write_2((sc), (a), (x))
#define EWRITE4(sc, a, x) bus_space_write_4((sc)->iot, (sc)->ioh, (a), (x))
-#define EOREAD1(sc, a) bus_space_read_1((sc)->iot, (sc)->ioh, (sc)->sc_offs+(a))
-#define EOREAD2(sc, a) bus_space_read_2((sc)->iot, (sc)->ioh, (sc)->sc_offs+(a))
+#define EOREAD1(sc, a) ehci_read_1((sc), (sc)->sc_offs+(a))
+#define EOREAD2(sc, a) ehci_read_2((sc), (sc)->sc_offs+(a))
#define EOREAD4(sc, a) bus_space_read_4((sc)->iot, (sc)->ioh, (sc)->sc_offs+(a))
-#define EOWRITE1(sc, a, x) bus_space_write_1((sc)->iot, (sc)->ioh, (sc)->sc_offs+(a), (x))
-#define EOWRITE2(sc, a, x) bus_space_write_2((sc)->iot, (sc)->ioh, (sc)->sc_offs+(a), (x))
+#define EOWRITE1(sc, a, x) ehci_write_1((sc), (sc)->sc_offs+(a), (x))
+#define EOWRITE2(sc, a, x) ehci_write_2((sc), (sc)->sc_offs+(a), (x))
#define EOWRITE4(sc, a, x) bus_space_write_4((sc)->iot, (sc)->ioh, (sc)->sc_offs+(a), (x))
int ehci_init(ehci_softc_t *);