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