文章目录
The Distributor and Redistributors
Distributor为SPIs提供路由配置,并保存所有相关的路由和优先级信息。
Redistributor提供PPI和SGI的配置设置。
Redistributor总是在有限的时间内向CPU interface呈现具有最高优先级的未决中断。
以下情况,最高优先级的pending中断可能会更改:
- 已确认先前的最高优先级中断。
- 先前的最高优先级中断已被抢占。
- 先前的最高优先级中断被删除,不再有效。
- 组中断启用已修改。
- PE不再是参与PE。
INTIDs
使用ID号(INTID)识别中断。
对于Distributor和Redistributor中支持的INTID位数:
- 如果不支持LPI,则分发服务器中的ID空间限制为10位。这与早期版本的GIC架构相同。
- 如果支持LPI,则INTID字段在14-24位范围。
对于ITS中支持的INTID位数:
-如果支持LPI,则INTID字段在14-24位范围内。
-INTID字段的大小由GITS_TYPER.IDbits定义。
必须对ITS进行编程,以使转发到Redistributor的中断处于该Redistributer支持的中断范围内,否则行为是不可预测的。
对于CPU interface中支持的INTID位数:
GICv3 CPU接口支持16位或24位INTID字段,选择是支持的物理中断标识符位的数量由ICC_CTLR_EL1.IDbits和ICC_CTLR.EL3.IDbits表示。
ARM建议的PPI INTID分配。
Special INTIDs
GIC架构为特殊目的保留的INTID列表如下:
1020: GIC响应于在EL3处读取ICC_IAR0_EL1或ICC_HPPIR0_EL1而返回该值,以指示所确认的中断是预期在安全EL1处处理的中断。
1021:GIC响应于在EL3处读取ICC_IAR0_EL1或ICC_HPPIR0_EL1而返回该值,以指示所确认的中断是预期在非安全EL1或EL2处处理的中断。
1022:此值仅适用于旧操作。
1023:如果不存在具有足够优先级的未决中断以向PE发出信号,或者如果最高优先级未决中断不适合以下情况,则响应中断确认返回该值:
- 当前安全状态。
- 与系统寄存器关联的中断组。
Implementations with mixed INTD sizes
GIC的不同部分实施不同的INTID大小,遵循以下规则。
- PE可以实现16位或24位INTID。
- Distributor和Redistributors必须实现相同数量的INTID位。
- 在支持LPI的系统中,Distributor和所有Redistributors必须实现至少14位的INTID。Distributor和Redistributors中实现的位数不得超过系统中任何PE上实现的最小位数。
- 在不支持LPI的系统中,分发器和所有再分发器必须实现至少5位INTID,并且不能实现超过10位的INTID。
- 在包含一个或多个ITS的系统中,ITS可以实现任何值,最高可达并包括Distributor和Redistributors支持的位数,最低为14位,这是LPI支持所需的最小位数。
Affinity routing
Affinity routing是一种基于分层地址的方案,用于识别用于中断路由的特定PE节点。
对于PE,AArch64的affinity value在MPIDR_EL1中,AArch32的affinity value在MPIDR中。
- Affinity routing是由四个8位相关性字段组成的32位值。这些字段是节点a、b、c和d。
- 使用AArch64状态的GICv3可以支持:
四级路由层次结构,a.b.c.d。
三级路由层次结构0.b.c.d。 - 使用AArch32状态的GICv3仅支持三个关联级别。
- ICC_CTLR_EL3.A3V、ICC_CTLR_EL1.A3V和GICD_TYPER.A3V指示是实现了四个级别还是三个级别的亲和性。
用于在关联层次结构中指定节点的枚举表示形式如下,Affinity level x : Aff3.Aff2.Aff1.Aff0
使用关联路由启用(ARE)位在分发服务器中启用安全状态的关联路由。已启用相关性路由:
- 对于安全中断,如果GICD_CTLR.ARE_S设置为1。
- 对于非安全中断,如果GICD_CTLR.ARE_NS位设置为1。
如果永久启用关联路由,则GICD_CTLR.ARE_S和GICD_CTLCR.ARE_NS为RAO/WI。
Routing SPIs and SGIs by PE affinity
SPI使用affinity address和GICD_IROUTER中保存的routing mode信息来路由。
SGI使用软件在生成SGI时写入的affinity address和routing mode信息进行路由。
SGI使用以下寄存器生成:
- ICC_SGI0R_EL1.
- ICC_SGI1R_EL1.
- ICC_ASGI1R_EL1.
ARM强烈建议在亲和级别0处仅使用0-15范围内的值,以符合SGI目标列表功能。
SPI和SGI使用不同的寄存器进行路由:
SPIs使用GICD_IROUTER.Interrupt_Routing_Mode路由。
- 如果GICD_IROUTER.Interrupt_Routing_Mode为0,则SPI被路由到a.b.c.d指定的单个PE。
- 如果GICD_IROUTER.Interrupt_Routing_Mode设置为1,则将SPI路由到定义为参与节点的任何PE。
SGI使用ICC_SGI0R_EL1.IRM和ICC_SGI1R_EL1.IRM进行路由:
- 如果IRM位设置为1,则将SGI路由到系统中的所有参与PE,不包括发起PE。
- 如果IRM位被清除为0,则SGI被路由到一组PE,由a.b.c.targetlist指定。目标列表为0-15的相关性级别0值提供位字段编码。