ThinkPad T14 Gen3 のサスペンド問題

前回の続き

ThinkPad T14 Gen3 の Ubuntu がサスペンドすると正常に復帰しない。

画面が消えたまま。10秒くらい待ってると点灯するけど数秒でまた消える…というのを繰り返し。 X が起動してると何もわからないので、コンソールでサスペンドを試すとこんなメッセージが出てた。

i915 0000:00:02.0: [drm] *ERROR* Failed to write source OUI
i915 0000:00:02.0: [drm] *ERROR* [ENCODER:235:DDI A/PHY A][DPRX] Failed to enable link training
i915 0000:00:02.0: [drm] *ERROR* Failed to read DPCD register 0x92
i915 0000:00:02.0: [drm] *ERROR* Failed to write source OUI
i915 0000:00:02.0: [drm] *ERROR* [ENCODER:235:DDI A/PHY A][DPRX] Failed to enable link training
i915 0000:00:02.0: [drm] *ERROR* Failed to read DPCD register 0x92
i915 0000:00:02.0: [drm] *ERROR* Failed to read DPCD register 0x92
i915 0000:00:02.0: [drm] *ERROR* Failed to write source OUI
〜以下繰り返し〜

一応、Alt + PrtSc + [R] [E] [I] [S] [U] [B]アレは効くので電源ボタンを長押ししなくても再起動は可能。

Ubuntu をセットアップしたのが 7/10 で、それ以降時間のあるときにググってみたり、Ubuntu mainlineに新しいカーネルが出てれば試してみたりしたんだけど、解決しなかった。

今日またいつものようにググってたら新しい情報をみつけた。

[ADL_P] Dual eDP support is missing, PPS state tracking gets confused, backlight does not work (#5531) · Issues · drm / intel · GitLab

Ubuntu じゃなくて Arch Linux だけど、ThinkPad T14 Gen3 Intel版でサスペンドが正常に働かずに画面がついたり消えたりする…というようなことが書かれてる。 ThinkPad T シリーズの BIOS にはバグがあって、HDMI ポートが存在しない eDP と共有しているとかなんとか(よくわかってない)。

i915 カーネルモジュールにパッチを当てて作り直せばいいっぽい。これは期待!

カーネルのバージョンが違うんで、パッチはそのままは適用できないけど、似たような処理を探してテキトーに。

i915.ko は linux-modules-extra-5.15.0-43-generic に含まれてる:

~% dpkg -S i915.ko
linux-modules-extra-5.15.0-43-generic: /lib/modules/5.15.0-43-generic/kernel/drivers/gpu/drm/i915/i915.ko

カーネルのソースをもってきて、該当ソースを改変:

~% mkdir /tmp/x
~% cd /tmp/x
/tmp/x% apt source linux-modules-extra-5.15.0-43-generic
...
/tmp/x% cd linux-5.15.0
/tmp/x/linux-5.15.0% vim ./drivers/gpu/drm/i915/display/intel_bios.c

差分。return; をコメントアウトしただけ:

/tmp/x/linux-5.15.0% diff -u ./drivers/gpu/drm/i915/display/intel_bios.c.orig ./drivers/gpu/drm/i915/display/intel_bios.c
--- ./drivers/gpu/drm/i915/display/intel_bios.c.orig  2022-07-24 17:09:36.000000000 +0900
+++ ./drivers/gpu/drm/i915/display/intel_bios.c   2022-07-24 17:11:26.940061516 +0900
@@ -1950,7 +1950,7 @@
        drm_dbg_kms(&i915->drm,
                "More than one child device for port %c in VBT, using the first.\n",
                port_name(port));
-      return;
+//     return;
    }
 
    sanitize_device_type(devdata, port);

パッケージバージョンを指定する。debian.master/changelog の先頭にテキトーに追加:

linux (5.15.0-43.99tmtms) jammy; urgency=medium

  * i915 patch

ABI check でエラーになるので無視するように設定:

/tmp/x/linux-5.15.0% touch debian.master/abi/amd64/ignore

deb パッケージを作成:

/tmp/x/linux-5.15.0% debuild --no-lintian -uc -us -b
...
/tmp/x/linux-5.15.0% cd ..
/tmp/x% ls *.deb
linux-buildinfo-5.15.0-43-generic_5.15.0-43.99tmtms_amd64.deb
linux-cloud-tools-5.15.0-43-generic_5.15.0-43.99tmtms_amd64.deb
linux-cloud-tools-5.15.0-43_5.15.0-43.99tmtms_amd64.deb
linux-cloud-tools-common_5.15.0-43.99tmtms_all.deb
linux-doc_5.15.0-43.99tmtms_all.deb
linux-headers-5.15.0-43-generic_5.15.0-43.99tmtms_amd64.deb
linux-headers-5.15.0-43_5.15.0-43.99tmtms_all.deb
linux-image-unsigned-5.15.0-43-generic_5.15.0-43.99tmtms_amd64.deb
linux-libc-dev_5.15.0-43.99tmtms_amd64.deb
linux-modules-5.15.0-43-generic_5.15.0-43.99tmtms_amd64.deb
linux-modules-extra-5.15.0-43-generic_5.15.0-43.99tmtms_amd64.deb
linux-modules-iwlwifi-5.15.0-43-generic_5.15.0-43.99tmtms_amd64.deb
linux-source-5.15.0_5.15.0-43.99tmtms_all.deb
linux-tools-5.15.0-43-generic_5.15.0-43.99tmtms_amd64.deb
linux-tools-5.15.0-43_5.15.0-43.99tmtms_amd64.deb
linux-tools-common_5.15.0-43.99tmtms_all.deb
linux-tools-host_5.15.0-43.99tmtms_all.deb

一時間くらい掛かる。このうち必要なのは linux-modules-extra-5.15.0-43-generic_5.15.0-43.99tmtms_amd64.deb だけなので、これだけ作る方法はないんかな…。

インストール:

/tmp/x% sudo dpkg -i linux-modules-extra-5.15.0-43-generic_5.15.0-43.99tmtms_amd64.deb
...

Linux を再起動。

無事サスペンドできるようになった。わーい 🎉🎉🎉

本体の HDMI が使えなかったのも同じ原因だったらしく、HDMI もちゃんと使えるようになった。わーい 👏👏👏

カーネルアップデートのたびにこれをやるのは面倒だし忘れそうだから、Lenovo さんは早く BIOS を修正して欲しい…。