2013-04-19 8 views
7

Sto lavorando su una routine DMA per trasferire dati da PC a FPGA su una scheda PCIe. Ho letto DMA-API.txt e LDD3 ch. 15 per i dettagli. Tuttavia, non sono riuscito a capire come eseguire un trasferimento DMA da PC a un blocco coerente di iomem sulla scheda PCIe. L'esempio del padre per PCI in LDD3 mappa un buffer e quindi indica alla scheda di eseguire il trasferimento DMA, ma ho bisogno del PC per farlo.Driver Linux Trasferimento DMA a una scheda PCIe con PC come master

Quello che ho già scoperto:

  1. Richiesta bus master

    pci_set_master(pdev); 
    
  2. Impostare il DMA maschera

    if (dma_set_mask(&(pdev->dev), DMA_BIT_MASK(32))) { 
        dev_err(&pdev->dev,"No suitable DMA available.\n"); 
        goto cleanup; 
    } 
    
  3. Richiedere un canale DMA

    if (request_dma(dmachannel, DRIVER_NAME)) { 
        dev_err(&pdev->dev,"Could not reserve DMA channel %d.\n", dmachannel); 
        goto cleanup; 
    } 
    
  4. Mappa un buffer per il trasferimento DMA

    dma_handle = pci_map_single(pci_dev, buffer, count, DMA_TO_DEVICE); 
    

Domanda:

Cosa devo fare per lasciare che il PC eseguire il trasferimento DMA anziché il carta?

Grazie per il vostro aiuto!


Prima di tutto grazie per le risposte. Forse dovrei porre le mie domande in modo più preciso:

  1. A mio parere, il PC deve disporre di un controller DMA. Come accedere a questo controller DMA per avviare un trasferimento in una regione IO mappata in memoria nella scheda PCIe?
  2. La nostra specifica richiede che il controller DMA del PC avvii il trasferimento. Tuttavia, ho potuto trovare solo esempi in cui il dispositivo avrebbe eseguito il lavoro DMA (DMA_mapping.txt, LDD3 ch.15). C'è una ragione, perché nessuno usa il controller DMA del PC (ha comunque canali DMA)? Sarebbe meglio richiedere una modifica delle specifiche per il nostro progetto?

Grazie per la vostra pazienza.

+1

* "trasferimento dati da PC" * ha significato per periferiche esterne, ad es. "da PC a una stampante". Per i trasferimenti interni non ha senso. Probabilmente vuoi dire ** memoria principale **. * "lasciare che il PC esegua il trasferimento DMA" * non ha alcun senso. Probabilmente intendi il ** controller DMA **. Risposta: imposta il DMAC invece del master del bus PCI. – sawdust

risposta

4

Cercare DMA_mapping.txt.C'è una lunga sezione in là che ti spiega come impostare la direzione ('Direzione DMA', linea 408).

EDIT

Ok, dal momento che hai modificato la tua domanda ... la vostra specifica è sbagliata. È possibile configurare il controller DMA del sistema, ma sarebbe inutile, perché è troppo lento, come ho detto nei commenti. Leggi this thread.

È necessario modificare l'FPGA per supportare il bus mastering. Lo faccio per vivere - contattami off-thread se vuoi subappaltare.

+0

Sì, l'ho letto. Il codice indica come configurare un buffer per il trasferimento DMA. Lo stesso costrutto (pci_map/pci_unmap) è usato in LDD3 ch. 15, ma ci sono anche istruzioni per attivare il controller DMA sulla scheda PCI. Quindi suppongo che questo contrassegni solo il buffer come "pronto DMA" e che il dispositivo passi al trasferimento DMA. La direzione indica solo che il controller DMA dovrebbe leggere o scrivere il buffer (o entrambi). Non mi dice (o almeno non l'ho capito) come attivare il controller DMA per PC. – kohpe

+1

Non si "attiva il controller DMA del PC". Esistono due modi per eseguire DMA su PCIe: (1) DMA "sistema" e (2) DMA "Master bus". (1) è storia; non è un'opzione. Il controller DMA "sistema" è ancora sul PC, ma è nel posto sbagliato ed è troppo lento. L'FPGA deve invece diventare un bus master e scoppiare i dati richiesti dentro o fuori. Quindi, imposta la direzione DMA come in 'DMA_mapping.txt', e poi scrivi su un registro sulla tua scheda per avviare una lettura master del bus master (PC out su FPGA). Controlla le note dell'app del fornitore FPGA; inizia con XAPP1052. Si noti inoltre che LDD3 è piuttosto inutile. – EML

+0

Spazio insufficiente sopra ... chi ha codificato il tuo FPGA? Comprendono l'operazione del bus master? Avete un bit di controllo per abilitare il bus master? In caso contrario, il tuo FPGA * non può * "DMA" in entrambe le direzioni. – EML

1

Quello di cui stai parlando non è un DMA. Il DMA è quando il dispositivo accede alla memoria e la CPU stessa non è coinvolta (con l'eccezione del controller di memoria del PC, che di solito è incorporato nella CPU del PC in questi giorni). Non tutti i dispositivi possono farlo e, se si utilizza FPGA, è sicuramente necessario un controller DMA nella progettazione (ad esempio Expresso DMA Core o simile). Nel tuo caso, devi solo scrivere nella regione di memoria mappata (ad esempio quella che ottieni con ioremap_nocache) utilizzando le chiamate iowrite (ad esempio iowrite32) seguita da scrittura di memorie wmb(). La barra I/O e l'indirizzo da scrivere dipende interamente dal dispositivo.

Spero che aiuti. In bocca al lupo!

+2

* "Quello di cui stai parlando non è in realtà un DMA" * ... * "quindi hai sicuramente bisogno di una sorta di controller DMA nel tuo progetto" * - ti sembra di fare riferimento a una scheda (PCI/PCIe) che esegue ** masterizzazione bus **. Un dispositivo periferico (progettato con i segnali di controllo/handshake DMA aggiuntivi) può utilizzare DMA (anziché I/O programmato) utilizzando il controller DMA del sistema (incluso nella progettazione PC IBM). – sawdust

+0

@sawdust sì, hai ragione, il bus mastering lo è. A volte sono molto cattivo con la simbologia corretta. Non penso che i PC commodity di oggi abbiano quei controller DMA o no? –

+0

I PC devono avere un DMAC per essere "compatibile con IBM PC". Un controller DMA non è così costoso. Se è possibile inserire un processore con clock> 350 volte più veloce dell'originale i8088 (e includere un coprocessore numerico) e avere più di 1000 volte più memoria, allora un DMAC è accessibile in un * "commodity PC" *. – sawdust

Problemi correlati