Pre-submission checklist
Firmware Type
arkos4clone
Version
ArkOS4Clone-08152026
DTB File
rk3326-xf40h-linux.dtb
DTB Detection Screenshot
Console Output / Error
Bug Description
I bought an XF40H knowing I could put ArkOS4Clone on it, because I use PortMaster a lot and I don't like EmuELEC. However, I was surprised to see that the console reports quite a bit less RAM than when it runs with EmuELEC (whether the one on the eMMC it shipped with, or a second SD I flashed with its same stock image). In ArkOS it reports 611MB, with about 400 available to use, while the stock CFW reports a maximum of 975MB of RAM, with 321 free while in RetroArch (I know that firmware isn't the best at resource optimization anyway). But I was wondering what this difference in detection is due to.
For reference, the stock CFW runs kernel 5.11, while ArkOS uses kernel 4.4 — in case the kernel version matters at all for this.
I've done some tests but none have panned out:
I've seen that no DTB (arkos xf40h, emuelec rf3640g4ka, odroidgo2) declares a /memory node → the size is set by u-boot, not the dtb.
No mem= in bootargs; ARM64 uses the tree's /memory node (it doesn't add RAM via mem=).
I compared the boot regions byte by byte: the DDR firmware differs — ArkOS DDR fwver v2.12 vs stock DDR V2.08 20220817, same 333 MHz training clock; u-boot builds differ (arkos4clone 2026 vs pangjianwen 2025).
Test A — swapped the full stock boot region: it didn't boot ArkOS (my mistake: I didn't account for the partition table being rewritten + the stock u-boot uses extlinux, not boot.ini). Reverted.
Test B — spliced the DDR bin v2.08 into ArkOS's idbloader: it booted, but RAM stayed at 661, so the DDR blob at 0x8800 isn't the deciding factor.
Test C — full stock u-boot + an extlinux.conf pointing at the ArkOS kernel: booted ArkOS, but RAM still showed 661/758 MB physical → the SD bootloader isn't the deciding factor.
I analyzed reserved-memory, chosen, and dmc in the DTBs: only ~1 MB of reservations, none affecting the total.
Test max_ddrfreq=333: no change (rules out frequency).
As a loose idea I'm not sure about: maybe the total RAM is decided by u-boot's DDR training during boot, and over SD it only ever trains ~758MB no matter which SD bootloader is used — while the full 1GB (975MB) only appears through the sealed eMMC boot path. If that were true, it would be something baked into the boot/branding rather than something fixable through the SD. I can't access the eMMC's bootloader to confirm, though.
P.D. — I've included the photos from EmuELEC instead ssh ss reports because EmuELEC doesn't allow SSH access in my case, neither on its stock eMMC version nor on the copy I flashed to an SD card. As a cross-check, RetroArch inside ArkOS reports the same RAM figure I obtained over SSH, so the measurement method doesn't skew the result.
Steps to Reproduce
Expected Behavior (Optional)
No response
Screenshots / Video / Logs (Optional)

RAM reported by ArkOS4Clone over SSH
==========
Retroarch in Emuelec reporting 975mb Ram
=======

Emuelec version in eMMC (same version in the another sd)
Additional Context (Optional)
No response
Pre-submission checklist
Firmware Type
arkos4clone
Version
ArkOS4Clone-08152026
DTB File
rk3326-xf40h-linux.dtb
DTB Detection Screenshot
Console Output / Error
Bug Description
I bought an XF40H knowing I could put ArkOS4Clone on it, because I use PortMaster a lot and I don't like EmuELEC. However, I was surprised to see that the console reports quite a bit less RAM than when it runs with EmuELEC (whether the one on the eMMC it shipped with, or a second SD I flashed with its same stock image). In ArkOS it reports 611MB, with about 400 available to use, while the stock CFW reports a maximum of 975MB of RAM, with 321 free while in RetroArch (I know that firmware isn't the best at resource optimization anyway). But I was wondering what this difference in detection is due to.
For reference, the stock CFW runs kernel 5.11, while ArkOS uses kernel 4.4 — in case the kernel version matters at all for this.
I've done some tests but none have panned out:
I've seen that no DTB (arkos xf40h, emuelec rf3640g4ka, odroidgo2) declares a /memory node → the size is set by u-boot, not the dtb.
No mem= in bootargs; ARM64 uses the tree's /memory node (it doesn't add RAM via mem=).
I compared the boot regions byte by byte: the DDR firmware differs — ArkOS DDR fwver v2.12 vs stock DDR V2.08 20220817, same 333 MHz training clock; u-boot builds differ (arkos4clone 2026 vs pangjianwen 2025).
Test A — swapped the full stock boot region: it didn't boot ArkOS (my mistake: I didn't account for the partition table being rewritten + the stock u-boot uses extlinux, not boot.ini). Reverted.
Test B — spliced the DDR bin v2.08 into ArkOS's idbloader: it booted, but RAM stayed at 661, so the DDR blob at 0x8800 isn't the deciding factor.
Test C — full stock u-boot + an extlinux.conf pointing at the ArkOS kernel: booted ArkOS, but RAM still showed 661/758 MB physical → the SD bootloader isn't the deciding factor.
I analyzed reserved-memory, chosen, and dmc in the DTBs: only ~1 MB of reservations, none affecting the total.
Test max_ddrfreq=333: no change (rules out frequency).
As a loose idea I'm not sure about: maybe the total RAM is decided by u-boot's DDR training during boot, and over SD it only ever trains ~758MB no matter which SD bootloader is used — while the full 1GB (975MB) only appears through the sealed eMMC boot path. If that were true, it would be something baked into the boot/branding rather than something fixable through the SD. I can't access the eMMC's bootloader to confirm, though.
P.D. — I've included the photos from EmuELEC instead ssh ss reports because EmuELEC doesn't allow SSH access in my case, neither on its stock eMMC version nor on the copy I flashed to an SD card. As a cross-check, RetroArch inside ArkOS reports the same RAM figure I obtained over SSH, so the measurement method doesn't skew the result.
Steps to Reproduce
Expected Behavior (Optional)
No response
Screenshots / Video / Logs (Optional)
==========
Retroarch in Emuelec reporting 975mb Ram
=======
Additional Context (Optional)
No response