You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多个/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

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 06:43:16