Re: [PATCH v2 0/2] board: sophgo: add support for Milk-V Duo 256M

Andrei Lalaev <[email protected]>
Newsgroups org.u-boot-project.lists.u-boot
Message-ID <[email protected]>
Hi Hiago,

On 27.08.26 15:30, Hiago De Franco wrote:
> Hi Andrei,
> 
> On Tue, Aug 25, 2026 at 08:01:37PM +0200, Andrei Lalaev wrote:
>> On 25.08.26 14:24, Hiago De Franco wrote:
>>> Hi Andrei,
>>>
>>> On Sat, Aug 22, 2026 at 11:15:10AM +0200, Andrei Lalaev wrote:
>>>> Hi Hiago,
>>>>
>>>> Thank you for the patches.
>>>>
>>>> From your cover letter I understood that SD card is supported.
>>>> However whatever I try, I always get the following error:
>>>>
>>>>     U-Boot 2026.07-00002-gbd5e3de2ed6a (Aug 22 2026 - 10:27:48 +0200)milkv_duo_256m
>>>>
>>>>     DRAM:  256 MiB
>>>>     Core:  20 devices, 13 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 - 16:21:8c:10:cd:96
>>>>     eth0: ethernet@4070000
>>>>     Hit any key to stop autoboot: 0
>>>>     milkv_duo_256m# mmc info
>>>>     Card did not respond to voltage select! : -110
>>>>     milkv_duo_256m# mmc rescan
>>>>     Card did not respond to voltage select! : -110
>>>>
>>>>
>>>> I tried 2 different SD cards and got the same result.
>>>>
>>>> Am I doing something wrong, or is there something else I need to configure?
>>>
>>> You are most likely missing this patch:
>>>
>>> https://lore.kernel.org/all/[email protected]/
>>>
>>> This is needed in order to make the SD card work. This patch is already
>>> merged on main branch, as commit 3a4a8963aace ("mmc: cv1800b_sdhci:
>>> honor 'no-1-8-v' DT property").
>>>
>>> Check this patch and let me know if it works now ;)
>>
>> Thank you for your response:)
>>
>> I also tried the latest main branch (so all patches are definitely included)
>> and had the same problem.
>>
>> I guess I somehow managed to fix the problem, so below I'll describe what I did
>> and would like to hear your thoughts about it.
>>
>>
>> When I generated `fip.bin` using precompiled binaries from fiptool repo [1],
>> it started working most of the time. Previously I was using an FSBL manually generated
>> using official SDK [2]. However, I would still occasionally get
>> voltage select error and timeouts.
>>
>> So I started comparing FSBL and U-boot from Sophgo (2021.10) and
>> I couldn't find any differences that could explain this behaviour.
>>
>> Today I found out that the kernel DTS configures the SD0_CLK pin to a different value [3].
>> By default, we have 0x48 in IOBLK_G10_REG_SD0_CLK register, but if I set it to 0x84
>> like kernel does, it magically starts to work all the time.
>>
>> I understand why increasing the drive strength fixed timeout issues, but I don't understand
>> why I don't see the same problem with the U-Boot from Sophgo (2021.10).
>>
>> 1 - https://github.com/sophgo/fiptool
>> 2 - https://github.com/milkv-duo/duo-buildroot-sdk-v2/tree/main
>> 3 - https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/arch/riscv/boot/dts/sophgo/sg2002-milkv-duo256m.dts#n68
> 
> Thanks for digging into this.
> 
> I made some tests here on my milkv-duo 256M and I might have the answer
> you are looking for, hopefully.
> 
> 0x48 is SoC reset value, based on the TRM. This is what I read on my
> U-Boot (main branch, like yours):
> 
> 0x03001a00 SD0_CLK = 0x48 pull-down, 10800 uA  <-- reset value
> 
> So on my board the BootROM already does everything Sophgo's
> cvi_sdio0_pad_setting() does. SD0_CLK is the single register nobody
> programs, exactly as you found. I also checked the FSBL and it never
> touches SD0 and never touches drive strength, from what I could see.
> 
> I am not able to reproduce your issue, it works every time for me. I
> suspect there is a difference on the hardware here: maybe your board has
> less margin for the drive strength than mine, it works at the stock
> 50MHz even with the CLK drive strength at its minimum.
> 
> To trigger the issue, I had to force SDHCI divider from N=4 to N=2, so
> doubling the clock. With that, I triggered your issue. Of course I am
> not sure if this is the same issue that is triggering your, but at least
> now with the double clock I was able to increase the drive strength by
> writing 0x84 (the kernel value) and it fixed the issue (which makes
> sense).


That's interesting. Thank you for your investigation.


