Author: kevans
Date: Tue Jan 23 18:03:13 2018
New Revision: 328293
URL: https://svnweb.freebsd.org/changeset/base/328293

Log:
  stand/fdt: Fallback to `name` + ".dtbo" if we fail to load `name`
  
  This behavior also matches a Linux-ism by allowing fdt_overlays to specify
  names of overlays without an extension, e.g. fdt-overlays="sunxi-h3-h5-emac"
  
  If we fail to load the file given by a name in fdt_overlays, try again with
  ".dtbo" appended to it. This still allows overlays to lack .dtbo extension
  if user prefers it and just adds a fallback cushion.
  
  Future work could move this from a hard-coded ".dtbo" to a loader.conf(5)
  configuration option.
  
  Reviewed by:  gonzo
  MFC after:    1 week
  Differential Revision:        https://reviews.freebsd.org/D13968

Modified:
  head/stand/fdt/fdt_loader_cmd.c

Modified: head/stand/fdt/fdt_loader_cmd.c
==============================================================================
--- head/stand/fdt/fdt_loader_cmd.c     Tue Jan 23 18:01:40 2018        
(r328292)
+++ head/stand/fdt/fdt_loader_cmd.c     Tue Jan 23 18:03:13 2018        
(r328293)
@@ -73,6 +73,7 @@ static size_t fdtp_size = 0;
 static vm_offset_t fdtp_va = 0;
 
 static int fdt_load_dtb(vm_offset_t va);
+static void fdt_print_overlay_load_error(int err, const char *filename);
 
 static int fdt_cmd_nyi(int argc, char *argv[]);
 
@@ -286,36 +287,57 @@ fdt_load_dtb_overlay(const char * filename)
 
        debugf("fdt_load_dtb_overlay(%s)\n", filename);
 
-       /* Attempt to load and validate a new dtb from a file. */
-       if ((bfp = file_loadraw(filename, "dtbo", 1)) == NULL) {
-               printf("failed to load file '%s'\n", filename);
-               return (1);
-       }
+       /* Attempt to load and validate a new dtb from a file. FDT_ERR_NOTFOUND
+        * is normally a libfdt error code, but libfdt would actually return
+        * -FDT_ERR_NOTFOUND. We re-purpose the error code here to convey a
+        * similar meaning: the file itself was not found, which can still be
+        * considered an error dealing with FDT pieces.
+        */
+       if ((bfp = file_loadraw(filename, "dtbo", 1)) == NULL)
+               return (FDT_ERR_NOTFOUND);
 
        COPYOUT(bfp->f_addr, &header, sizeof(header));
        err = fdt_check_header(&header);
 
        if (err < 0) {
                file_discard(bfp);
-               if (err == -FDT_ERR_BADVERSION)
-                       printf("incompatible blob version: %d, should be: %d\n",
-                           fdt_version(fdtp), FDT_LAST_SUPPORTED_VERSION);
-
-               else
-                       printf("error validating blob: %s\n",
-                           fdt_strerror(err));
-               return (1);
+               return (err);
        }
 
        return (0);
 }
 
+static void
+fdt_print_overlay_load_error(int err, const char *filename)
+{
+
+       switch (err) {
+               case FDT_ERR_NOTFOUND:
+                       printf("%s: failed to load file\n", filename);
+                       break;
+               case -FDT_ERR_BADVERSION:
+                       printf("%s: incompatible blob version: %d, should be: 
%d\n",
+                           filename, fdt_version(fdtp),
+                           FDT_LAST_SUPPORTED_VERSION);
+                       break;
+               default:
+                       /* libfdt errs are negative */
+                       if (err < 0)
+                               printf("%s: error validating blob: %s\n",
+                                   filename, fdt_strerror(err));
+                       else
+                               printf("%s: unknown load error\n", filename);
+                       break;
+       }
+}
+
 int
 fdt_load_dtb_overlays(const char * filenames)
 {
        char *names;
-       char *name;
+       char *name, *name_ext;
        char *comaptr;
+       int err, namesz;
 
        debugf("fdt_load_dtb_overlay(%s)\n", filenames);
 
@@ -327,7 +349,23 @@ fdt_load_dtb_overlays(const char * filenames)
                comaptr = strchr(name, ',');
                if (comaptr)
                        *comaptr = '\0';
-               fdt_load_dtb_overlay(name);
+               err = fdt_load_dtb_overlay(name);
+               if (err == FDT_ERR_NOTFOUND) {
+                       /* Allocate enough to append ".dtbo" */
+                       namesz = strlen(name) + 6;
+                       name_ext = malloc(namesz);
+                       if (name_ext == NULL) {
+                               fdt_print_overlay_load_error(err, name);
+                               name = comaptr + 1;
+                               continue;
+                       }
+                       snprintf(name_ext, namesz, "%s.dtbo", name);
+                       err = fdt_load_dtb_overlay(name_ext);
+                       free(name_ext);
+               }
+               /* Catch error with either initial load or fallback load */
+               if (err != 0)
+                       fdt_print_overlay_load_error(err, name);
                name = comaptr + 1;
        } while(comaptr);
 
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to