Museum

Home

Lab Overview

Retrotechnology Articles

⇒ Online Manual

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

ddi_dma_addr_bind_handle(9F)

ddi_dma_alloc_handle(9F)

ddi_dma_unbind_handle(9F)

ddi_dma_mem_free(9F)

ddi_dma_sync(9F)

ddi_getb(9F)

ddi_putb(9F)

ddi_dma_mem_alloc(9F)

NAME

ddi_dma_mem_alloc − allocate memory for DMA transfer

SYNOPSIS

#include <sys/ddi.h>
#include <sys/sunddi.h>

int ddi_dma_mem_alloc(ddi_dma_handle_t handle, uint_t length,

ddi_device_acc_attr_t ∗accattrp, ulong_t flags,

int (∗waitfp)(caddr_t), caddr_t arg, caddr_t ∗kaddrp,

uint_t ∗real_length, ddi_acc_handle_t ∗handlep);

ARGUMENTS

handle The DMA handle previously allocated by a call to ddi_dma_alloc_handle(9F). 

length The length in bytes of the desired allocation. 

accattrp Pointer to a device access attribute structure of this device (see ddi_device_acc_attr(9S)). 

flags Data transfer mode flags. Possible values are:

DDI_DMA_STREAMING
Sequential, unidirectional, block-sized, and block-aligned transfers.

DDI_DMA_CONSISTENT
Nonsequential transfers of small objects.

waitfp The address of a function to call back later if resources are not available now. The special function addresses DDI_DMA_SLEEP and DDI_DMA_DONTWAIT are taken to mean, respectively, wait until resources are available or, do not wait and do not schedule a callback. 

arg Argument to be passed to the callback function, if such a function is specified. 

kaddrp On successful return, ∗kaddrp points to the allocated memory. 

∗real_length The amount of memory, in bytes, allocated. Alignment and padding requirements may require ddi_dma_mem_alloc() to allocate more memory than requested in length.

handlep Pointer to a data access handle. 

INTERFACE LEVEL

Solaris DDI specific (Solaris DDI). 

DESCRIPTION

ddi_dma_mem_alloc() allocates memory for DMA transfers to or from a device.  The allocation will obey the alignment, padding constraints and device granularity as specified by the DMA attributes (see ddi_dma_attr(9S)) passed to ddi_dma_alloc_handle(9F) and the more restrictive attributes imposed by the system. 

flags should be set to DDI_DMA_STREAMING if the device is doing sequential, unidirectional, block-sized, and block-aligned transfers to or from memory.  The alignment and padding constraints specified by the minxfer and burstsizes fields in the DMA attribute structure, ddi_dma_attr(9S) (see ddi_dma_alloc_handle(9F)) will be used to allocate the most effective hardware support for large transfers. For example, if an I/O transfer can be sped up by using an I/O cache, which has a minimum transfer of one cache line, ddi_dma_mem_alloc() will align the memory at a cache line boundary and it will round up ∗real_length to a multiple of the cache line size. 

flags should be set to DDI_DMA_CONSISTENT if the device accesses memory randomly, or if synchronization steps using ddi_dma_sync(9F) need to be as efficient as possible.  I/O parameter blocks used for communication between a device and a driver should be allocated using DDI_DMA_CONSISTENT. 

The device access attributes are specified in the location pointed by the accattrp argument (see ddi_device_acc_attr(9S)). 

The data access handle is returned in handlep. handlep is opaque − drivers may not attempt to interpret its value.  To access the data content, the driver must invoke ddi_getb(9F) or ddi_getb(9F) (depending on the data transfer direction) with the data access handle. 

DMA resources must be established before performing a DMA transfer by passing kaddrp and ∗real_length as returned from ddi_dma_mem_alloc() and the flag DDI_DMA_STREAMING or DDI_DMA_CONSISTENT to ddi_dma_addr_bind_handle(9F).  In addition, to ensure the consistency of a memory object shared between the CPU and the device after a DMA transfer, explicit synchronization steps using ddi_dma_sync(9F) or ddi_dma_unbind_handle(9F) are required. 

RETURN VALUES

ddi_dma_mem_alloc() returns:

DDI_SUCCESS
Memory successfully allocated.

DDI_FAILURE
Memory allocation failed.

CONTEXT

ddi_dma_mem_alloc() can be called from user or interrupt context, except when waitfp is set to DDI_DMA_SLEEP, in which case it can be called from user context only. 

SEE ALSO

ddi_dma_addr_bind_handle(9F), ddi_dma_alloc_handle(9F), ddi_dma_unbind_handle(9F), ddi_dma_mem_free(9F), ddi_dma_sync(9F), ddi_getb(9F), ddi_putb(9F)

Writing Device Drivers
 

SunOS 5.5/x86  —  Last change: 26 Sep 1994

Typewritten Software • bear@typewritten.org • Edmonds, WA 98026