svn commit: r262347 - head/sys/boot/fdt

Ian Lepore ian at FreeBSD.org
Sat Feb 22 22:18:20 UTC 2014


Author: ian
Date: Sat Feb 22 22:18:20 2014
New Revision: 262347
URL: http://svnweb.freebsd.org/changeset/base/262347

Log:
  Add a feature for automatically finding and loading a dtb file by name.
  The name is taken from the u-boot env vars fdtfile or fdt_file.  If the
  name isn't fully-qualified a search is done in module_path locations.
  
  The search order for a usable dtb in fdt_setup_fdtp() is now
  
   - A dtb loaded with an explicit "load -t dtb" command.
   - A dtb already loaded into memory somehow[*] and pointed to by fdt_to_load.
   - A dtb in the memory pointed to by the u-boot env vars fdtaddr or fdt_addr.
   - A file named by the u-boot env vars fdtfile or fdt_file.
   - A static dtb compiled into the kernel.
  
  * Presumably by some arch-specific command or code.

Modified:
  head/sys/boot/fdt/fdt_loader_cmd.c

Modified: head/sys/boot/fdt/fdt_loader_cmd.c
==============================================================================
--- head/sys/boot/fdt/fdt_loader_cmd.c	Sat Feb 22 22:07:16 2014	(r262346)
+++ head/sys/boot/fdt/fdt_loader_cmd.c	Sat Feb 22 22:18:20 2014	(r262347)
@@ -254,11 +254,36 @@ fdt_load_dtb_addr(struct fdt_header *hea
 }
 
 static int
+fdt_load_dtb_file(const char * filename)
+{
+	struct preloaded_file *bfp, *oldbfp;
+	int err;
+
+	debugf("fdt_load_dtb_file(%s)\n", filename);
+
+	oldbfp = file_findfile(NULL, "dtb");
+
+	/* Attempt to load and validate a new dtb from a file. */
+	if ((bfp = file_loadraw(filename, "dtb")) == NULL) {
+		sprintf(command_errbuf, "failed to load file '%s'", filename);
+		return (1);
+	}
+	if ((err = fdt_load_dtb(bfp->f_addr)) != 0) {
+		file_discard(bfp);
+		return (err);
+	}
+
+	/* A new dtb was validated, discard any previous file. */
+	if (oldbfp)
+		file_discard(oldbfp);
+	return (0);
+}
+
+static int
 fdt_setup_fdtp()
 {
 	struct preloaded_file *bfp;
 	struct fdt_header *hdr;
-	int err;
 	const char *s;
 	char *p;
 	vm_offset_t va;
@@ -268,7 +293,8 @@ fdt_setup_fdtp()
 	/* If we already loaded a file, use it. */
 	if ((bfp = file_findfile(NULL, "dtb")) != NULL) {
 		if (fdt_load_dtb(bfp->f_addr) == 0) {
-			printf("Using DTB from loaded file.\n");
+			printf("Using DTB from loaded file '%s'.\n", 
+			    bfp->f_name);
 			return (0);
 		}
 	}
@@ -295,12 +321,26 @@ fdt_setup_fdtp()
 		if (*p == '\0') {
 			if (fdt_load_dtb_addr(hdr) == 0) {
 				printf("Using DTB provided by U-Boot at "
-				    "address 0x%08X.\n", hdr);
+				    "address 0x%p.\n", hdr);
 				return (0);
 			}
 		}
 	}
 
+	/*
+	 * If the U-boot environment contains a variable giving the name of a
+	 * file, use it if we can load and validate it.
+	 */
+	s = ub_env_get("fdtfile");
+	if (s == NULL)
+		s = ub_env_get("fdt_file");
+	if (s != NULL && *s != '\0') {
+		if (fdt_load_dtb_file(s) == 0) {
+			printf("Loaded DTB from file '%s'.\n", s);
+			return (0);
+		}
+	}
+
 	/* If there is a dtb compiled into the kernel, use it. */
 	if ((va = fdt_find_static_dtb()) != 0) {
 		if (fdt_load_dtb(va) == 0) {


More information about the svn-src-all mailing list