🎃

怪しい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 アダプタ接続時

方針(概要)

  1. EC が使う GPE 番号を特定する
  2. 一時的にその GPE を 無効化して挙動を確認
  3. 問題なければ ブートパラメータ 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桁で並んでいる点に注意(例:gpe6E0x6Egpe60x06 で別物)。

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 側で線は開いているが
  • maskedOS が受け取らない ので実際には届かない(マスクが優先)

気になるなら一度だけ クリアできます:

echo clear | sudo tee /sys/firmware/acpi/interrupts/gpe6E

5. それでも _Q01/CHRG のログが残る理由

acpi_mask_gpe=0x6eIRQ 由来の連発は止まります
ただし _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