PCI中断未分配:Xilinx ZCU102开发板PCIe设备获配中断0问题求助
排查ZCU102上PCIe载卡INTx中断分配错误问题
刚踩过Zynq UltraScale+ MPSoC PCIe中断配置的类似坑,给你梳理下排查和修复的关键步骤:
1. 先确认当前中断分配的真实状态
首先得搞清楚系统到底给PCI设备分配了啥中断,以及中断0的占用情况:
- 用
lspci -vvv查看PCI设备的详细中断信息,重点抓Interrupt:字段:lspci -vvv | grep -A 5 -B 5 "Interrupt:" - 再检查
/proc/interrupts,确认中断0是不是真的被PCI设备占用了(正常情况下中断0是系统时钟中断,绝对不能分配给外设):cat /proc/interrupts | head -20
2. 检查设备树的PCIe中断映射配置
Zynq MPSoC的PCIe中断完全依赖设备树的interrupt-map和interrupt-map-mask来做映射,这是最容易出问题的地方:
- 找到设备树里的PCIe控制器节点(通常是
pcie@fd000000),必须确保配置了正确的中断映射规则。举个符合ZCU102参考设计的示例片段:pcie@fd000000 { compatible = "xlnx,zynqmp-pcie-2.1"; reg = <0x0 0xfd000000 0x0 0x100000>; #address-cells = <3>; #size-cells = <2>; device_type = "pci"; ranges = <0x81000000 0x0 0x00000000 0x0 0xfd100000 0x0 0x00100000>, <0x82000000 0x0 0x10000000 0x0 0x10000000 0x0 0xf0000000>; interrupt-parent = <&gic>; // 这里的中断号要对应ZCU102硬件设计的GIC中断线,别瞎填 interrupts = <0 123 4>, <0 124 4>, <0 125 4>, <0 126 4>; interrupt-map-mask = <0 0 0 7>; interrupt-map = <0 0 0 1 &gic 0 123 4>, <0 0 0 2 &gic 0 124 4>, <0 0 0 3 &gic 0 125 4>, <0 0 0 4 &gic 0 126 4>; status = "okay"; }; - 注意:
interrupts里的中断号必须和ZCU102的硬件手册或官方参考设备树一致,不能随便写。如果设备树里没配置interrupt-map,系统就没法正确映射PCIe的INTx中断,大概率会出现错误分配的情况。
3. 检查内核配置与版本
Linux 16.04对应的内核是4.4.x,这个版本的Zynq PCIe驱动可能存在中断映射的bug:
- 确保内核启用了
CONFIG_PCIE_XILINX和CONFIG_PCI_INTX(INTx中断支持); - 建议升级内核到4.9 LTS或更高版本,或者应用Xilinx官方提供的针对4.4内核的PCIe中断补丁,很多老版本的bug在新内核里已经修复了。
4. 验证驱动的中断申请逻辑
最后检查你的PCIe载卡驱动:
- 驱动里不能硬编码中断号,必须通过
pci_dev->irq来获取系统分配的正确中断号; - 调用
request_irq()时,要确保传递的是pci_dev->irq,而不是自定义的数值,否则很可能触发错误的中断分配。
另外你提到的misc中断,是PCIe控制器自身的杂项中断(比如链路状态变化),和外设的INTx中断完全是两回事,别搞混了。优先从设备树的中断映射排查,这是Zynq PCIe中断问题的重灾区。
内容的提问来源于stack exchange,提问作者Bill Door
相关产品推荐
相关产品推荐

