[U-Boot] [PATCH v4] PXE: FDT: Add support for fdt in PXE
Jason Hobbs
jason.hobbs at calxeda.com
Fri Sep 7 21:04:03 CEST 2012
Chander,
Looks good now.
Acked-by: Jason Hobbs <jason.hobbs at calxeda.com>
Thanks,
Jason
On Fri, Sep 07, 2012 at 01:36:31AM -0400, Chander Kashyap wrote:
> Now DT support is becoming common for all new SoC's. Hence it is better
> to have option for getting specific FDT from the remote server.
>
> This patch adds support for new label i.e. 'fdt'. This will allow to
> retrieve 'fdt blob' from the remote server. This patch take care for
> the following scenarios.
>
> The usage of fdt is optional.
> The 'fdt blob' can be retrieved from tftp or can be available locally
> or can be absent.
>
> If 'fdt_addr_r' environment variable is set and 'fdt' label is defined
> retrieve 'fdt blob' from tftp. 'fdt_addr_r' is then passed along bootm
> command.
>
> If 'fdt_addr' is set and 'fdt blob' is not retrieved from the tftp pass
> 'fdt_addr' to bootm command. In this case 'fdt blob' will be available
> at 'fdt_addr'.
>
> If 'fdt_addr' is not set and 'fdt blob' is not retrieve from tftp pass
> NULL to boot command. In this case 'fdt blob' is not required and absent.
>
> Signed-off-by: Chander Kashyap <chander.kashyap at linaro.org>
> ---
> Changes in v2:
> - Removed the duplicate code.
> changes in v3:
> - Added documentation for "fdt" lable in doc/README.pxe
> changes in v4:
> - Added New environment variable 'fdt_addr_r' for 'fdt blob'
> - Add more descriptive documentation for the 'fdt' retrieval.
>
> common/cmd_pxe.c | 39 ++++++++++++++++++++++++++++++++++++---
> doc/README.pxe | 14 ++++++++++++--
> 2 files changed, 48 insertions(+), 5 deletions(-)
>
> diff --git a/common/cmd_pxe.c b/common/cmd_pxe.c
> index 6b31dea..ee75db9 100644
> --- a/common/cmd_pxe.c
> +++ b/common/cmd_pxe.c
> @@ -450,6 +450,7 @@ struct pxe_label {
> char *kernel;
> char *append;
> char *initrd;
> + char *fdt;
> int attempted;
> int localboot;
> struct list_head list;
> @@ -517,6 +518,9 @@ static void label_destroy(struct pxe_label *label)
> if (label->initrd)
> free(label->initrd);
>
> + if (label->fdt)
> + free(label->fdt);
> +
> free(label);
> }
>
> @@ -541,6 +545,9 @@ static void label_print(void *data)
>
> if (label->initrd)
> printf("\t\tinitrd: %s\n", label->initrd);
> +
> + if (label->fdt)
> + printf("\tfdt: %s\n", label->fdt);
> }
>
> /*
> @@ -628,10 +635,29 @@ static void label_boot(struct pxe_label *label)
> bootm_argv[1] = getenv("kernel_addr_r");
>
> /*
> - * fdt usage is optional. If there is an fdt_addr specified, we will
> - * pass it along to bootm, and adjust argc appropriately.
> + * fdt usage is optional:
> + * It handles the following scenarios. All scenarios are exclusive
> + *
> + * Scenario 1: If fdt_addr_r specified and "fdt" label is defined in
> + * pxe file, retrieve fdt blob from server. Pass fdt_addr_r to bootm,
> + * and adjust argc appropriately.
> + *
> + * Scenario 2: If there is an fdt_addr specified, pass it along to
> + * bootm, and adjust argc appropriately.
> + *
> + * Scenario 3: fdt blob is not available.
> */
> - bootm_argv[3] = getenv("fdt_addr");
> + bootm_argv[3] = getenv("fdt_addr_r");
> +
> + /* if fdt label is defined then get fdt from server */
> + if (bootm_argv[3] && label->fdt) {
> + if (get_relfile_envaddr(label->fdt, "fdt_addr_r") < 0) {
> + printf("Skipping %s for failure retrieving fdt\n",
> + label->name);
> + return;
> + }
> + } else
> + bootm_argv[3] = getenv("fdt_addr");
>
> if (bootm_argv[3])
> bootm_argc = 4;
> @@ -658,6 +684,7 @@ enum token_type {
> T_DEFAULT,
> T_PROMPT,
> T_INCLUDE,
> + T_FDT,
> T_INVALID
> };
>
> @@ -685,6 +712,7 @@ static const struct token keywords[] = {
> {"append", T_APPEND},
> {"initrd", T_INITRD},
> {"include", T_INCLUDE},
> + {"fdt", T_FDT},
> {NULL, T_INVALID}
> };
>
> @@ -1074,6 +1102,11 @@ static int parse_label(char **c, struct pxe_menu *cfg)
> err = parse_sliteral(c, &label->initrd);
> break;
>
> + case T_FDT:
> + if (!label->fdt)
> + err = parse_sliteral(c, &label->fdt);
> + break;
> +
> case T_LOCALBOOT:
> err = parse_integer(c, &label->localboot);
> break;
> diff --git a/doc/README.pxe b/doc/README.pxe
> index 2bbf53d..f00f280 100644
> --- a/doc/README.pxe
> +++ b/doc/README.pxe
> @@ -93,8 +93,13 @@ pxe boot
> be passed to the bootm command to boot the kernel. These environment
> variables are required to be set.
>
> - fdt_addr - the location of a fdt blob. If this is set, it will be passed
> - to bootm when booting a kernel.
> + fdt_addr_r - location in RAM at which 'pxe boot' will store the fdt blob it
> + retrieves from tftp. The retrieval is possible if 'fdt' label is defined in
> + pxe file and 'fdt_addr_r' is set. If retrieval is possible, 'fdt_addr_r'
> + will be passed to bootm command to boot the kernel.
> +
> + fdt_addr - the location of a fdt blob. 'fdt_addr' will be passed to bootm
> + command if it is set and 'fdt_addr_r' is not passed to bootm command.
>
> pxe file format
> ===============
> @@ -156,6 +161,11 @@ initrd <path> - if this label is chosen, use tftp to retrieve the initrd
> the initrd_addr_r environment variable, and that address
> will be 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.
> +
> localboot <flag> - Run the command defined by "localcmd" in the environment.
> <flag> is ignored and is only here to match the syntax of
> PXELINUX config files.
> --
> 1.7.9.5
>
More information about the U-Boot
mailing list