web-dev-qa-db-ja.com

モジュールとしてビルドされていない場合、I2C Designwareサポートを無効にするにはどうすればよいですか?

Arch Linuxを実行しているAlienware Aurora R7を持っています。シャットダウン時にカーネルパニックが発生し、パニックメッセージに次のようなメッセージが表示されます(タイムスタンプは省略されます)。

BUG: Unable to handle kernel NULL pointer dereference at     (null)
IP: i2c_dw_isr+0x3ef/0x6d0
PGD 0 P4D 0
Oops: 0000 [#1] PREEMPT SMP PTI

さまざまなソース( 12 )から、これはi2c-designware-coreモジュールに関連しているようで、回避策はそれをブラックリストに登録しています。しかし、最近のカーネル(4.10以上のようです)では、これはモジュールとしてビルドされていないようです:

# uname -srv                      
Linux 4.15.2-2-Arch #1 SMP PREEMPT Thu Feb 8 18:54:52 UTC 2018
# zgrep DESIGNWARE /proc/config.gz
CONFIG_I2C_DESIGNWARE_CORE=y
CONFIG_I2C_DESIGNWARE_PLATFORM=y
CONFIG_I2C_DESIGNWARE_SLAVE=y
CONFIG_I2C_DESIGNWARE_PCI=m
CONFIG_I2C_DESIGNWARE_BAYTRAIL=y
CONFIG_SPI_DESIGNWARE=m
CONFIG_SND_DESIGNWARE_I2S=m
CONFIG_SND_DESIGNWARE_PCM=y

だから私はパニック時にカーネルを再起動させることに頼りました:

# cat /proc/cmdline
root=UUID=e5018f7e-5838-4a47-b146-fc1614673356 rw initrd=/intel-ucode.img initrd=/initramfs-linux.img panic=10 sysrq_always_enabled=1 printk.devkmsg=on

/proc/cmdlineの奇数パスは、efibootmgrを使用して作成されたエントリを使用して、UEFIから直接ブートするためです。パスは/bootをルートとします。ここで、my ESPがマウントされています。)

これはタッチパッド用のようですが、タッチパッドを持っていないので取得できません。これを無効にするにはどうすればよいですか? カスタムカーネルを構築する する必要がありますか?

linux-ltsも4.10(現在は4.14)よりも新しいため、古いカーネルをインストールする簡単な方法もないようで、ブラックリストが機能すると思われます。


カーネルパラメータとしてnolapicを使用すると、シャットダウンパニックの問題は解決しますが、システムが起動してから数分後にフリーズするため、使用できません。

9
muru

カーネルソースを読んだ後、ブラックリストに登録する必要がある関数を見つけました!

initcall_blacklistについてのヒントを提供してくれた Stephen Kitt に感謝します。

カーネルコマンドラインにinitcall_blacklist=dw_i2c_init_driverを追加します。これはカーネル4.15.0で動作します。

この答えを見つけるだれでものために。これを行うには、/etc/default/grubを編集します。

  1. ターミナルで実行:Sudo -H gedit /etc/default/grub
  2. ブラックリスト文字列をGRUB_CMDLINE_LINUX_DEFAULTGRUB_CMDLINE_LINUX_DEFAULT="… initcall_blacklist=dw_i2c_init_driver"に追加します。
  3. ファイルを保存し、エディターを閉じます。
  4. ターミナルで実行:Sudo update-grub
  5. 再起動してテストしてください!
12
yttrium

カーネルコマンドラインにinitcall_blacklist=i2c_dw_init_masterを追加すると、ブート中にDesignwareドライバーが初期化されなくなり、問題が完全に回避されます。

initcall_blacklistの簡単な説明については カーネルパラメータ を、より有用な背景情報については パッチ周辺のスレッド を参照してください。

7
Stephen Kitt

シャットダウンのさまざまな方法を試してみると、カーネルパラメータとしてsystemd.unit=poweroff.targetを使用してLinuxをpoweroffターゲットで起動しているようですが、正常にシャットダウンします。

そこで、より良い解決策を待つ間、単にシャットダウンするブートエントリを追加しました。これは [〜#〜] grub [〜#〜] (おそらく他のブートローダーを使用)では簡単ですが、UEFI自体を単にシャットダウンする方法を理解できませんでした。そして、AlienwareのUEFI実装は同じファイルの複数のエントリをサポートしていないようです。そのため、vmlinuz-linuxをコピーし、コピーのエントリを追加しました。

cp /boot/vmlinuz-linux /boot/vmlinuz-shutdown
cp /boot/initramfs-linux.img /boot/initramfs-shutdown.img
kernel_opts="root=UUID=e5018f7e-5838-4a47-b146-fc1614673356 ro initrd=/initramfs-shutdown.img systemd.unit=poweroff.target"
efibootmgr --disk /dev/nvme0n1 --part 1 --create --gpt --label "Shutdown" --loader /vmlinuz-shutdown --unicode "$kernel_opts"

ここで、ディスクとパーティションのオプションは私のシステムに固有です。ここで作成されたブートエントリは0001と番号が付けられたので、offスクリプトは正常にシャットダウンします。

#! /bin/sh
Sudo efibootmgr -n 0001
reboot

UEFIシャットダウンターゲットを設定する簡単な方法がおそらくあります。

0
muru