[PATCH v3 7/8] dts: starfive: Add JH7110 Cadence USB dts node

E Shattow lucent at gmail.com
Wed Jul 24 20:05:59 CEST 2024


On Tue, Jul 23, 2024 at 8:24 PM Minda Chen <minda.chen at starfivetech.com> wrote:
>
>
>
> > -----邮件原件-----
> > 发件人: 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.

I follow the "load access fault" problem to
drivers/usb/host/usb-uclass.c: err = ops->control(bus, udev, pipe,
buffer, length, setup);

ops->control has the value set from drivers/usb/host/xhci.c:

struct dm_usb_ops xhci_usb_ops = {
      .control = xhci_submit_control_msg,
...

I verify this by assigning a unique value to xhci_usb_ops.control and
printf from submit_control_msg() in drivers/usb/host/usb-uclass.c and
the value is the same.

So why does this cause a load access fault when calling this function
pointer of &xhci_submit_control_msg, but just when we are having a
problem in the Cadence USB wrapper with USB2.0-only, and not USB3.0?

The load access fault is a problem because it is a crash / halt and
nothing else can be done, and so after then a different U-Boot must be
flashed with a recovery method.

I think the USB2.0-only problem is different, but anyway it should not
be possible to crash U-Boot this way. How is this possible?

>
> 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;
>  }
>

Yes, adding the writel() this avoids the load access fault for Mars CM
Lite, and USB with also PCIe are active:

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/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");
}

StarFive # pci;usb tree
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
USB device tree:
  1  Hub (5 Gb/s, 0mA)
     U-Boot XHCI Host Controller

The output text says USB 3.0, and 5Gb/s speeds, which is probably
wrong for USB 2.0 but anyway I was able to usb stop;usb start for a
storage device and it reports 480Mb/s:

StarFive # usb tree
USB device tree:
  1  Hub (5 Gb/s, 0mA)
  |  U-Boot XHCI Host Controller
  |
  +-2  Mass Storage (480 Mb/s, 500mA)
       Kingston UHS-II SD Reader 202006003857

StarFive # usb info
1: Hub,  USB Revision 3.0
 - U-Boot XHCI Host Controller
 - Class: Hub
 - PacketSize: 512  Configurations: 1
 - Vendor: 0x0000  Product 0x0000 Version 1.0
   Configuration: 1
   - Interfaces: 1 Self Powered 0mA
     Interface: 0
     - Alternate Setting 0, Endpoints: 1
     - Class Hub
     - Endpoint 1 In Interrupt MaxPacket 8 Interval 255ms

2: Mass Storage,  USB Revision 2.10
 - Kingston UHS-II SD Reader 202006003857
 - Class: (from Interface) Mass Storage
 - PacketSize: 64  Configurations: 1
 - Vendor: 0x11b0  Product 0x3306 Version 0.3
   Configuration: 1
   - Interfaces: 1 Bus Powered 500mA
     Interface: 0
     - Alternate Setting 0, Endpoints: 2
     - Class Mass Storage, Transp. SCSI, Bulk only
     - Endpoint 1 In Bulk MaxPacket 512
     - Endpoint 2 Out Bulk MaxPacket 512

StarFive # load usb 0:2 $loadaddr /boot/initrd.img-6.9.8-riscv64
46072333 bytes read in 2760 ms (15.9 MiB/s)

However, when Linux kernel is loaded using U-Boot internal fdt there
is USB but not any PCIe active:

# lspci -v; lsusb -v

Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               2.00
  bDeviceClass            9 Hub
  bDeviceSubClass         0 [unknown]
  bDeviceProtocol         1 Single TT
  bMaxPacketSize0        64
  idVendor           0x1d6b Linux Foundation
  idProduct          0x0002 2.0 root hub
  bcdDevice            6.10
  iManufacturer           3 Linux 6.10.0-jh7110 xhci-hcd
  iProduct                2 xHCI Host Controller
  iSerial                 1 xhci-hcd.0.auto
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength       0x0019
    bNumInterfaces          1
    bConfigurationValue     1
    iConfiguration          0
    bmAttributes         0xe0
      Self Powered
      Remote Wakeup
    MaxPower                0mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           1
      bInterfaceClass         9 Hub
      bInterfaceSubClass      0 [unknown]
      bInterfaceProtocol      0 Full speed (or root) hub
      iInterface              0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x81  EP 1 IN
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0004  1x 4 bytes
        bInterval              12
Hub Descriptor:
  bLength               9
  bDescriptorType      41
  nNbrPorts             1
  wHubCharacteristic 0x0009
    Per-port power switching
    Per-port overcurrent protection
    TT think time 8 FS bits
  bPwrOn2PwrGood       10 * 2 milli seconds
  bHubContrCurrent      0 milli Ampere
  DeviceRemovable    0x00
  PortPwrCtrlMask    0xff
 Hub Port Status:
   Port 1: 0000.0100 power
