Index: head/stand/fdt/fdt_loader_cmd.c =================================================================== --- head/stand/fdt/fdt_loader_cmd.c +++ head/stand/fdt/fdt_loader_cmd.c @@ -73,6 +73,7 @@ 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 @@ 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 @@ 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);