DDI_DMA_ATTR(9S)         Data Structures for Drivers        DDI_DMA_ATTR(9S)
NAME
       ddi_dma_attr - DMA attributes structure
SYNOPSIS
       #include <sys/ddidmareq.h>
INTERFACE LEVEL
       illumos DDI specific (illumos DDI)
DESCRIPTION
       A 
ddi_dma_attr_t structure describes device- and 
DMA engine-specific
       attributes necessary to allocate 
DMA resources for a device. The
       driver might have to extend the attributes with bus-specific
       information, depending on the bus to which the device is connected.
STRUCTURE MEMBERS
         uint_t      dma_attr_version;      /* version number */
         uint64_t    dma_attr_addr_lo;      /* low DMA address range */
         uint64_t    dma_attr_addr_hi;      /* high DMA address range */
         uint64_t    dma_attr_count_max;    /* DMA counter register */
         uint64_t    dma_attr_align;        /* DMA address alignment */
         uint_t      dma_attr_burstsizes;   /* DMA burstsizes */
         uint32_t    dma_attr_minxfer;      /* min effective DMA size */
         uint64_t    dma_attr_maxxfer;      /* max DMA xfer size */
         uint64_t    dma_attr_seg;          /* segment boundary */
         int         dma_attr_sgllen;       /* s/g list length */
         uint32_t    dma_attr_granular;     /* granularity of device */
         uint_t      dma_attr_flags;        /* DMA transfer flags */
       The 
dma_attr_version stores the version number of this 
DMA attribute
       structure. It should be set to 
DMA_ATTR_V0.
       The 
dma_attr_addr_lo and 
dma_attr_addr_hi fields specify the address
       range the device's 
DMA engine can access. The 
dma_attr_addr_lo field
       describes the inclusive lower 64-bit boundary. The 
dma_attr_addr_hi       describes the inclusive upper 64-bit boundary. The system ensures
       that allocated 
DMA resources are within the range specified. See       
ddi_dma_cookie(9S).
       The 
dma_attr_count_max describes an inclusive upper bound for the
       device's 
DMA counter register. For example, 
0xFFFFFF would describe a       
DMA engine with a 24-bit counter register. 
DMA resource allocation
       functions have to break up a 
DMA object into multiple 
DMA cookies if
       the size of the object exceeds the size of the 
DMA counter register.
       The 
dma_attr_align specifies alignment requirements for allocated 
DMA       resources. This field can be used to force more restrictive alignment
       than imposed by 
dma_attr_burstsizes or 
dma_attr_minxfer, such as
       alignment at a page boundary. Most drivers set this field to 1,
       indicating byte alignment.
       The 
dma_attr_align only specifies alignment requirements for
       allocated 
DMA resources. The buffer passed to       
ddi_dma_addr_bind_handle(9F) or 
ddi_dma_buf_bind_handle(9F) must have
       an equally restrictive alignment (see 
ddi_dma_mem_alloc(9F)).
       The 
dma_attr_burstsizes field describes the possible burst sizes the       
DMA engine of a device can accept. The format of the data sizes is
       binary, encoded in terms of powers of two. When 
DMA resources are
       allocated, the system can modify the 
burstsizes value to reflect the
       system limits. The driver must use the allowable 
burstsizes to
       program the 
DMA engine. See 
ddi_dma_burstsizes(9F).
       The 
dma_attr_minxfer field describes the minimum effective 
DMA access
       size in units of bytes. 
DMA resources can be modified, depending on
       the presence and use of 
I/O caches and write buffers between the 
DMA       engine and the memory object. This field is used to determine
       alignment and padding requirements for 
ddi_dma_mem_alloc(9F).
       The 
dma_attr_maxxfer field describes the maximum effective 
DMA access
       size in units of bytes.
       The 
dma_attr_seg field specifies segment boundary restrictions for
       allocated 
DMA resources. The system allocates 
DMA resources for the
       device so that the object does not span the segment boundary
       specified by 
dma_attr_seg. For example, a value of 
0xFFFF means 
DMA       resources must not cross a 64-Kbyte boundary. 
DMA resource allocation
       functions might have to break up a 
DMA object into multiple 
DMA       cookies to enforce segment boundary restrictions. In this case, the
       transfer must be performed using scatter-gather 
I/O or multiple 
DMA       windows.
       The 
dma_attr_sgllen field describes the length of the 
DMA       scatter/gather list of a device. Possible values are as follows:       
< 0              Device 
DMA engine is not constrained by the size, for example,
              with 
DMA chaining.       
= 0              Reserved.       
= 1              Device 
DMA engine does not support scatter/gather such as
              third party 
