Skip to contentSkip to conversation

Add initial Milk-V Duo S board support

PATCH Superseded Joshua Milas 3 participants 13 messages Oct 29, 2025 – Mar 16

Subsystems (6)

v3 of 6 Superseded Latest is v6 →

lore
Share & tools
lore
#0 lore raw

v3 cover Add initial Milk-V Duo S board support

This adds an initial device tree for the Milk-V Duo S board with support for reading from the SD card and network over Ethernet. This is continued work from Michael Opdenacker's v6 series [1] on the ARM64 and RISCV side. It has been tested with ARM64 and RISCV64 to boot from an SD card, have networking, and read I2C slave devices over i2c4.

v3
- Added sg2000 interrupt controller and timer to documentation
- Added sg2000.dtsi for RISCV and moved DTS over to use it
- remove devices from DTS's to match what is available in the default pinmux config. spi0-2, i2c0-3, uart1-4
- Added i2c4 and spi3 aliases

v2: http s://lore.kernel.org/sophgo/[email protected]/
- Made new entry in docs to avoid DTC error
- "Milk-V DuoS" -> "Milk-V Duo S"
- Sorting of aliases
- Added uart*, emmc, mdio, gmac0, i2c*, spi*, dmac, saradc to device tree matching what is available on the pinout [2]
- Added riscv device tree

v1: https://lore.kernel.org/sophgo/[email protected]/

Joshua Milas (5):
dt-bindings: soc: sophgo: add Milk-V Duo S board compatibles
arm64: dts: sophgo: add initial Milk-V Duo S board support
dt-bindings: soc: sophgo: add sg2000 plic and clint documentation
riscv64: dts: sophgo: add SG2000 dtsi
riscv64: dts: sophgo: add initial Milk-V Duo S board support

 .../sifive,plic-1.0.0.yaml                    |  1 +
 .../bindings/soc/sophgo/sophgo.yaml           |  4 +
 .../bindings/timer/sifive,clint.yaml          |  1 +
 arch/arm64/boot/dts/sophgo/Makefile           |  1 +
 .../boot/dts/sophgo/sg2000-milkv-duo-s.dts    | 80 +++++++++++++++++++
 arch/riscv/boot/dts/sophgo/Makefile           |  1 +
 .../boot/dts/sophgo/sg2000-milkv-duo-s.dts    | 80 +++++++++++++++++++
 arch/riscv/boot/dts/sophgo/sg2000.dtsi        | 53 ++++++++++++
 8 files changed, 221 insertions(+)
 create mode 100644 arch/arm64/boot/dts/sophgo/sg2000-milkv-duo-s.dts
 create mode 100644 arch/riscv/boot/dts/sophgo/sg2000-milkv-duo-s.dts
 create mode 100644 arch/riscv/boot/dts/sophgo/sg2000.dtsi

base-commit: 0251a1deaec78252cb311fc8305d3670bc5eee0e

Signature · 1 line
2.51.1
#1 lore raw

PATCH v3 1/5 dt-bindings: soc: sophgo: add Milk-V Duo S board compatibles

Document the compatible strings for the Milk-V Duo S board [1] which uses the SOPHGO SG2000 SoC [2].

---
 Documentation/devicetree/bindings/soc/sophgo/sophgo.yaml | 4 ++++
 1 file changed, 4 insertions(+)
Documentation/devicetree/bindings/soc/sophgo/sophgo.yaml +4 -0
index 1c502618de51f..0b6fbab48b743 100644
@@ -31,6 +31,10 @@ properties:
               - milkv,duo-module-01-evb
           - const: milkv,duo-module-01
           - const: sophgo,sg2000
+      - items:
+          - enum:
+              - milkv,duo-s
+          - const: sophgo,sg2000
       - items:
           - enum:
               - sipeed,licheerv-nano-b
Signature · 1 line
2.51.1
#2 lore raw

Re: [PATCH v3 1/5] dt-bindings: soc: sophgo: add Milk-V Duo S board compatibles

Quoted 5 lines · Joshua Milas

Document the compatible strings for the Milk-V Duo S board [1] which uses the SOPHGO SG2000 SoC [2].

Drop second link, not relevant. You are not adding new SoC here, are you?

Quoted 3 lines

---

No changes against v2? You received comments, didn't you?

Best regards,
Krzysztof

#3 lore raw

Re: [PATCH v3 1/5] dt-bindings: soc: sophgo: add Milk-V Duo S board compatibles

Hi Krzysztof,

Apologies for missing the change, I got ahead of myself. I updated my changelog for an upcoming v4 patch.

Quoted 2 lines

How did you resolve previous comments on bindings? Nothing mentioned here.

Which issues specifically? i2c issues were resolved by updating the .config for drivers. I have yet to resolve the spi issues.

