[PATCH v3 7/8] dts: starfive: Add JH7110 Cadence USB dts node
Minda Chen
minda.chen at starfivetech.com
Wed Jul 24 05:24:42 CEST 2024
> -----邮件原件-----
> 发件人: E Shattow <lucent at gmail.com>
> 发送时间: 2024年7月23日 21:06
> 收件人: Minda Chen <minda.chen at starfivetech.com>
> 抄送: Marek Vasut <marex at denx.de>; Tom Rini <trini at konsulko.com>; Roger
> Quadros <rogerq at kernel.org>; Neil Armstrong <neil.armstrong at linaro.org>;
> Alexey Romanov <avromanov at salutedevices.com>; Sumit Garg
> <sumit.garg at linaro.org>; Mark Kettenis <kettenis at openbsd.org>; Nishanth
> Menon <nm at ti.com>; Rick Chen <rick at andestech.com>; Leo Yu-Chi Liang
> <ycliang at andestech.com>; u-boot at lists.denx.de; Heinrich Schuchardt
> <xypron.glpk at gmx.de>; Simon Glass <sjg at chromium.org>
> 主题: Re: [PATCH v3 7/8] dts: starfive: Add JH7110 Cadence USB dts node
>
> On Tue, Jul 23, 2024 at 3:16 AM Minda Chen <minda.chen at starfivetech.com>
> wrote:
> >
> >
> >
> > >
> > > On Mon, Jul 22, 2024 at 6:29 PM Minda Chen
> > > <minda.chen at starfivetech.com>
> > > wrote:
> > > >
> > > >
> > > >
> > > > >
> > > > > On Sat, Jul 20, 2024 at 6:47 PM E Shattow <lucent at gmail.com> wrote:
> > > > > >
> > > > > > Hi, I am testing on Milk-V Mars CM Lite, and I add to these
> > > > > > devicetree changes at runtime from
> > > > > > board/starfive/visionfive2/spl.c
> > > > > >
> > > > > > On Thu, Jul 18, 2024 at 6:38 PM Minda Chen
> > > > > > <minda.chen at starfivetech.com>
> > > > > wrote:
> > > > > > >
> > > > > > > Add Jh7110 Cadence USB dts node, Visionfive2 default setting
> > > > > > > is USB
> > > > > > > 2.0 device.
> > > > > > >
> > > > > > > Signed-off-by: Minda Chen <minda.chen at starfivetech.com>
> > > > > > > ---
> > > > > > > .../dts/jh7110-starfive-visionfive-2.dtsi | 5 ++
> > > > > > > arch/riscv/dts/jh7110.dtsi | 52
> > > > > +++++++++++++++++++
> > > > > > > 2 files changed, 57 insertions(+)
> > > > > > >
> > > > > > > diff --git
> > > > > > > a/arch/riscv/dts/jh7110-starfive-visionfive-2.dtsi
> > > > > > > b/arch/riscv/dts/jh7110-starfive-visionfive-2.dtsi
> > > > > > > index e11babc1cd..44785bbee3 100644
> > > > > > > --- a/arch/riscv/dts/jh7110-starfive-visionfive-2.dtsi
> > > > > > > +++ b/arch/riscv/dts/jh7110-starfive-visionfive-2.dtsi
> > > > > > > @@ -378,3 +378,8 @@
> > > > > > > };
> > > > > > > };
> > > > > > > };
> > > > > > > +
> > > > > > > +&usb_cdns3 {
> > > > > > > + dr_mode = "peripheral";
> > > > > > > + status = "okay";
> > > > > > > +};
> > > > > > > diff --git a/arch/riscv/dts/jh7110.dtsi
> > > > > > > b/arch/riscv/dts/jh7110.dtsi index 2cdc683d49..1eee924e1d
> > > > > > > 100644
> > > > > > > --- a/arch/riscv/dts/jh7110.dtsi
> > > > > > > +++ b/arch/riscv/dts/jh7110.dtsi
> > > > > > > @@ -371,6 +371,58 @@
> > > > > > > status = "disabled";
> > > > > > > };
> > > > > > >
> > > > > > > + usb0: usb at 10100000 {
> > > > > > > + compatible = "starfive,jh7110-usb";
> > > > > > > + ranges = <0x0 0x0 0x10100000
> 0x100000>;
> > > > > > > + #address-cells = <1>;
> > > > > > > + #size-cells = <1>;
> > > > > > > + starfive,stg-syscon = <&stg_syscon
> 0x4>;
> > > > > > > + clocks = <&stgcrg
> > > > > JH7110_STGCLK_USB_LPM>,
> > > > > > > + <&stgcrg
> > > > > JH7110_STGCLK_USB_STB>,
> > > > > > > + <&stgcrg
> > > > > JH7110_STGCLK_USB_APB>,
> > > > > > > + <&stgcrg
> > > > > JH7110_STGCLK_USB_AXI>,
> > > > > > > + <&stgcrg
> > > > > JH7110_STGCLK_USB_UTMI_APB>;
> > > > > > > + clock-names = "lpm", "stb", "apb",
> > > > > > > + "axi",
> > > > > "utmi_apb";
> > > > > > > + resets = <&stgcrg
> > > > > JH7110_STGRST_USB_PWRUP>,
> > > > > > > + <&stgcrg
> > > > > JH7110_STGRST_USB_APB>,
> > > > > > > + <&stgcrg
> > > > > JH7110_STGRST_USB_AXI>,
> > > > > > > + <&stgcrg
> > > > > JH7110_STGRST_USB_UTMI_APB>;
> > > > > > > + reset-names = "pwrup", "apb", "axi",
> > > > > > > + "utmi_apb";
> > > > > > > +
> > > > > > > + usb_cdns3: usb at 0 {
> > > > > > > + compatible = "cdns,usb3";
> > > > > > > + reg = <0x0 0x10000>,
> > > > > > > + <0x10000 0x10000>,
> > > > > > > + <0x20000 0x10000>;
> > > > > > > + reg-names = "otg", "xhci",
> > > "dev";
> > > > > > > + interrupts = <100>, <108>,
> > > <110>;
> > > > > > > + interrupt-names = "host",
> > > > > "peripheral", "otg";
> > > > > > > + phys = <&usbphy0>;
> > > > > > > + phy-names =
> "cdns3,usb2-phy";
> > > > > > > + };
> > > > > > > + };
> > > > > > > +
> > > > > > > + usbphy0: phy at 10200000 {
> > > > > > > + compatible =
> "starfive,jh7110-usb-phy";
> > > > > > > + reg = <0x0 0x10200000 0x0 0x10000>;
> > > > > > > + clocks = <&syscrg
> > > > > JH7110_SYSCLK_USB_125M>,
> > > > > > > + <&stgcrg
> > > > > JH7110_STGCLK_USB_APP_125>;
> > > > > > > + clock-names = "125m", "app_125m";
> > > > > > > + #phy-cells = <0>;
> > > > > > > + };
> > > > > > > +
> > > > > > > + pciephy0: phy at 10210000 {
> > > > > > > + compatible =
> "starfive,jh7110-pcie-phy";
> > > > > > > + reg = <0x0 0x10210000 0x0 0x10000>;
> > > > > > > + #phy-cells = <0>;
> > > > > > > + };
> > > > > > > +
> > > > > > > + pciephy1: phy at 10220000 {
> > > > > > > + compatible =
> "starfive,jh7110-pcie-phy";
> > > > > > > + reg = <0x0 0x10220000 0x0 0x10000>;
> > > > > > > + #phy-cells = <0>;
> > > > > > > + };
> > > > > > > +
> > > > > > > stgcrg: clock-controller at 10230000 {
> > > > > > > compatible = "starfive,jh7110-stgcrg";
> > > > > > > reg = <0x0 0x10230000 0x0 0x10000>;
> > > > > > > --
> > > > > > > 2.17.1
> > > > > > >
> > > > > >
> > > > > > Access fault
> > > > > >
> > > > > > starting USB...
> > > > > > Bus usb at 0: cdns-usb3-host usb at 0: set 1 has failed, back to
> 0
> > > > > > scanning bus usb at 0 for devices... Unhandled exception:
> > > > > > Load
> > > > > access fault
> > > > > > EPC: 00000000fff85ce2 RA: 00000000fff85cdc TVAL:
> > > > > 0000000000000004
> > > > > > EPC: 0000000040246ce2 RA: 0000000040246cdc reloc
> > > > > > adjusted
> > > > > >
> > > > > > Code: 9863 3ee7 8526 f0ef c37f 651c 3a03 0105 (43dc)
> > > > > >
> > > > > >
> > > > > > resetting ...
> > > > > >
> > > > > > when I add only these:
> > > > > >
> > > > > > int offset;
> > > > > >
> > > > > > offset = fdt_path_offset(fdt,
> > > > > > "/soc/pinctrl at 13040000"); /*
> > > > > &sysgpio */
> > > > > > fdt_add_subnode(fdt, offset, "usb0-0");
> > > > > > fdt_setprop_string(fdt, fdt_path_offset(fdt,
> > > > > > "/__symbols__"), "usb_pins", "/soc/pinctrl at 13040000/usb0-0");
> > > > > > offset = fdt_path_offset(fdt,
> > > > > > "/soc/pinctrl at 13040000/usb0-0");
> > > > > > /* usb_pins */
> > > > > > fdt_create_phandle(fdt, offset);
> > > > > > fdt_add_subnode(fdt, offset, "driver-vbus-pin");
> > > > > > offset = fdt_path_offset(fdt,
> > > > > > "/soc/pinctrl at 13040000/usb0-0/driver-vbus-pin");
> > > > > > fdt_setprop_u32(fdt, offset, "pinmux", 0xff070019); /*
> > > > > > GPIOMUX(25, GPOUT_SYS_USB_DRIVE_VBUS, GPOEN_ENABLE,
> > > GPI_NONE)
> > > > > */
> > > > > > fdt_setprop_empty(fdt, offset, "bias-disable");
> > > > > > fdt_setprop_empty(fdt, offset, "input-disable");
> > > > > > fdt_setprop_empty(fdt, offset, "input-schmitt-disable");
> > > > > > fdt_setprop_u32(fdt, offset, "slew-rate", 0);
> > > > > >
> > > > > > offset = fdt_path_offset(fdt, "/soc/usb at 10100000"); /*
> > > > > > &usb0
> > > */
> > > > > > fdt_setprop_string(fdt, offset, "pinctrl-names", "default");
> > > > > > fdt_setprop_u32(fdt, offset, "pinctrl-0",
> > > > > > fdt_get_phandle(fdt, fdt_path_offset(fdt,
> > > "/soc/pinctrl at 13040000/usb0-0")));
> > > > > > fdt_setprop_string(fdt, offset, "status", "okay");
> > > > > >
> > > > > > offset = fdt_path_offset(fdt,
> > > > > > "/soc/usb at 10100000/usb at 0");
> > > > > > /*
> > > > > > &usb_cdns3 */
> > > > > > fdt_setprop_string(fdt, offset, "dr_mode", "host");
> > > > > >
> > > > > > Success USB is working but PCI disabled if instead I add all of this:
> > > > > >
> > >
> > > > I checked t Milk-V CM board do not contain USB3.0 host So I think
> > > > the USB 3.0 configuration is not required.
> > >
> > > I agree it should be USB 2.0, but with your patch this is the only
> > > configuration that does anything successful with USB2.0 or 3.0
> > >
> > >
> > > >
> > > > > > int offset;
> > > > > >
> > > > > > offset = fdt_path_offset(fdt,
> > > > > > "/soc/pinctrl at 13040000"); /*
> > > > > &sysgpio */
> > > > > > fdt_add_subnode(fdt, offset, "usb0-0");
> > > > > > fdt_setprop_string(fdt, fdt_path_offset(fdt,
> > > > > > "/__symbols__"), "usb_pins", "/soc/pinctrl at 13040000/usb0-0");
> > > > > > offset = fdt_path_offset(fdt,
> > > > > > "/soc/pinctrl at 13040000/usb0-0");
> > > > > > /* usb_pins */
> > > > > > fdt_create_phandle(fdt, offset);
> > > > > > fdt_add_subnode(fdt, offset, "driver-vbus-pin");
> > > > > > offset = fdt_path_offset(fdt,
> > > > > > "/soc/pinctrl at 13040000/usb0-0/driver-vbus-pin");
> > > > > > fdt_setprop_u32(fdt, offset, "pinmux", 0xff070019); /*
> > > > > > GPIOMUX(25, GPOUT_SYS_USB_DRIVE_VBUS, GPOEN_ENABLE,
> > > GPI_NONE)
> > > > > */
> > > > > > fdt_setprop_empty(fdt, offset, "bias-disable");
> > > > > > fdt_setprop_empty(fdt, offset, "input-disable");
> > > > > > fdt_setprop_empty(fdt, offset, "input-schmitt-disable");
> > > > > > fdt_setprop_u32(fdt, offset, "slew-rate", 0);
> > > > > >
> > > > > > offset = fdt_path_offset(fdt, "/soc/pcie at 2b000000");
> > > > > > /* &pcie0
> > > */
> > > > > > fdt_setprop_string(fdt, offset, "status", "disabled");
> > > > > >
> > > > > > offset = fdt_path_offset(fdt, "/soc/phy at 10210000"); /*
> > > > > > &pciephy0
> > > > > */
> > > > > > fdt_setprop_u32(fdt, offset, "starfive,sys-syscon",
> > > > > > fdt_get_phandle(fdt, fdt_path_offset(fdt,
> > > > > > "/soc/sys_syscon at 13030000"))); /* = <&sys_syscon> */
> > > > > > fdt_appendprop_u32(fdt, offset, "starfive,sys-syscon",
> > > > > > 0x18);
> > > > > > /* append <magic number> */
> > > > > > fdt_setprop_u32(fdt, offset, "starfive,stg-syscon",
> > > > > > fdt_get_phandle(fdt, fdt_path_offset(fdt,
> > > > > > "/soc/stg_syscon at 10240000"))); /* = <&stg_syscon> */
> > > > > > fdt_appendprop_u32(fdt, offset, "starfive,stg-syscon",
> > > > > > 0x148);
> > > > > > /* append <magic number> */
> > > > > > fdt_appendprop_u32(fdt, offset, "starfive,stg-syscon",
> > > > > > 0x1f4);
> > > > > > /* append <magic number> */
> > > > > > fdt_setprop_string(fdt, offset, "status", "okay");
> > > > > >
> > > > > > offset = fdt_path_offset(fdt, "/soc/usb at 10100000"); /*
> > > > > > &usb0
> > > */
> > > > > > fdt_setprop_string(fdt, offset, "pinctrl-names", "default");
> > > > > > fdt_setprop_u32(fdt, offset, "pinctrl-0",
> > > > > > fdt_get_phandle(fdt, fdt_path_offset(fdt,
> > > "/soc/pinctrl at 13040000/usb0-0")));
> > > > > > fdt_setprop_string(fdt, offset, "status", "okay");
> > > > > >
> > > > > > offset = fdt_path_offset(fdt,
> > > > > > "/soc/usb at 10100000/usb at 0");
> > > > > > /*
> > > > > > &usb_cdns3 */
> > > > > > fdt_setprop_u32(fdt, offset, "phys",
> > > > > > fdt_get_phandle(fdt, fdt_path_offset(fdt,
> > > > > > "/soc/phy at 10200000")));
> > > > > > /* = <&usbphy0> */
> > > > > > fdt_appendprop_u32(fdt, offset, "phys",
> > > > > > fdt_get_phandle(fdt, fdt_path_offset(fdt,
> > > > > > "/soc/phy at 10210000"))); /*
> > > append <&pciephy0> */
> > > > > > fdt_setprop(fdt, offset, "phy-names",
> > > > > > "cdns3,usb2-phy\0cdns3,usb3-phy",
> > > > > > sizeof("cdns3,usb2-phy\0cdns3,usb3-phy"));
> > > > > > fdt_setprop_string(fdt, offset, "dr_mode", "host");
> > > > > >
> > > > > > I have made some mistake for devicetree and USB2.0 with
> > > > > > keeping
> > > > > > pcie0 (not disable)? or is there a problem with the implementation?
> > > > > >
> > > > > > Best regards, -E Shattow
> > > > >
> > >
> > > > I don’t have a Milk-V CM board. So I just can test this code to Star64.
> > > > Thanks. I will test this and add the code to board_fixup_star64().
> > >
> > > Can you try to configure in USB2.0-only mode on Star64? Do you see
> > > the same problem with "load access fault"?
> > >
> > Yes ,USB 2.0 only can work.
> > > ...snip...
> > >
> > > Same devicetree fixup code but separated some of the statements to
> > > multiple
> > > lines:
> > >
> > > https://paste.debian.net/1324036/
> > >
> > > ```
> > Now I can see the issue,Usb 2.0 host can work in Milk-V CM, but PCIe can not
> work.
> > Is that correct?
> > The PCIe in CM board is PCIe0, The PCIe1 is not used. So I think
> > disable PCIe1 node and just set USB 2.0 to host is OK.
> > milkV CM PCIe0 setting is the same with VisionFive v2.
> > The USB 3.0 setting should not be added.
> >
> > This USB 3.0 setting. Should NOT be added to Milk-V CM board.
> > &pciephy0 {
> > starfive,sys-syscon = <&sys_syscon 0x18>;
> > starfive,stg-syscon = <&stg_syscon 0x148 0x1f4>;
> > status = "okay";
> > };
> >
> > &usb_cdns3 {
> > phys = <&usbphy0>, <&pciephy0>;
> > phy-names = "cdns3,usb2-phy", "cdns3,usb3-phy";
> > dr_mode = "host";
> > status = "okay";
> > };
> >
>
> Here is Mars CM Lite:
>
> StarFive # pci
> BusDevFun VendorId DeviceId Device Class Sub-Class
> _____________________________________________________________
> 00.00.00 0x1556 0x1111 Bridge device 0x04
> 01.00.00 0x10ec 0x8168 Network controller 0x00
> 02.00.00 0x1556 0x1111 Bridge device 0x04
>
> This is the DFRobot Mini Router carrier and the Mars CM Lite. There is a
> network interface connected to PCIe.
>
> When I apply this fixup:
>
> void spl_fdt_fixup_jh7110_cadence_usb2_host(void *fdt) {
> int offset;
> u32 phandle;
>
> offset = fdt_path_offset(fdt, "/soc/pinctrl at 13040000"); /* &sysgpio
> */
> fdt_add_subnode(fdt, offset, "usb0-0");
> fdt_setprop_string(fdt, fdt_path_offset(fdt, "/__symbols__"),
> "usb_pins", "/soc/pinctrl at 13040000/usb0-0");
> offset = fdt_path_offset(fdt, "/soc/pinctrl at 13040000/usb0-0");
> /* usb_pins */
> fdt_create_phandle(fdt, offset);
> fdt_add_subnode(fdt, offset, "driver-vbus-pin");
> offset = fdt_path_offset(fdt,
> "/soc/pinctrl at 13040000/usb0-0/driver-vbus-pin");
> fdt_setprop_u32(fdt, offset, "pinmux", 0xff070019); /* GPIOMUX(25,
> GPOUT_SYS_USB_DRIVE_VBUS, GPOEN_ENABLE, GPI_NONE) */
> fdt_setprop_empty(fdt, offset, "bias-disable");
> fdt_setprop_empty(fdt, offset, "input-disable");
> fdt_setprop_empty(fdt, offset, "input-schmitt-disable");
> fdt_setprop_u32(fdt, offset, "slew-rate", 0);
>
> offset = fdt_path_offset(fdt, "/soc/pcie at 2c000000"); /* &pcie1 */
> fdt_setprop_string(fdt, offset, "status", "disabled");
>
> offset = fdt_path_offset(fdt, "/soc/usb at 10100000"); /* &usb0 */
> fdt_setprop_string(fdt, offset, "pinctrl-names", "default");
> phandle = fdt_get_phandle(fdt, fdt_path_offset(fdt,
> "/soc/pinctrl at 13040000/usb0-0")); /* <&usb_pins> */
> fdt_setprop_u32(fdt, offset, "pinctrl-0", phandle);
> fdt_setprop_string(fdt, offset, "status", "okay");
>
> offset = fdt_path_offset(fdt, "/soc/usb at 10100000/usb at 0"); /*
> &usb_cdns3 */
> fdt_setprop_string(fdt, offset, "dr_mode", "host"); }
>
> at the last instruction of spl_fdt_fixup_mars_cm() then there is this error I am
> telling you about:
>
> U-Boot 2024.07-00971-g8eed381de5ef-dirty (Jul 23 2024 - 05:49:09 -0700)
>
> CPU: sifive,u74-mc
> Model: Milk-V Mars CM Lite
> DRAM: 4 GiB
> Core: 139 devices, 29 uclasses, devicetree: board
> WDT: Not starting watchdog at 13070000
> MMC: mmc at 16010000: 0, mmc at 16020000: 1
> Loading Environment from SPIFlash... SF: Detected gd25lq128 with page size
> 256 Bytes, erase size 4 KiB, total 16 MiB OK StarFive EEPROM format v2
>
> --------EEPROM INFO--------
> Vendor : MILK-V
> Product full SN: MARC-V10-2340-D004E000-000006DF data version: 0x2 PCB
> revision: 0xc1 BOM revision: A Ethernet MAC0 address: 6c:cf:39:00:83:11
> Ethernet MAC1 address: 6c:cf:39:00:83:12 --------EEPROM INFO--------
>
> starfive_7110_pcie pcie at 2b000000: Starfive PCIe bus probed.
> PCI: Failed autoconfig bar 10
> In: serial at 10000000
> Out: serial at 10000000
> Err: serial at 10000000
> Net: eth0: ethernet at 16030000
> Error: eth_rtl8169 No valid MAC address found.
>
> starting USB...
> Bus usb at 0: cdns-usb3-host usb at 0: set 1 has failed, back to 0 scanning bus
> usb at 0 for devices... Unhandled exception: Load access fault
> EPC: 00000000fff85b2e RA: 00000000fff85b28 TVAL: 0000000000000004
> EPC: 0000000040246b2e RA: 0000000040246b28 reloc adjusted
>
> Code: 9863 3ee7 8526 f0ef c37f 651c 3a03 0105 (43dc)
>
>
> resetting ...
>
> (C)StarFive
> CCC
I can reproduce USB 2.0 only on Star64 now. I know this.
Next version I will fix this.
You can test with this patch to check whether can fix this.
diff --git a/drivers/phy/starfive/phy-jh7110-usb2.c b/drivers/phy/starfive/phy-jh7110-usb2.c
index d48c9f8a74..a09fb2efea 100644
--- a/drivers/phy/starfive/phy-jh7110-usb2.c
+++ b/drivers/phy/starfive/phy-jh7110-usb2.c
@@ -116,7 +116,7 @@ int jh7110_usb2_phy_probe(struct udevice *dev)
dev_err(dev, "Failed to get app 125m clock\n");
return PTR_ERR(phy->app_125m);
}
-
+ writel(BIT(17), 0x13030018);
return 0;
}
More information about the U-Boot
mailing list