Device Status:     0x0001
  Self Powered

Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               3.00
  bDeviceClass            9 Hub
  bDeviceSubClass         0 [unknown]
  bDeviceProtocol         3
  bMaxPacketSize0         9
  idVendor           0x1d6b Linux Foundation
  idProduct          0x0003 3.0 root hub
  bcdDevice            6.10
  iManufacturer           3 Linux 6.10.0-jh7110 xhci-hcd
  iProduct                2 xHCI Host Controller
  iSerial                 1 xhci-hcd.0.auto
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength       0x001f
    bNumInterfaces          1
    bConfigurationValue     1
    iConfiguration          0
    bmAttributes         0xe0
      Self Powered
      Remote Wakeup
    MaxPower                0mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           1
      bInterfaceClass         9 Hub
      bInterfaceSubClass      0 [unknown]
      bInterfaceProtocol      0 Full speed (or root) hub
      iInterface              0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x81  EP 1 IN
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0004  1x 4 bytes
        bInterval              12
        bMaxBurst               0
Binary Object Store Descriptor:
  bLength                 5
  bDescriptorType        15
  wTotalLength       0x000f
  bNumDeviceCaps          1
  SuperSpeed USB Device Capability:
    bLength                10
    bDescriptorType        16
    bDevCapabilityType      3
    bmAttributes         0x02
      Latency Tolerance Messages (LTM) Supported
    wSpeedsSupported   0x0008
      Device can operate at SuperSpeed (5Gbps)
    bFunctionalitySupport   1
      Lowest fully-functional device speed is Full Speed (12Mbps)
    bU1DevExitLat           0 micro seconds
    bU2DevExitLat           0 micro seconds
Hub Descriptor:
  bLength              12
  bDescriptorType      42
  nNbrPorts             1
  wHubCharacteristic 0x0009
    Per-port power switching
    Per-port overcurrent protection
  bPwrOn2PwrGood       50 * 2 milli seconds
  bHubContrCurrent      0 milli Ampere
  bHubDecLat          0.0 micro seconds
  wHubDelay             0 nano seconds
  DeviceRemovable    0x00
 Hub Port Status:
   Port 1: 0000.02a0 5Gbps power Rx.Detect
Device Status:     0x0001
  Self Powered

The USB storage device is not listed, this is because U-Boot was
trying to boot from the storage :-)  so I remove it.

If I do not have USB devicetree nodes in fixup then it is like this
with PCIe active:

# lspci -v; lsusb -v
0000:00:00.0 PCI bridge: PLDA XpressRich-AXI Ref Design (rev 02)
(prog-if 00 [Normal decode])
        Flags: bus master, fast devsel, latency 0, IRQ 40
        Bus: primary=00, secondary=01, subordinate=01, sec-latency=0
        Memory behind bridge: 30000000-300fffff [size=1M] [32-bit]
        Capabilities: [80] Express Root Port (Slot+), IntMsgNum 0
        Capabilities: [e0] MSI: Enable+ Count=1/32 Maskable+ 64bit+
        Capabilities: [f8] Power Management version 3
        Capabilities: [100] Vendor Specific Information: ID=1556 Rev=1
Len=008 <?>
        Capabilities: [200] Advanced Error Reporting
        Kernel driver in use: pcieport

0000:01:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd.
RTL8111/8168/8211/8411 PCI Express Gigabit Ethernet Controller (rev
15)
        Subsystem: Realtek Semiconductor Co., Ltd. RTL8111/8168 PCI
Express Gigabit Ethernet controller
        Flags: fast devsel, IRQ 39
        Memory at 30004000 (64-bit, non-prefetchable) [size=4K]
        Memory at 30000000 (64-bit, non-prefetchable) [size=16K]
        Capabilities: [40] Power Management version 3
        Capabilities: [50] MSI: Enable- Count=1/1 Maskable- 64bit+
        Capabilities: [70] Express Endpoint, IntMsgNum 1
        Capabilities: [b0] MSI-X: Enable+ Count=4 Masked-
        Capabilities: [100] Advanced Error Reporting
        Capabilities: [140] Virtual Channel
        Capabilities: [160] Device Serial Number 00-00-00-00-00-00-00-00
        Capabilities: [170] Latency Tolerance Reporting
        Capabilities: [178] L1 PM Substates
        Kernel driver in use: r8169
        Kernel modules: r8169

0001:00:00.0 PCI bridge: PLDA XpressRich-AXI Ref Design (rev 02)
(prog-if 00 [Normal decode])
        Flags: bus master, fast devsel, latency 0, IRQ 59
        Bus: primary=00, secondary=01, subordinate=01, sec-latency=0
        Memory behind bridge: [disabled] [32-bit]
        Capabilities: [80] Express Root Port (Slot+), IntMsgNum 0
        Capabilities: [e0] MSI: Enable+ Count=1/32 Maskable+ 64bit+
        Capabilities: [f8] Power Management version 3
        Capabilities: [100] Vendor Specific Information: ID=1556 Rev=1
Len=008 <?>
        Capabilities: [200] Advanced Error Reporting
        Kernel driver in use: pcieport

There is more to do for changing to USB2.0-only and also keep PCIe ?

Thank you Minda.   -E


More information about the U-Boot mailing list