PCIe子卡的驱动在RHEL 5.4上调的好好的,一到RHEL 6.3就出现了问题:MSI中断无法触发。
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字段其他位的含义如下所示。
-
Destination
ID字段保存目标CPU的ID号,目标CPU的ID与该字段相等时,目标CPU将接收这个Interrupt Message。FSB Interrupt Message总线事务可以向不同的CPU提交中断请求。
-
RH(Redirection Hint
Indication)位为0时,表示Interrupt Message将直接发向与Destination ID字段相同的目标CPU;如果RH为1时,将使能中断转发功能。
-
DM(Destination
Mode)位表示在传递优先权最低的中断请求时,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位将被忽略。
阅读(12401) | 评论(2) | 转发(0) |