[PCIe] AER 완전 정리 | Advanced Error Reporting, Correctable/Uncorrectable Error, Error Message

2026. 6. 17. 22:17기초지식

반응형

AER (Advanced Error Reporting) 개요

AER은 PCIe Extended Capability의 일부로, 기존 PCI의 단순 에러 보고 방식을 개선하여 세밀한 에러 분류, 로깅, 격리 기능을 제공한다. 에러 발생 시 Root Complex에 Error Message TLP를 전달하고, OS/소프트웨어가 적절히 처리할 수 있도록 한다.

  • AER Extended Capability: Extended Capability ID = 0x0001
  • AER은 Correctable Error, Uncorrectable Non-Fatal Error, Uncorrectable Fatal Error 세 가지로 분류
  • 에러 발생 시 에러 상태 레지스터에 로깅 후 Error Message TLP 생성
  • Root Port에서 모든 에러 메시지 수집 후 시스템 인터럽트(MSI/INTx) 발생 가능

에러 분류

Correctable Error (수정 가능 에러)

하드웨어가 자동으로 복구하는 에러. 데이터 손실이나 TLP 재전송 없이 처리된다. ERR_COR Message로 보고된다.

  • Receiver Error - 8b/10b Decode Error, Disparity Error 등 Physical Layer 수신 오류
  • Bad TLP - TLP LCRC 오류, Framing 오류. Data Link Layer Replay로 복구
  • Bad DLLP - DLLP CRC(LCRC) 오류
  • Replay Number Rollover - Replay Buffer의 재전송 횟수 초과. 링크 재초기화 전 발생
  • Replay Timer Timeout - ACK/NAK 대기 타임아웃. Replay 메커니즘으로 복구 시도
  • Advisory Non-Fatal Error - 원래 Non-Fatal이지만 복구 가능한 경우. UR(Unsupported Request) 등

Uncorrectable Non-Fatal Error

소프트웨어 개입이 필요한 에러지만 시스템 전체 동작은 유지된다. ERR_NONFATAL Message로 보고된다.

  • Poisoned TLP Received - EP(Error Poisoning) 비트가 설정된 TLP 수신
  • Flow Control Protocol Error - FC Credit 위반. UpdateFC Timeout 등
  • Completion Timeout - Non-Posted Request에 대한 Completion이 제한 시간 내 미도착
  • Completer Abort - 요청을 처리할 수 없는 경우 CA Status로 Completion 반환
  • Unexpected Completion - 요청하지 않은 Completion 수신, 또는 잘못된 Tag의 Completion
  • Receiver Overflow - 수신 버퍼 오버플로우. FC 메커니즘 정상 동작 시 발생 불가
  • Malformed TLP - TLP 형식 오류 (잘못된 길이, 타입 등)
  • ECRC Check Failed - End-to-End CRC(ECRC) 검증 실패 (ECRC 기능 활성화 시)
  • Unsupported Request (UR) - 지원하지 않는 요청 수신

Uncorrectable Fatal Error

시스템 전체 동작을 위협하는 심각한 에러. ERR_FATAL Message로 보고된다. 링크 재초기화 또는 시스템 리셋이 필요하다.

  • Data Link Protocol Error - Data Link Layer 프로토콜 위반. Sequence Number 오류 등
  • Surprise Down Error - 예고 없이 링크가 끊어진 경우 (Surprise Removal)
  • Uncorrectable 에러 중 Fatal Severity 비트가 설정된 에러 항목은 Fatal로 처리

AER 레지스터 구조

// AER Extended Capability 레지스터 맵
// Offset 0x00: PCI Express Extended Capability Header
//   [15:0]  Cap ID = 0x0001
//   [19:16] Cap Version
//   [31:20] Next Cap Offset
//
// Offset 0x04: Uncorrectable Error Status Register
//   bit[4]:  Data Link Protocol Error Status
//   bit[5]:  Surprise Down Error Status
//   bit[12]: Poisoned TLP Received Status
//   bit[13]: Flow Control Protocol Error Status
//   bit[14]: Completion Timeout Status
//   bit[15]: Completer Abort Status
//   bit[16]: Unexpected Completion Status
//   bit[17]: Receiver Overflow Status
//   bit[18]: Malformed TLP Status
//   bit[19]: ECRC Error Status
//   bit[20]: Unsupported Request Error Status
//
// Offset 0x08: Uncorrectable Error Mask Register
//   (각 비트 = 1이면 해당 에러 마스킹)
//
// Offset 0x0C: Uncorrectable Error Severity Register
//   (각 비트 = 1이면 Fatal, 0이면 Non-Fatal)
//
// Offset 0x10: Correctable Error Status Register
//   bit[0]:  Receiver Error Status
//   bit[6]:  Bad TLP Status
//   bit[7]:  Bad DLLP Status
//   bit[8]:  Replay Number Rollover Status
//   bit[12]: Replay Timer Timeout Status
//   bit[13]: Advisory Non-Fatal Error Status
//
// Offset 0x14: Correctable Error Mask Register
//
// Offset 0x18: Advanced Error Capabilities and Control Register
//   bit[0]:  First Error Pointer (어떤 에러가 먼저 발생했는지)
//   bit[5]:  ECRC Generation Capable
//   bit[6]:  ECRC Generation Enable
//   bit[7]:  ECRC Check Capable
//   bit[8]:  ECRC Check Enable
//
// Offset 0x1C~0x2B: Header Log Register (에러 발생 TLP 헤더 저장, 4DW)

