2016-09-18 2 views
1

Ich möchte Zugriffsspeicher von einer PCIe-Karte, die einen 1 GB Speicher mit BAR0 bietet. Derzeit verwende ich nur Lese- und Schreibfunktionen meines Zeichengerätetreibers, der sehr langsam ist (1 MB/s Lesen und 16 MB/s Schreiben) auf einem 8x PCIe Gen3.Ist es möglich, einen PCI-BAR-Speicher zu MMAPIEREN?

Ist es möglich, das MMAP (mit der .mmap Dateioperation) zu verwenden, um mehr Geschwindigkeit zu erhalten? Oder ist DMA die einzige Option?

Vielen Dank im Voraus!

/Jesko

Antwort

0

Ich fand heraus, wie es funktioniert:

static int 
    MPD_mmap(
    struct file *filp, 
    struct vm_area_struct *vma) 
{ 
    unsigned long offset; 

    offset = vma->vm_pgoff << PAGE_SHIFT; 
    if ((offset + (vma->vm_end - vma->vm_start)) > MPD_AdapterBoard.bars[ 0 ].barSizeInBytes) 
    { 
     return -EINVAL; 
    } 

    offset += (unsigned long) MPD_AdapterBoard.bars[ 0 ].mmioStart; 

    vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); 

    if (io_remap_pfn_range(vma, vma->vm_start, offset >> PAGE_SHIFT, vma->vm_end - vma->vm_start, vma->vm_page_prot)) 
    { 
     return -EAGAIN; 
    } 
    return 0; 
} 

Achtung: Dies ist in Arbeit, so die Fehlerprüfung ist ziemlich begrenzt.

In der Hoffnung, hier jemand zu helfen, kann der vollständige Code einschließlich eines Testprogramms von hier heruntergeladen werden: https://github.com/jesko42/minipci

Verwandte Themen