PCIe子卡的驱动在RHEL 5.4上调的好好的,一到RHEL 6.3就出现了问题:MSI中断无法触发。
PCIe接口都是兼容的,硬件上应该没问题;多半还是驱动代码问题。
调试N久,终于发现,代码运行在RHEL6.3时,PCI配置空间中MSI capacity结构的Message Address寄存器没有初始化。

坑爹的PCIe MSI中断路由问题-LMLPHP
坑爹的PCIe MSI中断路由问题-LMLPHP

出问题时
msg ctrl is 0081
     .enable:1    [1]
     .msg_cap:3   [0]
     .msg_en:3    [0]
     .bit64_cap:1 [1]
     .pre_mask:1  [0]
msg addr is 0000
msg addr is 0000
msg data is 0000

驱动中加入 pci_enable_device()后,MSI中断总算正常触发了....
msg val is 0081
     .enable:1    [1]
     .msg_cap:3   [0]
     .msg_en:3    [0]
     .bit64_cap:1 [1]
     .pre_mask:1  [0]
msg addr is 0678
msg addr is fee0
msg data is 0000

RHEL5.4 和 RHEL6.3 中pci_enable_device()实现有什么不同?RHEL5.4中不加pci_enable_device()为什么也能正常触发MSI中断
貌似是中断路由的问题 TODO

附上x86平台 message_addr寄存器的处理
坑爹的PCIe MSI中断路由问题-LMLPHP

Message Address字段其他位的含义如下所示。

  • DestinationID字段保存目标CPUID号,目标CPUID与该字段相等时,目标CPU将接收这个Interrupt MessageFSB Interrupt Message总线事务可以向不同的CPU提交中断请求。
  • RH(Redirection HintIndication)位为0时,表示Interrupt Message将直接发向与Destination ID字段相同的目标CPU;如果RH1时,将使能中断转发功能。
  • DM(DestinationMode)位表示在传递优先权最低的中断请求时,Destination ID字段是否被翻译为Logical或者Physical APIC ID。在x86处理器中APIC ID有三种模式,分别为PhysicalLogicalCluster ID模式。
  • 如果RH位为1DM位为0时,Destination ID字段使用Physical模式;如果RH位为1DM位为1Destination ID字段使用Logical模式;如果RH位为0DM位将被忽略。


02-08 05:26