Фон
У меня возникла проблема, когда на 32-битном ядре Linux мой драйвер PCIe с несколькими MSI и пользовательским аппаратным устройством будет работать отлично, теперь я перешел на 64-битный процессор iMX8MM, и прерывания MSI больше не срабатывают. Драйвер правильно регистрирует прерывания без каких-либо ошибок, и я могу просмотреть вывод cat /proc/interrupts
и увидеть все векторы MSI, перечисленные для моего драйвера, вместе с их счетчиком прерываний, который равен нулю. Есть мост, но /sys/bus/pci/devices/<address>/msi_bus
имеет 1
, поэтому он включен. Все из lspci -vv
выглядит в порядке и CONFIG_PCI_MSI
было применено к ядру. Я могу читать и записывать буферы памяти на устройстве PCIe, поэтому связь работает правильно, я просто не могу запустить прерывания MSI. Это точно такой же код драйвера, работающий на 32-битном ЦП, который работал и был перекомпилирован на новом 64-битном ЦП.
Вопрос
Как заставить систему прерывать MSI, чтобы увидеть, подхватит ли Linux его и выполнит ли мой код? Из lspci -vv
я вижу адрес MSI и знаю значение вектора MSI для записи. Итак, где я могу написать это в системе? Я просмотрел /dev/mem
и другие области, где я мог бы выполнить echo 0x1 > <address>
или какую-либо другую функцию командной строки, чтобы записать значение и вызвать его. Где и как мне написать, чтобы вызвать определенное прерывание MSI?