Я экспериментирую с потоком 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 для работы вышеуказанного потока?
Лучше, если какой-нибудь фрагмент будет распространен!