Error Message TLP

에러 발생 시 Error Message TLP를 Root Complex 방향으로 전달한다. Message TLP는 Routed to Root Complex 방식으로 전달된다.

  • ERR_COR - Correctable Error 발생 시 전송. Message Code = 0x30
  • ERR_NONFATAL - Non-Fatal Uncorrectable Error 발생 시 전송. Message Code = 0x31
  • ERR_FATAL - Fatal Uncorrectable Error 발생 시 전송. Message Code = 0x33
  • Error Message는 Requester ID(Bus/Device/Function)로 에러 발생 디바이스 식별
  • Root Port의 Root Error Status Register에 수신된 Error Message 기록
// Error Message TLP 헤더 구조 (4DW Header)
// DW0: [31:29]=Fmt(001), [28:24]=Type(10100=Msg), [23:21]=TC, ...
// DW1: [31:16]=Requester ID (Bus[15:8]/Dev[7:3]/Func[2:0])
//      [15:8]=Tag, [7:0]=Message Code
//      ERR_COR=0x30, ERR_NONFATAL=0x31, ERR_FATAL=0x33
// DW2: [31:16]=Target PCI/PCIe Completer ID
//      [10:8]=Message Routing (011=Route to Root Complex)
// DW3: Reserved

Root Port AER 레지스터

// Root Error Command Register (Root Port 전용)
// Offset 0x2C
// bit[0]: Correctable Error Reporting Enable
// bit[1]: Non-Fatal Error Reporting Enable
// bit[2]: Fatal Error Reporting Enable
// (활성화 시 Error Message 수신 시 인터럽트 발생)
//
// Root Error Status Register
// Offset 0x30
// bit[0]:  ERR_COR Received
// bit[1]:  Multiple ERR_COR Received
// bit[2]:  ERR_FATAL/NONFATAL Received
// bit[3]:  Multiple ERR_FATAL/NONFATAL Received
// bit[4]:  First Uncorrectable Fatal
// bit[5]:  Non-Fatal Error Messages Received
// bit[6]:  Fatal Error Messages Received
// [31:27]: Advanced Error Interrupt Message Number (MSI 벡터 번호)
//
// Error Source Identification Register
// Offset 0x34
// [31:16]: ERR_FATAL/NONFATAL Source ID (Requester ID)
// [15:0]:  ERR_COR Source ID

ECRC (End-to-End CRC)

ECRC는 TLP 전체(Header + Data)에 대한 CRC를 TLP Digest 필드에 추가하여 End-to-End 무결성을 보장한다. Intermediate Switch에서 TLP 수정이 발생해도 목적지에서 감지 가능하다.

  • TLP 헤더의 TD(TLP Digest) 비트가 1이면 TLP 끝에 4-byte ECRC 포함
  • LCRC(Data Link Layer CRC)는 Link 단위 보호. ECRC는 End-to-End 보호
  • Intermediate Switch에서 TLP Header 일부 필드(BDF 등) 수정 시 ECRC 재계산 필요
  • ECRC 활성화: AER Capabilities and Control Register의 ECRC Generation/Check Enable

에러 처리 흐름

// AER 에러 처리 흐름 (Uncorrectable Non-Fatal 예시)
// 1. Endpoint에서 에러 감지
//    - Uncorrectable Error Status Register에 해당 비트 Set
//    - Header Log Register에 에러 TLP 헤더 저장
//    - Severity 비트 확인: Non-Fatal인 경우
//
// 2. ERR_NONFATAL Message TLP 생성
//    - Endpoint -> (Switch) -> Root Port 방향으로 전달
//    - 각 Switch는 에러 전달만 수행 (자신의 에러가 아님)
//
// 3. Root Port에서 수신
//    - Root Error Status.ERR_FATAL/NONFATAL Received 비트 Set
//    - Error Source ID Register에 Requester ID 저장
//    - Root Error Command의 Reporting Enable 시 MSI/INTx 발생
//
// 4. OS 에러 핸들러 실행
//    - AER 드라이버가 Source ID로 에러 디바이스 식별
//    - 해당 디바이스 AER Status 레지스터 읽어 에러 종류 확인
//    - 디바이스 드라이버에 에러 통보 -> 복구 시도 또는 디바이스 비활성화

Error Poisoning

Error Poisoning은 에러가 발생한 데이터를 즉시 폐기하지 않고 EP(Error Poison) 비트를 설정하여 하위 컴포넌트에 에러 전파를 알리는 메커니즘이다.

  • TLP 헤더의 EP 비트(bit[14] in DW0)가 설정된 TLP = Poisoned TLP
  • 수신 측은 Poisoned TLP를 처리하지 않고 Uncorrectable Non-Fatal Error로 보고
  • Poisoned TLP는 계속 Forward되어 최종 목적지에서 에러 처리
  • Memory Write Poisoning: DMA 도중 에러 발생 시 데이터를 Poison으로 표시하여 전달

다음 글

기초지식 카테고리 글 더보기