mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-10 15:14:43 +00:00
cmd: pxe: add support for FIT config selection
Add a way in configuration files (exlinux.conf for sysboot command) to select a specific FIT configuration. The configuration is selected with a string added after the FIT filename in the label "KERNEL" or "LINUX", using the same format than bootm command: KERNEL [Filename]#<conf>[#<extra-conf[#...]] This configuration string, beginning by '#', is directly appended to bootm argument 1 after <kernel_addr_r>. bootm [<kernel_addr_r>]#<conf>[#<extra-conf[#...]] see doc/uImage.FIT/command_syntax_extensions.txt for details Example : KERNEL /fit.itb#cfg1 KERNEL /fit.itb#cfg2 Configuration can be use also for overlay management : KERNEL /fit.itb#cfg1#dtbo1#dtbo3 see doc/uImage.FIT/overlay-fdt-boot.txt for details Signed-off-by: Patrick Delaunay <patrick.delaunay@st.com>
This commit is contained in:
parent
c45414b542
commit
2023000aed
2 changed files with 58 additions and 3 deletions
54
cmd/pxe.c
54
cmd/pxe.c
|
@ -471,6 +471,7 @@ struct pxe_label {
|
|||
char *name;
|
||||
char *menu;
|
||||
char *kernel;
|
||||
char *config;
|
||||
char *append;
|
||||
char *initrd;
|
||||
char *fdt;
|
||||
|
@ -538,6 +539,9 @@ static void label_destroy(struct pxe_label *label)
|
|||
if (label->kernel)
|
||||
free(label->kernel);
|
||||
|
||||
if (label->config)
|
||||
free(label->config);
|
||||
|
||||
if (label->append)
|
||||
free(label->append);
|
||||
|
||||
|
@ -618,6 +622,7 @@ static int label_boot(cmd_tbl_t *cmdtp, struct pxe_label *label)
|
|||
char initrd_str[28];
|
||||
char mac_str[29] = "";
|
||||
char ip_str[68] = "";
|
||||
char *fit_addr = NULL;
|
||||
int bootm_argc = 2;
|
||||
int len = 0;
|
||||
ulong kernel_addr;
|
||||
|
@ -699,6 +704,18 @@ static int label_boot(cmd_tbl_t *cmdtp, struct pxe_label *label)
|
|||
}
|
||||
|
||||
bootm_argv[1] = env_get("kernel_addr_r");
|
||||
/* for FIT, append the configuration identifier */
|
||||
if (label->config) {
|
||||
int len = strlen(bootm_argv[1]) + 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", bootm_argv[1], label->config);
|
||||
bootm_argv[1] = fit_addr;
|
||||
}
|
||||
|
||||
/*
|
||||
* fdt usage is optional:
|
||||
|
@ -758,7 +775,7 @@ static int label_boot(cmd_tbl_t *cmdtp, struct pxe_label *label)
|
|||
fdtfilefree = malloc(len);
|
||||
if (!fdtfilefree) {
|
||||
printf("malloc fail (FDT filename)\n");
|
||||
return 1;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
snprintf(fdtfilefree, len, "%s%s%s%s%s%s",
|
||||
|
@ -772,7 +789,7 @@ static int label_boot(cmd_tbl_t *cmdtp, struct pxe_label *label)
|
|||
if (err < 0) {
|
||||
printf("Skipping %s for failure retrieving fdt\n",
|
||||
label->name);
|
||||
return 1;
|
||||
goto cleanup;
|
||||
}
|
||||
} else {
|
||||
bootm_argv[3] = NULL;
|
||||
|
@ -803,6 +820,10 @@ static int label_boot(cmd_tbl_t *cmdtp, struct pxe_label *label)
|
|||
do_bootz(cmdtp, 0, bootm_argc, bootm_argv);
|
||||
#endif
|
||||
unmap_sysmem(buf);
|
||||
|
||||
cleanup:
|
||||
if (fit_addr)
|
||||
free(fit_addr);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -1187,6 +1208,33 @@ static int parse_label_menu(char **c, struct pxe_menu *cfg,
|
|||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Handles parsing a 'kernel' label.
|
||||
* expecting "filename" or "<fit_filename>#cfg"
|
||||
*/
|
||||
static int parse_label_kernel(char **c, struct pxe_label *label)
|
||||
{
|
||||
char *s;
|
||||
int err;
|
||||
|
||||
err = parse_sliteral(c, &label->kernel);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
s = strstr(label->kernel, "#");
|
||||
if (!s)
|
||||
return 1;
|
||||
|
||||
label->config = malloc(strlen(s) + 1);
|
||||
if (!label->config)
|
||||
return -ENOMEM;
|
||||
|
||||
strcpy(label->config, s);
|
||||
*s = 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Parses a label and adds it to the list of labels for a menu.
|
||||
*
|
||||
|
@ -1228,7 +1276,7 @@ static int parse_label(char **c, struct pxe_menu *cfg)
|
|||
|
||||
case T_KERNEL:
|
||||
case T_LINUX:
|
||||
err = parse_sliteral(c, &label->kernel);
|
||||
err = parse_label_kernel(c, label);
|
||||
break;
|
||||
|
||||
case T_APPEND:
|
||||
|
|
|
@ -140,6 +140,13 @@ kernel <path> - if this label is chosen, use tftp to retrieve the kernel
|
|||
(or FIT image) at <path>. it will be stored at the address
|
||||
indicated in the kernel_addr_r environment variable, and
|
||||
that address will be passed to bootm to boot this kernel.
|
||||
For FIT image, The configuration specification can be
|
||||
appended to the file name, with the format:
|
||||
<path>#<conf>[#<extra-conf[#...]]
|
||||
It will passed to bootm with that address.
|
||||
(see: doc/uImage.FIT/command_syntax_extensions.txt)
|
||||
It useful for overlay selection in pxe file
|
||||
(see: doc/uImage.FIT/overlay-fdt-boot.txt)
|
||||
|
||||
append <string> - use <string> as the kernel command line when booting this
|
||||
label.
|
||||
|
|
Loading…
Reference in a new issue