[PATCH] arm: bootm: wrong lmb region reservation when PRAM is used

Tom Rini trini at konsulko.com
Fri Apr 30 13:52:42 CEST 2021


On Fri, Feb 19, 2021 at 09:46:49PM +0000, Aleksandar Gerasimovski wrote:

> This is a draft patch to describe the problem and to initiate
> a discussion for solution.
> 
> PRAM usage is not taken into account when reserving lmb for ARM
> architecture, this means that predefined PRAM region is reserved
> by the u-boot and cannot be used by the u-boot users.
> 
> In our case this bug leads to non functional ramfs boot, as the PRAM and
> ram rootfs address ranges are getting reserved by the u-boot.
> 
> It is obvious that here PRAM region is ignored, but my question is is this
> clear to everyone and expected?
> 
> Taking  board_f.c as reference, when calculating relocation address PRAM
> area is taken into account so I would expect that to be case here.
> Here the intention is to reserve unused space at the end of the effective
> RAM but PRAM is not part of that.
> 
> Possible solution would be to introduce something like
> get_effective_memsize here e.g powerpc/lib/bootm.c but then also
> NR_DRAM_BANKS has to be considered?
> 
> Signed-off-by: Aleksandar Gerasimovski <aleksandar.gerasimovski at hitachi-powergrids.com>
> ---
>  arch/arm/lib/bootm.c | 10 ++++++++--
>  1 file changed, 8 insertions(+), 2 deletions(-)
> 
> diff --git a/arch/arm/lib/bootm.c b/arch/arm/lib/bootm.c
> index 11af9e2..4b06d25 100644
> --- a/arch/arm/lib/bootm.c
> +++ b/arch/arm/lib/bootm.c
> @@ -54,7 +54,7 @@ static ulong get_sp(void)
>  
>  void arch_lmb_reserve(struct lmb *lmb)
>  {
> -	ulong sp, bank_end;
> +	ulong sp, bank_end, pram = 0;
>  	int bank;
>  
>  	/*
> @@ -69,6 +69,11 @@ void arch_lmb_reserve(struct lmb *lmb)
>  	sp = get_sp();
>  	debug("## Current stack ends at 0x%08lx ", sp);
>  
> +#ifdef CONFIG_PRAM
> +	pram = env_get_ulong("pram", 10, CONFIG_PRAM);
> +	pram = pram << 10;	/* size is in kB */
> +#endif
> +
>  	/* adjust sp by 4K to be safe */
>  	sp -= 4096;
>  	for (bank = 0; bank < CONFIG_NR_DRAM_BANKS; bank++) {
> @@ -76,8 +81,9 @@ void arch_lmb_reserve(struct lmb *lmb)
>  		    sp < gd->bd->bi_dram[bank].start)
>  			continue;
>  		/* Watch out for RAM at end of address space! */
> +		/* @todo: pram obviously wrong if NR_DRAM_BANKS > 1 */
>  		bank_end = gd->bd->bi_dram[bank].start +
> -			gd->bd->bi_dram[bank].size - 1;
> +			   gd->bd->bi_dram[bank].size - pram - 1;
>  		if (sp > bank_end)
>  			continue;
>  		if (bank_end > gd->ram_top)

Adding a few folks who have touched lmb code relatively recently for
their thoughts.  Thanks!

-- 
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 659 bytes
Desc: not available
URL: <https://lists.denx.de/pipermail/u-boot/attachments/20210430/57fb7e20/attachment.sig>


More information about the U-Boot mailing list