前言
因为ATF之前是2.5的版本,现在我们将其升级为2.7版本,但是这个版本使用的是gicv3。这里我们来看一下看一下从2到3变化是什么?
当然开始必须对GIC架构提供介绍。它对GIC架构作简要介绍,以及新引入到架构的特性。它也提供本文档中使用的术语进行定义。
文章目录
一、关于GIC
设计GICv3架构是用于与Arm8-A和Arm8-R的处理部分PE一起运行工作。
GIC架构定义:
-
(1)用于处理连接到GIC上的PE的所有中断源的架构需要;
-
(2)为单处理器或多处理器系统提供一个通用中断控制器编程接口;
GIC是支持和控制中断的架构资源。它提供:
-
(1)管理中断源,中断行为,中断路由到一个或多个PE的寄存器;
-
(2)支持:
-
Armv8架构
-
LPI中断
-
PPI中断
-
SGI中断
-
中断屏蔽和中断优先级
-
单处理器和多处理器系统
-
在电源管理环境下wakeup事件
-
对于每个PE,GIC架构描述IRQ和FIQ中断是如何在系统中产生的。Armv8-A异常模型描述了PE是如何处理这些IRQ和FIQ中断。
中断处理也依赖于Armv8架构的其他方面,比如安全状态和虚拟化的支持。Arm架构提供两个安全状态,每个存在相关的物理内存地址空间:
-
(1)安全状态
-
(2)非安全状态
**GIC架构支持两个安全状态的中断路由和中断处理。**可以看章节Interrupt Grouping and security获得更多信息。
GIC架构支持Armv8架构处理与虚拟机相关的虚拟中断。一个虚拟系统存在:
-
(1)一个hypervisor必须包含执行在EL2的部件,它负责在不同虚拟机VM之间进行切换;
-
(2)多个执行在EL1的虚拟机VM;
-
(3)在VM中应用执行在EL0;
可以查看Arm Architecture Reference Manual获得更多Armv8架构。为获取更多虚拟机VM,可以看GIC support for virtualization。
本文档定义了GIC架构的V3.0,V3.1,V3.2,V4.0,V4.1。GICv2仅作为GICv3的传统操作被描述。
NOTE:因为GICv4为GICv3.0和GICv3.1的扩展,如果没有明确指明,在本文档中GICv3的相关操作也能应用于GICv4。对于GICv4的任何架构修改都会被指明。
二、从GICv2到GICv3的修改
GIC scalability: GICv2架构仅支持最多8个PE,因此无法在大规模系统上使用。GICv3通过修改哪个中断被路由的机制(亲和性路由)并对中断分发器引入新的部件(Redistributor)来解决GICv2的问题。(这几个路由是通过掩码机制实现的。)
安全状态的亲和性路由通过设置GICD_CTLR_ARE_S或GICD_CTLR_ARE_NS为1被使能。
Interrupt grouping: 中断分组为GICv3使用的机制来对齐中断处理与Armv8异常模型:
- 1、Group0物理中断被用来处理最高实现的异常级别;
- 2、安全Group1物理中断被用来处理安全EL1或EL2;
- 3、非安全Group1物理中断在使用虚拟化的系统中处理非安全EL2,或不使用虚拟化的系统中处理非安全EL1;
这些中断可以被映射Armv8 FIQ和IRQ信号,在Interrupt grouping中描述,使用Armv8架构的配置位,这些配置位在GICv3架构中。
在GICv3中,Interrupt grouping支持:
- 配置每个中断为Group0,安全Group1,或非安全Group1;
- 使用FIQ异常请求将Group0物理中断发送到目标PE;
- 在安全状态使用IRQ handler将中断处理,将Group1物理中断发送到目标PE。Group1中断的准确处理依赖于当前异常处理和安全状态;
- 统一方案来处理Group0和Group1中断的优先级;
中断转换服务(ITS):中断转换服务ITS允许软件控制中断是如何被发送到ITS:
-
GICv3和GICv4中的物理中断;
-
GICv4中的虚拟中断;
ITS也允许软件决定一个转换中断的目标Redistributor。软件可以通过命令接口和内存中相关的基于表的结构体来控制ITS。ITS的输出通常为LPI,它是一种形式的基于信息中断。(特殊的,之前在转载的卢俊前辈的博客也有提到)
位置特定的外设中断(LPI):LPI中断是一种新的类型中断,它能够明显扩展GIC可以处理中断ID空间。LPI是可选的,如果实现,可以通过ITS产生和支持。
软件产生中断(SGI):GICv3具备支持大规模系统的能力,SGI的上下文被修改,不再包含源PE的识别。(也被称为IPI)
NOTE:原始的SGI格式仅在支持传统操作的GIC实现中有效。
共享外设中断(SPI): Distributor中一组新的寄存器被添加用于支持基于信息的SPI的设置和清除。
系统寄存器接口:在Armv8-A或Armv8-R PE中该接口使用系统寄存器指令为CPU接口寄存器提供紧密耦合的接口。该接口用于寄存器,这些寄存器直接与中断处理和优先级屏蔽来最小化访问时延相关。为了虚拟化,可以以这种方式访问的寄存器包含两种寄存器,一种由VM中断handler访问的寄存器,一种将hypervisor的虚拟中断发送给VM。所有这些寄存器都是内存映射的。
对于AArch64状态,通过下列设置使能对系统寄存器接口的访问:
ICC_SRE_EL1.SRE==1
ICC_SRE_EL2.SRE==1
ICC_SRE_EL3.SRE==1
对于AArch32状态,通过下列设置使能对系统寄存器接口的访问:
ICC_SRE.SRE==1
ICC_HSRE.SRE==1
ICC_MSRE.SRE==1
**其他行为,往前兼容GICv2,**在章节14中进行描述。(猜测这个应该是指的GIC的手册)
NOTE: 对于支持传统操作的GIC中,内存映射的访问对所有架构的GIC都有效。
本文档描述了系统中GICv3架构,包括亲和性路由,系统寄存器访问,两个安全状态,以及使能。这意味着:
GICD_CTLR.ARE_NS==1
GICD_CTLR.ARE_S==1
GICD_CTLR.DS==1
AArch64状态操作如下:
ICC_SRE_EL1.SRE==1,对于寄存器的安全和非安全copy;
ICC_SRE_EL2.SRE==1
ICC_SRE_EL3.SRE==1
AArch32状态操作如下:
ICC_SRE.SRE==1
ICC_HSRE.SRE==1
ICC_MSRE.SRE==1
对于GICv3,如果PE实现了安全EL2,传统操作ARE和SRE控制BIT设置为0是不允许并移除的。
特定修改
GICv3.1特定的修改:GICv3.1支持内存partitioning和monitoring,一个扩展的SPI范围,一个扩展的PPI范围,并支持安全EL2。
GICv3.2特定的修改:GICv3.2增加对Armv8-R AArch64的支持。
GICv4特定的修改:GICv4在不需要陷入hypervisor时增加对虚拟中断注入到虚拟机VM。直接注入仅在实现了至少一个ITS的系统上支持,ITS将中断转化为LPI。
GICv4.1特定的修改:GICv4.1也将直接注入支持扩展到处理虚拟SGI。GICv4.1修改了GICv4数据结构处理的方式。
3、中断术语
1、基础术语
这里重复了就不再记录了
2、其他术语
还有下列其它的术语在本系列文章中被使用:
-
Idle priority: 在GICv3中,当在当前接口上没有中断时0xff为CPU接口上读取ICC_RPR_EL1获取的运行优先级。在传统操作时,idle priority从GICC_RPR中读取,在GICv2中由实现定义的。
-
Interrupt Identifier(INTID):INTID为相关事件和中断源的唯一中断号。中断被路由到一个或多个PE上处理。PPI和SGI中断号对每个PE为本地的。SPI和LPI对于物理domain为全局中断号。看INTID获取更多信息。
-
nterrupt Routing Infrastructure(IRI):Distributor,Redistribution,选择性的一个或多个ITS。
-
Message-based Interrupt: 基于信息的中断为因为内存写访问一个分配的地址而产生的中断。物理中断可以被转化为基于信息的中断。基于信息的中断可以支持电平中断或边沿中断,虽然LPI中断通常为边沿触发中断。
GICv3对基于信息的中断支持两种机制:
-
(1)用于与SPI通信的机制,当分配的地址在Distributor时。在这种情况下基于信息的中断可以为电平中断或边沿触发中断;
-
(2)用于与LPI通信的机制,当分配的地址在ITS中,如果ITS实现,或在Redistributor。
Arm建议LPI的使用来提供支持PCIE系统中MSI和MSI-X能力的支持。可以看章节5 Locality-specific Peripheral Interrupts and ITS获取更多信息。GICv3也包含使用基于信息的中断发起SPI中断,可以看Shared Peripheral Interrupt。
-
Physical Interrupt: 目标为物理PE的中断为一个物理中断。它通过物理CPU接口发送到PE。
-
Running Priority: 在任何时候,一个CPU接口的运行优先级可以为:
-
(1)active中断的group优先级,在这种接口上不会出现优先级下降;
-
(2)如果没有active中断(在这个接口上优先级不会下降),运行优先级为空优先级0xff;
-
-
Sufficient Priority: GIC CPU接口会比较使能的pending中断的下列情况,来决定是否中断存在足够的优先级:
-
(1)优先级屏蔽寄存器,ICC_PMR_EL1;
-
(2)接口的抢占设置,由ICC_BPR0_EL1和ICC_BPR1_EL1指定;
-
(3)当前运行优先级,由CPU接口的ICC_PRP_EL1指定;
-
如果中断有足够优先级,它被发送到连接的PE上。
-
Virtual Interrupt: 目标为一个VM的中断为虚拟中断。它是由相关的虚拟化CPU接口发起的。看章节6 Virtual Interrupt Handling and Prioritization获取更多信息。
-
Maintenance Interrupt: 它为一个物理中断,将VM上与中断处理相关的重要事件发出,并允许hypervisor跟踪这些事件。这些事件由hypervisor处理,且包含使能和禁用中断的一些特定group。
4、处理中断的模型
在多处理器实现中,存在下列模型来处理中断:
1-Targeted distribution model
Targeted distribution model:该模型可以应用于所有PPI和LPI。它也可以应用于:
-
(1)如果GICD_IROUTER.Interrupt_Routing_Mode==0,在非传统操作的SPI;
-
(2)在传统操作时,当GICD_CTLR.ARE_*==0时,如果仅GICD_ITARGETSR域的一个为为1;
目标PE由软件接受到中断被指定。
2-Target list model
Target list model: 该模式仅用于SGI。多个PE独立的接受中断。当一个PE ack一个中断,中断的pending状态仅对该PE被清除。中断仍每个PE独立的pending直到被PE ack。
3-1:N model
1:N model: 该模式仅用于SPI。中断目标为一组特定的PE,但只在一个PE上处理。中断选择的PE是由实现定义的。架构存在哪个PE被选择的限制。
注意:
-
(1)Arm GIC架构保证1:N中断在目标PE组的其中一个PE;
-
(2)1:N中断可以没最高优先级的中断上,或被ICC_PMR_EL1屏蔽的中断。
**对于传统操作的SPI,这个模型应用于目标寄存器指定一个目标PE。** **如果超过一个PE可以处理中断,硬件实现机制来决定哪个PE激活这个中断。**
参考链接:
https://blog.csdn.net/flyingnosky/article/details/124002544