DDI_DMA_BUF_BIND_HANDLE(9F) | Kernel Functions for Drivers | DDI_DMA_BUF_BIND_HANDLE(9F) |
ddi_dma_buf_bind_handle - binds a system buffer to a DMA handle
#include <sys/ddi.h> #include <sys/sunddi.h> int ddi_dma_buf_bind_handle(ddi_dma_handle_t handle, struct buf *bp,
uint_t flags, int (*callback)(caddr_t), caddr_t
arg, ddi_dma_cookie_t *cookiep, uint_t *ccountp);
illumos DDI specific (illumos DDI).
handle
bp
flags
DDI_DMA_WRITE
DDI_DMA_READ
DDI_DMA_RDWR
DDI_DMA_REDZONE
DDI_DMA_PARTIAL
DDI_DMA_CONSISTENT
DDI_DMA_STREAMING
callback
DDI_DMA_SLEEP
DDI_DMA_DONTWAIT
arg
cookiep
ccountp
ddi_dma_buf_bind_handle() allocates DMA resources for a system buffer such that a device can perform DMA to or from the buffer. DMA resources are allocated considering the device's DMA attributes as expressed by ddi_dma_attr(9S) (see ddi_dma_alloc_handle(9F)).
ddi_dma_buf_bind_handle() allocates and associates a number of DMA cookies with handle. To get the total number of cookies, callers should use the ddi_dma_ncookies(9F) function. To get all of the cookies, callers should use the ddi_dma_cookie_iter(9F) or ddi_dma_cookie_get(9F) functions. Callers should pass NULL for cookiep and ccountp. These values are required if using the deprecated ddi_dma_nextcookie(9F) interface, in which case cookiep is filled in with the first ddi_dma_cookie(9S) structure.
When a DMA transfer completes, the driver should free up system DMA resources by calling ddi_dma_unbind_handle(9F).
The flags argument contains information for mapping routines.
DDI_DMA_WRITE, DDI_DMA_READ, DDI_DMA_RDWR
DDI_DMA_STREAMING
DDI_DMA_CONSISTENT
DDI_DMA_REDZONE
DDI_DMA_PARTIAL
The callback function, callback, indicates how a caller wants to handle the possibility of resources not being available. If callback is set to DDI_DMA_DONTWAIT, the caller does not care if the allocation fails, and can handle an allocation failure appropriately. If callback is set to DDI_DMA_SLEEP, the caller wishes to have the allocation routines wait for resources to become available. If any other value is set, and a DMA resource allocation fails, this value is assumed to be the address of a function to call at a later time when resources may become available. When the specified function is called, it is passed arg as an argument. The specified callback function must return either DDI_DMA_CALLBACK_RUNOUT or DDI_DMA_CALLBACK_DONE. DDI_DMA_CALLBACK_RUNOUT indicates that the callback function attempted to allocate DMA resources but failed to do so. In this case the callback function is put back on a list to be called again later. DDI_DMA_CALLBACK_DONE indicates either a successful allocation of DMA resources or that the driver no longer wishes to retry.
The callback function is called in interrupt context. Therefore, only system functions accessible from interrupt context are be available. The callback function must take whatever steps necessary to protect its critical resources, data structures, queues, etc.
ddi_dma_buf_bind_handle() returns:
DDI_DMA_MAPPED
DDI_DMA_PARTIAL_MAP
DDI_DMA_INUSE
DDI_DMA_NORESOURCES
DDI_DMA_NOMAPPING
DDI_DMA_TOOBIG
ddi_dma_buf_bind_handle() can be called from user, kernel, or interrupt context, except when callback is set to DDI_DMA_SLEEP, in which case it can be called from user or kernel context only.
ddi_dma_addr_bind_handle(9F), ddi_dma_alloc_handle(9F), ddi_dma_cookie_get(9F), ddi_dma_cookie_iter(9F), ddi_dma_free_handle(9F), ddi_dma_getwin(9F), ddi_dma_ncookies(9F), ddi_dma_sync(9F), ddi_dma_unbind_handle(9F), buf(9S), ddi_dma_attr(9S), ddi_dma_cookie(9S)
Writing Device Drivers
If the driver permits partial mapping with the DDI_DMA_PARTIAL flag, the number of cookies in each window may exceed the size of the device's scatter/gather list as specified in the dma_attr_sgllen field in the ddi_dma_attr(9S) structure. In this case, each set of cookies comprising a DMA window will satisfy the DMA attributes as described in the ddi_dma_attr(9S) structure in all aspects. The driver should set up its DMA engine and perform one transfer for each set of cookies sufficient for its scatter/gather list, up to the number of cookies for this window, before advancing to the next window using ddi_dma_getwin(9F).
January 18, 2020 | OmniOS |