怪しいACPI絡みの割り込みを握り潰して誤魔化す方法 on Linux
Dynabook RZ/EX + Ubuntu 24.04 で発生する ACPI AE_NOT_FOUND を「GPE マスク」で暫定回避する
Dynabook RZ/EX(Meteor Lake / BIOS 21.91)に Ubuntu 24.04(kernel 6.15.x ※ mainline)を入れたところ、dmesg に以下の ACPI エラーが大量に出て、タッチパッド(I²C-HID)が固まることがありました。こうなってしまうと関係しそうなドライバのinsmod/rmmodを行っても復活せず、再起動しないと復活しません。
ChatGPTさんに相談したところGPEマスクを使って暫定回避する方法を教えてくれました。
同様なトラブルに悩む方のために、ここで回避手順を共有したいと思います。
ACPI Error: Aborting method \_SB.PC00.LPCB.EC._Q01 due to previous error (AE_NOT_FOUND) (20240827/psparse-529)
ACPI BIOS Error (bug): Could not resolve symbol [\_SB.PC00.LPCB.EC._Q01.CHRG], AE_NOT_FOUND (20240827/psargs-332)
i2c_designware i2c_designware.0: controller timed out
原因は EC(Embedded Controller)由来の GPE(General-Purpose Event) が頻発し、ACPI メソッド _Q01 を叩くたびに CHRG オブジェクト解決に失敗 → ログが雪崩れる、という挙動でした。
BIOS アップデートが無い場合の暫定ワークアラウンドとして、問題の GPE を OS 側でマスク(無視) することで実害(I²C タイムアウト等)を止めることができました。
注意
GPE をマスクすると EC 依存のイベント通知(例:バッテリー残量の即時更新など)が遅れたり止まる 可能性があります。副作用を確認しつつ自己責任で適用してください。
環境
- PC: Dynabook RZ/EX
- BIOS: Version 21.91 (2024-08-26)
- OS: Ubuntu 24.04.2 LTS
- Kernel: mainline
6.15.1/6.15.2 - 症状が特に目立つタイミング: AC アダプタ接続時
方針(概要)
- EC が使う GPE 番号を特定する
- 一時的にその GPE を 無効化して挙動を確認
- 問題なければ ブートパラメータ
acpi_mask_gpe=で恒久化
本機では GPE 0x6E が該当で、acpi_mask_gpe=0x6e で改善しました。
1. GPE 番号の特定
A. sysfs のカウンタを見る(お手軽)
# 現在の GPE 統計を一覧
grep . /sys/firmware/acpi/interrupts/gpe* | sort
# 変化を監視(AC アダプタ抜き差しなどでカウントが伸びる GPE を探す)
watch -d -n 0.5 "grep . /sys/firmware/acpi/interrupts/gpe* | sort"
カウントが猛烈に増える gpeXX が犯人です。
※ 16進2桁で並んでいる点に注意(例:gpe6E は 0x6E、gpe6 は 0x06 で別物)。
B. debugfs で EC の GPE を直読み(確実)
sudo mount -t debugfs none /sys/kernel/debug
cat /sys/kernel/debug/ec/ec0/gpe # ここに EC に紐づく GPE が出る
C. DSDT を見る(最終確認)
sudo apt install -y acpica-tools
sudo acpidump -o tables.dat
iasl -d tables.dat # → dsdt.dsl などが展開される
grep -n "Device (EC" -A4 -B4 dsdt.dsl | grep _GPE
Name (_GPE, 0x6E) のような記述や、_GPE メソッドの返り値が該当。
2. 一時的にマスクして確認
# 例: 0x6E を無効化
echo disable | sudo tee /sys/firmware/acpi/interrupts/gpe6E
# 元に戻す
echo enable | sudo tee /sys/firmware/acpi/interrupts/gpe6E
この状態で I²C タイムアウトやタッチパッド停止が消えるか確認します。
3. 恒久化(GRUB のカーネル引数)
/etc/default/grub を編集し、GRUB_CMDLINE_LINUX_DEFAULT に追加します。
- GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
+ GRUB_CMDLINE_LINUX_DEFAULT="quiet splash acpi_mask_gpe=0x6e"
反映・再起動:
sudo update-grub
sudo reboot
4. 適用確認のポイント
dmesg での確認
ブート直後に以下のような行が出ます。
ACPI: Masking GPE 0x6e.
ACPI: EC: GPE=0x6e
→ ブートパラメータ適用 OK(EC は 0x6E を使う設計だが、OS がマスクして受け取らない)。
sysfs での確認
cat /sys/firmware/acpi/interrupts/gpe6E
例(起動直後):
0 STS enabled masked
-
先頭の数字 … IRQ 受付回数(
0=届いていない → ストーム停止) -
STS … Status bit。EC 側で「一度発火した」履歴が残っていることの表示
(IRQ を受けないため OS 側でクリアされず、STS が立ちっぱなしでも正常) - enabled … APIC 側で線は開いているが
- masked … OS が受け取らない ので実際には届かない(マスクが優先)
気になるなら一度だけ クリアできます:
echo clear | sudo tee /sys/firmware/acpi/interrupts/gpe6E
5. それでも _Q01/CHRG のログが残る理由
acpi_mask_gpe=0x6e で IRQ 由来の連発は止まります。
ただし _Q01 は ポーリング等の同期呼び出しでも走るケースがあり、起動直後などに少数の
ACPI BIOS Error (bug): Could not resolve symbol [\_SB.PC00.LPCB.EC._Q01.CHRG], AE_NOT_FOUND
が残ることがあります。ここは 実害なし(重要なのは i2c_designware ... timed out が消えること)。
6. さらに静かにしたい場合(任意)
-
起動後に再クリアするワンショットサービス(お好みで)
/etc/systemd/system/gpe6e-mask.service[Unit] Description=Force-disable/clear GPE 0x6E after boot After=multi-user.target [Service] Type=oneshot ExecStart=/bin/sh -c 'echo disable > /sys/firmware/acpi/interrupts/gpe6E; echo clear > /sys/firmware/acpi/interrupts/gpe6E' [Install] WantedBy=multi-user.target有効化:
sudo systemctl enable --now gpe6e-mask.service -
DSDT オーバーライドで
_Q01の中身を空にする(上級者向け・副作用検証必須)
7. ロールバック
GRUB の acpi_mask_gpe=0x6e を削除して update-grub → 再起動。
一時無効化の場合は echo enable > /sys/firmware/acpi/interrupts/gpe6E。
8. 既知の副作用とチェック項目
-
バッテリー残量更新が遅い/止まる:
upower --monitorで変化が届くか確認 -
熱/ファン挙動が変:
sensorsの温度更新を確認 - これらに問題が出る場合はマスクを諦めるか、DSDT 側でピンポイント修正を検討
9. 参考ログ(適用時の抜粋)
[ 0.317590] ACPI BIOS Error (bug): Could not resolve symbol [...SS0x], AE_NOT_FOUND
...
[ 0.357911] ACPI: Masking GPE 0x6e.
...
[ 0.601519] ACPI: EC: GPE=0x6e
...
[ 1.532943] ACPI BIOS Error (bug): Could not resolve symbol [\_SB.PC00.LPCB.EC._Q01.CHRG], AE_NOT_FOUND
# 以後、I²C の "controller timed out" は再現せず
まとめ
-
問題の GPE を突き止めてマスクすると、
AE_NOT_FOUNDに起因する 実害(I²C タイムアウトやタッチパッド停止)を止められる。 - 本機(RZ/EX)では
0x6Eが EC GPE で、acpi_mask_gpe=0x6eが有効だった。 - dmesg の
_Q01/CHRGは少数残るが 無視してよい(IRQ ストームが止まっていることが大事)。 - **副作用(バッテリー更新/熱管理)**の影響を必ずチェック。
付録:コマンド早見表
# GPE 一覧と監視
grep . /sys/firmware/acpi/interrupts/gpe* | sort
watch -d -n 0.5 "grep . /sys/firmware/acpi/interrupts/gpe* | sort"
# EC の GPE(debugfs)
sudo mount -t debugfs none /sys/kernel/debug
cat /sys/kernel/debug/ec/ec0/gpe
# 一時無効化/復帰/クリア
echo disable | sudo tee /sys/firmware/acpi/interrupts/gpe6E
echo enable | sudo tee /sys/firmware/acpi/interrupts/gpe6E
echo clear | sudo tee /sys/firmware/acpi/interrupts/gpe6E
# 恒久化(GRUB)
sudoedit /etc/default/grub # acpi_mask_gpe=0x6e を追加
sudo update-grub
sudo reboot
おわりに
この方法はあくまで「OS 側で怪しい割り込みを握り潰す」暫定策です。最終的には BIOS/ACPI の修正が本筋になります。同様の症状で困っている方の一助になれば幸いです。
Discussion