summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Glass <sjg@chromium.org>2016-09-24 18:20:17 -0600
committerTom Rini <trini@konsulko.com>2016-10-06 15:08:55 -0400
commitd32b2d1c6168a6669ce6e6300eb893ddec675a05 (patch)
treeabe001995756d541574b9a52e6baa38ce83a1e2b
parentf4d7d8596f3a4f5bce500c622b75d2e9c8d6f989 (diff)
spl: Make spl_boot_list a local variable
There is no need for this to be in the BSS region. By moving it we can delay use of BSS in SPL. This is useful for machines where the BSS region is not in writeable space. On 64-bit x86, SPL runs from SPI flash and it is easier to eliminate BSS use than link SPL to run with BSS at a particular cache-as-RAM (CAR) address. Signed-off-by: Simon Glass <sjg@chromium.org> Reviewed-by: Tom Rini <trini@konsulko.com>
-rw-r--r--common/spl/spl.c24
-rw-r--r--include/spl.h2
2 files changed, 12 insertions, 14 deletions
diff --git a/common/spl/spl.c b/common/spl/spl.c
index 3dafa508f7..bdb165ac28 100644
--- a/common/spl/spl.c
+++ b/common/spl/spl.c
@@ -29,7 +29,6 @@ DECLARE_GLOBAL_DATA_PTR;
#endif
u32 *boot_params_ptr = NULL;
-struct spl_image_info spl_image;
/* Define board data structure */
static bd_t bdata __attribute__ ((section(".data")));
@@ -263,14 +262,6 @@ int spl_init(void)
#define BOOT_DEVICE_NONE 0xdeadbeef
#endif
-static u32 spl_boot_list[] = {
- BOOT_DEVICE_NONE,
- BOOT_DEVICE_NONE,
- BOOT_DEVICE_NONE,
- BOOT_DEVICE_NONE,
- BOOT_DEVICE_NONE,
-};
-
__weak void board_boot_order(u32 *spl_boot_list)
{
spl_boot_list[0] = spl_boot_device();
@@ -374,7 +365,7 @@ static struct spl_image_loader *spl_ll_find_loader(uint boot_device)
return NULL;
}
-static int spl_load_image(u32 boot_device)
+static int spl_load_image(struct spl_image_info *spl_image, u32 boot_device)
{
struct spl_boot_device bootdev;
struct spl_image_loader *loader = spl_ll_find_loader(boot_device);
@@ -382,7 +373,7 @@ static int spl_load_image(u32 boot_device)
bootdev.boot_device = boot_device;
bootdev.boot_device_name = NULL;
if (loader)
- return loader->load_image(&spl_image, &bootdev);
+ return loader->load_image(spl_image, &bootdev);
#if defined(CONFIG_SPL_SERIAL_SUPPORT) && defined(CONFIG_SPL_LIBCOMMON_SUPPORT)
puts("SPL: Unsupported Boot Device!\n");
@@ -392,6 +383,14 @@ static int spl_load_image(u32 boot_device)
void board_init_r(gd_t *dummy1, ulong dummy2)
{
+ u32 spl_boot_list[] = {
+ BOOT_DEVICE_NONE,
+ BOOT_DEVICE_NONE,
+ BOOT_DEVICE_NONE,
+ BOOT_DEVICE_NONE,
+ BOOT_DEVICE_NONE,
+ };
+ struct spl_image_info spl_image;
int i;
debug(">>spl:board_init_r()\n");
@@ -417,11 +416,12 @@ void board_init_r(gd_t *dummy1, ulong dummy2)
spl_board_init();
#endif
+ memset(&spl_image, '\0', sizeof(spl_image));
board_boot_order(spl_boot_list);
for (i = 0; i < ARRAY_SIZE(spl_boot_list) &&
spl_boot_list[i] != BOOT_DEVICE_NONE; i++) {
announce_boot_device(spl_boot_list[i]);
- if (!spl_load_image(spl_boot_list[i]))
+ if (!spl_load_image(&spl_image, spl_boot_list[i]))
break;
}
diff --git a/include/spl.h b/include/spl.h
index 0b97cda7fc..e080a82b97 100644
--- a/include/spl.h
+++ b/include/spl.h
@@ -63,8 +63,6 @@ int spl_load_simple_fit(struct spl_image_info *spl_image,
#define SPL_COPY_PAYLOAD_ONLY 1
-extern struct spl_image_info spl_image;
-
/* SPL common functions */
void preloader_console_init(void);
u32 spl_boot_device(void);