多个 `/dev/uioX` 设备无法枚举 uio_pdrv_genirq 驱动程序

问题描述 投票:0回答:1

我使用 uio_pdrv_genirq 驱动程序 来控制 Xilinx MPSoC 系统上的多个 FPGA 模块。我已经使用它与相当多的 FPGA 模块(~170)几个月了,直到现在从未遇到过任何困难。然而,目前我遇到了一个问题,其中许多 UIO 设备无法在

/dev
下枚举(并且在
/sys/class/uio
下也不可见)。请注意,我在设备树中设置了
compatible = "generic-uio"
并将
uio_pdrv_genirq.of_id=generic-uio
设置为 bootarg。

如果我检查正在运行的设备树中的 UIO 设备数量,我会看到:

$ sudo dtc -I fs /proc/device-tree | grep generic-uio | wc -l
171

但是,如果我检查

/dev
下的数字,我会看到:

$ ls /dev/uio* | wc -l
158

我在

dmesg
中没有看到任何表明枚举失败的内容。

未枚举的设备是一些Xilinx AXI DMA 内核。然而,这些枚举的 UIO 设备在以前版本的设计中表现得很好。我所做的与这些内核相关的唯一更改是将它们的中断输出连接到 Xilinx AXI 中断控制器(我还制作了一个

generic-uio
设备)。

以下是设备树中的 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>;
        };
};

在之前的设计版本中,我在

/dev
下看到了更多设备:

$ ls /dev/uio* | wc -l
174

知道这里会发生什么吗?如何解决这些设备未显示在

/dev
下的问题?

如果您需要更多信息,请告诉我,我很乐意提供。

linux-kernel
1个回答
0
投票

我设法通过使用

/delete-property/ interrupts;
删除 AXI DMA 核心实例的中断属性来实现此功能。由于我使用
uio_pdrv_genirq
驱动程序来管理 AXI 中断控制器,因此我使用其 UIO 实例(及其驱动程序)来处理来自 AXI DMA 内核的中断。

我认为这里的根本问题是 AXI DMA 核心中断连接到 AXI 中断控制器而不是直接连接到处理器,导致驱动程序无法管理这些中断。但是,如果设备没有中断属性,则

uio_pdrv_genirq
驱动程序可以在不中断的情况下管理设备。但是,当然,在这种情况下,您无法读取和写入
/dev/uioX
实例来等待和启用中断。

© www.soinside.com 2019 - 2024. All rights reserved.