The other day I tested Raspberry Pi 4 with an heatsink since previous multi-threaded benchmarks clearly made the board throttle when running those without any cooling solution.

The guys at the Raspberry Pi Foundation somehow noticed my post, and I received an email from Eben Upton explaining a new Raspberry Pi 4 VLI firmware had “some thermal optimizations that are not installed by default on early production units.” I did not understand VLI at first, but eventually understood this referred to the firmware for VIA VL805 PCIe USB 3.0 controller on the board.

The Raspberry Pi Foundation provided me with a test version of the firmware, which they’ll release in the next few days, or weeks after testing is completed.

Now if you’re going to test a platform that will throttle due to overheating, it’s very important you do so at constant room temperature. I work in a office where the air conditioner is set to 28°C, so that’s about the temperature I have here.

Before going on with the test I’ve installed rpi-monitor to have nice CPU temperature charts later on:



sudo apt-get install dirmngr sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 2C0D3C0F sudo wget http://goo.gl/vewCLL -O /etc/apt/sources.list.d/rpimonitor.list sudo apt-get update sudo apt-get install rpimonitor 1 2 3 4 5 sudo apt - get install dirmngr sudo apt - key adv -- recv - keys -- keyserver keyserver .ubuntu .com 2C0D3C0F sudo wget http : // goo .gl / vewCLL - O / etc / apt / sources .list .d / rpimonitor .list sudo apt - get update sudo apt - get install rpimonitor



Let’s run sbc-bench without heatsink with old VLI firmware (version 00013701):



