On the day of the Raspberry Pi CM5 release, I published a mini-review of the Raspberry Pi CM5 development kit, showcasing how to assemble the kit and boot the Raspberry Pi operating system. I also ran the sbc-bench benchmark test to evaluate its performance.Unfortunately, during the testing process, the Broadcom BCM2712 CPU experienced throttling, which means that when the CM5 IO board was placed in the IO box and the processor module 5 relied solely on the fan for cooling, the cooling effect was not ideal.Therefore, today I will repeat the same tests using other cooling solutions, namely the official Raspberry Pi CM5 heatsink (just the heatsink) and the active cooler from Shanghai Jingheng, which is similar to the active cooler of the Raspberry Pi 5 but designed specifically for the CPU module.
But before that, I need to do some “cleaning up.” Since the last time I booted the Raspberry Pi operating system from an NVMe SSD, I found that the camera was not working properly. Therefore, I will report my experience of installing the Raspberry Pi operating system on eMMC flash memory and getting the camera to work, both of which did not go smoothly.
Installing Raspberry Pi Operating System on CM5’s eMMC Flash Memory
Theoretically, installing the Raspberry Pi operating system on the eMMC flash memory of the CM5 module should be easy, as relevant documentation is available.
We need to insert a jumper on the left side of the J6 connector, marked “Install jumper to disable eMMC boot,” and connect a USB-C cable between the IO board and the host as shown in the figure below.
Then, we need to install and run rpiboot so that the eMMC flash memory appears as a USB storage device on the host.
sudo apt install rpibootsudo rpiboot
The utility has been stuck at the interface waiting for the motherboard… and I couldn’t see any indication of a new USB device in the system.
RPIBOOT: build-date Jan 31 2022 version 0~20220315+git6fa2ec0+nowin-0ubuntu1Waiting for BCM2835/6/7/2711...
After several attempts, I thought that the version of rpiboot in the Ubuntu 22.04 repository might be too old. So, I removed it and built the utility from source:
sudo apt remove rpibootsudo apt install git libusb-1.0-0-dev pkg-config build-essentialgit clone --recurse-submodules --shallow-submodules --depth=1 https://github.com/raspberrypi/usbbootcd usbbootmakesudo make install
The output of the command now looks much better…
jaufranc@CNX-LAPTOP-5:~/usbboot$ sudo rpibootRPIBOOT: build-date Dec 20 2024 version 20240422~085300 ef721cdaIf the device fails to connect then please see https://rpltd.co/rpibootfordebuggingtips.Waiting for BCM2835/6/7/2711/2712...2712: Directory not specified using default /usr/share/rpiboot/mass-storage-gadget64/Sending bootcode.binSuccessful read 4 bytesWaiting for BCM2835/6/7/2711/2712...Second stage boot serverFile read: mcb.binFile read: memsys00.binFile read: memsys01.binFile read: memsys02.binFile read: memsys03.binFile read: bootmainLoading: /usr/share/rpiboot/mass-storage-gadget64//config.txtFile read: config.txtLoading: /usr/share/rpiboot/mass-storage-gadget64//boot.imgFile read: boot.imgSecond stage boot server done
So, I booted the Raspberry Pi image, selected the 64-bit version of the Raspberry Pi OS, and the storage device named “Raspberry Pi Multifunction USB Device” with a capacity of 31.3GB, corresponding to the 32GB eMMC flash memory on my module.
I can write the image to the Raspberry Pi CM5 just like writing it to a microSD card.
Once finished, the operating system boots normally from the eMMC flash memory.
We can also use the lsblk command to check the partitions of the eMMC flash memory:
pi@raspberrypi:~ $ lsblkNAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTSmmcblk0 179:0 0 29.1G 0 disk├─mmcblk0p1 179:1 0 512M 0 part /boot/firmware└─mmcblk0p2 179:2 0 28.6G 0 part /mmcblk0boot0 179:32 0 4M 1 diskmmcblk0boot1 179:64 0 4M 1 disk
Raspberry Pi CM5 Camera Support
As mentioned in the introduction, when connecting the Raspberry Pi Camera Module 3 to the CAM/DISP 0 connector, it does not work out of the box.
pi@raspberrypi:~ $ rpicam-hello --listNo cameras available!
Although there is documentation on how to enable the camera on CAM/DISP 0 and CAM/DISP 1, the documentation is somewhat incomplete and contains some errors.
I followed the instructions to edit the /boot/firmware/config.txt file, commented out the camera_auto_detect line, and added an overlay for the Raspberry Pi Camera Module 3:
# Automatically load overlays for detected cameras#camera_auto_detect=1dtoverlay=imx708,cam0
After rebooting, the problem was solved.
pi@raspberrypi:~ $ rpicam-hello --listAvailable cameras-----------------0 : imx708 [4608x2592 10-bit RGGB] (/base/axi/pcie@120000/rp1/i2c@88000/imx708@1a)Modes: 'SRGGB10_CSI2P' : 1536x864 [120.13 fps - (768, 432)/3072x1728 crop]2304x1296 [56.03 fps - (0, 0)/4608x2592 crop]4608x2592 [14.35 fps - (0, 0)/4608x2592 crop]
This was straightforward, and I encountered no issues.
The method for using a second camera is similar, but the CAM/DISP 1 interface requires us to add two jumpers on J6.
I decided to use the Raspberry Pi AI camera for this test. I only have one Raspberry Pi Zero camera cable, so I cannot test both cameras simultaneously. The AI camera is not listed in the Compute Module documentation, but we can find the required overlay on GitHub:
https://github.com/raspberrypi/firmware/blob/master/boot/overlays/README
# Automatically load overlays for detected cameras#camera_auto_detect=1dtoverlay=imx708,cam0dtoverlay=imx500-pi5,cam1
I also installed the imx500 package just in case and rebooted the system:
sudo apt install imx500-allsudo reboot
But the camera was not detected, so I tried connecting the Raspberry Pi Camera Module 3 to CAM/DISP 1 and changed the config.txt file as follows:
# Automatically load overlays for detected cameras#camera_auto_detect=1#dtoverlay=imx708,cam0dtoverlay=imx708,cam1
As before:
pi@raspberrypi:~ $ rpicam-hello --listNo cameras available!
Finally, I only tested the Raspberry Pi AI camera using the imx500-pi5 device tree overlay on CAM/DISP 0, and it was detected.
pi@raspberrypi:~ $ rpicam-hello --listAvailable cameras-----------------0 : imx500 [4056x3040 10-bit RGGB] (/base/axi/pcie@120000/rp1/i2c@88000/imx500@1a)Modes: 'SRGGB10_CSI2P' : 2028x1520 [30.02 fps - (0, 0)/4056x3040 crop]4056x3040 [10.00 fps - (0, 0)/4056x3040 crop]
So, I could not use the CAM/DISP 1 connector. Either I missed something, or this second connector only works when two cameras are connected to the CM5 IO board, and does not work with a single camera. So, just in case, I connected the Raspberry Pi Touch Display 2 to CAM/DISP 0, and the AI camera to CAM/DISP 1, and configured the following:
# Automatically load overlays for detected cameras#camera_auto_detect=1#dtoverlay=imx708,cam0dtoverlay=vc4-kms-dsi-ili9881-7inch,dsi0dtoverlay=imx500-pi5,cam1# Automatically load overlays for detected DSI displays#display_auto_detect=1
The display worked fine, but the AI camera still did not work on the second connector, although the imx500 sensor showed up in the kernel log…
pi@raspberrypi:~ $ dmesg | grep csi[ 0.958143] platform 1f00128000.csi: Fixed dependency cycle(s) with /axi/pcie@120000/rp1/i2c@88000/imx500@1a[ 0.964771] platform 1f00128000.csi: bcm2712_iommu_probe_device: MMU 1000005280.iommu[ 0.964774] platform 1f00128000.csi: bcm2712_iommu_device_group: MMU 1000005280.iommu[ 0.964778] platform 1f00128000.csi: Adding to iommu group 2[ 0.964795] platform 1f00128000.csi: bcm2712_iommu_attach_dev: MMU 1000005280.iommu[ 2.484827] rp1-cfe 1f00128000.csi: bcm2712_iommu_of_xlate: MMU 1000005280.iommu[ 2.485163] rp1-cfe 1f00128000.csi: DW dphy Host HW v1.20[ 2.485175] rp1-cfe 1f00128000.csi: PiSP FE HW v0.1[ 2.487088] rp1-cfe 1f00128000.csi: found subdevice /axi/pcie@120000/rp1/i2c@88000/imx500@1api@raspberrypi:~ $ rpicam-hello --listNo cameras available!
I am giving up for now…
Installing Raspberry Pi Heatsink and Active Cooler for CM5
Let’s get back to the main topic and install a heatsink for the Raspberry Pi CM5.
Both the official Raspberry Pi heatsink and the Shanghai Jingheng CM5 active cooler come in similar packaging and are equipped with basically the same accessories, namely some screws, thick pads, and three thermal pads attached to the bottom of the heatsink.
The Shanghai Jingheng cooler simply adds an extra cooling fan. Let’s start with the official heatsink. First, I need to peel off the film protecting the thermal pad…
Then place it on the CM5 module and ensure its orientation does not interfere with the built-in antenna on the CPU module.
Next, I placed four pads between the IO board and the CM5 module and secured everything with four screws.
The steps to install the Shanghai Jingheng active cooler are exactly the same, except that we also need to connect the fan’s wires.
Benchmarking and CPU Temperature Monitoring with Raspberry Pi CM5 Heatsink
Let’s run the sbc-bench.sh benchmark script using the Pi heatsink in a fanless configuration while monitoring the CPU temperature with rpi-monitor.
pi@raspberrypi:~ $ sudo ./sbc-bench.sh -rStarting to examine hardware/software for review purposes...
sbc-bench v0.9.68
Installing needed tools: distro packages already installed, mhz, cpufetch,cpuminer.Done.Checking cpufreq OPP. Done.Executing tinymembench. Done.Executing RAM latency tester. Done.Executing OpenSSL benchmark. Done.Executing 7-zip benchmark. Done.Throttling test: heating up the device, 5 more minutes to wait. Done.Checking cpufreq OPP again. Done (11 minutes elapsed).
Results validation:
* Measured clockspeed not lower than advertised max CPU clockspeed* No swapping* Background activity (%system) OK* No throttling
Full results uploaded to https://0x0.st/XCd-.txt
# Raspberry Pi Compute Module 5 Rev 1.0
Tested with sbc-bench v0.9.68 on Sat, 21 Dec 2024 14:35:20 +0700. Fullinfo:[https://0x0.st/XCd-.txt](http://0x0.st/XCd-.txt)
### General information:
Information courtesy of cpufetch:
SoC: Broadcom BCM2712Technology: 16nmMicroarchitecture: Cortex-A76Max Frequency: 2.400 GHzCores: 4 coresFeatures: NEON,SHA1,SHA2,AES,CRC32
BCM2712, Kernel: aarch64, Userland: arm64
CPU sysfs topology (clusters, cpufreq members, clockspeeds)cpufreq min maxCPU cluster policy speed speed core type0 0 0 1500 2400 Cortex-A76 / r4p11 0 0 1500 2400 Cortex-A76 / r4p12 0 0 1500 2400 Cortex-A76 / r4p13 0 0 1500 2400 Cortex-A76 / r4p1
4041 KB available RAM
### Governors/policies (performance vs. idle consumption):
Original governor settings:
cpufreq-policy0: performance / 2400 MHz (conservative ondemand userspacepowersaveperformanceschedutil/15001600 1700 1800 1900 2000 2100 22002300 2400)
Tuned governor settings:
cpufreq-policy0: performance / 2400 MHz
Status of performance related policies found below /sys:/
/sys/module/pcie_aspm/parameters/policy: default [performance] powersavepowersupersave
### Clockspeeds (idle vs. heated up):
Before at 52.9°C:
cpu0 (Cortex-A76): OPP: 2400, ThreadX: 2400, Measured: 2399
After at 79.3°C:
cpu0 (Cortex-A76): OPP: 2400, ThreadX: 2400, Measured: 2399
### Performance baseline
* memcpy: 5607.4 MB/s, memchr: 14150.3 MB/s, memset: 12426.6 MB/s* 16M latency: 117.8 118.8 118.3 118.0 119.6 119.6 141.0 135.3* 128M latency: 133.8 132.8 134.0 144.3 133.9 132.6 133.3 134.4* 7-zip MIPS (3 consecutive runs): 11145, 10906, 11012 (11020 avg), single-threaded:3203* `aes-256-cbc 540078.51k 1003701.74k 1256093.44k 1332879.02k 1365472.60k1367829.16k`* `aes-256-cbc 540615.20k 1003659.80k 1255990.53k 1332837.72k 1365235.03k1368178.69k`
### PCIe and storage devices:
* Raspberry RP1 PCIe 2.0 South Bridge: Speed 5GT/s, Width x4, driver inuse:rp1,* 29.1GB "Samsung BJTD4R" HS400 Enhanced strobe eMMC 5.1 card as /dev/mmcblk0:date07/2024,manfid/oemid:0x000015/0x0100,hw/fwrev: 0x0/0x0300000000000000
### Swap configuration:
* /var/swap on /dev/mmcblk0p2: 512.0M (0K used) on MMC storage
### Software versions:
* Debian GNU/Linux 12 (bookworm)* Build scripts: http://archive.raspberrypi.com/debian/ bookworm main* Compiler: /usr/bin/gcc (Debian 12.2.0-14) 12.2.0 / aarch64-linux-gnu* OpenSSL 3.0.15, built on 3 Sep 2024 (Library: OpenSSL 3.0.15 3 Sep 2024)* ThreadX: 26826259 / 2024/09/23 14:02:56
### Kernel info:
* `/proc/cmdline: reboot=w coherent_pool=1M 8250.nr_uarts=1 pci=pcie_bus_safecgroup_disable=memorynuma_policy=interleavesmsc95xx.macaddr=2C:CF:67:B2:8D:E8vc_mem.mem_base=0x3fc00000vc_mem.mem_size=0x40000000console=ttyAMA10,115200console=tty1root=PARTUUID=4825a0d7-02rootfstype=ext4fsck.repair=yesrootwaitquietsplashplymouth.ignore-serial-consolescfg80211.ieee80211_regdom=TH`* Vulnerability Spec store bypass: Mitigation; Speculative Store Bypassdisabledviaprctl* Vulnerability Spectre v1: Mitigation; __user pointer sanitization* Vulnerability Spectre v2: Mitigation; CSV2, BHB* Kernel 6.6.62+rpt-rpi-2712 / CONFIG_HZ=250
All known settings adjusted for performance. Device now ready for benchmarking.Once finished stop with [ctrl]-[c] to get info about throttling, frequencycapand too high background activity all potentially invalidating benchmarkscores.All changes with storage and PCIe devices as well as suspicious dmesgcontentswill be reported too.
Time fake/real load %cpu %sys %usr %nice %io %irq Temp VCore PMIC DC(V)14:35:21: 2400/2400MHz 3.51 2% 0% 2% 0% 0% 0% 73.8°C 0.8945V 2.9W 5.13V^C
Cleaning up. Done.Checking cpufreq OPP again. Done.
Clockspeeds now at 72.7°C:
cpu0 (Cortex-A76): OPP: 2400, ThreadX: 2400, Measured: 2399
Results validation:
* Measured clockspeed not lower than advertised max CPU clockspeed* No swapping* Background activity (%system) OK* No throttling
The ambient temperature during the test was about 26°C, and no throttling was observed. However, when using CPUminer for calculations, the CPU load temperature still reached quite high, up to 79.3°C. Meanwhile, when using 7-zip for multi-core compression, the CPU temperature never exceeded 68.8°C.
Let’s see how it compares to the Raspberry Pi CM5 IO case with a built-in fan but no heatsink (ambient temperature: 32°C).
For most people, the Raspberry Pi CM5 heatsink should be a suitable cooling system, but if you plan to run the device in high-temperature (above 35°C) environments or in heat-retaining cases, it may not be sufficient.
By the way, I let the CM5 kit run overnight, and the chart below shows the effect of ambient temperature on CPU idle temperature.
The temperature dropped from 46°C at 16:00 to 38°C at 6:00, while the indoor temperature dropped from 27°C to 19°C (estimated based on weather forecasts).
Benchmarking and CPU Temperature Monitoring with Shanghai Jingheng CM5 Active Cooler
Now, let’s run the benchmark test using the active cooler:
pi@raspberrypi:~ $ sudo ./sbc-bench.sh -rStarting to examine hardware/software for review purposes...
sbc-bench v0.9.68
Installing needed tools: distro packages already installed. Done.Checking cpufreq OPP. Done.Executing tinymembench. Done.Executing RAM latency tester. Done.Executing OpenSSL benchmark. Done.Executing 7-zip benchmark. Done.Throttling test: heating up the device, 5 more minutes to wait. Done.Checking cpufreq OPP again. Done (11 minutes elapsed).
Results validation:
* Measured clockspeed not lower than advertised max CPU clockspeed* No swapping* Background activity (%system) OK* No throttling
Full results uploaded to https://0x0.st/8rH_.txt
# Raspberry Pi Compute Module 5 Rev 1.0
Tested with sbc-bench v0.9.68 on Sun, 22 Dec 2024 14:18:35 +0700. Fullinfo:[https://0x0.st/8rH_.txt](http://0x0.st/8rH_.txt)
### General information:
Information courtesy of cpufetch:
SoC: Broadcom BCM2712Technology: 16nmMicroarchitecture: Cortex-A76Max Frequency: 2.400 GHzCores: 4 coresFeatures: NEON,SHA1,SHA2,AES,CRC32
BCM2712, Kernel: aarch64, Userland: arm64
CPU sysfs topology (clusters, cpufreq members, clockspeeds)cpufreq min maxCPU cluster policy speed speed core type0 0 0 1500 2400 Cortex-A76 / r4p11 0 0 1500 2400 Cortex-A76 / r4p12 0 0 1500 2400 Cortex-A76 / r4p13 0 0 1500 2400 Cortex-A76 / r4p1
4040 KB available RAM
### Governors/policies (performance vs. idle consumption):
Original governor settings:
cpufreq-policy0: ondemand / 2400 MHz (conservative ondemand userspacepowersaveperformanceschedutil/15001600 1700 1800 1900 2000 2100 22002300 2400)
Tuned governor settings:
cpufreq-policy0: performance / 2400 MHz
Status of performance related policies found below /sys:/
/sys/module/pcie_aspm/parameters/policy: default [performance] powersavepowersupersave
### Clockspeeds (idle vs. heated up):
Before at 43.0°C:
cpu0 (Cortex-A76): OPP: 2400, ThreadX: 2400, Measured: 2398
After at 65.5°C:
cpu0 (Cortex-A76): OPP: 2400, ThreadX: 2400, Measured: 2399
### Performance baseline
* memcpy: 5707.8 MB/s, memchr: 14187.6 MB/s, memset: 12935.3 MB/s* 16M latency: 118.9 117.1 119.8 117.9 120.3 118.9 141.0 136.2* 128M latency: 133.6 132.5 133.7 142.7 134.3 132.3 133.1 134.4* 7-zip MIPS (3 consecutive runs): 11154, 11152, 11174 (11160 avg), single-threaded:3209* `aes-256-cbc 540286.17k 1003793.09k 1255994.45k 1332805.63k 1365428.91k1367692.63k`* `aes-256-cbc 540545.85k 1003955.39k 1256114.35k 1332834.30k 1364443.14k1367905.62k`
### PCIe and storage devices:
* Raspberry RP1 PCIe 2.0 South Bridge: Speed 5GT/s, Width x4, driver inuse:rp1,* 29.1GB "Samsung BJTD4R" HS400 Enhanced strobe eMMC 5.1 card as /dev/mmcblk0:date07/2024,manfid/oemid:0x000015/0x0100,hw/fwrev: 0x0/0x0300000000000000
### Swap configuration:
* /var/swap on /dev/mmcblk0p2: 512.0M (0K used) on MMC storage
### Software versions:
* Debian GNU/Linux 12 (bookworm)* Build scripts: http://archive.raspberrypi.com/debian/ bookworm main* Compiler: /usr/bin/gcc (Debian 12.2.0-14) 12.2.0 / aarch64-linux-gnu* OpenSSL 3.0.15, built on 3 Sep 2024 (Library: OpenSSL 3.0.15 3 Sep 2024)* ThreadX: 26826259 / 2024/09/23 14:02:56
### Kernel info:
* `/proc/cmdline: reboot=w coherent_pool=1M 8250.nr_uarts=1 pci=pcie_bus_safecgroup_disable=memorynuma_policy=interleavesmsc95xx.macaddr=2C:CF:67:B2:8D:E8vc_mem.mem.base=0x3fc00000vc_mem.mem.size=0x40000000console=ttyAMA10,115200console=tty1root=PARTUUID=4825a0d7-02rootfstype=ext4fsck.repair=yesrootwaitquietsplashplymouth.ignore-serial-consolescfg80211.ieee80211_regdom=TH`* Vulnerability Spec store bypass: Mitigation; Speculative Store Bypassdisabledviaprctl* Vulnerability Spectre v1: Mitigation; __user pointer sanitization* Vulnerability Spectre v2: Mitigation; CSV2, BHB* Kernel 6.6.62+rpt-rpi-2712 / CONFIG_HZ=250
All known settings adjusted for performance. Device now ready for benchmarking.Once finished stop with [ctrl]-[c] to get info about throttling, frequencycapand too high background activity all potentially invalidating benchmarkscores.All changes with storage and PCIe devices as well as suspicious dmesgcontentswill be reported too.
Time fake/real load %cpu %sys %usr %nice %io %irq Temp VCore PMIC DC(V)14:18:36: 2400/2400MHz 3.78 39% 0% 39% 0% 0% 0% 60.6°C 0.8942V 2.6W 5.13V^C
Cleaning up. Done.Checking cpufreq OPP again. Done.
Clockspeeds now at 58.4°C:
cpu0 (Cortex-A76): OPP: 2400, ThreadX: 2400, Measured: 2399
Results validation:
* Measured clockspeed not lower than advertised max CPU clockspeed* No swapping* Background activity (%system) OK* No throttling* ondemand cpufreq governor used by distro but io_is_busy not set to 1onallcores->http://tinyurl.com/44pbmw79
The ambient temperature was about 25°C. No throttling occurred, with the CPU temperature reaching a maximum of 67.2°C when using CPUminer, while the maximum during 7-zip was 63.9°C.
It looks good, but there is one issue: when I shut down the system, the fan runs at full speed, and the power socket on the wall shows a consumption of 2.3 watts…
The final test is to install the CM5 active cooler inside the IO case. After securing the motherboard to the bottom with four screws, I connected the external WiFi antenna. I also removed the fan from the top of the case.
We ultimately ended up with a complete system with a case. The fan is not perfectly centered, but it is sufficient for getting the intake needed for cooling.
It’s time to run the sbc-bench.sh file test:
pi@raspberrypi:~ $ sudo ./sbc-bench.sh -rStarting to examine hardware/software for review purposes...
sbc-bench v0.9.68
Installing needed tools: distro packages already installed. Done.Checking cpufreq OPP. Done.Executing tinymembench. Done.Executing RAM latency tester. Done.Executing OpenSSL benchmark. Done.Executing 7-zip benchmark. Done.Throttling test: heating up the device, 5 more minutes to wait. Done.Checking cpufreq OPP again. Done (11 minutes elapsed).
Results validation:
* Measured clockspeed not lower than advertised max CPU clockspeed* No swapping* Background activity (%system) OK* No throttling
Full results uploaded to https://0x0.st/8rHy.txt
# Raspberry Pi Compute Module 5 Rev 1.0
Tested with sbc-bench v0.9.68 on Sun, 22 Dec 2024 14:55:29 +0700. Fullinfo:[https://0x0.st/8rHy.txt](http://0x0.st/8rHy.txt)
### General information:
Information courtesy of cpufetch:
SoC: Broadcom BCM2712Technology: 16nmMicroarchitecture: Cortex-A76Max Frequency: 2.400 GHzCores: 4 coresFeatures: NEON,SHA1,SHA2,AES,CRC32
BCM2712, Kernel: aarch64, Userland: arm64
CPU sysfs topology (clusters, cpufreq members, clockspeeds)cpufreq min maxCPU cluster policy speed speed core type0 0 0 1500 2400 Cortex-A76 / r4p11 0 0 1500 2400 Cortex-A76 / r4p12 0 0 1500 2400 Cortex-A76 / r4p13 0 0 1500 2400 Cortex-A76 / r4p1
4044 KB available RAM
### Governors/policies (performance vs. idle consumption):
Original governor settings:
cpufreq-policy0: ondemand / 2400 MHz (conservative ondemand userspacepowersaveperformanceschedutil/15001600 1700 1800 1900 2000 2100 22002300 2400)
Tuned governor settings:
cpufreq-policy0: performance / 2400 MHz
Status of performance related policies found below /sys:/
/sys/module/pcie_aspm/parameters/policy: default [performance] powersavepowersupersave
### Clockspeeds (idle vs. heated up):
Before at 44.1°C:
cpu0 (Cortex-A76): OPP: 2400, ThreadX: 2400, Measured: 2399
After at 68.8°C:
cpu0 (Cortex-A76): OPP: 2400, ThreadX: 2400, Measured: 2399
### Performance baseline
* memcpy: 5704.2 MB/s, memchr: 14175.1 MB/s, memset: 12902.3 MB/s* 16M latency: 117.0 116.9 120.3 123.1 120.1 118.7 140.4 133.6* 128M latency: 133.6 132.6 133.9 143.8 133.9 132.2 132.9 134.0* 7-zip MIPS (3 consecutive runs): 11056, 10937, 11060 (11020 avg), single-threaded:3201* `aes-256-cbc 540240.68k 1003708.86k 1256076.37k 1332945.24k 1365475.33k1367780.01k`* `aes-256-cbc 540632.86k 1003822.31k 1256136.02k 1332974.93k 1365194.07k1368216.92k`
### PCIe and storage devices:
* Raspberry RP1 PCIe 2.0 South Bridge: Speed 5GT/s, Width x4, driver inuse:rp1,* 29.1GB "Samsung BJTD4R" HS400 Enhanced strobe eMMC 5.1 card as /dev/mmcblk0:date07/2024,manfid/oemid:0x000015/0x0100,hw/fwrev: 0x0/0x0300000000000000
### Swap configuration:
* /var/swap on /dev/mmcblk0p2: 512.0M (0K used) on MMC storage
### Software versions:
* Debian GNU/Linux 12 (bookworm)* Build scripts: http://archive.raspberrypi.com/debian/ bookworm main* Compiler: /usr/bin/gcc (Debian 12.2.0-14) 12.2.0 / aarch64-linux-gnu* OpenSSL 3.0.15, built on 3 Sep 2024 (Library: OpenSSL 3.0.15 3 Sep 2024)* ThreadX: 26826259 / 2024/09/23 14:02:56
### Kernel info:
* `/proc/cmdline: reboot=w coherent_pool=1M 8250.nr_uarts=1 pci=pcie_bus_safecgroup_disable=memorynuma_policy=interleavesmsc95xx.macaddr=2C:CF:67:B2:8D:E8vc_mem.mem.base=0x3fc00000vc_mem.mem.size=0x40000000console=ttyAMA10,115200console=tty1root=PARTUUID=4825a0d7-02rootfstype=ext4fsck.repair=yesrootwaitquietsplashplymouth.ignore-serial-consolescfg80211.ieee80211_regdom=TH`* Vulnerability Spec store bypass: Mitigation; Speculative Store Bypassdisabledviaprctl* Vulnerability Spectre v1: Mitigation; __user pointer sanitization* Vulnerability Spectre v2: Mitigation; CSV2, BHB* Kernel 6.6.62+rpt-rpi-2712 / CONFIG_HZ=250
All known settings adjusted for performance. Device now ready for benchmarking.Once finished stop with [ctrl]-[c] to get info about throttling, frequencycapand too high background activity all potentially invalidating benchmarkscores.All changes with storage and PCIe devices as well as suspicious dmesgcontentswill be reported too.
Time fake/real load %cpu %sys %usr %nice %io %irq Temp VCore PMIC DC(V)14:55:29: 2400/2400MHz 3.60 49% 0% 49% 0% 0% 0% 63.4°C 0.8948V 2.8W 5.13V14:56:29: 2400/2400MHz 1.32 0% 0% 0% 0% 0% 0% 60.0°C 0.8948V 2.3W 5.13V14:57:29: 2400/2400MHz 0.48 0% 0% 0% 0% 0% 0% 59.5°C 0.8953V 2.7W 5.13V^C
Cleaning up. Done.Checking cpufreq OPP again. Done.
Clockspeeds now at 60.0°C:
cpu0 (Cortex-A76): OPP: 2400, ThreadX: 2400, Measured: 2399
Results validation:
* Measured clockspeed not lower than advertised max CPU clockspeed* No swapping* Background activity (%system) OK* No throttling* ondemand cpufreq governor used by distro but io_is_busy not set to 1onallcores->http://tinyurl.com/44pbmw79
The ambient temperature remained around 25°C. The CPU temperature rose to 68.3°C when using the active cooler, while it reached 65.5°C when using 7-zip, only a few degrees higher than when the motherboard was outside the case.
Comparison of Raspberry Pi CM5 Cooling Solutions
Let’s compare the four cooling solutions we have tested for the Raspberry Pi CM5.
IO case with fan |
Raspberry Pi heatsink |
Shanghai Jingheng active cooler |
IO case with Shanghai Jingheng active cooler |
|
7-zip benchmark (MIPS) | 9300 | 11020 | 11160 | 11020 |
CPU max temperature (7-zip) |
85.9°C |
68.8°C |
63.9°C |
65.5°C |
CPU max temperature (CPUminer) |
86.5°C |
79.3°C |
67.2°C |
68.3°C |
CPU throttling |
Yes | No | No | No |
Shutdown power consumption |
2.5W |
1.6W | 2.3W | 2.3W |
Idle power consumption |
2.3W | 2.3W | 2.4W | 2.4W |
Only the IO case with a fan (without a heatsink) experienced CPU throttling, while neither the Raspberry Pi CM5 heatsink nor the Shanghai Jingheng CM5 active cooler showed throttling at ambient temperatures of 25-26°C. For most people, passive cooling is sufficient, but if your system is designed to operate in high-temperature (above 35°C) environments or you wish to overclock your CM5, then active cooling may provide some benefits.
Turning Off the Fan when the CM5 IO Board is Shutdown
You will also notice that the shutdown power consumption of the active cooling system is surprisingly high, as the fan runs at full speed when the system is off. The Raspberry Pi initially explained that setting “POWER_OFF_ON_HALT=0” in the EEPROM should fix the fan, but it sacrifices some power consumption. I was about to try it, but after reading more about the thread, I found that it does not work. Raspberry Pi released a fix on December 19. The new pieeprom firmware has not yet been provided via apt, so we need to download it from Github and follow the steps below to install:
wget https://github.com/timg236/rpi-eeprom/raw/927596fc312b6c2ddcf33f7b7608938241403586/firmware-2712/latest/pieeprom-2024-12-19.binsudo rpi-eeprom-update -d -f ./pieeprom-2024-12-19.bin
Below is the output of that command:
*** CREATED UPDATE ./pieeprom-2024-12-19.bin ***
CURRENT: Sun Dec 15 12:16:50 AM UTC 2024 (1734221810)UPDATE: Thu Dec 19 11:57:13 AM UTC 2024 (1734609433)BOOTFS: /boot/firmware'/tmp/tmp.4SKLxJWPj1' -> '/boot/firmware/pieeprom.upd'
UPDATING bootloader. This could take up to a minute. Please wait
*** Do not disconnect the power until the update is complete ***
If a problem occurs then the Raspberry Pi Imager may be used to createa bootloader rescue SD card image which restores the default bootloaderimage.
flashrom -p linux_spi:dev=/dev/spidev10.0,spispeed=16000 -w /boot/firmware/pieeprom.updVerifying updateVERIFY: SUCCESSUPDATE SUCCESSFUL
I also intended to change the EEPROM configuration, but it was unnecessary since POWER_OFF_ON_HALT had already been set to zero:
pi@raspberrypi:~ $ sudo rpi-eeprom-config[all]BOOT_UART=1POWER_OFF_ON_HALT=0
# Default BOOT_ORDER for provisioning# SD -> NVMe -> USB -> NetworkBOOT_ORDER=0xf2461
This does not work. Although the new firmware version was used, it turned out that the command I used to flash the firmware used the configuration in the firmware…
pi@raspberrypi:~ $ sudo rpi-eeprom-updateBOOTLOADER: up to dateCURRENT: Thu Dec 19 11:57:13 AM UTC 2024 (1734609433)LATEST: Sun Dec 15 12:16:50 AM UTC 2024 (1734221810)RELEASE: latest (/lib/firmware/raspberrypi/bootloader-2712/latest)Use raspi-config to change the release.pi@raspberrypi:~ $ sudo rpi-eeprom-config[all]BOOT_UART=1BOOT_ORDER=0xf461NET_INSTALL_AT_POWER_ON=1
So I had to use the following command line to change the configuration and add ‘POWER_OFF_ON_HALT=0’:
sudo rpi-eeprom-config --edit
We also need to reboot once more. Let’s check the bootloader version and configuration file one last time:
pi@raspberrypi:~ $ sudo rpi-eeprom-config[all]BOOT_UART=1BOOT_ORDER=0xf461NET_INSTALL_AT_POWER_ON=1POWER_OFF_ON_HALT=0pi@raspberrypi:~ $ sudo rpi-eeprom-updateBOOTLOADER: up to dateCURRENT: Sun Dec 15 12:16:50 AM UTC 2024 (1734221810)LATEST: Sun Dec 15 12:16:50 AM UTC 2024 (1734221810)RELEASE: latest (/lib/firmware/raspberrypi/bootloader-2712/latest)Use raspi-config to change the release.
What is going on? It seems that the firmware reverted to the old version. This is usually due to issues with the new bootloader, so it is using the rescue image, but here it seems random… So I flashed the image again (without using its configuration) and rebooted the device. This time everything returned to normal, so we can now prepare to shut down:
pi@raspberrypi:~ $ sudo rpi-eeprom-updateBOOTLOADER: up to dateCURRENT: Thu Dec 19 11:57:13 AM UTC 2024 (1734609433)LATEST: Sun Dec 15 12:16:50 AM UTC 2024 (1734221810)RELEASE: latest (/lib/firmware/raspberrypi/bootloader-2712/latest)Use raspi-config to change the release.pi@raspberrypi:~ $ sudo rpi-eeprom-config[all]BOOT_UART=1BOOT_ORDER=0xf461NET_INSTALL_AT_POWER_ON=1POWER_OFF_ON_HALT=0pi@raspberrypi:~ $ sudo shutdown now
The fan did indeed turn off, and the system’s power consumption during shutdown was 1.6 watts. If you want to further reduce the power consumption during shutdown, you need to set WAKE_ON_GPIO to 0, just as I did on the Raspberry Pi 5 2GB. Some HATs may be incompatible with this change…
I would like to thank Raspberry Pi for providing the Raspberry Pi CM5 development kit for review, and Shanghai Jingheng for providing the CM5 active cooler, giving us better cooling solutions.
If you want to inquire about Raspberry Pi standard products and Raspberry Pi industrial products, feel free to contact us~


We will update regularly~
Follow Raspberry Pi developers~
Learn more about Raspberry Pi related content~