spl: net: Add FIT image support over network boot
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
@@ -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
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.Signed-off-by Andrew F. Davis <[email protected]>--- common/spl/spl_net.c | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-)common/spl/spl_net.c +1
-0@@ -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
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.Signed-off-by Andrew F. Davis <[email protected]>--- common/spl/spl_net.c | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-)common/spl/spl_net.c +1
-0@@ -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 byspl_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
PATCH 1/1 spl: net: Add FIT image support over network boot
In reply to Andrew F. DavisQuoted 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.Signed-off-by Andrew F. Davis <[email protected]>--- common/spl/spl_net.c | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-)common/spl/spl_net.c +5
-0@@ -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
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.Signed-off-by Andrew F. Davis <[email protected]>--- common/spl/spl_net.c | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-)common/spl/spl_net.c +10
-0@@ -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_addror who setsload_addrbefore 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