diff mbox

[v4] PXE: FDT: Add support for fdt in PXE

Message ID 1346996191-14555-1-git-send-email-chander.kashyap@linaro.org
State Accepted
Commit a655938a93410a468f8e2288edc20d20a272a6d4
Headers show

Commit Message

Chander Kashyap Sept. 7, 2012, 5:36 a.m. UTC
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@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(-)

Comments

Jason Hobbs Sept. 7, 2012, 7:04 p.m. UTC | #1
Chander,

Looks good now.

Acked-by: Jason Hobbs <jason.hobbs@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@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
>
Tom Rini Sept. 12, 2012, 4:27 p.m. UTC | #2
On Fri, Sep 07, 2012 at 11:06:31AM +0530, 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@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(-)

Looks good to me, Joe can you please pick this up if you're good with
it?  Thanks!
Chander Kashyap Sept. 25, 2012, 4:22 a.m. UTC | #3
On 12 September 2012 21:57, Tom Rini <trini@ti.com> wrote:
> On Fri, Sep 07, 2012 at 11:06:31AM +0530, 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@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(-)
>
> Looks good to me, Joe can you please pick this up if you're good with
> it?  Thanks!
>
> --
> Tom

Any feedback on this?
Joe Hershberger Sept. 28, 2012, 4:10 p.m. UTC | #4
Hi Chander,

On Fri, Sep 7, 2012 at 12:36 AM, Chander Kashyap
<chander.kashyap@linaro.org> 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@linaro.org>
> ---

Applied, thanks.

-Joe
diff mbox

Patch

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.