我正在尝试在我的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;
我在这里错过了什么吗?