Booting FreeBSD from eMMC on BeagleBone Black
Patrick Kelsey
kelsey at ieee.org
Mon Mar 17 02:16:48 UTC 2014
On Sun, Mar 16, 2014 at 9:33 PM, Rui Paulo <rpaulo at freebsd.org> wrote:
> On 16 Mar 2014, at 14:59, Patrick Kelsey <kelsey at ieee.org> wrote:
>
> > - Improved disk probing support that will now by default find and use the
> > first suitable partition among the available storage devices.
>
> I think this introduced a bug where, if you have a non-responsive boot
> device, ubldr will stop and won't try network booting:
>
> ## Starting application at 0x01000054 ...
> Consoles: U-Boot console
> Compatible API signature found @1d800a8
> Number of U-Boot devices: 2
>
> FreeBSD/armv6 U-Boot loader, Revision 1.2
> (rpaulo at zedfs.local, Fri Mar 14 22:35:47 PDT 2014)
> DRAM: 256MB
> Unknown device type '' <------------ this is new
> Found U-Boot device: disk
> Probing all storage devices...
> Checking unit=0 slice=0 partition=-1...disk0: read failed, error=1
>
> Checking unit=1 slice=0 partition=-1...
> Checking unit=2 slice=0 partition=-1...
> Checking unit=3 slice=0 partition=-1...
> Checking unit=4 slice=0 partition=-1...
> Checking unit=5 slice=0 partition=-1...
>
> can't load 'kernel'
>
> Type '?' for a list of commands, 'help' for more detailed help.
> loader>
>
> It stops here and doesn't try net0 booting.
>
>
I think the problem is that some of the conditionals in
sys/boot/uboot/common/main.c:main() are broken. I believe I sowed the seed
for this in the original patch I sent to Ian, which appears to have had an
out-of-order set of tests in the disk conditional, which in hindsight
turned out to work due to a friendly coincidence (namely disk appearing
before net in the devsw). That bad-pattern conditional seems to have
gotten munged a bit further and propagated in some of the refactoring Ian
did when integrating my patch.
I believe sys/boot/uboot/common/main.c, starting around line 442, should
look like this:
if (strcmp(devsw[i]->dv_name, "disk") == 0 &&
(load_type == -1 || (load_type & DEV_TYP_STOR))) {
if (probe_disks(i, load_type, load_unit, load_slice,
load_partition) == 0)
break;
}
if (strcmp(devsw[i]->dv_name, "net") == 0 &&
(load_type == -1 || (load_type & DEV_TYP_NET)))
break;
Can you give that a try?
-Patrick
More information about the freebsd-arm
mailing list