Date: Tue, 23 Jan 2018 18:03:13 +0000 (UTC) From: Kyle Evans <kevans@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r328293 - head/stand/fdt Message-ID: <201801231803.w0NI3D1M084533@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
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);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201801231803.w0NI3D1M084533>