[U-Boot] [PATCH] board: topic: Detect RAM size at boot
Igor Grinberg
grinberg at compulab.co.il
Mon Dec 12 09:22:26 CET 2016
On 11/22/16 16:54, Mike Looijmans wrote:
> On 22-11-16 12:00, Michal Simek wrote:
>> On 21.11.2016 09:30, Mike Looijmans wrote:
>>> Miami boards can have memory sizes of 256M, 512M or 1GB. To
>>> prevent requiring separate bootloaders for each variant, just
>>> detect the RAM size at boot time instead of relying on the
>>> devicetree information.
>>>
>>> Signed-off-by: Mike Looijmans <mike.looijmans at topic.nl> ---
>>> board/topic/zynq/board.c | 39
>>> +++++++++++++++++++++++++++++++++++++++
>>> configs/topic_miami_defconfig | 1 +
>>> configs/topic_miamiplus_defconfig | 1 + 3 files changed, 41
>>> insertions(+)
>>>
>>> diff --git a/board/topic/zynq/board.c b/board/topic/zynq/board.c
>>> index a95c9d1..8a5765e 100644 --- a/board/topic/zynq/board.c +++
>>> b/board/topic/zynq/board.c @@ -1 +1,40 @@ +/* + * (C) Copyright
>>> 2016 Topic Embedded Products + * + * SPDX-License-Identifier:
>>> GPL-2.0+ + */ + +/* + * Miami boards can have memory sizes of
>>> 256M, 512M or 1GB. To prevent needing + * separate bootloaders
>>> for each variant, just detect the RAM size at boot time + *
>>> instead of relying on the devicetree information. + */ +#define
>>> CONFIG_SYS_SDRAM_BASE 0 +#define CONFIG_SYS_SDRAM_SIZE
>>> topic_get_sdram_size()
>>
>> I am not happy with this but I see where you go.
>
> Of the several options I tried to "overload" the memory init
> functions, this was basically the lesser evil...
>
> Maybe it would be possible to make some changes to the generic Zynq
> board.c file to facilitate overlaying the code?
>
> Note that the memory detection would work on any board, not just the
> Topic boards. I agree that devicetree is considered the best thing
> since frozen pizza, but for the Zynq it looks as though detection is
> much simpler than static configuration.
>
>>
>>> +#define CONFIG_SYS_SDRAM_SIZE_MAX 0x40000000u + +static unsigned
>>> int topic_get_sdram_size(void); + #include
>>> "../../xilinx/zynq/board.c" + +#include <fdt_support.h> + +int
>>> ft_board_setup(void *blob, bd_t *bd) +{ +
>>> fdt_fixup_memory(blob, (u64)CONFIG_SYS_SDRAM_BASE,
>>> (u64)gd->ram_size); + + return 0; +}
>>
>> This action is taken at arch_fixup_fdt(). Can you please confirm
>> that this is really needed? And it is not done there? That you
>> don't duplicate stuff here.
>
> If I omitted this step, the Linux devicetree would not be adjusted
> (during bootm) and would still report its default. I needed both
> arch_fixup_fdt and this extra line to properly adjust the Linux
> devicetree for booting.
>
>
>>
>>> + +void dram_init_banksize(void) +{ + gd->bd->bi_dram[0].start
>>> = CONFIG_SYS_SDRAM_BASE; + gd->bd->bi_dram[0].size =
>>> gd->ram_size; +}
>>
>> This should be fine.
>>
>
> A note here, if you compile for Zynq with CONFIG_SYS_SDRAM_BASE and
> CONFIG_SYS_SDRAM_SIZE set, there will be no implementation of
> 'dram_init_banksize' and the system will fail to boot.
>
> It might be wise to put this snippet into the zynq/board.c in the
> "#else" clause. I'll send a separate patch for that if you agree.
>
>
>>> + +unsigned int topic_get_sdram_size(void) +{ + /* Detect and
>>> fix ram size */ + return get_ram_size((void
>>> *)CONFIG_SYS_SDRAM_BASE, +
>>> CONFIG_SYS_SDRAM_SIZE_MAX);
>>
>> In the first look I didn't know that get_ram_size is u-boot
>> function for memsize detection.
>
> Indeed, the name "get_ram_size" doesn't really match what it actually
> does, but the function's documentation is quite good.
>
> I found "get_ram_size" and "ft_board_setup" while browsing the code
> of other boards to see how they handled dynamic configuration.
+1
That's how things works in U-Boot for years...
--
Regards,
Igor.
More information about the U-Boot
mailing list