Como desabilito o suporte do I2C Designware quando ele não é construído como um módulo?

6

Eu tenho um Alienware Aurora R7, rodando o Arch Linux. No desligamento, o kernel entra em pane, com algo parecido com isso na mensagem de pânico (omitindo os timestamps):

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

De várias fontes ( 1 , 2 ), isso parece estar relacionado ao módulo i2c-designware-core , e a solução é colocá-lo na lista negra . No entanto, com kernels recentes (parece ser 4,10 e acima), isso não parece ser construído como um módulo:

# 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

Por isso, recorri ao reinício do kernel em pânico:

# 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

(Os caminhos ímpares no /proc/cmdline são porque eu inicializo diretamente do UEFI, com entradas criadas usando efibootmgr . Os caminhos estão enraizados em /boot , onde meu ESP está montado.)

Isso parece ser algo para touchpads, mas eu não tenho um touchpad e não recebo um. O que posso fazer para desativar essa coisa? Eu tenho que construir um kernel personalizado ?

Como linux-lts também é mais recente que 4.10, (4.14, atualmente), parece não haver uma maneira fácil de instalar um kernel mais antigo, em que a lista negra pode, presumivelmente, funcionar.

Usar nolapic como um parâmetro do kernel resolve o problema de pânico de desligamento, mas faz com que o sistema congele alguns minutos após a inicialização, então não posso usá-lo.

    
por muru 13.02.2018 / 11:43

3 respostas

7

Depois de ler as fontes do kernel, encontrei uma função que precisamos para fazer uma lista negra!

Agradecimentos a Stephen Kitt pela dica sobre initcall_blacklist .

Adicione initcall_blacklist=dw_i2c_init_driver à linha de comando do kernel. Isso funciona para mim no kernel 4.15.0.

Para qualquer outra pessoa que encontre essa resposta. Você pode fazer isso editando /etc/default/grub :

  1. Executar no terminal: sudo -H gedit /etc/default/grub .
  2. Anexar uma string da lista negra ao GRUB_CMDLINE_LINUX_DEFAULT : GRUB_CMDLINE_LINUX_DEFAULT="… initcall_blacklist=dw_i2c_init_driver" .
  3. Salve o arquivo e feche o editor.
  4. Executar no terminal: sudo update-grub .
  5. Reinicie e teste!
por 30.05.2018 / 15:25
6

Adicionar initcall_blacklist=i2c_dw_init_master à linha de comando do kernel deve impedir que o driver do Designware seja inicializado durante a inicialização e evitar o problema.

Veja os parâmetros do kernel para uma breve descrição de initcall_blacklist e o tópico em torno do patch para informações básicas mais úteis.

    
por 13.02.2018 / 12:00
0

Experimentando várias maneiras de desligar, parece que a inicialização do Linux para o poweroff target usando systemd.unit=poweroff.target como um parâmetro do kernel é encerrado OK.

Então, enquanto espero uma solução melhor, adicionei uma entrada de inicialização que simplesmente é encerrada. Isso é fácil com GRUB (e presumivelmente com outros gerenciadores de inicialização), mas eu não pude descobrir uma maneira de ter o próprio UEFI simplesmente desligado. E parece que a implementação UEFI da Alienware não suporta múltiplas entradas para o mesmo arquivo, então acabei copiando vmlinuz-linux e adicionando uma entrada para a cópia:

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"

Aqui, as opções de disco e partição são específicas do meu sistema. A entrada de inicialização criada aqui foi numerada 0001 , portanto, um script off para fornecer um desligamento limpo:

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

Provavelmente, existe uma maneira mais simples de ter um destino de encerramento da UEFI.

    
por 13.02.2018 / 15:56