- 论坛徽章:
- 0
|
自己顶一下。看了一下Linux的代码,发现它的中断号是用另外的机制产生的:
static int msi_capability_init(struct pci_dev *dev)
{
struct msi_desc *entry;
int pos, ret;
u16 control;
msi_set_enable(dev, 0); /* Ensure msi is disabled as I set it up */
pos = pci_find_capability(dev, PCI_CAP_ID_MSI);
pci_read_config_word(dev, msi_control_reg(pos), &control);
/* MSI Entry Initialization */
entry = alloc_msi_entry();
if (!entry)
return -ENOMEM;
entry->msi_attrib.type = PCI_CAP_ID_MSI;
entry->msi_attrib.is_64 = is_64bit_address(control);
entry->msi_attrib.entry_nr = 0;
entry->msi_attrib.maskbit = is_mask_bit_support(control);
entry->msi_attrib.masked = 1;
entry->msi_attrib.default_irq = dev->irq; /* Save IOAPIC IRQ */
entry->msi_attrib.pos = pos;
if (is_mask_bit_support(control)) {
entry->mask_base = (void __iomem *)(long)msi_mask_bits_reg(pos,
is_64bit_address(control));
}
entry->dev = dev;
if (entry->msi_attrib.maskbit) {
unsigned int maskbits, temp;
/* All MSIs are unmasked by default, Mask them all */
pci_read_config_dword(dev,
msi_mask_bits_reg(pos, is_64bit_address(control)),
&maskbits);
temp = (1 << multi_msi_capable(control));
temp = ((temp - 1) & ~temp);
maskbits |= temp;
pci_write_config_dword(dev,
msi_mask_bits_reg(pos, is_64bit_address(control)),
maskbits);
}
list_add_tail(&entry->list, &dev->msi_list);
/* Configure MSI capability structure */
ret = arch_setup_msi_irqs(dev, 1, PCI_CAP_ID_MSI);
if (ret) {
msi_free_irqs(dev);
return ret;
}
/* Set MSI enabled bits */
pci_intx(dev, 0); /* disable intx */
msi_set_enable(dev, 1);
dev->msi_enabled = 1;
dev->irq = entry->irq;
return 0;
} |
不过前面的arch_setup_msi_irqs函数没找到i368的实现,所以不清楚具体是怎么操作的。
不过通过实际系统中PCIe设备的配置空间查看还是有些奇怪:
1. 对于使能了MSI的网卡,msi_capability_init->pci_intx(dev, 0);应该是把command register中的Disable INTx置1了,但我读到的网卡配置空间的这一寄存器的对应bit却是清0了的。
2. 对于没有使能的显卡,Interrupt Line并不是/proc/interrupts中的中断号,难道虚拟的INTx并不使用这一寄存器?范围中没看到相关说明。
pci_msi_check_device函数中的注释说明需要设备本身和其上面的总线都支持MSI才返回0,显卡的配置空间显示它本身是支持MSI的,难道是总线的某一级不支持?
还有一点不确认的是fastio和MSI或level-triggered是什么关系?不知道是不同版本显示不一样(一个是RHEL5.1,还有一个是Fedora 8),还是Intel和ADM系统中有所区别? |
|