Некоторые устройства /dev/uioX не удается перечислить для драйвера uio_pdrv_genirq.

Вопрос или проблема

Я использую драйвер uio_pdrv_genirq для управления несколькими модулями FPGA в системе Xilinx MPSoC. Я использовал его в течение нескольких месяцев с довольно большим количеством модулей FPGA (~170) и никогда не сталкивался с трудностями до сих пор. Однако в настоящее время я столкнулся с проблемой, при которой несколько устройств UIO не удается перечислить в /dev (они также не отображаются в /sys/class/uio). Обратите внимание, что я установил compatible = "generic-uio" в дереве устройств и установил uio_pdrv_genirq.of_id=generic-uio в качестве аргумента загрузки.

Если я проверяю количество устройств 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?

Пожалуйста, дайте знать, если вам нужна дополнительная информация, и я с радостью ее предоставлю.

Ответ или решение

Проблема с неразмерами устройств /dev/uioX для драйвера uio_pdrv_genirq: Возможные причины и способы решения

Введение

В данной статье рассмотрим проблему, связанную с отсутствием некоторых устройств UIO в директории /dev на платформе Xilinx MPSoC, что может вызывать трудности при работе с FPGA модулями. Мы обсудим возможные причины неполной нумерации и предложим шаги для диагностики и решения проблемы.

Описание проблемы

У вас есть система, использующая драйвер uio_pdrv_genirq для управления FPGA модулями, и на текущий момент наблюдается проблема с тем, что не все устройства UIO перечисляются в /dev (или видны в /sys/class/uio). При этом в дереве устройств вы можете увидеть всю конфигурацию, что затрудняет понимание причин неполной нумерации.

При проверке видов устройств мы видим расхождение между количеством UIO устройств в дереве устройств и теми, которые доступны через /dev:

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

Возможные причины

  1. Ошибки в конфигурации прерываний:
    Основная причина может быть связана с неправильной конфигурацией прерываний для новых устройств. Вы отметили, что соединение выходов прерываний DMA-ядра с контроллером прерываний могло повлиять на их работу. Убедитесь, что идентификаторы прерываний указаны корректно как в аппаратной, так и в программной части.

  2. Переполнение интерфейса UIO:
    Обратите внимание на ограничения подсистемы UIO. Если вы добавляете слишком много устройств, это может вызвать проблемы с выделением ресурсов, что также может быть причиной того, что некоторые устройства не отображаются.

  3. Недостаток ресурсов для новых устройств:
    Проверьте, достаточно ли в системе доступа к оперативной памяти и прерываниям. Если некоторые из них были истощены, это может затруднить создание новых UIO устройств.

  4. Совместимость и параметры устройства:
    Убедитесь в правильности указанных параметров устройства и совместимости (включая compatible = "generic-uio"). Важно также проверить, что все необходимые залежные свойства (property) указаны в дереве устройств.

Шаги по диагностике и решению

  1. Проверка журналов системы:
    Используйте команду dmesg для просмотра системных сообщений. Просмотрите логи на наличие ошибок, связанных с инициализацией устройств или прерываниями.

  2. Проверка конфигурации устройства:
    Изучите конфигурацию в дереве устройств, чтобы убедиться, что все свойства установлены правильно и что все необходимые ссылки на контроллер прерываний актуальны и активны.

  3. Проверка прерываний:
    Исследуйте настройки контроллера прерываний. Убедитесь, что IRQ, указанные для ваших UIO устройств, правильно настроены и не конфликтуют с другими устройствами.

  4. Тестирование в упрощенной конфигурации:
    Если возможно, попробуйте удалить или отключить недавно добавленные устройства и протестируйте систему с меньшим количеством UIO устройств, чтобы проверить, появляется ли проблема.

  5. Обновление программного обеспечения:
    Убедитесь, что используемая вами версия Linux и драйверов соответствуют стабильной и совместимой версии. Иногда проблемы могут быть связаны с ошибками в драйверах, которые были устранены в более поздних версиях.

Заключение

Причины, по которым некоторые устройства UIO могут не отображаться в системе, могут варьироваться от некорректной конфигурации до исчерпания системных ресурсов. Исходя из представленной информации, важно поэтапно диагностировать проблему, проверяя контроль прерываний, параметры устройств в дереве устройств и системные логи. Следуя предложенным шагам, вы сможете быстрее выявить и устранить причину, эффективнее управляя вашими FPGA модулями на платформе Xilinx MPSoC.

Оцените материал
Добавить комментарий

Капча загружается...