홈으로 돌아가기

사운드 회귀 snd_hda_intel: PCI 재스캔 수정

snd_hda_intel 회귀 분석: 커널 업데이트 후 Intel HDA에서 CORB 재설정 타임아웃. dmesg를 통한 진단, sysfs를 통한 PCI 재스캔 및 BAR 재할당 솔루션. 구형 하드웨어를 위한 자동화 및 디버깅 팁.

사운드 수정 방법: 커널 회귀 대응 PCI 재스캔
Advertisement 728x90

## snd_hda_intel 회귀 오류 수정: PCI 재스캔으로 오래된 노트북 오디오 복구

Emachines E732 노트북에서 Intel 5 Series/3400 Series HDA (칩 ID 8086:3b56) 칩셋으로 커널 업데이트 후 오디오가 사라졌습니다. aplay -l 명령어는 no soundcards found를 보고하고, lspci는 00:1b.0에서 장치를 감지하지만, inxi -Axxz는 snd_hda_intel 드라이버를 확인합니다. 그러나 journalctl은 모든 노드에서 hdaudio hdaudioC0D0: no AFG or MFG node found 오류로 가득 차 있습니다.

dmesg가 진짜 원인을 밝혀줍니다: 초기화 중 snd_hda_intel 0000:00:1b.0: CORB reset timeout#2, CORBRP = 65535 오류가 발생한 후 no codecs initialized가 나타납니다. CORB(Command Output Ring Buffer)는 코덱 명령을 위한 링 버퍼입니다. 0xFFFF 값은 버스가 멈추거나 하드웨어에 접근할 수 없음을 나타내는데, 초기화되지 않은 레지스터를 읽으려 할 때 발생합니다.

콜드 부팅 시 BAR: mem 0xd4400000-0xd4403fff 64bit. 모듈 재로드(modprobe -r/-a snd_hda_intel)해도 새로운 타임스탬프와 함께 동일 오류가 반복됩니다.

Google AdInline article slot

효과 없는 빠른 수정 방법

일반적인 조치들은 실패했습니다:

  • 사용자 공간 도구: PipeWire/WirePlumber 재설치, alsamixer 조정—ALSA 장치가 없으면 무용지물.
  • 모듈 옵션: /etc/modprobe.d/alsa-fix.confoptions snd-hda-intel enable=1 power_save=0 power_save_controller=N model=auto 추가.
  • GRUB 매개변수: pci=nocrs pci=nomsi pcie_aspm=off snd_hda_intel.power_save=0 snd_hda_intel.dma_mask=0.
  • 핫 리로드: modprobe snd_hda_intel msi=0 dsp_driver=1 probe_mask=1.

문제는 초기화 시점에 있습니다: LTS 커널이나 LiveCD는 모듈 로드 순서나 BIOS 상태 차이로 작동합니다.

[   17.492159] snd_hda_intel 0000:00:1b.0: CORB reset timeout#2, CORBRP = 65535
[   17.492380] snd_hda_intel 0000:00:1b.0: no codecs initialized

해결책: sysfs를 통한 PCI 핫 재스캔

핵심: 콜드 부팅 시 잘못된 BAR 할당되지만, 시스템이 완전히 부팅된 후 핫 재스캔은 성공합니다. 순서:

Google AdInline article slot
  • echo 1 | sudo tee /sys/bus/pci/devices/0000:00:1b.0/remove
  • sleep 2
  • echo 1 | sudo tee /sys/bus/pci/rescan

새로운 dmesg 출력:

[  473.969035] pci 0000:00:1b.0: [8086:3b56] ... 
[  473.969102] pci 0000:00:1b.0: BAR 0 [mem 0x00000000-0x00003fff 64bit]
[  473.969982] pci 0000:00:1b.0: BAR 0 [mem 0x23c000000-0x23c003fff 64bit]: assigned
[  474.095498] input: HDA Intel MID Mic as /devices/pci0000:00/0000:00:1b.0/sound/card0/input24
[  474.095675] input: HDA Intel MID Headphone as /devices/pci0000:00/0000:00:1b.0/sound/card0/input25

오디오 복구: /dev/snd에 사운드 카드 나타남, PipeWire가 장치 감지. 원인? BIOS가 초기 PCI 초기화 전에 잘못된 매개변수 전달; 전체 PCI 초기화 후 재스캔으로 올바른 BAR 할당.

일상 사용을 위한 자동화

프로덕션 systemd 스크립트(부팅 후):

Google AdInline article slot
#!/bin/bash
PCI_ID="0000:00:1b.0"
echo 1 > /sys/bus/pci/devices/$PCI_ID/remove
sleep 2
echo 1 > /sys/bus/pci/rescan
# 확인
if aplay -l | grep -q "card 0"; then
    systemctl --user restart pipewire pipewire-pulse wireplumber
fi

/etc/systemd/system/pci-audio-rescan.service에 배치하고 After=multi-user.target 설정.

유사 회귀 오류 진단

레거시 Intel HDA의 snd_hda_intel에 대해:

  • 로그 수집: dmesg | grep '00:1b.0', journalctl -b -p err | grep hda.
  • BAR 확인: lspci -vv -s 00:1b.0 | grep BAR.
  • 재스캔 테스트: 위 sysfs 방법 사용.
  • 커널 비교: LTS vs 메인라인—PCI 할당이나 전원 관리 회귀.
  • BIOS/UEFI: 가능 시 업데이트, 하지만 2010년 칩셋에서는 드물게 효과.

커널 6.8+ 이후 오래된 하드웨어에 PCI 열거 및 ASPM 변경으로 큰 타격.

주요 요점

  • CORBRP=0xFFFF는 HDA 컨트롤러 정지 신호, BIOS/코덱 문제 아님.
  • sysfs PCI 재스캔으로 콜드 부팅 타임아웃 우회, BAR 재할당.
  • LTS 커널은 BIOS 핸드오버 후 모듈 로드로 성공.
  • 자동화: systemd 서비스로 데일리 드라이버 안정성 확보.
  • 진단: 사용자 공간보다 dmesg 집중; PCI BAR와 CORB/RIRB 타겟.

— Editorial Team

Advertisement 728x90

다음 읽기