2008-04-29 08:00:31 +00:00
|
|
|
DMA attributes
|
|
|
|
==============
|
|
|
|
|
|
|
|
This document describes the semantics of the DMA attributes that are
|
|
|
|
defined in linux/dma-attrs.h.
|
|
|
|
|
|
|
|
DMA_ATTR_WRITE_BARRIER
|
|
|
|
----------------------
|
|
|
|
|
|
|
|
DMA_ATTR_WRITE_BARRIER is a (write) barrier attribute for DMA. DMA
|
|
|
|
to a memory region with the DMA_ATTR_WRITE_BARRIER attribute forces
|
|
|
|
all pending DMA writes to complete, and thus provides a mechanism to
|
|
|
|
strictly order DMA from a device across all intervening busses and
|
|
|
|
bridges. This barrier is not specific to a particular type of
|
|
|
|
interconnect, it applies to the system as a whole, and so its
|
|
|
|
implementation must account for the idiosyncracies of the system all
|
|
|
|
the way from the DMA device to memory.
|
|
|
|
|
|
|
|
As an example of a situation where DMA_ATTR_WRITE_BARRIER would be
|
|
|
|
useful, suppose that a device does a DMA write to indicate that data is
|
|
|
|
ready and available in memory. The DMA of the "completion indication"
|
|
|
|
could race with data DMA. Mapping the memory used for completion
|
|
|
|
indications with DMA_ATTR_WRITE_BARRIER would prevent the race.
|
|
|
|
|
2008-07-18 13:03:34 +00:00
|
|
|
DMA_ATTR_WEAK_ORDERING
|
|
|
|
----------------------
|
|
|
|
|
|
|
|
DMA_ATTR_WEAK_ORDERING specifies that reads and writes to the mapping
|
|
|
|
may be weakly ordered, that is that reads and writes may pass each other.
|
|
|
|
|
|
|
|
Since it is optional for platforms to implement DMA_ATTR_WEAK_ORDERING,
|
|
|
|
those that do not will simply ignore the attribute and exhibit default
|
|
|
|
behavior.
|
2011-12-23 08:30:47 +00:00
|
|
|
|
|
|
|
DMA_ATTR_WRITE_COMBINE
|
|
|
|
----------------------
|
|
|
|
|
|
|
|
DMA_ATTR_WRITE_COMBINE specifies that writes to the mapping may be
|
|
|
|
buffered to improve performance.
|
|
|
|
|
|
|
|
Since it is optional for platforms to implement DMA_ATTR_WRITE_COMBINE,
|
|
|
|
those that do not will simply ignore the attribute and exhibit default
|
|
|
|
behavior.
|
2012-03-28 05:55:56 +00:00
|
|
|
|
|
|
|
DMA_ATTR_NON_CONSISTENT
|
|
|
|
-----------------------
|
|
|
|
|
|
|
|
DMA_ATTR_NON_CONSISTENT lets the platform to choose to return either
|
|
|
|
consistent or non-consistent memory as it sees fit. By using this API,
|
|
|
|
you are guaranteeing to the platform that you have all the correct and
|
|
|
|
necessary sync points for this memory in the driver.
|
2012-05-16 13:20:37 +00:00
|
|
|
|
|
|
|
DMA_ATTR_NO_KERNEL_MAPPING
|
|
|
|
--------------------------
|
|
|
|
|
|
|
|
DMA_ATTR_NO_KERNEL_MAPPING lets the platform to avoid creating a kernel
|
|
|
|
virtual mapping for the allocated buffer. On some architectures creating
|
|
|
|
such mapping is non-trivial task and consumes very limited resources
|
|
|
|
(like kernel virtual address space or dma consistent address space).
|
|
|
|
Buffers allocated with this attribute can be only passed to user space
|
|
|
|
by calling dma_mmap_attrs(). By using this API, you are guaranteeing
|
|
|
|
that you won't dereference the pointer returned by dma_alloc_attr(). You
|
|
|
|
can threat it as a cookie that must be passed to dma_mmap_attrs() and
|
|
|
|
dma_free_attrs(). Make sure that both of these also get this attribute
|
|
|
|
set on each call.
|
|
|
|
|
|
|
|
Since it is optional for platforms to implement
|
|
|
|
DMA_ATTR_NO_KERNEL_MAPPING, those that do not will simply ignore the
|
|
|
|
attribute and exhibit default behavior.
|
2012-10-29 20:08:03 +00:00
|
|
|
|
|
|
|
DMA_ATTR_STRONGLY_ORDERED
|
|
|
|
-------------------------
|
|
|
|
|
|
|
|
DMA_ATTR_STRONGLY_ORDERED allocates memory with a very restrictive type
|
|
|
|
of mapping (no unaligned accesses, no re-ordering, no write merging, no
|
|
|
|
buffering, no pre-fetching). This has severe performance penalties and
|
|
|
|
should not be used for general purpose DMA allocations. It should only
|
|
|
|
be used if one of the restrictions on strongly ordered memory is required.
|