[PATCH v2 0/3] Ethernet support for Raspberry Pi 4

Andre Przywara andre.przywara at arm.com
Thu Jan 23 12:29:13 CET 2020


On Wed, 22 Jan 2020 19:05:10 +0100
Matthias Brugger <mbrugger at suse.com> wrote:

Hi,

Matthias, many thanks for looking at this and giving it a try!

> On 22/01/2020 18:34, Andre Przywara wrote:
> > On Wed, 22 Jan 2020 18:18:39 +0100
> > Matthias Brugger <mbrugger at suse.com> wrote:
> > 
> > Hi Matthias,
> >   
> >> On 17/01/2020 02:20, Andre Przywara wrote:  
> >>> This series adds Ethernet support for the Raspberry Pi 4. The SoC
> >>> includes a "Broadcom Genet v5 MAC" IP, connected as a proper platform
> >>> device (no USB anymore!). Patch 1 provides a driver for that. There does
> >>> not seem to be publicly available documentation, so this is based on the
> >>> Linux driver, but stripped down to just provide what U-Boot needs.
> >>> Patch 2 fixes up the RPi4 memory map to accommodate the MMIO area the
> >>> MAC lives in, while patch 3 enables it in the respective defconfigs.
> >>>
> >>> This version addresses the comments by the diligent reviewers and testers,
> >>> for a changelog see below.
> >>> To see the individual changes as patches, refer to [1].
> >>>
> >>> Please have a look and test it, I hope this helps to simplify
> >>> development, as you spare the SD card and its slot from heavy swapping.
> >>>
> >>> I dropped the Tested-by's, as there were changes in the code. Happy
> >>> to reapply them when people confirm that it still works for them.
> >>>     
> >>
> >> I having problems to actually boot a kernel when the genet driver is build into
> >> U-Boot.  
> > 
> > Ah! Sorry, I misread the former reports, I thought this was about booting kernels in general, with mainline U-Boot, without this series.
> >   
> >> If I boot grub and linux-next from there, I get the following SError (when using
> >> earlycon):
> >> https://pastebin.com/c1sw2uZk
> >>
> >> If I skip grub and boot the kernel directly from the SD:
> >> load mmc 0:1 $kernel_addr_r Image
> >> load mmc 0:1 $fdt_addr_r bcm2711-rpi-4-b.dtb
> >> setenv bootargs "earlycon=uart8250,mmio32,0xfe215040"
> >> booti $kernel_addr_r - $fdt_addr_r
> >>
> >> Gives a similar result.
> >>
> >> Do you see similar issues?  
> > 
> > I didn't manage to start some kernel even without this series, I think, but didn't investigate further. I *loaded* several kernel images via TFTP and verified them with md5sum.
> >   
> 
> I think linux-next with defconfig should work.

Yeah, I had some success with 5.5-rc, at least till it goes into userland, which is good enough for this purpose.
And indeed I could reproduce the early crash with genet compiled in vs. mainline U-Boot.

> > Some questions:
> > - Does this happen even without touching the Ethernet in U-Boot at all (no dhcp command, no tftpboot, etc.)?  
> 
> Yes, as soon as the genet is compiled into U-Boot I'm not able to boot a Linux
> kernel.
> 
> >   (I wonder if we have still DMA going on, even after the kernel already started. But if we just call probe(), there shouldn't be much going on).  
> 
> At least when we start grub, we are actually starting the genet. I played with
> the DMA shutdown in bcmgenet_gmac_eth_stop() but wasn't lucky.

Stray DMA was more of a hope, as it would be easy to fix ;-)
Without actively using the Ethernet in U-Boot, we never call eth_start, so don't enable DMA in the first place. Actually we don't even reset the MAC. See below.

> > - Does reverting patch 2/3 change anything?  
> 
> That was my first bet, but it hangs the board when it tries to initialize the
> network driver.

True, it just looked promising ;-)

So I did some experiments, and it seems like we only call ofdata_to_platdata() and probe() from the driver. The latter is not doing much, but it starts the whole PHY init process.
I could actually avoid the crash by just *not* returning 0 in bcmgenet_phy_init(). So every hardware setup step was still performed, but U-Boot *thinks* it didn't work.

Looking at this more closely I see that we don't actually reset the MAC before accessing the PHY via MDIO. This might be a lead, but I don't see immediately why this would lead to an SError interrupt later on.

I don't have a working setup here at work, so if someone could try to insert:

    writel(0, priv->mac_reg + SYS_RBUF_FLUSH_CTRL);
    udelay(10);
    /* disable MAC while updating its registers */
    writel(0, priv->mac_reg + UMAC_CMD);
    /* issue soft reset with (rg)mii loopback to ensure a stable rxclk */
    writel(CMD_SW_RESET | CMD_LCL_LOOP_EN, priv->mac_reg + UMAC_CMD);

before calling bcmgenet_mdio_init() in bcmgenet_eth_probe() and give this a try.

Also it would be good to know if the PHY accesses via MDIO actually work at this point. As far as I remember the actual PHY init happens on first usage (typically the dhcp call).

Another thing to check is whether we would need to put the MAC back into reset upon exiting U-Boot. I quickly wired in a debug print in a .remove routine, but that didn't show up, so not sure it gets actually called in our case?

Cheers,
Andre.


> > - Does TFTP load work in grub? (net_bootp efinet0; set net_default_server=<IP address>; linux (tftp)/Image-5.5-rc7 ....)  
> 
> Yes that works, until you boot the kernel and you end up with a SError.
> 
> > 
> > I will try to debug this later tonight.
> >   
> 
> Thanks, if I can help you in any way, let me know.
> 
> Regards,
> Matthias
> 
> > Thanks!
> > Andre.
> >   
> >>
> >> Regards,
> >> Matthias
> >>  
> >>> Cheers,
> >>> Andre.
> >>>
> >>> [1] https://github.com/apritzel/u-boot/commits/rpi4-eth-v2
> >>>
> >>> Changelog v1 ... v2:
> >>> - use native endianess functions when accessing MMIO registers
> >>> - use dev_* DM wrappers for accessing devicetree data
> >>> - round base and length for flush_dcache_range, plus a comment
> >>> - check and round length for invalidate_cache_range
> >>> - support RGMII_RXID PHY mode, to support mainline .dtb
> >>>
> >>> Amit Singh Tomar (3):
> >>>   net: Add support for Broadcom GENETv5 Ethernet controller
> >>>   rpi4: Update memory map to accommodate scb devices
> >>>   rpi4: Enable GENET Ethernet controller
> >>>
> >>>  arch/arm/mach-bcm283x/init.c |   6 +-
> >>>  configs/rpi_4_32b_defconfig  |   2 +
> >>>  configs/rpi_4_defconfig      |   2 +
> >>>  configs/rpi_arm64_defconfig  |   1 +
> >>>  drivers/net/Kconfig          |   7 +
> >>>  drivers/net/Makefile         |   1 +
> >>>  drivers/net/bcmgenet.c       | 722 +++++++++++++++++++++++++++++++++++++++++++
> >>>  7 files changed, 738 insertions(+), 3 deletions(-)
> >>>  create mode 100644 drivers/net/bcmgenet.c
> >>>     
> >   



More information about the U-Boot mailing list