1.3 PCI&PCIE MSI中断

1、什么是MSI?(Message Signaled Interrupts)

用简单的一句话就可以说明msi的原理:cpu有一段特殊的寄存器空间,往这个寄存器里面写数据,就会触发cpu的中断。pci设备经过配置以后,一旦需要上报中断就会往cpu这种寄存器里面写一个值,触发cpu的中断。

1.3 PCI&PCIE MSI中断_第1张图片

2、PCI/PCIE Device侧关于MSI的配置:

关于MSI特性,PCI提供了一组Capability Struct,其Capability ID = 5。软件需要根据Capabilities List在40-FF pci配置空间中,找到MSI的Capability Struct。

MSI Capability Struct的具体寄存器定义如下:

1.3 PCI&PCIE MSI中断_第2张图片

可以看到,MSI Capability Struct支持32bit/64bit两种模式。需要重点关注就两个寄存器Message Address和Message Data。
寄存器Message Address: 系统软件配置此寄存器为分配给该PCI设备的,CPU可产生中断的寄存器的地址。
寄存器Message Data : 系统软件配置此寄存器为符合CPU中断号解析规则的内容,内容由CPU关注,pci device不关注其内容,可以配置对低几位可自动修改,从而可以产生多个消息。

3、CPU侧关于MSI的配置:

下图为系统IOH桥片中,写操作会引起中断的寄存器区域,即FEE00000到FEF00000区域:

1.3 PCI&PCIE MSI中断_第3张图片

4、实例:

可以读出ufca前插板fpga的配置寄存器来研究其MSI寄存器的配置:

1.3 PCI&PCIE MSI中断_第4张图片

5、MSI和INTx的区别:

MSI和INTx中断是pci/pcie总线的两种中断方式。
在PCI总线里面INTx中断是由四条可选的中断线决定的,这种中断方式是共享式的,所有的pci设备把中断信号在一条中短线上相与,再上报给cpu,cpu收到中断以后再查询具体是哪个设备产生了中断。
在PCIE总线里面已经没有了实体的INTx物理中断线了,PCIE标准使用专门的Message事务包来实现INTx中断,这是为了兼容以前的PCI软件。
MSI中断在PCI和PCIE中的机制都是一样的,往配置的CPU中断寄存器里进行memory写操作,来产生中断。

对于PCI设备来说,INTx和MSI中断两者只能选择一种,不能同时使用。比较来说,INTx是共享式的,cpu相应中断后还需要查询具体中断源,效率比较低。所以推荐使用MSI中断。

你可能感兴趣的:(Linux,驱动三板斧(旧文,2.6内核))