Linux kernel x86上带有Intel 82X38/X48 Express芯片组的RHEL7.4--完全无法将中断发送到我的驱动程序

Linux kernel x86上带有Intel 82X38/X48 Express芯片组的RHEL7.4--完全无法将中断发送到我的驱动程序,linux-kernel,interrupt,pci-bus,Linux Kernel,Interrupt,Pci Bus,我的同事和我正在使用我们的一款基于PCIe的产品,我们发现某种平台/芯片组依赖性正在阻止中断传输到我们的linux内核驱动程序(RAPAPP)。我们必须在该领域继续支持的一个较旧版本的产品是从较旧的PCI设计中进行的sorta改装。所以我们得到的是一些FPGA,其中一个有66MHz PCI-32接口,连接到德克萨斯仪器XIO PCI到PCIe桥。我应该注意到我已经不知疲倦地研究了好几天了,我只是没有取得任何进展。我们确实考虑过自己设备的硬件问题,但我们换掉了多张卡,这没有任何区别 有效的参考系统

我的同事和我正在使用我们的一款基于PCIe的产品,我们发现某种平台/芯片组依赖性正在阻止中断传输到我们的linux内核驱动程序(RAPAPP)。我们必须在该领域继续支持的一个较旧版本的产品是从较旧的PCI设计中进行的sorta改装。所以我们得到的是一些FPGA,其中一个有66MHz PCI-32接口,连接到德克萨斯仪器XIO PCI到PCIe桥。我应该注意到我已经不知疲倦地研究了好几天了,我只是没有取得任何进展。我们确实考虑过自己设备的硬件问题,但我们换掉了多张卡,这没有任何区别

有效的参考系统 我们有一个运行RHEL6.5的系统,它运行得非常好,所以我们将其作为参考。下面是关于这个平台的一些信息。我不知道你需要多详细,我也不想写一个垃圾问题。请让我知道还可以提供什么以及如何提供(问题中的内联、粘贴箱等)

uname-a

Linux DL-2-107.localdomain 2.6.32-431.el6.i686 #1 SMP Fri Nov 22 00:26:36 UTC 2013 i686 i686 i386 GNU/Linux
Linux rhel74.techsource.com 3.10.0-693.17.1.el7.x86_64 #1 SMP Thu Jan 25 20:13:58 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
从/proc/中断:

           CPU0       CPU1       
...
 16:  609672457 1344098703   IO-APIC-fasteoi   uhci_hcd:usb3, pata_jmicron, rapafp    
10:          0          0   IO-APIC-edge      rapafp
来自dmesg的信息:

rapafp driver version 3.3.0.5
rapafp: Requesting IRQ 16
TSI: rapafp0 (BusID 2:0:0) is RAPTOR 4000 @ 2048x2048
TSI: rapafp1 (BusID 2:0:0) is RAPTOR 4000 @ 1280x1024
[321790.744110] raptor_attach: irq_set_irq_type(10,8) succeeded!
[321790.744111] raptor_attach: calling request_irq.
[321790.744239] raptor_attach: request_irq(10) succeeded!
[321790.744240] raptor_attach: done
[321790.744342] TSI: rapafp0 (BusID 2:0:0) is RAPTOR 4000 @ 2048x2048
...
[321807.840300] PCI Config Register dump:
[321807.840405]  vendor id              0x1227  
[321807.840508]  device id              0x43
[321807.840611]  command register       0x202   
[321807.840715]  status register        0x2a0
[321807.840818]  revision id            0x0     
[321807.840921]  programming class code 0x0
[321807.841025]  sub-class code         0x80    
[321807.841129]  basic class code       0x3
[321807.841232]  header type            0x0     
[321807.841335]  base register 0        0xbfff0008
[321807.841439]  base register 1        0xa0000008      
[321807.841542]  base register 2        0xb8000008
[321807.841645]  base register 3        0x0     
[321807.841749]  base register 4        0xbffc0008
[321807.841852]  base register 5        0x0     
[321807.841955]  Cardbus CIS Pointer    0x0
[321807.842059]  Subsystem Vendor ID    0x1227  
[321807.842162]  Subsystem ID           0x43
[321807.842266]  ROM base register      0x0     
[321807.842369]  interrupt line         0xa
[321807.842472]  interrupt pin          0x1     
[321807.842576]  minimum grant          0x0
[321807.842679]  maximum grant          0x0
从lspci:

# lspci -t
-[0000:00]-+-00.0
           +-01.0-[01-02]----00.0-[02]----00.0

