多个/dev/uioX设备无法被uio_pdrv_genirq驱动枚举求助
问题:Xilinx MPSoC下uio_pdrv_genirq驱动部分UIO设备无法枚举
环境与问题概述
- 基于Xilinx MPSoC系统,使用uio_pdrv_genirq驱动控制FPGA模块,此前170+模块稳定运行数月
- 近期部分UIO设备未在
/dev及/sys/class/uio下枚举,dmesg无相关失败日志 - 设备树已配置
compatible = "generic-uio",启动参数添加uio_pdrv_genirq.of_id=generic-uio - 运行中设备树的
generic-uio设备计数:$ sudo dtc -I fs /proc/device-tree | grep generic-uio | wc -l 171 /dev下UIO设备计数:$ ls /dev/uio* | wc -l 158- 未枚举设备为部分Xilinx AXI DMA核,唯一相关改动是将这些DMA的中断输出连接至同样配置为
generic-uio的Xilinx AXI中断控制器;此前版本/dev下UIO设备计数为174
设备树AXI DMA配置示例
dma@80000000 { xlnx,include-sg; clock-names = "s_axi_lite_aclk", "m_axi_sg_aclk", "m_axi_s2mm_aclk"; interrupts = <0x0 0x2>; clocks = <0x3 0x48 0x3 0x47 0x3 0x49>; interrupt-parent = <0x30>; xlnx,addrwidth = <0x20>; compatible = "generic-uio"; interrupt-names = "s2mm_introut"; xlnx,sg-length-width = <0x1a>; reg = <0x0 0x80000000 0x0 0x10000>; phandle = <0xa6>; #dma-cells = <0x1>; dma-channel@80000030 { xlnx,device-id = <0x0>; interrupts = <0x0 0x2>; compatible = "xlnx,axi-dma-s2mm-channel"; dma-channels = <0x1>; xlnx,datawidth = <0x80>; }; };
可能原因与排查步骤
1. 中断资源冲突或多级中断适配问题
- 原因:AXI中断控制器本身被注册为UIO设备后,可能抢占了子DMA设备的中断资源;uio_pdrv_genirq驱动对多级中断的支持存在限制,导致中断初始化失败但未输出日志
- 排查:
- 查看中断分配情况:
cat /proc/interrupts,确认未枚举DMA的中断号是否已被占用 - 临时修改设备树,将未枚举DMA的中断改回直接连接到GIC(而非AXI中断控制器),测试是否能正常枚举
- 启用内核调试日志:添加启动参数
debug uio.debug=1,查看dmesg中UIO设备探测的中断初始化细节
- 查看中断分配情况:
2. 设备树节点冲突或驱动匹配优先级问题
- 原因:部分DMA节点存在
reg地址重叠、phandle重复;若内核编译了Xilinx AXI DMA原生驱动,可能优先匹配节点,导致uio_pdrv_genirq无法绑定 - 排查:
- 检查未枚举DMA的
reg地址是否与其他设备重叠:sudo dtc -I fs /proc/device-tree | grep -A5 -B5 "reg = <0x0 0x80000000"(替换为目标设备的reg地址) - 检查内核是否启用
CONFIG_XILINX_AXI_DMA,若已启用,临时禁用该驱动后测试 - 检查phandle唯一性:
sudo dtc -I fs /proc/device-tree | grep phandle | sort | uniq -d
- 检查未枚举DMA的
3. UIO设备数量上限限制
- 原因:内核默认的UIO设备数量上限接近当前使用量,导致部分设备无法创建
- 排查:
- 查看内核配置
CONFIG_UIO_MAX_DEVICES的值,默认通常为256,确认是否被修改 - 临时增大该配置值并重新编译内核,测试是否能枚举全部设备
- 查看内核配置
4. 硬件层面异常
- 原因:FPGA配置后,部分DMA核的AXI Lite接口未正确连接或复位异常,导致内核无法探测
- 排查:
- 使用Xilinx调试工具(如XSCT、Vivado Hardware Manager)检查未枚举DMA核的状态,确认AXI Lite接口是否正常响应
- 对比前后版本的FPGA比特流,检查中断连接布线是否存在错误
内容的提问来源于stack exchange,提问作者MattHusz
相关产品推荐
相关产品推荐