Have a good day,
- Joshua Milas

#4 lore raw

Re: [PATCH v3 1/5] dt-bindings: soc: sophgo: add Milk-V Duo S board compatibles

Quoted 10 lines · Joshua Milas

Hi Krzysztof,

Apologies for missing the change, I got ahead of myself. I updated my changelog for an upcoming v4 patch.

Quoted 2 lines

How did you resolve previous comments on bindings? Nothing mentioned here.

Which issues specifically? i2c issues were resolved by updating the .config for drivers. I have yet to resolve the spi issues.

Each issue you received comment on. You received review and asking now to repeat is basically asking us to do same work twice which wastes our time.

Best regards,
Krzysztof

#5 lore raw

PATCH v3 2/5 arm64: dts: sophgo: add initial Milk-V Duo S board support

In reply to Joshua Milas

Adds initial arm64 support for the Milk-V Duo S board
[1] making it possible to boot Linux to the command line.

---
 arch/arm64/boot/dts/sophgo/Makefile           |  1 +
 .../boot/dts/sophgo/sg2000-milkv-duo-s.dts    | 80 +++++++++++++++++++
 2 files changed, 81 insertions(+)
 create mode 100644 arch/arm64/boot/dts/sophgo/sg2000-milkv-duo-s.dts
arch/arm64/boot/dts/sophgo/Makefile +1 -0
index 94f52cd7d994b..68aace728223a 100644
@@ -1,2 +1,3 @@
 # SPDX-License-Identifier: GPL-2.0
 dtb-$(CONFIG_ARCH_SOPHGO) += sg2000-milkv-duo-module-01-evb.dtb
+dtb-$(CONFIG_ARCH_SOPHGO) += sg2000-milkv-duo-s.dtb
arch/arm64/boot/dts/sophgo/sg2000-milkv-duo-s.dts new file +80 -0

80 lines not on this page · raw message

Signature · 1 line
2.51.1
#6 lore raw

Re: [PATCH v3 2/5] arm64: dts: sophgo: add initial Milk-V Duo S board support

Hi Joshua

Many thanks for this update! I'd love to have this board supported in mainline, and when this happens, I'll add it to Yocto's meta-riscv layer to make it easy to use.

Quoted 96 lines · Joshua Milas

Adds initial arm64 support for the Milk-V Duo S board
[1] making it possible to boot Linux to the command line.

---
  arch/arm64/boot/dts/sophgo/Makefile           |  1 +
  .../boot/dts/sophgo/sg2000-milkv-duo-s.dts    | 80 +++++++++++++++++++
  2 files changed, 81 insertions(+)

create mode 100644 arch/arm64/boot/dts/sophgo/sg2000-milkv-duo-s.dts

arch/arm64/boot/dts/sophgo/Makefile +1 -0
index 94f52cd7d994b..68aace728223a 100644
@@ -1,2 +1,3 @@
  # SPDX-License-Identifier: GPL-2.0
  dtb-$(CONFIG_ARCH_SOPHGO) += sg2000-milkv-duo-module-01-evb.dtb
+dtb-$(CONFIG_ARCH_SOPHGO) += sg2000-milkv-duo-s.dtb
arch/arm64/boot/dts/sophgo/sg2000-milkv-duo-s.dts new file +70 -0
new file mode 100644
index 0000000000000..174c194e1301d
@@ -0,0 +1,80 @@
+// SPDX-License-Identifier: (GPL-2.0 OR MIT)
+
+/dts-v1/;
+
+#include "sg2000.dtsi"
+
+/ {
+	model = "Milk-V Duo S";
+	compatible = "milkv,duo-s", "sophgo,sg2000";
+
+	aliases {
+		i2c4 = &i2c4;
+		mmc0 = &sdhci0;
+		serial0 = &uart0;
+		spi3 = &spi3;
+	};
+
+	chosen {
+		stdout-path = "serial0:115200n8";
+	};
+};
+
+&osc {
+	clock-frequency = <25000000>;
+};
+
+&dmac {
+	status = "okay";
+};
+
+&emmc {
+	bus-width = <4>;
+	no-1-8-v;
+	cap-mmc-hw-reset;
+	no-sd;
+	no-sdio;
+	non-removable;
+	status = "okay";
+};
+
+&gmac0 {
+	status = "okay";
+};
+
+&i2c4 {
+	status = "okay";
+};
+
+&mdio {
+	status = "okay";
+};
+
+&saradc {
+	status = "okay";
+};
+
+&sdhci0 {
+	bus-width = <4>;
+	no-1-8-v;
+	disable-wp;
+	status = "okay";
+};
+
+&sdhci1 {
+	bus-width = <4>;
+	cap-sdio-irq;
+	no-mmc;
+	no-sd;
+	non-removable;
+	status = "okay";

arch/arm64/boot/dts/sophgo/sg2000-milkv-duo-s.dts line 80

Quoted 10 lines
arch/arm64/boot/dts/sophgo/sg2000-milkv-duo-s.dts new file +10 -0
+};
+
+&spi3 {
+	status = "okay";
+};
+
+&uart0 {
+	status = "okay";
+};
+

