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으로 표시하여 전달