PCIe Interrompe o interruptor beind PLX

1
Em primeiro lugar, eu não tenho certeza se este é o melhor lugar para fazer esta pergunta, então peço desculpas se não for, mas dada a sua questão de nicho, eu não sei se existe algum lugar realmente adequado para perguntar isso.

Um pouco rápido de fundo. Durante o ano passado, tenho desenvolvido um sistema de imagens FPGA para um projeto de pesquisa universitária que se conecta via PCIe Gen3. Eu construo um driver usando o KMDF (a estrutura do driver do Windows) que habilita o MSI para o dispositivo (no arquivo inf) e está funcionando bem em um computador.

Eu recentemente mudei para uma nova placa-mãe (Asus P9X79-E WS) já que o plano é ter várias placas e esta placa-mãe tem um melhor arranjo de slots PCIe graças aos switches PEX8747 onboard. O FPGA e o driver funcionam bem em um slot (recebendo interrupções MSI corretamente), no entanto, se eu colocar a placa em um slot diferente, um que esteja atrás de um dos dois switches PEX8747, não receberei mais interrupções MSI.

Eu posso ver no espaço de configuração que o FPGA tem seu espaço de configuração MSI sendo corretamente configurado (8 vetores solicitados e alocados, MSI habilitado, interrupções legadas desabilitadas e o endereço é diferente de zero). No entanto, o ISR no driver nunca é acionado.

Eu tentei desativar o MSI e voltar a usar uma interrupção herdada e ter um registro de sinalizador que o driver lê para descobrir a fonte correta. Isso está funcionando bem mesmo atrás do switch, mas o processo não é tão rápido, então eu prefiro estar usando o MSI.

Suponho que, em seguida, a pergunta é: há algo sobre os Comutadores PCIe (especificamente o PEX8747) que impede que as Interrupções de Sinal de Mensagem funcionem? Existe configuração necessária para que os comutadores funcionem?

    
por Tom Carpenter 17.01.2015 / 13:08

1 resposta

0
Bem, como acontece depois de um pouco de experimentação, os switches PLX parecem não transferir solicitações MSI (e provavelmente também postaram gravações dadas à MSI usa essas requisições) com uma classe de tráfego diferente de zero. Ao definir a classe de tráfego do meu gerador de interrupções, consegui que funcionasse.

Espero que isso possa ser útil para qualquer pessoa que esteja navegando no Google com o mesmo problema.

    
por 21.01.2015 / 01:14