Arm Generic Interrupt Controller (GIC) 개요
GIC는 Arm에서 설계한 Generic Interrupt Controller로, 외부 장치에서 발생하는 인터럽트를 수집하고, 이를 처리할 적절한 CPU 코어에 전달하는 역할을 합니다. 이는 단일 코어부터 다수의 멀티코어 환경까지 효율적으로 인터럽트를 관리할 수 있도록 설계되었습니다. GIC는 Cortex-A 및 Cortex-R 계열 프로세서와 함께 주로 사용되며, Arm 기반 SoC(System on Chip)에서 표준 인터럽트 관리 솔루션으로 자리 잡았습니다
주요 기능
GICv3 요약
GICv3는 Armv8 아키텍처와 함께 도입된 최신 버전의 GIC로, 특히 AArch64 기반 시스템에서 사용됩니다. 기존 GICv2와 비교해 다음과 같은 주요 개선 사항이 있습니다:
- 확장된 코어 지원: 8개 이상의 코어를 지원하며, 서버와 같은 대규모 멀티코어 환경에 적합.
- Interrupt Translation Service (ITS): 메시지 기반 인터럽트(Message Signaled Interrupt, MSI)를 처리하기 위한 추가 기능.
- 시스템 레지스터 접근 방식: GICv3부터 CPU 인터페이스가 시스템 레지스터로 구현되어 메모리 맵 접근이 필요하지 않음
GICv3의 주요 구성 요소
- Distributor: SPI(Shared Peripheral Interrupt)를 관리하고 각 CPU로 인터럽트를 분배.
- Redistributor: SGI(Software Generated Interrupt), PPI(Private Peripheral Interrupt), LPI(Locality-specific Peripheral Interrupt)를 관리.
- CPU Interface: CPU와의 직접적인 통신을 담당하며, 인터럽트를 전달 및 확인.
- ITS (Interrupt Translation Service): LPI를 처리하고 메시지 기반 인터럽트를 번역 및 라우팅
GIC 구성 요소 설명
Distributor
- 모든 SPI를 수집하여 적절한 CPU에 전달하는 역할.
- 다수의 인터럽트 발생 시 우선순위를 기준으로 하나의 CPU에 전달.
- 글로벌 우선순위 설정 및 특정 인터럽트 활성화/비활성화 가능.
Redistributor
- SGI, PPI, LPI를 관리하며, 각 CPU에 독립적으로 존재.
- 메시지 기반 LPI의 정보를 저장된 메모리에서 읽고 이를 분배.
CPU Interface
- GIC와 CPU 간 소통을 담당하는 모듈.
- IRQ/FIQ 신호를 CPU로 전달하고, CPU가 처리한 후 ACK 신호를 반환.
- GICv3부터는 시스템 레지스터로 구현되어 메모리 맵이 아닌 아키텍처 주소를 통해 접근.
ITS (Interrupt Translation Service)
- LPI와 MSI(Message Signaled Interrupt)를 처리하기 위한 추가 모듈.
- MSI를 특정 CPU로 라우팅하며, 고급 메시징 기능을 제공.
AXI Stream Interface 개요
AXI(Advanced eXtensible Interface)는 고속 데이터 전송을 위한 AMBA(Advanced Microcontroller Bus Architecture) 프로토콜입니다. 특히 AXI4-Stream은 데이터 전송을 위해 설계된 스트리밍 프로토콜로 다음과 같은 특징을 가집니다:
주요 요소
- VALID/READY 핸드셰이크:
- VALID: 송신 측(Source)이 데이터를 보낼 준비가 되었음을 나타냄.
- READY: 수신 측(Destination)이 데이터를 받을 준비가 되었음을 나타냄.
- 두 신호가 모두 활성화될 때 데이터 전송이 이루어짐.
- 독립된 데이터 채널:
- 주소 채널(Read/Write Address), 데이터 채널(Read/Write Data), 응답 채널(Write Response)로 분리되어 병렬 처리가 가능.
- 버스트 모드(Burst Mode):
- 한 번 주소를 설정한 후 여러 데이터를 연속적으로 전송 가능.
- 데이터 전송 효율성을 극대화함
AXI4-Stream 주요 신호
TVALID | 유효한 데이터가 전송 중임을 나타냄 |
TREADY | 데이터 수신 준비 상태를 나타냄 |
TDATA | 실제 전송되는 데이터 |
TUSER | 사용자 정의 부가 정보 |
요약
Arm의 GIC는 다양한 종류의 인터럽트를 효율적으로 관리하여 멀티코어 환경에서 성능을 극대화합니다. GICv3는 확장성과 성능 면에서 큰 개선을 이루었으며, Distributor, Redistributor, ITS, 그리고 CPU Interface라는 주요 구성 요소를 통해 인터럽트를 처리합니다. 또한 AXI Stream Interface는 고속 데이터 전송을 위한 표준 프로토콜로, VALID/READY 핸드셰이크 및 독립적인 데이터 채널 구조를 통해 효율적인 데이터 처리를 지원합니다.
GIC Stream Protocol이란?
GIC Stream Protocol은 Arm의 Generic Interrupt Controller(GIC) 아키텍처에서 사용되는 표준화된 통신 프로토콜로, GICv3 및 GICv4에서 Redistributor와 CPU Interface 간의 통신을 담당합니다. 이 프로토콜은 인터럽트 라우팅 및 관리에 필요한 명령과 데이터를 교환하기 위해 설계되었습니다.
주요 특징
- Point-to-Point 통신:
- GIC Stream Protocol은 Redistributor와 CPU Interface 간의 직접 연결을 지원합니다.
- 단순한 구현에서는 각 CPU Interface와 Redistributor가 전용 물리적 연결을 가질 수 있습니다.
- 복잡한 시스템에서는 다중화(Multiplexing)를 통해 여러 연결을 공유할 수도 있습니다
- AXI4-Stream 기반:
- GIC Stream Protocol은 AMBA 4 AXI4-Stream Protocol을 기반으로 하며, 양방향 데이터 전송을 위해 설계되었습니다.
- 명령과 데이터는 패킷 형태로 전송됩니다
- 구성 요소 간 역할 분리:
- Redistributor는 인터럽트를 관리하고, CPU Interface는 이를 처리하는 CPU 코어와의 직접적인 상호작용을 담당합니다.
- GIC Stream Protocol은 이 두 구성 요소 사이에서 데이터와 명령을 교환하는 역할을 합니다
주요 명령 및 동작
GIC Stream Protocol에서 사용되는 명령은 Redistributor와 CPU Interface 간의 인터럽트 관리를 지원합니다. 주요 명령에는 다음이 포함됩니다:
- Set X: 특정 인터럽트 ID(INTID)를 CPU Interface에서 대기 상태로 설정.
- Clear X: 특정 INTID를 CPU Interface에서 제거.
- Quiesce: Redistributor와 CPU Interface 간의 링크를 비활성화하기 위한 명령. 이 과정에서 미처리된 인터럽트는 모두 완료되어야 합니다
AXI4-Stream과의 관계
GIC Stream Protocol은 AXI4-Stream 프로토콜을 활용하여 데이터 전송을 수행합니다. 주요 특징은 다음과 같습니다:
- 양방향 데이터 흐름:
- Redistributor에서 CPU Interface로 명령 전송.
- CPU Interface에서 Redistributor로 상태 및 알림 반환.
- 패킷 기반 전송:
- 모든 데이터는 패킷 형태로 전송되며, 각 패킷에는 명령 또는 상태 정보가 포함됩니다.
- 핸드셰이크 신호 사용:
- AXI4-Stream의 TVALID와 TREADY 신호를 통해 송수신 상태를 동기화합니다.
활용 사례
GIC Stream Protocol은 다음과 같은 상황에서 활용됩니다:
- 멀티코어 시스템의 인터럽트 관리:
- 다수의 코어를 가진 시스템에서 Redistributor와 CPU Interface 간 효율적인 통신 제공.
- 가상화 환경 지원 (GICv4):
- GICv4에서는 가상 인터럽트를 직접 주입(Direct Injection)하기 위해 GIC Stream Protocol이 확장되었습니다
- GICv4에서는 가상 인터럽트를 직접 주입(Direct Injection)하기 위해 GIC Stream Protocol이 확장되었습니다
- 저전력 관리:
요약
GIC Stream Protocol은 Arm의 GIC 아키텍처에서 Redistributor와 CPU Interface 간 통신을 표준화한 프로토콜입니다. 이는 AXI4-Stream 기반으로 설계되어 고속 데이터 전송과 효율적인 인터럽트 관리를 가능하게 합니다. 특히 멀티코어 및 가상화 환경에서 중요한 역할을 하며, GICv3 및 GICv4 아키텍처에 필수적인 구성 요소입니다.
도대체 GIC는 그럼 어떤 거야?
쉽게 말해서 GIC는 구세대의 Arm Architecture에서 Processor가 IRQ, FIQ로 직접 interrupt를 입력받는 형태에서 벗어나, 인터럽트의 관리 및 중계 역할을 하는 브릿지라고 할 수 있다.
따라서, CPU(여기서는 Arm A core)는 IRQ, FIQ를 직접 입력받지 않고, GIC를 통해서 GIC Steam Protocol(이라고 쓰고, AXI4-stream이라고 한다)을 통해서 Interrupt를 입력받고, set/active/active-ack./de-active/de-active-ack./clear/clear-ack. 등등의 신호들을 통신하게 된다.
- GIC stream protocol 은
- irit* 의 형태로 GIC에서 Core로 보내는 방향의 axi-stream과
- icct*의 형태로 Core에서 GIC로 보내는 방향의 axi-stream 한 쌍으로 이루어져있다.
GIC는 구성품(Distributor, Redistributor, ITS 등등)을 따로 분할해서 Core에 직접 붙이는 형태로 구성 할 수도 있지만, monolotic 설정을 통해 GIC 구성품을 하나로 묶고 통신채널을 통해서 Core와 연결하는 방법을 사용할 수도 있는데, 이는 SoC의 구성 방법에 따라 달라지므로 여기에선 다루지는 않는다.
GIC-v3에는 GIC를 설정할 수 있는 레지스터들이 몇가지 있는데, 크게 GICD_*와 GICR_*이 있다. 각각 D와 R은 Distributor와 Redistributor를 의미하며, RD(Redistributor)는 PE(Process Elements = Core)와 1:1 대응되기 때문에 복수개가 존재 할 수 있다. GICR에 대한 레지스터 주소는 TRM을 참조해서 계산을 통해서 확인 할 수 있다.
또한 GIC는 Memory Map 상에서 독립된 공간의 주소를 할당받아 해당 주소로 접근해서 사용하는 방법을 사용하는데, 이로인해서 input port에 gic_offset에 관련된 포트에 반드시 설정이 되어야한다.
또한 PE의 개수를 몇개로 설정하느냐에 따라서 [x:16]으로 되어있는 offset의 설정을 할때도 주의를 기울여야한다. GICR*등의 계산을 하다보면 16번 bit를 넘어서서 참조하게 되는 경우도 있기 때문에 반드시 계산을 해야한다. (실제로 RTL을 열어보면 PE의 개수 설정에 따라 20:16에 해당하는 부분은 Don't care로 보고 설정해야 하는 경우도 있다)
GIC에서 반드시 필수로 설정해야 하는 Register들이 있는데 (SPI Interrupt의 경우만)
- GICD_IPRIORITYR
- Interrupt의 우선순위를 설정
- GICD_ICFGR
- Interrupt의 level-sensitive/edge-triggered를 설정
- GICD_IGROUPR
- Interrupt의 Group(0/1)을 지정
- GICD_IROUTER
- Affinity 설정을 통해 Interrupt의 PE를 특정하게 지정
이 있다. 여기서 주의할점은 PRIORITY, CFG, GROUP은 INTID에서 SGI와 PPI를 포함한 0~31까지를 포함하고 32부터 SPI를 계산하는 것인데(그렇다고 SGI, PPI가 설정이 먹히진 않는다. 저 둘은 GICR에서 해야한다), ROUTE는 SPI가 시작되는 INTID 32를 0으로 놓고 계산해야한다. 그래서 굉장히 짜증난다..
'Design > SoC' 카테고리의 다른 글
ARMv8-A Exception Level (0) | 2024.12.24 |
---|