I used to change my uboot to include

.....  pci enum; nvme scan  .....

on a number of arm and riscv boards

Colin

On 30/5/26 10:13, 0x4E0x650x6F wrote:
That looks cool,
  I was able to patch the openbsd ports to compile a u-boot for the cm3588, and 
have it boot.
Currently the only thing that i am trying to understand is why the nvme on 
socket 4(fe8…) when i boot it with an nvme that socket it is able to read the 
size but later hangs I think their might be something around an interrupt…

After my last email i noticed that if i do a pci scan and nvme enum in the 
uboot… before openbsd boots only the nvme connected to the socket 4 becomes 
unresponsive… all other 3 nvmes work fine…
If not then somehow socket 1 will also be in the same state after the initial 
information from the device at boot (size serial device etc)…

So close to getting this to fully operate on 4 nvmes…

Another not critical thing, the pci scan has another side effect on the opebsd 
boot as it is able to get the MAC address from the ethernet device…






-------- Original Message --------
On Tuesday, 05/26/26 at 22:51 Dave Polaschek <[email protected]> wrote:
Nice! The Pocket Reform is now booting OpenBSD 7.9. The NVMe isn’t recognized 
and audio doesn’t work, but otherwise it sounds like it’s in pretty good shape.

https://mastodon.social/@mntmn/116642900024741191

-DaveP

On Wed, Apr 1, 2026, at 17:43, 0x4E0x650x6F wrote:
Hello,

Here are my findings after 2 weeks of dtb hammering.

## CM3588 NAS / RK3588 PCIe bring-up findings on OpenBSD

I’ve been debugging NVMe instability on a FriendlyElec CM3588 NAS
running OpenBSD/arm64.
The board has 4 M.2 NVMe sockets. The main symptom is that one or more
NVMe devices enumerate,
but access to some paths stalls the system, especially during early
probing or when softraid is enabled.

### Hardware / controller mapping

 From Linux DTS comments, board behavior, and pinctrl/reset mapping, the
socket-to-controller mapping appears to be:

| Socket |   Controller | Address    | Notes              |
| ------ | -----------: | ---------- | ------------------ |
| 1      | controller 0 | `fe150000` | consistently works |
| 2      | controller 2 | `fe170000` | problematic        |
| 3      | controller 1 | `fe160000` | consistently works |
| 4      | controller 3 | `fe180000` | most problematic   |

The reset pin mapping extracted from the DTB is:

| Socket | Controller | pinctrl group | reset pin |   |
| ------ | ---------- | ------------- | --------- | - |
| 1      | `fe150000` | `pcie3x4-rst` | GPIO4_B6  |   |
| 2      | `fe170000` | `pcie2-0-rst` | GPIO4_B4  |   |
| 3      | `fe160000` | `pcie3x2-rst` | GPIO4_B3  |   |
| 4      | `fe180000` | `pcie2-1-rst` | GPIO4_A2  |   |

### Strong observed pattern

The stable controllers are:

* `fe150000` (socket 1)
* `fe160000` (socket 3)

The unstable controllers are:

* `fe170000` (socket 2)
* `fe180000` (socket 4)

So the problem clusters around the “lane 1” paths rather than affecting
all four sockets equally.

### Firmware observations

With the original bootloader, U-Boot identified as NanoPC-T6, which was
clearly wrong for this board.

With Armbian/mainline-style U-Boot, the board identity became correct
and all 4 NVMe devices could be seen by U-Boot:

* `nvme scan`
* `nvme info`

showed all four Samsung drives.

This means the board and routing are capable of bringing up all four
links under firmware.

### OpenBSD behavior

Under OpenBSD:

* sockets 1 and 3 are reliably usable
* socket 2 can sometimes be made to enumerate depending on DT changes
* socket 4 (`fe180000`) is the main failure path

Typical failure mode for socket 4:

