r/LinuxOnThinkpad • u/No_Guard8232 • 2d ago
Solved ThinkPad P1 Gen 7 (Meteor Lake + RTX Ada) Linux Power Guide: Sleep, Wake Freezes & Upstream Status
I wanted to share a comprehensive write-up and guide for anyone running Linux on the ThinkPad P1 Gen 7 (or similar Intel Core Ultra / Meteor Lake-P laptops with hybrid NVIDIA Ada graphics).
Over the past month, I wrestled with every layer of the power management stack—from broken S4 hibernation to black screens after overnight sleep. Here is the complete breakdown of what works, what fails, the hardware root causes, and how to configure a stable baseline.
Hardware & Environment
- Chassis: Lenovo ThinkPad P1 Gen 7
- CPU / iGPU: Intel Core Ultra 7 (Meteor Lake-P Arc Graphics
8086:7d55) - dGPU: NVIDIA RTX 1000 Ada Generation Laptop GPU
- OS / Kernel: Linux Mint 22 (Cinnamon) / Ubuntu 24.04 HWE (Kernel 7.0 series)
- NVIDIA Driver: 580.xx Proprietary
Part 1: S4 Hibernation vs. S2idle Sleep
On older ThinkPads, users relied on S3 deep sleep or S4 disk hibernation. On this generation:
1. Hardware S3 Sleep Is Dead: Lenovo removed ACPI S3 deep sleep from the BIOS firmware. The machine only supports Modern Standby ([s2idle]).
2. S4 Hibernation Fails on Wake: Even with a dedicated bare-metal swap partition and correct offsets, S4 image restoration fails at the device-freeze stage:
nvidia 0000:01:00.0: PM: pci_pm_freeze(): nv_pmops_freeze [nvidia] returns -5
The proprietary 580 driver panics when reconciling PCIe power states during early initramfs memory restore.
3. Verdict: Abandon S4 hibernation. Modern Standby (s2idle) is the only viable path on this chassis.
Part 2: Taming the NVIDIA Ada dGPU
To make s2idle work without the dGPU draining battery or rejecting sleep:
Add dynamic power management and VRAM preservation in
/etc/modprobe.d/nvidia-pm.conf: ```text options nvidia NVreg_DynamicPowerManagement=0x02 options nvidia NVreg_PreserveVideoMemoryAllocations=1 options nvidia NVreg_TemporaryFilePath=/var/tmp```
Enable the systemd power helper services:
```bash sudo systemctl enable nvidia-suspend.service nvidia-resume.service sudo update-initramfs -u
```
Result: This allows the RTX 1000 Ada to enter $D3_{\text{cold}}$ (0W power draw) during normal desktop use and sleep cleanly during suspend.
Part 3: The Display Wake Freeze (The Hard Battle)
After getting s2idle working, extended sleep sessions (over 1 hour or overnight) resulted in an unresponsive, completely black screen upon opening the lid. The laptop was awake in the background (fprintd read fingerprints, systemd logged power buttons), but the display remained pitch black.
What Failed
- **
i915.enable_psr=0:** Disabling Panel Self Refresh ini915resolved boot errors (Selective fetch area calculation failed in pipe A) and stabilized short sleeps (<30 mins), but extended sleeps still deadlocked withpipe_off wait timed outinintel_disable_transcoder. - Disabling FBC / Display C-States: Tweaking
enable_fbc=0andenable_dc=0did not stop the transcoder hang. - Switching to the
xeDriver: Meteor Lake is primarily supported on the newerxedriver. We migrated viai915.force_probe=!7d55 xe.force_probe=7d55 xe.enable_psr=0. While active performance was great, extended sleeps still failed.
The Real Root Cause: CX0 PHY / DP Idle Timeout
Dumping detailed kernel traces after an extended sleep revealed the actual point of failure:
```text xe 0000:00:02.0: [drm] ERROR Timeout waiting for DDI BUF A to get active xe 0000:00:02.0: [drm] ERROR Timed out waiting for DP idle patterns xe 0000:00:02.0: [drm] pipe_off wait timed out WARNING: ... at intel_disable_transcoder [xe]
```
- On Meteor Lake, the internal eDP panel is connected to Intel’s CX0 PHY (C10/C20 transceiver).
- During extended
s2idle, power to the SoC transmitter is cut. - On cold resume, the kernel driver’s link-check workqueue fires asynchronously before the CX0 PHY PLL clock locks over the internal message bus (MSGBUS).
- With no clock running, DisplayPort idle patterns fail. The driver attempts an emergency link retrain, tries to disable the active transcoder, and waits for VBLANK pulses to empty the hardware FIFO buffers. Because the physical clock never started, zero pulses arrive, triggering the 5-second
pipe_offtimeout and locking the display pipeline.
Part 4: The Solutions & Current Baseline
1. Upstream Driver Status
This is a recognized upstream driver timing regression on hybrid Meteor Lake laptops. Intel DRM developers submitted a patch series titled drm/i915/cx0: fix PLL enable failure handling on Meteor Lake to handle unresponsive PHY buses on resume. It has landed in the 7.1 kernel branch and is awaiting backporting to stable distro point releases.
2. Firmware Update via LVFS / fwupd
Lenovo released an updated Corporate ME / Power Management Controller (PMC) firmware (1.21.2911) that updates the onboard PMC to 1800.15.0.1064 and NPHY to 18.1.0.7015. Make sure to apply pending firmware updates:
```bash sudo fwupdmgr refresh sudo fwupdmgr update
```
3. Recommended GRUB Baseline
The cleanest, most stable kernel command line for this platform is:
```text GRUB_CMDLINE_LINUX_DEFAULT="quiet splash nvidia-drm.modeset=1 i915.force_probe=!7d55 xe.force_probe=7d55 xe.enable_psr=0"
```
nvidia-drm.modeset=1: Required for smooth KMS handoffs and dGPU sleep transitions.i915.force_probe=!7d55 xe.force_probe=7d55: Binds the Arc iGPU to the activexedriver.xe.enable_psr=0: Suppresses buggy Panel Self Refresh coordinate math on the internal BOE panel.
4. The Workaround: The "Double-Lid Cycle" (No Cold Reboots)
If you open your laptop after a long sleep and the screen remains completely black, do not hard-reboot with the power button:
- Close the laptop lid.
- Wait 5–10 seconds until the ThinkPad red LED starts its slow, rhythmic sleep pulse.
- Open the lid again.
The initial wake attempt already re-energized the motherboard power rails. On the second wake, the warm transceiver locks its clocks immediately, DP idle patterns establish in microseconds, and the screen turns on with your entire desktop session and open work completely intact.
Hope this saves other P1 Gen 7 owners the weeks of troubleshooting I went through!