DDI_DMA_GETWIN(9F) Kernel Functions for Drivers DDI_DMA_GETWIN(9F)
NAME
ddi_dma_getwin - activate a new DMA window
SYNOPSIS
#include <sys/ddi.h>
#include <sys/sunddi.h>
int ddi_dma_getwin(
ddi_dma_handle_t handle,
uint_t win,
off_t *offp,
size_t *lenp,
ddi_dma_cookie_t *cookiep,
uint_t *ccountp);
INTERFACE LEVEL
illumos DDI specific (illumos DDI).
PARAMETERS
handle The
DMA handle previously allocated by a call to
ddi_dma_alloc_handle(9F).
win Number of the window to activate.
offp Pointer to an offset. Upon a successful return,
offp will contain the new offset indicating the beginning of
the window within the object.
lenp Upon a successful return,
lenp will contain the size, in
bytes, of the current window.
cookiep A pointer to the first
ddi_dma_cookie(9S) structure.
This should be left as
NULL in new callers.
ccountp Upon a successful return,
ccountp will contain the
number of cookies for this
DMA window. This can be left
as
NULL in new callers. The cookie count can be obtained
by calling
ddi_dma_ncookies(9F).
DESCRIPTION
ddi_dma_getwin() activates a new
DMA window. If a
DMA resource
allocation request returns
DDI_DMA_PARTIAL_MAP indicating that
resources for less than the entire object were allocated, the current
DMA window can be changed by a call to
ddi_dma_getwin().
The caller must first determine the number of
DMA windows,
N, using
ddi_dma_numwin(9F).
ddi_dma_getwin() takes a
DMA window number from
the range
[0..N-1] as the parameter
win and makes it the current
DMA window.
ddi_dma_getwin() allocates and assosciates 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.
ddi_dma_getwin() takes care of underlying resource synchronizations
required to shift the window. However accessing the data prior to or
after moving the window requires further synchronization steps using
ddi_dma_sync(9F).
ddi_dma_getwin() is normally called from an interrupt routine. The
first invocation of the
DMA engine is done from the driver. All
subsequent invocations of the
DMA engine are done from the interrupt
routine. The interrupt routine checks to see if the request has been
completed. If it has, the interrupt routine returns without invoking
another
DMA transfer. Otherwise, it calls
ddi_dma_getwin() to
shift the current window and start another
DMA transfer.
RETURN VALUES
ddi_dma_getwin() returns:
DDI_SUCCESS Resources for the specified
DMA window are allocated.
DDI_FAILURE win is not a valid window index.
CONTEXT
ddi_dma_getwin() can be called from user, kernel, or interrupt
context.
SEE ALSO
ddi_dma_addr_bind_handle(9F),
ddi_dma_alloc_handle(9F),
ddi_dma_buf_bind_handle(9F),
ddi_dma_cookie_get(9F),
ddi_dma_cookie_iter(9F),
ddi_dma_ncookies(9F),
ddi_dma_numwin(9F),
ddi_dma_sync(9F),
ddi_dma_unbind_handle(9F),
ddi_dma_cookie(9S) Writing Device Drivers January 18, 2020 DDI_DMA_GETWIN(9F)