I managed to boot the board and run tests:

Tested successfully:

* uart0: boot console
* mmc0 (sdhci0?): root filesystem

Issues

*

eth0:

ifconfig eth0 172.24.0.2

   [ 48.893725] stmmaceth 4070000.ethernet eth0: Register
   MEM_TYPE_PAGE_POOL RxQ-0
   [ 48.903077] stmmaceth 4070000.ethernet eth0: cannot attach to PHY
   (error: -ENODEV)
   ifconfig: SIOCSIFFLAGS: No such device

I believe I have all drivers enabled though...

* emmc:

   [ 2.730194] mmc2: Failed to initialize a non-removable card
   [ 2.764843] mmc1: Failed to initialize a non-removable card

I tested with a board that has an eMMC

* i2c4: detected by "i2cdetect -l"
but no devices found by "i2cdetect -r 4"
I tried both pins 3/4 and pins 50/48, with two different devices connected to the bus.
Which pins did you use? I could check the SoC pin muxing, but your answer will save me time :D

Would you mind sharing your defconfig file ("make savedefconfig") via a private message or through a link (to avoid sending the entire file to the list)? Thanks again
Cheers
Michael.

Signature · 4 lines
Michael Opdenacker
Root Commit
Yocto Project and OpenEmbedded Training course - Learn by doing:
https://rootcommit.com/training/yocto/
#7 lore raw

Re: [PATCH v3 2/5] arm64: dts: sophgo: add initial Milk-V Duo S board support

Greetings,

Quoted 9 lines · Michael Opdenacker

I managed to boot the board and run tests:

Tested successfully:

 * uart0: boot console
 * mmc0 (sdhci0?): root filesystem

Issues

...
I realize I replied to the arm64 part of the thread, but indeed I ran my tests on riscv. Michael.

Signature · 10 lines
Michael Opdenacker
Root Commit
Yocto Project and OpenEmbedded Training course - Learn by doing:
https://rootcommit.com/training/yocto/


_______________________________________________
linux-riscv mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/linux-riscv
#8 lore raw

Re: [PATCH v3 2/5] arm64: dts: sophgo: add initial Milk-V Duo S board support

Hi Michael,

Not sure what is going on with your eth or i2c as I donyt see those errors, let me try testing the riscv side as I have been running most of my tests on the arm64 side and have not run the riscv tests in a bit.

I used pins 3/5 for i2c4 using i2cdetect -y -a -r 4. It seems the docs might have SDA and SCL reversed, unless my i2c test device has it backwards I have SCL connected to pin 3 and SDA connected to pin 5.

I am using an SD card variant and have not touched emmc myself.

Take care,
- Joshua Milas

#9 lore raw

PATCH v3 3/5 dt-bindings: soc: sophgo: add sg2000 plic and clint documentation

In reply to Joshua Milas

Document the compatible strings for the sg2000 [1] interrupt controller and timer.

---
 .../bindings/interrupt-controller/sifive,plic-1.0.0.yaml         | 1 +
 Documentation/devicetree/bindings/timer/sifive,clint.yaml        | 1 +
 2 files changed, 2 insertions(+)
Documentation/devicetree/bindings/interrupt-controller/sifive,plic-1.0.0.yaml +1 -0
index 5b827bc243011..122d622d20a57 100644
@@ -69,6 +69,7 @@ properties:
               - allwinner,sun20i-d1-plic
               - sophgo,cv1800b-plic
               - sophgo,cv1812h-plic
+              - sophgo,sg2000-plic
               - sophgo,sg2002-plic
               - sophgo,sg2042-plic
               - sophgo,sg2044-plic
Documentation/devicetree/bindings/timer/sifive,clint.yaml +1 -0
index d85a1a088b35d..42cbfb4d46a17 100644
@@ -48,6 +48,7 @@ properties:
               - allwinner,sun20i-d1-clint
               - sophgo,cv1800b-clint
               - sophgo,cv1812h-clint
+              - sophgo,sg2000-clint
               - sophgo,sg2002-clint
               - thead,th1520-clint
           - const: thead,c900-clint
Signature · 1 line
2.51.1
#10 lore raw

PATCH v3 4/5 riscv64: dts: sophgo: add SG2000 dtsi

In reply to Joshua Milas

Adds sg2000.dtsi on the RISCV side.