* device enumerates
* NVMe attaches
* then the system stalls when the device is actually accessed
* boot usually only succeeds with `disable softraid`

That suggests “link up” is not the real problem anymore; the problem is
what happens after enumeration.

### DT findings

1. `rockchip,pipe-grf` matters

Adding `rockchip,pipe-grf` to controller nodes changed behavior
significantly and made some previously failing paths work.
That suggests the GRF hookup is functionally required, not optional.

2. `data-lanes` changes behavior globally

Changing the PCIe3 PHY `data-lanes` from the Linux/mainline-style split
ordering to a sequential ordering changed which sockets came up:

* one ordering gave only sockets 1 and 3 (data-lanes = <1 3 2 4> )
* another ordering gave sockets 1, 2, and 3 (data-lanes = <1 2 3 4> )
* socket 4 remained the main outlier

```
usb5 at ohci0: USB revision 1.0
uhub5 at usb5 configuration 1 interface 0 "Generic OHCI root hub" rev
1.00/1.00 addr 1
usb6 at ohci1: USB revision 1.0
uhub6 at usb6 configuration 1 interface 0 "Generic OHCI root hub" rev
1.00/1.00 addr 1
pci0 at dwpcie0
ppb0 at pci0 dev 0 function 0 "Rockchip RK3588" rev 0x00
pci1 at ppb0 bus 49
nvme0 at pci1 dev 0 function 0 "Samsung PM9C1a" rev 0x00: msix, NVMe 2.0
nvme0: Samsung SSD 990 EVO Plus 4TB, firmware 2B2QKXG7, serial
S7U9NU0YA03521K < nvme socket 4
scsibus0 at nvme0: 2 targets, initiator 0
sd0 at scsibus0 targ 1 lun 0: <NVMe, Samsung SSD 990, 2B2Q>
sd0: 3815447MB, 512 bytes/sector, 7814037168 sectors
pci2 at dwpcie1
ppb1 at pci2 dev 0 function 0 "Rockchip RK3588" rev 0x00
pci3 at ppb1 bus 65
rge0 at pci3 dev 0 function 0 "Realtek RTL8125" rev 0x05: msix:
RTL8125B, address 00:00:00:00:00:00
pci4 at dwpcie2
ppb2 at pci4 dev 0 function 0 "Rockchip RK3588" rev 0x00
pci5 at ppb2 bus 1
nvme1 at pci5 dev 0 function 0 "Samsung PM9C1a" rev 0x00: msix, NVMe 2.0
nvme1: Samsung SSD 990 EVO Plus 4TB, firmware 2B2QKXG7, serial
S7U9NU0YA09134R <- nvme socket 1
scsibus1 at nvme1: 2 targets, initiator 0
sd1 at scsibus1 targ 1 lun 0: <NVMe, Samsung SSD 990, 2B2Q>
sd1: 3815447MB, 512 bytes/sector, 7814037168 sectors
pci6 at dwpcie3
ppb3 at pci6 dev 0 function 0 "Rockchip RK3588" rev 0x00
pci7 at ppb3 bus 17
nvme2 at pci7 dev 0 function 0 "Samsung PM9C1a" rev 0x00: msix, NVMe 2.0
nvme2: Samsung SSD 990 EVO Plus 4TB, firmware 2B2QKXG7, serial
S7U9NU0YA09309A <- nvme socket 3
scsibus2 at nvme2: 2 targets, initiator 0
sd2 at scsibus2 targ 1 lun 0: <NVMe, Samsung SSD 990, 2B2Q>
sd2: 3815447MB, 512 bytes/sector, 7814037168 sectors
pci8 at dwpcie4
ppb4 at pci8 dev 0 function 0 "Rockchip RK3588" rev 0x00
pci9 at ppb4 bus 33
nvme3 at pci9 dev 0 function 0 "Samsung PM9C1a" rev 0x00: msix, NVMe 2.0
nvme3: Samsung SSD 990 EVO Plus 4TB, firmware 2B2QKXG7, serial
S7U9NU0YA03531D <- nvme socket 2
scsibus3 at nvme3: 2 targets, initiator 0
sd3 at scsibus3 targ 1 lun 0: <NVMe, Samsung SSD 990, 2B2Q>
sd3: 3815447MB, 512 bytes/sector, 7814037168 sectors
scsibus4 at sdmmc0: 2 targets, initiator 0
sd4 at scsibus4 targ 1 lun 0: <Apacer, SD8GB, 0030> removable
sd4: 7384MB, 512 bytes/sector, 15122432 sectors
scsibus5 at sdmmc1: 2 targets, initiator 0
sd5 at scsibus5 targ 1 lun 0: <SD/MMC, A3A561, 0000>
sd5: 59000MB, 512 bytes/sector, 120832000 sectors
vscsi0 at root
scsibus6 at vscsi0: 256 targets
```

