1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  *
21  *
22  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
23  * Use is subject to license terms.
24  */
25 #ifndef	_PMCS_SGL_H
26 #define	_PMCS_SGL_H
27 #ifdef	__cplusplus
28 extern "C" {
29 #endif
30 
31 /*
32  * This is the strict physical representation of an external
33  * S/G list entry that the PMCS hardware uses. We manage them
34  * in chunks.
35  */
36 typedef struct {
37 	uint32_t	sglal;	/* Low 32 bit DMA address */
38 	uint32_t	sglah;	/* High 32 bit DMA address */
39 	uint32_t	sglen;	/* Length */
40 	uint32_t	flags;
41 } pmcs_dmasgl_t;
42 
43 /*
44  * If this is bit is set in flags, then the address
45  * described by this structure is an array of SGLs,
46  * the last of which may contain *another* flag
47  * to continue the list.
48  */
49 #define	PMCS_DMASGL_EXTENSION	(1U << 31)
50 
51 #define	PMCS_SGL_CHUNKSZ	(PMCS_SGL_NCHUNKS * (sizeof (pmcs_dmasgl_t)))
52 
53 /*
54  * This is how we keep track of chunks- we have a linked list of
55  * chunk pointers that are either on the free list or are tagged
56  * off of a SCSA command. We used to maintain offsets indices
57  * within the sglen area of the lest element of a chunk, but this
58  * is marked reserved and may not be reliably used future firmware
59  * revisions.
60  */
61 typedef struct pmcs_dmachunk pmcs_dmachunk_t;
62 struct pmcs_dmachunk {
63 	pmcs_dmachunk_t	*nxt;
64 	pmcs_dmasgl_t	*chunks;
65 	unsigned long	addr;
66 	ddi_acc_handle_t	acc_handle;
67 	ddi_dma_handle_t	dma_handle;
68 };
69 
70 /*
71  * DMA related functions
72  */
73 int pmcs_dma_load(pmcs_hw_t *, pmcs_cmd_t *, uint32_t *);
74 void pmcs_dma_unload(pmcs_hw_t *, pmcs_cmd_t *);
75 
76 /*
77  * After allocating some DMA chunks, insert them
78  * into the free list and set them up for use.
79  */
80 void pmcs_idma_chunks(pmcs_hw_t *, pmcs_dmachunk_t *,
81     pmcs_chunk_t *, unsigned long);
82 
83 #ifdef	__cplusplus
84 }
85 #endif
86 #endif	/* _PMCS_SGL_H */
87