Linux Programmer

Fedora 35 : Thunderbolt 4 Maple ridge 인식 실패 문제 본문

컴퓨터 관련/리눅스(유닉스) 일반

Fedora 35 : Thunderbolt 4 Maple ridge 인식 실패 문제

sunyzero 2022. 5. 9. 23:12

Fedora 35 에서 Intel JHL 8540 Maple ridge 칩셋이 내장된 메인보드(B550 ProArt)의 썬더볼트가 제대로 인식되지 않는 문제 해결 방법에 대한 글이다.

2022-09-29 변경사항 : kernel 5.18로 업그레이드 후에 인식 실패 문제는 사라졌음. (이 글은 커널 5.18미만에서 유효함)

 

* 하드웨어/소프트웨어 환경

M/B : ASUS B550 ProArt
OS : Fedora 35 (Kernel 5.17.5-200)
BIOS 설정 : ErP 활성화(S5) => ErP 설정을 disable 시키면 Thunderbolt device failure 증상이 생기기도 한다. (이외에 BIOS를 업데이트하면 인식이 안되는 경우도 있는데, 바이오스 설정을 factory default로 리셋시키면 다시 인식되었다)

 

* 증상 및 확인

유저 권한 : root (모든 명령어는 root 권한으로 실행한다)

썬더볼트 하드웨어 인식을 lspci 이나 journalctl (== dmesg) 으로 확인해보면 다음과 같다. 먼저 lspci로 확인해보면 다음과 같이 Maple Ridge 칩셋이 장착된 것이  확인된다. 즉 하드웨어 인식은 되고 있다는 뜻이다.

# lspci
...생략...
00:18.7 Host bridge: Advanced Micro Devices, Inc. [AMD] Matisse/Vermeer Data Fabric: Device 18h; Function 7
01:00.0 Non-Volatile memory controller: Samsung Electronics Co Ltd NVMe SSD Controller PM9A1/PM9A3/980PRO
02:00.0 USB controller: Advanced Micro Devices, Inc. [AMD] 500 Series Chipset USB 3.1 XHCI Controller
02:00.1 SATA controller: Advanced Micro Devices, Inc. [AMD] 500 Series Chipset SATA Controller
02:00.2 PCI bridge: Advanced Micro Devices, Inc. [AMD] 500 Series Chipset Switch Upstream Port
03:00.0 PCI bridge: Advanced Micro Devices, Inc. [AMD] Device 43ea
03:04.0 PCI bridge: Advanced Micro Devices, Inc. [AMD] Device 43ea
03:09.0 PCI bridge: Advanced Micro Devices, Inc. [AMD] Device 43ea
04:00.0 PCI bridge: Intel Corporation Thunderbolt 4 Bridge [Maple Ridge 4C 2020] (rev 02)
05:00.0 PCI bridge: Intel Corporation Thunderbolt 4 Bridge [Maple Ridge 4C 2020] (rev 02)
05:01.0 PCI bridge: Intel Corporation Thunderbolt 4 Bridge [Maple Ridge 4C 2020] (rev 02)
05:02.0 PCI bridge: Intel Corporation Thunderbolt 4 Bridge [Maple Ridge 4C 2020] (rev 02)
05:03.0 PCI bridge: Intel Corporation Thunderbolt 4 Bridge [Maple Ridge 4C 2020] (rev 02)
06:00.0 USB controller: Intel Corporation Thunderbolt 4 NHI [Maple Ridge 4C 2020]
1f:00.0 USB controller: Intel Corporation Thunderbolt 4 USB Controller [Maple Ridge 4C 2020]
38:00.0 Non-Volatile memory controller: Silicon Motion, Inc. SM2262/SM2262EN SSD Controller (rev 03)
39:00.0 Ethernet controller: Intel Corporation Ethernet Controller I225-V (rev 03)
3a:00.0 Network controller: Intel Corporation Wi-Fi 6 AX210/AX211/AX411 160MHz (rev 1a)
...생략...

lspci 출력 중간에 Intel Corporation Thunderbolt 4 Bridge [Maple Ridge 4C 2020] (rev 02) 부분에서 하드웨어 명세가 확인되고 있다.

이제 썬더볼트 작동을 담당하는 bolt service 작동을 확인한 뒤에 bolt CLI 명령어로 썬더볼트 포트를 확인해보기 위해 boltctl list -a 명령을 내려보면 아무것도 나오지 않는다. 썬더볼트 포트가 정상 작동중이라면 뭔가 나와야 하는데 아무것도 나오지 않는다.

# systemctl is-active bolt
active
# boltctl list -a
...아무것도 나오지 않음...

