pmcs_sgl.h revision 4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6
/*
* CDDL HEADER START
*
* 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]
*
* CDDL HEADER END
*
*
* Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
#ifndef _PMCS_SGL_H
#define _PMCS_SGL_H
#ifdef __cplusplus
extern "C" {
#endif
/*
* This is the strict physical representation of an external
* S/G list entry that the PMCS hardware uses. We manage them
* in chunks.
*/
typedef struct {
uint32_t sglal; /* Low 32 bit DMA address */
uint32_t sglah; /* High 32 bit DMA address */
uint32_t sglen; /* Length */
uint32_t flags;
} pmcs_dmasgl_t;
/*
* If this is bit is set in flags, then the address
* described by this structure is an array of SGLs,
* the last of which may contain *another* flag
* to continue the list.
*/
#define PMCS_DMASGL_EXTENSION (1U << 31)
#define PMCS_SGL_CHUNKSZ (PMCS_SGL_NCHUNKS * (sizeof (pmcs_dmasgl_t)))
/*
* This is how we keep track of chunks- we have a linked list of
* chunk pointers that are either on the free list or are tagged
* off of a SCSA command. We used to maintain offsets indices
* within the sglen area of the lest element of a chunk, but this
* is marked reserved and may not be reliably used future firmware
* revisions.
*/
typedef struct pmcs_dmachunk pmcs_dmachunk_t;
struct pmcs_dmachunk {
pmcs_dmachunk_t *nxt;
pmcs_dmasgl_t *chunks;
unsigned long addr;
ddi_acc_handle_t acc_handle;
ddi_dma_handle_t dma_handle;
};
/*
* DMA related functions
*/
int pmcs_dma_load(pmcs_hw_t *, pmcs_cmd_t *, uint32_t *);
void pmcs_dma_unload(pmcs_hw_t *, pmcs_cmd_t *);
/*
* After allocating some DMA chunks, insert them
* into the free list and set them up for use.
*/
void pmcs_idma_chunks(pmcs_hw_t *, pmcs_dmachunk_t *,
pmcs_chunk_t *, unsigned long);
#ifdef __cplusplus
}
#endif
#endif /* _PMCS_SGL_H */