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

다양한 출처에서 (1,2), 이는 모듈과 관련된 것으로 보입니다 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"

여기의 디스크 및 파티션 옵션은 내 시스템에만 적용됩니다. 여기에 생성된 시작 항목에는 번호가 매겨져 있으므로 완전한 종료를 수행하려면 스크립트가 필요합니다 0001.off

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

UEFI 종료 대상을 설정하는 더 쉬운 방법이 있을 수 있습니다.

관련 정보