[PATCH] rockchip: sdram: Fix initialization of DRAM banks
Ilias Apalodimas
ilias.apalodimas at linaro.org
Mon Jun 29 09:51:34 CEST 2026
Thanks Jonas
On Sat, 27 Jun 2026 at 23:24, Jonas Karlman <jonas at kwiboo.se> wrote:
> The commit 55a342176984 ("common: Add an option to relocate on ram top")
> changed so that dram_init_banksize() is called before gd->ram_top has
> been initialized. This change broke Rockchip DRAM banks configuration
> due to gd->ram_top now being 0 when dram_init_banksize() is called.
>
> This makes first DRAM bank size calculation overflow and end up with
>
> DRAM bank = 0x0000000000000000
> -> start = 0x0000000000200000
> -> size = 0xffffffffffe00000
>
> instead of the expected (for 2 GiB)
>
> DRAM bank = 0x0000000000000000
> -> start = 0x0000000000200000
> -> size = 0x000000007fe00000
>
> or (for 4 GiB)
>
> DRAM bank = 0x0000000000000000
> -> start = 0x0000000000200000
> -> size = 0x00000000f7e00000
>
> on e.g. RK3399 boards.
>
> Change to not depend on gd->ram_top having to be pre-calculated before
> dram_init_banksize() is called, also move the related method
> board_get_usable_ram_top() closer to more easily get an overview of
> their interdependence, to restore working DRAM bank initialization.
>
> Fixes: 55a342176984 ("common: Add an option to relocate on ram top")
> Signed-off-by: Jonas Karlman <jonas at kwiboo.se>
> ---
I tested in on one board I got available
SoC: Rockchip rk3399
Reset cause: unknown reset
Model: Radxa ROCK Pi 4A
DRAM: 4 GiB (total 3.9 GiB)
[...]
=> bdinfo
boot_params = 0x0000000000000000
DRAM bank = 0x0000000000000000
-> start = 0x0000000000200000
-> size = 0x00000000f7e00000
flashstart = 0x0000000000000000
flashsize = 0x0000000000000000
flashoffset = 0x0000000000000000
baudrate = 1500000 bps
relocaddr = 0x00000000f3f0c000
reloc off = 0x00000000f370c000
Build = 64-bit
current eth = ethernet at fe300000
ethaddr = e6:9a:46:f0:87:25
IP addr = <NULL>
fdt_blob = 0x00000000f1eeccf0
Video = vop at ff8f0000 inactive
Video = vop at ff900000 inactive
lmb_dump_all:
memory.count = 0x1
memory[0] [0x200000-0xf7ffffff], 0xf7e00000 bytes, flags: none
reserved.count = 0x2
reserved[0] [0xf0ee7000-0xf0eebfff], 0x5000 bytes, flags: no-notify,
no-overwrite
reserved[1] [0xf0eecce0-0xf7ffffff], 0x7113320 bytes, flags:
no-overwrite
devicetree = separate
serial addr = 0x00000000ff1a0000
width = 0x0000000000000004
shift = 0x0000000000000002
offset = 0x0000000000000000
clock = 0x00000000016e3600
arch_number = 0x0000000000000000
TLB addr = 0x00000000f7ff0000
irq_sp = 0x00000000f1eecce0
sp start = 0x00000000f1eecce0
Early malloc usage: 2510 / 10000
Reported-by: Ilias Apalodimas <ilias.apalodimas at linaro.org>
Acked-by: Ilias Apalodimas <ilias.apalodimas at linaro.org>
Tested-by: Ilias Apalodimas <ilias.apalodimas at linaro.org> # on Radxa ROCK
Pi 4A
> arch/arm/mach-rockchip/sdram.c | 22 ++++++++++++----------
> 1 file changed, 12 insertions(+), 10 deletions(-)
>
> diff --git a/arch/arm/mach-rockchip/sdram.c
> b/arch/arm/mach-rockchip/sdram.c
> index f0923186fa61..2e404df1b200 100644
> --- a/arch/arm/mach-rockchip/sdram.c
> +++ b/arch/arm/mach-rockchip/sdram.c
> @@ -294,10 +294,20 @@ __weak int rockchip_dram_init_banksize_fixup(struct
> bd_info *bd)
> return 0;
> }
>
> +phys_addr_t board_get_usable_ram_top(phys_size_t total_size)
> +{
> + /* Make sure U-Boot only uses the space below the 4G address
> boundary */
> + u64 usable_top = min_t(u64, CFG_SYS_SDRAM_BASE + SDRAM_MAX_SIZE,
> SZ_4G);
> +
> + return (gd->ram_top > usable_top) ? usable_top : gd->ram_top;
> +}
> +
> int dram_init_banksize(void)
> {
> - size_t ram_top = (unsigned long)(gd->ram_size +
> CFG_SYS_SDRAM_BASE);
> - size_t top = min((unsigned long)ram_top, (unsigned
> long)(gd->ram_top));
> + /* Make sure first bank uses the space below the 4G address
> boundary */
> + u64 usable_top = min_t(u64, CFG_SYS_SDRAM_BASE + SDRAM_MAX_SIZE,
> SZ_4G);
> + size_t ram_top = (unsigned long)(CFG_SYS_SDRAM_BASE +
> gd->ram_size);
> + size_t top = min((unsigned long)ram_top, (unsigned
> long)(usable_top));
>
> #ifdef CONFIG_ARM64
> int ret = rockchip_dram_init_banksize();
> @@ -507,11 +517,3 @@ int dram_init(void)
>
> return 0;
> }
> -
> -phys_addr_t board_get_usable_ram_top(phys_size_t total_size)
> -{
> - /* Make sure U-Boot only uses the space below the 4G address
> boundary */
> - u64 top = min_t(u64, CFG_SYS_SDRAM_BASE + SDRAM_MAX_SIZE, SZ_4G);
> -
> - return (gd->ram_top > top) ? top : gd->ram_top;
> -}
> --
> 2.54.0
>
>
More information about the U-Boot
mailing list