免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 15595 | 回复: 12
打印 上一主题 下一主题

再问PCIe中断问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-02-11 20:23 |只看该作者 |正序浏览
在软件中有没有办法区分中断是MSI触发的还是INTx触发的?现在用的Xilinx V5的板子发中断是通过它的IP Core发的,导致遇到的问题不好定位。

另外规范中感觉有些含糊(也有可能是没看到位,毕竟太多了),MSI中断如果全能,最终映射到软件应该也是一个IRQ号吧,它是不是也是Configuration Register中的Interrupt Pin的值?

还有一个问题是规范中简单提了一下Level-Triggerd和Edge-Trigger,并且规定MSI只能是Edge-Trigger的,但INTx好像都可以,这两者在操作系统层面有没有什么区别?

论坛徽章:
0
13 [报告]
发表于 2009-02-26 10:38 |只看该作者

回复 #12 Solaris12 的帖子

看完了别忘了在这里给大家讲一下啊,呵呵。

论坛徽章:
0
12 [报告]
发表于 2009-02-25 23:36 |只看该作者
原帖由 Cyberman.Wu 于 2009-2-13 11:04 发表
感觉有点儿象是在pcibios_fixup_irqs中重新调整了dev->irq,但从内核代码看出现这种情况它应该在/var/log/messages中打印一个“PCI->APIC IRQ transform: ...”,但实际上却找不到。

先告一段落了,至少现在 ...



应该是BIOS分配的IRQ, 系统可以从ACPI的一张表里,似乎叫做 PCI IRQ Routing Table, 拿到新的IRQ, 查表的时候,PCI config space的 intABCD和IRQ号似乎是可以作为索引的。

我也正研究这部分,应该需要看过ACPI规范相关部分才能明白怎么回事。

[ 本帖最后由 Solaris12 于 2009-2-26 00:24 编辑 ]

论坛徽章:
0
11 [报告]
发表于 2009-02-19 23:52 |只看该作者
firmware或者OS在枚举pci设备时, 分配的INTx中断号。

评分

参与人数 1可用积分 +6 收起 理由
Roemer + 6 谢谢!

查看全部评分

论坛徽章:
0
10 [报告]
发表于 2009-02-19 22:12 |只看该作者

回复 #9 albcamus 的帖子

那INTERRUPT LINE寄存器里面得值是什么意思呢?

论坛徽章:
0
9 [报告]
发表于 2009-02-19 10:25 |只看该作者

回复 #8 Roemer 的帖子

你可以在写个module,

for each pci dev, 读一下其pdev->irq和INTERRUPT LINE寄存器, 比较一下就知道是否一样了。

注意kernel不要太老的版本

论坛徽章:
0
8 [报告]
发表于 2009-02-18 20:39 |只看该作者
原帖由 albcamus 于 2009-2-13 10:44 发表
>> 按LLD3中的说法,根本可以直接读出来做IRQ号使用于request_irq

ldd3的说法是错的。  driver应该用pdev->irq,而不是读INTERRUPT LINE寄存器。


对pci来说这两个值应该是一致的吧?

drivers/pci/setup-irq.c->pdev_fixup_irq()

论坛徽章:
0
7 [报告]
发表于 2009-02-13 11:04 |只看该作者
感觉有点儿象是在pcibios_fixup_irqs中重新调整了dev->irq,但从内核代码看出现这种情况它应该在/var/log/messages中打印一个“PCI->APIC IRQ transform: ...”,但实际上却找不到。

先告一段落了,至少现在中断调通可以正常使用了。LLD3对于PCI设备驱动的描述实在是太少了,而且它里面的配置空间讲得都是很老的了,连Capability List入口都写成保留字节了。

论坛徽章:
0
6 [报告]
发表于 2009-02-13 10:44 |只看该作者
>> 按LLD3中的说法,根本可以直接读出来做IRQ号使用于request_irq

ldd3的说法是错的。  driver应该用pdev->irq,而不是读INTERRUPT LINE寄存器。

论坛徽章:
0
5 [报告]
发表于 2009-02-13 10:27 |只看该作者
有些问题自己搞清楚了:
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;
}

但后面有没有再调整这一值在相关的代码中没有看到。
  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP