Broken support for 4GB DDR on 32-bit platforms

Tom Rini trini at konsulko.com
Mon May 16 14:31:43 CEST 2022


On Sat, May 14, 2022 at 01:00:06AM +0200, Pali Rohár wrote:

> Hello! I tried to enable support for 2GB+ of DDR memory (with 4GB DDR3)
> on powerpc P2020 board in 32-bit addressing mode and U-Boot crashed
> during startup.
> 
> I figured out that issue is not powerpc specific, but rather generic to
> all 32-bit platforms. U-Boot stores memory size into phys_size_t type
> (gd->ram_size) and last mapped memory address increased by one byte into
> phys_addr_t type (gd->ram_top).
> 
> Despite size 4GB fits into 32-bit addressing mode, it does not fit into
> above two variables, and it overflows to zero. U-Boot then see zero RAM
> size and crashes.
> 
> I tried to workaround this issue by changing both phys_size_t and
> phys_addr_t types to 64-bit. But it did not helped because U-Boot on
> many places cast gd->ram_size or gd->ram_top to ulong type, which is
> 32-bit on 32-bit platforms.
> 
> Next I changed ulong parameters of board_get_usable_ram_top() function
> to u64.
> 
> This still was not enough because config value CONFIG_MAX_MEM_MAPPED is
> ignored on one important place -- in function get_effective_memsize().
> This config value takes effect only when also CONFIG_VERY_BIG_RAM is
> set.
> 
> Finally With this change I was able to start U-Boot with more than 2GB
> of DDR memory inserted in SODIMM slot on P2020.
> 
> How to fix issues with gd->ram_size and gd->ram_top? That +1 byte is
> really stupid limitation. Changing phys_size_t and phys_addr_t types
> unconditionally to 64-bit? Or something else?
> 
> And what is the purpose of CONFIG_VERY_BIG_RAM config option? Why is
> CONFIG_MAX_MEM_MAPPED check skipped in get_effective_memsize() function,
> but is not skipped on many more places?

So, there's two parts to this, as I recall it all.  First, even on 64bit
platforms we contain ourselves to 32bit address space and even then
something within the "old" 2GB window.  We then set a CONFIG option to
not mess with the memory node in DT which has the real value.  Second,
for 32bit platforms which can support 4GB memory, or more, some further
games need to be played, typically I believe around initializing the
memory controller (I'm more confident of that for dra7xx_evm, which I
don't have the big memory version of, just a small memory one) so that
Linux can do whatever needs doing to enable "36bit" typically address
support.  Looking at the other P*36BIT* configs might give you some more
clues about what to do on your platform, or at least who might still be
able to explain and test things on the PowerPC side.

-- 
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/20220516/918efb39/attachment.sig>


More information about the U-Boot mailing list