Ошибка записи в DMA, когда dma_alloc_coherent заменяется на dma_map_single - PullRequest
0 голосов
/ 21 ноября 2018

Я экспериментирую с потоком DMA с SMMU и без него на ARM.Наше пользовательское приложение требует адрес ядра, физический адрес и адрес шины.

С включенным SMMU мне удалось получить адрес ядра и адрес шины, используя dma_alloc_coherent(), но я не смог получить физический адрес через virt_to_phys(),Это заставило меня заменить dma_alloc_coherent() на dma_map_single следующим образом:

// Get kernel address
res->KernelAddress = (u64)kzalloc( size , GFP_KERNEL | GFP_DMA);

// Get bus address
res->BusAddress = (u64)dma_map_single(&DevExt->pdev->dev, &res->KernelAddress, size, PCI_DMA_BIDIRECTIONAL);

// Get physical address
res->PhysicalAddress = (u64)virt_to_phys( (void*)res->KernelAddress );

dma_sync_single_for_cpu(&DevExt->pdev->dev, res->BusAddress, size, PCI_DMA_BIDIRECTIONAL);

// Map physical address to virtual address in user space
if (remap_pfn_range(vma, vma->kern_addr, vma->phys_addr,size,vma->vm_page_prot));

Не было проблем с вышеуказанным потоком.Мне удалось получить 3 адреса, но запись DMA в возвращенное местоположение не удалась.Требуются ли другие API DMA для работы вышеуказанного потока?

Лучше, если какой-нибудь фрагмент будет распространен!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...