Public bug reported:

After resuming from an s2idle suspend of 30+ minutes, the i915 driver
fails to re-enable the display.

According to logs, the C10 PHY becomes completely unresponsive
because its internal registers are inaccessible and this causes
the entire display pipeline to remain stuck, sometimes for ~60 seconds or
sometimes indefinitely (requiring a hard reset).

GNOME Shell and input handling remain functional throughout;
keystrokes typed during the black screen appear in the password box if/when
the display eventually recovers.

Short-duration suspends (<~2 minutes) resume cleanly without errors. The
failure apparently correlates with suspend duration: during long s2idle, the
display power well fully shuts down, and on resume the C10 PHY cold-start
sequence fails.

The bug does NOT reproduce on Windows (on the same laptop),
suggesting this is an i915 driver bug, not a hardware or BIOS issue.

## My setup

- Laptop: Lenovo ThinkPad P1 Gen 7 (model 21KV0025UK)
- BIOS: N48ET34W (1.21), dated 2026-05-11 (current; no LVFS updates available)
- iGPU: Intel Meteor Lake-P [Intel Arc Graphics] — PCI 8086:7d55 (rev 08)
- Kernel driver: i915
- Panel: eDP-1, 3840x2400 (16:10), 4 lanes, C10 PLL at 540 MHz port clock
- dGPU: NVIDIA AD107M [GeForce RTX 4060 Max-Q / Mobile] — PCI 10de:28a0
- Driver: nvidia 580.173.02 (open kernel module), nvidia-drm modeset=1
- NOTE: bug reproduces with and without nvidia loaded — not a factor
- suspend mode: s2idle (platform supports only s2idle; no "deep"/S3 available)

## Software

