diff --git a/boot/pxe_utils.c b/boot/pxe_utils.c index fc453bd539..b59e959f71 100644 --- a/boot/pxe_utils.c +++ b/boot/pxe_utils.c @@ -258,6 +258,7 @@ static struct pxe_label *label_create(void) static void label_destroy(struct pxe_label *label) { free(label->name); + free(label->kernel_label); free(label->kernel); free(label->config); free(label->append); @@ -542,9 +543,11 @@ static int label_boot(struct pxe_context *ctx, struct pxe_label *label) kernel_addr = fit_addr; } - if (label->initrd) { + /* For FIT, the label can be identical to kernel one */ + if (label->initrd && !strcmp(label->kernel_label, label->initrd)) { + initrd_addr_str = kernel_addr; + } else if (label->initrd) { ulong size; - if (get_relfile_envaddr(ctx, label->initrd, "ramdisk_addr_r", &size) < 0) { printf("Skipping %s for failure retrieving initrd\n", @@ -622,8 +625,11 @@ static int label_boot(struct pxe_context *ctx, struct pxe_label *label) */ bootm_argv[3] = env_get("fdt_addr_r"); + /* For FIT, the label can be identical to kernel one */ + if (label->fdt && !strcmp(label->kernel_label, label->fdt)) { + bootm_argv[3] = kernel_addr; /* if fdt label is defined then get fdt from server */ - if (bootm_argv[3]) { + } else if (bootm_argv[3]) { char *fdtfile = NULL; char *fdtfilefree = NULL; @@ -1164,6 +1170,11 @@ static int parse_label_kernel(char **c, struct pxe_label *label) if (err < 0) return err; + /* copy the kernel label to compare with FDT / INITRD when FIT is used */ + label->kernel_label = strdup(label->kernel); + if (!label->kernel_label) + return -ENOMEM; + s = strstr(label->kernel, "#"); if (!s) return 1; diff --git a/doc/README.pxe b/doc/README.pxe index d14d2bdcc9..172201093d 100644 --- a/doc/README.pxe +++ b/doc/README.pxe @@ -179,11 +179,19 @@ initrd - if this label is chosen, use tftp to retrieve the initrd at . it will be stored at the address indicated in the initrd_addr_r environment variable, and that address will be passed to bootm. + For FIT image, the initrd can be provided with the same value than + kernel, including configuration: + #[# - if this label is chosen, use tftp to retrieve the fdt blob at . it will be stored at the address indicated in the fdt_addr_r environment variable, and that address will be passed to bootm. + For FIT image, the device tree can be provided with the same value + than kernel, including configuration: + #[# - if this label is chosen, use tftp to retrieve the fdt blob at . it will be stored at the address indicated in diff --git a/include/pxe_utils.h b/include/pxe_utils.h index 4a73b2aace..1e5e8424f5 100644 --- a/include/pxe_utils.h +++ b/include/pxe_utils.h @@ -28,6 +28,7 @@ * Create these with the 'label_create' function given below. * * name - the name of the menu as given on the 'menu label' line. + * kernel_label - the kernel label, including FIT config if present. * kernel - the path to the kernel file to use for this label. * append - kernel command line to use when booting this label * initrd - path to the initrd to use for this label. @@ -40,6 +41,7 @@ struct pxe_label { char num[4]; char *name; char *menu; + char *kernel_label; char *kernel; char *config; char *append;