Greetings,

I'm reviving this thread as the issue Alper reported in December is still there...

On 12/22/25 1:32 PM, Alper Ak wrote:
Hi,

I'm working on Orange Pi RV2 board which uses the SpacemiT K1 SoC. I'm
currently using the bananapi-f3_defconfig as a base since there is no
mainline support for Orange Pi RV2 yet.

The Problem is U-Boot reports 4GB RAM on my 2GB board. I think the CS1
register shows enabled with valid density even when no physical RAM is
populated. This causes U-Boot to report double the actual RAM. Also,
If I don't set "mem=2G" in the kernel command line, it causes a kernel
panic.

I'm sharing U-Boot, bdinfo and DDR register dump output:

U-Boot 2026.01-rc4 (Dec 10 2025 - 15:28:43 +0000)

DRAM:  4 GiB
Core:  21 devices, 9 uclasses, devicetree: separate
Loading Environment from nowhere... OK
In:    serial@d4017000
Out:   serial@d4017000
Err:   serial@d4017000
Net:   No ethernet found.
Hit any key to stop autoboot: 0

=> bdinfo
boot_params = 0x0000000000000000
DRAM bank   = 0x0000000000000000
-> start    = 0x0000000000000000
-> size     = 0x0000000080000000
DRAM bank   = 0x0000000000000001
-> start    = 0x0000000100000000
-> size     = 0x0000000080000000
flashstart  = 0x0000000000000000
flashsize   = 0x0000000000000000
flashoffset = 0x0000000000000000
baudrate    = 115200 bps
relocaddr   = 0x000000007ff81000
reloc off   = 0x000000007fd81000
Build       = 64-bit
current eth = unknown
eth-1addr   = (not set)
IP addr     = <NULL>
fdt_blob    = 0x000000007ef5ed20
lmb_dump_all:
  memory.count = 0x2
  memory[0] [0x0-0x7fffffff], 0x80000000 bytes, flags: none
  memory[1] [0x100000000-0x17fffffff], 0x80000000 bytes, flags: none
  reserved.count = 0x4
  reserved[0] [0x0-0x7ffff], 0x80000 bytes, flags: no-map
  reserved[1] [0x7df5b000-0x7df5dfff], 0x3000 bytes, flags: no-notify,
no-overwrite
  reserved[2] [0x7df5ed10-0x7fffffff], 0x20a12f0 bytes, flags: no-overwrite
  reserved[3] [0x100000000-0x17fffffff], 0x80000000 bytes, flags: no-overwrite
devicetree  = separate
serial addr = 0x00000000d4017000
  width      = 0x0000000000000004
  shift      = 0x0000000000000002
  offset     = 0x0000000000000000
  clock      = 0x0000000000e2b328
boot hart   = 0x0000000000000000
firmware fdt= 0x0000000000279b18

=> md.l 0xC0000200 1
c0000200: 000f0001                             ....
=> md.l 0xC0000208 1
c0000208: 800f0001                             ....


I think this seems to be board independent and appears to originate
from the code at "arch/riscv/cpu/k1/dram.c".

I have the same problem on my OrangePi R2S board with 2 Go of RAM. U-Boot believes my board has 4 GB of RAM. It seems most K1 boards should be impacted!

This seems to happen because the code in arch/riscv/cpu/k1/dram.c unconditionally adds the value read from CS1, even if CS1 is unpopulated:

phys_size_t ddr_get_density(void)
{
    phys_size_t cs0_size = ddr_map_size(readl((void *)DDR_BASE + 0x200));
    phys_size_t cs1_size = ddr_map_size(readl((void *)DDR_BASE + 0x208));
    phys_size_t ddr_size = cs0_size + cs1_size;

    return ddr_size;
}

Looking at the corresponding vendor U-Boot code [1], this is conditional indeed:

    cs0_size = map_format_size(readl((void*)0xc0000000 + 0x200));
    if (ddr_cs_num > 1) {
        cs1_size = map_format_size(readl((void*)0xc0000000 + 0x208));
    }
    ddr_size = cs0_size + cs1_size;

However, if you add such code and set ddr_cs_num to 1, this works well with my 2 GB Orange Pi R2S board, but breaks my Orange Pi RV2 with 8 GB (U-Boot seeing 4 GB instead of 8 GB).

How should we address this issue in a clean way?
Note that I've done my tests loading mainline U-Boot from FSBL.bin built from the vendor U-Boot code.

Thanks in advance for your insights.
Michael.

[1] https://github.com/orangepi-xunlong/u-boot-orangepi.git, branch v2022.10-ky

--
Michael Opdenacker, Root Commit
Embedded Linux Training and Consulting. Yocto Ambassador.
https://rootcommit.com

Reply via email to