为什么我可以在ubuntu 15.04上启用PCIe MSI(内核3.19.0-42-generic)

时间:2016-01-22 04:01:40

标签: linux linux-kernel pci-e

我尝试使用

启用PCI MSI
nvec = pci_enable_msi_range(dev, 1, 4);

但是nvec总是返回1向量(我确信我的PCIe端点启用了MSI功能)。我发现原来的IRQ = 17已映射到109.所以我邀请MSI工作。但是,只有一个向量。 我跟踪内核源代码,发现问题原因在

pci_msi_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)

我的内核没有定义CONFIG_PCI_MSI_IRQ_DOMAIN。所以pci_msi_setup_msi_irqs定义为arch_setup_msi_irqs

#define pci_msi_setup_msi_irqs      arch_setup_msi_irqs

int __weak arch_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
{
    struct msi_desc *entry;
    int ret;

    /*
     * If an architecture wants to support multiple MSI, it needs to
     * override arch_setup_msi_irqs()
     */
    if (type == PCI_CAP_ID_MSI && nvec > 1)
        return 1;

...
}

我认为这是我的MSI失败的根本原因。

我的问题是

  1. 我应该尝试定义CONFIG_PCI_MSI_IRQ_DOMAIN吗?我在哪里可以配置它?(我在内核menuconfig中找不到它)
  2. 什么是MSI IRQ Domain?
  3. 或者我是否需要覆盖arch_setup_msi_irqs()?

0 个答案:

没有答案