PCIe的中断机制有3种:
a. 传统的INTx中断,4个中断线,PCI设备上的所有func可任意使用其中一根或几根线通过拉低的方式向CPU发起中断信号,并把中断号放在interrupt line寄存器中,等待CPU读取。
b. msi中断,PCIE配置空间前256字节中能力描述链表中如果能找到能力ID为0x05的能力描述符,则说明该PCI设备支持MSI中断,并且软件可通过配置该能力描述符来开启、关闭MSI中断,并且在开启之前需要在该描述符内填写MSI消息在主机侧的内存空间地址,用于接收MSI中断信号;并且需要将中断起启编号写到Message Data中,并且将中断个数配置到Message Control中,后续开启中断后PCI设备则根据这两个信息生成连续的中断号。开启MSI之后,传统的INTx中断自动关闭。
当硬件内部有中断产生时,他便会根据内部逻辑选择一个中断号偏移加上系统配置的起始号形成一个中断号,并且形成一个MSI的内存写TLP事务,中断号填写在MSI TLP 的Message Data中,上述配置的地址信息也填入相应位置,然后发出去,主机端的RC PCIE控制器收到该MSI 消息之后往该地址写入中断号,并发起一个CPU中断,然后收到CPU的中断向量获取指令后便从内存中提取出中断号提交上去。CPU则拿到中断向量号后,去内部的中断向量表中进行查找,然后进入系统的中断处理流程。
c. msi-x中断,原理同MSI,PCIE配置空间前256字节中能力描述链表中如果能找到能力ID为0x11的能力描述符,则说明该PCI设备支持MSI中断。只是MSI只支持32个中断号,并且掩码长度和中断pend长度都只有32位,不能满足后续开发需求;并且MSI的中断号还必须是连续分配;msi-x则想解决上述问题。MSI-X改进了msi的能力描述符信息,弄了一个中断号与中断消息地址的对应表格,并且都可自定义;这样便解决了中断号必须连续,和中断向量比较少的问题;地址分开还有利于解决MSI可能存在中断冲突的问题。开启MSI-X之后,自动关闭传递INTx中断。
同时,同一设备MSI,MSI-X均可同时打开,也可独立打开,根据硬件设计使用。
参考文献:
pci_express_base_rev_2.0.pdf
PCI.Local.Bus.Specification.Revision.3.0.pdf