Arreglar la suspensió/represa a Meteor Lake: un paràmetre del kernel, un any tard
Correcció, 22-09-2026. Quan vaig publicar això vaig assenyalar
i915.enable_psr2_sel_fetch=0com la solució. No ho era. El meu panell anuncia només PSR1, així que el selective fetch no va arribar mai a actuar — el paràmetre canviava el moment de la penjada, que és exactament per què me’l vaig creure durant mesos. El paràmetre que va acabar amb les penjades ési915.enable_psr=0. L’URL conserva el nom antic per no trencar els enllaços existents; tot el que hi ha a sota és la versió corregida, i he deixat el camí equivocat al final perquè és la part instructiva.
Vaig mantenir premut el botó d’engegada més de 300 vegades en aquesta màquina.
ThinkPad P1 Gen7, Intel Core Ultra 9 185H (Meteor Lake), del kernel 6.x al 7.x. Dos símptomes, no un. Cada suspensió acabava en penjada: LED d’engegada fix, màquina morta, apagada forçada. I a banda: deixar la pantalla quieta uns cinc minuts i la màquina sencera es bloquejava sense que hi hagués cap suspensió pel mig. Més d’un any de feina real en un portàtil que no sabia ni dormir ni estar-se quiet.
El segon símptoma és el que resol el cas, i el vaig ignorar durant mesos perquè ja havia decidit que això era una fallada de suspensió.
Símptomes — perquè sàpigues si ets al lloc correcte
- Penjada en reprendre des de suspensió — LED encès, sense resposta, apagada forçada obligatòria.
- Penjada en inactivitat, sense suspensió — pantalla quieta uns 5 minuts i la màquina es bloqueja. Aquesta és la pista. Una fallada purament de suspensió no et penja la màquina mentre hi estàs assegut treballant.
- Sembla un teclat mort — l’entrada deixa de respondre mentre la resta sembla viva. No és una fallada del teclat, i perseguir-la com a tal és un parany al qual torno més avall.
- Sense logs de l’intent fallit —
journalctl -b -1surt buit o truncat; la penjada arriba abans que el journal es bolqui a disc. - Persisteix entre versions del kernel — 6.x i 7.x, igual.
- Funciona bé a Fedora, Ubuntu i Kali de sèrie. Aquesta és la pista sencera.
Maquinari que hi encaixa: qualsevol portàtil Meteor Lake (Intel Core Ultra 100 o 200) amb el driver i915, especialment amb panell eDP OLED. El P1 Gen7 està confirmat.
Causa arrel: el PSR forçat encalla el PHY eDP en sortir
Panel Self Refresh permet que el panell mantingui la seva pròpia imatge perquè el motor de display deixi d’escanejar. És un estalvi real d’energia quan funciona. En aquesta màquina no funciona.
El panell intern (Samsung SDC OLED) anuncia només PSR1 — ni PSR2 ni Panel Replay. La meva cmdline forçava i915.enable_psr=2, però el nivell el dicta el panell: el kernel negocia a la baixa i executa PSR1 igualment. Així que jo tenia configurada una cosa i n’executava una altra, que és com un any sencer tocant el botó equivocat es va mantenir plausible.
El PSR entra sol amb un frontbuffer estàtic — aquesta és la penjada en inactivitat — i amb s2idle, que és la penjada en reprendre. La fallada és a la sortida del PSR: el driver ha de tornar a enganxar el PHY C10 de Meteor Lake, i s’encalla. Vuit cicles instrumentats van fallar tots al mateix punt exacte:
Failed to bring PHY A to idle
[CONNECTOR:eDP-1] commit wait timed out
vblank wait timed out (in i915_drm_resume)
pixel_rate expected 572010 found 65082
Per què sembla una fallada del teclat. El worker de DRM encallat reté el modeset lock de DRM mentre espera un vblank que no arriba mai. Totes les tasques de GPU i del compositor s’encuen darrere d’aquest lock, i el lliurament d’esdeveniments d’entrada n’és una. Les interrupcions de serio continuen arribant per maquinari; simplement userspace no arriba mai a processar-les. Un mecanisme, dos disparadors, bloqueig total.
La solució
Mínim — afegeix això a la teva cmdline del kernel
i915.enable_psr=0 i915.enable_dc=1 i915.enable_fbc=1 mem_sleep_default=s2idle
i915.enable_psr=0— la solució. El panell és només PSR1, així que no hi ha res a ajustar: encès és precisament el que encalla el PHY.i915.enable_dc=1— estats d’estalvi DC5/DC6.enable_dc=0trenca el display en aquest stack; deixa’l fixat a 1.i915.enable_fbc=1— fixat per determinisme entre actualitzacions de kernel, no perquè arregli res.mem_sleep_default=s2idle— Meteor Lake no té S3. No posis maideep.
Amb dGPU NVIDIA (sèrie RTX)
i915.enable_psr=0
i915.enable_dc=1 i915.enable_fbc=1 i915.enable_guc=3
i915.force_probe=7d55 xe.force_probe=!7d55
nvidia_drm.modeset=1 nvidia_drm.fbdev=1
nvidia.NVreg_DynamicPowerManagement=0x02
nvidia.NVreg_PreserveVideoMemoryAllocations=0
mem_sleep_default=s2idle
i915.force_probe=7d55 i xe.force_probe=!7d55 assignen la iGPU Meteor Lake a i915 i bloquegen que el driver xe se la disputi. En un sistema de GPU dual això és obligatori. 0x7d55 és l’ID del P1 Gen7 — comprova el teu amb lspci -nn | grep VGA.
NVreg_DynamicPowerManagement=0x02 activa D3 de gra fi perquè la RTX s’apagui del tot en repòs.
NVreg_PreserveVideoMemoryAllocations depèn del driver que facis servir. Amb els mòduls oberts (nvidia-open), desar i restaurar la VRAM en suspendre ja és automàtic, així que deixa’l a 0. L’1 és per al mòdul propietari, i la documentació de gestió d’energia d’NVIDIA diu que llavors necessita el mecanisme /proc/driver/nvidia/suspend i els serveis nvidia-suspend/nvidia-resume. Per saber quin tens: modinfo -F license nvidia. Si diu Dual MIT/GPL, és l’obert.
Amb pas de GPU a QEMU/KVM
i915.enable_psr=0 i915.enable_dc=1
intel_iommu=on iommu=pt
mem_sleep_default=s2idle
iommu=pt manté baix el cost de l’IOMMU per als dispositius de l’amfitrió. Deixa’l només si fas servir VMs amb pas de GPU; CUDA a bare metal no el necessita.
Com aplicar-ho
GRUB — afegeix a GRUB_CMDLINE_LINUX_DEFAULT a /etc/default/grub i després:
sudo grub-mkconfig -o /boot/grub/grub.cfg
systemd-boot — afegeix a la línia options a /boot/loader/entries/*.conf. Sense regenerar res.
Comprova-ho en 30 segons, sense reiniciar
No cal que em creguis ni que toquis el gestor d’arrencada per sortir de dubtes. El PSR es commuta en calent via debugfs. L’índex de targeta DRI acostuma a ser 1 per a la iGPU — mira /sys/kernel/debug/dri/*/:
echo 1 | sudo tee /sys/kernel/debug/dri/1/i915_edp_psr_debug # desactiva PSR en calent
sudo cat /sys/kernel/debug/dri/1/i915_edp_psr_status # -> PSR mode: disabled
Després treballa amb normalitat, deixa la pantalla quieta més de cinc minuts i fes un sudo systemctl suspend. Si totes dues penjades desapareixen, la teva causa era el PSR — fes-ho permanent amb i915.enable_psr=0. Es desfà amb echo 0, o reiniciant.
Commuta’l amb la pantalla activa, no en repòs: així forces una sortida neta del PSR en comptes de provocar-la des de just l’estat que intentes evitar.
Verificació després de reiniciar
# Comprovar que s2idle està seleccionat
cat /sys/power/mem_sleep # s2idle entre claudàtors = seleccionat
# Comprovar que el paràmetre ha entrat
grep -o 'i915.enable_psr=[0-9]' /proc/cmdline
# Suspendre
sudo systemctl suspend
# Espera 10 segons. Prem el botó d'engegada un cop per despertar.
# Comprovació ràpida
journalctl -b | grep -E 'PM: suspend|resume'
PM: suspend entry seguit de PM: suspend exit amb uns segons de diferència vol dir que la suspensió ha funcionat. Si la màquina no respon després de prémer el botó, s’ha penjat. Abans de mantenir premut el botó d’engegada, prova la sortida del mateix kernel: Alt+PetSis, i després s, u, o — sincronitza, remunta en només lectura i apaga. En un ThinkPad sense tecla PetSis, mantén Alt primer, prem Fn+ImprPant, deixa anar aquestes dues i prem cada lletra sense deixar anar Alt. Després llegeix l’arrencada anterior:
journalctl -b -1 | grep -E 'PM: suspend|i915.*fail|PHY|flip_done|panic'
La signatura de la fallada de PSR és Failed to bring PHY A to idle i flip_done timed out. Si no hi veus cap error d’i915, tens un altre problema — mira la nota del final.
És la configuració, no el xip ni el kernel
El mateix maquinari suspèn bé a Fedora, Ubuntu i Kali amb els ajustos de sèrie. El linux d’Arch es compila del mateix arbre mainline que el de Fedora, així que la versió del kernel no va ser mai la variable — ho era la capa de configuració. Cap d’aquelles distros força el PSR. Jo sí.
I un T480s (Whiskey Lake) es va penjar igual tan bon punt va heretar la mateixa cmdline. Una altra GPU, un altre PHY, la mateixa fallada. Copia una configuració que funcioni abans de posar-te a ajustar a cegues.
Ajust d’energia — què fer un cop suspèn
Autosuspend d’USB — evita l’interruptor global
Jo tenia usbcore.autosuspend=-1 a la cmdline, que desactiva l’autosuspend d’USB per a tots els dispositius de la màquina. Funciona, i et costa bateria sense motiu. Activa l’autosuspend globalment a TLP i eximeix només els dispositius que no s’han d’adormir:
# /etc/tlp.conf
USB_AUTOSUSPEND=1
USB_DENYLIST="1050:0407 27c6:6594 04f2:b805"
Aquests IDs són una YubiKey (1050:0407), un lector d’empremta Goodix (27c6:6594) i una càmera integrada Chicony (04f2:b805). Busca els teus amb lsusb, i afegeix-hi adaptadors Bluetooth, lectors de targeta i qualsevol cosa que hagi de respondre a l’instant.
Treu usbcore.autosuspend=-1 un cop confirmis que la suspensió funciona, regenera la configuració de GRUB, reinicia i torna a provar.
TLP a Meteor Lake
CPU_DRIVER_OPMODE_ON_AC=active
CPU_DRIVER_OPMODE_ON_BAT=active
CPU_SCALING_GOVERNOR_ON_AC=powersave
CPU_SCALING_GOVERNOR_ON_BAT=powersave
CPU_BOOST_ON_AC=1
CPU_BOOST_ON_BAT=0
PLATFORM_PROFILE_ON_AC=balanced
PLATFORM_PROFILE_ON_BAT=low-power
active és el mode correcte per a intel_pstate a MTL — no el passis a passive. El governador powersave amb intel_pstate no és el que el nom suggereix: continua pujant la freqüència quan cal, només que decideix millor quan.
Què costa realment desactivar el PSR
Mesurat en aquesta màquina amb i915.enable_psr=0:
- Consum en repòs: ~6 W de sistema complet (
upower, energy-rate) - Residència RC6 de la GPU Intel: ~99% (
intel_gpu_top) — la iGPU està aparcada gairebé tota la finestra de repòs - Bateria: més de 14 h en repòs fins a descàrrega completa amb una bateria de 90 Wh
És a dir: renuncies a un estalvi petit de self-refresh i a canvi la màquina reprèn, i no es bloqueja mentre l’estàs mirant. Si vols recuperar aquest watt, treu-lo de la ruta de repòs amb un framebuffer en negre — a OLED, negre vol dir píxels apagats — i no reactivant el PSR que encalla el PHY. I deixa l’apagada de panell per DPMS fora d’això: mou el mateix PHY.
Problemes coneguts no crítics
NVIDIA “PRH failed to update thermal limit”
NVRM: GPU0 nvAssertFailedNoLog: Assertion failed: PRH failed to update thermal limit!
Surt dues vegades per arrencada al meu sistema. És un bug d’nvidia-open — el Platform Request Handler no aconsegueix sincronitzar amb el firmware GSP. No és fatal, no provoca penjades, no afecta la suspensió. Canvia al paquet propietari nvidia si et molesta; si no, ignora’l.
“Correcting number of heads (0x00)” — esperat quan no hi ha cap pantalla externa connectada. No és la teva configuració.
Deprecació de vm.laptop_mode a TLP — cosmètic. Treu la línia de la teva config de TLP.
El que vaig fer malament (i val la pena llegir-ho)
Durant mesos vaig estar convençut que el culpable era el selective fetch de PSR2. Vaig posar i915.enable_psr2_sel_fetch=0, vaig deixar enable_psr=2 i vaig citar linux-surface #2158 com a suport. Canviava el moment de la fallada, així que me’l vaig creure. Era irrellevant: el panell va en PSR1, així que sel_fetch no va ser mai a la ruta. Les penjades van continuar. El que les va acabar va ser apagar el PSR sencer.
Un paràmetre que desplaça els símptomes no és un paràmetre que arregli la causa. Verifica contra un sistema que saps que funciona, en comptes de raonar cap endavant des d’un mecanisme plausible, que és el que vaig fer durant un any.
Dos més, en la mateixa línia:
- No afegeixis mai cap paràmetre d’arrencada
i8042.*. Amb la teoria del teclat vaig provari8042.reset i8042.nopnp. S’executen dins de la ruta de represa d’s2idle i pengen la màquina sencera — estrictament pitjor que la fallada original. No va ser mai el teclat; el teclat era aigües avall del modeset lock. - No posis
mei/mei_mea la llista negra. S’enllaça a i915 com amei_gsc_proxy, cosa que el situa aigües avall de la GPU, no com a causa. Posar-lo a la llista negra va moure la fallada de lloc i no va arreglar res.
Un any i més de 300 apagades forçades per una sola línia, i la línia ni tan sols va ser la que vaig publicar primer. Així són les coses de vegades.
Si això no ho arregla
enable_psr=0 acaba amb la classe de penjada del PSR. No acaba amb totes les fallades de represa d’aquesta plataforma, i jo encara en persegueixo una.
Compara els teus logs abans que els teus símptomes. Si la penjada en reprendre ve amb els errors de PHY A i flip_done de dalt, ets a la fallada de què tracta aquest article. Si el que se’t mor és l’escriptori i tots els dispositius d’entrada alhora mentre el kernel continua funcionant amb normalitat — SSH respon, el disc sincronitza — i dmesg no mostra ni un sol *ERROR* de cap driver, això és una altra cosa completament diferent. El meu va resultar estar a la capa de sessió. En tots els cicles fallits que vaig capturar, logind no va posar en pausa el dispositiu DRM de la iGPU en suspendre, i en reprendre li va enviar igualment l’ordre de reprendre. Xorg no va reaccionar a aquesta ordre i va continuar fent modeset sense ser DRM master, cosa que falla. El kernel no és la variable: el kernel LTS 6.18 falla exactament igual que el 7.2. Està obert amunt a systemd#43352, i no està arreglat.
Per a aquest tampoc no cal el botó d’engegada. Alt+PetSis+k (SAK) mata tot el que penja de la consola activa, és a dir, la sessió de X congelada i res més. Amb el meu autologin, la sessió nova era a punt en un segon; amb un gestor de pantalla hauries de tornar a la seva pantalla de login. Els serveis del sistema continuen funcionant. logind també mor, perquè té la consola oberta, però es reinicia sol en un segon. Les finestres obertes es perden, perquè moren amb X. Si vols, prova abans v uns segons; no costa res, però a mi no em va tornar la sessió.
Un dmesg net és evidència, no silenci. Vaig trigar una quantitat vergonyosa de temps a tractar-lo com a tal.
Referències
- linux-surface issue #2158 — la discussió sobre PSR/sel_fetch. Val la pena llegir-la, però sel_fetch és irrellevant en un panell només-PSR1
- Arch BBS #313469 — fil de la regressió MTL al kernel 7.x
- systemd issue #43352 — pausa i represa de dispositius de logind en suspendre; la penjada de sessió, diferent, que descric a dalt
- meteor-lake-suspend-fix — la mateixa solució com a repositori, amb
check-psr.shper confirmar l’estat persistent després de reiniciar - Documentació de TLP
Angel Sulev
Cybersecurity + Agentic AI Expert
Especialista sènior en ciberseguretat i IA Agèntica amb 30+ anys transformant la seguretat en avantatge competitiu.
Més sobre miArticles Relacionats
LLMs privats vs ChatGPT: per què la teva empresa no hauria d'usar l'API d'OpenAI per a dades sensibles
Cada vegada que el teu equip enganxa un contracte, un correu intern o dades de clients al ChatGPT, …
Zero Trust no és un producte que compres: és una arquitectura que construeixes
En els últims anys, “Zero Trust” ha passat de ser un concepte de seguretat rigorós a una …
