浅析GIC中断控制器:ITS

浅析GIC中断控制器:ITS 文章目录概述ITS运行机制ITS硬件表LPI中断处理流程基于GIC的PCIe MSI-X中断配置MSI-X中断触发流程相关参考概述在传统嵌入式SoC中使用SPI基本就可以满足绝大部分硬件中断的要求但随着ARM进军服务器领域SoC需要支持更大规模的外设和超多数量的中断而SPI中断需要依赖单独的物理线路从外设连接到GIC控制器的SPI中断输入因此无法大规模扩展但使用MSI中断Message Based Interrupt简称MSI只需要外设向配置好的物理地址空间写入特定的消息就可以发送中断既能摆脱对硬件连线的直接依赖也方便。LPILocality-specific Peripheral Interrupt是一种基于消息类型的中断。GICv3/v4版本规范引入了对LPI中断类型的支持并添加了ITSInterrupt Translate Service组件用于LPI类型中断的分发处理。ITS运行机制ITS是GIC硬件相对独立的一个系统组件只用于对LPI中断进行处理其在GIC中的逻辑结构示意如下外部设备通过写GITS_TRANSLATOR寄存器向GIC发送MSI中断ITS组件负责接收外设中断源发送的MSI中断Message-based interrupt事件查找硬件表转换为LPI中断号并发送到指定的CPU进行处理。ITS硬件表ITS通过三张硬件表维护外部设备中断与LPI的映射关系包括Device Table、Interrupt Translation Table以及Collection Table。Device Table通过Device ID进行索引查找设备对应的Interrupt Translation TableInterrupt Translation Table每个设备单独维护一张ITT表通过Event ID索引查找LPI中断信息Collection Table维护LPI中断与CPU Core的亲和性关系用于指示ITS组件LPI中断发送到哪一个CPU。关于虚拟LPI中断处理后续有机会再进行扩展。LPI中断处理流程LPI中断分配与投递流程描述如下外部设备写GITS_TRANSLATER携带DeviceID和EventID信息ITS使用Device ID作为索引查找Device Table找到对应ITT表ITS使用Event ID作为索引查找ITT表获得LPI中断号和Collection ID信息ITS使用Collection ID作为索引查找Collection Table得到目标RedistributorCPU核信息确认LPI中断的目标CPUITS把LPI中断发送给目标Redistributor由Redistribuotr发送对应的CPU核CPU核响应LPI中断确认并完成LPI中断处理。基于GIC的PCIe MSI-X中断配置在ARM系统GICv3/v4ITS里• Message Address GITS_TRANSLATER寄存器地址ITS翻译入口• Message Data 包含DeviceID EventIDITS查三张表 → LPI → CPU• Vector Control 设备侧单向量门控屏蔽后ITS收不到该向量的MSI‑XMSI-X中断触发流程外设需要发送MSI-X中断根据MSI-X中断向量号从MSI-X Table中获取MSI-X表项信息外设向Message Address写入Message Data在系统使用GIC时本质上就是向GITS_TRANSLATER寄存器写入DeviceID和EventID信息PCIe RC接收到内存写事务识别目标地址将其交由系统总线进行转发由系统总线发送到ITS进行处理ITS接收到PCIe设备发送的中断消息进入LPI中断处理流程。相关参考《Arm Generic Interrupt Controller Architecture Specification GIC architecture version 3 and version 4》《PCI Express Base Specification Revision 6.0》