spl: net: Add FIT image support over network boot
PATCH v2 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.
---
changes from v1:
- move "spl_net_load_read" into #ifdef block as suggested by Vignesh
common/spl/spl_net.c | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-)
common/spl/spl_net.c +27 -3
@@ -11,19 +11,29 @@#include <errno.h> #include <spl.h> #include <net.h> +#include <libfdt.h> DECLARE_GLOBAL_DATA_PTR ;#if defined(CONFIG_SPL_ETH_SUPPORT ) || defined(CONFIG_SPL_USBETH_SUPPORT ) +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; +} +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
PATCH v2 1/1 spl: net: Add FIT image support over network boot
Hi,
Quoted 6 lines · Andrew
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.
[...]
Quoted 10 lines
#if
defined(CONFIG_SPL_ETH_SUPPORT)||defined(CONFIG_SPL_USBETH_SUPPORT)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; +} +
common/spl/spl_net.c line 26
Quoted 10 lines
common/spl/spl_net.c +1
-1static 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 );
This breaks when FIT image is not used (For example, breaks am335x_evm_usbspl_defconfig)
Below snippet helps non FIT case:
+ if (!IS_ENABLED(CONFIG_SPL_LOAD_FIT))
+ load_addr = CONFIG_SYS_TEXT_BASE - sizeof(structimage_header);
+
Quoted 29 lines
common/spl/spl_net.c +16
-2rv =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
PATCH v2 1/1 spl: net: Add FIT image support over network boot
Quoted 40 lines · Vignesh R
Hi,
Quoted 6 lines · Andrew
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.[...]
Quoted 10 lines
#if
defined(CONFIG_SPL_ETH_SUPPORT)||defined(CONFIG_SPL_USBETH_SUPPORT)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; +} +common/spl/spl_net.c line 26
Quoted 10 lines
common/spl/spl_net.c +1
-1static 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 );This breaks when FIT image is not used (For example, breaks
am335x_evm_usbspl_defconfig)Below snippet helps non FIT case:
(quoted diff) +2
-0+ if (!IS_ENABLED(CONFIG_SPL_LOAD_FIT)) + load_addr = CONFIG_SYS_TEXT_BASE - sizeof(struct
Quoted 3 lines
image_header);
+
This isn't right, it may happen that the image is not a FIT image but support for FIT loading is till enabled. This will break that case.
It doesn't seem there is a good standard for where to load the image header before we know what type of image it is.
Andrew
Quoted 32 lines
Quoted 31 lines
common/spl/spl_net.c +16
-2rv =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