[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