4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh/*
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * CDDL HEADER START
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh *
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * The contents of this file are subject to the terms of the
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * Common Development and Distribution License (the "License").
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * You may not use this file except in compliance with the License.
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh *
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * or http://www.opensolaris.org/os/licensing.
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * See the License for the specific language governing permissions
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * and limitations under the License.
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh *
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * When distributing Covered Code, include this CDDL HEADER in each
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * If applicable, add the following below this CDDL HEADER, with the
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * fields enclosed by brackets "[]" replaced with your own identifying
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * information: Portions Copyright [yyyy] [name of copyright owner]
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh *
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * CDDL HEADER END
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh *
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh *
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * Use is subject to license terms.
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh#ifndef _PMCS_SGL_H
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh#define _PMCS_SGL_H
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh#ifdef __cplusplus
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhextern "C" {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh#endif
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh/*
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * This is the strict physical representation of an external
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * S/G list entry that the PMCS hardware uses. We manage them
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * in chunks.
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhtypedef struct {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh uint32_t sglal; /* Low 32 bit DMA address */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh uint32_t sglah; /* High 32 bit DMA address */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh uint32_t sglen; /* Length */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh uint32_t flags;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh} pmcs_dmasgl_t;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh/*
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * If this is bit is set in flags, then the address
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * described by this structure is an array of SGLs,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * the last of which may contain *another* flag
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * to continue the list.
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh#define PMCS_DMASGL_EXTENSION (1U << 31)
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh#define PMCS_SGL_CHUNKSZ (PMCS_SGL_NCHUNKS * (sizeof (pmcs_dmasgl_t)))
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh/*
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * This is how we keep track of chunks- we have a linked list of
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * chunk pointers that are either on the free list or are tagged
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * off of a SCSA command. We used to maintain offsets indices
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * within the sglen area of the lest element of a chunk, but this
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * is marked reserved and may not be reliably used future firmware
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * revisions.
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhtypedef struct pmcs_dmachunk pmcs_dmachunk_t;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhstruct pmcs_dmachunk {
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh pmcs_dmachunk_t *nxt;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh pmcs_dmasgl_t *chunks;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh unsigned long addr;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh ddi_acc_handle_t acc_handle;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh ddi_dma_handle_t dma_handle;
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh};
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh/*
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * DMA related functions
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhint pmcs_dma_load(pmcs_hw_t *, pmcs_cmd_t *, uint32_t *);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhvoid pmcs_dma_unload(pmcs_hw_t *, pmcs_cmd_t *);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh/*
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * After allocating some DMA chunks, insert them
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh * into the free list and set them up for use.
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh */
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dhvoid pmcs_idma_chunks(pmcs_hw_t *, pmcs_dmachunk_t *,
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh pmcs_chunk_t *, unsigned long);
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh#ifdef __cplusplus
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh}
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh#endif
4c06356b0f0fffb4fc1b6eccc8e5d8e2254a84d6dh#endif /* _PMCS_SGL_H */