xref: /illumos-gate/usr/src/man/man9s/ddi_dma_cookie.9s (revision ddb365bfc9e868ad24ccdcb0dc91af18b10df082)
te
Copyright (c) 2000 Sun Microsystems, Inc., All Rights Reserved.
The contents of this file are subject to the terms of the Common Development and Distribution License (the "License"). You may not use this file except in compliance with the License.
You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE or http://www.opensolaris.org/os/licensing. See the License for the specific language governing permissions and limitations under the License.
When distributing Covered Code, include this CDDL HEADER in each file and include the License file at usr/src/OPENSOLARIS.LICENSE. If applicable, add the following below this CDDL HEADER, with the fields enclosed by brackets "[]" replaced with your own identifying information: Portions Copyright [yyyy] [name of copyright owner]
DDI_DMA_COOKIE 9S "March 6, 2023"
NAME
ddi_dma_cookie - DMA address cookie
SYNOPSIS
#include <sys/sunddi.h>
INTERFACE LEVEL
illumos DDI specific (illumos DDI).
DESCRIPTION
The ddi_dma_cookie_t structure contains DMA address information required to program a DMA engine. The structure is filled in by a call to ddi_dma_getwin(9F), ddi_dma_addr_bind_handle(9F), or ddi_dma_buf_bind_handle(9F), to get device-specific DMA transfer information for a DMA request or a DMA window.
STRUCTURE MEMBERS
typedef struct {
 union {
 uint64_t _dmac_ll; /* 64 bit DMA add. */
 uint32_t _dmac_la[2]; /* 2 x 32 bit add. */
 } _dmu;
 size_t dmac_size; /* DMA cookie size */
 uint_t dmac_type; /* bus spec. type bits */
} ddi_dma_cookie_t;

You can access the DMA address through the #defines: dmac_address for 32-bit addresses and dmac_laddress for 64-bit addresses. These macros are defined as follows:

#define dmac_laddress _dmu._dmac_ll
#ifdef _LONG_LONG_HTOL
#define dmac_notused _dmu._dmac_la[0]
#define dmac_address _dmu._dmac_la[1]
#else
#define dmac_address _dmu._dmac_la[0]
#define dmac_notused _dmu._dmac_la[1]
#endif

dmac_laddress specifies a 64-bit I/O address appropriate for programming the device's DMA engine. If a device has a 64-bit DMA address register a driver should use this field to program the DMA engine. dmac_address specifies a 32-bit I/O address. It should be used for devices that have a 32-bit DMA address register. The I/O address range that the device can address and other DMA attributes have to be specified in a ddi_dma_attr(9S) structure.

dmac_size describes the length of the transfer in bytes.

dmac_type contains bus-specific type bits, if appropriate. For example, a device on a PCI bus has PCI address modifier bits placed here.

SEE ALSO
pci (5), sysbus (5), ddi_dma_addr_bind_handle (9F), ddi_dma_buf_bind_handle (9F), ddi_dma_getwin (9F), ddi_dma_nextcookie (9F), ddi_dma_attr (9S)

Writing Device Drivers