]> Git Repo - J-u-boot.git/blobdiff - boot/pxe_utils.c
distro/pxeboot: Handle prompt variable
[J-u-boot.git] / boot / pxe_utils.c
index b08aee9896bc27a18831371b6150fe85fee14de4..272431381763f7bc19ed71e7e8f5d94486ba78ed 100644 (file)
@@ -12,7 +12,6 @@
 #include <log.h>
 #include <malloc.h>
 #include <mapmem.h>
-#include <lcd.h>
 #include <net.h>
 #include <fdt_support.h>
 #include <video.h>
@@ -259,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);
@@ -380,6 +380,7 @@ err:
 
 /**
  * label_boot_fdtoverlay() - Loads fdt overlays specified in 'fdtoverlays'
+ * or 'devicetree-overlay'
  *
  * @ctx: PXE context
  * @label: Label to process
@@ -521,29 +522,44 @@ static int label_boot(struct pxe_context *ctx, struct pxe_label *label)
                return 1;
        }
 
-       if (label->initrd) {
-               ulong size;
+       if (get_relfile_envaddr(ctx, label->kernel, "kernel_addr_r",
+                               NULL) < 0) {
+               printf("Skipping %s for failure retrieving kernel\n",
+                      label->name);
+               return 1;
+       }
+
+       kernel_addr = env_get("kernel_addr_r");
+       /* for FIT, append the configuration identifier */
+       if (label->config) {
+               int len = strlen(kernel_addr) + strlen(label->config) + 1;
+
+               fit_addr = malloc(len);
+               if (!fit_addr) {
+                       printf("malloc fail (FIT address)\n");
+                       return 1;
+               }
+               snprintf(fit_addr, len, "%s%s", kernel_addr, label->config);
+               kernel_addr = fit_addr;
+       }
 
+       /* 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",
                               label->name);
-                       return 1;
+                       goto cleanup;
                }
 
                initrd_addr_str = env_get("ramdisk_addr_r");
-               strcpy(initrd_filesize, simple_xtoa(size));
-
-               strncpy(initrd_str, initrd_addr_str, 18);
-               strcat(initrd_str, ":");
-               strncat(initrd_str, initrd_filesize, 9);
-       }
-
-       if (get_relfile_envaddr(ctx, label->kernel, "kernel_addr_r",
-                               NULL) < 0) {
-               printf("Skipping %s for failure retrieving kernel\n",
-                      label->name);
-               return 1;
+               size = snprintf(initrd_str, sizeof(initrd_str), "%s:%lx",
+                               initrd_addr_str, size);
+               if (size >= sizeof(initrd_str))
+                       goto cleanup;
        }
 
        if (label->ipappend & 0x1) {
@@ -573,7 +589,7 @@ static int label_boot(struct pxe_context *ctx, struct pxe_label *label)
                               strlen(label->append ?: ""),
                               strlen(ip_str), strlen(mac_str),
                               sizeof(bootargs));
-                       return 1;
+                       goto cleanup;
                }
 
                if (label->append)
@@ -588,21 +604,6 @@ static int label_boot(struct pxe_context *ctx, struct pxe_label *label)
                printf("append: %s\n", finalbootargs);
        }
 
-       kernel_addr = env_get("kernel_addr_r");
-
-       /* for FIT, append the configuration identifier */
-       if (label->config) {
-               int len = strlen(kernel_addr) + strlen(label->config) + 1;
-
-               fit_addr = malloc(len);
-               if (!fit_addr) {
-                       printf("malloc fail (FIT address)\n");
-                       return 1;
-               }
-               snprintf(fit_addr, len, "%s%s", kernel_addr, label->config);
-               kernel_addr = fit_addr;
-       }
-
        /*
         * fdt usage is optional:
         * It handles the following scenarios.
@@ -624,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;
 
@@ -737,7 +741,8 @@ static int label_boot(struct pxe_context *ctx, struct pxe_label *label)
        kernel_addr_r = genimg_get_kernel_addr(kernel_addr);
        buf = map_sysmem(kernel_addr_r, 0);
        /* Try bootm for legacy and FIT format image */
-       if (genimg_get_format(buf) != IMAGE_FORMAT_INVALID)
+       if (genimg_get_format(buf) != IMAGE_FORMAT_INVALID &&
+            IS_ENABLED(CONFIG_CMD_BOOTM))
                do_bootm(ctx->cmdtp, 0, bootm_argc, bootm_argv);
        /* Try booting an AArch64 Linux kernel image */
        else if (IS_ENABLED(CONFIG_CMD_BOOTI))
@@ -809,6 +814,7 @@ static const struct token keywords[] = {
        {"devicetreedir", T_FDTDIR},
        {"fdtdir", T_FDTDIR},
        {"fdtoverlays", T_FDTOVERLAYS},
+       {"devicetree-overlay", T_FDTOVERLAYS},
        {"ontimeout", T_ONTIMEOUT,},
        {"ipappend", T_IPAPPEND,},
        {"background", T_BACKGROUND,},
@@ -1164,15 +1170,19 @@ 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;
 
-       label->config = malloc(strlen(s) + 1);
+       label->config = strdup(s);
        if (!label->config)
                return -ENOMEM;
 
-       strcpy(label->config, s);
        *s = 0;
 
        return 1;
@@ -1358,7 +1368,10 @@ static int parse_pxefile_top(struct pxe_context *ctx, char *p, unsigned long bas
                        break;
 
                case T_PROMPT:
-                       eol_or_eof(&p);
+                       err = parse_integer(&p, &cfg->prompt);
+                       // Do not fail if prompt configuration is undefined
+                       if (err <  0)
+                               eol_or_eof(&p);
                        break;
 
                case T_EOL:
@@ -1517,7 +1530,7 @@ void handle_pxe_menu(struct pxe_context *ctx, struct pxe_menu *cfg)
                /* display BMP if available */
                if (cfg->bmp) {
                        if (get_relfile(ctx, cfg->bmp, image_load_addr, NULL)) {
-#if defined(CONFIG_DM_VIDEO)
+#if defined(CONFIG_VIDEO)
                                struct udevice *dev;
 
                                err = uclass_first_device_err(UCLASS_VIDEO, &dev);
This page took 0.031971 seconds and 4 git commands to generate.