GIC-500是ARM GICv3的一個實現,它只支持ARMv8核和實現了GIC Stream協議的GIC CPU Interface,比如Cortex-A53。
關於GIC有四份相關文檔:《Cortex-A53 TRM》介紹了GIC CPU Interface;《ARMv8-A Architecture Profile》提供了GIC CPU Interface的細節;《GIC-500 TRM》介紹了GICv3的一個實現;《GICv3/4 Architecture Specification》介紹了GIC架構細節規范。
這四份文檔可以分為兩部分:GIC CPU Interface和GIC本身。
1 Introduction
SGIs - Software Generated Interrupts
ITS - Interrupt Translation Service
LPIs - Locality-specific Peripheral Interrupts
SPIs - Shared Peripheral Interrupts
PPIs - Private Peripheral Interrupts
1.1 About the GIC-500
GIC-500支持高達128核,只支持ARMv8架構的核和GIC Stream Protocol接口的GIC CPU接口,Physical interrupt signals,SGIs,從AXI4 slave端口產生的中斷,ITS提供ID轉換等功能。
GIC-500從AXI4 Slave或者Physical interrupt inputs接收中斷,和CPU通過AXI4-Stream接口連接,通過AXI4 Slave端口被編程。
GIC CPU interface屬於GIC一部分,但不屬於GIC-500,而更傾向於屬於ARMv8 core的一部分。
GIC-500的Distributor->Redistributor->Cluster->Core的拓撲結構:
ARM架構通過MPIDR(Multiprocessor Affinity Register)寄存器給給每個CPU制定一個邏輯地址。
ARMv7支持三層,ARMv8支持四層,MPIDR有着明顯的分層結構,<Aff3>.<Aff2>.<Aff1>.<Aff0>。
GIC-500只支持兩層,所以MPIDR的值只能是0.0.c.d,c是process層,d是core層。GIC-500支持128 core或者32 processor,並且每processor不超過8 core。
1.3 Features
- 支持高達128 core
- affinity-level 1支持高達32 cluster
- 每cluster高達8 core
- 16個SGIs,ID0-ID15
- 16個PPIs,ID16-ID31
- 基於Affinity的可編程中斷路由
- 中斷屏蔽和優先級控制
- 每中斷可配置32個優先級
2 Functional Description
2.1 About the functions
ICB: Interrupt Control Block.
ICB State RAM是保存SPIs、PPIs、SGIs各種配置的地方。同樣LPI State RAM和ITE State RAM是保存LPIs和ITS設置的地方。
2.2 Interfaces
從Figure 2-1可以看出GIC-500和外部的接口包括:AXI4 Slave Interface、AXI4 Master Interface、RAM Interfaces、Physical interrupt signals、GIC-500 Stream Protocal Interface。
AXI4 Slave Interface:可以通過此接口對GIC-500所有部分編程,包括Distributor、Redistributor、ITS。同時也負責處理message-based中斷,也即通過寫AXI4 slave interface產生的中斷。message-based中斷可以產生SGI/LPI類型的中斷。
AXI4 Master Interface:GIC-500通過此接口訪問主內存,包括ITS的translation tables、ITS command queue、LPI配置表、LPI pending table等。
RAM Interfaces:和各種State RAM接口。
Physical interrupt signals:產生SPIs和PPIs類型中斷的信號,可配置成level-sensitive、edge-triggered。
GIC-500 Stream Protocal Interface:用於發送中斷給CPU核,並且從CPU接收激活中斷的通知。
2.3 Operation
GIC-500可以分成三個主要部分:ITS(將外設message-based中斷翻譯成LPIs)、Distributor(接收Wire interrupts或者編程接口過來的中斷,然后根據優先級發送到CPU Interface)、Redistributor(每CPU核一個Redistributor,保存每個核的PPIs/SGIs/:PIs狀態)。
GIC-500支持不同類型的中斷,主要包括:
SGIs - 是核間中斷,從一個核觸發發送到另外核。一個核上觸發的中斷,並不影響其他核上同樣中斷號,並且每個核的SGI設置都是獨立的。可以通過System register或者GICD_SGIR觸發中斷,共16個獨立的SGIs,ID0-ID15。
PPIs - 用於和CPU和緊耦合的外設,因此PPI僅發送到相關的CPU核。一個核上觸發的PPI總段並不會影響其他核相同ID號的PPI,而且每個核的PPI設置也是相互獨立的。
SPIs - 用於不和特定CPU和緊耦合的外設,一個核上觸發的SPI中斷,同時也會激活其他核上的中斷。但是也可以通過編程設置SPI到特定的核。GIC-500只允許一個核響應SPI中斷,SPI的設置是核間共享的。SPI可以被wire input或者AXI4 slave programming interface觸發。GIC-500支持高達960各終端,spi[991:32]。
LPIs - 多用於產生message-based類型中斷的外設,一個LPI同一時刻只能指向一個核。
Interrupt group:Group 0、Group 1 Secure、Group 1 Non-secure。
Interrupt triggering:Level-sensitive(這種類型的中斷會一直pending,直到被asserted)和Edge-triggered(上升沿觸發導致中斷變成pending狀態,直到被CPU interface activated時清pending位)。
Power Management:GIC-500不僅支持對應的核被關閉,同時自身也可以被關閉。通過GICR_WAKER寄存器來設置。
2.4 Clocking and resets
GIC-500僅有一個時鍾輸入clk,和一根reset信號resetn。
3 Programmers Model
3.2 The GIC-500 register map
GICD - GIC Distributor register
GICR - GIC Redistributor register
GITS - GIC Interrupt Translation Service register
4 相關延伸
在每個平台的實現中都會對中斷資源進行定義,這是一個GIC-500對應的中斷控制器設置:
/* 0-15: SGI (software generated interrupts) * 16-31: PPI (private peripheral interrupts) * 32+: SPI (shared peripheral interrupts) */ #define GIC_PPI_START 16 #define GIC_SPI_START 32 /* * software generated interrupts */ #define SGI0_INT (0) #define SGI1_INT (1) #define SGI2_INT (2) #define SGI3_INT (3) #define SGI4_INT (4) #define SGI5_INT (5) #define SGI6_INT (6) #define SGI7_INT (7) #define SGI8_INT (8) #define SGI9_INT (9) #define SGI10_INT (10) #define SGI11_INT (11) #define SGI12_INT (12) #define SGI13_INT (13) #define SGI14_INT (14) #define SGI15_INT (15) /* * private peripheral interrupts */ ... /* * shared peripheral interrupts */ #define WDT_INT (GIC_SPI_START+0) ... #define NR_SOC_IRQS (GIC_SPI_START+77)
更深入的分析,就需要和Linux kernel中GIC相關代碼結合了。