2016-09-18 6 views
1

BAR0과 함께 1GB 메모리를 제공하는 PCIe 보드에서 사용자가 메모리에 액세스하려고합니다. 현재 8 바이트 PCIe Gen3에서 매우 느립니다 (1MB/s 읽기 및 16MB/s 쓰기) 문자 디바이스 드라이버의 읽기 및 쓰기 기능 만 사용합니다. PCI BAR 메모리를 MMAP 할 수 있습니까?

static ssize_t 
MPD_read(
    struct file *filp, 
    char *buffer, 
    size_t bufferSize, 
    loff_t *offset) 
{ 
    unsigned long unusedBytes = copy_to_user(
     (void *) buffer, 
     MPD_AdapterBoard.bars[ 0 ].barHWAddress, 
     bufferSize); 
    return 0; 
} 

static ssize_t 
MPD_write(
    struct file *filp, 
    const char *buffer, 
    size_t bufferSize, 
    loff_t *offset) 
{ 
    unsigned long unusedBytes = copy_from_user(
     MPD_AdapterBoard.bars[ 0 ].barHWAddress, 
     (void *) buffer, 
     bufferSize); 
    return 0; 
} 

는 더 속도를 얻을합니다 (.mmap 파일 작업 사용) MMAP를 사용할 수 있습니까? DMA가 유일한 옵션입니까?

미리 감사드립니다.

/Jesko

답변

0

나는 그것이 작동하고 어떻게 발견 :

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; 
} 

주의 :이 진행중인 작업이기 때문에, 에러 체크가 상당히 제한됩니다.

여기에서 누군가를 도울 희망이 있으시면 여기에서 테스트 프로그램을 포함하여 전체 코드를 다운로드 할 수 있습니다. https://github.com/jesko42/minipci