162306a36Sopenharmony_ci/* 262306a36Sopenharmony_ci * Inline routines shareable across OS platforms. 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * Copyright (c) 1994-2001 Justin T. Gibbs. 562306a36Sopenharmony_ci * Copyright (c) 2000-2003 Adaptec Inc. 662306a36Sopenharmony_ci * All rights reserved. 762306a36Sopenharmony_ci * 862306a36Sopenharmony_ci * Redistribution and use in source and binary forms, with or without 962306a36Sopenharmony_ci * modification, are permitted provided that the following conditions 1062306a36Sopenharmony_ci * are met: 1162306a36Sopenharmony_ci * 1. Redistributions of source code must retain the above copyright 1262306a36Sopenharmony_ci * notice, this list of conditions, and the following disclaimer, 1362306a36Sopenharmony_ci * without modification. 1462306a36Sopenharmony_ci * 2. Redistributions in binary form must reproduce at minimum a disclaimer 1562306a36Sopenharmony_ci * substantially similar to the "NO WARRANTY" disclaimer below 1662306a36Sopenharmony_ci * ("Disclaimer") and any redistribution must be conditioned upon 1762306a36Sopenharmony_ci * including a substantially similar Disclaimer requirement for further 1862306a36Sopenharmony_ci * binary redistribution. 1962306a36Sopenharmony_ci * 3. Neither the names of the above-listed copyright holders nor the names 2062306a36Sopenharmony_ci * of any contributors may be used to endorse or promote products derived 2162306a36Sopenharmony_ci * from this software without specific prior written permission. 2262306a36Sopenharmony_ci * 2362306a36Sopenharmony_ci * Alternatively, this software may be distributed under the terms of the 2462306a36Sopenharmony_ci * GNU General Public License ("GPL") version 2 as published by the Free 2562306a36Sopenharmony_ci * Software Foundation. 2662306a36Sopenharmony_ci * 2762306a36Sopenharmony_ci * NO WARRANTY 2862306a36Sopenharmony_ci * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 2962306a36Sopenharmony_ci * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 3062306a36Sopenharmony_ci * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 3162306a36Sopenharmony_ci * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 3262306a36Sopenharmony_ci * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 3362306a36Sopenharmony_ci * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 3462306a36Sopenharmony_ci * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 3562306a36Sopenharmony_ci * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 3662306a36Sopenharmony_ci * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 3762306a36Sopenharmony_ci * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 3862306a36Sopenharmony_ci * POSSIBILITY OF SUCH DAMAGES. 3962306a36Sopenharmony_ci * 4062306a36Sopenharmony_ci * $Id: //depot/aic7xxx/aic7xxx/aic79xx_inline.h#59 $ 4162306a36Sopenharmony_ci * 4262306a36Sopenharmony_ci * $FreeBSD$ 4362306a36Sopenharmony_ci */ 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ci#ifndef _AIC79XX_INLINE_H_ 4662306a36Sopenharmony_ci#define _AIC79XX_INLINE_H_ 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_ci/******************************** Debugging ***********************************/ 4962306a36Sopenharmony_cistatic inline char *ahd_name(struct ahd_softc *ahd); 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_cistatic inline char *ahd_name(struct ahd_softc *ahd) 5262306a36Sopenharmony_ci{ 5362306a36Sopenharmony_ci return (ahd->name); 5462306a36Sopenharmony_ci} 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_ci/************************ Sequencer Execution Control *************************/ 5762306a36Sopenharmony_cistatic inline void ahd_known_modes(struct ahd_softc *ahd, 5862306a36Sopenharmony_ci ahd_mode src, ahd_mode dst); 5962306a36Sopenharmony_cistatic inline ahd_mode_state ahd_build_mode_state(struct ahd_softc *ahd, 6062306a36Sopenharmony_ci ahd_mode src, 6162306a36Sopenharmony_ci ahd_mode dst); 6262306a36Sopenharmony_cistatic inline void ahd_extract_mode_state(struct ahd_softc *ahd, 6362306a36Sopenharmony_ci ahd_mode_state state, 6462306a36Sopenharmony_ci ahd_mode *src, ahd_mode *dst); 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_civoid ahd_set_modes(struct ahd_softc *ahd, ahd_mode src, 6762306a36Sopenharmony_ci ahd_mode dst); 6862306a36Sopenharmony_ciahd_mode_state ahd_save_modes(struct ahd_softc *ahd); 6962306a36Sopenharmony_civoid ahd_restore_modes(struct ahd_softc *ahd, 7062306a36Sopenharmony_ci ahd_mode_state state); 7162306a36Sopenharmony_ciint ahd_is_paused(struct ahd_softc *ahd); 7262306a36Sopenharmony_civoid ahd_pause(struct ahd_softc *ahd); 7362306a36Sopenharmony_civoid ahd_unpause(struct ahd_softc *ahd); 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_cistatic inline void 7662306a36Sopenharmony_ciahd_known_modes(struct ahd_softc *ahd, ahd_mode src, ahd_mode dst) 7762306a36Sopenharmony_ci{ 7862306a36Sopenharmony_ci ahd->src_mode = src; 7962306a36Sopenharmony_ci ahd->dst_mode = dst; 8062306a36Sopenharmony_ci ahd->saved_src_mode = src; 8162306a36Sopenharmony_ci ahd->saved_dst_mode = dst; 8262306a36Sopenharmony_ci} 8362306a36Sopenharmony_ci 8462306a36Sopenharmony_cistatic inline ahd_mode_state 8562306a36Sopenharmony_ciahd_build_mode_state(struct ahd_softc *ahd, ahd_mode src, ahd_mode dst) 8662306a36Sopenharmony_ci{ 8762306a36Sopenharmony_ci return ((src << SRC_MODE_SHIFT) | (dst << DST_MODE_SHIFT)); 8862306a36Sopenharmony_ci} 8962306a36Sopenharmony_ci 9062306a36Sopenharmony_cistatic inline void 9162306a36Sopenharmony_ciahd_extract_mode_state(struct ahd_softc *ahd, ahd_mode_state state, 9262306a36Sopenharmony_ci ahd_mode *src, ahd_mode *dst) 9362306a36Sopenharmony_ci{ 9462306a36Sopenharmony_ci *src = (state & SRC_MODE) >> SRC_MODE_SHIFT; 9562306a36Sopenharmony_ci *dst = (state & DST_MODE) >> DST_MODE_SHIFT; 9662306a36Sopenharmony_ci} 9762306a36Sopenharmony_ci 9862306a36Sopenharmony_ci/*********************** Scatter Gather List Handling *************************/ 9962306a36Sopenharmony_civoid *ahd_sg_setup(struct ahd_softc *ahd, struct scb *scb, 10062306a36Sopenharmony_ci void *sgptr, dma_addr_t addr, 10162306a36Sopenharmony_ci bus_size_t len, int last); 10262306a36Sopenharmony_ci 10362306a36Sopenharmony_ci/************************** Memory mapping routines ***************************/ 10462306a36Sopenharmony_cistatic inline size_t ahd_sg_size(struct ahd_softc *ahd); 10562306a36Sopenharmony_ci 10662306a36Sopenharmony_civoid ahd_sync_sglist(struct ahd_softc *ahd, 10762306a36Sopenharmony_ci struct scb *scb, int op); 10862306a36Sopenharmony_ci 10962306a36Sopenharmony_cistatic inline size_t ahd_sg_size(struct ahd_softc *ahd) 11062306a36Sopenharmony_ci{ 11162306a36Sopenharmony_ci if ((ahd->flags & AHD_64BIT_ADDRESSING) != 0) 11262306a36Sopenharmony_ci return (sizeof(struct ahd_dma64_seg)); 11362306a36Sopenharmony_ci return (sizeof(struct ahd_dma_seg)); 11462306a36Sopenharmony_ci} 11562306a36Sopenharmony_ci 11662306a36Sopenharmony_ci/*********************** Miscellaneous Support Functions ***********************/ 11762306a36Sopenharmony_cistruct ahd_initiator_tinfo * 11862306a36Sopenharmony_ci ahd_fetch_transinfo(struct ahd_softc *ahd, 11962306a36Sopenharmony_ci char channel, u_int our_id, 12062306a36Sopenharmony_ci u_int remote_id, 12162306a36Sopenharmony_ci struct ahd_tmode_tstate **tstate); 12262306a36Sopenharmony_ciuint16_t 12362306a36Sopenharmony_ci ahd_inw(struct ahd_softc *ahd, u_int port); 12462306a36Sopenharmony_civoid ahd_outw(struct ahd_softc *ahd, u_int port, 12562306a36Sopenharmony_ci u_int value); 12662306a36Sopenharmony_ciuint32_t 12762306a36Sopenharmony_ci ahd_inl(struct ahd_softc *ahd, u_int port); 12862306a36Sopenharmony_civoid ahd_outl(struct ahd_softc *ahd, u_int port, 12962306a36Sopenharmony_ci uint32_t value); 13062306a36Sopenharmony_ciuint64_t 13162306a36Sopenharmony_ci ahd_inq(struct ahd_softc *ahd, u_int port); 13262306a36Sopenharmony_civoid ahd_outq(struct ahd_softc *ahd, u_int port, 13362306a36Sopenharmony_ci uint64_t value); 13462306a36Sopenharmony_ciu_int ahd_get_scbptr(struct ahd_softc *ahd); 13562306a36Sopenharmony_civoid ahd_set_scbptr(struct ahd_softc *ahd, u_int scbptr); 13662306a36Sopenharmony_ciu_int ahd_inb_scbram(struct ahd_softc *ahd, u_int offset); 13762306a36Sopenharmony_ciu_int ahd_inw_scbram(struct ahd_softc *ahd, u_int offset); 13862306a36Sopenharmony_cistruct scb * 13962306a36Sopenharmony_ci ahd_lookup_scb(struct ahd_softc *ahd, u_int tag); 14062306a36Sopenharmony_civoid ahd_queue_scb(struct ahd_softc *ahd, struct scb *scb); 14162306a36Sopenharmony_ci 14262306a36Sopenharmony_cistatic inline uint8_t *ahd_get_sense_buf(struct ahd_softc *ahd, 14362306a36Sopenharmony_ci struct scb *scb); 14462306a36Sopenharmony_cistatic inline uint32_t ahd_get_sense_bufaddr(struct ahd_softc *ahd, 14562306a36Sopenharmony_ci struct scb *scb); 14662306a36Sopenharmony_ci 14762306a36Sopenharmony_ci#if 0 /* unused */ 14862306a36Sopenharmony_ci 14962306a36Sopenharmony_ci#define AHD_COPY_COL_IDX(dst, src) \ 15062306a36Sopenharmony_cido { \ 15162306a36Sopenharmony_ci dst->hscb->scsiid = src->hscb->scsiid; \ 15262306a36Sopenharmony_ci dst->hscb->lun = src->hscb->lun; \ 15362306a36Sopenharmony_ci} while (0) 15462306a36Sopenharmony_ci 15562306a36Sopenharmony_ci#endif 15662306a36Sopenharmony_ci 15762306a36Sopenharmony_cistatic inline uint8_t * 15862306a36Sopenharmony_ciahd_get_sense_buf(struct ahd_softc *ahd, struct scb *scb) 15962306a36Sopenharmony_ci{ 16062306a36Sopenharmony_ci return (scb->sense_data); 16162306a36Sopenharmony_ci} 16262306a36Sopenharmony_ci 16362306a36Sopenharmony_cistatic inline uint32_t 16462306a36Sopenharmony_ciahd_get_sense_bufaddr(struct ahd_softc *ahd, struct scb *scb) 16562306a36Sopenharmony_ci{ 16662306a36Sopenharmony_ci return (scb->sense_busaddr); 16762306a36Sopenharmony_ci} 16862306a36Sopenharmony_ci 16962306a36Sopenharmony_ci/************************** Interrupt Processing ******************************/ 17062306a36Sopenharmony_ciint ahd_intr(struct ahd_softc *ahd); 17162306a36Sopenharmony_ci 17262306a36Sopenharmony_ci#endif /* _AIC79XX_INLINE_H_ */ 173