连接"arm GIC介绍之一",我们补充对应的GIC 寄存器描述,和主要的用法说明,仅供参考。
3 . GIC_V3寄存器介绍
我们把完整的图放在这里:
从这里看到,GIC分为3个主要的部分,要完成其作用,而且给用户进行预先配置的方法,GIC就提供了一组寄存器,这些寄存器的设计就是围绕着这些主要的功能来实现的。
3.1Distributor Registers
在前面介绍过,Distributor主要完成对应的IRQ状态的记录,对应的IRQ分发,那么围绕这样的功能,对应的寄存器主要有:
这里面有Distributor控制寄存器,控制Distributor使能和关闭,以及对应的具体IRQ的状态寄存器,比如GICD_ISACTIVER,这里记录某一个IRQ是否ACTIVE,还有逻辑功能寄存器,比如GICD_IPRIORITY,这里记录对应
IRQ的优先级别。这些都以GICD_*为前缀打头。我们来仔细说明。
GICD_CTLR
这个是GICD_CTLR寄存器,名字和对应的位功能来看是对Distributor控制使能,比如BIT_1,就是使能GROUP_1,
并且是NON-SECURE,如果是LINUX系统,就是KERNEL空间。一般来说对这个寄存器每个位都是打开的。BIT_31是等待回应,当配置对应寄存器了,写入到硬件,需要生效,那么可以读取这个位来看是否已经写入配置信息并生效。ARE是对应的AFFINITY,其实就是分配到哪个具体的CPU,我们在ROUTER寄存器说明时候来补充。
GICD_TYPER
这个是GICD_TYPER寄存器,其主要作用是获取SOC平台厂商提供的GIC的具体信息,现在一般提供信息是该GIC能够支持最多多少个IRQ硬件中断源。
ITLinesNumber:
SPI numbers in specification, butthis should include (SGI, PPI actually)
比如我们现在X20平台上都出来并且换算出来ITLinesNumber: 0xb,那么每个数字表示有32个IRQ
12* 32-1= 383 IRQ numbers.
支持384个IRQ,从0到383,为最大数字。
最大支持
(0x1f+1)*32-1 =1023
1024个中断,这个GIC现在通用的说明是一致的,如果不考虑LPI的话。
GICD_IGROUP&GICD_IGRPMODR
这两个在一起使用,一个IRQ对应一个BIT的GICD_IGROUP,以及一个BIT的GICD_IGRPMODR。
所以如果支持384个IRQ,那么真个GIC就需要384个BIT来表示384个GICD_IGRPMODR,同理其它对应的
以BIT方式表示的也是如此。
这两个结合起来表示某个具体的IRQ应该送到哪个Ex,是安全域还是非安全域,现在一般只支持3个,如上图表示。
GICD_IROUTER
这个寄存器的名字不好理解,其实,如果我们修改下GICD_TARGET,这样,就容易理解了。简单来说,该寄存器控制一个IRQ发到哪个CPU进行处理。在现在的ARM中,cpu的拓扑结构用AFFINITY来表示。
CPU以CLUSTER为单位进行管理,比如X20上有10个CPU,