Re: FYI: Rock64 USB3 port no longer works for main [so: 14] (looks like dtb changes invalidating use of the old .dtbo and needing kernel changes)
- Reply: Emmanuel Vadot : "Re: FYI: Rock64 USB3 port no longer works for main [so: 14] (looks like dtb changes invalidating use of the old .dtbo and needing kernel changes)"
- In reply to: Emmanuel Vadot : "Re: FYI: Rock64 USB3 port no longer works for main [so: 14] (looks like dtb changes invalidating use of the old .dtbo and needing kernel changes)"
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Tue, 15 Nov 2022 23:06:24 UTC
On Nov 15, 2022, at 13:12, Emmanuel Vadot <manu@bidouilliste.com> wrote: > On Tue, 15 Nov 2022 13:03:45 -0800 > Mark Millard <marklmi@yahoo.com> wrote: > >> On Nov 15, 2022, at 05:05, Emmanuel Vadot <manu@bidouilliste.com> wrote: >> >>> On Fri, 4 Nov 2022 12:31:51 -0700 >>> Mark Millard <marklmi@yahoo.com> wrote: >>> >>>> On 2022-Oct-22, at 23:00, Mark Millard <marklmi@yahoo.com> wrote: >>>> >>>>> Well, turns out that part of the "Import device-tree files >>>>> from Linux 5.14" is: >>>>> >>>>> https://cgit.freebsd.org/src/commit/sys/contrib/device-tree/src/arm64/rockchip/rk3328-rock64.dts?id=5956d97f4b32 >>>>> >>>>> which has: >>>>> . . . >>>> >>>> >>> >>> Hi Mark, >>> >>> See https://reviews.freebsd.org/D37392 (and child reviews) for a fix. >>> This was indeed the import of the new DTS files that caused the first >>> problem (there is no glue node in rk3328.dtsi like in other SoCs or >>> like our overlay). The other commit responsible for breaking USB3 >>> support was the addition to RK356x SoC, the check was bad for when to >>> force USB2. >> >> Thanks. >> >> I applied the diff and the 2 child diff's and rebuilt and >> installed, including updating the kernel on the e.MMC that >> is historically used to mount the rootfs on USB3 when the >> USB3 drive is plugged in there. (U-boot does not handle >> the USB context I want.) >> >> . . . >> >> > > Looks like you're missing https://reviews.freebsd.org/D37394 Hopefully this time I have all the childern, grandchildern, etc. Sorry for the screwup. But the behavior observed is unchanged in this attempt. A diff of the console output of booting via USB2 this time vs. the prior report's USB3 failure log reveals no differences between the latter part of the block of: clknode_link_recalc: Attempt to use unresolved linked clock: hdmi_phy Cannot get frequency for clk: hdmi_phy, error: 9 and the later: Trying to mount root from ufs:/dev/gpt/Rock64root []... uhub2: 1 port with 1 removable, self powered uhub1: 1 port with 1 removable, self powered uhub0: 1 port with 1 removable, self powered No DWC3, XHCI, etc. But a boot -v does report: ofwbus0: <usb@ff600000> mem 0xff600000-0xff6fffff irq 50 compat rockchip,rk3328-xhci (no driver attached) Note the "xhci" instead of "dwc3". The overall list of no driver notices that do not mention "disabled" is listed below. It does reference a "rockchip,rk3328-usb2phy" as well as the above. ofwbus0: <opp_table0> compat operating-points-v2 (no driver attached) ofwbus0: <display-subsystem> compat rockchip,display-subsystem (no driver attached) ofwbus0: <spdif@ff030000> mem 0xff030000-0xff030fff irq 11 compat rockchip,rk3328-spdif (no driver attached) ofwbus0: <pdm@ff040000> mem 0xff040000-0xff040fff disabled compat rockchip,pdm (no driver attached) rk_grf0: <io-domains> mem 0xff100000-0xff100fff compat rockchip,rk3328-io-voltage-domain (no driver attached) rk_grf0: <gpio> mem 0xff100000-0xff100fff compat rockchip,rk3328-grf-gpio (no driver attached) rk_grf0: <power-controller> mem 0xff100000-0xff100fff compat rockchip,rk3328-power-controller (no driver attached) rk_grf0: <reboot-mode> mem 0xff100000-0xff100fff compat syscon-reboot-mode (no driver attached) ofwbus0: <watchdog@ff1a0000> mem 0xff1a0000-0xff1a00ff irq 20 compat rockchip,rk3328-wdt (no driver attached) ofwbus0: <dmac@ff1f0000> mem 0xff1f0000-0xff1f3fff irq 22,23 compat arm,pl330 (no driver attached) ofwbus0: <efuse@ff260000> mem 0xff260000-0xff26004f compat rockchip,rk3328-efuse (no driver attached) ofwbus0: <gpu@ff300000> mem 0xff300000-0xff33ffff irq 26,27,28,29,30,31,32 compat rockchip,rk3328-mali (no driver attached) ofwbus0: <video-codec@ff350000> mem 0xff350000-0xff3507ff irq 35 compat rockchip,rk3328-vpu (no driver attached) ofwbus0: <iommu@ff350800> mem 0xff350800-0xff35083f irq 36 compat rockchip,iommu (no driver attached) ofwbus0: <vop@ff370000> mem 0xff370000-0xff373efb irq 38 compat rockchip,rk3328-vop (no driver attached) ofwbus0: <iommu@ff373f00> mem 0xff373f00-0xff373fff irq 39 compat rockchip,iommu (no driver attached) ofwbus0: <hdmi@ff3c0000> mem 0xff3c0000-0xff3dffff irq 40,41 compat rockchip,rk3328-dw-hdmi (no driver attached) ofwbus0: <codec@ff410000> mem 0xff410000-0xff410fff compat rockchip,rk3328-codec (no driver attached) ofwbus0: <phy@ff430000> mem 0xff430000-0xff43ffff irq 42 compat rockchip,rk3328-hdmi-phy (no driver attached) simple_mfd0: <usb2phy@100> mem 0-0xff44ffff,0-0xffff compat rockchip,rk3328-usb2phy (no driver attached) ofwbus0: <usb@ff600000> mem 0xff600000-0xff6fffff irq 50 compat rockchip,rk3328-xhci (no driver attached) ofwbus0: <ir-receiver> compat gpio-ir-receiver (no driver attached) ofwbus0: <spdif-dit> compat linux,spdif-dit (no driver attached) ofwbus0: <dmc> mem 0xff400000-0xff400fff,0xff780000-0xff782fff,0xff100000-0xff100fff,0xff440000-0xff440fff,0xff720000-0xff720fff,0xff798000-0xff798fff compat rockchip,rk3328-dmc (no driver attached) ofwbus0: <smbios> compat u-boot,sysinfo-smbios (no driver attached) pcm0: no driver attached to codec node pcm1: no driver attached to codec node pcm2: no driver attached to cpu node For reference: # git -C /usr/main-src/ diff sys/dev/usb/controller/ sys/arm64/rockchip/ sys/dts/ sys/modules/ diff --git a/sys/arm64/rockchip/rk_dwc3.c b/sys/arm64/rockchip/rk_dwc3.c index 8582f7a86999..645a1cffbd95 100644 --- a/sys/arm64/rockchip/rk_dwc3.c +++ b/sys/arm64/rockchip/rk_dwc3.c @@ -54,12 +54,10 @@ __FBSDID("$FreeBSD$"); #include <dev/extres/syscon/syscon.h> enum rk_dwc3_type { - RK3328 = 1, - RK3399, + RK3399 = 1, }; static struct ofw_compat_data compat_data[] = { - { "rockchip,rk3328-dwc3", RK3328 }, { "rockchip,rk3399-dwc3", RK3399 }, { NULL, 0 } }; diff --git a/sys/dev/usb/controller/dwc3.c b/sys/dev/usb/controller/dwc3.c index 2e8f868bc47b..d5e3b3f50a9d 100644 --- a/sys/dev/usb/controller/dwc3.c +++ b/sys/dev/usb/controller/dwc3.c @@ -86,6 +86,14 @@ struct snps_dwc3_softc { bus_space_tag_t bst; bus_space_handle_t bsh; uint32_t snpsid; + uint32_t snpsversion; + uint32_t snpsrevision; + uint32_t snpsversion_type; +#ifdef FDT + clk_t clk_ref; + clk_t clk_suspend; + clk_t clk_bus; +#endif }; #define DWC3_WRITE(_sc, _off, _val) \ @@ -384,8 +392,31 @@ snps_dwc3_common_attach(device_t dev, bool is_fdt) sc->bsh = rman_get_bushandle(sc->mem_res); sc->snpsid = DWC3_READ(sc, DWC3_GSNPSID); - if (bootverbose) - device_printf(sc->dev, "snps id: %#012x\n", sc->snpsid); + sc->snpsversion = DWC3_VERSION(sc->snpsid); + sc->snpsrevision = DWC3_REVISION(sc->snpsid); + if (sc->snpsversion == DWC3_1_IP_ID || + sc->snpsversion == DWC3_2_IP_ID) { + sc->snpsrevision = DWC3_READ(sc, DWC3_1_VER_NUMBER); + sc->snpsversion_type = DWC3_READ(sc, DWC3_1_VER_TYPE); + } + if (bootverbose) { + switch (sc->snpsversion) { + case DWC3_IP_ID: + device_printf(sc->dev, "SNPS Version: DWC3 (%x %x)\n", + sc->snpsversion, sc->snpsrevision); + break; + case DWC3_1_IP_ID: + device_printf(sc->dev, "SNPS Version: DWC3.1 (%x %x %x)\n", + sc->snpsversion, sc->snpsrevision, + sc->snpsversion_type); + break; + case DWC3_2_IP_ID: + device_printf(sc->dev, "SNPS Version: DWC3.2 (%x %x %x)\n", + sc->snpsversion, sc->snpsrevision, + sc->snpsversion_type); + break; + } + } #ifdef DWC3_DEBUG snps_dwc3_dump_ctrlparams(sc); #endif @@ -394,9 +425,32 @@ snps_dwc3_common_attach(device_t dev, bool is_fdt) if (!is_fdt) goto skip_phys; - /* Get the phys */ node = ofw_bus_get_node(dev); + /* Get the clocks if any */ + if (ofw_bus_is_compatible(dev, "rockchip,rk3328-dwc3") == 1) { + if (clk_get_by_ofw_name(dev, node, "ref_clk", &sc->clk_ref) != 0) + device_printf(dev, "Cannot get ref_clk\n"); + if (clk_get_by_ofw_name(dev, node, "suspend_clk", &sc->clk_suspend) != 0) + device_printf(dev, "Cannot get suspend_clk\n"); + if (clk_get_by_ofw_name(dev, node, "bus_clk", &sc->clk_bus) != 0) + device_printf(dev, "Cannot get bus_clk\n"); + } + + if (sc->clk_ref != NULL) { + if (clk_enable(sc->clk_ref) != 0) + device_printf(dev, "Cannot enable ref_clk\n"); + } + if (sc->clk_suspend != NULL) { + if (clk_enable(sc->clk_suspend) != 0) + device_printf(dev, "Cannot enable suspend_clk\n"); + } + if (sc->clk_bus != NULL) { + if (clk_enable(sc->clk_bus) != 0) + device_printf(dev, "Cannot enable bus_clk\n"); + } + + /* Get the phys */ usb2_phy = usb3_phy = NULL; error = phy_get_by_ofw_name(dev, node, "usb2-phy", &usb2_phy); if (error == 0 && usb2_phy != NULL) @@ -404,12 +458,19 @@ snps_dwc3_common_attach(device_t dev, bool is_fdt) error = phy_get_by_ofw_name(dev, node, "usb3-phy", &usb3_phy); if (error == 0 && usb3_phy != NULL) phy_enable(usb3_phy); - else { - reg = DWC3_READ(sc, DWC3_GUCTL1); - if (bootverbose) - device_printf(dev, "Forcing USB2 clock only\n"); - reg |= DWC3_GUCTL1_DEV_FORCE_20_CLK_FOR_30_CLK; - DWC3_WRITE(sc, DWC3_GUCTL1, reg); + if (sc->snpsversion == DWC3_IP_ID) { + if (sc->snpsrevision >= 0x290A) { + uint32_t hwparams3; + + hwparams3 = DWC3_READ(sc, DWC3_GHWPARAMS3); + if (DWC3_HWPARAMS3_SSPHY(hwparams3) == DWC3_HWPARAMS3_SSPHY_DISABLE) { + reg = DWC3_READ(sc, DWC3_GUCTL1); + if (bootverbose) + device_printf(dev, "Forcing USB2 clock only\n"); + reg |= DWC3_GUCTL1_DEV_FORCE_20_CLK_FOR_30_CLK; + DWC3_WRITE(sc, DWC3_GUCTL1, reg); + } + } } snps_dwc3_configure_phy(sc, node); skip_phys: @@ -427,6 +488,16 @@ snps_dwc3_common_attach(device_t dev, bool is_fdt) snsp_dwc3_dump_regs(sc, "Post XHCI init"); #endif +#ifdef FDT + if (error) { + if (sc->clk_ref != NULL) + clk_disable(sc->clk_ref); + if (sc->clk_suspend != NULL) + clk_disable(sc->clk_suspend); + if (sc->clk_bus != NULL) + clk_disable(sc->clk_bus); + } +#endif return (error); } diff --git a/sys/dev/usb/controller/dwc3.h b/sys/dev/usb/controller/dwc3.h index 21a87a1917ee..fd61d1129df3 100644 --- a/sys/dev/usb/controller/dwc3.h +++ b/sys/dev/usb/controller/dwc3.h @@ -31,6 +31,15 @@ #ifndef _DWC3_H_ #define _DWC3_H_ +#define DWC3_IP_ID 0x5533 +#define DWC3_1_IP_ID 0x3331 +#define DWC3_2_IP_ID 0x3332 + +#define DWC3_VERSION_MASK 0xFFFF0000 +#define DWC3_REVISION_MASK 0xFFFF +#define DWC3_VERSION(x) (((x) & DWC3_VERSION_MASK) >> 16) +#define DWC3_REVISION(x) ((x) & DWC3_REVISION_MASK) + #define DWC3_GSBUSCFG0 0xc100 #define DWC3_GSBUSCFG1 0xc104 #define DWC3_GTXTHRCFG 0xc108 @@ -80,6 +89,9 @@ #define DWC3_GPRTBIMAP_HSLO 0xc180 #define DWC3_GPRTBIMAP_FSLO 0xc188 +#define DWC3_1_VER_NUMBER 0xc1a0 +#define DWC3_1_VER_TYPE 0xc1a4 + #define DWC3_GUSB2PHYCFG0 0xc200 #define DWC3_GUSB2PHYCFG0_PHYSOFTRST (1 << 31) #define DWC3_GUSB2PHYCFG0_U2_FREECLK_EXISTS (1 << 30) @@ -98,6 +110,11 @@ #define DWC3_GUSB3PIPECTL0_DELAYP1TRANS (1 << 18) #define DWC3_GUSB3PIPECTL0_SUSPENDUSB3 (1 << 17) +#define DWC3_HWPARAMS3_SSPHY(x) (x & 0x3) +#define DWC3_HWPARAMS3_SSPHY_DISABLE 0 +#define DWC3_HWPARAMS3_SSPHY_GEN1 1 +#define DWC3_HWPARAMS3_SSPHY_GEN2 2 + #define DWC3_GTXFIFOSIZ(x) (0xc300 + 0x4 * (x)) #define DWC3_GRXFIFOSIZ(x) (0xc380 + 0x4 * (x)) #define DWC3_GEVNTADRLO0 0xc400 diff --git a/sys/dts/arm64/overlays/rk3328-dwc3.dtso b/sys/dts/arm64/overlays/rk3328-dwc3.dtso deleted file mode 100644 index bade60b60d57..000000000000 --- a/sys/dts/arm64/overlays/rk3328-dwc3.dtso +++ /dev/null @@ -1,39 +0,0 @@ -/dts-v1/; -/plugin/; - -#include <dt-bindings/clock/rk3328-cru.h> -#include <dt-bindings/interrupt-controller/arm-gic.h> -#include <dt-bindings/interrupt-controller/irq.h> - -/ { - compatible = "rockchip,rk3328"; -}; - -&{/} { - usbdrd3: usb@ff600000 { - compatible = "rockchip,rk3328-dwc3"; - clocks = <&cru SCLK_USB3OTG_REF>, <&cru SCLK_USB3OTG_SUSPEND>, - <&cru ACLK_USB3OTG>; - clock-names = "ref_clk", "suspend_clk", - "bus_clk"; - #address-cells = <2>; - #size-cells = <2>; - ranges; - status = "okay"; - - usbdrd_dwc3: dwc3@ff600000 { - compatible = "snps,dwc3"; - reg = <0x0 0xff600000 0x0 0x100000>; - interrupts = <GIC_SPI 67 IRQ_TYPE_LEVEL_HIGH>; - dr_mode = "host"; - phy_type = "utmi_wide"; - snps,dis_enblslpm_quirk; - snps,dis-u2-freeclk-exists-quirk; - snps,dis_u2_susphy_quirk; - snps,dis_u3_susphy_quirk; - snps,dis-del-phy-power-chg-quirk; - snps,dis-tx-ipgap-linecheck-quirk; - status = "okay"; - }; - }; -}; diff --git a/sys/modules/dtb/rockchip/Makefile b/sys/modules/dtb/rockchip/Makefile index 1e0c6a2d4362..4f4a21f51a39 100644 --- a/sys/modules/dtb/rockchip/Makefile +++ b/sys/modules/dtb/rockchip/Makefile @@ -22,7 +22,6 @@ DTS= \ DTSO= rk3328-analog-sound.dtso \ rk3328-i2c0.dtso \ rk3328-uart1.dtso \ - rk3328-dwc3.dtso \ rk3399-mmc0-disable.dtso \ rk3399-mmc1-disable.dtso \ rk3399-sdhci-disable.dtso === Mark Millard marklmi at yahoo.com