
So far we have two users which want to look at the SPL header. We will get more in the future. Refactor the existing SPL header checks into a common function, to simplify reusing the code. Now that this is easy, add proper version checks to the DT name parsing.
Signed-off-by: Andre Przywara andre.przywara@arm.com --- board/sunxi/board.c | 41 ++++++++++++++++++++++++++++++----------- 1 file changed, 30 insertions(+), 11 deletions(-)
diff --git a/board/sunxi/board.c b/board/sunxi/board.c index a105d0a5ab..0bb7b023ed 100644 --- a/board/sunxi/board.c +++ b/board/sunxi/board.c @@ -253,6 +253,30 @@ int board_init(void) return soft_i2c_board_init(); }
+/* + * On older SoCs the SPL is actually at address zero, so using NULL as + * an error value does not work. + */ +#define INVALID_SPL_HEADER ((void *)~0UL) + +static struct boot_file_head * get_spl_header(uint8_t req_version) +{ + struct boot_file_head *spl = (void *)(ulong)SPL_ADDR; + uint8_t spl_header_version = spl->spl_signature[3]; + + /* Is there really the SPL header (still) there? */ + if (memcmp(spl->spl_signature, SPL_SIGNATURE, 3) != 0) + return INVALID_SPL_HEADER; + + if (spl_header_version < req_version) { + printf("sunxi SPL version mismatch: expected %u, got %u\n", + req_version, spl_header_version); + return INVALID_SPL_HEADER; + } + + return spl; +} + int dram_init(void) { gd->ram_size = get_ram_size((long *)PHYS_SDRAM_0, PHYS_SDRAM_0_SIZE); @@ -626,16 +650,11 @@ void get_board_serial(struct tag_serialnr *serialnr) */ static void parse_spl_header(const uint32_t spl_addr) { - struct boot_file_head *spl = (void *)(ulong)spl_addr; - if (memcmp(spl->spl_signature, SPL_SIGNATURE, 3) != 0) - return; /* signature mismatch, no usable header */ + struct boot_file_head *spl = get_spl_header(SPL_ENV_HEADER_VERSION);
- uint8_t spl_header_version = spl->spl_signature[3]; - if (spl_header_version < SPL_ENV_HEADER_VERSION) { - printf("sunxi SPL version mismatch: expected %u, got %u\n", - SPL_ENV_HEADER_VERSION, spl_header_version); + if (spl == INVALID_SPL_HEADER) return; - } + if (!spl->fel_script_address) return;
@@ -777,11 +796,11 @@ int ft_board_setup(void *blob, bd_t *bd) #ifdef CONFIG_SPL_LOAD_FIT int board_fit_config_name_match(const char *name) { - struct boot_file_head *spl = (void *)(ulong)SPL_ADDR; - const char *cmp_str = (void *)(ulong)SPL_ADDR; + struct boot_file_head *spl = get_spl_header(SPL_DT_HEADER_VERSION); + const char *cmp_str = (const char *)spl;
/* Check if there is a DT name stored in the SPL header and use that. */ - if (spl->dt_name_offset) { + if (spl != INVALID_SPL_HEADER && spl->dt_name_offset) { cmp_str += spl->dt_name_offset; } else { #ifdef CONFIG_DEFAULT_DEVICE_TREE