读取PCI MSICAP寄存器

时间:2014-02-26 13:39:50

标签: linux hardware linux-device-driver pci

我正在尝试在我的PCI卡上启用多个MSI,然后启用相同的i读取pci_config_space()MSICAP + 2h:MC - 消息信号中断消息控制。

我的方式如下

u16 val;
int pos = 0x50;
pci_read_config_word(dev, pos + PCI_MSI_FLAGS, &val);
printk("\n  val = %x", val);
val |= 0x51;
pci_write_config_word(dev, pos + PCI_MSI_FLAGS, val);
pci_read_config_word(dev, pos + PCI_MSI_FLAGS, &val);
printk("\n After pci_enable  val = %x", val);

首先,这是访问MSI CAP + 2偏移量的正确方法吗?

我正在读取值为0x80,表示只支持一个MSI,但HW规范称它支持16MSI,预期值为88.

当我按照以下方式启用多个MSI时,将HW规范用于它是最真实的

ret = pci_enable_msi_block(dev, 2);

“ret”的值为1表示我对多个MSI的请求失败。 在内核代码中检查时,这是它失败的路径,这表示MSI CAP为0x00。

292 #define  PCI_MSI_FLAGS_QMASK    0x0e    /* Maximum queue size available */

670         pci_read_config_word(dev, pos + PCI_MSI_FLAGS, &msgctl);
671         maxvec = 1 << ((msgctl & PCI_MSI_FLAGS_QMASK) >> 1);
672         if (nvec > maxvec)
673                 return maxvec;

我在这里错过了什么吗?

0 个答案:

没有答案