Linux PCI设备驱动程序 - 总线v。内核IRQ

时间:2013-03-19 21:30:21

标签: linux-kernel interrupt pci irq

我正在为Linux中的PCIe卡编写设备驱动程序。我试图在我的驱动程序中使用中断。

读取PCI配置寄存器的“IRQ线”部分(偏移量0x3C)报告设备的指定IRQ线 11 lspci -b -vv还报告我的设备的中断号码 11

Heres变得奇怪...... cat /sys/bus/pci/devices/<my_device>/irq报告中断号 19 lspci -vv还报告中断号为19。

在我的驱动程序中请求 11 不起作用。如果我在驱动程序中请求 19 ,我会很好地捕获中断。

是什么给出了?

感谢!!!

2 个答案:

答案 0 :(得分:5)

我认为它与“物理”和“虚拟”IRQ线之间的区别有关。由于处理器具有有限数量的物理IRQ线路,因此它分配虚拟IRQ线路以允许PCI设备的总数超过物理线路的数量。

在这种情况下,19是您的虚拟IRQ线(由处理器识别),而11是物理线(由PCI设备识别)。

顺便说一下,你应该真正从该设备的struct pci_dev获取IRQ号,因为它们是动态生成的。

答案 1 :(得分:0)

肖恩的回答很容易理解。但是在这里我会尝试让它更完整。

CPU的IRQ引脚几乎总是不直接连接到外围设备,而是通过可编程中断控制器(PIC,例如Intel 8259A)连接。这有助于处理大型设备扇出以及异构中断格式(基于引脚的v.s.消息,如PCIe中所示)。

如果你运行最新版本的lspci,它会打印像

这样的信息
Interrupt: pin A routed to IRQ 26

这里,OP中的pin A为11,是物理引脚。这是PCI设备保存的内容,由硬件用于中断控制器之间的交换。来自自民党:

  

PCI设置代码写入中断控制器的引脚号   进入每个设备的PCI配置头。它决定了   中断引脚(或IRQ)编号使用其对PCI中断的了解   路由拓扑结合设备PCI插槽号和哪些   它正在使用的PCI中断引脚。一个设备的中断引脚   用途是固定的,并保存在PCI配置头中的字段中   对于这个设备。它将此信息写入中断线   为此目的保留的字段。当设备驱动程序运行时,   它读取此信息并使用它来请求控制   从Linux内核中断。

IRQ 26因为OP中的19是内核代码和CPU处理的内容。根据Linux Documentation / IRQ.txt:

  

IRQ号是用于谈论硬件的内核标识符   中断源。通常,这是全局irq_desc的索引   数组,但除了linux / interrupt.h实现的细节   是特定于架构的。

因此PCI首先接收来自设备的中断,将中断源转换为IRQ号并通知CPU。 CPU使用IRQ编号查看中断描述符表(IDT)并找到正确的软件处理程序。

价:

http://www.tldp.org/LDP/tlk/dd/interrupts.html http://www.brokenthorn.com/Resources/OSDevPic.html