在分析代码之前,需要对GIC/ITS作简要介绍,包括GIC/ITS在系统中的位置,GIC/ITS硬件的介绍,中断类型等。
-
GIC即通用中断控制器,是ARM架构中中断产生的硬件;
-
ITS即中断转换服务,是ARM架构中可产生LPI中断的硬件,是可选的,其作用相当于GICD。
1、GIC/ITS在系统中的位置
外设通过中断对CPU通知某些事件的完成。之前外设与中断控制器(GICD)通过线相连,通过中断线通知中断控制器,中断控制器将中断发送给某个CPU。
当控制器支持基于Message中断时,外设可以通过写某个内存让中断控制器(ITS)产生中断,并将中断发送给某个CPU。基于Message的中断节省了硬件空间,极大的增加了支持的中断数目。(LPI类型中断)
2 GIC/ITS硬件介绍
对于GICv3,支持LPI中断,可以通过ITS产生LPI中断。
如下图中的GIC,包含如下部分:
- GICD,用于SPI中断的分发,它会将外设产生的SPI中断路由给对应的GICR
- ITS,用于LPI中断的产生,它的功能与GICD类似,只不过是针对LPI中断,可以将LPI中断路由给对应的GICR
- GICR,将收到的中断发往GICC,与GICC一一对应,PPI中断直接发送到GICR
- GICC,它为CPU接口,在CPU侧,与GICR一一对应,SGI中断由GICC产生
3 中断类型
GICv3定义了如下中断类型:
- SGI:软件产生中断,用于核间通信,通常通过写SGI寄存器产生,中断号为0-15。(IPI别名)
- PPI:私有外设中断,目标为某个特定CPU的外设中断,如CPU的通用timer中断,中断号为16-31
- SPI:共享外设中断,可以路由到一个或一组CPU的共享外设中断,中断号31-1019
- LPI:Locality-specific外设中断,中断号8192以上。
4 GIC软硬件之间交互
对于GICD,软硬件之间的交互如下:
- 1、GIC驱动通过寄存器访问对GIC(包括GICD和GICR)进行初始化并配置
- 2、外设与GICD相连,外设产生线中断,并发送给GICD,GICD通过配置将中断路由到对应的GICR
5 ITS软硬件之间交互
对于ITS,软硬件之间的交互如下:
-
1、外设写内存产生中断给ITS,外设写的内容包含device id和event id,device id用于标识设备,event id用于区分同一个设备不同的中断;
-
2、ITS在内存中有三张表,Device table用于保存每个device对应的ITT中断转换表,ITT表用于保存设置event id与collection id的对应关系,Collection table用于保存collection id与GICR的对应关系,因此ITS通过这三张表可以知道将中断路由到哪个GICR即哪个CPU;
-
3、ITS驱动或软件通过三种方式与ITS进行通信:通过直接访问ITS寄存器、通过访问或修改三张表、通过CMDQ队列。
6 软件框架
Linux中断框架大致如下:
-
(1)irq domain layer:用于为GIC/ITS分配irq domain,为不同外设分配中断irq desc,硬中断号与软中断号之间转换等;
-
(2)irq-gicv3为GICv3驱动,irq-gicv4支持GICv4驱动,irq-gicv3-its为ITS驱动;
-
(3)PCI设备和platform设备通过中断相关的API进行中断分配以及中断请求等;(PCI设备使用BDF作为device ID,platform设备使用ACPI表里的device ID。)
-
(4)KVM通过vgic支持中断的虚拟化;
Note:
PCI是Peripheral Component Interconnect(外设部件互连标准)的缩写,它是目前个人电脑中使用最为广泛的接口,几乎所有的主板产品上都带有这种插槽。
platform总线是一种虚拟的逻辑总线,满足逻辑互联功能。为了统一管理设备,platform可以把物理上不存在总线的一类设备,用平台总线统一把它们管理起来。
(这整的必须得好好的再学一学Linux的中断框架)
前辈原文链接:
https://blog.csdn.net/flyingnosky/article/details/127398599