Wie deaktiviere ich die I2C Designware-Unterstützung, wenn sie nicht als Modul erstellt wurde?

9

Ich habe eine Alienware Aurora R7 mit Arch Linux. Beim Herunterfahren gerät der Kernel in Panik, mit etwas Ähnlichem in der Panikmeldung (ohne Zeitstempel):

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

Aus verschiedenen Quellen ( 1 , 2 ) scheint dies mit dem i2c-designware-coreModul in Zusammenhang zu stehen , und die Problemumgehung führt dazu, dass es auf die schwarze Liste gesetzt wird. Bei neueren Kerneln (scheint 4.10 und höher zu sein) scheint dies jedoch nicht als Modul aufgebaut zu sein:

# 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

Also habe ich versucht, den Kernel in Panik neu zu starten:

# 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

(Die ungeraden Pfade in /proc/cmdlinesind, weil ich direkt von UEFI boote, wobei Einträge mit erstellt werden efibootmgr. Die Pfade sind an der Stelle verwurzelt /boot, an der mein ESP bereitgestellt ist.)

Dies scheint etwas für Touchpads zu sein, aber ich habe kein Touchpad und werde keines bekommen. Was kann ich tun, um dieses Ding zu deaktivieren? Muss ich einen benutzerdefinierten Kernel erstellen ?

Da linux-ltses auch neuer als 4.10 ist (derzeit 4.14), scheint es auch keine einfache Möglichkeit zu geben, einen älteren Kernel zu installieren, bei dem Blacklisting vermutlich funktioniert.


Die Verwendung nolapicals Kernel-Parameter löst das Problem des Herunterfahrens der Panik, führt jedoch dazu, dass das System einige Minuten nach dem Start einfriert, sodass ich es nicht verwenden kann.

muru
quelle

Antworten:

12

Nachdem ich Kernelquellen gelesen hatte, fand ich eine Funktion, die wir auf die schwarze Liste setzen müssen!

Vielen Dank an Stephen Kitt für den Hinweis initcall_blacklist.

In initcall_blacklist=dw_i2c_init_driverder Kernel - Befehlszeile. Dies funktioniert für mich auf Kernel 4.15.0.

Für alle anderen, die diese Antwort finden. Sie können dies tun, indem Sie Folgendes bearbeiten /etc/default/grub:

  1. Im Terminal ausführen : sudo -H gedit /etc/default/grub.
  2. Fügen Sie eine Blacklist-Zeichenfolge an GRUB_CMDLINE_LINUX_DEFAULT: GRUB_CMDLINE_LINUX_DEFAULT="… initcall_blacklist=dw_i2c_init_driver".
  3. Speichern Sie die Datei, schließen Sie den Editor.
  4. Im Terminal ausführen : sudo update-grub.
  5. Neustart und Test!
Yttrium
quelle
Ja, die schwarze Liste hat funktioniert!
Muru
Ich verwende einen Dell Aurora R7 mit einem Nvidia 1070Ti. Ich verwende Kubuntu 18.04.2 auf dem 4.18.0-Kernel und das hat bei mir funktioniert.
Aust1n
7

Das Hinzufügen initcall_blacklist=i2c_dw_init_masterzur Kernel-Befehlszeile sollte verhindern, dass der Designware-Treiber während des Startvorgangs initialisiert wird, und das Problem insgesamt vermeiden.

In den Kernel-Parametern finden Sie eine sehr kurze Beschreibung initcall_blacklistund im Thread um den Patch finden Sie weitere nützliche Hintergrundinformationen.

Stephen Kitt
quelle
Kein Glück, ich bekomme immer noch eine Kernel-Panik i2c_dw_isr+0x3ef/0x6d0. Bedeutet das, dass die Funktion von etwas anderem gezogen wird, oder liegt der Fehler in einem anderen Modul?
Muru
Es bedeutet wahrscheinlich, dass ich die falsche Funktion für die schwarze Liste ausgewählt habe ;-). Funktioniert Blacklisting i2c_dw_probebesser? Sehen Sie die schwarze Liste in Kraft? (Es protokolliert eine Nachricht in den Kernel-Protokollen, die besagt, dass eine Funktion übersprungen wird.)
Stephen Kitt
Auch damit kein Glück initcall_blacklist=i2c_dw_init_master,i2c_dw_probe. dmesg | grep i2czeigt Einträge wie [ 0.000000] blacklisting initcall i2c_dw_init_master.
Muru
Erwähnen die Protokolle jemals so etwas initcall i2c_dw_probe blacklisted? Die blacklistingNachricht gibt an, dass der Startparameter zum Auffüllen der Liste verwendet wurde, die blacklistedNachricht zeigt jedoch an, dass der Anruf tatsächlich übersprungen wurde. Ich könnte hier den falschen Baum bellen, tut mir leid ...
Stephen Kitt
1
Nein, ich denke, es könnte nützlich sein, es in der Nähe zu halten - das Prinzip scheint solide zu sein, alles, was uns fehlt, ist die korrekte Init-Funktion. Hoffentlich kann jemand Ihre Antwort erkennen und diese bereitstellen.
Muru
0

Beim Experimentieren mit verschiedenen Methoden zum Herunterfahren scheint es, Linux unter poweroffVerwendung systemd.unit=poweroff.targeteines Kernel-Parameters auf dem Ziel zu booten . OK wird heruntergefahren.

Während ich auf eine bessere Lösung warte, habe ich einen Starteintrag hinzugefügt, der einfach heruntergefahren wird. Dies ist mit GRUB (und vermutlich mit anderen Bootloadern) einfach , aber ich konnte keinen Weg finden, UEFI selbst einfach herunterzufahren. Und es scheint, dass die UEFI-Implementierung von Alienware nicht mehrere Einträge für dieselbe Datei unterstützt. Daher habe ich am Ende vmlinuz-linuxeinen Eintrag für die Kopie kopiert und hinzugefügt:

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"

Hier sind die Festplatten- und Partitionsoptionen systemspezifisch. Der hier erstellte Starteintrag war nummeriert 0001, daher ein offSkript zum sauberen Herunterfahren:

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

Es gibt wahrscheinlich einen einfacheren Weg, ein UEFI-Abschaltziel zu haben.

muru
quelle