In most cases (arc, ppc, mips, sh, m68k) gd->bd->bi_memsize and gd->bd->bi_memstart are populated in a similar fashion:
bd->bi_memstart = CONFIG_SYS_SDRAM_BASE; bd->bi_memsize = gd->ram_size; However, there is a special case in board/cadence/xtfpga/xtfpga.c that populates those fields in a board specific manner: gd->bd->bi_memstart = PHYSADDR(CONFIG_SYS_SDRAM_BASE); gd->bd->bi_memsize = CONFIG_SYS_SDRAM_SIZE; Due to this fact, a weak board-specific routine is introduced to take care of this scenario. Also, move all assignments to bi_mem* fields to setup_bdinfo initcall. Use gd->ram_base to populate bi_memstart to avoid an ifdef. Signed-off-by: Ovidiu Panait <ovidiu.pan...@windriver.com> --- arch/arc/lib/cpu.c | 2 -- board/cadence/xtfpga/xtfpga.c | 7 ++++++- common/board_f.c | 21 +++++++++++++++------ include/init.h | 12 ++++++++++++ 4 files changed, 33 insertions(+), 9 deletions(-) diff --git a/arch/arc/lib/cpu.c b/arch/arc/lib/cpu.c index 27b5832a0c..ccb7e1b265 100644 --- a/arch/arc/lib/cpu.c +++ b/arch/arc/lib/cpu.c @@ -27,8 +27,6 @@ int arch_cpu_init(void) int arch_early_init_r(void) { - gd->bd->bi_memstart = CONFIG_SYS_SDRAM_BASE; - gd->bd->bi_memsize = CONFIG_SYS_SDRAM_SIZE; return 0; } diff --git a/board/cadence/xtfpga/xtfpga.c b/board/cadence/xtfpga/xtfpga.c index 2869e5cf68..6f168f3f9f 100644 --- a/board/cadence/xtfpga/xtfpga.c +++ b/board/cadence/xtfpga/xtfpga.c @@ -49,7 +49,7 @@ int checkboard(void) return 0; } -int dram_init_banksize(void) +int board_setup_bdinfo_mem(void) { gd->bd->bi_memstart = PHYSADDR(CONFIG_SYS_SDRAM_BASE); gd->bd->bi_memsize = CONFIG_SYS_SDRAM_SIZE; @@ -57,6 +57,11 @@ int dram_init_banksize(void) return 0; } +int dram_init_banksize(void) +{ + return 0; +} + int board_postclk_init(void) { /* diff --git a/common/board_f.c b/common/board_f.c index 4356431488..ac72096e3a 100644 --- a/common/board_f.c +++ b/common/board_f.c @@ -598,6 +598,19 @@ static int display_new_sp(void) return 0; } +__weak int board_setup_bdinfo_mem(void) +{ + struct bd_info *bd = gd->bd; + + /* + * Save local variables to board info struct + */ + bd->bi_memstart = gd->ram_base; /* start of memory */ + bd->bi_memsize = gd->ram_size; /* size in bytes */ + + return 0; +} + __weak int arch_setup_bdinfo(void) { return 0; @@ -605,6 +618,8 @@ __weak int arch_setup_bdinfo(void) int setup_bdinfo(void) { + board_setup_bdinfo_mem(); + return arch_setup_bdinfo(); } @@ -614,12 +629,6 @@ static int setup_board_part1(void) { struct bd_info *bd = gd->bd; - /* - * Save local variables to board info struct - */ - bd->bi_memstart = CONFIG_SYS_SDRAM_BASE; /* start of memory */ - bd->bi_memsize = gd->ram_size; /* size in bytes */ - #ifdef CONFIG_SYS_SRAM_BASE bd->bi_sramstart = CONFIG_SYS_SRAM_BASE; /* start of SRAM */ bd->bi_sramsize = CONFIG_SYS_SRAM_SIZE; /* size of SRAM */ diff --git a/include/init.h b/include/init.h index e9354e8fca..85c8f49095 100644 --- a/include/init.h +++ b/include/init.h @@ -141,6 +141,18 @@ int arch_reserve_stacks(void); */ int arch_reserve_mmu(void); +/** + * board_setup_bdinfo_mem() - Populate gd->bd->bi_mem* fields + * + * Board-specific routine for populating gd->bd->bi_mem* fields. + * It is called during the generic board init sequence in setup_bdinfo. + * + * If an implementation is not provided, the generic one will be used. + * + * Return: 0 if OK + */ +int board_setup_bdinfo_mem(void); + /** * arch_setup_bdinfo() - Architecture dependent boardinfo setup * -- 2.17.1