Open geerlingguy opened 4 months ago
After speaking with Milk-V about some of their RISC-V boards, they wanted to send over a Jupiter for me to test. I plan on running it through my usual tests, and also seeing how the board behaves as a regular ol' PC ITX board, testing front panel connectors, USB 3.0 and other IO. It also comes with a heatsink/fan (a pretty small one, mind you), and an IO shield. I haven't unboxed it fully but will hopefully do that tomorrow or Monday!
First test round will be with https://github.com/milkv-jupiter/jupiter-ubuntu-build/releases - Ubuntu 23.10 desktop release 1.0.8. I will flash it to a microSD card first.
First challenge: I can't determine what pins to use for a front panel power button connection on the F_PANEL header, so I opened the linked issue to see if someone can help with that.
I assume the board will just power on like a typical SBC when I apply DC_IN or PD power via the Type C port (according to their documentation. I will probably power the board with 12VDC for now, but may attach an ATX power supply to test that out too. [Edit: The board doesn't power on automatically, so I will need to figure out how to press the power button on the F_PANEL header I think.]
Apparently there's some amount of standardization in the world... got this from Milk-V:
It does seem to boot up immediately upon getting power. To hard-power-off, hold down the power button for 5 seconds (or maybe 6 or so). To boot up again, press the power button for 1-2s.
I can boot and log in via serial console; it also has an Ethernet connection, at 1 Gbps, and I can access it via UART or SSH, but so far I don't have an HDMI output working. xrandr
gives me 'Couldn't open display'. I will try another HDMI monitor and see if that works. For some reason a lot of RISC-V boards don't seem to like my HP EliteDisplay E231.
The docs for the Jupiter describe using gparted
to expand the SD partition, but I elected to use the RVSpace guide Extend Partition on SD Card or eMMC.
root@milkv-jupiter:~# resize2fs /dev/mmcblk0p6
resize2fs 1.47.0 (5-Feb-2023)
Filesystem at /dev/mmcblk0p6 is mounted on /; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 15
The filesystem on /dev/mmcblk0p6 is now 30571264 (4k) blocks long.
root@milkv-jupiter:~# df -h
Filesystem Size Used Avail Use% Mounted on
tmpfs 1.6G 6.3M 1.6G 1% /run
/dev/mmcblk0p6 115G 4.0G 106G 4% /
tmpfs 7.8G 0 7.8G 0% /dev/shm
tmpfs 5.0M 12K 5.0M 1% /run/lock
/dev/mmcblk0p5 224M 27M 180M 13% /boot
tmpfs 1.6G 112K 1.6G 1% /run/user/120
tmpfs 1.6G 64K 1.6G 1% /run/user/0
I was originally wondering if the fan or fan connector was dead, but no—just the heatsink seems to be good enough for 99% of the time—the fan will only spin up deep into a multicore test, and briefly at that. It's noticeable but not annoying the few times it does spin up.
I'm able to get the HDMI output to feed into OBS through my CamLink 4K, so it's probably an incompatibility with that HP monitor:
So far I'm unable to activate Bluetooth or see any WiFi settings, and I'm wondering if that's due to the Ubuntu image not including drivers or something. Need to do a little more exploration there.
I just noticed there's a newer release of the 23.10 desktop: https://github.com/milkv-jupiter/jupiter-ubuntu-build/releases/tag/v1.0.9
(As well as Bianbu). Fedora also has a RISC-V task force building images for the Jupiter—see the downloadable images here: https://mirror.iscas.ac.cn/fedora-riscv/dl/Milk-V/Jupiter/images/latest/
Notes on Bianbu OS minimal install:
nmcli
, openssh-server
, lsusb
, or lspci
(have to apt install network-manager rfkill openssh-server usbutils pciutils
etc.sudo dpkg-reconfigure locales
and select your language.As with the Ubuntu image, I'm not seeing the WiFi device, just the two Ethernet ports and a sit0
interface (something to do with IPv6 I think):
root@milkv-jupiter:~# nmcli d
DEVICE TYPE STATE CONNECTION
end0 ethernet unmanaged --
end1 ethernet unmanaged --
sit0 iptunnel unmanaged --
lo loopback unmanaged --
Bluetooth looks to be present, at least:
root@milkv-jupiter:~# rfkill
ID TYPE DEVICE SOFT HARD
0 bluetooth spacemit-bt blocked unblocked
I opened the issue on the Milk-V community forum WiFi under Ubuntu not working.
I'm also re-running Geekbench 6 under the Bianbu minimal install to see if there's any difference between it and the Ubuntu release.
[Edit: Heh, identical result, 78/356.]
I've also asked on the Community forum about the SATAPWR1
and 2
headers, which look like 4-pin ATX fan connectors, but I'm scared to plug in a fan to one of them in case the pinout is incorrect :)
It would be nice to provide a couple fan headers so I can run a case fan off the ITX board, but I'm not sure if those are wired up to any PWM controls.
Fedora 40 with Gnome runs stable, if slow. No GPU drivers present in that build, it seems—everything goes to the CPU and runs a bit slowish. YouTube can kinda play back at 240p, whereas on Bianbu and Ubuntu I can hit 720p passably.
I'm also not able to enable Bluetooth (which seems to be present) or WiFi (which is not, like on the other OSes).
I don't seem to be getting any GPU acceleration under Ubuntu or Bianbu, at least not by default... it seems like they should both be able to render a lot better using the built-in GPU (see Banana Pi BPI-F3 here).
Kioxia XG8 over PCIe:
0001:01:00.0 Non-Volatile memory controller: KIOXIA Corporation NVMe SSD Controller XG8 (rev 01) (prog-if 02 [NVM Express])
Subsystem: KIOXIA Corporation Device 0001
Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx+
Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
Latency: 0
Interrupt: pin A routed to IRQ 56
Region 0: Memory at 90200000 (64-bit, non-prefetchable) [size=16K]
Capabilities: [80] Power Management version 3
Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA PME(D0-,D1-,D2-,D3hot-,D3cold-)
Status: D0 NoSoftRst+ PME-Enable- DSel=0 DScale=0 PME-
Capabilities: [90] MSI: Enable- Count=1/32 Maskable+ 64bit+
Address: 0000000000000000 Data: 0000
Masking: 00000000 Pending: 00000000
Capabilities: [b0] MSI-X: Enable+ Count=65 Masked-
Vector table: BAR=0 offset=00002000
PBA: BAR=0 offset=00003000
Capabilities: [c0] Express (v2) Endpoint, MSI 00
DevCap: MaxPayload 256 bytes, PhantFunc 0, Latency L0s unlimited, L1 unlimited
ExtTag+ AttnBtn- AttnInd- PwrInd- RBE+ FLReset+ SlotPowerLimit 0W
DevCtl: CorrErr+ NonFatalErr+ FatalErr+ UnsupReq+
RlxdOrd- ExtTag+ PhantFunc- AuxPwr- NoSnoop- FLReset-
MaxPayload 128 bytes, MaxReadReq 512 bytes
DevSta: CorrErr- NonFatalErr- FatalErr- UnsupReq- AuxPwr- TransPend-
LnkCap: Port #0, Speed 16GT/s, Width x4, ASPM L1, Exit Latency L1 <32us
ClockPM- Surprise- LLActRep- BwNot- ASPMOptComp+
LnkCtl: ASPM Disabled; RCB 64 bytes, Disabled- CommClk+
ExtSynch- ClockPM- AutWidDis- BWInt- AutBWInt-
LnkSta: Speed 5GT/s (downgraded), Width x1 (downgraded)
TrErr- Train- SlotClk+ DLActive- BWMgmt- ABWMgmt-
DevCap2: Completion Timeout: Range ABCD, TimeoutDis+ NROPrPrP- LTR+
10BitTagComp+ 10BitTagReq- OBFF Not Supported, ExtFmt+ EETLPPrefix-
EmergencyPowerReduction Not Supported, EmergencyPowerReductionInit-
FRS- TPHComp- ExtTPHComp-
AtomicOpsCap: 32bit- 64bit- 128bitCAS-
DevCtl2: Completion Timeout: 50us to 50ms, TimeoutDis- LTR+ 10BitTagReq- OBFF Disabled,
AtomicOpsCtl: ReqEn-
LnkCap2: Supported Link Speeds: 2.5-16GT/s, Crosslink- Retimer+ 2Retimers+ DRS-
LnkCtl2: Target Link Speed: 16GT/s, EnterCompliance- SpeedDis-
Transmit Margin: Normal Operating Range, EnterModifiedCompliance- ComplianceSOS-
Compliance Preset/De-emphasis: -6dB de-emphasis, 0dB preshoot
LnkSta2: Current De-emphasis Level: -6dB, EqualizationComplete- EqualizationPhase1-
EqualizationPhase2- EqualizationPhase3- LinkEqualizationRequest-
Retimer- 2Retimers- CrosslinkRes: unsupported
Capabilities: [100 v2] Advanced Error Reporting
UESta: DLP- SDES- TLP- FCP- CmpltTO- CmpltAbrt- UnxCmplt- RxOF- MalfTLP- ECRC- UnsupReq- ACSViol-
UEMsk: DLP- SDES- TLP- FCP- CmpltTO- CmpltAbrt- UnxCmplt- RxOF- MalfTLP- ECRC- UnsupReq- ACSViol-
UESvrt: DLP+ SDES- TLP- FCP+ CmpltTO- CmpltAbrt- UnxCmplt- RxOF+ MalfTLP+ ECRC- UnsupReq- ACSViol-
CESta: RxErr- BadTLP- BadDLLP- Rollover- Timeout- AdvNonFatalErr-
CEMsk: RxErr- BadTLP- BadDLLP- Rollover- Timeout- AdvNonFatalErr+
AERCap: First Error Pointer: 00, ECRCGenCap+ ECRCGenEn- ECRCChkCap+ ECRCChkEn-
MultHdrRecCap- MultHdrRecEn- TLPPfxPres- HdrLogCap-
HeaderLog: 00000000 00000000 00000000 00000000
Capabilities: [150 v1] Virtual Channel
Caps: LPEVC=0 RefClk=100ns PATEntryBits=1
Arb: Fixed- WRR32- WRR64- WRR128-
Ctrl: ArbSelect=Fixed
Status: InProgress-
VC0: Caps: PATOffset=00 MaxTimeSlots=1 RejSnoopTrans-
Arb: Fixed- WRR32- WRR64- WRR128- TWRR128- WRR256-
Ctrl: Enable+ ID=0 ArbSelect=Fixed TC/VC=ff
Status: NegoPending- InProgress-
Capabilities: [260 v1] Latency Tolerance Reporting
Max snoop latency: 0ns
Max no snoop latency: 0ns
Capabilities: [300 v1] Secondary PCI Express
LnkCtl3: LnkEquIntrruptEn- PerformEqu-
LaneErrStat: 0
Capabilities: [360 v1] Data Link Feature <?>
Capabilities: [380 v1] Physical Layer 16.0 GT/s <?>
Capabilities: [400 v1] L1 PM Substates
L1SubCap: PCI-PM_L1.2+ PCI-PM_L1.1+ ASPM_L1.2+ ASPM_L1.1- L1_PM_Substates+
PortCommonModeRestoreTime=60us PortTPowerOnTime=150us
L1SubCtl1: PCI-PM_L1.2- PCI-PM_L1.1- ASPM_L1.2- ASPM_L1.1-
T_CommonMode=0us LTR1.2_Threshold=0ns
L1SubCtl2: T_PwrOn=10us
Capabilities: [470 v1] Lane Margining at the Receiver <?>
Kernel driver in use: nvme
Testing my 32GB eMMC module that I used before with Rock 5 B:
root@milkv-jupiter:~# dmesg | grep mmc2
[ 4.279458] mmc2: new HS400 Enhanced strobe MMC card at address 0001
[ 4.286636] mmcblk2: mmc2:0001 DA4032 29.1 GiB
[ 4.295504] mmcblk2boot0: mmc2:0001 DA4032 4.00 MiB
[ 4.301771] mmcblk2boot1: mmc2:0001 DA4032 4.00 MiB
[ 4.307801] mmcblk2rpmb: mmc2:0001 DA4032 16.0 MiB, chardev (242:0)
[ 4.314220] mmc2: SDHCI controller on d4281000.sdh [d4281000.sdh] using ADMA
Adding the results for that and NVMe up in the OP.
I also tested Docker on this board, since that's something called out in the Jupiter's documentation. Installing was easy (install docker.io
and that's it!). The hello-world
image runs successfully, and there are a few hundred risc-v supporting images on Docker Hub already. I was able to run Debian and Alpine easy enough, though httpd
(Apache) doesn't have a riscv64 build yet.
For many images, like Redis, they say riscv64
is in the supported architectures, but that's not on the main image. You have to instead use riscv64/redis, and there's no latest
tag on that repo, so you have to dig around and find a tag you like, for example:
root@milkv-jupiter:~# docker run --name some-redis -d redis
Unable to find image 'redis:latest' locally
latest: Pulling from library/redis
docker: no matching manifest for linux/riscv64 in the manifest list entries.
See 'docker run --help'.
root@milkv-jupiter:~# docker run --name some-redis -d riscv64/redis
Unable to find image 'riscv64/redis:latest' locally
docker: Error response from daemon: manifest for riscv64/redis:latest not found: manifest unknown: manifest unknown.
See 'docker run --help'.
root@milkv-jupiter:~# docker run --name some-redis -d riscv64/redis:7.4-rc-alpine3.20
Unable to find image 'riscv64/redis:7.4-rc-alpine3.20' locally
7.4-rc-alpine3.20: Pulling from riscv64/redis
d4714cc4c8bb: Pull complete
5923aa7cbf3a: Pull complete
5431027fcd2f: Pull complete
e01b77e4c90b: Pull complete
1789fa2a0e8f: Pull complete
2d89db90b7dd: Pull complete
4f4fb700ef54: Pull complete
f90f4ee3aef7: Pull complete
Digest: sha256:03d38d93104eb9f10aaa01b63cf1a7f2f18f7389103cf097b4d51f3e036dd5fd
Status: Downloaded newer image for riscv64/redis:7.4-rc-alpine3.20
502e8abbd2f57af0081e0441108741468588dc9906acb995fc5a3bd702582da5
root@milkv-jupiter:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
502e8abbd2f5 riscv64/redis:7.4-rc-alpine3.20 "docker-entrypoint.s…" 5 seconds ago Up 3 seconds 6379/tcp some-redis
It feels like the armv7
/arm64
situation 5-8 years ago currently; if you do a lot with containers, expect to have to build your own on top of the primitives for a while, yet. And some software compiles, some doesn't (without some tweaking), so it's not for the 'driveby sysadmin' yet, you have to actually know the basics to be productive.
Wrote up a blog post on it: The state of Docker on popular RISC-V platforms.
Testing an old AMD R5 230 2GB GPU, I plugged it into the board while powered off, and was surprised to see the fan spin up—thus I opened PCIe slot powered even when Jupiter is powered off.
The system boots with the card installed, and dmesg
shows:
root@milkv-jupiter:~# dmesg | grep pci
[ 1.086178] k1x-dwc-pcie ca400000.pcie: has no power on gpio.
[ 1.089319] k1x-dwc-pcie ca400000.pcie: host bridge /soc/pcie@ca400000 ranges:
[ 1.096423] k1x-dwc-pcie ca400000.pcie: IO 0x009f002000..0x009f101fff -> 0x009f002000
[ 1.108832] k1x-dwc-pcie ca400000.pcie: MEM 0x0090000000..0x009effffff -> 0x0090000000
[ 1.217346] k1x-dwc-pcie ca400000.pcie: iATU unroll: enabled
[ 1.220160] k1x-dwc-pcie ca400000.pcie: iATU regions: 8 ob, 8 ib, align 4K, limit 4G
[ 1.321974] k1x-dwc-pcie ca400000.pcie: PCIe Gen.2 x1 link up
[ 1.325021] k1x-dwc-pcie ca400000.pcie: PCI host bridge to bus 0001:00
[ 1.331479] pci_bus 0001:00: root bus resource [bus 00-ff]
[ 1.337026] pci_bus 0001:00: root bus resource [io 0x0000-0xfffff] (bus address [0x9f002000-0x9f101fff])
[ 1.346667] pci_bus 0001:00: root bus resource [mem 0x90000000-0x9effffff]
[ 1.353630] pci 0001:00:00.0: [1e5d:3003] type 01 class 0x060400
[ 1.359691] pci 0001:00:00.0: reg 0x10: [mem 0x00000000-0x000fffff]
[ 1.366021] pci 0001:00:00.0: reg 0x14: [mem 0x00000000-0x000fffff]
[ 1.372402] pci 0001:00:00.0: supports D1
[ 1.376433] pci 0001:00:00.0: PME# supported from D0 D1 D3hot D3cold
[ 1.386229] pci 0001:01:00.0: [1e0f:0010] type 00 class 0x010802
[ 1.389450] pci 0001:01:00.0: reg 0x10: [mem 0x00000000-0x00003fff 64bit]
[ 1.396740] pci 0001:01:00.0: 4.000 Gb/s available PCIe bandwidth, limited by 5.0 GT/s PCIe x1 link at 0001:00:00.0 (capable of 63.012 Gb/s with 16.0 GT/s PCIe x4 link)
[ 1.422008] pci_bus 0001:01: busn_res: [bus 01-ff] end is updated to 01
[ 1.425792] pci 0001:00:00.0: BAR 0: assigned [mem 0x90000000-0x900fffff]
[ 1.432639] pci 0001:00:00.0: BAR 1: assigned [mem 0x90100000-0x901fffff]
[ 1.439492] pci 0001:00:00.0: BAR 8: assigned [mem 0x90200000-0x902fffff]
[ 1.446350] pci 0001:01:00.0: BAR 0: assigned [mem 0x90200000-0x90203fff 64bit]
[ 1.453757] pci 0001:00:00.0: PCI bridge to [bus 01]
[ 1.458762] pci 0001:00:00.0: bridge window [mem 0x90200000-0x902fffff]
[ 1.467122] pcieport 0001:00:00.0: PME: Signaling with IRQ 57
[ 1.471799] pcieport 0001:00:00.0: AER: enabled with IRQ 57
[ 1.477672] k1x-dwc-pcie ca800000.pcie: has no power on gpio.
[ 1.483091] k1x-dwc-pcie ca800000.pcie: host bridge /soc/pcie@ca800000 ranges:
[ 1.490276] k1x-dwc-pcie ca800000.pcie: IO 0x00b7002000..0x00b7101fff -> 0x00b7002000
[ 1.498627] k1x-dwc-pcie ca800000.pcie: MEM 0x00a0000000..0x00b6ffffff -> 0x00a0000000
[ 1.607112] k1x-dwc-pcie ca800000.pcie: iATU unroll: enabled
[ 1.609908] k1x-dwc-pcie ca800000.pcie: iATU regions: 8 ob, 8 ib, align 4K, limit 4G
[ 1.709979] k1x-dwc-pcie ca800000.pcie: PCIe Gen.1 x2 link up
[ 1.712979] k1x-dwc-pcie ca800000.pcie: PCI host bridge to bus 0002:00
[ 1.719480] pci_bus 0002:00: root bus resource [bus 00-ff]
[ 1.725028] pci_bus 0002:00: root bus resource [io 0x100000-0x1fffff] (bus address [0xb7002000-0xb7101fff])
[ 1.734927] pci_bus 0002:00: root bus resource [mem 0xa0000000-0xb6ffffff]
[ 1.741889] pci 0002:00:00.0: [1e5d:3003] type 01 class 0x060400
[ 1.747954] pci 0002:00:00.0: reg 0x10: [mem 0x00000000-0x000fffff]
[ 1.754284] pci 0002:00:00.0: reg 0x14: [mem 0x00000000-0x000fffff]
[ 1.760669] pci 0002:00:00.0: supports D1
[ 1.764700] pci 0002:00:00.0: PME# supported from D0 D1 D3hot D3cold
[ 1.774431] pci 0002:01:00.0: [1002:6779] type 00 class 0x030000
[ 1.777668] pci 0002:01:00.0: reg 0x10: [mem 0x00000000-0x0fffffff 64bit pref]
[ 1.784940] pci 0002:01:00.0: reg 0x18: [mem 0x00000000-0x0001ffff 64bit]
[ 1.791770] pci 0002:01:00.0: reg 0x20: [io 0x0000-0x00ff]
[ 1.797433] pci 0002:01:00.0: reg 0x30: [mem 0x00000000-0x0001ffff pref]
[ 1.804183] pci 0002:01:00.0: enabling Extended Tags
[ 1.809404] pci 0002:01:00.0: supports D1 D2
[ 1.813653] pci 0002:01:00.0: 4.000 Gb/s available PCIe bandwidth, limited by 2.5 GT/s PCIe x2 link at 0002:00:00.0 (capable of 32.000 Gb/s with 2.5 GT/s PCIe x16 link)
[ 1.828887] pci 0002:01:00.0: vgaarb: setting as boot VGA device
[ 1.834709] pci 0002:01:00.0: vgaarb: bridge control possible
[ 1.840524] pci 0002:01:00.0: vgaarb: VGA device added: decodes=io+mem,owns=none,locks=none
[ 1.849042] pci 0002:01:00.1: [1002:aa98] type 00 class 0x040300
[ 1.855098] pci 0002:01:00.1: reg 0x10: [mem 0x00000000-0x00003fff 64bit]
[ 1.862025] pci 0002:01:00.1: enabling Extended Tags
[ 1.867128] pci 0002:01:00.1: supports D1 D2
[ 1.882020] pci_bus 0002:01: busn_res: [bus 01-ff] end is updated to 01
[ 1.885803] pci 0002:00:00.0: BAR 9: assigned [mem 0xa0000000-0xafffffff 64bit pref]
[ 1.893605] pci 0002:00:00.0: BAR 0: assigned [mem 0xb0000000-0xb00fffff]
[ 1.900458] pci 0002:00:00.0: BAR 1: assigned [mem 0xb0100000-0xb01fffff]
[ 1.907313] pci 0002:00:00.0: BAR 8: assigned [mem 0xb0200000-0xb02fffff]
[ 1.914168] pci 0002:00:00.0: BAR 7: assigned [io 0x100000-0x100fff]
[ 1.920682] pci 0002:01:00.0: BAR 0: assigned [mem 0xa0000000-0xafffffff 64bit pref]
[ 1.928527] pci 0002:01:00.0: BAR 2: assigned [mem 0xb0200000-0xb021ffff 64bit]
[ 1.935904] pci 0002:01:00.0: BAR 6: assigned [mem 0xb0220000-0xb023ffff pref]
[ 1.943163] pci 0002:01:00.1: BAR 0: assigned [mem 0xb0240000-0xb0243fff 64bit]
[ 1.950574] pci 0002:01:00.0: BAR 4: assigned [io 0x100000-0x1000ff]
[ 1.957059] pci 0002:00:00.0: PCI bridge to [bus 01]
[ 1.962085] pci 0002:00:00.0: bridge window [io 0x100000-0x100fff]
[ 1.968595] pci 0002:00:00.0: bridge window [mem 0xb0200000-0xb02fffff]
[ 1.975458] pci 0002:00:00.0: bridge window [mem 0xa0000000-0xafffffff 64bit pref]
[ 1.984783] pcieport 0002:00:00.0: PME: Signaling with IRQ 61
[ 1.989420] pcieport 0002:00:00.0: AER: enabled with IRQ 61
[ 1.994901] pci 0002:01:00.1: D0 power state depends on 0002:01:00.0
[ 2.187511] nvme nvme0: pci function 0001:01:00.0
Then there's lspci
:
0002:01:00.0 VGA compatible controller: Advanced Micro Devices, Inc. [AMD/ATI] Caicos [Radeon HD 6450/7450/8450 / R5 230 OEM] (prog-if 00 [VGA controller])
Subsystem: Hightech Information System Ltd. Caicos [Radeon HD 6450/7450/8450 / R5 230 OEM]
Control: I/O- Mem- BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
Interrupt: pin A routed to IRQ 255
Region 0: Memory at a0000000 (64-bit, prefetchable) [disabled] [size=256M]
Region 2: Memory at b0200000 (64-bit, non-prefetchable) [disabled] [size=128K]
Region 4: I/O ports at 100000 [disabled] [size=256]
Expansion ROM at b0220000 [virtual] [disabled] [size=128K]
Capabilities: [50] Power Management version 3
Flags: PMEClk- DSI- D1+ D2+ AuxCurrent=0mA PME(D0-,D1-,D2-,D3hot-,D3cold-)
Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME-
Capabilities: [58] Express (v2) Legacy Endpoint, MSI 00
DevCap: MaxPayload 256 bytes, PhantFunc 0, Latency L0s <4us, L1 unlimited
ExtTag+ AttnBtn- AttnInd- PwrInd- RBE+ FLReset-
DevCtl: CorrErr+ NonFatalErr+ FatalErr+ UnsupReq+
RlxdOrd+ ExtTag+ PhantFunc- AuxPwr- NoSnoop+
MaxPayload 128 bytes, MaxReadReq 512 bytes
DevSta: CorrErr+ NonFatalErr- FatalErr- UnsupReq+ AuxPwr- TransPend-
LnkCap: Port #0, Speed 2.5GT/s, Width x16, ASPM L0s L1, Exit Latency L0s <64ns, L1 <1us
ClockPM- Surprise- LLActRep- BwNot- ASPMOptComp-
LnkCtl: ASPM Disabled; RCB 64 bytes, Disabled- CommClk+
ExtSynch- ClockPM- AutWidDis- BWInt- AutBWInt-
LnkSta: Speed 2.5GT/s, Width x2 (downgraded)
TrErr- Train- SlotClk+ DLActive- BWMgmt- ABWMgmt-
DevCap2: Completion Timeout: Range ABCD, TimeoutDis+ NROPrPrP- LTR-
10BitTagComp- 10BitTagReq- OBFF Not Supported, ExtFmt- EETLPPrefix-
EmergencyPowerReduction Not Supported, EmergencyPowerReductionInit-
FRS-
AtomicOpsCap: 32bit- 64bit- 128bitCAS-
DevCtl2: Completion Timeout: 50us to 50ms, TimeoutDis- LTR- 10BitTagReq- OBFF Disabled,
AtomicOpsCtl: ReqEn-
LnkCtl2: Target Link Speed: 2.5GT/s, EnterCompliance- SpeedDis-
Transmit Margin: Normal Operating Range, EnterModifiedCompliance- ComplianceSOS-
Compliance Preset/De-emphasis: -6dB de-emphasis, 0dB preshoot
LnkSta2: Current De-emphasis Level: -6dB, EqualizationComplete- EqualizationPhase1-
EqualizationPhase2- EqualizationPhase3- LinkEqualizationRequest-
Retimer- 2Retimers- CrosslinkRes: unsupported
Capabilities: [a0] MSI: Enable- Count=1/1 Maskable- 64bit+
Address: 0000000000000000 Data: 0000
Capabilities: [100 v1] Vendor Specific Information: ID=0001 Rev=1 Len=010 <?>
Capabilities: [150 v1] Advanced Error Reporting
UESta: DLP- SDES- TLP- FCP- CmpltTO- CmpltAbrt- UnxCmplt- RxOF- MalfTLP- ECRC- UnsupReq- ACSViol-
UEMsk: DLP- SDES- TLP- FCP- CmpltTO- CmpltAbrt- UnxCmplt- RxOF- MalfTLP- ECRC- UnsupReq- ACSViol-
UESvrt: DLP+ SDES+ TLP- FCP+ CmpltTO- CmpltAbrt- UnxCmplt- RxOF+ MalfTLP+ ECRC- UnsupReq- ACSViol-
CESta: RxErr- BadTLP- BadDLLP- Rollover- Timeout- AdvNonFatalErr+
CEMsk: RxErr- BadTLP- BadDLLP- Rollover- Timeout- AdvNonFatalErr+
AERCap: First Error Pointer: 00, ECRCGenCap+ ECRCGenEn- ECRCChkCap+ ECRCChkEn-
MultHdrRecCap- MultHdrRecEn- TLPPfxPres- HdrLogCap-
HeaderLog: 00000000 00000000 00000000 00000000
0002:01:00.1 Audio device: Advanced Micro Devices, Inc. [AMD/ATI] Caicos HDMI Audio [Radeon HD 6450 / 7450/8450/8490 OEM / R5 230/235/235X OEM]
Subsystem: Hightech Information System Ltd. Caicos HDMI Audio [Radeon HD 6450 / 7450/8450/8490 OEM / R5 230/235/235X OEM]
Control: I/O- Mem- BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
Interrupt: pin B routed to IRQ 255
Region 0: Memory at b0240000 (64-bit, non-prefetchable) [disabled] [size=16K]
Capabilities: [50] Power Management version 3
Flags: PMEClk- DSI- D1+ D2+ AuxCurrent=0mA PME(D0-,D1-,D2-,D3hot-,D3cold-)
Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME-
Capabilities: [58] Express (v2) Legacy Endpoint, MSI 00
DevCap: MaxPayload 256 bytes, PhantFunc 0, Latency L0s <4us, L1 unlimited
ExtTag+ AttnBtn- AttnInd- PwrInd- RBE+ FLReset-
DevCtl: CorrErr+ NonFatalErr+ FatalErr+ UnsupReq+
RlxdOrd+ ExtTag+ PhantFunc- AuxPwr- NoSnoop+
MaxPayload 128 bytes, MaxReadReq 512 bytes
DevSta: CorrErr+ NonFatalErr- FatalErr- UnsupReq+ AuxPwr- TransPend-
LnkCap: Port #0, Speed 2.5GT/s, Width x16, ASPM L0s L1, Exit Latency L0s <64ns, L1 <1us
ClockPM- Surprise- LLActRep- BwNot- ASPMOptComp-
LnkCtl: ASPM Disabled; RCB 64 bytes, Disabled- CommClk+
ExtSynch- ClockPM- AutWidDis- BWInt- AutBWInt-
LnkSta: Speed 2.5GT/s, Width x2 (downgraded)
TrErr- Train- SlotClk+ DLActive- BWMgmt- ABWMgmt-
DevCap2: Completion Timeout: Range ABCD, TimeoutDis+ NROPrPrP- LTR-
10BitTagComp- 10BitTagReq- OBFF Not Supported, ExtFmt- EETLPPrefix-
EmergencyPowerReduction Not Supported, EmergencyPowerReductionInit-
FRS-
AtomicOpsCap: 32bit- 64bit- 128bitCAS-
DevCtl2: Completion Timeout: 50us to 50ms, TimeoutDis- LTR- 10BitTagReq- OBFF Disabled,
AtomicOpsCtl: ReqEn-
LnkSta2: Current De-emphasis Level: -6dB, EqualizationComplete- EqualizationPhase1-
EqualizationPhase2- EqualizationPhase3- LinkEqualizationRequest-
Retimer- 2Retimers- CrosslinkRes: unsupported
Capabilities: [a0] MSI: Enable- Count=1/1 Maskable- 64bit+
Address: 0000000000000000 Data: 0000
Capabilities: [100 v1] Vendor Specific Information: ID=0001 Rev=1 Len=010 <?>
Capabilities: [150 v1] Advanced Error Reporting
UESta: DLP- SDES- TLP- FCP- CmpltTO- CmpltAbrt- UnxCmplt- RxOF- MalfTLP- ECRC- UnsupReq- ACSViol-
UEMsk: DLP- SDES- TLP- FCP- CmpltTO- CmpltAbrt- UnxCmplt- RxOF- MalfTLP- ECRC- UnsupReq- ACSViol-
UESvrt: DLP+ SDES+ TLP- FCP+ CmpltTO- CmpltAbrt- UnxCmplt- RxOF+ MalfTLP+ ECRC- UnsupReq- ACSViol-
CESta: RxErr- BadTLP- BadDLLP- Rollover- Timeout- AdvNonFatalErr+
CEMsk: RxErr- BadTLP- BadDLLP- Rollover- Timeout- AdvNonFatalErr+
AERCap: First Error Pointer: 00, ECRCGenCap+ ECRCGenEn- ECRCChkCap+ ECRCChkEn-
MultHdrRecCap- MultHdrRecEn- TLPPfxPres- HdrLogCap-
HeaderLog: 00000000 00000000 00000000 00000000
I am going to try this k1-gpu branch to see if I can get the AMD GPU to work in Bianbu Linux. That's a fork of Bianbu Linux 6.1, and the patch seems to perform a few of the write-combining hacks that we had to do for radeon/amdgpu
for Arm as well.
For GPU testing, the command provided by SpaceMIT is as follows:
sudo apt install glmark2-es2-wayland
glmark2-es2-wayland --run-forever
I was originally wondering if the fan or fan connector was dead, but no—just the heatsink seems to be good enough for 99% of the time—the fan will only spin up deep into a multicore test, and briefly at that. It's noticeable but not annoying the few times it does spin up.
Our default logic is to turn on the fan when the core temperature reaches above 60 degrees. We will update to PWM speed regulation in later versions.
For GPU testing, the command provided by SpaceMIT is as follows:
sudo apt install glmark2-es2-wayland glmark2-es2-wayland --run-forever
You can also watch the gpu status:
sudo watch cat /sys/kernel/debug/pvr/status
@carbonfix - Thanks! I was able to get a much more reasonable score of 459 with that!
Regarding WiFi, under Bianbu I'm seeing the following in dmesg:
[ 29.348627] RTW: module init start
[ 29.348647] RTW: rtl8852bs v1.19.7.1-51-g48af265.20230922
[ 29.348653] RTW: build time: Jul 19 2024 08:17:49
[ 29.348659] RTW:
[ 29.348662] RTW: =======================================================
[ 29.348666] RTW: ==== Launching Wi-Fi driver! (Powered by Spacemit) ====
[ 29.348669] RTW: =======================================================
[ 29.348672] RTW: Realtek rtl8852bs WiFi driver (Powered by Spacemit,Ver v1.19.7.1-51-g48af265.20230922) init.
[ 29.366240] RTW: module init ret=0
Upon @carbonfix's suggestion I also dumped i2c data:
root@milkv-jupiter:/home/jgeerling# i2cdump -y 2 0x50
No size specified (using byte-data access)
0 1 2 3 4 5 6 7 8 9 a b c d e f 0123456789abcdef
00: 54 6c 76 49 6e 66 6f 00 01 00 26 24 06 fe fe fe TlvInfo.?.&$????
10: 0b 80 73 2a 02 00 02 21 12 6d 31 2d 78 5f 6d 69 ??s*?.?!?m1-x_mi
20: 6c 6b 76 2d 6a 75 70 69 74 65 72 fe 04 98 83 7e lkv-jupiter????~
30: b7 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ?...............
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
90: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
Memory performance (especially latency) is not that great (well, bad). Are the Milk-V guys aware of this and might provide 'better' DRAM initialization code?
@ThomasKaiser - They are watching this thread, would be good to hear their thoughts—not sure if this is the first board they're using the Spacemit SoC with, but I wonder if it's an issue with Spacemit's controller or with something more under their control.
I'm also re-running Geekbench 6
Just why? By looking at https://browser.geekbench.com/v6/cpu/compare/6979805?baseline=5769184 it's 100% obvious that Geekbench on RISC-V is not capable to generate any meaningful numbers that would represent anything 'real-world performance'. It's just nonsense.
@geerlingguy Currently it's needed to replace Mesa with a genuine copy from a generic distro to use external GPU (because the Mesa shipped with Bianbu is polluted by PowerVR driver, and its non-PowerVR-driver part seems to be broken). I didn't try this (because I just replaced the whole distro rootfs to test GPU support).
I wonder if it's an issue with Spacemit's controller or with something more under their control.
@geerlingguy it should be under their control since we can compare with another K1 equipped thingy limited to 1.6 GHz though. When looking at memory latency accesses at 1M or above are lower on the Jupiter than on the BPi F3 while below it's the other way around (internal cache and higher clockspeeds).
Just why? By looking at https://browser.geekbench.com/v6/cpu/compare/6979805?baseline=5769184 it's 100% obvious that Geekbench on RISC-V is not capable to generate any meaningful numbers that would represent anything 'real-world performance'. It's just nonsense.
Because people will ask regardless, and I like having the data, regardless of the fitness of Geekbench 6 as a universal benchmarking tool :)
The reason I run a few dozen other tests too is because:
To that point, I still can't run a few common benchmarks (like PTS tests) because they aren't set up for RISC-V. Whether that reflects real-world performance ('0' vs some metric that is above '0') is immaterial—instead, it reflects reality: if you buy one of these boards today, the performance might as well be 0 if you can't compile or run software the same as you can on x86 and Arm currently. At least, if you're not willing to roll up your sleeves and patch makefiles, compile newer versions than are available in repositories, build your own containers, etc.
I have a new board today, and here are a few notes:
First, idle power draw as tested with a USB-C power adapter is slightly higher from the wall (maybe slightly less efficient supply), measuring 5W idle, 10W under stress-ng all cores:
Second, WiFi works (yay!), so now I can run my network performance tests with WiFi instead of wired.
YouTube video: The PC industry is changing: RISC-V goes mainstream.
Try this benchmark on your systems. https://github.com/PlummersSoftwareLLC/Primes/tree/drag-race/PrimeCPP/solution_2 Just tried it on my Risc-v VisionFive 2 It scores better than the PI 4 in this test. See Below
Computing primes to 10000000 on 4 threads for 5 seconds. Passes: 64, Threads: 4, Time: 5.07541, Average: 0.0793033, Limit: 10000000, Counts: 664579/664579, Valid : Pass
davepl_par;64;5.07541;4;algorithm=base,faithful=yes,bits=1
It will be interesting to see the results
I got the idea to run it on my system after watching https://www.youtube.com/watch?v=7lYX0Eo4cbE&t=1s
Make sure to set the CPU to performance mode echo performance | tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
Kioxia XG8 over PCIe:
0001:01:00.0 Non-Volatile memory controller: KIOXIA Corporation NVMe SSD Controller XG8 (rev 01) (prog-if 02 [NVM Express]) Subsystem: KIOXIA Corporation Device 0001 LnkCap: Port #0, Speed 16GT/s, Width x4, ASPM L1, Exit Latency L1 <32us ClockPM- Surprise- LLActRep- BwNot- ASPMOptComp+ LnkCtl: ASPM Disabled; RCB 64 bytes, Disabled- CommClk+ ExtSynch- ClockPM- AutWidDis- BWInt- AutBWInt- **LnkSta: Speed 5GT/s (downgraded), Width x1 (downgraded)** TrErr- Train- SlotClk+ DLActive- BWMgmt- ABWMgmt- Kernel driver in use: nvme
Hi @geerlingguy , thanks a lot for the detailed work on this board. I am yet to receive my board which is on the way. The spec says PCIe Gen2x2 (2 lanes), but lspci shows link status as "Width x1" as shown above. Did you get a chance to analyze this? This is the reason you get only 346MB/s max on NVMe SSD (benchmark test)? With 2 lanes, we should get around 800MB/s performance.
Hi @geerlingguy!
I know this is a little bit off-topic, but I've been building a site for hosting CI/CD runners powered by RISC-V architecture. I was in the need of it and noticed there wasn't one out there that was easy to setup.
Here's the site: https://www.riscvrunners.com/
For now it only supports Gitlab Runners, but I plan to add support for other platforms too!
If you want to try it without paying, check out this Gitlab Project: https://gitlab.com/riscvrunners/runner-test
That project is open to the public, so you can push code and run CI pipelines to see if it works as you expect.
Basic information
Linux/system information
Benchmark results
CPU
Power
stress-ng --matrix 0
): 8 Wtop500
HPL benchmark: 10.6 W(Note: Tests were performed using a 12V 8A power adapter. When I switched to a 27W Aergon PWR GaN adapter, idle draw was measured at 10W, and
stress-ng --matrix 0
at 10W)Disk
MakerDisk A1 128GB microSD
Kioxia XG8 2TB NVMe SSD
32GB SanDisk eMMC Module V1.2
Run benchmark on any attached storage device (e.g. eMMC, microSD, NVMe, SATA) and add results under an additional heading.
Also consider running PiBenchmarks.com script.
Network
iperf3
results:Built-in 1 Gbps LAN
iperf3 -c $SERVER_IP
: 939 Mbpsiperf3 -c $SERVER_IP --reverse
: 885 Mbpsiperf3 -c $SERVER_IP --bidir
: 942 Mbps up, 136 Mbps downBuilt-in WiFi 6
So far, I have been unable to bring up this interface. See WiFi not working under Ubuntu or Bianbu.
iperf3 -c $SERVER_IP
: 362 Mbpsiperf3 -c $SERVER_IP --reverse
: 313 Mbpsiperf3 -c $SERVER_IP --bidir
: 228 Mbps up, 140 Mbps downGPU
glmark2-es2-wayland
results:Note: This benchmark requires an active display on the device. Not all devices may be able to run
glmark2-es2
, so in that case, make a note and move on!TODO: See this issue for discussion about a full suite of standardized GPU benchmarks.
Memory
tinymembench
results:Click to expand memory benchmark result
``` tinymembench v0.4.10 (simple benchmark for memory throughput and latency) ========================================================================== == Memory bandwidth tests == == == == Note 1: 1MB = 1000000 bytes == == Note 2: Results for 'copy' tests show how many bytes can be == == copied per second (adding together read and writen == == bytes would have provided twice higher numbers) == == Note 3: 2-pass copy means that we are using a small temporary buffer == == to first fetch data into it, and only then write it to the == == destination (source -> L1 cache, L1 cache -> destination) == == Note 4: If sample standard deviation exceeds 0.1%, it is shown in == == brackets == ========================================================================== C copy backwards : 3073.1 MB/s (0.6%) C copy backwards (32 byte blocks) : 662.7 MB/s C copy backwards (64 byte blocks) : 3079.1 MB/s (0.6%) C copy : 3081.3 MB/s (0.5%) C copy prefetched (32 bytes step) : 3087.2 MB/s (0.6%) C copy prefetched (64 bytes step) : 3087.5 MB/s (0.7%) C 2-pass copy : 2953.6 MB/s C 2-pass copy prefetched (32 bytes step) : 2947.5 MB/s (0.5%) C 2-pass copy prefetched (64 bytes step) : 2948.0 MB/s (0.4%) C fill : 7570.4 MB/s (0.3%) C fill (shuffle within 16 byte blocks) : 7574.7 MB/s (0.4%) C fill (shuffle within 32 byte blocks) : 675.4 MB/s (0.2%) C fill (shuffle within 64 byte blocks) : 675.3 MB/s (0.2%) --- standard memcpy : 2886.5 MB/s (0.8%) standard memset : 7577.1 MB/s (0.5%) ========================================================================== == Memory latency test == == == == Average time is measured for random memory accesses in the buffers == == of different sizes. The larger is the buffer, the more significant == == are relative contributions of TLB, L1/L2 cache misses and SDRAM == == accesses. For extremely large buffer sizes we are expecting to see == == page table walk with several requests to SDRAM for almost every == == memory access (though 64MiB is not nearly large enough to experience == == this effect to its fullest). == == == == Note 1: All the numbers are representing extra time, which needs to == == be added to L1 cache latency. The cycle timings for L1 cache == == latency can be usually found in the processor documentation. == == Note 2: Dual random read means that we are simultaneously performing == == two independent memory accesses at a time. In the case if == == the memory subsystem can't handle multiple outstanding == == requests, dual random read has the same timings as two == == single reads performed one after another. == ========================================================================== block size : single random read / dual random read 1024 : 0.1 ns / 0.1 ns 2048 : 0.1 ns / 0.1 ns 4096 : 0.1 ns / 0.1 ns 8192 : 0.1 ns / 0.1 ns 16384 : 0.1 ns / 0.1 ns 32768 : 0.2 ns / 0.2 ns 65536 : 9.3 ns / 14.3 ns 131072 : 15.9 ns / 21.2 ns 262144 : 19.3 ns / 23.8 ns 524288 : 38.4 ns / 52.5 ns 1048576 : 119.4 ns / 175.0 ns 2097152 : 169.3 ns / 221.4 ns 4194304 : 198.2 ns / 241.2 ns 8388608 : 223.5 ns / 268.5 ns 16777216 : 238.2 ns / 288.6 ns 33554432 : 248.7 ns / 306.2 ns 67108864 : 281.1 ns / 361.7 ns ```sbc-bench
resultsRun sbc-bench and paste a link to the results here: https://github.com/ThomasKaiser/sbc-bench/issues/96 / https://0x0.st/X904.bin
Phoronix Test Suite
Results from pi-general-benchmark.sh: