ddi_dma_sync(9F)
NAME
ddi_dma_sync - synchronize CPU and I/O views of memory
SYNOPSIS
#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);
INTERFACE LEVEL
Solaris DDI specific (Solaris DDI).
PARAMETERS
handle
The handle filled in by a call to
ddi_dma_alloc_handle(9F).
offset
The offset into the object described by the handle.
length
The length, in bytes, of the area to synchronize. When
length is zero, the entire range starting from offset
to the end of the object has the requested operation
applied to it.
type Indicates the caller's desire about what view of the
memory object to synchronize. The possible values are
DDI_DMA_SYNC_FORDEV, DDI_DMA_SYNC_FORCPU and
DDI_DMA_SYNC_FORKERNEL.
DESCRIPTION
ddi_dma_sync() is used to selectively synchronize either a
DMA device's or a CPU's view of a memory object that has DMA
resources allocated for I/O . This may involve operations
such as flushes of CPU or I/O caches, as well as other more
complex operations such as stalling until hardware write
buffers have drained.
This function need only be called under certain cir-
cumstances. 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
didnot 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)).
This cannot be stated too strongly. 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.
RETURN VALUES
ddi_dma_sync() returns:
DDI_SUCCESS
Caches are successfully flushed.
DDI_FAILURE
The address range to be flushed is out of the address
range established by ddi_dma_addr_bind_handle(9F) or
ddi_dma_buf_bind_handle(9F).
CONTEXT
ddi_dma_sync() can be called from user or interrupt context.
SEE ALSO
ddi_dma_addr_bind_handle(9F), ddi_dma_alloc_handle(9F),
ddi_dma_buf_bind_handle(9F), ddi_dma_mem_alloc(9F),
ddi_dma_unbind_handle(9F)
Writing Device Drivers
Man(1) output converted with
man2html