Intel 82801AA/AB · Linux v6.18.37 intel8x0.c

Intel AC’97: 32개 BDL descriptor와 PCM ring의 차이

descriptor 수, PCM period 수, sample 단위와 DMA 진행·인터럽트 조건을 나눠 읽습니다.

BDL은 오디오 버퍼 자체가 아닙니다

BDL(Buffer Descriptor List)은 장치가 읽을 버퍼의 DMA 주소와 길이·제어 비트를 담은 목록입니다. BDBAR는 그 목록을 가리킵니다. CIV는 현재 descriptor, LVI는 마지막 유효 descriptor의 진행 경계를 나타냅니다. 32개 descriptor가 있다고 32개의 서로 다른 PCM 버퍼를 할당했다는 뜻은 아닙니다.

자체 개념도: 목록과 데이터의 관계
  1. BDBAR → 32개 descriptor 목록

  2. descriptor i → PCM ring의 period 위치

  3. 장치 진행 → 상태·IRQ → ALSA period 통지

여덟 period를 32개 항목에서 반복 참조하는 예시

v6.18.37 snd_intel8x0_setup_periods()의 일반적인 여러-period 경로는 descriptor i의 주소를 DMA 기준 주소 + (i × period_bytes) % buffer_bytes로 구성합니다. PCM prepare 경로는 runtime->dma_addr와 ALSA buffer·period 크기를 사용합니다. CPU 포인터 dma_area와 장치 DMA 주소를 같은 값으로 취급하지 않습니다.

period_bytes = 1920
buffer_bytes = 8 × 1920 = 15360
descriptor 31 offset = (31 × 1920) % 15360 = 13440

따라서 descriptor 31이 여덟 번째 period를 가리킬 수 있습니다. 단일 period와 buffer 크기가 같은 특수 경로는 두 절반을 번갈아 가리키므로 위 일반 경로와 구분합니다.

480 frame과 480 sample은 다릅니다

초기 ICH 매뉴얼은 descriptor 길이를 16비트 sample 수로 표시합니다. 48,000 frame/s, stereo 16비트에서 10ms는 480 frame × 2채널 × 2B = 1920B이며, 하드웨어 길이는 960 sample입니다. 다른 세대·sample 형식에 이 단위를 그대로 적용하지 않습니다.

DMA 진행과 완료 인터럽트의 조건

CR의 run/start는 DMA 진행을 제어하고, descriptor IOC와 CR IOCE는 완료 인터럽트를 제어합니다. 드라이버의 시작 조합 ICH_IOCE | ICH_STARTBM을 보고 IOCE 자체가 DMA 실행 조건이라고 읽으면 안 됩니다. period 설정이 10ms 예시라고 모든 IRQ가 정확히 10ms 간격으로 도착하는 것도 아닙니다.

CIV·IRQ만으로 실제 재생 데이터나 DAC 출력을 입증할 수 없습니다. 이 글은 드라이버와 문서 대조이며 오디오 장치 실험을 하지 않았습니다. 재생 중인 전체 버퍼를 지우는 임의 코드는 제공하지 않습니다.

원전과 관련 글

고정 Linux 소스: BDL 구성 · Intel PRM: buffer descriptor와 DMA 제어 · ALSA·ASoC의 frame·period · DMA 주소와 소유권