- OS: Ubuntu 24.04.5 LTS (Noble Numbat)
- Kernel: 7.0.0-31-generic (#31~24.04.1-Ubuntu PREEMPT_DYNAMIC)
(also reproduces on 7.0.0-30-generic)
- Desktop: GNOME 46.0 on Wayland (GDM)
- linux-firmware: 20240318.git3b128b60.0ubuntu3.1
- i915 firmware loaded:
- DMC: i915/mtl_dmc.bin v2.21
- GuC: i915/mtl_guc_70.bin v70.36.0
(kernel recommends v70.53.0 but only 70.36.0 available — may or may not
be related)
- HuC: i915/mtl_huc_gsc.bin v8.5.4

## To reproduce

1. Boot the system (any kernel 7.0.0-30 or 7.0.0-31)
2. Suspend (lid close or `systemctl suspend`)
3. Leave suspended for 30+ minutes (short suspends <2 min do NOT trigger it)
4. Resume (open lid / press key)
5. Observe: screen stays black for ~60 seconds (or never recovers and needs a 
hard reset)
6. Kernel log shows the error burst (see below)

Suspend duration correlation:
- Short suspends (1-2 min): 0 DRM errors, prompt in ~2s
- Long suspends (30+ min): 19-97 DRM errors, 60s+ delay or hard reset

## What does NOT work

I tried quite a few things, none of which succeeded:

- Kernel update 7.0.0-30 → 7.0.0-31: no effect
- i915.enable_psr=0 (PSR disabled): no effect
- i915.enable_dc=0 (display C-states disabled): no effect
- i915.enable_dsb=0 (Display State Buffer disabled): no effect
(DSB timeouts disappeared from logs, but core PHY failure remained)
- i915.disable_power_well=0 (keep power wells always on): no effect
- NVIDIA driver loaded vs unloaded: no effect
- nvidia_drm modeset=0 / modeset=1: no effect

## What DOES work

- Hibernation: bypasses s2idle entirely (full boot from hibernation image
re-initializes display from scratch). Zero DRM errors on resume. Confirmed
working across multiple hibernate cycles.
- Windows Modern Standby: does NOT reproduce the bug.

## What was NOT testable

- xe driver: my laptop would not boot (apparently because the xe driver does
not work in my kernel version. It refuses to probe even with
xe.force_probe=7d55, requiring both xe.force_probe=7d55 AND
i915.force_probe=!7d55. When loaded on 7.0.0-30, it registered only a
generic card0-Unknown-1 connector with no eDP display output. Not a viable
alternative without a newer kernel with proper MTL display support in xe.

## Root cause (from logs)

On resume from long s2idle, the C10 PHY cold-start sequence fails at the
hardware register level:

1. `Failed to bring PHY A to idle` PHY A cannot reach idle state
2. `PHY A Read 0c70 failed after 3 retries` PHY register 0c70 is
completely inaccessible (returns no data)
3. `PHY A Write 0c70 failed after 3 retries` writes to the PHY also fail
4. `Timeout waiting for DDI BUF A to get active` DDI buffer never enables
(depends on PHY being up)
5. `Timed out waiting for DP idle patterns` DP link training cannot proceed
6. C10 PLL state mismatch: expected clock 540000 (540 MHz), found 61440
(61.44 MHz = the idle/standby clock; PLL never re-enabled at full rate)
All PLL registers found as 0x00 (zeroed/idle state)
7. `flip_done timed out` repeating every ~10s all atomic commits fail
8. `vblank wait timed out on crtc 0` pipe is dead, no vblanks

The C10 PHY's control register interface (offset 0c70) is completely dead
after long s2idle. No i915 kernel parameter that I tried can fix this. The PHY 
itself
is in an inaccessible state. Since Windows handles the same hardware
correctly, the i915 driver is missing a step in its PHY re-initialization
sequence that the Windows Intel driver performs.

From: journalctl -b 0 -k
(With i915.enable_dc=0, i915.enable_dsb=0, i915.disable_power_well=0 all active)

Code: Select all

Sep 14 13:06:35 kernel: i915 0000:00:02.0: [drm] *ERROR* Failed to bring PHY A 
to idle.
Sep 14 13:06:35 kernel: i915 0000:00:02.0: [drm] *ERROR* PHY A Read 0c70 failed 
after 3 retries.
Sep 14 13:06:35 kernel: i915 0000:00:02.0: [drm] *ERROR* PHY A Write 0c70 
failed after 3 retries.
Sep 14 13:06:35 kernel: i915 0000:00:02.0: [drm] *ERROR* Timeout waiting for 
DDI BUF A to get active
Sep 14 13:06:35 kernel: i915 0000:00:02.0: [drm] *ERROR* Timed out waiting for 
DP idle patterns
Sep 14 13:06:35 kernel: i915 0000:00:02.0: [drm] *ERROR* [CRTC:150:pipe A] 
flip_done timed out
Sep 14 13:06:35 kernel: i915 0000:00:02.0: [drm] *ERROR* [CRTC:150:pipe A] 
mismatch in pixel_rate (expected 572010, found 65082)
Sep 14 13:06:35 kernel: i915 0000:00:02.0: [drm] *ERROR* [CRTC:150:pipe A] 
mismatch in dpll_hw_state
Sep 14 13:06:35 kernel: i915 0000:00:02.0: [drm] *ERROR* expected:
Sep 14 13:06:35 kernel: i915 0000:00:02.0: [drm] *ERROR* cx0pll_hw_state: 
lane_count: 4, ssc_enabled: no, use_c10: yes, tbt_mode: no
Sep 14 13:06:35 kernel: i915 0000:00:02.0: [drm] *ERROR* c10pll_hw_state: 
clock: 540000, fracen: yes,
Sep 14 13:06:35 kernel: i915 0000:00:02.0: [drm] *ERROR* quot: 40960, rem: 0, 
den: 1, multiplier: 140, tx_clk_div: 0.
Sep 14 13:06:35 kernel: i915 0000:00:02.0: [drm] *ERROR* c10pll_rawhw_state: 
tx: 0x10, cmn: 0x21
Sep 14 13:06:35 kernel: i915 0000:00:02.0: [drm] *ERROR* pll[0] = 0xf4, pll[1] 
= 0x0, pll[2] = 0xf8, pll[3] = 0x0
Sep 14 13:06:35 kernel: i915 0000:00:02.0: [drm] *ERROR* pll[16] = 0x84, 
pll[17] = 0x4f, pll[18] = 0xe5, pll[19] = 0x23
Sep 14 13:06:35 kernel: i915 0000:00:02.0: [drm] *ERROR* found:
Sep 14 13:06:35 kernel: i915 0000:00:02.0: [drm] *ERROR* c10pll_hw_state: 
clock: 61440, fracen: no, multiplier: 16, tx_clk_div: 0.
Sep 14 13:06:35 kernel: i915 0000:00:02.0: [drm] *ERROR* c10pll_rawhw_state: 
tx: 0x0, cmn: 0x0
Sep 14 13:06:35 kernel: i915 0000:00:02.0: [drm] *ERROR* pll[0-19] = 0x0 (all 
zeros)
Sep 14 13:06:35 kernel: i915 0000:00:02.0: [drm] *ERROR* [CRTC:150:pipe A] 
mismatch in hw.pipe_mode.crtc_clock (expected 572010, found 65082)
Sep 14 13:06:35 kernel: i915 0000:00:02.0: [drm] *ERROR* [CRTC:150:pipe A] 
mismatch in port_clock (expected 540000, found 61440)
Sep 14 13:06:35 kernel: i915 0000:00.0: [drm] pipe state doesn't match!
Sep 14 13:06:35 kernel: WARNING: 
drivers/gpu/drm/i915/display/intel_modeset_verify.c:225 at 
verify_crtc_state+0x51b/0x6c0 [i915]
Sep 14 13:06:35 kernel:  intel_modeset_verify_crtc+0x70/0xb0 [i915]
Sep 14 13:06:35 kernel:  intel_atomic_commit_tail+0x8bb/0xc80 [i915]
Sep 14 13:06:35 kernel:  intel_atomic_commit+0x2c0/0x310 [i915]
Sep 14 13:06:35 kernel:  drm_atomic_commit+0xaf/0xf0
Sep 14 13:06:35 kernel: WARNING: 
drivers/gpu/drm/i915/display/intel_dpll_mgr.c:4945 at 
verify_single_dpll_state+0x6c7/0x7e0 [i915]
Sep 14 13:06:35 kernel:  intel_modeset_verify_crtc+0x7b/0xb0 [i915]

(flip_done timeouts repeat every ~10s:)
Sep 14 13:06:45 i915 *ERROR* flip_done timed out
Sep 14 13:06:45 i915 *ERROR* [CRTC:150:pipe A] commit wait timed out
Sep 14 13:06:55 i915 *ERROR* flip_done timed out
Sep 14 13:06:55 i915 *ERROR* [CONNECTOR:507:eDP-1] commit wait timed out
Sep 14 13:07:06 i915 *ERROR* flip_done timed out
Sep 14 13:07:06 i915 *ERROR* [PLANE:34:plane 1A] commit wait timed out
...
Sep 14 13:07:57 i915 *ERROR* [CRTC:150:pipe A] flip_done timed out
Sep 14 13:07:58 i915: vblank wait timed out on crtc 0
Sep 14 13:07:58 WARNING: drivers/gpu/drm/drm_vblank.c:1320 at 
drm_crtc_wait_one_vblank+0x18c/0x200
Sep 14 13:07:58  drm_client_modeset_wait_for_vblank+0x61/0x80
Sep 14 13:07:58  drm_fb_helper_damage_work+0x8c/0x1a0

(PM: suspend exit at 13:07:57, ~90s after the first PHY error at 13:06:35)
Sep 14 13:07:57 kernel: PM: suspend exit

Seems like it needs a kernel patch in the i915 display PHY resume code
(drivers/gpu/drm/i915/display/intel_cx0_phy.c or similar), potentially
adding a forced PHY reset or an alternative re-initialization sequence for
the post-s2idle cold-start case.

## Workaround

Hibernation works. I had to fiddle around with swap space and resume paramters 
to make this work
but then `systemctl hibernate` works reliably with zero DRM errors on resume.

** Affects: linux (Ubuntu)
     Importance: Undecided
         Status: New

-- 
You received this bug notification because you are a member of Ubuntu
Bugs, which is subscribed to Ubuntu.
https://bugs.launchpad.net/bugs/2167549

Title:
  ThinkPad P1 Gen 7 Meteor Lake — i915 PHY/DPLL failure after s2idle
  resume

To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/linux/+bug/2167549/+subscriptions


-- 
ubuntu-bugs mailing list
[email protected]
https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs

Reply via email to