GIC400是arm公司的中断控制IP,提供axi4接口,主要功能:
1)中断的使能(enable,mask); 中断的优先级(poriority); 中断的触发条件(level-sensitive, edge-triggered);
2)单独分为两个Group,来支持secure, non_secure的中断; Group0通常只能secure axi访问, 接口连接至CPU的FIQ中断; Group1通常只能
none_secure访问, 接口连接至CPU的IRQ中断。
3)对multi-core和virtualized interrupt的支持。GIC400最多支持8核。
GIC400实现的中断类型有:
1) 16个software Generated Interrupts (SGIs);
SGI并没有外部的中断输入信号,每个target cpu都可以通过配置寄存器GICD_SGIR来直接产生中断,最多16个,ID0--ID15。
2) 6 external Private Periphaeral Interrupts (PPIs); 1 internal PPI
每个target cpu都有这么一组PPI; 信号具体分为:Legacy IRQ signal/Legacy FIQ signal/Non-secure physical timer/Secure physical timer
Virtual timer/Hypervisor timer/Virtual mainenance interrupt
所有的PPI interrupt只能是active-low触发。 通过外部引脚采样中断,nLEGACYIRQ[NUM_CPUS-1:0]、nLEAGCYFIQ[NUM_CPUS-1:0]、
nCNTPNSIRQ[NUM_CPUS-1:0]、nCNTPSIRQ[NUM_CPUS-1:0];
nCNTVIRQ[NUM_CPUS-1:0]、nCNTHPIRQ[NUM_CPUS-1:0]。
3) Configurable number of Shared Peripheral Interrupt (SPIs);
由所有的CPU共享,最多支持480个中断源,以32为步进。
每一个中断可以通过寄存器配置Group/Priority/target-cpu;通过配置寄存器GICD_IGROUPR/GICD_IPRIORITYR/GICD_ITARGETSR等。
每个寄存器32位,共16个。通过外部pin IRQS[NUM_SPIS-1:0]来输入。
GIC在Secure state支持32个level的Priority,在non_secure state最多支持16个level的Priority。当两个中断有相同的Priority时,按ID来选择,
越小的ID拥有越高的优先级(SGI,PPI,SPI的顺序)。在multi_core中,如果ID也相同,则按CPUID来排序,ID越小,优先级越高。
GIC400默认如果最高优先级的interrupt在一个disable的group中,那么GIC不会再将任何的中断发送给CPU,所以ARM建议,
将Group0的优先级设置比Group1要高,这样不会因为non_secure的中断挂起而影响secure的中断。
GIC400到CPU的中断signals有:
1) Physical interrupts; nFIQCPU[NUM_CPUS-1:0]; nIRQCPU[NUM_CPUS-1:0];
2) Virtual interrupts; nVFIQCPU[NUM_CPUS-1:0]; nVIRQCPU[NUM_CPUS-1:0];
两个唤醒信号:nFIQOUT[NUM_CPUS-1:0]; nIRQOUT[NUM_CPUS-1:0]。
GIC400包含一个AXI4 slave接口,支持32bit的位宽, 来配置寄存器,寄存器主要分为4大类:
1)Distributor registers; 主要设置寄存器的enable,mask,Priority,core,等 前缀:GICD_
其中一些寄存器GICD_CTRL, GICD_IGROUPR只能在secure下来访问。
2)CPU interface register; 主要设置寄存器的Priority mask, 从中断信号输入到相应CPU的propagated, 返回响应。
3)还有两个virtual interrupt的register:不了解先不介绍。