PCIe接口都是兼容的,硬件上应该没问题;多半还是驱动代码问题。
调试N久,终于发现,代码运行在RHEL6.3时,PCI配置空间中MSI capacity结构的Message Address寄存器没有初始化。
出问题时
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寄存器的处理
Message Address字段其他位的含义如下所示。
- DestinationID字段保存目标CPU的ID号,目标CPU的ID与该字段相等时,目标CPU将接收这个Interrupt Message。FSB Interrupt Message总线事务可以向不同的CPU提交中断请求。
- RH(Redirection HintIndication)位为0时,表示Interrupt Message将直接发向与Destination ID字段相同的目标CPU;如果RH为1时,将使能中断转发功能。
- DM(DestinationMode)位表示在传递优先权最低的中断请求时,Destination ID字段是否被翻译为Logical或者Physical APIC ID。在x86处理器中APIC ID有三种模式,分别为Physical、Logical和Cluster ID模式。
- 如果RH位为1且DM位为0时,Destination ID字段使用Physical模式;如果RH位为1且DM位为1,Destination ID字段使用Logical模式;如果RH位为0,DM位将被忽略。