中断类型:
SGI 软件触发中断:通常用于多核之间通讯,最多支持16个SGI中断。SGI通常在Linux内核中被用作IPI(inter-process interrupts),并会送达到指定的CPU上;
PPI私有外设中断:每个处理核心私有的中断。最多支持16个PPI中断,PPI中断通常会送至指定的CPU上,如CPU本地时钟;
SPI外设中断:公用的外设中断。最多支持480个中断。
GIC-400逻辑拆分,大致可以分成4部分:Distributor、CPU interface、virtual interface control、virtual CPU interface
Distributor:实现中断分发,对于PPI、SGI是各个core独有的中断,不参与目的core的仲裁;
SPI是所有core共享的,根据配置决定中断发往的core。最后选择最高优先级中断发送给cpu interface。
寄存器使用 GICD_ 作为前缀。
CPU interface:将GICD发送的中断信息,通过IRQ/FIQ管脚,传输给core。
寄存器使用 GICC_ 作为前缀。
Distributor的主要的作用是检测各个interrupt source的状态,控制各个interrupt source的行为,分发各个interrupt source产生的中断事件分发到指定的一个或者多个CPU interface上。虽然Distributor可以管理多个interrupt source,但是它总是把优先级最高的那个interrupt请求送往CPU interface。
Distributor对中断的控制包括:
Ø 中断使能开关,包含2级开关:全局开关、每个中断对应的开关
lGIC_DIST_CTRL(全局中断的控制)
一旦disable了全局的中断,任何的interrupt source产生的interrupt event都不会被传递到CPU interface。
lGIC_DIST_ENABLE_CLEAR(针对各个interrupt source进行控制)
disable某一个interrupt source会导致该interrupt event不会分发到CPU interface,但不影响其他interrupt source产生interrupt event的分发。
Ø设置中断的优先级
Ø设置中断的分组
Ø设置中断分发给哪个CPU
Ø设置中断的触发属性:边沿触发、电平触发(level-sensitive、edge-triggered)
Ø产生软中断
CPU interface block:决定是否将中断发送给CPU,主要功能如下:
Ø控制中断与CPU处理器之间的连线开关,如果关闭了,即使Distributor中使能了中断,中断也不会送达CPU,如果开启,则会将当前优先级最高的中断发送给CPU
Ø设置priority mask(优先级门限),低于priority mask的中断不被送给CPU
Ø设置优先级策略
Ø中断ACK响应,中断响应后,Distributor会将中断状态设置成Active(或者Active and pending)
中断处理完毕的通知,当中断处理完后,CPU通知CPU interface,表示当前中断处理完成
GIC v2支持ID0-ID1019,总共1020个中断。GIC-400最大支持ID0-ID512。
ID0-ID15用于SGI(Software-generated interrupt),可通过写寄存器产生软件中断
ID16-ID31用于PPI(Private Peripheral Interrupt),与SPI相对应,私有的意思是指每个CPU都会对应独立ID16-ID31
ID32-ID512 用于SPI(share Peripheral interrupt),这些中断用于CPU的外设,比如GPIO、USB等,共享的意思是各个CPU共享这些中断,即这些中断被所有CPU共享,可以分配给到指定的CPU来处理
GIC设计中,中断分成2个组(group0、group1):
Øgroup0里的中断是安全中断,中断可以配置成IRQ或FIQ;
Øgroup1里的中断是非安全中断,中断是IRQ中断。
SGI、PPI、SPI三种类型中断的触发路径:
ØSGI(ID0-ID15):是由CPU内部软件触发:
CPU core-->CPU interface-->Distributor-->CPU Interface-->CPU core。
ØPPI(ID16-ID31):是由外部器件触发:
Peripheral-->Distributor-->CPU interface-->CPU core。
ØSPI(ID32-ID512):也是外部器件触发:
Peripheral-->Distributor-->CPU interface-->CPU core。
GIC复位后,所有中断默认配置为group0;
当没有实现ARM安全扩展的处理器连接GIC时,系统可以使用GICD_IGROUPn寄存器提供的中断分组来控制IRQ和FIQ;