---
 arch/riscv/boot/dts/sophgo/sg2000.dtsi | 53 ++++++++++++++++++++++++++
 1 file changed, 53 insertions(+)
 create mode 100644 arch/riscv/boot/dts/sophgo/sg2000.dtsi
arch/riscv/boot/dts/sophgo/sg2000.dtsi new file +53 -0
new file mode 100644
index 0000000000000..412adacc00576
@@ -0,0 +1,53 @@
+// SPDX-License-Identifier: (GPL-2.0 OR MIT)
+
+#define SOC_PERIPHERAL_IRQ(nr)	((nr) + 16)
+
+#include <dt-bindings/interrupt-controller/irq.h>
+#include <dt-bindings/pinctrl/pinctrl-sg2000.h>
+#include "cv180x-cpus.dtsi"
+#include "cv180x.dtsi"
+#include "cv181x.dtsi"
+
+/ {
+	compatible = "sophgo,sg2000";
+
+	memory@80000000 {
+		device_type = "memory";
+		reg = <0x80000000 0x10000000>;
+	};
+
+	soc {
+		interrupt-parent = <&plic>;
+		dma-noncoherent;
+
+		pinctrl: pinctrl@3001000 {
+			compatible = "sophgo,sg2000-pinctrl";
+			reg = <0x03001000 0x1000>,
+			      <0x05027000 0x1000>;
+			reg-names = "sys", "rtc";
+		};
+
+		clk: clock-controller@3002000 {
+			compatible = "sophgo,sg2000-clk";
+			reg = <0x03002000 0x1000>;
+			clocks = <&osc>;
+			#clock-cells = <1>;
+		};
+
+		plic: interrupt-controller@70000000 {
+			compatible = "sophgo,sg2000-plic", "thead,c900-plic";
+			reg = <0x70000000 0x4000000>;
+			interrupts-extended = <&cpu0_intc 11>, <&cpu0_intc 9>;
+			interrupt-controller;
+			#address-cells = <0>;
+			#interrupt-cells = <2>;
+			riscv,ndev = <101>;
+		};
+
+		clint: timer@74000000 {
+			compatible = "sophgo,sg2000-clint", "thead,c900-clint";
+			reg = <0x74000000 0x10000>;
+			interrupts-extended = <&cpu0_intc 3>, <&cpu0_intc 7>;
+		};
+	};
+};
Signature · 1 line
2.51.1
#11 lore raw

PATCH v3 5/5 riscv64: dts: sophgo: add initial Milk-V Duo S board support

In reply to Joshua Milas

This adds initial riscv support for the Milk-V Duo S board
[1] making it possible to boot Linux to the command line.

---
 arch/riscv/boot/dts/sophgo/Makefile           |  1 +
 .../boot/dts/sophgo/sg2000-milkv-duo-s.dts    | 80 +++++++++++++++++++
 2 files changed, 81 insertions(+)
 create mode 100644 arch/riscv/boot/dts/sophgo/sg2000-milkv-duo-s.dts
arch/riscv/boot/dts/sophgo/Makefile +1 -0
index 6f65526d4193b..58cc6b70d8de4 100644
@@ -1,6 +1,7 @@
 # SPDX-License-Identifier: GPL-2.0
 dtb-$(CONFIG_ARCH_SOPHGO) += cv1800b-milkv-duo.dtb
 dtb-$(CONFIG_ARCH_SOPHGO) += cv1812h-huashan-pi.dtb
+dtb-$(CONFIG_ARCH_SOPHGO) += sg2000-milkv-duo-s.dtb
 dtb-$(CONFIG_ARCH_SOPHGO) += sg2002-licheerv-nano-b.dtb
 dtb-$(CONFIG_ARCH_SOPHGO) += sg2042-milkv-pioneer.dtb
 dtb-$(CONFIG_ARCH_SOPHGO) += sg2042-evb-v1.dtb
arch/riscv/boot/dts/sophgo/sg2000-milkv-duo-s.dts new file +80 -0

80 lines not on this page · raw message

Signature · 1 line
2.51.1
#12 lore raw
In reply to Joshua Milas
Quoted 7 lines · Joshua Milas

This adds an initial device tree for the Milk-V Duo S board with support for reading from the SD card and network over Ethernet. This is continued work from Michael Opdenacker's v6 series [1] on the ARM64 and RISCV side. It has been tested with ARM64 and RISCV64 to boot from an SD card, have networking, and read I2C slave devices over i2c4.

Quoted 6 lines

v3
- Added sg2000 interrupt controller and timer to documentation
- Added sg2000.dtsi for RISCV and moved DTS over to use it
- remove devices from DTS's to match what is available in the default pinmux config. spi0-2, i2c0-3, uart1-4
- Added i2c4 and spi3 aliases

How did you resolve previous comments on bindings? Nothing mentioned here.

Best regards,
Krzysztof