A38x: Broken Linux kernel booting over UART

Pali Rohár pali at kernel.org
Fri Nov 5 12:38:21 CET 2021


On Monday 11 October 2021 17:49:05 Pali Rohár wrote:
> On Monday 11 October 2021 10:45:44 Tom Rini wrote:
> > On Mon, Oct 11, 2021 at 04:33:44PM +0200, Pali Rohár wrote:
> > > On Monday 11 October 2021 10:32:22 Tom Rini wrote:
> > > > On Mon, Oct 11, 2021 at 04:25:48PM +0200, Pali Rohár wrote:
> > > > > On Monday 11 October 2021 10:03:21 Tom Rini wrote:
> > > > > > On Mon, Oct 11, 2021 at 12:13:29PM +0200, Pali Rohár wrote:
> > > > > > 
> > > > > > > Hello!
> > > > > > > 
> > > > > > > Current U-Boot master has broken booting of Linux kernel over UART on
> > > > > > > A38x.
> > > > > > > 
> > > > > > > After transferring image over UART it just prints:
> > > > > > > 
> > > > > > > CACHE: Misaligned operation at range [01000000, 014e5d96]
> > > > > > > ## Total Size      = 0x004e5d96 = 5135766 Bytes
> > > > > > > ## Start Addr      = 0x01000000
> > > > > > > Kernel image @ 0x1000000 [ 0x000000 - 0x4e0e60 ]
> > > > > > > FDT and ATAGS support not compiled in
> > > > > > > 
> > > > > > > resetting ...
> > > > > > > 
> > > > > > > It resets board and does not boot kernel. Note that I'm trying to boot
> > > > > > > recent 5.15 kernel image, not something old.
> > > > > > > 
> > > > > > > I did git bisect and it found following commit which broke booting:
> > > > > > > 
> > > > > > > 9774462e34faaa64a91eb9c68b438a52d22bba6a is the first bad commit
> > > > > > > commit 9774462e34faaa64a91eb9c68b438a52d22bba6a
> > > > > > > Author: Tom Rini <trini at konsulko.com>
> > > > > > > Date:   Mon Aug 30 09:16:30 2021 -0400
> > > > > > > 
> > > > > > >     arm: Disable ATAGs support
> > > > > > > 
> > > > > > > Prior this commit booting working fine.
> > > > > > > 
> > > > > > > Do you have any idea what is with above commit? Or any hints?
> > > > > > 
> > > > > > Can you provide the full log of what you're doing?  And what's in that
> > > > > > image you're passing, exactly?  Thanks.
> > > > > 
> > > > > Here is full log:
> > > > > 
> > > > > $ make CROSS_COMPILE=arm-linux-gnueabihf- turris_omnia_defconfig
> > > > > ...
> > > > > $ make CROSS_COMPILE=arm-linux-gnueabihf- -j8
> > > > > ...
> > > > > $ ./tools/kwboot -b ./u-boot-spl.kwb -B 5200000 -t /dev/ttyUSB0
> > > > > Patching image boot signature to UART
> > > > > Injecting binary header code for changing baudrate to 5200000 Bd
> > > > > Injecting code for changing baudrate back
> > > > > Aligning image header to Xmodem block size
> > > > > Sending boot message. Please reboot the target...-
> > > > > Waiting 2s and flushing tty
> > > > > Sending boot image header (115072 bytes)...
> > > > >   0 % [......................................................................]
> > > > > ...
> > > > >  93 % [...........................................................           ]
> > > > > Done
> > > > > 
> > > > > U-Boot SPL 2021.10-00600-gf331497d3ad4 (Oct 11 2021 - 16:13:39 +0200)
> > > > > High speed PHY - Version: 2.0
> > > > > MiniPCIe/mSATA card detection... MiniPCIe
> > > > > Detected Device ID 6820
> > > > > board SerDes lanes topology details:
> > > > >  | Lane # | Speed |  Type       |
> > > > >  --------------------------------
> > > > >  |   0    |   5   | PCIe0       |
> > > > >  |   1    |   5   | USB3 HOST0  |
> > > > >  |   2    |   5   | PCIe1       |
> > > > >  |   3    |   5   | USB3 HOST1  |
> > > > >  |   4    |   5   | PCIe2       |
> > > > >  |   5    |   0   | SGMII2      |
> > > > >  --------------------------------
> > > > > High speed PHY - Ended Successfully
> > > > > mv_ddr: 14.0.0 
> > > > > DDR3 Training Sequence - Switching XBAR Window to FastPath Window
> > > > > mv_ddr: completed successfully
> > > > > Disabling MCU watchdog... disabled
> > > > > Trying to boot from BOOTROM
> > > > > Returning to BootROM (return address 0xffff05c4)...
> > > > > 
> > > > > Changing baudrate to 5200000 Bd
> > > > > 
> > > > > Sending boot image data (747780 bytes)...
> > > > >   0 % [......................................................................]
> > > > > ...
> > > > >  99 % [.................................                                     ]
> > > > > Done
> > > > > Finishing transfer
> > > > > 
> > > > > Changing baudrate back to 115200 Bd
> > > > > 
> > > > > [Type Ctrl-\ + c to quit]
> > > > > 
> > > > > 
> > > > > U-Boot 2021.10-00600-gf331497d3ad4 (Oct 11 2021 - 16:13:39 +0200)
> > > > > 
> > > > > SoC:   MV88F6820-A0 at 1600 MHz
> > > > > DRAM:  2 GiB (800 MHz, 32-bit, 2T, ECC not enabled)
> > > > > WDT:   Started watchdog at 20300 with servicing (60s timeout)
> > > > > MMC:   mv_sdh: 0
> > > > > Loading Environment from SPIFlash... SF: Detected s25fl164k with page size 256 Bytes, erase size 4 KiB, total 8 MiB
> > > > > OK
> > > > > Model: Turris Omnia
> > > > > Turris Omnia:
> > > > >   RAM size: 2048 MiB
> > > > >   Serial Number: 0000000B00007B3C
> > > > > Regdomain set to **
> > > > > Net:   eth0: ethernet at 70000, eth1: ethernet at 30000, eth2: ethernet at 34000
> > > > > =>
> > > > > 
> > > > > $ kermit
> > > > > C-Kermit>set line /dev/ttyUSB0
> > > > > C-Kermit>set speed 115200
> > > > > C-Kermit>set carrier-watch off
> > > > > C-Kermit>connect
> > > > > Connecting to /dev/ttyUSB0, speed 115200
> > > > >  Escape character: Ctrl-\ (ASCII 28, FS): enabled
> > > > > Type the escape character followed by C to get back,
> > > > > or followed by ? to see other options.
> > > > > ----------------------------------------------------
> > > > > 
> > > > > => echo $uart_boot
> > > > > loadb $kernel_addr_r 5200000 && part uuid mmc 0:1 partuuid && setenv bootargs earlyprintk rootwait console=ttyS0,115200 rootfstype=btrfs root=PARTUUID=${partuuid} rootflags=commit=5,subvol=@ rw cfg80211.freg=${regdomain} && bootz ${kernel_addr_r}
> > > > > => run uart_boot
> > > > > ## Switch baudrate to 5200000 bps and press ENTER ...
> > > > > C-Kermit>set speed 5200000
> > > > > ?No keywords match - 5200000 (,Transmission rate for /dev/ttyUSB0 (bits per second))
> > > > > 
> > > > > ?SET SPEED fails, speed is 5260273
> > > > > C-Kermit>send /tmp/kernel
> > > > > C-Kermit>set speed 115200
> > > > > /dev/ttyUSB0, 115200 bps
> > > > > C-Kermit>connect
> > > > > CACHE: Misaligned operation at range [01000000, 014e5d96]
> > > > > ## Total Size     = 0x004e5d96 = 5135766 Bytes
> > > > > ## Start Addr      = 0x01000000
> > > > > ## Switch baudrate to 115200 bps and press ESC ...
> > > > > Kernel image @ 0x1000000 [ 0x000000 - 0x4e0e60 ]
> > > > > FDT and ATAGS support not compiled in
> > > > > 
> > > > > resetting ...
> > > > 
> > > > OK, and is /tmp/kernel something with an appended dtb then?
> > > 
> > > Yes, single image suitable for single kermit UART transfer:
> > > cat arch/arm/boot/zImage arch/arm/boot/dts/armada-385-turris-omnia.dtb > /tmp/kernel
> > 
> > Well, OK, there we go.  That's what you need to figure out how to fix
> > booting of.  You're hitting the panic in arch/arm/lib/bootm.c and need
> > to make sure that (a) we do whatever is needed for appended dtb to be
> > found by the kernel still/again and (b) check that ourselves, before
> > panic or not, in that case.  Before this was probably enabling ATAGs,
> > but that wasn't (I think? I forget the magic behind appended dtb as it's
> > been a while) actually used by Linux, just by U-Boot to not panic at
> > that point.
> 
> Ok, thanks for hints. So seems that som unrelated code path via atags
> was used even for DTS booting. I also do not remember details. I will
> try to debug it...

