CHAPTER 05
5. firmware specifier에서 irq_desc와 handler까지 번호를 연결한다
DT의 interrupt type/number/flags 또는 ACPI GSI를 GIC hwirq로 번역하고 irqdomain이 virq를 할당한 뒤 `gic_handle_irq()`가 INTID를 Linux generic IRQ flow로 넘기는 과정을 읽습니다.
세 번호
firmware specifier, GIC INTID(hwirq), Linux virq는 같을 수도 있지만 동일 개념이 아닙니다.
irqdomain
controller별 hwirq 공간을 Linux 전역 virq와 연결하고 irq_chip/handler를 설정합니다.
irq_desc
mask depth, state, affinity와 irqaction chain을 소유합니다.
dispatch
architecture entry→GIC handle_irq→domain lookup→flow handler→driver action 순서입니다.
레지스터·번호·소유권 대조
| 항목 | 소유자 | 값의 의미 | 정상 증거 | 오류 해석 |
|---|---|---|---|---|
| DT interrupts cells | firmware | SPI/PPI 번호와 flags | binding 계산 INTID와 일치 | offset/trigger 오해 |
| irq_domain mapping | Linux IRQ core | hwirq↔virq | 유일한 mapping | missing/duplicate mapping |
| irq_data chip | Linux IRQ core | gic_chip와 hwirq | 해당 domain ops | 잘못된 parent hierarchy |
| irq_desc handle_irq | Linux IRQ core | edge/level flow handler | hardware trigger와 일치 | ack/mask 순서 오류 |
| /proc/interrupts | Linux/userspace | virq, CPU count, action | 실제 target CPU 증가 | 다른 번호를 INTID로 오인 |
실패 경계 판정
| 증상 | 직전 통과 | 우선 확인 | 반증 시험 | 판정 |
|---|---|---|---|---|
| DT 번호가 있는데 request_irq 실패 | firmware node 존재 | domain translate/mapping | irqdomain debug와 fwspec dump | specifier 경계 |
| IAR INTID 수신, virq 없음 | GIC delivery 성공 | irq_find_mapping | domain map 생성 시점 확인 | Linux mapping |
| virq count 증가, driver status 0 | handler dispatch | shared line/source 식별 | 모든 action status 비교 | 잘못된 source/공유 IRQ |
| edge handler로 level source 처리 | mapping 존재 | flags와 ICFGR | DT flags 수정 전 raw 비교 | trigger 기술 오류 |
| affinity가 적용 안 됨 | virq 확인 | irq_chip set_affinity와 route | IROUTER readback | chip callback 경계 |
실제 검증 절차
| 순서 | 실행 | 남길 증거 | 판정 목적 |
|---|---|---|---|
| 1 | firmware specifier→INTID 계산을 문서로 적습니다. | 계산식과 flags | 입력 확인 |
| 2 | hwirq/virq/irq_desc/action을 한 표로 dump합니다. | 번호 ledger | mapping 검증 |
| 3 | entry부터 driver handler까지 tracepoint/function graph를 수집합니다. | 호출 순서와 latency | dispatch 확인 |
| 4 | trigger와 affinity 변경을 hardware readback과 비교합니다. | software 요청/실제 설정 | irq_chip 동작 확인 |
주의`/proc/interrupts` 왼쪽 숫자를 GIC INTID로 단정하지 않습니다. Linux virq일 뿐이며 hwirq는 irq_data에서 확인합니다.
공개적으로 다시 확인할 수 있는 자료
공개되지 않은 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