《learn_the_architecture_-_generic_interrupt_controller_v3_and_v4__lpisn》学习笔记
1.LPI(Locality-specific Peripheral Interrupts)是一种基于消息的中断(Message Signaled Interrupt,MSI),由中断翻译服务(ITS)提供翻译。这是因为LPI的设计目标是为系统中大量的设备提供高效的中断管理,而消息信号中断(MSI)是一种通过消息机制触发的中断类型,不需要传统的硬件线来触发中断。LPI的配置和管理与其他中断类型不同,它们的状态保存在内存中而不是寄存器中。对LPI的支持是可选的,可以通过寄存器GICD_TYPER.LPIS位设置,该位置1时表示支持LPI,为0不支持。
2.Redistributors使用内存中保存的表来存储LPI配置信息和每个物理LPI的状态,LPI的配置信息存储在LPI配置表中,寄存器GICR_PROPBASER提供该表的起始地址。LPI配置是全局的,即所有Redistributor必须看到相同的配置。LPI 的状态信息也存储在内存中的表中,即LPI 待处理表,寄存器 GICR_PENDBASER 提供该表的起始地址。每个Redistributor服务器都有自己的 LPI Pending 表,并且这些表不在Redistributor服务器之间共享。如下图所示:
3.当要使用LPI时,Redistributor的初始配置过程为:为LPI Configutation表分配内存,并使用每个LPI的适当配置初始化该表;在每个Redistributor中设置寄存器GICR_PROPBASER以指向LPI Configutation表;为每个Redistributor的LPI Pending表分配内存并初始化每个表的内容,在系统启动时,这通常意味着将内存清零,这意味着所有LPI INTID都处于非活动状态;在每个Redistributor中设置寄存器GICR_PENDBASER以指向与该再分发器关联的LPI挂起表;在每个Redistributor中将寄存器GICR_CTLR.EnableLPIs位设置为1以启用LPI。
4.每个LPI INTR在LPI Configutation表中占据一个字节,如下图:
虽然SPI、PPI和SGI的优先级值为8位,但表中只有6位来记录LPI的优先级,LPI优先级的低两位始终被视为0b00。没有用于记录组配置的字段,LPI始终被视为非安全组1中断。LPI Configutation表的大小取决于LPI的数量,GIC支持的INTID(SPI、PPI、SGI和LPI)的最大数量由寄存器GICD_TYPER.IDbits位指示,LPI配置表仅处理使用大于8191的INTID的LPI。因此,为了支持所有可能的LPI,LPI配置表大小计算如下:大小(以字节为单位) = 2GICD_TYPER.IDbits+1 – 8192。但寄存器GICR_PROPBASER还包括一个IDbits字段,该字段指示LPI配置表支持的INTID数量,该数字必须等于或小于GICD_TYPER.IDbits中的值。所以LPI配置表所需的大小变为:大小(以字节为单位) = 2GICR_PROPBASER.IDbits+1 – 8192。中断控制器必须能够读取为LPI配置表分配的内存,但它永远不会写入该内存。
5.LPI 的状态信息存储在内存中,LPI只有两种状态:非活动或待处理。当中断被确认时,中断会从挂起状态转换为非活动状态。如下图:
因为只有两种状态,所以LPI Pending表中每个LPI只有1位。因此,为了支持实现中所有可能的INTID,LPI待处理表的大小必须为:大小(以字节为单位)=2GICR_PROPBASER.IDbits+1/8。与LPI配置表不同,LPI挂起表的大小不会调整以考虑从INTID8192开始的LPI。表的前1KB(对应于INTID 0到8291的条目)存储实现定义状态。
6.LPI配置信息存储在内存中的表中,而不是寄存器中。出于性能原因,再分发器会缓存LPI配置信息。这意味着要重新配置LPI,软件必须:更新LPI配置表中的条目、确保更新的全局可见性、使再分发器中的任何配置缓存无效。通过发出ITS的INV或INVALL命令来使再分发器中的高速缓存失效,INV命令使特定中断的条目无效,因此该命令通常在重新配置少量LPI时使用,INVALL命令使指定集合中所有中断的条目无效。如果未实现ITS,软件必须写入GICR_INVLPIR(针对特定中断条目)或GICR_INVALLR(针对所有中断条目)寄存器,以使重新分配器重新加载中断配置。
7.ITS:即Interrupt Translation Service,外设通过向ITS中的GITS_TRANSLATER写入消息来生成LPI。这为ITS提供了以下信息:事件ID:这是写入GITS_TRANSLATER的值,EventID标识外设正在发送哪个中断,EventID可能与INTID相同,或者它可能由ITS转换为INTID;设备ID:DeviceID用来标识外设,DeviceID的生成机制是由具体实施定义的。ITS负责将消息转换为可传递至连接核心的INTID。物理LPI被分组到集合中。集合中的所有LPI都路由到同一个再分发器。软件将LPI分配给集合,从而使其能够有效地将中断从一个处理元素移动到另一个处理元素。