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