2015-09-01 15 views
8

Ho un FPGA (come la maggior parte delle persone che fanno questa domanda) che viene configurato dopo che il mio kernel Linux esegue la scansione e l'enumerazione del bus PCIe iniziale. Come puoi immaginare, l'FPGA implementa un endpoint PCIe.Come fare un vero scancan del bus PCIe

Mi piacerebbe avere il core PCIe ri-enumerare il BUS INTERO PCIe in modo che il mio FPGA verrà poi visualizzato e posso caricare il mio modulo del driver. Mi piacerebbe anche la possibilità di SWAP il carico FPGA per una configurazione diversa. Con questo voglio dire mi piacerebbe essere in grado di:

  1. boot Linux
  2. Configurazione FPGA
  3. Enumerare PCIe endpoint e il carico del modulo
  4. Rimuovere PCIe endpoint
  5. Re-configurare FPGA
  6. Rienumerazione dell'endpoint PCIe

Tutto senza riavvio di Linux

Qui ci sono soluzioni che sono state proposte altrove ma non risolvono il problema.

echo 1 > /sys/bus/pci/rescan Questo sembra funzionare (solo qualche volta) e non funziona se voglio eseguire il hotswap del carico FPGA dopo che è stato enumerato per primo.

Ecco un metodo abbastanza invasivo (che non ho testato) che qualcuno ha proposto anche altrove. https://community.freescale.com/thread/305355

È possibile utilizzare le strutture di alimentazione hotplug/power di PCIe per fare in modo che funzioni? In tal caso, ci sono buone risorse su come usare il sistema Hotplug con PCIe? (LDD non lo copre abbastanza completamente)

+0

Guardare il meccanismo hotplug PCIe. È supportato nei kernel più recenti. In realtà, secondo te, Thunderbolt funzionerà? È lo stesso qui. – 0andriy

+0

Stai eseguendo 'rescan' sulla macchina host o all'interno di una Xen VM? Xen ha avuto problemi a rieseguire la scansione dell'albero PCIe e si è schiantato in passato. Non so se è risolto. – Paebbels

+0

Mi chiedo quale hardware di base stai usando. Nella mia esperienza con le schede madri di tipo commerciale, il metodo 'rescan' funzionava raramente. Sono andato alla rotta di riconfigurazione parziale per risolvere il problema (non rienumerando). @Paebbels @ whh4000 puoi condividere il tuo setup? – Claudio

risposta

8

Il rienumerazione del bus/albero PCIe tramite echo 1 > /sys/bus/pci/rescan è la soluzione corretta. Lo stiamo usando nello stesso modo in cui lo hai descritto.

Stiamo utilizzando echo 1 > $pcidevice/remove per disconnettere il driver dal dispositivo e per staccare il dispositivo dall'albero. Il driver (xillybus) non è scaricato, solo disconnesso.

Una soluzione migliore è quella di eseguire nuovamente la scansione del nodo su cui è collegato il vostro FPGA. Ciò riduce l'impatto complessivo sul sistema.

Questa tecnica è utilizzata nel sistema cloud FPGA RC3E.