[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