Hello Tom!

I would like to know, what is required to enable same boot atags
behavior like before applying that commit 9774462e34fa ("arm: Disable
ATAGs support")?

I have enabled following U-Boot option (as it seems to be enough):

  CONFIG_SUPPORT_PASSING_ATAGS=y

And also I have compiled kernel with following debug options:

  CONFIG_DEBUG_LL=y
  CONFIG_DEBUG_MVEBU_UART0_ALTERNATE=y
  CONFIG_DEBUG_UNCOMPRESS=y

(to see early kernel output on mvebu UART console).

But I see only these lines on UART:

  Starting kernel ...

  DTB:0x014E0798 (0x00004F96)
  C:0x010000E0-0x014E5740->0x010AF400-0x01594A60
  DTB:0x0158FAB8 (0x00004F96)
  Uncompressing Linux... done, booting the kernel.

And no more output. After some time watchdog reboots board.

Which means that something more in U-Boot is needed to enable atags
booting (with possible appended DTB). Or that mentioned commit really
broke booting. Any idea?


I looked at the kernel code and early code which runs prior decompresser
looks if after zImage is valid magic number for DTB. And if yes, it
replace content of variable where is pointer to atags struct by pointer
to DTB. So if I understood it correctly then kernel completely ignores
atags if there is attached DTB (after zImage). So for me it looks like
U-Boot can set to r2 any value, it even does not have to be valid atags
structure, kernel ignores it if it found attached DTB.


More information about the U-Boot mailing list