summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--boot/pxe_utils.c17
-rw-r--r--doc/README.pxe8
-rw-r--r--include/pxe_utils.h2
3 files changed, 24 insertions, 3 deletions
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 <path> - if this label is chosen, use tftp to retrieve the initrd
at <path>. 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:
+ <path>#<conf>[#<extra-conf[#...]]
+ In this case, kernel_addr_r is passed to bootm.
fdt <path> - if this label is chosen, use tftp to retrieve the fdt blob
at <path>. 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:
+ <path>#<conf>[#<extra-conf[#...]]
+ In this case, kernel_addr_r is passed to bootm.
devicetree <path> - if this label is chosen, use tftp to retrieve the fdt blob
at <path>. 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;