According to the user guide, the Descriptor Base cannot be changed until all descriptor entries are exhausted. I have descriptor memory allocated and managed by host application. The application flushes DMA descriptors with dummy DMA transfers before it exits. However, in the case where the application crashed or terminated forcefully (Ctrl-C), it does not flush the DMA. Upon re-start of application, descriptor memory from previous run no longer available. Since not all descriptor entries were used, and I cannot update Descriptor Base without exhausting the entries, the DMA controller is stuck in deadlock. PC reboot solves the problem, but it is an annoying non-solution. I do not find a way to reset only DMA controller alone from the manual. How should I solve the issue?
Currently, there is no method available to change the descriptor base for Arria 10 PCIe internal DMA controller until all descriptor entries are exhausted.
There is no way to reset the DMA controller alone.
Because the DMA Descriptor Controller uses FIFOs to store descriptor table entries, you cannot
reprogram the DMA Descriptor Controller once it begins the transfers specifed in the descriptor
Hence, if your application crashes, currently the only solution is to reboot PC.
Imagine that the device is installed in a server. It is likely that a user application could be terminated anytime. It is fair expectation that server is not allowed to reboot. What is your recommendation to workaround the issue?
For now, this is the limitation of the DMA descriptor controller offered with Arria 10. The workaround we can recommend is to get host to reset the link whenever a user application is terminated.