This suggests the `data-lanes` property is affecting the global PHY
split/routing behavior,
but OpenBSD is not "realizing" the intended RK3588 topology the same
way Linux does,
this might be the reason behind the diff results by re-ordering the
values in the data-lanes.

3. OpenBSD DT pinctrl skeleton exists but some content is missing (Not
sure the true effect of this)

The corresponding PCIe pinctrl structure exists in the OpenBSD DTB, but
parts of it appear empty,
while vendor/Linux-style DTBs populate the pinctrl groups with actual
pin definitions.
That may contribute to incomplete sideband/reset setup. (?! unsure)

### Linux upstream findings that appear directly relevant

Two Linux changes look highly relevant to this board:

1. CM3588 NAS regulators:
    Linux added a fix titled “Enable all PCIe regulators on CM3588 NAS”
because some SSDs could
    still enumerate even with regulators not fully enabled, but then
would hang on access.
    That seems matche the OpenBSD symptom very closely.

2. RK3588 PCIe bifurcation:
    Linux also fixed RK3588 PCIe3 PHY bifurcation programming,
specifically the GRF programming behind the lane split handling.
    CM3588 NAS was explicitly called out as one of the boards affected
by that issue.

(https://github.com/torvalds/linux/commit/f8020dfb311d2b6cf657668792aaa5fa8863a7dd)

### Current interpretation

At this point, my working theory is that the issue might not basic
enumeration,
but incomplete RK3588-specific runtime support for the problematic
lane/controller paths, especially `fe180000`.

The evidence now suggests:

* firmware can bring up all 4 links
* U-Boot can enumerate all 4 NVMe devices
* OpenBSD still fails when using the socket-4 / `fe180000` path
* regulator enable state and RK3588 PCIe3/GRF lane handling are likely
involved
* DT-only changes improve behavior, but do not fully solve it, its able
to boot with
softraid disabled and even get the sector and basic device info but
after the boot is complet
the device is "Non-functional" a simple disklable sd0 hangs..

### Minimal reproducible summary

* Board: FriendlyElec CM3588 NAS
* SoC: RK3588
* 4 identical Samsung 990 EVO Plus 4TB NVMe drives
* U-Boot: Armbian/mainline-style U-Boot with correct CM3588 NAS identity
* Result: U-Boot sees all 4 NVMe devices
* OpenBSD result:

   * sockets 1 and 3 usable
   * socket 2 variable depending on DT changes
   * socket 4 (`fe180000`) enumerates then destabilizes access / boot
   * system often only boots with `disable softraid`

NOTE:
  I tested this with a decompliled version from openbsd ports and made a
few adjustments, if
  i can provide it if any one is interested.

### Info request

Any one has any sugestions / information that were i could understand
the following:

* RK3588 PCIe3 PHY lane split / bifurcation handling
* GRF programming for lane-1 paths
* regulator handling for CM3588 NAS M.2 slots
* controller/runtime handling for `fe170000` / `fe180000` after
link-up, not just at attach time.

Best Regards
Tiago

On Saturday, 17 January 2026 at 01:53, Dave Polaschek
<[email protected]> wrote:

On Fri, Jan 16, 2026, at 18:27, Mike Larkin wrote:
On Fri, Jan 16, 2026 at 05:27:27PM -0700, Dave Polaschek wrote:
Thanks for sharing this info. I’m supposed to be receiving my RK3588 upgrade 
board for my MNT Pocket Reform in early February, and using this, maybe I’ll 
get it running OpenBSD sooner rather than later. Hope so!
Not sure if the panel will work... IIRC patrick@ had to do some special things
to get the panel working on the existing iMX machines..
Yeah, it's a portrait panel being used landscape, if nothing else. I was planning to try 
and install 7.8 on the iMX version I have now, but after having to send it to Germany for 
warranty repairs, and then fiddle with the backplate to get WiFi that could stay 
connected long enough to do an "apt update," I figure I'll just wait and see 
what I can find when the RK3588 arrives.

But I figure with this latest info, I've got at least one fewer roadblock in 
the way, and I'd rather have it as an OpenBSD machine than Debian for a few 
reasons, and it's a lot easier to switch OSes before I start using it as a 
daily driver.

-DaveP

On Fri, Jan 16, 2026, at 17:12, 0x4E0x650x6F wrote:
Hello OpenBSD arm64 team,

I wanted to share some notes from a successful OpenBSD/arm64
bring-up on a FriendlyElec CM3588 Plus (NanoPC-T6, RK3588, 32 GB LPDDR5).
This took a bit of digging, and I think one detail in particular may
be useful to others working with Rockchip boards.

Summary
OpenBSD 7.8 boots reliably from eMMC via U-Boot + EFI once disk layout and
  bootloader offsets are handled correctly.
The system now boots cleanly with no SD card and no manual U-Boot interaction.

Key finding (important)
On RK3588, U-Boot must be located at sector 64 (32 KiB offset).
If the EFI/MSDOS partition or GPT header is created too early on the disk,
it overwrites the expected U-Boot location.

In that case:

SPL runs
U-Boot is not found
The system falls back to recovery / mask-like behaviour

The fix was:

1. Ensure the first partition starts *after* sector 64
2. Explicitly write U-Boot with:

```
dd if=u-boot-rockchip.bin of=/dev/rsdXc bs=512 seek=64 conv=fsync
```

Once this is done, the boot chain works reliably:
ROM → SPL → U-Boot → EFI → OpenBSD BOOTAA64.EFI → kernel.

DTB
The DTB shipped in the OpenBSD install sets:

```
rk3588-friendlyelec-cm3588-nas.dtb
```

is the correct match for the CM3588 Plus.
Vendor DTS files differ between CM3588 and CM3588-Plus (rev06 vs rev09),
and using the wrong one causes subtle issues (USB, clocks, PHYs).

eMMC interference:
I also ran into a hang around USB init (“ohci0 at mainbus0”).
This turned out not to be a USB driver issue, but leftover vendor
data on eMMC interfering with boot.
Zeroing the first 1 GiB of eMMC resolved it:

```
dd if=/dev/zero of=/dev/mmcblk2 bs=1M count=1024
```

After that, the installer proceeded normally.

I’m happy to provide more detailed notes, disk layouts,
or testing if useful.
Thanks for the excellent arm64 support once the boot
geometry was understood, everything fell into place nicely.

MY "hat" is officially off for the amazing work on this OS....

PS:
The dmesg was already sent I will try to tune some things that
I still haven't tested yet specifically the nvme sockets.

Thanks Mike Larkin again for your input.

Best regards,
Tiago



Sent with Proton Mail secure email.

On Thursday, 15 January 2026 at 12:15, 0x4E0x650x6F
<[email protected]> wrote:

Hi all,

Thanks for the response here's where I'm at.

Summary:
CM3588-Plus (RK3588): OpenBSD 7.8 RAMDISK boots via u-boot-rk3588/EFI, stalls 
after ohci0 attach; vendor DT differs for Plus.

Details:

I’m testing OpenBSD/arm64 on a FriendlyElec CM3588-Plus (RK3588, 32GB).
I can boot the OpenBSD 7.8 RAMDISK kernel via SD card using OpenBSD’s 
u-boot-rk3588 package and EFI (BOOTAA64.EFI), but the kernel consistently 
stalls during early device attach.

Hardware
Board: FriendlyElec CM3588-Plus
SoC: RK3588
RAM: 32GB
Serial console: UART2 (serial@feb50000), 1,500,000 8N1 (DT stdout-path uses 
serial2:1500000n8)
Boot path / versions
SD card: miniroot78.img (dd)
U-Boot: u-boot-rk3588 (U-Boot 2025.07; boots via bootflow scan / efi_mgr)
EFI loader: OpenBSD/arm64 BOOTAA64 1.22
Kernel: OpenBSD 7.8 (RAMDISK) #38 ...

Boot log excerpt shows normal early init (PSCI/GIC/EFI, memory, SCMI, clock, 
GPIO, etc.) then USB host attach, then stall.

Last lines printed:
xhci0 at mainbus0, xHCI 1.10
usb0 at xhci0: USB revision 3.0
uhub0 at usb0 configuration 1 interface 0 "Generic xHCI root hub" ...
ehci0 at mainbus0
usb1 at ehci0: USB revision 2.0
uhub1 at usb1 configuration 1 interface 0 "Generic EHCI root hub" ...
ohci0 at mainbus0

After this:
no further output on serial
no panic/backtrace
no watchdog reset

UKC attempt
I booted with UKC (boot -c) and issued:
disable rkusbphy0
disable rkusbphy1
disable rkusbphy2
disable rkusbphy3
disable dwc3
disable usbdrd
quit

UKC produced no confirmation output, and the same devices still attached 
(rkusbphy0-3, xhci0/ehci0/ohci0) and stalled at the same point.

DTB / board variant note || doubts

OpenBSD provides rk3588-friendlyelec-cm3588-nas.dtb (dtb-6.14 / 7.8).
However FriendlyElec’s vendor kernel uses different DT sources for CM3588 vs 
CM3588-Plus:
CM3588: rk3588-nanopi6-rev09.dts
CM3588-Plus: rk3588-nanopi6-rev06.dts

Diffing OpenBSD cm3588-nas DT against the vendor CM3588-Plus DT shows 
substantial USB-related differences (DWC3 node structure/compatibles, 
clocks/clock-names, power-domain phandles, explicit reset lines, EHCI/OHCI 
companion+PHY wiring), so the shipped DTB may not match CM3588-Plus 
USB/PHY/power wiring. (????)

I can provide full serial logs and the relevant DT diff hunks if needed.
(after a very long or deal not sure if I bricked the device or not last night 
but I plan on keep hitting this thing until (hopefully until it runs).


Best Regards
Tiago.


Sent with Proton Mail secure email.


On Thursday, 8 January 2026 at 06:09, Mike Larkin [email protected] wrote:

On Wed, Jan 07, 2026 at 05:02:24PM +0000, 0x4E0x650x6F wrote:

Hi All,

I finally decided to migrate to OpenBSD recently,
and I was thinking if i could also use openbsd
on CM3588 Plus (its a NAS board), uses rockchip
rk3588.
I noticed that a device with the same chip is
supported I trying to find any documentation / help
that could give me some guidance.

I would be willing to assist to the best of my abilities,
I have a device that is not in active use that,
i could use as a test platform.

Best Regards
Tiago Carvalho.
Looks like a generic cm3588 board, you could try the rock5a DTB or something
similar. probably would get you reasonably far then tweak.

unless you already have the DTB, say, from linux...

-ml



Reply via email to