00:01.0 PCI bridge: Intel Corporation 82Q35 Express PCI Express Root Port (rev 02) (prog-if 00 [Normal decode])
01:00.0 PCI bridge: Texas Instruments XIO2000(A)/XIO2200A PCI Express-to-PCI Bridge (rev 03) (prog-if 00 [Normal decode])
02:00.0 Display controller: Tech-Source Device 0042
# lspci -t
-[0000:00]-+-00.0
           +-01.0-[01-02]----00.0-[02]----00.0

00:00.0 Host bridge: Intel Corporation 82X38/X48 Express DRAM Controller (rev 01)
        Subsystem: Holco Enterprise Co, Ltd/Shuttle Computer Device 3111
        Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
        Status: Cap+ 66MHz- UDF- FastB2B+ ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort+ >SERR- <PERR- INTx-
...
00:01.0 PCI bridge: Intel Corporation 82X38/X48 Express Host-Primary PCI Express Bridge (rev 01) (prog-if 00 [Normal decode])
        Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx+
        Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
        Latency: 0, Cache Line Size: 64 bytes
        Interrupt: pin A routed to IRQ 24
...
01:00.0 PCI bridge: Texas Instruments XIO2000(A)/XIO2200A PCI Express-to-PCI Bridge (rev 03) (prog-if 00 [Normal decode])
        Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
        Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
...
02:00.0 Display controller: Tech-Source Device 0043
        Subsystem: Tech-Source Device 0043
        Control: I/O- Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B+ DisINTx-
        Status: Cap- 66MHz+ UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
        Interrupt: pin A routed to IRQ 10
安装的CPU为: 型号名称:英特尔(R)核心(TM)2 CPU E8400@3.00GHz

来自dmidecode的一些BIOS信息:

Vendor: Phoenix Technologies, LTD
Version: 6.00 PG
Release Date: 12/12/2008
注意,驱动程序的编写从来没有考虑过fasteoi,因此它从不进行任何中断调用结束。然而,它在那台机器上工作得完美无缺

系统不能中断我们的驱动程序 我们有两个接收中断的系统。一个运行RHEL6.5(2.6.32-431.el6.i686),另一个运行RHEL7.4(3.10.0-693.17.1.el7.x8664)

RHEL6系统能够中断我们的驱动程序,但只是间歇性的。这可能是由于内核将设备连接到边缘触发的中断线(尽管驱动程序另有要求!),并且驱动程序未被写入与边缘触发兼容

RHEL7系统根本无法中断我们的驱动程序。我们当前的目标是将驱动程序移植到RHEL7,因此我将重点介绍这台机器。主机之间有许多相似之处,与参考系统之间也有许多不同之处。重要的主要区别是内核版本,32位与64位,可能还有BIOS。首先,下面是一些系统信息

uname-a

Linux DL-2-107.localdomain 2.6.32-431.el6.i686 #1 SMP Fri Nov 22 00:26:36 UTC 2013 i686 i686 i386 GNU/Linux
Linux rhel74.techsource.com 3.10.0-693.17.1.el7.x86_64 #1 SMP Thu Jan 25 20:13:58 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
/过程/中断:

           CPU0       CPU1       
...
 16:  609672457 1344098703   IO-APIC-fasteoi   uhci_hcd:usb3, pata_jmicron, rapafp    
10:          0          0   IO-APIC-edge      rapafp
来自dmesg:

rapafp driver version 3.3.0.5
rapafp: Requesting IRQ 16
TSI: rapafp0 (BusID 2:0:0) is RAPTOR 4000 @ 2048x2048
TSI: rapafp1 (BusID 2:0:0) is RAPTOR 4000 @ 1280x1024
[321790.744110] raptor_attach: irq_set_irq_type(10,8) succeeded!
[321790.744111] raptor_attach: calling request_irq.
[321790.744239] raptor_attach: request_irq(10) succeeded!
[321790.744240] raptor_attach: done
[321790.744342] TSI: rapafp0 (BusID 2:0:0) is RAPTOR 4000 @ 2048x2048
...
[321807.840300] PCI Config Register dump:
[321807.840405]  vendor id              0x1227  
[321807.840508]  device id              0x43
[321807.840611]  command register       0x202   
[321807.840715]  status register        0x2a0
[321807.840818]  revision id            0x0     
[321807.840921]  programming class code 0x0
[321807.841025]  sub-class code         0x80    
[321807.841129]  basic class code       0x3
[321807.841232]  header type            0x0     
[321807.841335]  base register 0        0xbfff0008
[321807.841439]  base register 1        0xa0000008      
[321807.841542]  base register 2        0xb8000008
[321807.841645]  base register 3        0x0     
[321807.841749]  base register 4        0xbffc0008
[321807.841852]  base register 5        0x0     
[321807.841955]  Cardbus CIS Pointer    0x0
[321807.842059]  Subsystem Vendor ID    0x1227  
[321807.842162]  Subsystem ID           0x43
[321807.842266]  ROM base register      0x0     
[321807.842369]  interrupt line         0xa
[321807.842472]  interrupt pin          0x1     
[321807.842576]  minimum grant          0x0
[321807.842679]  maximum grant          0x0
来自lspci的信息:

