- 论坛徽章:
- 0
|
有些问题自己搞清楚了:
Linux不会自动使能MSI/MSI-X的,需要驱动在调用request_irq之前调用pci_enable_msi/msix()。以前看PCI规范中写设置MSI Control Register只能是系统软件,不能在驱动中处理,所以一直以为是系统自动处理的。
今天测试了一下,发现用MSI方式是OK的,不清楚V5的IP Core怎么做的,只能发MSI或根据配置情况自动选择?INTx方式有缺陷或我们的使用方式不对?这个Core也并非很稳定,去年用新版本它上面映射上来的RAM写正常,读几次之后就挂了,整个系统崩溃,换了个旧的就OK了。
不过发现Linux中的pci.txt的描述对于PCIe并不一定完全适用,它里面讲到MSI的两个好处之一是避免DMA/IRQ race conditions,但对于PCIe,DMA和MSI如果使用不同的TC/VC的话还是会存在问题的。
现在还有一个很迷惑的问题是Interrupt Line寄存器到底是干啥用的?按LLD3中的说法,根本可以直接读出来做IRQ号使用于request_irq,但昨天我发现用INTx的PCIe设备都对不上,于是特地在一台带了PCI无线网卡的机器上查看,结果发现/proc/interrupts中的中断号和这一寄存器还是对不上。不过在Linux代码中看到在pci_setup_device()->pci_read_irq()中是直接读的寄存器:
static void pci_read_irq(struct pci_dev *dev)
{
unsigned char irq;
pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &irq);
dev->pin = irq;
if (irq)
pci_read_config_byte(dev, PCI_INTERRUPT_LINE, &irq);
dev->irq = irq;
}
|
但后面有没有再调整这一值在相关的代码中没有看到。 |
|