> I was not able to properly answer the reason why Sophgo U-Boot works, so
> I used Claude to look at the code for me and compare the differences,
> here is what it found out:
> 
> "It is the PHY. cvi_sdhci_set_ios_post() has a DS/HS branch that does:
> 
>     PHY_CONFIG    (0x24c) |= BIT(0)          /* TX_BPS */
>     PHY_TX_RX_DLY (0x240)  = 0x01000100
> 
> The kernel does the same thing, unconditionally, in
> cv18xx_sdhci_reset() (drivers/mmc/host/sdhci-of-dwcmshc.c):
> 
>     val |= CV18XX_PHY_TX_BPS;                     /* PHY_CONFIG bit 0 */
>     val = TX_DLY(0) | TX_SRC(INVERT_CLK_TX)
>         | RX_DLY(0) | RX_SRC(INVERT_RX_CLK);      /* == 0x01000100 */
> 
> Upstream U-Boot does neither. cv1800b_sdhci.c only writes
> SDHCI_PHY_TX_RX_DLY from cv1800b_execute_tuning(), reached only through
> platform_execute_tuning - and that never runs on this board, because
> no-1-8-v caps us at High Speed 50MHz / 3.3V and tuning only happens in
> UHS modes."
> 
> I am not 100% convinced by that, but I will take a look, we might need a
> patch here on upstream to configure the PHY properly as the downstream
> u-boot and kernel does. Anyway, is funny that I can only reproduce your
> issue on this conditions, but these boards might not be something we can
> blindly trust ;)
> 
> Could you dump these on your board, at the U-Boot prompt on unmodified
> upstream main, before touching anything?
> 
>     md.l 0x03001a00 8      # SD0_CLK / CMD / D0-D3 pad config
>     md.l 0x03001900 4      # SD0_CD, SD0_PWR_EN
>     md.l 0x030001f4 1      # sd_pwrsw_ctrl
>     md.l 0x0300101c 8      # SD0 pin mux
>     md.l 0x04310240 1      # PHY_TX_RX_DLY
>     md.l 0x0431024c 1      # PHY_CONFIG


Sure, here is the register dump before `mmc rescan`:

  # SD0_CLK / CMD / D0-D3 pad config
  milkv_duo_256m# md.l 0x03001a00 8
  03001a00: 00000048 00000044 00000044 00000044  H...D...D...D...
  03001a10: 00000044 00000044 00000010 00000000  D...D...........

  # SD0_CD, SD0_PWR_EN
  milkv_duo_256m# md.l 0x03001900 4
  03001900: 00000044 00000048 00000048 00000044  D...H...H...D...

  # sd_pwrsw_ctrl
  milkv_duo_256m# md.l 0x030001f4 1
  030001f4: 00001209                             ....

  # SD0 pin mux
  milkv_duo_256m# md.l 0x0300101c 8
  0300101c: 00000000 00000000 00000000 00000000  ................
  0300102c: 00000000 00000000 00000000 00000000  ................

  # PHY_TX_RX_DLY
  milkv_duo_256m# md.l 0x04310240 1
  04310240: 00000000                             ....

  # PHY_CONFIG
  milkv_duo_256m# md.l 0x0431024c 1
  0431024c: 00000000                             ....

and after:

  milkv_duo_256m# mmc rescan
  unable to select a mode

  # SD0_CLK / CMD / D0-D3 pad config
  milkv_duo_256m# md.l 0x03001a00 8
  03001a00: 00000048 00000044 00000044 00000044  H...D...D...D...
  03001a10: 00000044 00000044 00000010 00000000  D...D...........

  # SD0_CD, SD0_PWR_EN
  milkv_duo_256m# md.l 0x03001900 4
  03001900: 00000044 00000048 00000048 00000044  D...H...H...D...

  # sd_pwrsw_ctrl
  milkv_duo_256m# md.l 0x030001f4 1
  030001f4: 00001209                             ....

  # SD0 pin mux
  milkv_duo_256m# md.l 0x0300101c 8
  0300101c: 00000000 00000000 00000000 00000000  ................
  0300102c: 00000000 00000000 00000000 00000000  ................

  # PHY_TX_RX_DLY
  milkv_duo_256m# md.l 0x04310240 1
  04310240: 00000000                             ....

  # PHY_CONFIG
  milkv_duo_256m# md.l 0x0431024c 1
  0431024c: 00000000                             ....

And if I try to rescan several more times (until SD card is detected
and `mmc info` succeeds), all the registers have the same values as before.

I will probably dump registers with downstream U-Boot and
tracing enabled this weekend.

> Meanwhile I will be able to investigate this further in a couple of
> days.

Thank you for your assistance :)
 >>
>>>>
>>>>
>>>> Best regards,
>>>> Andrei Lalaev
>>>
>>> Regards,
>>> Hiago.
>>
>>
>> -- 
>> Best regards,
>> Andrei Lalaev
> 
> Regards,
> Hiago.


-- 
Best regards,
Andrei Lalaev
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.