mbox series

[00/11] ARM: bcm2835: Implement initial S2Idle for Raspberry Pi

Message ID 20240630153652.318882-1-wahrenst@gmx.net
Headers show
Series ARM: bcm2835: Implement initial S2Idle for Raspberry Pi | expand

Message

Stefan Wahren June 30, 2024, 3:36 p.m. UTC
This series implement the initial Suspend-To-Idle support for
the Raspberry Pi, which was a long time on my TODO list [1]. The
changes allow to suspend and resume the Raspberry Pi via debug UART.
The focus is on the BCM2835 SoC, because it's less complex than its
successors and have enough documentation.

The series is a loose collection of fixes and improvements.
So cherry-picking should be fine.

Test steps:
- configure debug console (pl011 or mini UART) as wakeup source
- send system to idle state

  echo freeze > /sys/power/state

- wakeup system by console traffic

The implementation isn't perfect and contains workarounds like
patch 4 and 9. So there is still room for improvements, but
at least the system won't freeze forever as before [2].

Here are some figures for the Raspberry Pi 1 (without any
devices connected except of a debug UART):

running but CPU idle = 1.67 W
suspend to idle      = 1.33 W

The series has been tested on the following platforms:
Raspberry Pi 1 B
Raspberry Pi 3 A+
Raspberry Pi 3 B+

Known issues:
- currently it's not possible to power down the USB domain [3]
- there seems to be an issue with the DWC2 suspend handling [4]

[1] - https://github.com/lategoodbye/rpi-zero/issues/9
[2] - https://bugzilla.redhat.com/show_bug.cgi?id=2283978
[3] - https://github.com/raspberrypi/firmware/issues/1894
[4] - https://lore.kernel.org/linux-usb/3fd0c2fb-4752-45b3-94eb-42352703e1fd@gmx.net/T/

Stefan Wahren (11):
  firmware: raspberrypi: Improve timeout warning
  mailbox: bcm2835: Fix timeout during suspend mode
  pmdomain: raspberrypi-power: Adjust packet definition
  pmdomain: raspberrypi-power: Avoid powering down USB
  irqchip/bcm2835: Enable SKIP_SET_WAKE and MASK_ON_SUSPEND
  drm/vc4: hdmi: Handle error case of pm_runtime_resume_and_get
  drm/vc4: hdmi: Disable connector status polling during suspend
  usb: dwc2: debugfs: Print parameter no_clock_gating
  usb: dwc2: Skip clock gating on Broadcom SoCs
  serial: 8250_bcm2835aux: add PM suspend/resume support
  ARM: bcm2835_defconfig: Enable SUSPEND

 arch/arm/configs/bcm2835_defconfig        |  2 --
 drivers/firmware/raspberrypi.c            |  3 ++-
 drivers/gpu/drm/vc4/vc4_hdmi.c            | 18 +++++++++++++++++-
 drivers/irqchip/irq-bcm2835.c             |  4 +++-
 drivers/mailbox/bcm2835-mailbox.c         |  3 ++-
 drivers/pmdomain/bcm/raspberrypi-power.c  | 17 ++++++++++++-----
 drivers/tty/serial/8250/8250_bcm2835aux.c | 23 +++++++++++++++++++++++
 drivers/usb/dwc2/debugfs.c                |  1 +
 drivers/usb/dwc2/params.c                 |  1 +
 9 files changed, 61 insertions(+), 11 deletions(-)

--
2.34.1

Comments

Peter Robinson July 2, 2024, 8:08 p.m. UTC | #1
Hi Stefan,

> This series implement the initial Suspend-To-Idle support for
> the Raspberry Pi, which was a long time on my TODO list [1]. The
> changes allow to suspend and resume the Raspberry Pi via debug UART.
> The focus is on the BCM2835 SoC, because it's less complex than its
> successors and have enough documentation.

Firstly a big thank you for this work!

> The series is a loose collection of fixes and improvements.
> So cherry-picking should be fine.
>
> Test steps:
> - configure debug console (pl011 or mini UART) as wakeup source
> - send system to idle state
>
>   echo freeze > /sys/power/state
>
> - wakeup system by console traffic
>
> The implementation isn't perfect and contains workarounds like
> patch 4 and 9. So there is still room for improvements, but
> at least the system won't freeze forever as before [2].

I've got a test kernel for Fedora that I'm going to test on
RPi3/Zero2W so let me know if you want me to test anything in
particular, I will do my best to give review/test on each individual
test over the next few days.

Cheer,
Peter

> Here are some figures for the Raspberry Pi 1 (without any
> devices connected except of a debug UART):
>
> running but CPU idle = 1.67 W
> suspend to idle      = 1.33 W
>
> The series has been tested on the following platforms:
> Raspberry Pi 1 B
> Raspberry Pi 3 A+
> Raspberry Pi 3 B+
>
> Known issues:
> - currently it's not possible to power down the USB domain [3]
> - there seems to be an issue with the DWC2 suspend handling [4]
>
> [1] - https://github.com/lategoodbye/rpi-zero/issues/9
> [2] - https://bugzilla.redhat.com/show_bug.cgi?id=2283978
> [3] - https://github.com/raspberrypi/firmware/issues/1894
> [4] - https://lore.kernel.org/linux-usb/3fd0c2fb-4752-45b3-94eb-42352703e1fd@gmx.net/T/
>
> Stefan Wahren (11):
>   firmware: raspberrypi: Improve timeout warning
>   mailbox: bcm2835: Fix timeout during suspend mode
>   pmdomain: raspberrypi-power: Adjust packet definition
>   pmdomain: raspberrypi-power: Avoid powering down USB
>   irqchip/bcm2835: Enable SKIP_SET_WAKE and MASK_ON_SUSPEND
>   drm/vc4: hdmi: Handle error case of pm_runtime_resume_and_get
>   drm/vc4: hdmi: Disable connector status polling during suspend
>   usb: dwc2: debugfs: Print parameter no_clock_gating
>   usb: dwc2: Skip clock gating on Broadcom SoCs
>   serial: 8250_bcm2835aux: add PM suspend/resume support
>   ARM: bcm2835_defconfig: Enable SUSPEND
>
>  arch/arm/configs/bcm2835_defconfig        |  2 --
>  drivers/firmware/raspberrypi.c            |  3 ++-
>  drivers/gpu/drm/vc4/vc4_hdmi.c            | 18 +++++++++++++++++-
>  drivers/irqchip/irq-bcm2835.c             |  4 +++-
>  drivers/mailbox/bcm2835-mailbox.c         |  3 ++-
>  drivers/pmdomain/bcm/raspberrypi-power.c  | 17 ++++++++++++-----
>  drivers/tty/serial/8250/8250_bcm2835aux.c | 23 +++++++++++++++++++++++
>  drivers/usb/dwc2/debugfs.c                |  1 +
>  drivers/usb/dwc2/params.c                 |  1 +
>  9 files changed, 61 insertions(+), 11 deletions(-)
>
> --
> 2.34.1
>