mpt.h revision 102199
1269847Speter/* $FreeBSD: head/sys/dev/mpt/mpt.h 102199 2002-08-20 23:04:08Z mjacob $ */
2269847Speter/*
3269847Speter * Generic defines for LSI '909 FC  adapters.
4269847Speter * FreeBSD Version.
5269847Speter *
6269847Speter * Copyright (c)  2000, 2001 by Greg Ansley
7269847Speter *
8269847Speter * Redistribution and use in source and binary forms, with or without
9269847Speter * modification, are permitted provided that the following conditions
10269847Speter * are met:
11269847Speter * 1. Redistributions of source code must retain the above copyright
12269847Speter *    notice immediately at the beginning of the file, without modification,
13269847Speter *    this list of conditions, and the following disclaimer.
14269847Speter * 2. The name of the author may not be used to endorse or promote products
15269847Speter *    derived from this software without specific prior written permission.
16269847Speter *
17269847Speter * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18269847Speter * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19269847Speter * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20269847Speter * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
21269847Speter * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22269847Speter * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23269847Speter * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24269847Speter * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25269847Speter * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26269847Speter * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27269847Speter * SUCH DAMAGE.
28269847Speter */
29269847Speter/*
30269847Speter * Additional Copyright (c) 2002 by Matthew Jacob under same license.
31269847Speter */
32269847Speter
33269847Speter#ifndef _MPT_H_
34269847Speter#define _MPT_H_
35269847Speter#include <dev/mpt/mpt_freebsd.h>
36269847Speter#define MPT_OK (0)
37269847Speter#define MPT_FAIL (0x10000)
38269847Speter
39269847Speter/* Register Offset to chip registers */
40269847Speter#define MPT_OFFSET_DOORBELL     0x00
41269847Speter#define MPT_OFFSET_SEQUENCE     0x04
42269847Speter#define MPT_OFFSET_DIAGNOSTIC   0x08
43269847Speter#define MPT_OFFSET_TEST         0x0C
44269847Speter#define MPT_OFFSET_INTR_STATUS  0x30
45269847Speter#define MPT_OFFSET_INTR_MASK    0x34
46269847Speter#define MPT_OFFSET_REQUEST_Q    0x40
47269847Speter#define MPT_OFFSET_REPLY_Q      0x44
48269847Speter#define MPT_OFFSET_HOST_INDEX   0x50
49269847Speter#define MPT_OFFSET_FUBAR        0x90
50269847Speter
51269847Speter#define MPT_DIAG_SEQUENCE_1     0x04
52269847Speter#define MPT_DIAG_SEQUENCE_2     0x0b
53269847Speter#define MPT_DIAG_SEQUENCE_3     0x02
54269847Speter#define MPT_DIAG_SEQUENCE_4     0x07
55269847Speter#define MPT_DIAG_SEQUENCE_5     0x0d
56269847Speter
57269847Speter/* Bit Maps for DOORBELL register */
58269847Speterenum DB_STATE_BITS {
59269847Speter	MPT_DB_STATE_RESET   =    0x00000000,
60269847Speter	MPT_DB_STATE_READY   =    0x10000000,
61269847Speter	MPT_DB_STATE_RUNNING =    0x20000000,
62269847Speter	MPT_DB_STATE_FAULT   =    0x40000000,
63269847Speter	MPT_DB_STATE_MASK    =    0xf0000000
64269847Speter};
65269847Speter
66269847Speter#define MPT_STATE(v) ((enum DB_STATE_BITS)((v) & MPT_DB_STATE_MASK))
67269847Speter
68269847Speter#define MPT_DB_LENGTH_SHIFT (16)
69269847Speter#define MPT_DB_DATA_MASK (0xffff)
70269847Speter
71269847Speter#define MPT_DB_DB_USED            0x08000000
72269847Speter#define MPT_DB_IS_IN_USE(v) (((v) & MPT_DB_DB_USED) != 0)
73269847Speter
74269847Speter/*
75269847Speter * "Whom" initializor values
76269847Speter */
77269847Speter#define	MPT_DB_INIT_NOONE       0x00
78269847Speter#define	MPT_DB_INIT_BIOS        0x01
79269847Speter#define	MPT_DB_INIT_ROMBIOS     0x02
80269847Speter#define	MPT_DB_INIT_PCIPEER     0x03
81269847Speter#define	MPT_DB_INIT_HOST        0x04
82269847Speter#define	MPT_DB_INIT_MANUFACTURE 0x05
83269847Speter
84269847Speter#define MPT_WHO(v)	\
85269847Speter	((v & MPI_DOORBELL_WHO_INIT_MASK) >> MPI_DOORBELL_WHO_INIT_SHIFT)
86269847Speter
87269847Speter/* Function Maps for DOORBELL register */
88269847Speterenum DB_FUNCTION_BITS {
89269847Speter	MPT_FUNC_IOC_RESET    =    0x40000000,
90269847Speter	MPT_FUNC_UNIT_RESET   =    0x41000000,
91269847Speter	MPT_FUNC_HANDSHAKE    =    0x42000000,
92269847Speter	MPT_FUNC_REPLY_REMOVE =    0x43000000,
93269847Speter	MPT_FUNC_MASK         =    0xff000000
94269847Speter};
95269847Speter
96269847Speter/* Function Maps for INTERRUPT request register */
97269847Speterenum _MPT_INTR_REQ_BITS {
98269847Speter	MPT_INTR_DB_BUSY      =    0x80000000,
99269847Speter	MPT_INTR_REPLY_READY  =    0x00000008,
100269847Speter	MPT_INTR_DB_READY     =    0x00000001
101269847Speter};
102269847Speter
103269847Speter#define MPT_DB_IS_BUSY(v) (((v) & MPT_INTR_DB_BUSY) != 0)
104269847Speter#define MPT_DB_INTR(v)    (((v) & MPT_INTR_DB_READY) != 0)
105269847Speter#define MPT_REPLY_INTR(v) (((v) & MPT_INTR_REPLY_READY) != 0)
106269847Speter
107269847Speter/* Function Maps for INTERRUPT make register */
108269847Speterenum _MPT_INTR_MASK_BITS {
109269847Speter	MPT_INTR_REPLY_MASK   =    0x00000008,
110269847Speter	MPT_INTR_DB_MASK      =    0x00000001
111269847Speter};
112269847Speter
113269847Speter/* Function Maps for DIAGNOSTIC make register */
114269847Speterenum _MPT_DIAG_BITS {
115269847Speter	MPT_DIAG_ENABLED      =    0x00000080,
116269847Speter	MPT_DIAG_FLASHBAD     =    0x00000040,
117269847Speter	MPT_DIAG_RESET_HIST   =    0x00000020,
118269847Speter	MPT_DIAG_TTLI         =    0x00000008,
119269847Speter	MPT_DIAG_RESET_IOC    =    0x00000004,
120269847Speter	MPT_DIAG_ARM_DISABLE  =    0x00000002,
121269847Speter	MPT_DIAG_DME          =    0x00000001
122269847Speter};
123269847Speter
124269847Speter/* Magic addresses in diagnostic memory space */
125269847Speter#define MPT_DIAG_IOP_BASE        (0x00000000)
126269847Speter#define MPT_DIAG_IOP_SIZE                      (0x00002000)
127269847Speter#define MPT_DIAG_GPIO            (0x00030010)
128269847Speter#define MPT_DIAG_IOPQ_REG_BASE0  (0x00050004)
129269847Speter#define MPT_DIAG_IOPQ_REG_BASE1  (0x00051004)
130269847Speter#define MPT_DIAG_MEM_CFG_BASE    (0x00040000)
131269847Speter#define MPT_DIAG_CTX0_BASE       (0x000E0000)
132269847Speter#define MPT_DIAG_CTX0_SIZE                     (0x00002000)
133269847Speter#define MPT_DIAG_CTX1_BASE       (0x001E0000)
134269847Speter#define MPT_DIAG_CTX1_SIZE                     (0x00002000)
135269847Speter#define MPT_DIAG_FLASH_BASE      (0x00800000)
136269847Speter#define MPT_DIAG_RAM_BASE        (0x01000000)
137269847Speter#define MPT_DIAG_RAM_SIZE                      (0x00400000)
138269847Speter
139269847Speter/* GPIO bit assignments */
140269847Speter#define MPT_DIAG_GPIO_SCL	(0x00010000)
141269847Speter#define MPT_DIAG_GPIO_SDA_OUT	(0x00008000)
142269847Speter#define MPT_DIAG_GPIO_SDA_IN	(0x00004000)
143269847Speter
144269847Speter#define MPT_REPLY_EMPTY   (0xffffffff)    /* Reply Queue Empty Symbol */
145269847Speter#define MPT_CONTEXT_REPLY (0x80000000)
146269847Speter#define MPT_CONTEXT_MASK  (~0xE0000000)
147269847Speter
148269847Speter#ifdef _KERNEL
149269847Speterint mpt_soft_reset(mpt_softc_t *mpt);
150269847Spetervoid mpt_hard_reset(mpt_softc_t *mpt);
151269847Speterint mpt_recv_handshake_reply(mpt_softc_t *mpt, size_t reply_len, void *reply);
152269847Speter
153269847Speter
154269847Spetervoid mpt_send_cmd(mpt_softc_t *mpt, request_t *req);
155269847Spetervoid mpt_free_reply(mpt_softc_t *mpt, u_int32_t ptr);
156269847Spetervoid mpt_enable_ints(mpt_softc_t *mpt);
157269847Spetervoid mpt_disable_ints(mpt_softc_t *mpt);
158269847Speteru_int32_t mpt_pop_reply_queue(mpt_softc_t *mpt);
159269847Speterint mpt_init(mpt_softc_t *mpt, u_int32_t who);
160269847Speterint mpt_reset(mpt_softc_t *mpt);
161269847Speterint mpt_send_handshake_cmd(mpt_softc_t *mpt, size_t len, void *cmd);
162269847Speterrequest_t * mpt_get_request(mpt_softc_t *mpt);
163269847Spetervoid mpt_free_request(mpt_softc_t *mpt, request_t *req);
164269847Speterint mpt_intr(void *dummy);
165269847Spetervoid mpt_check_doorbell(mpt_softc_t * mpt);
166269847Speter
167269847Speter/* mpt_debug.c functions */
168269847Spetervoid mpt_print_reply(void *vmsg);
169269847Spetervoid mpt_print_db(u_int32_t mb);
170269847Spetervoid mpt_print_config_reply(void *vmsg);
171269847Speterchar *mpt_ioc_diag(u_int32_t diag);
172269847Speterchar *mpt_req_state(enum mpt_req_state state);
173269847Spetervoid mpt_print_scsi_io_request(MSG_SCSI_IO_REQUEST *msg);
174269847Spetervoid mpt_print_config_request(void *vmsg);
175269847Spetervoid mpt_print_request(void *vmsg);
176269847Speter#endif
177269847Speter#endif /* _MPT_H_ */
178269847Speter