CHAPTER 02
2. GIC Distributor의 SPI routing과 group 설정을 읽는다
GICD_CTLR affinity routing, group enable, SPI priority, target route와 routing mode를 초기화 순서대로 확인합니다. RWP가 끝나기 전에 다음 programming을 진행하지 않습니다.
ARE
GICv3 affinity routing을 켜면 GICD_IROUTER가 target PE를 지정합니다.
RWP
write pending이 0이 돼야 disable/config/enable 순서가 완료됩니다.
priority
숫자가 작을수록 높은 priority이며 구현한 상위 bit 수만 유효할 수 있습니다.
route-any
IRM을 쓰면 특정 affinity가 아닌 참여 PE 중 하나로 전달될 수 있습니다.
레지스터·번호·소유권 대조
| 항목 | 소유자 | 값의 의미 | 정상 증거 | 오류 해석 |
|---|---|---|---|---|
| GICD_CTLR | GICD | ARE와 group enable, RWP | 정책 bit와 RWP=0 | 초기화 write 미완료 |
| GICD_IIDR/PIDR | GICD | implementer/revision | 사용 quirk와 일치 | 다른 GIC release |
| GICD_IPRIORITYR | GICD | SPI priority | PMR보다 전달 가능 | mask priority |
| GICD_IROUTER | GICD | Aff3:Aff0와 IRM | online target MPIDR와 일치 | 존재하지 않는 PE route |
| GICD_CTLR RWP | GICD | register write completion | 제한시간 내 0 | clock/power 또는 sequencing |
실패 경계 판정
| 증상 | 직전 통과 | 우선 확인 | 반증 시험 | 판정 |
|---|---|---|---|---|
| SPI가 CPU0에만 옴 | pending 생성 | IROUTER/IRM | affinity를 CPU1로 설정 | routing 경계 |
| affinity write 효과 없음 | Linux 요청 성공 | RWP와 readback | mask 후 route 변경 | programming 순서 |
| 낮은 priority만 손실 | 높은 IRQ 정상 | priority/PMR/BPR | PMR 값을 단계 조정 | priority masking |
| 부팅 초기에만 storm | runtime 정상 | group/enable 초기값 | firmware와 kernel snapshot diff | handoff 초기화 |
| 특정 cluster route 실패 | 같은 cluster 정상 | Aff2/Aff3와 redistributor | MPIDR/IROUTER raw 비교 | affinity encoding |
실제 검증 절차
| 순서 | 실행 | 남길 증거 | 판정 목적 |
|---|---|---|---|
| 1 | GICD_CTLR/IIDR/TYPER를 먼저 저장합니다. | identity와 capability | 해석 기준 |
| 2 | SPI별 group, trigger, priority, route를 한 행에 둡니다. | INTID ledger | 설정 일관성 |
| 3 | affinity 변경 전후 IROUTER readback과 RWP를 확인합니다. | 실제 적용 증거 | write 완료 |
| 4 | 각 cluster CPU로 순환 route하며 interrupt count를 비교합니다. | target별 delivery | topology 검증 |
주의GICD register programming은 일부 bit가 banked가 아니며 여러 CPU가 동시에 쓰면 race가 납니다. 초기화와 affinity 변경의 lock 범위를 확인합니다.
공개적으로 다시 확인할 수 있는 자료
공개되지 않은 vendor register나 integration별 offset을 추측해서 채우지 않았습니다. 아래 제조사 자료, architecture 문서와 Linux v6.18.37 원본에서 다시 확인할 수 있는 범위만 사용했습니다.
Arm GICv3/v4 overview
GICD, GICR, CPU interface, interrupt state와 routing
Linux GICv3 driver
GIC 초기화, irqdomain, handle_irq와 affinity
Linux GICv3 ITS driver
LPI와 MSI DeviceID/EventID translation
Linux IRQ domain
firmware hwirq와 Linux virq mapping