Skip to contentSkip to conversation

spl: net: Add FIT image support over network boot

PATCH New Andrew F. Davis 3 participants 5 messages Feb 7, 2017 – Feb 8, 2017

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 spl: net: Add FIT image support over network boot

FIT support in the net boot case is much like the RAM boot case in that we load our image to "load_addr" and pass a dummy read function into "spl_load_simple_fit()". As the load address is no longer hard-coded to the final execution address, RAW image loading will rely on "load_addr" pointing to the execution address as they should have before.

---
 common/spl/spl_net.c | 30 +++++++++++++++++++++++++++---
 1 file changed, 27 insertions(+), 3 deletions(-)
common/spl/spl_net.c +27 -3
index 0fba0172ea..b7a4a89198 100644
@@ -11,19 +11,29 @@
 #include <errno.h>
 #include <spl.h>
 #include <net.h>
+#include <libfdt.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
+static ulong spl_net_load_read(struct spl_load_info *load, ulong sector,
+			       ulong count, void *buf)
+{
+	debug("%s: sector %lx, count %lx, buf %lx\n",
+	      __func__, sector, count, (ulong)buf);
+	memcpy(buf, (void *)(load_addr + sector), count);
+	return count;
+}
+
 #if defined(CONFIG_SPL_ETH_SUPPORT) || defined(CONFIG_SPL_USBETH_SUPPORT)
 static int spl_net_load_image(struct spl_image_info *spl_image,
 			      struct spl_boot_device *bootdev)
 {
+	struct image_header *header = (struct image_header *)load_addr;
 	int rv;
 
 	env_init();
 	env_relocate();
 	setenv("autoload", "yes");
-	load_addr = CONFIG_SYS_TEXT_BASE - sizeof(struct image_header);
 	rv = eth_initialize();
 	if (rv == 0) {
 		printf("No Ethernet devices found\n");
@@ -36,8 +46,22 @@ static int spl_net_load_image(struct spl_image_info *spl_image,
 		printf("Problem booting with BOOTP\n");
 		return rv;
 	}
-	return spl_parse_image_header(spl_image,
-				      (struct image_header *)load_addr);
+
+	if (IS_ENABLED(CONFIG_SPL_LOAD_FIT) &&
+	    image_get_magic(header) == FDT_MAGIC) {
+		struct spl_load_info load;
+
+		debug("Found FIT\n");
+		load.bl_len = 1;
+		load.read = spl_net_load_read;
+		rv = spl_load_simple_fit(spl_image, &load, 0, header);
+	} else {
+		debug("Legacy image\n");
+
+		rv = spl_parse_image_header(spl_image, header);
+	}
+
+	return rv;
 }
 #endif
 
Signature · 1 line
2.11.0
#1 lore raw

PATCH 1/1 spl: net: Add FIT image support over network boot

Quoted 22 lines · Andrew F. Davis

FIT support in the net boot case is much like the RAM boot case in that we load our image to "load_addr" and pass a dummy read function into "spl_load_simple_fit()". As the load address is no longer hard-coded to the final execution address, RAW image loading will rely on "load_addr" pointing to the execution address as they should have before.

---
 common/spl/spl_net.c | 30 +++++++++++++++++++++++++++---
 1 file changed, 27 insertions(+), 3 deletions(-)
common/spl/spl_net.c +1 -0
index 0fba0172ea..b7a4a89198 100644
@@ -11,19 +11,29 @@
 #include <errno.h>
 #include <spl.h>
 #include <net.h>
+#include <libfdt.h>
 
 DECLARE_GLOBAL_DATA_PTR;

common/spl/spl_net.c line 26

Quoted 10 lines
common/spl/spl_net.c +9 -0
 
+static ulong spl_net_load_read(struct spl_load_info *load, ulong sector,
+			       ulong count, void *buf)
+{
+	debug("%s: sector %lx, count %lx, buf %lx\n",
+	      __func__, sector, count, (ulong)buf);
+	memcpy(buf, (void *)(load_addr + sector), count);
+	return count;
+}
+

You may have to move above function within below #if block as spl_net_load_read() is used only by spl_net_load_image().

Quoted 40 lines
common/spl/spl_net.c +17 -3
 #if defined(CONFIG_SPL_ETH_SUPPORT) || defined(CONFIG_SPL_USBETH_SUPPORT)
 static int spl_net_load_image(struct spl_image_info *spl_image,
 			      struct spl_boot_device *bootdev)
 {
+	struct image_header *header = (struct image_header *)load_addr;
 	int rv;
 
 	env_init();
 	env_relocate();
 	setenv("autoload", "yes");
-	load_addr = CONFIG_SYS_TEXT_BASE - sizeof(struct image_header);
 	rv = eth_initialize();
 	if (rv == 0) {
 		printf("No Ethernet devices found\n");
@@ -36,8 +46,22 @@ static int spl_net_load_image(struct spl_image_info *spl_image,
 		printf("Problem booting with BOOTP\n");
 		return rv;
 	}
-	return spl_parse_image_header(spl_image,
-				      (struct image_header *)load_addr);
+
+	if (IS_ENABLED(CONFIG_SPL_LOAD_FIT) &&
+	    image_get_magic(header) == FDT_MAGIC) {
+		struct spl_load_info load;
+
+		debug("Found FIT\n");
+		load.bl_len = 1;
+		load.read = spl_net_load_read;
+		rv = spl_load_simple_fit(spl_image, &load, 0, header);
+	} else {
+		debug("Legacy image\n");
+
+		rv = spl_parse_image_header(spl_image, header);
+	}
+
+	return rv;
 }
 #endif
 
Signature · 2 lines
Regards
Vignesh
#2 lore raw

PATCH 1/1 spl: net: Add FIT image support over network boot

Quoted 26 lines · Vignesh R
Quoted 23 lines · Andrew F. Davis

FIT support in the net boot case is much like the RAM boot case in that we load our image to "load_addr" and pass a dummy read function into "spl_load_simple_fit()". As the load address is no longer hard-coded to the final execution address, RAW image loading will rely on "load_addr" pointing to the execution address as they should have before.

---
 common/spl/spl_net.c | 30 +++++++++++++++++++++++++++---
 1 file changed, 27 insertions(+), 3 deletions(-)
common/spl/spl_net.c +1 -0
index 0fba0172ea..b7a4a89198 100644
@@ -11,19 +11,29 @@
 #include <errno.h>
 #include <spl.h>
 #include <net.h>
+#include <libfdt.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
Quoted 13 lines

common/spl/spl_net.c line 26

Quoted 9 lines
common/spl/spl_net.c +9 -0
+static ulong spl_net_load_read(struct spl_load_info *load, ulong sector,
+			       ulong count, void *buf)
+{
+	debug("%s: sector %lx, count %lx, buf %lx\n",
+	      __func__, sector, count, (ulong)buf);
+	memcpy(buf, (void *)(load_addr + sector), count);
+	return count;
+}
+

You may have to move above function within below #if block as spl_net_load_read() is used only by spl_net_load_image().

Good catch, will move.

Thanks,
Andrew

Quoted 41 lines
Quoted 40 lines
common/spl/spl_net.c +17 -3
 #if defined(CONFIG_SPL_ETH_SUPPORT) || defined(CONFIG_SPL_USBETH_SUPPORT)
 static int spl_net_load_image(struct spl_image_info *spl_image,
 			      struct spl_boot_device *bootdev)
 {
+	struct image_header *header = (struct image_header *)load_addr;
 	int rv;
 
 	env_init();
 	env_relocate();
 	setenv("autoload", "yes");
-	load_addr = CONFIG_SYS_TEXT_BASE - sizeof(struct image_header);
 	rv = eth_initialize();
 	if (rv == 0) {
 		printf("No Ethernet devices found\n");
@@ -36,8 +46,22 @@ static int spl_net_load_image(struct spl_image_info *spl_image,
 		printf("Problem booting with BOOTP\n");
 		return rv;
 	}
-	return spl_parse_image_header(spl_image,
-				      (struct image_header *)load_addr);
+
+	if (IS_ENABLED(CONFIG_SPL_LOAD_FIT) &&
+	    image_get_magic(header) == FDT_MAGIC) {
+		struct spl_load_info load;
+
+		debug("Found FIT\n");
+		load.bl_len = 1;
+		load.read = spl_net_load_read;
+		rv = spl_load_simple_fit(spl_image, &load, 0, header);
+	} else {
+		debug("Legacy image\n");
+
+		rv = spl_parse_image_header(spl_image, header);
+	}
+
+	return rv;
 }
 #endif
 
#3 lore raw

PATCH 1/1 spl: net: Add FIT image support over network boot

In reply to Andrew F. Davis
Quoted 27 lines · Andrew F. Davis

FIT support in the net boot case is much like the RAM boot case in that we load our image to "load_addr" and pass a dummy read function into "spl_load_simple_fit()". As the load address is no longer hard-coded to the final execution address, RAW image loading will rely on "load_addr" pointing to the execution address as they should have before.

---
 common/spl/spl_net.c | 30 +++++++++++++++++++++++++++---
 1 file changed, 27 insertions(+), 3 deletions(-)
common/spl/spl_net.c +5 -0
index 0fba0172ea..b7a4a89198 100644
@@ -11,19 +11,29 @@
 #include <errno.h>
 #include <spl.h>
 #include <net.h>
+#include <libfdt.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
+static ulong spl_net_load_read(struct spl_load_info *load, ulong sector,
+			       ulong count, void *buf)
+{
+	debug("%s: sector %lx, count %lx, buf %lx\n",

common/spl/spl_net.c line 31

Quoted 10 lines
common/spl/spl_net.c +6 -0
+	      __func__, sector, count, (ulong)buf);
+	memcpy(buf, (void *)(load_addr + sector), count);
+	return count;
+}
+
 #if defined(CONFIG_SPL_ETH_SUPPORT) || defined(CONFIG_SPL_USBETH_SUPPORT)
 static int spl_net_load_image(struct spl_image_info *spl_image,
 			      struct spl_boot_device *bootdev)
 {
+	struct image_header *header = (struct image_header *)load_addr;

Just wondering what is the default load_addr or who sets load_addr before doing tftp? have you verified both FIT and not FIT case?

Thanks and regards,
Lokesh

#4 lore raw

PATCH 1/1 spl: net: Add FIT image support over network boot

Quoted 35 lines · Lokesh Vutla
Quoted 32 lines · Andrew F. Davis

FIT support in the net boot case is much like the RAM boot case in that we load our image to "load_addr" and pass a dummy read function into "spl_load_simple_fit()". As the load address is no longer hard-coded to the final execution address, RAW image loading will rely on "load_addr" pointing to the execution address as they should have before.

---
 common/spl/spl_net.c | 30 +++++++++++++++++++++++++++---
 1 file changed, 27 insertions(+), 3 deletions(-)
common/spl/spl_net.c +10 -0
index 0fba0172ea..b7a4a89198 100644
@@ -11,19 +11,29 @@
 #include <errno.h>
 #include <spl.h>
 #include <net.h>
+#include <libfdt.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
+static ulong spl_net_load_read(struct spl_load_info *load, ulong sector,
+			       ulong count, void *buf)
+{
+	debug("%s: sector %lx, count %lx, buf %lx\n",
+	      __func__, sector, count, (ulong)buf);
+	memcpy(buf, (void *)(load_addr + sector), count);
+	return count;
+}
+
Quoted 9 lines

common/spl/spl_net.c line 31

Quoted 5 lines
common/spl/spl_net.c +1 -0
 #if defined(CONFIG_SPL_ETH_SUPPORT) || defined(CONFIG_SPL_USBETH_SUPPORT)
 static int spl_net_load_image(struct spl_image_info *spl_image,
 			      struct spl_boot_device *bootdev)
 {
+	struct image_header *header = (struct image_header *)load_addr;

Just wondering what is the default load_addr or who sets load_addr before doing tftp? have you verified both FIT and not FIT case?

The default is set to CONFIG_SYS_LOAD_ADDR, this is where the other SPL loaders put the image, spl_net was the odd case before this patch.

The Legacy image, like FIT encodes the relocation address, RAW images would have never worked with netboot due to the hard-coded shift to compensate for the legacy image header.

Andrew

Quoted 3 lines

Thanks and regards,
Lokesh