혹시 부팅시에 문제가 생긴 것인지 확인하기 위해 journalctl 부팅 메시지에서 thunderbolt 단어를 검색해보면 다음과 같이 보인다. (dmesg 명령을 대신 사용해도 된다)

# journalctl -b -o short-monotonic | grep thunderbolt
[    5.203207] localhost.localdomain kernel: ACPI: bus type thunderbolt registered
[    5.216234] localhost.localdomain kernel: thunderbolt 0000:06:00.0: AMD-Vi: Event logged [IO_PAGE_FAULT domain=0x0011 address=0xcaebf500 flags=0x0020]
[   25.715220] localhost.localdomain kernel: thunderbolt 0000:06:00.0: AMD-Vi: Event logged [IO_PAGE_FAULT domain=0x0011 address=0xcaebf600 flags=0x0020]
[   46.194546] localhost.localdomain kernel: thunderbolt 0000:06:00.0: AMD-Vi: Event logged [IO_PAGE_FAULT domain=0x0011 address=0xcaebf700 flags=0x0020]
[   66.675250] localhost.localdomain kernel: thunderbolt 0000:06:00.0: AMD-Vi: Event logged [IO_PAGE_FAULT domain=0x0011 address=0xcaebf800 flags=0x0020]
[   87.151930] localhost.localdomain kernel: thunderbolt 0000:06:00.0: failed to send driver ready to ICM
[   87.152012] localhost.localdomain kernel: thunderbolt: probe of 0000:06:00.0 failed with error -110

부팅 후 5.2초쯤에 IO_PAGE_FAULT가 발생하고, 87.1초 경에 boltctl 명령어 사용시에는 failed to send driver ready to ICM, failed with error -110이 발생하는데 bolt service가 하드웨어를 제대로 인식하지 못하는 듯 하다.

 

* 해결 방안

해결 방안은 간단하게 thunderbolt 커널 모듈을 리로드하면 된다. 커널 모듈 리로드 방법은 rmmod로 먼저 모듈을 제거하고, 그 다음에 modprobe로 로딩하면 된다. 이를 bash 셸 명령어로 표현하면 다음과 같다. 간혹 명령어가 실패하는 경우도 있는데, 그런 경우는 몇 초뒤에 재시도 하면 된다. 혹은 이미 rmmod가 되어있거나 thunderbolt가 없는 경우는 modprobe thunderbolt만 명령해도 된다.

# rmmod thunderbolt && modprobe thunderbolt

하지만 부팅후 매번 rmmod, modprobe 명령을 내리기는 상당히 귀찮으므로 systemd unit 으로 만들어두자.

systemd unit 파일의 local용 디렉토리인 /etc/systemd/system 디렉토리로 가자. 그리고 vim thunderbolt_reload.service 명령으로 unit 파일을 하나 새로 만든다. 그리고 아래 내용을 타이핑한다.

# Reload a kernel module for TB
[Unit]
Description=Thunderbolt 4 Bridge - Maple Ridge
After=multi-user.target
Requires=bolt.service
StartLimitBurst=10

[Service]
Type=oneshot
Restart=on-failure
ExecStart=/bin/bash -c '/usr/sbin/rmmod thunderbolt && /usr/sbin/modprobe thunderbolt'
ExecReload=/bin/bash -c '/usr/sbin/rmmod thunderbolt && /usr/sbin/modprobe thunderbolt'
RestartSec=30s
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

저장 후 unit 파일이 부팅 후에 자동 실행하도록 설정하기 위해 systemctl 명령을 사용한다.

# systemctl daemon-reload
# systemctl enable thunderbolt_reload.service

이제 재부팅 후 journalctl 로 확인해보면 다음과 같이 보일 것이다.

