AST2500 u-boot breakage with CONFIG_RAM=y
Zev Weiss
zev at bewilderbeest.net
Sat Oct 1 07:09:10 AEST 2022
Hello u-boot/Aspeed folks,
I recently set about getting e3c246d4i switched over to
u-boot-aspeed-sdk from the old u-boot branch, but after building and
installing it I ran into some odd misbehavior.
It's not entirely consistent -- sometimes the kernel hand-off goes
alright but then the kernel's boot sequence hangs a few seconds in,
sometimes it hangs before I get any kernel console output at all, and
sometimes I end up with the following error message from u-boot as it
loads the kernel FIT image:
fdt_find_or_add_subnode: chosen: FDT_ERR_BADSTRUCTURE
ERROR: /chosen node create failed
- must RESET the board to recover.
FDT creation failed! hanging...### ERROR ### Please RESET the board ###
Additionally, if I try to boot a FIT image loaded via TFTP I
consistently get checksum-mismatch errors on the kernel subimage portion
(though the exact same FIT image loaded from flash passes that check).
I wasn't able to reproduce any misbehavior in qemu, unfortunately.
I had previously tested the 2019.04 u-boot branch on this platform and
not hit any problems like this, so I started bisecting between the
version that had worked before and the current version, which landed me
on Joel's recent patch adding CONFIG_RAM=y to the evb-ast2500 defconfig
(commit 0545d7325ff0cb1a77dc6f8007f74f415840fd90). I confirmed that
setting CONFIG_RAM=n gets things working normally again.
Looking into the code that CONFIG_RAM=y enables, I added some debug
prints to arch/arm/mach-aspeed/ast2500/board_common.c and verified that
the dram_init() routine was setting gd->ram_size to the same value in
both cases. However, I noticed there's also one instruction in
platform.S that's included when CONFIG_RAM is enabled [1]. My
recollection of ARM assembly is fairly rusty, but I believe that's just
an early return short-circuiting the rest of the initialization code in
that routine, perhaps with the intent that that work will get taken care
of by C code in the Aspeed RAM driver instead? In any case, I
experimented with leaving CONFIG_RAM=y but removing just that
instruction, and it seems to resolve the problems I was seeing -- so if
my interpretation does match the actual intent, it seems like there's
some discrepancy between the initialization done in the C code and the
assembly code, though I'm not sure what it might be. For what it's
worth, it did seem like the CONFIG_RAM=n build ran noticeably faster.
Does anyone have any thoughts as to what might be going on, or tips on
how to go about debugging further?
Thanks,
Zev
[1] https://github.com/openbmc/u-boot/blob/8e834983d0a6b9265cee1674564b016565630883/arch/arm/mach-aspeed/ast2500/platform.S#L663-L665
More information about the openbmc
mailing list