RockPi 4 PCIe only running at 2.5GT/s


This RockPi 4 looks to be one of my worst purchasing decisions of all time. The designers must have been on drugs - for instance, you cannot get to the eMMC without removing the heatsink first.

Other things that you take for granted - like the TTY being correctly sized to your monitor on boot - are broken on the RockPi 4. It opens the TTYs to what looks like about 640x480 on a 1920x1080 monitor. I have to install the fbset command to fix it, and that has to be done on every TTY. Also the boot menu does not show, so there is no way to choose kernel. I am using extlinux on the Ubuntu Server image.

What is worse is that the onboard devices such as USB and the GPU are “magically” connected - they do not appear on the PCI busses. This is horrible for configuration and development purposes.

Anyway, the question I have is the following:

If I use a Samsung 950 Pro SSD, I only get 600MB/s, which is very slow for PCIe 2.0 x4. Looking into the configuration, it appears that it is only running at 2.5GT/s. How do I get it to work at 5.0GT/s?

It does not matter if I use the ribbon cable or shove the SSD straight in the board, sticking out of the side.


I found you have to use dtbo to enable 5GT/s. This is a poor design - PCIe should automatically choose the highest link speed supported by the two endpoints.

Also, my Samsung 950 Pro is now reading at 645MB/s - only a tiny improvement, and much lower than advertised for NVMe speeds for this board.

Based on experiences with X86, PCIe 2.0 x4 or PCIe 3.0 x2 should be good for about 1500-1600MB/s for NVMe after overheads. Something is clearly still wrong here.


Another issue is that the IOMMU is not working - it is enabled, but does not place the PCIe devices behind it. Only some other obscure devices.

Another strange thing is that there are six cores running, and two disabled - is the RK3399 actually an 8 core silicon with two cores disabled? Is there any way to enable them? Thanks.

Name: pcie-gen2
Info: Overlay for activation of pcie running on GEN2 mode.
Load: intfc:dtoverlay=pcie-gen2
1 Like

Thanks. As I said, I figured that out.

But can you tell me why it is still only at 645MB/s sequential reads, even though it is running at 5GT/s? And how to get the IOMMU working?

Dunno here is an EVO 970 on the RockPi4

Command line used: iozone -e -I -a -s 100M -r 4k -r 16k -r 512k -r 1024k -r 16384k -i 0 -i 1 -i 2
	Output is in kBytes/sec
	Time Resolution = 0.000001 seconds.
	Processor cache size set to 1024 kBytes.
	Processor cache line size set to 32 bytes.
	File stride size set to 17 * record size.
                                                              random    random     bkwd    record    stride                                    
              kB  reclen    write  rewrite    read    reread    read     write     read   rewrite      read   fwrite frewrite    fread  freread
          102400       4    52099    77524   104207   105324    48114    78504                                                          
          102400      16   160544   231475   276300   278531   160180   233806                                                          
          102400     512   738881   809485   685261   707192   676594   811610                                                          
          102400    1024   795915   841642   708547   730494   693498   851120                                                          
          102400   16384  1111519  1167200  1098700  1139913  1110364  1193693