# lspci -t
-[0000:00]-+-00.0
           +-01.0-[01-02]----00.0-[02]----00.0

00:01.0 PCI bridge: Intel Corporation 82Q35 Express PCI Express Root Port (rev 02) (prog-if 00 [Normal decode])
01:00.0 PCI bridge: Texas Instruments XIO2000(A)/XIO2200A PCI Express-to-PCI Bridge (rev 03) (prog-if 00 [Normal decode])
02:00.0 Display controller: Tech-Source Device 0042
# lspci -t
-[0000:00]-+-00.0
           +-01.0-[01-02]----00.0-[02]----00.0

00:00.0 Host bridge: Intel Corporation 82X38/X48 Express DRAM Controller (rev 01)
        Subsystem: Holco Enterprise Co, Ltd/Shuttle Computer Device 3111
        Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
        Status: Cap+ 66MHz- UDF- FastB2B+ ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort+ >SERR- <PERR- INTx-
...
00:01.0 PCI bridge: Intel Corporation 82X38/X48 Express Host-Primary PCI Express Bridge (rev 01) (prog-if 00 [Normal decode])
        Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx+
        Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
        Latency: 0, Cache Line Size: 64 bytes
        Interrupt: pin A routed to IRQ 24
...
01:00.0 PCI bridge: Texas Instruments XIO2000(A)/XIO2200A PCI Express-to-PCI Bridge (rev 03) (prog-if 00 [Normal decode])
        Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
        Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
...
02:00.0 Display controller: Tech-Source Device 0043
        Subsystem: Tech-Source Device 0043
        Control: I/O- Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B+ DisINTx-
        Status: Cap- 66MHz+ UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
        Interrupt: pin A routed to IRQ 10
这样做的主要效果是导致机器挂起,尽管不是立即挂起。我试着在raptor启用intx之前或之后调用request\u irq。IIRC,一个无效,而另一个导致系统挂起,尽管不是立即挂起

我还发现pci_common_swizzle带有一些关于pci标准要求的注释,因此我在上述函数之后调用它。在我做了这些事情之后,我会调用request_irq。通过这些更改,系统将立即挂起到insmod上

当然,我意识到通过网桥进行迭代并强制关闭PCI_命令_INTX_DISABLE是一种令人厌恶的黑客行为,如果是这种行为或swizzle导致系统挂起,我也不会感到惊讶

不管怎样,我在这里迷路了。有人知道我做错了什么吗?我应该如何让系统桥允许遗留中断通过


提前感谢您的帮助

我向LKML发布了一个类似的问题:您是否可以检查配置空间中状态寄存器的第3位,当您认为应该传递中断时,该位指示中断状态?尝试此操作只是为了调试和消除资源分配中奇怪的BIOS问题。执行“lspci-tv”并找到设备所在的PCIe交换机/网桥。然后转到shell并执行echo 1>/sys/bus/pci/devices//remove(或类似操作)。这将使您的设备和网桥从“lspci”中消失。现在执行echo 1>/sys/bus/pci/rescan(IIRC)。这将使LinuxPCI再次重新分配所有资源。确保您的设备和网桥重新出现。它可能会让你绕过坏了的鞋子。我不知道它是否能解决您的问题,但这就是我调试的方式。@ChaitanyaLala我实际上已经把它全部调试好了。解决方案是向上遍历网桥层次结构,并确保DISITX一直处于清除状态。之后,当我调用pci_enable_设备时,它实际上会将我的设备的IRQ线更改为触发级别,但仅在软件中。然后我将新的IRQ行写入PCI配置空间,然后请求IRQ将工作,然后我得到中断。最大的问题是,为什么这不是自动发生的?我不认为破解PCI配置值是非常“平台独立”的,那么我做错了什么呢?@TimothyMiller听起来像是与桥接器初始配置有关。试试我在上一篇评论中提到的步骤。它将清楚地告诉我们这是否是BIOS问题。