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:
Richiesta bus master
pci_set_master(pdev);
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; }
Richiedere un canale DMA
if (request_dma(dmachannel, DRIVER_NAME)) { dev_err(&pdev->dev,"Could not reserve DMA channel %d.\n", dmachannel); goto cleanup; }
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:
- 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?
- 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.
* "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