Hi Zhuxu,

Thank you for your patches.

I am playing with Duo and Duo-256M and faced an interesting thing
regarding reserved-memory on these boards.

It looks like your patchset may cause a memory corruption
of U-Boot or coprocessor FW for Milk-V Duo.

DTS in U-Boot limits RAM to 63.25 MB:

  memory@80000000 {
          device_type = "memory";
          reg = <0x80000000 0x3f40000>;
  };

Because the last 0.75 MB (0xc0000) is reserved for coprocessor.
Kernel uses different approach by declaring all RAM and
relying on `reserved-memory` for coprocessor.

However, this doesn't work for U-Boot because it places its stack
and heap near the top of RAM, therefore region in the top of RAM
is not reserved. So coprocessor FW or U-Boot may be corrupted.

With your patches it also gives an ERROR during reserving (because the region
is already used by U-Boot itself):

  U-Boot 2026.10-rc3-00007-g8e48ce755361 (Aug 27 2026 - 18:53:59 +0200)milkv_duo

  DRAM:  64 MiB
  ERROR: reserving fdt memory region failed (addr=83f40000 size=c0000 flags=2): 
-17
  Core:  23 devices, 15 uclasses, devicetree: separate
  MMC:   mmc@4310000: 0
  Loading Environment from nowhere... OK
  In:    serial@4140000
  Out:   serial@4140000
  Err:   serial@4140000
  Net:
  Warning: ethernet@4070000 (eth0) using random MAC address - 0a:06:39:79:c7:ed
  eth0: ethernet@4070000

  milkv_duo# bdinfo
  boot_params = 0x0000000000000000
  DRAM bank   = 0x0000000000000000
  -> start    = 0x0000000080000000
  -> size     = 0x0000000004000000
     ...
  relocaddr   = 0x0000000083f73000
  reloc off   = 0x0000000003d73000
     ...
  fdt_blob    = 0x000000008372ec60
  lmb_dump_all:
   memory.count = 0x1
   memory[0]      [0x80000000-0x83ffffff], 0x4000000 bytes, flags: none
   reserved.count = 0x3
   reserved[0]    [0x80000000-0x8005ffff], 0x60000 bytes, flags: no-map
   reserved[1]    [0x8272b000-0x8272dfff], 0x3000 bytes, flags: no-notify, 
no-overwrite
   reserved[2]    [0x8272ec50-0x83ffffff], 0x18d13b0 bytes, flags: no-overwrite
  devicetree  = separate
     ...
  stack ptr   = 0x000000008372e980
  ram_top ptr = 0x0000000084000000
  malloc base = 0x0000000083733000
  boot hart   = 0x0000000000000000
  firmware fdt= 0x0000000080080000

  milkv_duo# meminfo
  DRAM:  64 MiB

  Region                Base          Size           End           Gap
  --------------------------------------------------------------------
  code              83f73000         8cc30      83fffc30
  malloc            83733000        840000      83f73000             0
  board_info        83732fb0            50      83733000             0
  global_data       83732e40           168      83732fa8             8
  devicetree        8372ec60          41da      83732e3a             6
  stack             8272ec50       1000000      8372ec50            10
  lmb               8272ec50             0      8272ec50             0
  lmb               8272b000          3c50      8272ec50             0
  lmb               80000000       272b000      8272b000             0
  free              80000000             0      80000000             0


Main branch with the original U-Boot DTS:
  U-Boot 2026.10-rc3-00001-g7cbe3e32b6b4 (Aug 27 2026 - 18:30:42 +0200)milkv_duo

  DRAM:  63.3 MiB
  Core:  22 devices, 15 uclasses, devicetree: separate
  MMC:   mmc@4310000: 0
  Loading Environment from nowhere... OK
  In:    serial@4140000
  Out:   serial@4140000
  Err:   serial@4140000
  Net:
  Warning: ethernet@4070000 (eth0) using random MAC address - 82:8a:04:d3:35:d0
  eth0: ethernet@4070000

  milkv_duo# bdinfo
  boot_params = 0x0000000000000000
  DRAM bank   = 0x0000000000000000
  -> start    = 0x0000000080000000
  -> size     = 0x0000000003f40000
     ...
  relocaddr   = 0x0000000083eb3000
  reloc off   = 0x0000000003cb3000
     ...
  fdt_blob    = 0x00000000836705e0
  lmb_dump_all:
   memory.count = 0x1
   memory[0]      [0x80000000-0x83f3ffff], 0x3f40000 bytes, flags: none
   reserved.count = 0x3
   reserved[0]    [0x80000000-0x8005ffff], 0x60000 bytes, flags: no-map
   reserved[1]    [0x8266d000-0x8266ffff], 0x3000 bytes, flags: no-notify, 
no-overwrite
   reserved[2]    [0x826705d0-0x83f3ffff], 0x18cfa30 bytes, flags: no-overwrite
  devicetree  = separate
     ...
  stack ptr   = 0x0000000083670300
  ram_top ptr = 0x0000000083f40000
  malloc base = 0x0000000083673000
  boot hart   = 0x0000000000000000
  firmware fdt= 0x0000000080080000


I'm not sure of a better solution here other than limiting the RAM node
to exclude the coprocessor region.

Best regards,
Andrei Lalaev

Reply via email to