diff options
-rw-r--r-- | arch/arm/include/asm/arch-sunxi/spl.h | 3 | ||||
-rw-r--r-- | board/sunxi/board.c | 28 |
2 files changed, 29 insertions, 2 deletions
diff --git a/arch/arm/include/asm/arch-sunxi/spl.h b/arch/arm/include/asm/arch-sunxi/spl.h index 014184b638..4baba38b00 100644 --- a/arch/arm/include/asm/arch-sunxi/spl.h +++ b/arch/arm/include/asm/arch-sunxi/spl.h @@ -19,6 +19,7 @@ #define SPL_ENV_HEADER_VERSION SPL_VERSION(0, 1) #define SPL_DT_HEADER_VERSION SPL_VERSION(0, 2) +#define SPL_DRAM_HEADER_VERSION SPL_VERSION(0, 3) #define SPL_ADDR CONFIG_SUNXI_SRAM_ADDRESS @@ -70,7 +71,7 @@ struct boot_file_head { * to the users. */ uint32_t dt_name_offset; /* since v0.2, set by mksunxiboot */ - uint32_t reserved1; + uint32_t dram_size; /* in MiB, since v0.3, set by SPL */ uint32_t boot_media; /* written here by the boot ROM */ /* A padding area (may be used for storing text strings) */ uint32_t string_pool[13]; /* since v0.2, filled by mksunxiboot */ diff --git a/board/sunxi/board.c b/board/sunxi/board.c index b117de4555..b196d48674 100644 --- a/board/sunxi/board.c +++ b/board/sunxi/board.c @@ -281,7 +281,16 @@ static struct boot_file_head * get_spl_header(uint8_t req_version) int dram_init(void) { - gd->ram_size = get_ram_size((long *)PHYS_SDRAM_0, PHYS_SDRAM_0_SIZE); + struct boot_file_head *spl = get_spl_header(SPL_DRAM_HEADER_VERSION); + + if (spl == INVALID_SPL_HEADER) + gd->ram_size = get_ram_size((long *)PHYS_SDRAM_0, + PHYS_SDRAM_0_SIZE); + else + gd->ram_size = (phys_addr_t)spl->dram_size << 20; + + if (gd->ram_size > CONFIG_SUNXI_DRAM_MAX_SIZE) + gd->ram_size = CONFIG_SUNXI_DRAM_MAX_SIZE; return 0; } @@ -545,6 +554,21 @@ int board_mmc_init(bd_t *bis) #endif #ifdef CONFIG_SPL_BUILD + +static void sunxi_spl_store_dram_size(phys_addr_t dram_size) +{ + struct boot_file_head *spl = get_spl_header(SPL_DT_HEADER_VERSION); + + if (spl == INVALID_SPL_HEADER) + return; + + /* Promote the header version for U-Boot proper, if needed. */ + if (spl->spl_signature[3] < SPL_DRAM_HEADER_VERSION) + spl->spl_signature[3] = SPL_DRAM_HEADER_VERSION; + + spl->dram_size = dram_size >> 20; +} + void sunxi_board_init(void) { int power_failed = 0; @@ -613,6 +637,8 @@ void sunxi_board_init(void) if (!gd->ram_size) hang(); + sunxi_spl_store_dram_size(gd->ram_size); + /* * Only clock up the CPU to full speed if we are reasonably * assured it's being powered with suitable core voltage |