本章描述LPI和ITS。它包含如下部分:
- LPI
- ITS
- ITS命令
- 通用ITS伪功能
- ITS命令错误编码
- ITS电源管理
1 LPI
LPI为基于信息的边沿触发中断,如果实现ITS,该中断可以使用ITS路由中断到特定Redistributor和相连的PE。GICv3提供支持两种类型的LPI。LPI可以通过两种方式支持:
- 使用ITS将设备的EventID转化为LPI INTID。
- 直接通过GICR_SETLPIR将LPI INTID发送给Redistributor。
实现必须只能支持两种方法中的一种。
NOTE: 在支持LPI但不包含ITS的实现中必须实现下列寄存器:
- GICR_INVLPIR
- GICR_INVALLR
- GICR_SYNCR
在包含ITS的实现中支持的寄存器由实现定义的。
在不包含ITS的系统中这些寄存器控制物理LPI:
- GICR_SETLPIR
- GICR_CLRLPIR
在包含ITS的实现中,至少支持8192 LPI中断。因为这个原因,每个中断的配置,每个中断的pending信息,保持在内存中,而不是在寄存器中,这些表由Redistributor中的寄存器所指向。
NOTE:(1)Arm期望实现可以缓存Redistributor中的表格的部分内容,这样可以减少延时和内存冲突。这些缓存的形式由实现定义;(2)LPI表的地址在非安全物理地址空间。
图5-1显示了至少包含一个ITS的实现中产生LPI中断。
图5-2显示了不包含ITS的实现中LPI中断的产生。

当GICD_CTLR.DS==0时:
- 当非安全状态的亲和性路由使能时仅支持LPI;
- LPI通常为非安全Group1中断;
当GICD_CTLR.DS==1时:
- 当亲和性路由使能时仅支持LPI;
- LPI通常为Group1中断;
只有一个全局物理LPI空间,因此LPI可以在所有Redistributor之间移动。软件使用GICR_PROPBASER.ID位对全局物理LPI空间的大小编程。
NOTE:物理LPI空间的大小受限于实现支持的最大大小,由寄存器GICD_TYPER.ID位定义。
对于给定Redistributor,LPI的配置和状态由内存中的两个表进行维护,在下列部分描述:
- LPI配置表;
- LPI pending表;
如果Redistributor支持物理LPI,它包含:
- 在LPI配置表中的LPI优先级和使能位。LPI配置表的地址由GICR_PROPBASER定义。当GICR_CTLR.EnableLPI==1时,如果GICR_PROPBASER被更新,影响不可预测。
- 在LPI pending表中内存后备的LPI pending位。该表为一个Redistributor特定的。由GICR_PENDBASER定义LPI pending表的地址。当GICR_CTLR.EnableLPI==1时,如果GICR_PROPBASER被更新,影响不可预测。
GICR_PROPBASER.ID位设置ID空间的大小,LPI配置表的entry数目,相对应的LPI pending表的数目。
物理LPI通过写GICR_CTLR.EnableLPI使能。
NOTE: 当Redistributor接口禁用LPI时,即GICR_CTLR.EnableLPI==0,LPI不能变成pending。在这种情况下无法将LPI变成pending,LPI丢失。这与SIG,PPI,SPI的禁用不一样,它仅阻止中断的信号发送到CPU接口。
GICv4引入处理虚拟中断的相对应表,它们的地址由GICR_VPROPBASER和GICR_VPENDBASER决定。
在GICv4中,虚拟LPI通过写GICR_VPENDBASER.Valid使能。