Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F102105279
D32256.id.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
8 KB
Referenced Files
None
Subscribers
None
D32256.id.diff
View Options
diff --git a/sys/conf/files.arm64 b/sys/conf/files.arm64
--- a/sys/conf/files.arm64
+++ b/sys/conf/files.arm64
@@ -307,7 +307,7 @@
dev/uart/uart_dev_pl011.c optional uart pl011
dev/usb/controller/dwc_otg_hisi.c optional dwcotg fdt soc_hisi_hi6220
-dev/usb/controller/dwc3.c optional fdt dwc3
+dev/usb/controller/dwc3.c optional xhci acpi dwc3 | xhci fdt dwc3
dev/usb/controller/ehci_mv.c optional ehci_mv fdt
dev/usb/controller/generic_ehci.c optional ehci
dev/usb/controller/generic_ehci_acpi.c optional ehci acpi
diff --git a/sys/dev/usb/controller/dwc3.c b/sys/dev/usb/controller/dwc3.c
--- a/sys/dev/usb/controller/dwc3.c
+++ b/sys/dev/usb/controller/dwc3.c
@@ -2,6 +2,7 @@
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
*
* Copyright (c) 2019 Emmanuel Vadot <manu@FreeBSD.Org>
+ * Copyright (c) 2021-2022 Bjoern A. Zeeb <bz@FreeBSD.ORG>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -25,12 +26,14 @@
* SUCH DAMAGE.
*
* $FreeBSD$
- *
*/
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
+#include "opt_platform.h"
+#include "opt_acpi.h"
+
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/bus.h>
@@ -38,15 +41,11 @@
#include <sys/condvar.h>
#include <sys/kernel.h>
#include <sys/module.h>
+#ifdef FDT
#include <sys/gpio.h>
-#include <machine/bus.h>
-
-#include <dev/fdt/simplebus.h>
+#endif
-#include <dev/fdt/fdt_common.h>
-#include <dev/ofw/ofw_bus.h>
-#include <dev/ofw/ofw_bus_subr.h>
-#include <dev/ofw/ofw_subr.h>
+#include <machine/bus.h>
#include <dev/usb/usb.h>
#include <dev/usb/usbdi.h>
@@ -60,15 +59,25 @@
#include <dev/usb/controller/xhci.h>
#include <dev/usb/controller/dwc3.h>
+#ifdef FDT
+#include <dev/fdt/simplebus.h>
+
+#include <dev/fdt/fdt_common.h>
+#include <dev/ofw/ofw_bus.h>
+#include <dev/ofw/ofw_bus_subr.h>
+#include <dev/ofw/ofw_subr.h>
+
#include <dev/extres/clk/clk.h>
#include <dev/extres/phy/phy_usb.h>
+#endif
-#include "generic_xhci.h"
+#ifdef DEV_ACPI
+#include <contrib/dev/acpica/include/acpi.h>
+#include <contrib/dev/acpica/include/accommon.h>
+#include <dev/acpica/acpivar.h>
+#endif
-static struct ofw_compat_data compat_data[] = {
- { "snps,dwc3", 1 },
- { NULL, 0 }
-};
+#include "generic_xhci.h"
struct snps_dwc3_softc {
struct xhci_softc sc;
@@ -76,9 +85,6 @@
struct resource * mem_res;
bus_space_tag_t bst;
bus_space_handle_t bsh;
- phandle_t node;
- phy_t usb2_phy;
- phy_t usb3_phy;
uint32_t snpsid;
};
@@ -87,6 +93,8 @@
#define DWC3_READ(_sc, _off) \
bus_space_read_4(_sc->bst, _sc->bsh, _off)
+#define IS_DMA_32B 1
+
static int
snps_dwc3_attach_xhci(device_t dev)
{
@@ -125,7 +133,7 @@
return (err);
}
- err = xhci_init(sc, dev, 1);
+ err = xhci_init(sc, dev, IS_DMA_32B);
if (err != 0) {
device_printf(dev, "Failed to init XHCI, with error %d\n", err);
return (ENXIO);
@@ -175,9 +183,7 @@
xsc = &sc->sc;
device_printf(sc->dev, "xhci quirks: %#012x\n", xsc->sc_quirks);
}
-#endif
-#ifdef DWC3_DEBUG
static void
snps_dwc3_dump_ctrlparams(struct snps_dwc3_softc *sc)
{
@@ -202,11 +208,6 @@
{
uint32_t gctl, ghwp0, phy2, phy3;
- if (sc->usb2_phy)
- phy_enable(sc->usb2_phy);
- if (sc->usb3_phy)
- phy_enable(sc->usb3_phy);
-
ghwp0 = DWC3_READ(sc, DWC3_GHWPARAMS0);
gctl = DWC3_READ(sc, DWC3_GCTL);
@@ -260,15 +261,16 @@
DWC3_WRITE(sc, DWC3_GUCTL, reg);
}
+#ifdef FDT
static void
-snps_dwc3_configure_phy(struct snps_dwc3_softc *sc)
+snps_dwc3_configure_phy(struct snps_dwc3_softc *sc, phandle_t node)
{
char *phy_type;
uint32_t reg;
int nphy_types;
phy_type = NULL;
- nphy_types = OF_getprop_alloc(sc->node, "phy_type", (void **)&phy_type);
+ nphy_types = OF_getprop_alloc(node, "phy_type", (void **)&phy_type);
if (nphy_types <= 0)
return;
@@ -285,6 +287,7 @@
DWC3_WRITE(sc, DWC3_GUSB2PHYCFG0, reg);
OF_prop_free(phy_type);
}
+#endif
static void
snps_dwc3_do_quirks(struct snps_dwc3_softc *sc)
@@ -334,17 +337,11 @@
}
static int
-snps_dwc3_probe(device_t dev)
+snps_dwc3_probe_common(device_t dev)
{
- char dr_mode[16];
+ char dr_mode[16] = { 0 };
ssize_t s;
- if (!ofw_bus_status_okay(dev))
- return (ENXIO);
-
- if (ofw_bus_search_compatible(dev, compat_data)->ocd_data == 0)
- return (ENXIO);
-
s = device_get_property(dev, "dr_mode", dr_mode, sizeof(dr_mode),
DEVICE_PROP_BUFFER);
if (s == -1) {
@@ -363,14 +360,19 @@
}
static int
-snps_dwc3_attach(device_t dev)
+snps_dwc3_common_attach(device_t dev, bool is_fdt)
{
struct snps_dwc3_softc *sc;
- int rid = 0;
+#ifdef FDT
+ phandle_t node;
+ phy_t usb2_phy, usb3_phy;
+#endif
+ int error, rid;
sc = device_get_softc(dev);
sc->dev = dev;
+ rid = 0;
sc->mem_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid,
RF_ACTIVE);
if (sc->mem_res == NULL) {
@@ -387,40 +389,135 @@
snps_dwc3_dump_ctrlparams(sc);
#endif
+#ifdef FDT
+ if (!is_fdt)
+ goto skip_phys;
+
/* Get the phys */
- sc->node = ofw_bus_get_node(dev);
- phy_get_by_ofw_name(dev, sc->node, "usb2-phy", &sc->usb2_phy);
- phy_get_by_ofw_name(dev, sc->node, "usb3-phy", &sc->usb3_phy);
+ node = ofw_bus_get_node(dev);
+
+ usb2_phy = usb3_phy = NULL;
+ error = phy_get_by_ofw_name(dev, node, "usb2-phy", &usb2_phy);
+ if (error == 0 && usb2_phy != NULL)
+ phy_enable(usb2_phy);
+ error = phy_get_by_ofw_name(dev, node, "usb3-phy", &usb3_phy);
+ if (error == 0 && usb3_phy != NULL)
+ phy_enable(usb3_phy);
+
+ snps_dwc3_configure_phy(sc, node);
+skip_phys:
+#endif
snps_dwc3_reset(sc);
snps_dwc3_configure_host(sc);
- snps_dwc3_configure_phy(sc);
snps_dwc3_do_quirks(sc);
#ifdef DWC3_DEBUG
snsp_dwc3_dump_regs(sc, "Pre XHCI init");
#endif
- snps_dwc3_attach_xhci(dev);
+ error = snps_dwc3_attach_xhci(dev);
#ifdef DWC3_DEBUG
snsp_dwc3_dump_regs(sc, "Post XHCI init");
#endif
- return (0);
+ return (error);
+}
+
+#ifdef FDT
+static struct ofw_compat_data compat_data[] = {
+ { "snps,dwc3", 1 },
+ { NULL, 0 }
+};
+
+static int
+snps_dwc3_fdt_probe(device_t dev)
+{
+
+ if (!ofw_bus_status_okay(dev))
+ return (ENXIO);
+
+ if (ofw_bus_search_compatible(dev, compat_data)->ocd_data == 0)
+ return (ENXIO);
+
+ return (snps_dwc3_probe_common(dev));
}
-static device_method_t snps_dwc3_methods[] = {
+static int
+snps_dwc3_fdt_attach(device_t dev)
+{
+
+ return (snps_dwc3_common_attach(dev, true));
+}
+
+static device_method_t snps_dwc3_fdt_methods[] = {
/* Device interface */
- DEVMETHOD(device_probe, snps_dwc3_probe),
- DEVMETHOD(device_attach, snps_dwc3_attach),
+ DEVMETHOD(device_probe, snps_dwc3_fdt_probe),
+ DEVMETHOD(device_attach, snps_dwc3_fdt_attach),
DEVMETHOD_END
};
-static driver_t snps_dwc3_driver = {
- "xhci",
- snps_dwc3_methods,
- sizeof(struct snps_dwc3_softc)
+DEFINE_CLASS_1(snps_dwc3_fdt, snps_dwc3_fdt_driver, snps_dwc3_fdt_methods,
+ sizeof(struct snps_dwc3_softc), generic_xhci_driver);
+
+DRIVER_MODULE(snps_dwc3_fdt, simplebus, snps_dwc3_fdt_driver, 0, 0);
+MODULE_DEPEND(snps_dwc3_fdt, xhci, 1, 1, 1);
+#endif
+
+#ifdef DEV_ACPI
+static char *dwc3_acpi_ids[] = {
+ "808622B7", /* This was an Intel PCI Vendor/Device ID used. */
+ "PNP0D10", /* The generic XHCI PNP ID needing extra probe checks. */
+ NULL
+};
+
+static int
+snps_dwc3_acpi_probe(device_t dev)
+{
+ char *match;
+ int error;
+
+ if (acpi_disabled("snps_dwc3"))
+ return (ENXIO);
+
+ error = ACPI_ID_PROBE(device_get_parent(dev), dev, dwc3_acpi_ids, &match);
+ if (error > 0)
+ return (ENXIO);
+
+ /*
+ * If we found the Generic XHCI PNP ID we can only attach if we have
+ * some other means to identify the device as dwc3.
+ */
+ if (strcmp(match, "PNP0D10") == 0) {
+ /* This is needed in SolidRun's HoneyComb. */
+ if (device_has_property(dev, "snps,dis_rxdet_inp3_quirk"))
+ goto is_dwc3;
+
+ return (ENXIO);
+ }
+
+is_dwc3:
+ return (snps_dwc3_probe_common(dev));
+}
+
+static int
+snps_dwc3_acpi_attach(device_t dev)
+{
+
+ return (snps_dwc3_common_attach(dev, false));
+}
+
+static device_method_t snps_dwc3_acpi_methods[] = {
+ /* Device interface */
+ DEVMETHOD(device_probe, snps_dwc3_acpi_probe),
+ DEVMETHOD(device_attach, snps_dwc3_acpi_attach),
+
+ DEVMETHOD_END
};
-DRIVER_MODULE(snps_dwc3, simplebus, snps_dwc3_driver, 0, 0);
-MODULE_DEPEND(snps_dwc3, xhci, 1, 1, 1);
+DEFINE_CLASS_1(snps_dwc3_acpi, snps_dwc3_acpi_driver, snps_dwc3_acpi_methods,
+ sizeof(struct snps_dwc3_softc), generic_xhci_driver);
+
+DRIVER_MODULE(snps_dwc3_acpi, acpi, snps_dwc3_acpi_driver, 0, 0);
+MODULE_DEPEND(snps_dwc3_acpi, usb, 1, 1, 1);
+#endif
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Fri, Nov 8, 4:28 PM (1 h, 45 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
14517392
Default Alt Text
D32256.id.diff (8 KB)
Attached To
Mode
D32256: USB: split dwc3 (Synopsys) up for FDT and ACPI attachment
Attached
Detach File
Event Timeline
Log In to Comment