Arreglar la suspensió/represa a Meteor Lake: un paràmetre del kernel, un any tard
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. Cada intent de suspensió acabava igual: penjada en entrar o pantalla negra en reprendre, i tot seguit apagada forçada. Més d’un any de feina real en una màquina incapaç de dormir. Això no és una molèstia menor — vol dir no poder tancar la tapa durant una reunió, no poder suspendre ràpid entre tasques, la bateria esgotant-se perquè vas oblidar endollar-la abans d’aixecar-te.
Vaig provar el que era obvi. PSR1, DC2, EnableS0ixPowerManagement, split_lock_detect. Dos intents al 6.18, tots dos penjades completes sense logs per inspeccionar. La solució era un únic paràmetre que em va faltar tota l’estona.
Símptomes — perquè sàpigues que ets al lloc correcte
- Penjada en entrar a suspensió (el sistema s’atura, la pantalla s’apaga, no desperta)
- Pantalla negra en reprendre — LED d’engegada actiu, màquina sense resposta
- Apagada forçada obligatòria cada cop
- Sense logs de l’intent fallit (journalctl -b -1 és buit o truncat — la penjada passa abans que el logger bolqui a disc)
- El problema persisteix entre versions del kernel (6.x i 7.x afectades)
- Funciona bé sota Windows — és específic de Linux
Maquinari que encaixa: qualsevol portàtil Meteor Lake (Intel Core Ultra sèrie 100 o 200) que usi el driver i915 per a la GPU integrada. El P1 Gen7 està confirmat. Altres sistemes MTL amb dGPU NVIDIA probablement estiguin afectats.
Causa arrel
PSR2 (Panel Self Refresh 2) permet al controlador de pantalla saltar-se la lectura de fotogrames quan res no canvia a la pantalla. La variant de lectura selectiva (psr2_sel_fetch) és més agressiva — només llegeix les regions del fotograma que han canviat.
A Meteor Lake, aquesta lectura selectiva corromp l’estat del pipeline de pantalla abans que s’executi la ruta de suspensió. El driver i915 pateix una fallada d’atomic commit, que penja la GPU, cosa que impedeix que el traspàs de suspensió es completi netament. Resultat: penjada.
El projecte linux-surface va aïllar això a l’issue #2158. La solució desactiva la lectura selectiva mantenint PSR2 actiu — conserves l’estalvi d’energia de la pantalla i només perds la variant més agressiva de regions parcials.
La solució
Mínima — afegeix això a la cmdline del teu kernel
i915.enable_psr=2 i915.enable_dc=1 i915.enable_psr2_sel_fetch=0 mem_sleep_default=s2idle
i915.enable_psr=2— PSR2 activat (estalvia ~0.3 W, habilita DEEP_SLEEP)i915.enable_dc=1— estats d’energia de pantalla DC5/DC6i915.enable_psr2_sel_fetch=0— la solució: desactiva la lectura selectiva, evita la penjadamem_sleep_default=s2idle— Meteor Lake no té S3; s2idle (S0ix) és el que hi ha
i915.enable_psr2_sel_fetch=0 és l’única línia que ho canvia tot. La resta és ajust fi.
Amb dGPU NVIDIA (sèrie RTX)
i915.enable_psr=2 i915.enable_dc=1 i915.enable_psr2_sel_fetch=0
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=1
mem_sleep_default=s2idle
i915.force_probe=7d55 i xe.force_probe=!7d55 assignen explícitament la iGPU Meteor Lake al driver i915 i bloquegen que el driver xe hi competeixi. En un sistema de doble GPU això importa. 0x7d55 és el device ID del P1 Gen7 — el teu pot diferir; comprova’l amb lspci -nn | grep VGA.
NVreg_DynamicPowerManagement=0x02 habilita D3 de gra fi per a la dGPU (la RTX talla la seva alimentació quan està inactiva).NVreg_PreserveVideoMemoryAllocations=1 permet al driver NVIDIA desar i restaurar l’estat de la VRAM a través de la suspensió — necessari per a una represa fiable quan la dGPU estava activa.
Amb passthrough de GPU a QEMU/KVM
i915.enable_psr=2 i915.enable_dc=1 i915.enable_psr2_sel_fetch=0
intel_iommu=on iommu=pt
mem_sleep_default=s2idle
iommu=pt (mode passthrough) manté baix el sobrecost de l’IOMMU per als dispositius de l’amfitrió. Mantén-lo si executes VMs amb passthrough de GPU; CUDA en bare metal no el necessita.
Com aplicar-ho (GRUB / grub-btrfs / systemd-boot)
GRUB — edita /etc/default/grub, afegeix a GRUB_CMDLINE_LINUX_DEFAULT, i tot seguit:
sudo grub-mkconfig -o /boot/grub/grub.cfg
systemd-boot — edita la teva entrada de loader a /boot/loader/entries/*.conf, afegeix a la línia options. No cal reconstruir res.
Proves
# Verificar que s2idle està actiu
cat /sys/power/mem_sleep
# Hauria de mostrar: s2idle [s2idle] o similar — s2idle entre claudàtors = seleccionat
# Forçar-lo si no està posat
echo s2idle | sudo tee /sys/power/mem_sleep
# Suspendre
sudo systemctl suspend
# Espera 10 segons. Prem el botó d'engegada un cop per despertar.
# Si funciona — captura els logs immediatament
dmesg > dmesg-after-suspend.log
journalctl -b > journal-after-suspend.log
# Comprovació ràpida
journalctl -b | grep -E 'PM: suspend|resume'
Si veus PM: suspend entry i PM: suspend exit al journal amb timestamps separats per uns segons, la suspensió ha funcionat. Si la màquina no respon després de prémer el botó d’engegada, s’ha penjat. Apagada forçada, i tot seguit:
# Revisar l'arrencada anterior
journalctl -b -1 | grep -E 'PM: suspend|i915.*fail|drm.*fail|panic'
dmesg -b -1 > dmesg-failed.log
El mode de fallada sol mostrar errors de drm_atomic_commit o fallades d’asserció d’i915 just abans del punt de penjada.
Ajust d’energia — què fer quan la suspensió ja funciona
Autosuspend d’USB — no usis l’interruptor global
Tenia usbcore.autosuspend=-1 a la meva cmdline, que desactiva l’autosuspend d’USB per a tots els dispositius globalment. Funciona, però és mandrós i costa bateria. L’enfocament correcte: activar l’autosuspend globalment a TLP i eximir només els dispositius que no han de dormir.
# /etc/tlp.conf
USB_AUTOSUSPEND=1
USB_DENYLIST="1050:0407 27c6:6594 04f2:b805"
Els IDs de dalt són el YubiKey (1050:0407), el lector d’empremta Goodix (27c6:6594) i la càmera integrada Chicony (04f2:b805). Troba els teus amb lsusb. Afegeix dongles Bluetooth, lectors de targetes intel·ligents, qualsevol cosa que hagi de respondre a l’instant.
Treu usbcore.autosuspend=-1 de la teva cmdline després de confirmar que la suspensió funciona. Regenera la config de GRUB, reinicia, torna a provar.
TLP — ja ben afinat per a Meteor Lake
Si uses TLP, els ajustos que importen a MTL:
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
El mode active és el correcte per a intel_pstate a MTL — no canviïs 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 amb millors decisions d’eficiència.
Consum d’energia — mesurat després de la solució
En repòs, pantalla encesa, amb bateria, escriptori lleuger:
- Consum en repòs: ~6.5 W de tot el sistema (energy-rate d’
upower) - Potència del paquet de CPU: ~2.4 W (
turbostat --show PkgWatt) - Residència RC6 de la GPU Intel: 98% (
intel_gpu_top) — la iGPU queda aparcada gairebé tota la finestra en repòs - Bateria: ~13 h en repòs (89.9 Wh a plena càrrega ÷ 6.5 W; bateria al 99.9% de salut) — 12 h+ realista, en ús mixt menys
Un 98% de RC6 vol dir que PSR2 fa la seva feina sense el bloqueig del selective fetch; per sobre del 90% en repòs és l’objectiu. Confirma-ho a la teva màquina amb intel_gpu_top i turbostat.
Problemes coneguts no crítics
NVIDIA “PRH failed to update thermal limit”
NVRM: GPU0 nvAssertFailedNoLog: Assertion failed: PRH failed to update thermal limit!
Apareix dues vegades a l’arrencada (als ~7 s i ~147 s al meu sistema). És un bug a nvidia-open — el Platform Request Handler no aconsegueix sincronitzar amb el firmware GSP. No és fatal; no provoca penjades; no afecta la suspensió. Si et molesta, canvia al paquet propietari nvidia. Si no, ignora’l de moment.
“Correcting number of heads (0x00)”
Esperat quan no hi ha cap pantalla externa connectada. No és un bug de la teva configuració.
Deprecació de vm.laptop_mode a TLP
tlp: vm.laptop_mode is deprecated. Ignoring setting.
Treu la línia de la teva config de TLP. Cosmètic.
El que feia malament abans d’això
Al 6.18 usava i915.enable_psr=1 (PSR1) i i915.enable_dc=2. Dos intents amb penjada, sense logs cap de les vegades. El paràmetre enable_psr2_sel_fetch no existia en aquella configuració. Aquí era el buit — no al nivell de PSR, ni al mode DC. Una sola línia que faltava.
nvidia.NVreg_EnableS0ixPowerManagement=1 també hi era. Amb psr2_sel_fetch=0 al seu lloc, aquest paràmetre és innecessari — el problema de suspensió és al costat del pipeline de pantalla, no a la negociació d’S0ix. El vaig treure de la config actual.
Un any i més de 300 apagades forçades per una sola línia. Així són les coses de vegades.
Referències
- linux-surface issue #2158 — on es va identificar la causa arrel de PSR2 sel_fetch
- Arch BBS #313469 — fil de la regressió MTL al kernel 7.x
- Meteor Lake power tuning guide
- TLP documentation
- Ubuntu certified: ThinkPad P1 Gen7
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 …