# journalctl -ru thunderbolt_reload.service
May 09 21:09:59 localhost.localdomain systemd[1]: Finished Thunderbolt 4 Bridge - Maple Ridge.
May 09 21:09:59 localhost.localdomain systemd[1]: Starting Thunderbolt 4 Bridge - Maple Ridge...
May 09 21:09:59 localhost.localdomain systemd[1]: Stopped Reload driver for Thunderbolt 4 Bridge - Maple Ridge.
May 09 21:09:59 localhost.localdomain systemd[1]: thunderbolt_reload.service: Scheduled restart job, restart counter is at 3.
May 09 21:09:28 localhost.localdomain systemd[1]: Failed to start Reload driver for Thunderbolt 4 Bridge - Maple Ridge.
May 09 21:09:28 localhost.localdomain systemd[1]: thunderbolt_reload.service: Failed with result 'exit-code'.
May 09 21:09:28 localhost.localdomain systemd[1]: thunderbolt_reload.service: Main process exited, code=exited, status=1/FAILURE
May 09 21:09:28 localhost.localdomain bash[6741]: rmmod: ERROR: Module thunderbolt is in use
May 09 21:09:28 localhost.localdomain systemd[1]: Starting Thunderbolt 4 Bridge - Maple Ridge...
May 09 21:09:28 localhost.localdomain systemd[1]: Stopped Thunderbolt 4 Bridge - Maple Ridge.
May 09 21:09:28 localhost.localdomain systemd[1]: thunderbolt_reload.service: Scheduled restart job, restart counter is at 2.
May 09 21:08:58 localhost.localdomain systemd[1]: Failed to start Thunderbolt 4 Bridge - Maple Ridge.
May 09 21:08:58 localhost.localdomain systemd[1]: thunderbolt_reload.service: Failed with result 'exit-code'.
May 09 21:08:58 localhost.localdomain systemd[1]: thunderbolt_reload.service: Main process exited, code=exited, status=1/FAILURE
May 09 21:08:58 localhost.localdomain bash[5427]: rmmod: ERROR: Module thunderbolt is in use
May 09 21:08:58 localhost.localdomain systemd[1]: Starting Thunderbolt 4 Bridge - Maple Ridge...
May 09 21:08:58 localhost.localdomain systemd[1]: Stopped Thunderbolt 4 Bridge - Maple Ridge.
May 09 21:08:58 localhost.localdomain systemd[1]: thunderbolt_reload.service: Scheduled restart job, restart counter is at 1.
May 09 21:08:28 localhost.localdomain systemd[1]: Failed to start Thunderbolt 4 Bridge - Maple Ridge.
May 09 21:08:28 localhost.localdomain systemd[1]: thunderbolt_reload.service: Failed with result 'exit-code'.
May 09 21:08:28 localhost.localdomain systemd[1]: thunderbolt_reload.service: Main process exited, code=exited, status=1/FAILURE
May 09 21:08:28 localhost.localdomain bash[3355]: rmmod: ERROR: Module thunderbolt is in use
May 09 21:08:28 localhost.localdomain systemd[1]: Starting Thunderbolt 4 Bridge - Maple Ridge...
-- Boot 414edc90a7544fbbace82916344037ce --

thunderbolt 관련 모듈이 사용중일때는 rmmod가 제대로 작동하지 않으므로 30초마다 재시도 옵션을 걸어두었기 때문에 위와 같이 재시도를 한다. 위 로그에 따르면 3번째 재시도에 성공해서 커널 모듈이 리로드 되었음을 알 수 있다.

 

* 부수적인 방안

간혹 전력(power)이 제대로 돌지 않는 경우에는 직접 force_power를 켜면 된다. 먼저 썬더볼트 device부터 확인해보면 다음과 같이 볼 수 있다.

# ls -l /sys/bus/wmi/devices/86CCFD48-205E-4A77-9C48-2021CBEDE341/
rwxrwxrwx. 1 root root    0 Mar 21 13:24 driver -> ../../../../../../bus/wmi/drivers/intel-wmi-thunderbolt
-r--r--r--. 1 root root 4096 Mar 21 13:24 expensive
--w-------. 1 root root 4096 Mar 21 13:21 force_power
-r--r--r--. 1 root root 4096 Mar 21 13:24 guid
-r--r--r--. 1 root root 4096 Mar 21 13:24 instance_count
-r--r--r--. 1 root root 4096 Mar 21 13:24 modalias
-r--r--r--. 1 root root 4096 Mar 21 13:24 object_id
drwxr-xr-x. 2 root root    0 Mar 21 13:24 power
lrwxrwxrwx. 1 root root    0 Mar 21 13:18 subsystem -> ../../../../../../bus/wmi
-rw-r--r--. 1 root root 4096 Mar 21  2022 uevent

6CCFD48-205E-4A77-9C48-2021CBEDE341는 intel-wmi-thunderbolt 이다. 여기서 force_power에 1을 넣으면 강제로 전력을 공급하게되므로 다음과같이 명령해주면 된다. 디렉터리명이 길기 때문에 곡 tab을 이용해서 오타를 방지해야 한다.

# echo 1 > /sys/bus/wmi/devices/86CCFD48-205E-4A77-9C48-2021CBEDE341/force_power

force_power 후에도 제대로 작동하지 않으면 다시 한번 thunderbolt 커널 모듈 리로드(rmmod thunderbolt && modprobe thunderbolt) 해보면 된다.

 

* 기타

아직까지 썬더볼트는 특성을 많이 타는지 어떤 시스템에서는 잘되고, 어떤 시스템에서는 잘안되고 그런다. JHL-8540 칩셋(Maple Ridge)의 경우가 그런건지 아닌지는 모르겠다.

반응형
Comments