1.INTx
PCIE支持INTX(A,B,C,D)四种类型的中断信息.A,B,C,D都是虚拟的连线为链路提供中断信息,交换机收集这些信息,在UP端呈现出组合之后的信息.然后将这些信息发送给RC,在RC端映射成为系统中断源.device必须通过assert/de-assert成对出现的方式模拟电平触发的中断信号.
2.MSI
MSI(MESSAGE SIGNALED INTERRUPT)基于消息的,不是基于管脚的.解决了之前因为管脚有限而共享管脚的问题.
MSI capability header在PCIE的配置空间枚举MSI Capability Structure.
对于MSI来说,Capability ID固定是0x5;Next Capability Pointer表示下一个structure的指针,当其为0时,表示没有进一步的列表.
multiple message capable:决定了可以请求的中断向量个数.最大值是5,代表32个向量.
multiple message enable:决定了分配请求分配向量的个数.
Message data:如果MSI enable bit使能,此function就会用message data的低16bit发送一个DWORD MEMORY写操作.
系统软件会给每个MSI capable function分配一个或者多个中断向量.
从中断产生到中断处理模块的延时每个系统是不一样的.
通过MEMORY WRITE操作来产生相应的中断.MSI和MSI-X都是边沿触发的中断机制.
3.MSI-X
与MSI相比,MSI-X支持更多的中断,最多可以达到2048个,每个中断都可以独立配置.
MSI structure中包含了中断向量所有的控制和状态信息,但是MSI-X structure指向了MSI-X Table structure和MSI-X PBA structure,而且两个表项都存储在MEMORY空间内.
TABLE BIR用来指示选择的BAR空间,根据BAR空间可以获取基地址信息,结合TBALE OFFSET从而可以知道TABLE structure存放的位置.
PER-VECTOR MASKING对于MSI来说是可选的,但是对于MSI-X来说是标准的,必须支持的.
FUNCTION MASK是MSI-X的标准feature,MSI-X FUNCTION MASK bit为1,那么不管per-entry mask bit是什么,所有的vector都会被MASK.
在MSI-X中支持将同一个中断向量分配给多个MSI-X table entry,因此所有这样的entry都必须被MASKED,保证此function不会再往这个向量上发送message data.
4.中断处理流程
a.主机枚举到EP PF设备,配置MSI-x表项;
b.EP读取vector table,获取到MSI-x中断对应的message address,构造TLP包,往message address地址里面写中断信息;
c.RC收到包判断是个TLP写后,将写操作转到总线,并返回ACK;
d.GIC中的ITS检测到对应DDR有变化,则获取设备和中断信息后分发到经GIC分发到各个CPU核上.
5.中断向量
对于MSI来说,message data在capability structure中定义,message data的低几bit用来指示中断向量,在产生中断时可以修改,根据配置的中断向量个数决定有几位可以修改,例如中断向量个数是8,那么低3位就可以修改;
对于MSI-X来说,message data在entry table中定义,低几位个人认为是存储中断向量的,而且在产生中断的时候不可以修改.
6.疑问
在PCIE设备中会包含几个MSI capability structure?如果只包含一个的话,因为一个structure中只有一个address,那么在包含多个中断向量时,多个中断向量共用一个地址信息??