mpt.h revision 139749
1101704Smjacob/* $FreeBSD: head/sys/dev/mpt/mpt.h 139749 2005-01-06 01:43:34Z imp $ */ 2139749Simp/*- 3101704Smjacob * Generic defines for LSI '909 FC adapters. 4101704Smjacob * FreeBSD Version. 5101704Smjacob * 6101704Smjacob * Copyright (c) 2000, 2001 by Greg Ansley 7101704Smjacob * 8101704Smjacob * Redistribution and use in source and binary forms, with or without 9101704Smjacob * modification, are permitted provided that the following conditions 10101704Smjacob * are met: 11101704Smjacob * 1. Redistributions of source code must retain the above copyright 12101704Smjacob * notice immediately at the beginning of the file, without modification, 13101704Smjacob * this list of conditions, and the following disclaimer. 14101704Smjacob * 2. The name of the author may not be used to endorse or promote products 15101704Smjacob * derived from this software without specific prior written permission. 16101704Smjacob * 17101704Smjacob * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 18101704Smjacob * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19101704Smjacob * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20101704Smjacob * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR 21101704Smjacob * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22101704Smjacob * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23101704Smjacob * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24101704Smjacob * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25101704Smjacob * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26101704Smjacob * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27101704Smjacob * SUCH DAMAGE. 28101704Smjacob */ 29101704Smjacob/* 30101704Smjacob * Additional Copyright (c) 2002 by Matthew Jacob under same license. 31101704Smjacob */ 32101704Smjacob 33101704Smjacob#ifndef _MPT_H_ 34101704Smjacob#define _MPT_H_ 35101704Smjacob#include <dev/mpt/mpt_freebsd.h> 36101704Smjacob#define MPT_OK (0) 37101704Smjacob#define MPT_FAIL (0x10000) 38101704Smjacob 39101704Smjacob/* Register Offset to chip registers */ 40101704Smjacob#define MPT_OFFSET_DOORBELL 0x00 41101704Smjacob#define MPT_OFFSET_SEQUENCE 0x04 42101704Smjacob#define MPT_OFFSET_DIAGNOSTIC 0x08 43101704Smjacob#define MPT_OFFSET_TEST 0x0C 44101704Smjacob#define MPT_OFFSET_INTR_STATUS 0x30 45101704Smjacob#define MPT_OFFSET_INTR_MASK 0x34 46101704Smjacob#define MPT_OFFSET_REQUEST_Q 0x40 47101704Smjacob#define MPT_OFFSET_REPLY_Q 0x44 48101704Smjacob#define MPT_OFFSET_HOST_INDEX 0x50 49101704Smjacob#define MPT_OFFSET_FUBAR 0x90 50101704Smjacob 51101704Smjacob#define MPT_DIAG_SEQUENCE_1 0x04 52101704Smjacob#define MPT_DIAG_SEQUENCE_2 0x0b 53101704Smjacob#define MPT_DIAG_SEQUENCE_3 0x02 54101704Smjacob#define MPT_DIAG_SEQUENCE_4 0x07 55101704Smjacob#define MPT_DIAG_SEQUENCE_5 0x0d 56101704Smjacob 57101704Smjacob/* Bit Maps for DOORBELL register */ 58101704Smjacobenum DB_STATE_BITS { 59101704Smjacob MPT_DB_STATE_RESET = 0x00000000, 60101704Smjacob MPT_DB_STATE_READY = 0x10000000, 61101704Smjacob MPT_DB_STATE_RUNNING = 0x20000000, 62101704Smjacob MPT_DB_STATE_FAULT = 0x40000000, 63101704Smjacob MPT_DB_STATE_MASK = 0xf0000000 64101704Smjacob}; 65101704Smjacob 66101704Smjacob#define MPT_STATE(v) ((enum DB_STATE_BITS)((v) & MPT_DB_STATE_MASK)) 67101704Smjacob 68101704Smjacob#define MPT_DB_LENGTH_SHIFT (16) 69101704Smjacob#define MPT_DB_DATA_MASK (0xffff) 70101704Smjacob 71101704Smjacob#define MPT_DB_DB_USED 0x08000000 72101704Smjacob#define MPT_DB_IS_IN_USE(v) (((v) & MPT_DB_DB_USED) != 0) 73101704Smjacob 74101704Smjacob/* 75101704Smjacob * "Whom" initializor values 76101704Smjacob */ 77101704Smjacob#define MPT_DB_INIT_NOONE 0x00 78101704Smjacob#define MPT_DB_INIT_BIOS 0x01 79101704Smjacob#define MPT_DB_INIT_ROMBIOS 0x02 80101704Smjacob#define MPT_DB_INIT_PCIPEER 0x03 81101704Smjacob#define MPT_DB_INIT_HOST 0x04 82101704Smjacob#define MPT_DB_INIT_MANUFACTURE 0x05 83101704Smjacob 84101704Smjacob#define MPT_WHO(v) \ 85101704Smjacob ((v & MPI_DOORBELL_WHO_INIT_MASK) >> MPI_DOORBELL_WHO_INIT_SHIFT) 86101704Smjacob 87101704Smjacob/* Function Maps for DOORBELL register */ 88101704Smjacobenum DB_FUNCTION_BITS { 89101704Smjacob MPT_FUNC_IOC_RESET = 0x40000000, 90101704Smjacob MPT_FUNC_UNIT_RESET = 0x41000000, 91101704Smjacob MPT_FUNC_HANDSHAKE = 0x42000000, 92101704Smjacob MPT_FUNC_REPLY_REMOVE = 0x43000000, 93101704Smjacob MPT_FUNC_MASK = 0xff000000 94101704Smjacob}; 95101704Smjacob 96101704Smjacob/* Function Maps for INTERRUPT request register */ 97101704Smjacobenum _MPT_INTR_REQ_BITS { 98101704Smjacob MPT_INTR_DB_BUSY = 0x80000000, 99101704Smjacob MPT_INTR_REPLY_READY = 0x00000008, 100101704Smjacob MPT_INTR_DB_READY = 0x00000001 101101704Smjacob}; 102101704Smjacob 103101704Smjacob#define MPT_DB_IS_BUSY(v) (((v) & MPT_INTR_DB_BUSY) != 0) 104101704Smjacob#define MPT_DB_INTR(v) (((v) & MPT_INTR_DB_READY) != 0) 105101704Smjacob#define MPT_REPLY_INTR(v) (((v) & MPT_INTR_REPLY_READY) != 0) 106101704Smjacob 107101704Smjacob/* Function Maps for INTERRUPT make register */ 108101704Smjacobenum _MPT_INTR_MASK_BITS { 109101704Smjacob MPT_INTR_REPLY_MASK = 0x00000008, 110101704Smjacob MPT_INTR_DB_MASK = 0x00000001 111101704Smjacob}; 112101704Smjacob 113101704Smjacob/* Function Maps for DIAGNOSTIC make register */ 114101704Smjacobenum _MPT_DIAG_BITS { 115101704Smjacob MPT_DIAG_ENABLED = 0x00000080, 116101704Smjacob MPT_DIAG_FLASHBAD = 0x00000040, 117101704Smjacob MPT_DIAG_RESET_HIST = 0x00000020, 118101704Smjacob MPT_DIAG_TTLI = 0x00000008, 119101704Smjacob MPT_DIAG_RESET_IOC = 0x00000004, 120101704Smjacob MPT_DIAG_ARM_DISABLE = 0x00000002, 121101704Smjacob MPT_DIAG_DME = 0x00000001 122101704Smjacob}; 123101704Smjacob 124101704Smjacob/* Magic addresses in diagnostic memory space */ 125101704Smjacob#define MPT_DIAG_IOP_BASE (0x00000000) 126101704Smjacob#define MPT_DIAG_IOP_SIZE (0x00002000) 127101704Smjacob#define MPT_DIAG_GPIO (0x00030010) 128101704Smjacob#define MPT_DIAG_IOPQ_REG_BASE0 (0x00050004) 129101704Smjacob#define MPT_DIAG_IOPQ_REG_BASE1 (0x00051004) 130101704Smjacob#define MPT_DIAG_MEM_CFG_BASE (0x00040000) 131101704Smjacob#define MPT_DIAG_CTX0_BASE (0x000E0000) 132101704Smjacob#define MPT_DIAG_CTX0_SIZE (0x00002000) 133101704Smjacob#define MPT_DIAG_CTX1_BASE (0x001E0000) 134101704Smjacob#define MPT_DIAG_CTX1_SIZE (0x00002000) 135101704Smjacob#define MPT_DIAG_FLASH_BASE (0x00800000) 136101704Smjacob#define MPT_DIAG_RAM_BASE (0x01000000) 137101704Smjacob#define MPT_DIAG_RAM_SIZE (0x00400000) 138101704Smjacob 139101704Smjacob/* GPIO bit assignments */ 140101704Smjacob#define MPT_DIAG_GPIO_SCL (0x00010000) 141101704Smjacob#define MPT_DIAG_GPIO_SDA_OUT (0x00008000) 142101704Smjacob#define MPT_DIAG_GPIO_SDA_IN (0x00004000) 143101704Smjacob 144101704Smjacob#define MPT_REPLY_EMPTY (0xffffffff) /* Reply Queue Empty Symbol */ 145101704Smjacob#define MPT_CONTEXT_REPLY (0x80000000) 146101704Smjacob#define MPT_CONTEXT_MASK (~0xE0000000) 147101704Smjacob 148101704Smjacob#ifdef _KERNEL 149102199Smjacobint mpt_soft_reset(mpt_softc_t *mpt); 150102199Smjacobvoid mpt_hard_reset(mpt_softc_t *mpt); 151102199Smjacobint mpt_recv_handshake_reply(mpt_softc_t *mpt, size_t reply_len, void *reply); 152101704Smjacob 153102199Smjacobvoid mpt_send_cmd(mpt_softc_t *mpt, request_t *req); 154102199Smjacobvoid mpt_free_reply(mpt_softc_t *mpt, u_int32_t ptr); 155102199Smjacobvoid mpt_enable_ints(mpt_softc_t *mpt); 156102199Smjacobvoid mpt_disable_ints(mpt_softc_t *mpt); 157102199Smjacobu_int32_t mpt_pop_reply_queue(mpt_softc_t *mpt); 158102199Smjacobint mpt_init(mpt_softc_t *mpt, u_int32_t who); 159102199Smjacobint mpt_reset(mpt_softc_t *mpt); 160102199Smjacobint mpt_send_handshake_cmd(mpt_softc_t *mpt, size_t len, void *cmd); 161102199Smjacobrequest_t * mpt_get_request(mpt_softc_t *mpt); 162102199Smjacobvoid mpt_free_request(mpt_softc_t *mpt, request_t *req); 163101704Smjacobint mpt_intr(void *dummy); 164102199Smjacobvoid mpt_check_doorbell(mpt_softc_t * mpt); 165101704Smjacob 166115778Smjacobint mpt_read_cfg_page(mpt_softc_t *, int, CONFIG_PAGE_HEADER *); 167115778Smjacobint mpt_write_cfg_page(mpt_softc_t *, int, CONFIG_PAGE_HEADER *); 168102822Smjacob 169101704Smjacob/* mpt_debug.c functions */ 170101704Smjacobvoid mpt_print_reply(void *vmsg); 171101704Smjacobvoid mpt_print_db(u_int32_t mb); 172101704Smjacobvoid mpt_print_config_reply(void *vmsg); 173101704Smjacobchar *mpt_ioc_diag(u_int32_t diag); 174101704Smjacobchar *mpt_req_state(enum mpt_req_state state); 175101704Smjacobvoid mpt_print_scsi_io_request(MSG_SCSI_IO_REQUEST *msg); 176101704Smjacobvoid mpt_print_config_request(void *vmsg); 177101704Smjacobvoid mpt_print_request(void *vmsg); 178102199Smjacob#endif 179101704Smjacob#endif /* _MPT_H_ */ 180