I2Cデザインウェアがモジュールとして構築されていない場合、I2Cデザインウェアサポートをどのように無効にしますか?

I2Cデザインウェアがモジュールとして構築されていない場合、I2Cデザインウェアサポートをどのように無効にしますか?

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/cmdlineUEFIから直接起動し、で作成されたエントリを使用するためですefibootmgr。ルートのルートは/bootESPがインストールされている場所です。)

これはタッチパッドのもののようですが、タッチパッドがなくて買わないと思います。この機能を無効にするにはどうすればよいですか?必須ですか?カスタムカーネルの構築

4.10(現在4.14)よりも最新バージョンなので、古いlinux-ltsカーネルをインストールする簡単な方法がないようで、ブラックリスト機能が動作することもあります。


カーネルパラメータとして使用すると、nolapicシャットダウンパニックの問題は解決されますが、起動後数分間システムがハングして使用できなくなります。

答え1

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

ありがとうスティーブンジッタのヒントinitcall_blacklist

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

この答えを見つけることができる他のすべての人に。以下を編集してこれを行うことができます/etc/default/grub

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

答え2

initcall_blacklist=i2c_dw_init_masterカーネルコマンドラインに追加すると、Designwareドライバが起動中に初期化されるのを防ぎ、問題を完全に回避できます。

バラよりカーネルパラメータの非常に簡単な説明initcall_blacklistパッチ周辺の線有用な背景情報の詳細をご覧ください。

答え3

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

だから、より良い解決策を待っている間、簡単な終了開始エントリを追加しました。それは簡単です幼虫(おそらく他のブートローダがあるでしょう)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"

ここのディスクとパーティションのオプションは、私のシステムにのみ適用されます。ここで生成された開始項目には番号が付けられているため、完全な終了を実行するにはスクリプトが必要です0001off

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

UEFI 終了ターゲットを設定するより簡単な方法があるかもしれません。

関連情報