Patchwork [U-Boot,RFC] PXE: FDT: Add support for fdt in PXE

login
register
mail settings
Submitter Chander Kashyap
Date Sept. 5, 2012, 8:55 a.m.
Message ID <1346835301-15021-1-git-send-email-chander.kashyap@linaro.org>
Download mbox | patch
Permalink /patch/181777/
State Changes Requested
Headers show

Comments

Chander Kashyap - Sept. 5, 2012, 8:55 a.m.
Now DT support is becomming 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 lable i.e. fdt. If fdt_addr is specified
then load fdt blob from the remote server to fdt_address.

Signed-off-by: Chander Kashyap <chander.kashyap@linaro.org>
---
 common/cmd_pxe.c |   29 +++++++++++++++++++++++++++++
 1 file changed, 29 insertions(+)

Patch

diff --git a/common/cmd_pxe.c b/common/cmd_pxe.c
index 6b31dea..11cde21 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);
 }
 
 /*
@@ -633,6 +640,21 @@  static void label_boot(struct pxe_label *label)
 	 */
 	bootm_argv[3] = getenv("fdt_addr");
 
+	/* if fdt label is defined then get fdt from server */
+	if (bootm_argv[3] && label->fdt) {
+		if (get_relfile_envaddr(label->fdt, "fdt_addr") < 0) {
+			printf("Skipping %s for failure retrieving fdt\n",
+					label->name);
+			return;
+		}
+	}
+
+	/*
+	 * fdt usage is optional.  If there is an fdt_addr specified, we will
+	 * pass it along to bootm, and adjust argc appropriately.
+	 */
+	bootm_argv[3] = getenv("fdt_addr");
+
 	if (bootm_argv[3])
 		bootm_argc = 4;
 
@@ -658,6 +680,7 @@  enum token_type {
 	T_DEFAULT,
 	T_PROMPT,
 	T_INCLUDE,
+	T_FDT,
 	T_INVALID
 };
 
@@ -685,6 +708,7 @@  static const struct token keywords[] = {
 	{"append", T_APPEND},
 	{"initrd", T_INITRD},
 	{"include", T_INCLUDE},
+	{"fdt", T_FDT},
 	{NULL, T_INVALID}
 };
 
@@ -1074,6 +1098,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;