"No valid device tree blob found" error

Luiz Otavio O Souza lists.br at gmail.com
Tue Feb 18 18:52:07 UTC 2014


On 17 February 2014 14:53, Ian Lepore wrote:
> On Mon, 2014-02-17 at 10:08 -0300, Luiz Otavio O Souza wrote:
>> On 16 February 2014 18:30, Glen Barber wrote:
>> > Images for RPI-B and BEAGLEBONE (and I suspect PANDABOARD) are failing
>> > to boot this week.
>> >
>> > The images are built against r261948.  Console messages during boot:
>> >
>> >   ## Starting application at 0x88000054 ...
>> >   Consoles: U-Boot console
>> >   Compatible API signature found @9f242240
>> >   MMC Device 2 not found
>> >   MMC Device 3 not found
>> >   Number of U-Boot devices: 2
>> >
>> >   FreeBSD/armv6 U-Boot loader, Revision 1.2
>> >   (root at grind.freebsd.org, Sun Feb 16 18:10:43 UTC 2014)
>> >   DRAM:    512MB
>> >
>> >   Device: disk
>> >   Loading /boot/defaults/loader.conf
>> >   /boot/kernel/kernel data=0x460bc8+0x2c7438
>> >   syms=[0x4+0x85a60+0x4+0x50c89]
>> >
>> >   Hit [Enter] to boot immediately, or any other key for command prompt.
>> >   Booting [/boot/kernel/kernel]...
>> >   Using DTB provided by U-Boot.
>> >   No valid device tree blob found!WARNING! Trying to fire up the kernel,
>> >   but no device tree blob found!
>> >
>> > Any ideas if this is error on my part, or a problem in head/ ?  The
>> > stable/10/ images boot fine, so I do not suspect any code changes in the
>> > build process.
>> >
>>
>>
>> Glen,
>>
>> I think it is related to r261819. Looking at the code it looks like
>> the attached patch may fix it (i'm still updating my images to the
>> latest -head and would probably need a few hours before i can test it
>> myself).
>>
>> Can you check if it works for you ?
>>
>> Thanks,
>>
>> Luiz
>
> I believe your patch is correct; when I copied the code to do the header
> check it came from a context where the header variable was the struct
> itself, not a pointer to it.  Odd that the error message doesn't seem to
> match, though.
>
> -- Ian

The patch does indeed fix the issue.

The error message has two different usage cases, when called from the
fdt_copy() the output of command_errbuf/command_errmsg isn't
displayed. An error from fdt_copy() is printed instead. When called
from fdt_fixup() the error message was being overwritten.

The attached patch fix all these issues.

Now, when called from fdt_copy() i've added a missing '\n' at end of
the error message:

Hit [Enter] to boot immediately, or any other key for command prompt.
Booting [/boot/kernel/kernel]...
Using DTB provided by U-Boot.
No valid device tree blob found!
WARNING! Trying to fire up the kernel, but no device tree blob found!

And from fdt_fixup() now it doesn't overwrite the error from
fdt_load_dtb[_addr]() anymore:

Hit [Enter] to boot immediately, or any other key for command prompt.
Booting [/boot/kernel/kernel] in 9 seconds...

Type '?' for a list of commands, 'help' for more detailed help.
loader> fdt ls
Using DTB provided by U-Boot.
error validating blob: FDT_ERR_BADMAGIC
loader>


Does the attached patch looks fine ?

Luiz
-------------- next part --------------
Index: sys/boot/fdt/fdt_loader_cmd.c
===================================================================
--- sys/boot/fdt/fdt_loader_cmd.c	(revision 262183)
+++ sys/boot/fdt/fdt_loader_cmd.c	(working copy)
@@ -230,7 +230,7 @@
 	int err;
 
 	fdtp_size = fdt_totalsize(header);
-	err = fdt_check_header(&header);
+	err = fdt_check_header(header);
 	if (err < 0) {
 		sprintf(command_errbuf, "error validating blob: %s",
 		    fdt_strerror(err));
@@ -667,7 +667,7 @@
 {
 	const char *env;
 	char *ethstr;
-	int chosen, err, eth_no, len;
+	int chosen, eth_no, len;
 	struct sys_info *si;
 
 	env = NULL;
@@ -675,13 +675,8 @@
 	ethstr = NULL;
 	len = 0;
 
-	if (fdtp == NULL) {
-		err = fdt_setup_fdtp();
-		if (err) {
-			sprintf(command_errbuf, "No valid device tree blob found!");
-			return (0);
-		}
-	}
+	if (fdtp == NULL && fdt_setup_fdtp() != 0)
+		return (0);
 
 	/* Create /chosen node (if not exists) */
 	if ((chosen = fdt_subnode_offset(fdtp, 0, "chosen")) ==
@@ -747,7 +742,7 @@
 	if (fdtp == NULL) {
 		err = fdt_setup_fdtp();
 		if (err) {
-			printf("No valid device tree blob found!");
+			printf("No valid device tree blob found!\n");
 			return (0);
 		}
 	}


More information about the freebsd-arm mailing list