|DDI_DMA_SYNC(9F)||Kernel Functions for Drivers||DDI_DMA_SYNC(9F)|
#include <sys/ddi.h> #include <sys/sunddi.h> int ddi_dma_sync(ddi_dma_handle_t handle, off_t offset, size_t length, uint_t type);
This function need only be called under certain circumstances. When resources are allocated for DMA using ddi_dma_addr_bind_handle() or ddi_dma_buf_bind_handle(), an implicit ddi_dma_sync() is done. When DMA resources are deallocated using ddi_dma_unbind_handle(9F), an implicit ddi_dma_sync() is done. However, at any time between DMA resource allocation and deallocation, if the memory object has been modified by either the DMA device or a CPU and you wish to ensure that the change is noticed by the party that did not do the modifying, a call to ddi_dma_sync() is required. This is true independent of any attributes of the memory object including, but not limited to, whether or not the memory was allocated for consistent mode I/O (see ddi_dma_mem_alloc(9F)) or whether or not DMA resources have been allocated for consistent mode I/O (see ddi_dma_addr_bind_handle(9F) or ddi_dma_buf_bind_handle(9F)).
If a consistent view of the memory object must be ensured between the time DMA resources are allocated for the object and the time they are deallocated, you must call ddi_dma_sync() to ensure that either a CPU or a DMA device has such a consistent view.
What to set type to depends on the view you are trying to ensure consistency for. If the memory object is modified by a CPU, and the object is going to be read by the DMA engine of the device, use DDI_DMA_SYNC_FORDEV. This ensures that the device's DMA engine sees any changes that a CPU has made to the memory object. If the DMA engine for the device has written to the memory object, and you are going to read (with a CPU) the object (using an extant virtual address mapping that you have to the memory object), use DDI_DMA_SYNC_FORCPU. This ensures that a CPU's view of the memory object includes any changes made to the object by the device's DMA engine. If you are only interested in the kernel's view (kernel-space part of the CPU's view) you may use DDI_DMA_SYNC_FORKERNEL. This gives a hint to the system—that is, if it is more economical to synchronize the kernel's view only, then do so; otherwise, synchronize for CPU.
Writing Device Drivers
|January 16, 2006||OmniOS|