Отображение выделенной памяти dmam_alloc_coherent в пространство пользователя через remap_pfn_range дает указатель на неправильную область памяти - PullRequest
0 голосов
/ 01 января 2019

Я готовлю приложение, работающее на ARM Intel Cyclone V SoC.Мне нужно сопоставить буфер когерентной памяти DMA с пользовательским пространством.Буфер выделяется в драйвере устройства с помощью:

buf_addr = dmam_alloc_coherent(&pdev->dev, size, &dma_addr, GFP_KERNEL);

Отображение сделано правильно, и я убедился, что буфер, к которому аппаратный доступ обращается через HW-адрес dma_addr, виден для ядра через указатель buf_addr.

Затем в функции mmap драйвера устройства я делаю:

unsigned long physical = virt_to_phys(buf_addr);
unsigned long vsize = vma->vm_end - vma->vm_start;
vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
remap_pfn_range(vma,vma->vm_start, physical >> PAGE_SHIFT , vsize, vma->vm_page_prot);

Приложение mmaps буфер с:

buf = mmap(NULL,buf_size,PROT_READ | PROT_WRITE, dev_file, MAP_SHARED);

Я не получаю никакой ошибкииз функции remap_pfn_range.Также приложение может получить доступ к mmapped памяти, но это не буфер, выделенный с помощью dmam_alloc_coherent .

1 Ответ

0 голосов
/ 01 января 2019

Я нашел макрос dma_mmap_coherent , который, кажется, специально предназначен для этой цели.Я проверил, что следующая модификация в функции mmap обеспечивает правильную работу:

unsigned long vsize = vma->vm_end - vma->vm_start;
vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
remap=dma_mmap_coherent(&my_pdev->dev,vma,fdata, dma_addr, vsize);

Поскольку указатель pdev не доставляется напрямую в функцию mmap, он передается из функции probe через глобальную переменную my_pdev.Если драйвер поддерживает несколько устройств, его следует сохранить в контексте устройства.

...