Вопрос или проблема
Я использую драйвер 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
Возможные причины
-
Ошибки в конфигурации прерываний:
Основная причина может быть связана с неправильной конфигурацией прерываний для новых устройств. Вы отметили, что соединение выходов прерываний DMA-ядра с контроллером прерываний могло повлиять на их работу. Убедитесь, что идентификаторы прерываний указаны корректно как в аппаратной, так и в программной части. -
Переполнение интерфейса UIO:
Обратите внимание на ограничения подсистемы UIO. Если вы добавляете слишком много устройств, это может вызвать проблемы с выделением ресурсов, что также может быть причиной того, что некоторые устройства не отображаются. -
Недостаток ресурсов для новых устройств:
Проверьте, достаточно ли в системе доступа к оперативной памяти и прерываниям. Если некоторые из них были истощены, это может затруднить создание новых UIO устройств. -
Совместимость и параметры устройства:
Убедитесь в правильности указанных параметров устройства и совместимости (включаяcompatible = "generic-uio"
). Важно также проверить, что все необходимые залежные свойства (property) указаны в дереве устройств.
Шаги по диагностике и решению
-
Проверка журналов системы:
Используйте командуdmesg
для просмотра системных сообщений. Просмотрите логи на наличие ошибок, связанных с инициализацией устройств или прерываниями. -
Проверка конфигурации устройства:
Изучите конфигурацию в дереве устройств, чтобы убедиться, что все свойства установлены правильно и что все необходимые ссылки на контроллер прерываний актуальны и активны. -
Проверка прерываний:
Исследуйте настройки контроллера прерываний. Убедитесь, что IRQ, указанные для ваших UIO устройств, правильно настроены и не конфликтуют с другими устройствами. -
Тестирование в упрощенной конфигурации:
Если возможно, попробуйте удалить или отключить недавно добавленные устройства и протестируйте систему с меньшим количеством UIO устройств, чтобы проверить, появляется ли проблема. -
Обновление программного обеспечения:
Убедитесь, что используемая вами версия Linux и драйверов соответствуют стабильной и совместимой версии. Иногда проблемы могут быть связаны с ошибками в драйверах, которые были устранены в более поздних версиях.
Заключение
Причины, по которым некоторые устройства UIO могут не отображаться в системе, могут варьироваться от некорректной конфигурации до исчерпания системных ресурсов. Исходя из представленной информации, важно поэтапно диагностировать проблему, проверяя контроль прерываний, параметры устройств в дереве устройств и системные логи. Следуя предложенным шагам, вы сможете быстрее выявить и устранить причину, эффективнее управляя вашими FPGA модулями на платформе Xilinx MPSoC.