Во-первых, я не уверен, что это лучшее место для того, чтобы задать этот вопрос, поэтому извиняюсь, если это не так, но, учитывая его довольно нишевый вопрос, я не знаю, есть ли где-нибудь действительно подходящее, чтобы задать его.
Небольшой фон. В течение последнего года я занимался разработкой системы обработки изображений FPGA для исследовательского проекта университета, который подключается через PCIe Gen3. Я создаю драйвер, используя KMDF (каркас драйвера Windows), который включает MSI для устройства (в файле inf) и отлично работает на одном компьютере.
Недавно я перешел на новую материнскую плату (Asus P9X79-E WS), поскольку планируется иметь несколько карт, и эта материнская плата имеет лучшее расположение слотов PCIe благодаря встроенным коммутаторам PEX8747. FPGA и драйвер работают нормально в одном слоте (при правильном получении прерываний MSI), однако, если я помещу карту в другой слот, который находится за любым из двух переключателей PEX8747, я больше не получаю прерывания MSI.
Из пространства конфигурации видно, что в FPGA правильно сконфигурировано пространство конфигурации MSI (запрошено и выделено 8 векторов, MSI включен, устаревшие прерывания отключены, а адрес не равен нулю). Однако ISR в драйвере никогда не срабатывает.
Я попытался отключить MSI и вернуться к использованию одного устаревшего прерывания и иметь регистр флага, который драйвер считывает, чтобы определить правильный источник. Это работает нормально даже за коммутатором, но процесс не такой быстрый, поэтому я бы предпочел использовать MSI.
Я полагаю, что тогда возникает вопрос, есть ли что-то в PCIe-коммутаторах (в частности, в PEX8747), которое препятствует работе прерываний сигналов сообщений? Есть ли конфигурация, необходимая для работы коммутаторов?