ARM Cortex-R52 GIC:Generic Interrupt Controller
1.关于GIC
GIC是支持和管理cluster系统中断的资源。它支持中断优先级、中断路由到核心或输出端口、中断抢占和中断虚拟化。
Cortex-R52处理器实现了一个内部GIC分配器用于处理器,每个核心还有一个GIC CPU接口。每个核包含一个GIC重分配器。
GIC 是一种集成电路,用于管理和处理各种类型的中断请求。Cortex-R52 处理器实现的 GIC 采用了 ARM 公司推出的 GIC 架构,具有高度的灵活性和可扩展性,并支持多核处理器系统。
2.GIC 功能描述
GIC分配器接收外设(SPI)和核心(PPI)的有线中断。 GIC分配器仲裁路由到每个核心的中断以确定最高优先级挂起中断(HPPI),然后将其传递给GIC CPU界面。 来自核心的激活,去激活和软件生成的中断通过GIC CPU接口传递以更新GIC分配器的状态。 GIC分配器包含内存映射的配置和状态寄存器。 GIC分配器包含每个中断目标一个再分配器。 再分配器主要负责包含PPI和SGI的寄存器。
GIC CPU接口包括处理物理中断的部分和处理虚拟中断的部分。 GIC CPU接口包含可作为系统寄存器访问的配置和状态寄存器。 中断被配置为Group 0中断或Group 1中断。 Group 0中断使用FIQ发出信号,而Group 1中断使用IRQ发出信号。
GIC CPU接口处理物理中断的部分从GIC分配器接收HPPI。 它执行抢占计算并向核心发出FIQ或IRQ信号。 来自核心的激活,去激活和软件生成的中断通过CPU接口传回到分配器。 GIC CPU接口处理虚拟中断的部分最多可以包含四个虚拟中断,其中优先级最高的用于向核心生成虚拟FIQ或虚拟IRQ。
2.1 中断源
2.1.1 Private Peripheral Interrupts (PPIs)
PPI(Private Peripheral Interrupts,私有外设中断)是由特定于单个核心的外设产生的有线中断。每个核心具有16个PPI,INTID16-INTID31。输出接口不支持PPI。没有被分配使用的PPI将作为Cortex-R52处理器顶层的额外中断输入提供。配置未分配的PPI可以选择上升沿触发或低电平触发。
那什么中断会有这种特性呢?
比如通用定时器中断啊,温度传感器中断之类的。
INTID PPI分配
30 非安全物理计时器中断
27 虚拟定时器中断
26 Hypervisor定时器中断
25 虚拟CPU接口维护中断
24 跨触发器接口中断
23 性能监视器计数器溢出中断
22 调试通信通道中断
2.1.2 Shared Peripheral Interrupts (SPIs)
SPI是一种由特定于单个核心的外设产生的有线中断,可以被通过软件配置路由到一个特定的核。每个Cortex-R52处理器都具有960个可配置的SPI,这些SPI作为处理器的顶层输入信号提供给其他组件使用。
那么如何确定哪些SPI被分配给哪个核心?
在每个核心中,通过低延迟硬件将32个唯一的SPI路由到该核心,而其他所有核心则使用常规延迟硬件将同样的SPI路由到它们。对于每个核心而言,INTID(32x+32)到INTID(32x+63)的SPI被视为低延迟(其中x = 0、1、2或3),即它们具有更快的响应时间和更高的优先级,可以更快地从硬件设备接收并处理SPI中断请求。
最后,每个SPI都可以配置为上升沿触发或高电平触发,并且通过编程相应的SPI路由信息来实现。SPI[0]对应于INTID32,而SPI[30]对应于INTID991。
2.1.3 Software Generated Interrupts (SGIs)
指由 CPU 直接写对应的寄存器触发中断,因而这种中断不是由硬件产生的,而是由软件主动产生的。这种特殊的中断主要用于核间通信。当处理器需要中断应用程序执行时,可以使用SGI生成中断信号。。SGI的数量有限,每个CPU核只能生成16个SGI,每个SGI都有一个独特的编号(INTID0-INTID15)。SGI是边沿触发中断,在生成SGI时,SGI信号会从低电平跳变到高电平,然后维持高电平状态,直到中断服务程序将其清除为止。这些属性使SGI非常适合进行异步通信和同步协议的实现,并可用于更好地支持多处理器系统。
SGI (Software Generated Interrupt) 和 PPI (Private Peripheral Interrupt) 都是 ARM 处理器中的中断信号。每个 CPU 核都有自己的 SGI 或 PPI 中断,不同核的同种类型中断共享相同的编号。因此,它们都采用了 “banked” 形式的中断源,即每个 CPU 核都可以接收到来自同一种类型中断的信号,但是在处理中断时会根据中断编号进行区分和处理。其中,SGI 是由软件触发的中断,用于处理特定的事件或情况。PPI 则是专门为外围设备设计的中断,用于处理与外设相关的事件或情况。这些中断信号都有各自的优先级,并按照优先级高低被处理。这种中断机制可以使系统在出现多个异步事件时能够快速响应并作出正确的处理。
2.2可选的导出接口
GIC Distributor提供了一个可选的导出接口,允许将外部设备作为中断目标,与核心相同。以下图示显示了从GIC Distributor到导出接口的HPPI以及来自导出接口的中断激活、去激活和SGI。导出接口的操作与GIC CPU接口相同,唯一不同之处在于WAKE_INFO仅适用于CPU核。
导出接口的目标数由核数和GIC外部设备数确定。要将SPI路由到导出接口,必须使用相应的GICD_IROUTERn寄存器配置导出接口的目标数。这些SPI必须使用GICD寄存器按照标准SPI配置进行优先级、群组和边缘或电平触发类型的配置。
启用这些SPI后,对应的中断组或组将被启用,并且导出接口的ProcessorSleep位为0。GIC Distributor通过导出接口将HPPI呈现给外部设备。通常情况下,外部设备会通过激活然后去激活SPI来响应。对于边沿触发的SPI,可以同时激活和去激活中断。对于电平敏感的SPI,在激活后,外部设备执行某些操作以引起相应的中断信号去除。然后外部设备执行去激活操作。外部设备还可以通过向GIC Distributor发送消息向核心传递SGI。不支持将外部设备连接到导出接口的PPI。
GIC Distributor不提供导出接口的内存映射总线接口,也就是说,其中一个核心负责代表外部设备配置GIC Distributor。
对中断源的划分是从 GIC 输入的角度进行的。GIC(Generic Interrupt Controller)是一种可编程中断控制器,它具有多个中断输入,可以使用寄存器对这些输入进行编程,以确定它们的优先级、屏蔽状态和触发方式等。在 GIC 输出到达CPU之后,只有 IRQ 和 FIQ 两种中断类型。IRQ 是标准的中断请求,在处理器执行当前指令之后响应;而 FIQ 是快速中断请求,在处理器正在执行当前指令时立即响应。两者的区别在于 FIQ 中断会优先于 IRQ 中断被响应,因此 FIQ 中断用于实时性要求比较高的场合。
3.GIC编程模型
Hypervisor Control System Registers (ICH),CPU interface Registers (ICC) 和 Virtual CPU interface Registers (ICV) 描述了 GIC CPU 接口的系统寄存器。
4.总结
GIC 是一种集成电路,用于管理和处理各种类型的中断请求。Cortex-R52 处理器实现的 GIC 采用了 ARM 公司推出的 GIC 架构,具有高度的灵活性和可扩展性,并支持多核处理器系统。
Cortex-R52 的 GIC 实现包括两个主要组件:Distributor 和 CPU Interface。Distributor 负责中断分发和路由,而 CPU Interface 则用于处理和响应中断。
Distributor 包括 GICD 寄存器和 GICR 寄存器两部分。GICD 寄存器用于配置和控制分发器,包括中断使能、优先级设置等功能。GICR 寄存器则用于控制中断路由和中断亲和力等。
CPU Interface 包括 ICH、ICC 和 ICV 寄存器三部分。ICH 寄存器用于控制 Hypervisor 模式下的中断,ICC 寄存器用于控制中断信号的分配和优先级等级,ICV 寄存器用于虚拟化环境下的中断控制。
这些寄存器可以通过内存映射的方式进行访问。使用 GIC 工作可以提高系统的中断响应效率和可靠性,保证系统的稳定性和可靠性。