fdt: Add a parameter to fdt_valid()

At present this only checks working_fdt, but we want to check other FDTs
also. So add the FDT to check as a parameter to fdt_valid().

Signed-off-by: Simon Glass <sjg@chromium.org>
master
Simon Glass 11 years ago committed by Tom Rini
parent f828bf25fe
commit d14da91307
  1. 38
      common/cmd_fdt.c

@ -43,7 +43,7 @@
*/ */
DECLARE_GLOBAL_DATA_PTR; DECLARE_GLOBAL_DATA_PTR;
static int fdt_valid(void); static int fdt_valid(struct fdt_header **blobp);
static int fdt_parse_prop(char *const*newval, int count, char *data, int *len); static int fdt_parse_prop(char *const*newval, int count, char *data, int *len);
static int fdt_print(const char *pathp, char *prop, int depth); static int fdt_print(const char *pathp, char *prop, int depth);
static int is_printable_string(const void *data, int len); static int is_printable_string(const void *data, int len);
@ -104,9 +104,8 @@ static int do_fdt(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
* Set the address [and length] of the fdt. * Set the address [and length] of the fdt.
*/ */
if (argc == 2) { if (argc == 2) {
if (!fdt_valid()) { if (!fdt_valid(&working_fdt))
return 1; return 1;
}
printf("The address of the fdt is %p\n", working_fdt); printf("The address of the fdt is %p\n", working_fdt);
return 0; return 0;
} }
@ -114,9 +113,8 @@ static int do_fdt(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
addr = simple_strtoul(argv[2], NULL, 16); addr = simple_strtoul(argv[2], NULL, 16);
set_working_fdt_addr((void *)addr); set_working_fdt_addr((void *)addr);
if (!fdt_valid()) { if (!fdt_valid(&working_fdt))
return 1; return 1;
}
if (argc >= 4) { if (argc >= 4) {
int len; int len;
@ -167,9 +165,8 @@ static int do_fdt(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
* Set the address and length of the fdt. * Set the address and length of the fdt.
*/ */
working_fdt = (struct fdt_header *)simple_strtoul(argv[2], NULL, 16); working_fdt = (struct fdt_header *)simple_strtoul(argv[2], NULL, 16);
if (!fdt_valid()) { if (!fdt_valid(&working_fdt))
return 1; return 1;
}
newaddr = (struct fdt_header *)simple_strtoul(argv[3],NULL,16); newaddr = (struct fdt_header *)simple_strtoul(argv[3],NULL,16);
@ -592,16 +589,23 @@ static int do_fdt(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
/****************************************************************************/ /****************************************************************************/
static int fdt_valid(void) /**
* fdt_valid() - Check if an FDT is valid. If not, change it to NULL
*
* @blobp: Pointer to FDT pointer
* @return 1 if OK, 0 if bad (in which case *blobp is set to NULL)
*/
static int fdt_valid(struct fdt_header **blobp)
{ {
int err; const void *blob = *blobp;
int err;
if (working_fdt == NULL) { if (blob == NULL) {
printf ("The address of the fdt is invalid (NULL).\n"); printf ("The address of the fdt is invalid (NULL).\n");
return 0; return 0;
} }
err = fdt_check_header(working_fdt); err = fdt_check_header(blob);
if (err == 0) if (err == 0)
return 1; /* valid */ return 1; /* valid */
@ -611,23 +615,21 @@ static int fdt_valid(void)
* Be more informative on bad version. * Be more informative on bad version.
*/ */
if (err == -FDT_ERR_BADVERSION) { if (err == -FDT_ERR_BADVERSION) {
if (fdt_version(working_fdt) < if (fdt_version(blob) <
FDT_FIRST_SUPPORTED_VERSION) { FDT_FIRST_SUPPORTED_VERSION) {
printf (" - too old, fdt %d < %d", printf (" - too old, fdt %d < %d",
fdt_version(working_fdt), fdt_version(blob),
FDT_FIRST_SUPPORTED_VERSION); FDT_FIRST_SUPPORTED_VERSION);
working_fdt = NULL;
} }
if (fdt_last_comp_version(working_fdt) > if (fdt_last_comp_version(blob) >
FDT_LAST_SUPPORTED_VERSION) { FDT_LAST_SUPPORTED_VERSION) {
printf (" - too new, fdt %d > %d", printf (" - too new, fdt %d > %d",
fdt_version(working_fdt), fdt_version(blob),
FDT_LAST_SUPPORTED_VERSION); FDT_LAST_SUPPORTED_VERSION);
working_fdt = NULL;
} }
return 0;
} }
printf("\n"); printf("\n");
*blobp = NULL;
return 0; return 0;
} }
return 1; return 1;

Loading…
Cancel
Save