[PATCH v2 5/9] board_f: Fix corruption of relocaddr
Simon Glass
sjg at chromium.org
Mon Jul 31 18:01:34 CEST 2023
Hi Devarsh,
On Mon, 31 Jul 2023 at 05:10, Devarsh Thakkar <devarsht at ti.com> wrote:
>
> Hi Simon,
>
> Thanks for the patch.
>
> On 30/07/23 22:46, Simon Glass wrote:
> > When the video framebuffer comes from the bloblist, we should not change
> > relocaddr to this address, since it interfers with the normal memory
> > allocation.
> >
> > This fixes a boot loop in qemu-x86_64
> >
> > Signed-off-by: Simon Glass <sjg at chromium.org>
> > Fixes: 5bc610a7d9d ("common: board_f: Pass frame buffer info from SPL to u-boot")
> > Suggested-by: Nikhil M Jain <n-jain1 at ti.com>
> > ---
> >
> > Changes in v2:
> > - Add a Kconfig as the suggested conditional did not work
>
> Overall this approach looks fine too but just curious to know, what is the
> ho->fb and gd->relocaddr in your case, so that we could understand your
> scenario better and maybe devise a more generic condition as a later-on patch
> since you mentioned that shared condition did not work for you.
Well, bear in mind that you are not filling in the video handoff
struct fully, so I need to disable it for qemu-x86_64.
Here is the trace. You can try it yourself with qemu-x86_64.
qemu-system-x86_64 -m 8G -smp 4 -bios /tmp/b/qemu-x86_64/u-boot.rom
-drive id=fdisk,file=root.img,if=virtio,driver=raw -serial mon:stdio
U-Boot SPL 2023.10-rc1-00119-g53cf4476d95-dirty (Jul 31 2023 - 09:51:11 -0600)
Video: 1024x768x32
Trying to boot from SPI
Jumping to 64-bit U-Boot: Note many features are missing
initcall: 0000000001133cdd
initcall: 000000000118c88a
initcall: 000000000113c550
initcall: 000000000113e006
initcall_run_list() initcall: 000000000113441a
initcall_run_list() initcall: 000000000113c75a
initcall_run_list() initcall: 000000000113ac52
initcall_run_list() initcall: 0000000001133cfe
initcall_run_list() initcall: 00000000011112d8
initcall_run_list() initcall: 0000000001133d01
initcall_run_list() initcall: 0000000001134444
initcall_run_list() initcall: 000000000118f81e
initcall_run_list() initcall: 000000000115c528
initcall_run_list() initcall: 00000000011337ff
initcall_run_list() initcall: 000000000114f33b
initcall_run_list() initcall: 000000000118d8b7
U-Boot 2023.10-rc1-00119-g53cf4476d95-dirty (Jul 31 2023 - 09:51:11 -0600)
initcall_run_list() initcall: 000000000113382b
display_text_info() U-Boot code: 01110000 -> 011C87B0 BSS: -> 011D2524
initcall_run_list() initcall: 0000000001111d3c
initcall_run_list() initcall: 0000000001133872
initcall_run_list() initcall: 0000000001133943
CPU: QEMU Virtual CPU version 2.5+
initcall_run_list() initcall: 0000000001134480
initcall_run_list() initcall: 0000000001133a01
DRAM: initcall_run_list() initcall: 0000000001111332
initcall_run_list() initcall: 0000000001133d07
setup_dest_addr() Monitor len: 000C2524
setup_dest_addr() Ram size: 200000000
setup_dest_addr() Ram top: C0000000
initcall_run_list() initcall: 0000000001133deb
initcall_run_list() initcall: 0000000001133e00
initcall_run_list() initcall: 0000000001133e03
gd->relocaddr=c0000000, ho->fb=d0000000
### ERROR ### Please RESET the board ###
QEMU: Terminated
The tree for this is basically u-boot-dm/bryd-working, just before this patch:
53cf4476d95 (HEAD) Revert "x86: Switch QEMU over to use the bochs driver"
5f78655f29d x86: Run QEMU machine setup in SPL
2952bc2f091 video: Tidy up Makefile rule for video
cd48d152138 x86: spl: Drop unwanted debug()
a4ce5665d55 Revert "efi debug"
530d87910dc efi debug
a36d59ba99a (x86/master, x86-public/master) Merge tag
'efi-2023-10-rc2' of
https://source.denx.de/u-boot/custodians/u-boot-efi
>
> >
> > common/board_f.c | 3 ++-
> > drivers/video/Kconfig | 8 ++++++++
> > 2 files changed, 10 insertions(+), 1 deletion(-)
> >
> > diff --git a/common/board_f.c b/common/board_f.c
> > index 7d2c380e91e2..5173d0a0c2d5 100644
> > --- a/common/board_f.c
> > +++ b/common/board_f.c
> > @@ -419,7 +419,8 @@ static int reserve_video(void)
> > if (!ho)
> > return log_msg_ret("blf", -ENOENT);
> > video_reserve_from_bloblist(ho);
> > - gd->relocaddr = ho->fb;
> > + if (IS_ENABLED(CONFIG_VIDEO_RESERVE_SPL))
> > + gd->relocaddr = ho->fb;
> > } else if (CONFIG_IS_ENABLED(VIDEO)) {
> > ulong addr;
> > int ret;
>
> Ok, so as I understand in your case you have enabled CONFIG_SPL_VIDEO but not
> calling reserve_video in SPL stage ?
Yes, see below.
>
> > diff --git a/drivers/video/Kconfig b/drivers/video/Kconfig
> > index b41dc60cec59..e0e07ed0cda5 100644
> > --- a/drivers/video/Kconfig
> > +++ b/drivers/video/Kconfig
> > @@ -1106,6 +1106,14 @@ config SPL_VIDEO_REMOVE
> > if this option is enabled video driver will be removed at the end of
> > SPL stage, beforeloading the next stage.
> >
> > +config VIDEO_RESERVE_SPL
> > + bool
> > + help
> > + This adjusts reserve_video() to redirect memory reservation when it
> > + sees a video handoff blob (BLOBLISTT_U_BOOT_VIDEO). This avoids the
> > + memory used for video being allocated to U-Boot, thus having some
> {some minor suggestion for correction on above text}
> avoids the memory used for framebuffer from being allocated to u-boot, thus
> preventing any further memory reservations done by u-boot from overwriting the
> framebuffer ?
>
> I think as mentioned earlier, overall this approach looks ok to me too, maybe
> later on we can add some conditions to check validity of passed framebuffer
> address and move the relocaddr pointer more intelligently.
The problem is really that by pre-allocating the display in SPL we
need to excluded it from the reservations done by U-Boot proper. It
should not be done again. For that to work, we may need to tell U-Boot
proper that it should start its reservations at a certain address,
e.g. the bottom of the framebuffer.
Also. could you send a patch to fully fill in the video handoff? At
present it is missing some fields.
Regards,
Simon
More information about the U-Boot
mailing list