[RFC] VPU Suspend-to-RAM for BCM2710A1 (Raspberry Pi Zero 2W)
Chaitanya Malhotra
chetanvmalhotra at gmail.com
Tue Mar 3 15:15:53 PST 2026
Background
----------
The BCM283x/BCM2710 family has never supported true suspend-to-RAM.
The VPU (VideoCore IV) is the system supervisor, and the stock firmware
has no code to preserve SDRAM through self-refresh or restore state on wake.
As discussed in the canonical issue [1], RPi engineers estimated this would
require "a couple of man years of engineering work" in GPU firmware.
Implementation
--------------
I've implemented VPU-level suspend-to-RAM as a custom bootcode.bin based
on the open-source rpi-open-firmware [2]:
- SDRAM self-refresh entry/exit with DDR PLL relock (3-retry)
- PHY DLL reset with OMAP3-style kick (3-retry)
- VPU scalar register save/restore in VC4 assembly
- GPIO3 wake via VPU IC0 interrupt routing (hw intno 49)
- ARM power-gate/ungate (full PM_PROC sequence)
- JEDEC ZQ calibration + PVT compensation after self-refresh exit
All register addresses verified against Broadcom's auto-generated headers
in common/broadcom/bcm2708_chip/. 22 address/bit position bugs found
and fixed from initial guesses.
Code: https://github.com/bhoot1234567890/vc4-suspend
Status: Code complete, compiles clean (-Wall -Werror).
Awaiting first hardware boot on Pi Zero 2W.
Questions
---------
1. Is there interest in kernel-side integration (mailbox to VPU)?
2. Any known silicon differences between BCM2710A1 and BCM2837
that affect suspend behavior?
3. Has anyone attempted VPU-level suspend before?
References
----------
[1] https://github.com/raspberrypi/linux/issues/1281
[2] https://github.com/librerpi/rpi-open-firmware
[3] Broadcom Patent US8452997B2 (suspend-to-SDRAM method)
More information about the linux-arm-kernel
mailing list