DMA.       
> 1              Device 
DMA engine uses scatter/gather. The 
dma_attr_sgllen              value is the maximum number of entries in the list.
       The 
dma_attr_granular field describes the granularity of the device
       transfer size in units of bytes. When the system allocates 
DMA       resources, the size of a single segment is a multiple of the device
       granularity. If 
dma_attr_sgllen is larger than 
1 within a window, the
       sum of the sizes for a subgroup of segments is a multiple of the
       device granularity.
       All driver requests for 
DMA resources must be a multiple of the
       granularity of the device transfer size.
       The 
dma_attr_flags field can be set to a combination of:       
DDI_DMA_FORCE_PHYSICAL           Some platforms, such as SPARC systems, support what is called
           Direct Virtual Memory Access (
DVMA). On these platforms, the
           device is provided with a virtual address by the system in order
           to perform the transfer. In this case, the underlying platform
           provides an 
IOMMU, which translates accesses to these virtual
           addresses into the proper physical addresses. Some of these
           platforms also support 
DMA. DDI_DMA_FORCE_PHYSICAL indicates that
           the system should return physical rather than virtual 
I/O           addresses if the system supports both. If the system does not
           support physical 
DMA, the return value from           
ddi_dma_alloc_handle(9F) is 
DDI_DMA_BADATTR. In this case, the
           driver has to clear 
DDI_DMA_FORCE_PHYSICAL and retry the
           operation.       
DDI_DMA_FLAGERR           Using this value indicates that the driver is hardened: able to
           cope with the incorrect results of 
DMA operations that might
           result from an 
I/O fault. The value also indicates that the
           driver will use 
ddi_fm_dma_err_get(9F) to check 
DMA handles for
           faults on a regular basis.
           If a 
DMA error is detected during a 
DMA access to an area mapped
           by such a handle, the system should not panic if possible, but
           should instead mark the 
DMA handle as having faulted.
           This value is advisory: it tells the system that the driver can
           continue in the face of 
I/O faults. It does not guarantee that
           the system will not panic, as that depends on the nature of the
           fault and the capabilities of the system.  It is quite legitimate
           for an implementation to ignore this flag and panic anyway.       
DDI_DMA_RELAXED_ORDERING           This optional flag can be set if the 
DMA transactions associated
           with this handle are not required to observe strong 
DMA write
           ordering among themselves, nor with 
DMA write transactions of
           other handles.
           The flag allows the host bridge to transfer data to and from
           memory more efficiently and might result in better 
DMA           performance on some platforms.
           Drivers for devices with hardware support, such as marking the
           bus transactions relaxed ordered, should not use this flag. Such
           drivers should use the hardware capability instead.
EXAMPLES
       Example 1: Initializing the ddi_dma_attr_t Structure
       Assume a device has the following 
DMA characteristics:
           o      Full 32-bit range addressable
           o      24-bit DMA counter register
           o      Byte alignment
           o      4- and 8-byte burst sizes support
           o      Minimum effective transfer size of 1 bytes
           o      64 Mbyte minus 1 (26-bit) maximum transfer size limit
           o      Maximum segment size of 32 Kbyte
           o      17 scatter/gather list elements
           o      512-byte device transfer size granularity
       The corresponding 
ddi_dma_attr_t structure is initialized as follows:
         static ddi_dma_attr_t dma_attrs = {
                  DMA_ATTR_V0              /* version number */
                  (uint64_t)0x0,           /* low address */
                  (uint64_t)0xffffffff,    /* high address */
                  (uint64_t)0xffffff,      /* DMA counter max */
                  (uint64_t)0x1            /* alignment */
                  0x0c,                    /* burst sizes */
                  0x1,                     /* minimum transfer size */
                  (uint64_t)0x3ffffff,     /* maximum transfer size */
                  (uint64_t)0x7fff,        /* maximum segment size */
                  17,                      /* scatter/gather list lgth */
                  512                      /* granularity */
                  0                        /* DMA flags */
         };
ATTRIBUTES
       See 
attributes(7) for descriptions of the following attributes:
       +--------------------+-----------------+
       |  ATTRIBUTE TYPE    | ATTRIBUTE VALUE |
       +--------------------+-----------------+
       |Interface Stability | Committed       |
       +--------------------+-----------------+
SEE ALSO
       attributes(7), 
ddi_dma_addr_bind_handle(9F),       
ddi_dma_alloc_handle(9F), 
ddi_dma_buf_bind_handle(9F),       
ddi_dma_burstsizes(9F), 
ddi_dma_mem_alloc(9F),       
ddi_dma_nextcookie(9F), 
ddi_fm_dma_err_get(9F), 
ddi_dma_cookie(9S)       Writing Device Drivers                             September 12, 2020             DDI_DMA_ATTR(9S)