sudo /bin/bash ./sbc-bench.sh -c sbc-bench v0.6.7 Installing needed tools. This may take some time... Done. Checking cpufreq OPP... Done. Executing tinymembench. This will take a long time...^[[15~ Done. Executing OpenSSL benchmark. This will take 3 minutes... Done. Executing 7-zip benchmark. This will take a long time..../sbc-bench.sh: line 600: 9284 Killed "${SevenZip}" b >> ${TempLog} ./sbc-bench.sh: line 600: 9454 Killed "${SevenZip}" b >> ${TempLog} ./sbc-bench.sh: line 600: 9615 Killed "${SevenZip}" b >> ${TempLog} Done. Checking cpufreq OPP... Done. ATTENTION: Throttling has occured. Check the log for details. Memory performance: memcpy: 2695.2 MB/s memset: 3703.2 MB/s (0.5%) 7-zip total scores (3 consecutive runs): OpenSSL results: type 16 bytes 64 bytes 256 bytes 1024 bytes 8192 bytes 16384 bytes aes-128-cbc 62423.76k 76661.25k 83079.59k 84544.17k 84863.66k 85082.11k aes-128-cbc 62536.07k 76638.74k 83104.00k 84629.16k 84956.50k 85185.88k aes-192-cbc 56289.64k 67320.53k 72100.18k 73361.75k 73569.62k 73667.93k aes-192-cbc 56288.07k 67469.87k 71959.30k 73264.47k 73566.89k 73536.85k aes-256-cbc 51019.20k 60045.33k 63557.38k 64655.02k 64948.91k 64957.10k aes-256-cbc 50838.41k 60060.05k 63685.29k 64467.29k 64935.25k 64951.64k Full results uploaded to http://ix.io/1NaQ. Please check the log for anomalies (e.g. swapping or throttling happenend) and otherwise share this URL. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 sudo / bin / bash . / sbc - bench .sh - c sbc - bench v0 . 6.7 Installing needed tools . This may take some time . . . Done . Checking cpufreq OPP . . . Done . Executing tinymembench . This will take a long time . . . ^ [ [ 15 ~ Done . Executing OpenSSL benchmark . This will take 3 minutes . . . Done . Executing 7 - zip benchmark . This will take a long time . . . . / sbc - bench .sh : line 600 : 9284 Killed "${SevenZip}" b > > $ { TempLog } . / sbc - bench .sh : line 600 : 9454 Killed "${SevenZip}" b > > $ { TempLog } . / sbc - bench .sh : line 600 : 9615 Killed "${SevenZip}" b > > $ { TempLog } Done . Checking cpufreq OPP . . . Done . ATTENTION : Throttling has occured . Check the log for details . Memory performance : memcpy : 2695.2 MB / s memset : 3703.2 MB / s ( 0.5 % ) 7 - zip total scores ( 3 consecutive runs ) : OpenSSL results : type 16 bytes 64 bytes 256 bytes 1024 bytes 8192 bytes 16384 bytes aes - 128 - cbc 62423.76k 76661.25k 83079.59k 84544.17k 84863.66k 85082.11k aes - 128 - cbc 62536.07k 76638.74k 83104.00k 84629.16k 84956.50k 85185.88k aes - 192 - cbc 56289.64k 67320.53k 72100.18k 73361.75k 73569.62k 73667.93k aes - 192 - cbc 56288.07k 67469.87k 71959.30k 73264.47k 73566.89k 73536.85k aes - 256 - cbc 51019.20k 60045.33k 63557.38k 64655.02k 64948.91k 64957.10k aes - 256 - cbc 50838.41k 60060.05k 63685.29k 64467.29k 64935.25k 64951.64k Full results uploaded to http : // ix .io / 1NaQ. Please check the log for anomalies ( e .g . swapping or throttling happenend ) and otherwise share this URL .



7-zip never completed, as it was killed three times due to running out of memory. Maybe it happened because with a 1GB RPi 4, we’re right at the limit. Enabling ZRAM may help.

But we do have our temperature data for the full benchmark. We started at 67°C idle, and the spike to over 80°C (11:26 to 11:30) is exactly during 7-zip multi-threaded benchmark:

Now let’s install the firmware in a terminal in the Raspberry Pi 4:



unzip vl805_update_0137a8.zip chmod a+x vl805 sudo ./vl805 -w vl805_fw_0137a8.bin VL805 FW version: 00013701 VL805 EEPROM successfully reprogrammed - please reboot to activate. sudo reboot 1 2 3 4 5 6 unzip vl805_update_0137a8 .zip chmod a + x vl805 sudo . / vl805 - w vl805_fw_0137a8 .bin VL805 FW version : 00013701 VL805 EEPROM successfully reprogrammed - please reboot to activate . sudo reboot



For reference the tool can also be used to backup the firmware, and write to any location in the EEPROM:



./vl805 -h Usage: vl805 [<options>] where <options> are taken from: -h Show this help message -r <file> Read EEPROM -w <file> Write EEPROM -v <file> Verify EEPROM -o <offset> Specify an offset to read from/write to (for testing). N.B. Erases to the end of the EEPROM! -d Verbose debugging 1 2 3 4 5 6 7 8 9 10 . / vl805 - h Usage : vl805 [ < options > ] where < options > are taken from : - h Show this help message - r < file > Read EEPROM - w < file > Write EEPROM - v < file > Verify EEPROM - o < offset > Specify an offset to read from / write to ( for testing ) . N .B . Erases to the end of the EEPROM ! - d Verbose debugging



If you mess up you’ll lose USB connectivity, but user could have to ssh or serial into the device and re-run the tool to flash an older firmware to recover. It’s unclear whether early adapter will have to update the firmware manually, or it will be done automatically as part of the update process. That’s one of the reason I can’t share the files now.

Nevertheless it does seem to have some effect on idle temperature. Previously I got just under 65°C, but now I get just above 61°C once it stabilizes, so the new firmware does lower the temperature by 3 to 4°C thanks to lower power consumption. Sadly, I can’t measure the latter as my power meter is dead.

Now let’s run sbc-bench again without heatsink and the new VLI firmware (version 0137a8):



sudo /bin/bash ./sbc-bench.sh -c WARNING: this tool is meant to run only on Debian Stretch or Ubuntu Bionic. When running on other distros results are partially meaningless or can't be collected. Press [ctrl]-[c] to stop or [enter] to continue. sbc-bench v0.6.7 Installing needed tools. This may take some time... Done. Checking cpufreq OPP... Done. Executing tinymembench. This will take a long time... Done. Executing OpenSSL benchmark. This will take 3 minutes... Done. Executing 7-zip benchmark. This will take a long time..../sbc-bench.sh: line 600: 5469 Killed taskset -c 0 "${SevenZip}" b -mmt 1 >> ${TempLog} Done. Checking cpufreq OPP... Done. ATTENTION: Throttling has occured. Check the log for details. Memory performance: memcpy: 2662.9 MB/s memset: 3719.3 MB/s (0.5%) 7-zip total scores (3 consecutive runs): 5473,5483,4938 OpenSSL results: type 16 bytes 64 bytes 256 bytes 1024 bytes 8192 bytes 16384 bytes aes-128-cbc 62552.61k 76725.93k 83106.05k 84651.01k 85273.26k 85185.88k aes-128-cbc 62791.37k 76941.34k 82987.52k 84688.90k 85054.81k 85229.57k aes-192-cbc 56272.02k 67331.56k 72086.95k 73305.43k 73591.47k 73596.93k aes-192-cbc 56187.43k 67463.00k 71973.12k 73198.25k 73706.15k 73596.93k aes-256-cbc 51015.38k 60031.36k 63559.94k 64579.58k 64918.87k 64957.10k aes-256-cbc 46234.68k 58296.15k 63157.42k 64423.94k 64875.18k 64809.64k Full results uploaded to http://ix.io/1NaS. Please check the log for anomalies (e.g. swapping or throttling happenend) and otherwise share this URL. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 sudo / bin / bash . / sbc - bench .sh - c WARNING : this tool is meant to run only on Debian Stretch or Ubuntu Bionic . When running on other distros results are partially meaningless or can ' t be collected . Press [ ctrl ] - [ c ] to stop or [ enter ] to continue . sbc - bench v0 . 6.7 Installing needed tools . This may take some time . . . Done . Checking cpufreq OPP . . . Done . Executing tinymembench . This will take a long time . . . Done . Executing OpenSSL benchmark . This will take 3 minutes . . . Done . Executing 7 - zip benchmark . This will take a long time . . . . / sbc - bench .sh : line 600 : 5469 Killed taskset - c 0 "${SevenZip}" b - mmt 1 > > $ { TempLog } Done . Checking cpufreq OPP . . . Done . ATTENTION : Throttling has occured . Check the log for details . Memory performance : memcpy : 2662.9 MB / s memset : 3719.3 MB / s ( 0.5 % ) 7 - zip total scores ( 3 consecutive runs ) : 5473 , 5483 , 4938 OpenSSL results : type 16 bytes 64 bytes 256 bytes 1024 bytes 8192 bytes 16384 bytes aes - 128 - cbc 62552.61k 76725.93k 83106.05k 84651.01k 85273.26k 85185.88k aes - 128 - cbc 62791.37k 76941.34k 82987.52k 84688.90k 85054.81k 85229.57k aes - 192 - cbc 56272.02k 67331.56k 72086.95k 73305.43k 73591.47k 73596.93k aes - 192 - cbc 56187.43k 67463.00k 71973.12k 73198.25k 73706.15k 73596.93k aes - 256 - cbc 51015.38k 60031.36k 63559.94k 64579.58k 64918.87k 64957.10k aes - 256 - cbc 46234.68k 58296.15k 63157.42k 64423.94k 64875.18k 64809.64k Full results uploaded to http : // ix .io / 1NaS. Please check the log for anomalies ( e .g . swapping or throttling happenend ) and otherwise share this URL .



This time all three runs for 7-zip could complete for some reasons, and while throttling still did occur, it did to a lesser extent, and the temperature was clearly lower during to single thread benchmarks (~70°C vs 75°C with old firmware).

For reference, 7-zip benchmark score with heatsink averaged 5,397 points, without heatsink + old VLI firmware 4,423 points, but the “no heatsink with new VLI firmware” results are much better at 5,298 points. You’ll also note the first two runs were as good as the results with heatsink, but the last one dropped to just under 5,000 points, so for full load under and extended period of time a heatsink is still recommended for full performance. It’s still impressive what a new firmware can achieve.

You may wonder what the Raspberry Pi Foundation has changed. Thomas Kaiser may have found the reason in advance, as now ASPM (Active-State Power Management) seems to be enabled:



sudo apt install pciutils sudo lspci -vvv | grep ASPM LnkCap: Port #0, Speed 5GT/s, Width x1, ASPM L0s L1, Exit Latency L0s <2us, L1 <4us ClockPM+ Surprise- LLActRep- BwNot+ ASPMOptComp+ LnkCtl: ASPM Disabled; RCB 64 bytes Disabled- CommClk- L1SubCap: PCI-PM_L1.2+ PCI-PM_L1.1+ ASPM_L1.2+ ASPM_L1.1+ L1_PM_Substates+ L1SubCtl1: PCI-PM_L1.2- PCI-PM_L1.1- ASPM_L1.2- ASPM_L1.1- LnkCap: Port #0, Speed 5GT/s, Width x1, ASPM L0s L1, Exit Latency L0s <2us, L1 <16us ClockPM+ Surprise- LLActRep- BwNot- ASPMOptComp- LnkCtl: ASPM L0s L1 Enabled; RCB 64 bytes Disabled- CommClk+ 1 2 3 4 5 6 7 8 9 10 sudo apt install pciutils sudo lspci - vvv | grep ASPM LnkCap : Port #0, Speed 5GT/s, Width x1, ASPM L0s L1, Exit Latency L0s <2us, L1 <4us ClockPM + Surprise - LLActRep - BwNot + ASPMOptComp + LnkCtl : ASPM Disabled ; RCB 64 bytes Disabled - CommClk - L1SubCap : PCI - PM_L1 . 2 + PCI - PM_L1 . 1 + ASPM_L1 . 2 + ASPM_L1 . 1 + L1_PM_Substates + L1SubCtl1 : PCI - PM_L1 . 2 - PCI - PM_L1 . 1 - ASPM_L1 . 2 - ASPM_L1 . 1 - LnkCap : Port #0, Speed 5GT/s, Width x1, ASPM L0s L1, Exit Latency L0s <2us, L1 <16us ClockPM + Surprise - LLActRep - BwNot - ASPMOptComp - LnkCtl : ASPM L0s L1 Enabled ; RCB 64 bytes Disabled - CommClk +



This was not the case with the old VLI firmware. The full lspci output can be found here.