Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 24 Mar 2016 23:48:09 -0600
From:      Warner Losh <imp@bsdimp.com>
To:        ticso@cicely.de
Cc:        Sylvain Garrigues <sylgar@gmail.com>, freebsd-arm <freebsd-arm@freebsd.org>
Subject:   Re: Booting kernel.bin directly on Raspberry Pi / external DTB support
Message-ID:  <CANCZdfrhm5NSCXehkDc%2BDa4cxYhbU_NnEopR__e_a0CgajEL3A@mail.gmail.com>
In-Reply-To: <20160325052509.GE48704@cicely7.cicely.de>
References:  <1CCA59DC-5539-4CFB-81BA-0112E2120B3B@gmail.com> <20160325052509.GE48704@cicely7.cicely.de>

next in thread | previous in thread | raw e-mail | index | archive | help
On Thu, Mar 24, 2016 at 11:25 PM, Bernd Walter <ticso@cicely7.cicely.de>
wrote:

> On Thu, Mar 24, 2016 at 04:29:26PM +0100, Sylvain Garrigues wrote:
> > Hello,
> >
> > I have written a small (ugly) patch to be able to boot a kernel directl=
y
> without the ubldr loader while still using an external DTB (Linux-style
> booting may pass the DTB location pointer in the r2 register).
> > The patch is here: https://reviews.freebsd.org/differential/diff/14577/
> >
> > I tested my patch successfully with the QEMU emulator with the -dtb
> option available in recent versions, using a VERSATILEPB kernel without
> FDT_STATIC.
> > # qemu-system-arm -M versatilepb -m 128M -kernel versatile.flash -cpu
> arm1176 -dtb versatilepb.dtb
> > FYI, once the kernel is built, here is the script to build the
> versatile.flash (adapted from gonzo, no longer need to clear the r0-r3
> registers): https://reviews.freebsd.org/P92 <
> https://reviews.freebsd.org/P92>;
> >
> > I also tested successfully my patch on my Raspberry Pi 2 using U-BOOT
> and the RPI2 kernel with my patch applied (and the LINUX_BOOT_ABI option)=
:
> > u-boot> fatload mmc 0 0x200000 kernel.bin
> > u-boot> go 0x200000
> >
> > That works.
> >
> > So now I thought I could even bypass u-boot and launch kernel.bin
> directly from the Pi firmware??? But it doesn???t work, I don???t
> understand why, and that is why I am writing here.
> > Here is the config.txt which I thought would work:
> >
> > kernel=3Dkernel.bin (instead of u-boot.bin)
> > kernel_address=3D0x200000 (line added because a FreeBSD kernel needs to=
 be
> loaded on a 1MB or 2MB boundary)
> > device_tree=3Drpi2.dtb
> > device_tree_address=3D0x100
> > disable_commandline_tags=3D1
> >
> > What am I missing? Is it even possible to boot kernel.bin directly on
> the Pi (with my patch)? I found this static minimalist loader from Andrew
> here:
> https://github.com/freebsd/freebsd/commit/074d37d46c3f9b282cd2d849d997b1b=
39acd710c
> <
> https://github.com/freebsd/freebsd/commit/074d37d46c3f9b282cd2d849d997b1b=
39acd710c>
> - does it mean such a loader is necessary before the kernel?
> >
> > Thanks,
> > Sylvain
> >
> > PS: I know the =C2=AB official and supported =C2=BB way of booting Free=
BSD on the
> Pi is the u-boot + ubldr combination. I just would like to finish this
> experiment and understand why kernel.bin cannot be booted directly.
>
> I don't know if it is part of ubldr, or if there is any additional code,
> which runs before ubldr, but the Pis won't boot with the ARM CPU.
> Somewhere in the boot path is GPU bootcode, which then enables the ARM
> CPU.
> You also need low level HW init, such as setting up the clocks and RAM,
> which is not done in the Kernel.
>

What you are missing it the hardware init code that's in u-boot.bin. This
code sets up
the board after the on-board GPU loads it into the ARM's address space.
That code
sets up the ARM side of the world and hands off the code to ubldr which
finds the dtb
and does the normal /boot/loader things as well (loading modules, setting
tunables
and the like) then hands off to the kernel. You can eliminate ubldr without
a huge
amount of effort, as you've found. However, eliminating u-boot.bin is going
to be
a lot more work/

tl;dr: The interface between u-boot.bin and ubldr/kernel.bin is quite a bit
different
than between the initial bootstrap and u-boot.bin. So you can't just drop
in kernel.bin
and have it work without replicating that interface.

Warner



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CANCZdfrhm5NSCXehkDc%2BDa4cxYhbU_NnEopR__e_a0CgajEL3A>