Linux

當 I2C Designware 未建構為模組時,如何禁用它?

  • May 30, 2018

我有一台執行 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是因為我直接從 UEFI 啟動,並使用創建的條目efibootmgr。路徑植根於/bootESP 安裝的位置。)

這似乎是觸摸板的東西,但我沒有觸摸板,也不會得到。我能做些什麼來禁用這個東西?我必須建構自定義核心嗎?

由於linux-lts也比 4.10(目前為 4.14)更新,似乎也沒有一種簡單的方法來安裝較舊的核心,黑名單可能會起作用。


使用nolapic作為核心參數解決了關機恐慌問題,但它會導致系統在啟動後凍結幾分鐘,所以我不能使用它。

在閱讀核心原始碼後,我發現了一個我們需要黑名單的功能!

感謝Stephen Kitt的提示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. 重啟並測試!

引用自:https://unix.stackexchange.com/questions/423797