xref: /OK3568_Linux_fs/kernel/drivers/scsi/mpt3sas/mpi/mpi2.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Copyright 2000-2020 Broadcom Inc. All rights reserved.
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  *
6*4882a593Smuzhiyun  *          Name:  mpi2.h
7*4882a593Smuzhiyun  *         Title:  MPI Message independent structures and definitions
8*4882a593Smuzhiyun  *                 including System Interface Register Set and
9*4882a593Smuzhiyun  *                 scatter/gather formats.
10*4882a593Smuzhiyun  * Creation Date:  June 21, 2006
11*4882a593Smuzhiyun  *
12*4882a593Smuzhiyun  *  mpi2.h Version:  02.00.54
13*4882a593Smuzhiyun  *
14*4882a593Smuzhiyun  * NOTE: Names (typedefs, defines, etc.) beginning with an MPI25 or Mpi25
15*4882a593Smuzhiyun  *       prefix are for use only on MPI v2.5 products, and must not be used
16*4882a593Smuzhiyun  *       with MPI v2.0 products. Unless otherwise noted, names beginning with
17*4882a593Smuzhiyun  *       MPI2 or Mpi2 are for use with both MPI v2.0 and MPI v2.5 products.
18*4882a593Smuzhiyun  *
19*4882a593Smuzhiyun  * Version History
20*4882a593Smuzhiyun  * ---------------
21*4882a593Smuzhiyun  *
22*4882a593Smuzhiyun  * Date      Version   Description
23*4882a593Smuzhiyun  * --------  --------  ------------------------------------------------------
24*4882a593Smuzhiyun  * 04-30-07  02.00.00  Corresponds to Fusion-MPT MPI Specification Rev A.
25*4882a593Smuzhiyun  * 06-04-07  02.00.01  Bumped MPI2_HEADER_VERSION_UNIT.
26*4882a593Smuzhiyun  * 06-26-07  02.00.02  Bumped MPI2_HEADER_VERSION_UNIT.
27*4882a593Smuzhiyun  * 08-31-07  02.00.03  Bumped MPI2_HEADER_VERSION_UNIT.
28*4882a593Smuzhiyun  *                     Moved ReplyPostHostIndex register to offset 0x6C of the
29*4882a593Smuzhiyun  *                     MPI2_SYSTEM_INTERFACE_REGS and modified the define for
30*4882a593Smuzhiyun  *                     MPI2_REPLY_POST_HOST_INDEX_OFFSET.
31*4882a593Smuzhiyun  *                     Added union of request descriptors.
32*4882a593Smuzhiyun  *                     Added union of reply descriptors.
33*4882a593Smuzhiyun  * 10-31-07  02.00.04  Bumped MPI2_HEADER_VERSION_UNIT.
34*4882a593Smuzhiyun  *                     Added define for MPI2_VERSION_02_00.
35*4882a593Smuzhiyun  *                     Fixed the size of the FunctionDependent5 field in the
36*4882a593Smuzhiyun  *                     MPI2_DEFAULT_REPLY structure.
37*4882a593Smuzhiyun  * 12-18-07  02.00.05  Bumped MPI2_HEADER_VERSION_UNIT.
38*4882a593Smuzhiyun  *                     Removed the MPI-defined Fault Codes and extended the
39*4882a593Smuzhiyun  *                     product specific codes up to 0xEFFF.
40*4882a593Smuzhiyun  *                     Added a sixth key value for the WriteSequence register
41*4882a593Smuzhiyun  *                     and changed the flush value to 0x0.
42*4882a593Smuzhiyun  *                     Added message function codes for Diagnostic Buffer Post
43*4882a593Smuzhiyun  *                     and Diagnsotic Release.
44*4882a593Smuzhiyun  *                     New IOCStatus define: MPI2_IOCSTATUS_DIAGNOSTIC_RELEASED
45*4882a593Smuzhiyun  *                     Moved MPI2_VERSION_UNION from mpi2_ioc.h.
46*4882a593Smuzhiyun  * 02-29-08  02.00.06  Bumped MPI2_HEADER_VERSION_UNIT.
47*4882a593Smuzhiyun  * 03-03-08  02.00.07  Bumped MPI2_HEADER_VERSION_UNIT.
48*4882a593Smuzhiyun  * 05-21-08  02.00.08  Bumped MPI2_HEADER_VERSION_UNIT.
49*4882a593Smuzhiyun  *                     Added #defines for marking a reply descriptor as unused.
50*4882a593Smuzhiyun  * 06-27-08  02.00.09  Bumped MPI2_HEADER_VERSION_UNIT.
51*4882a593Smuzhiyun  * 10-02-08  02.00.10  Bumped MPI2_HEADER_VERSION_UNIT.
52*4882a593Smuzhiyun  *                     Moved LUN field defines from mpi2_init.h.
53*4882a593Smuzhiyun  * 01-19-09  02.00.11  Bumped MPI2_HEADER_VERSION_UNIT.
54*4882a593Smuzhiyun  * 05-06-09  02.00.12  Bumped MPI2_HEADER_VERSION_UNIT.
55*4882a593Smuzhiyun  *                     In all request and reply descriptors, replaced VF_ID
56*4882a593Smuzhiyun  *                     field with MSIxIndex field.
57*4882a593Smuzhiyun  *                     Removed DevHandle field from
58*4882a593Smuzhiyun  *                     MPI2_SCSI_IO_SUCCESS_REPLY_DESCRIPTOR and made those
59*4882a593Smuzhiyun  *                     bytes reserved.
60*4882a593Smuzhiyun  *                     Added RAID Accelerator functionality.
61*4882a593Smuzhiyun  * 07-30-09  02.00.13  Bumped MPI2_HEADER_VERSION_UNIT.
62*4882a593Smuzhiyun  * 10-28-09  02.00.14  Bumped MPI2_HEADER_VERSION_UNIT.
63*4882a593Smuzhiyun  *                     Added MSI-x index mask and shift for Reply Post Host
64*4882a593Smuzhiyun  *                     Index register.
65*4882a593Smuzhiyun  *                     Added function code for Host Based Discovery Action.
66*4882a593Smuzhiyun  * 02-10-10  02.00.15  Bumped MPI2_HEADER_VERSION_UNIT.
67*4882a593Smuzhiyun  *                     Added define for MPI2_FUNCTION_PWR_MGMT_CONTROL.
68*4882a593Smuzhiyun  *                     Added defines for product-specific range of message
69*4882a593Smuzhiyun  *                     function codes, 0xF0 to 0xFF.
70*4882a593Smuzhiyun  * 05-12-10  02.00.16  Bumped MPI2_HEADER_VERSION_UNIT.
71*4882a593Smuzhiyun  *                     Added alternative defines for the SGE Direction bit.
72*4882a593Smuzhiyun  * 08-11-10  02.00.17  Bumped MPI2_HEADER_VERSION_UNIT.
73*4882a593Smuzhiyun  * 11-10-10  02.00.18  Bumped MPI2_HEADER_VERSION_UNIT.
74*4882a593Smuzhiyun  *                     Added MPI2_IEEE_SGE_FLAGS_SYSTEMPLBCPI_ADDR define.
75*4882a593Smuzhiyun  * 02-23-11  02.00.19  Bumped MPI2_HEADER_VERSION_UNIT.
76*4882a593Smuzhiyun  *                     Added MPI2_FUNCTION_SEND_HOST_MESSAGE.
77*4882a593Smuzhiyun  * 03-09-11  02.00.20  Bumped MPI2_HEADER_VERSION_UNIT.
78*4882a593Smuzhiyun  * 05-25-11  02.00.21  Bumped MPI2_HEADER_VERSION_UNIT.
79*4882a593Smuzhiyun  * 08-24-11  02.00.22  Bumped MPI2_HEADER_VERSION_UNIT.
80*4882a593Smuzhiyun  * 11-18-11  02.00.23  Bumped MPI2_HEADER_VERSION_UNIT.
81*4882a593Smuzhiyun  *                     Incorporating additions for MPI v2.5.
82*4882a593Smuzhiyun  * 02-06-12  02.00.24  Bumped MPI2_HEADER_VERSION_UNIT.
83*4882a593Smuzhiyun  * 03-29-12  02.00.25  Bumped MPI2_HEADER_VERSION_UNIT.
84*4882a593Smuzhiyun  *                     Added Hard Reset delay timings.
85*4882a593Smuzhiyun  * 07-10-12  02.00.26  Bumped MPI2_HEADER_VERSION_UNIT.
86*4882a593Smuzhiyun  * 07-26-12  02.00.27  Bumped MPI2_HEADER_VERSION_UNIT.
87*4882a593Smuzhiyun  * 11-27-12  02.00.28  Bumped MPI2_HEADER_VERSION_UNIT.
88*4882a593Smuzhiyun  * 12-20-12  02.00.29  Bumped MPI2_HEADER_VERSION_UNIT.
89*4882a593Smuzhiyun  *                     Added MPI25_SUP_REPLY_POST_HOST_INDEX_OFFSET.
90*4882a593Smuzhiyun  * 04-09-13  02.00.30  Bumped MPI2_HEADER_VERSION_UNIT.
91*4882a593Smuzhiyun  * 04-17-13  02.00.31  Bumped MPI2_HEADER_VERSION_UNIT.
92*4882a593Smuzhiyun  * 08-19-13  02.00.32  Bumped MPI2_HEADER_VERSION_UNIT.
93*4882a593Smuzhiyun  * 12-05-13  02.00.33  Bumped MPI2_HEADER_VERSION_UNIT.
94*4882a593Smuzhiyun  * 01-08-14  02.00.34  Bumped MPI2_HEADER_VERSION_UNIT
95*4882a593Smuzhiyun  * 06-13-14  02.00.35  Bumped MPI2_HEADER_VERSION_UNIT.
96*4882a593Smuzhiyun  * 11-18-14  02.00.36  Updated copyright information.
97*4882a593Smuzhiyun  *                     Bumped MPI2_HEADER_VERSION_UNIT.
98*4882a593Smuzhiyun  * 03-16-15  02.00.37  Bumped MPI2_HEADER_VERSION_UNIT.
99*4882a593Smuzhiyun  *                     Added Scratchpad registers to
100*4882a593Smuzhiyun  *                     MPI2_SYSTEM_INTERFACE_REGS.
101*4882a593Smuzhiyun  *                     Added MPI2_DIAG_SBR_RELOAD.
102*4882a593Smuzhiyun  * 03-19-15  02.00.38  Bumped MPI2_HEADER_VERSION_UNIT.
103*4882a593Smuzhiyun  * 05-25-15  02.00.39  Bumped MPI2_HEADER_VERSION_UNIT.
104*4882a593Smuzhiyun  * 08-25-15  02.00.40  Bumped MPI2_HEADER_VERSION_UNIT.
105*4882a593Smuzhiyun  * 12-15-15  02.00.41  Bumped MPI_HEADER_VERSION_UNIT
106*4882a593Smuzhiyun  * 01-01-16  02.00.42  Bumped MPI_HEADER_VERSION_UNIT
107*4882a593Smuzhiyun  * 04-05-16  02.00.43  Modified  MPI26_DIAG_BOOT_DEVICE_SELECT defines
108*4882a593Smuzhiyun  *                     to be unique within first 32 characters.
109*4882a593Smuzhiyun  *                     Removed AHCI support.
110*4882a593Smuzhiyun  *                     Removed SOP support.
111*4882a593Smuzhiyun  *                     Bumped MPI2_HEADER_VERSION_UNIT.
112*4882a593Smuzhiyun  * 04-10-16  02.00.44  Bumped MPI2_HEADER_VERSION_UNIT.
113*4882a593Smuzhiyun  * 07-06-16  02.00.45  Bumped MPI2_HEADER_VERSION_UNIT.
114*4882a593Smuzhiyun  * 09-02-16  02.00.46  Bumped MPI2_HEADER_VERSION_UNIT.
115*4882a593Smuzhiyun  * 11-23-16  02.00.47  Bumped MPI2_HEADER_VERSION_UNIT.
116*4882a593Smuzhiyun  * 02-03-17  02.00.48  Bumped MPI2_HEADER_VERSION_UNIT.
117*4882a593Smuzhiyun  * 06-13-17  02.00.49  Bumped MPI2_HEADER_VERSION_UNIT.
118*4882a593Smuzhiyun  * 09-29-17  02.00.50  Bumped MPI2_HEADER_VERSION_UNIT.
119*4882a593Smuzhiyun  * 07-22-18  02.00.51  Added SECURE_BOOT define.
120*4882a593Smuzhiyun  *                     Bumped MPI2_HEADER_VERSION_UNIT
121*4882a593Smuzhiyun  * 08-15-18  02.00.52  Bumped MPI2_HEADER_VERSION_UNIT.
122*4882a593Smuzhiyun  * 08-28-18  02.00.53  Bumped MPI2_HEADER_VERSION_UNIT.
123*4882a593Smuzhiyun  *                     Added MPI2_IOCSTATUS_FAILURE
124*4882a593Smuzhiyun  * 12-17-18  02.00.54  Bumped MPI2_HEADER_VERSION_UNIT
125*4882a593Smuzhiyun  * 06-24-19  02.00.55  Bumped MPI2_HEADER_VERSION_UNIT
126*4882a593Smuzhiyun  * 08-01-19  02.00.56  Bumped MPI2_HEADER_VERSION_UNIT
127*4882a593Smuzhiyun  * 10-02-19  02.00.57  Bumped MPI2_HEADER_VERSION_UNIT
128*4882a593Smuzhiyun  *  --------------------------------------------------------------------------
129*4882a593Smuzhiyun  */
130*4882a593Smuzhiyun 
131*4882a593Smuzhiyun #ifndef MPI2_H
132*4882a593Smuzhiyun #define MPI2_H
133*4882a593Smuzhiyun 
134*4882a593Smuzhiyun /*****************************************************************************
135*4882a593Smuzhiyun *
136*4882a593Smuzhiyun *       MPI Version Definitions
137*4882a593Smuzhiyun *
138*4882a593Smuzhiyun *****************************************************************************/
139*4882a593Smuzhiyun 
140*4882a593Smuzhiyun #define MPI2_VERSION_MAJOR_MASK             (0xFF00)
141*4882a593Smuzhiyun #define MPI2_VERSION_MAJOR_SHIFT            (8)
142*4882a593Smuzhiyun #define MPI2_VERSION_MINOR_MASK             (0x00FF)
143*4882a593Smuzhiyun #define MPI2_VERSION_MINOR_SHIFT            (0)
144*4882a593Smuzhiyun 
145*4882a593Smuzhiyun /*major version for all MPI v2.x */
146*4882a593Smuzhiyun #define MPI2_VERSION_MAJOR                  (0x02)
147*4882a593Smuzhiyun 
148*4882a593Smuzhiyun /*minor version for MPI v2.0 compatible products */
149*4882a593Smuzhiyun #define MPI2_VERSION_MINOR                  (0x00)
150*4882a593Smuzhiyun #define MPI2_VERSION ((MPI2_VERSION_MAJOR << MPI2_VERSION_MAJOR_SHIFT) | \
151*4882a593Smuzhiyun 					MPI2_VERSION_MINOR)
152*4882a593Smuzhiyun #define MPI2_VERSION_02_00                  (0x0200)
153*4882a593Smuzhiyun 
154*4882a593Smuzhiyun /*minor version for MPI v2.5 compatible products */
155*4882a593Smuzhiyun #define MPI25_VERSION_MINOR                 (0x05)
156*4882a593Smuzhiyun #define MPI25_VERSION ((MPI2_VERSION_MAJOR << MPI2_VERSION_MAJOR_SHIFT) | \
157*4882a593Smuzhiyun 					MPI25_VERSION_MINOR)
158*4882a593Smuzhiyun #define MPI2_VERSION_02_05                  (0x0205)
159*4882a593Smuzhiyun 
160*4882a593Smuzhiyun /*minor version for MPI v2.6 compatible products */
161*4882a593Smuzhiyun #define MPI26_VERSION_MINOR		    (0x06)
162*4882a593Smuzhiyun #define MPI26_VERSION ((MPI2_VERSION_MAJOR << MPI2_VERSION_MAJOR_SHIFT) | \
163*4882a593Smuzhiyun 					MPI26_VERSION_MINOR)
164*4882a593Smuzhiyun #define MPI2_VERSION_02_06		    (0x0206)
165*4882a593Smuzhiyun 
166*4882a593Smuzhiyun 
167*4882a593Smuzhiyun /* Unit and Dev versioning for this MPI header set */
168*4882a593Smuzhiyun #define MPI2_HEADER_VERSION_UNIT            (0x39)
169*4882a593Smuzhiyun #define MPI2_HEADER_VERSION_DEV             (0x00)
170*4882a593Smuzhiyun #define MPI2_HEADER_VERSION_UNIT_MASK       (0xFF00)
171*4882a593Smuzhiyun #define MPI2_HEADER_VERSION_UNIT_SHIFT      (8)
172*4882a593Smuzhiyun #define MPI2_HEADER_VERSION_DEV_MASK        (0x00FF)
173*4882a593Smuzhiyun #define MPI2_HEADER_VERSION_DEV_SHIFT       (0)
174*4882a593Smuzhiyun #define MPI2_HEADER_VERSION ((MPI2_HEADER_VERSION_UNIT << 8) | \
175*4882a593Smuzhiyun 					MPI2_HEADER_VERSION_DEV)
176*4882a593Smuzhiyun 
177*4882a593Smuzhiyun /*****************************************************************************
178*4882a593Smuzhiyun *
179*4882a593Smuzhiyun *       IOC State Definitions
180*4882a593Smuzhiyun *
181*4882a593Smuzhiyun *****************************************************************************/
182*4882a593Smuzhiyun 
183*4882a593Smuzhiyun #define MPI2_IOC_STATE_RESET               (0x00000000)
184*4882a593Smuzhiyun #define MPI2_IOC_STATE_READY               (0x10000000)
185*4882a593Smuzhiyun #define MPI2_IOC_STATE_OPERATIONAL         (0x20000000)
186*4882a593Smuzhiyun #define MPI2_IOC_STATE_FAULT               (0x40000000)
187*4882a593Smuzhiyun #define MPI2_IOC_STATE_COREDUMP            (0x50000000)
188*4882a593Smuzhiyun 
189*4882a593Smuzhiyun #define MPI2_IOC_STATE_MASK                (0xF0000000)
190*4882a593Smuzhiyun #define MPI2_IOC_STATE_SHIFT               (28)
191*4882a593Smuzhiyun 
192*4882a593Smuzhiyun /*Fault state range for prodcut specific codes */
193*4882a593Smuzhiyun #define MPI2_FAULT_PRODUCT_SPECIFIC_MIN                 (0x0000)
194*4882a593Smuzhiyun #define MPI2_FAULT_PRODUCT_SPECIFIC_MAX                 (0xEFFF)
195*4882a593Smuzhiyun 
196*4882a593Smuzhiyun /*****************************************************************************
197*4882a593Smuzhiyun *
198*4882a593Smuzhiyun *       System Interface Register Definitions
199*4882a593Smuzhiyun *
200*4882a593Smuzhiyun *****************************************************************************/
201*4882a593Smuzhiyun 
202*4882a593Smuzhiyun typedef volatile struct _MPI2_SYSTEM_INTERFACE_REGS {
203*4882a593Smuzhiyun 	U32 Doorbell;		/*0x00 */
204*4882a593Smuzhiyun 	U32 WriteSequence;	/*0x04 */
205*4882a593Smuzhiyun 	U32 HostDiagnostic;	/*0x08 */
206*4882a593Smuzhiyun 	U32 Reserved1;		/*0x0C */
207*4882a593Smuzhiyun 	U32 DiagRWData;		/*0x10 */
208*4882a593Smuzhiyun 	U32 DiagRWAddressLow;	/*0x14 */
209*4882a593Smuzhiyun 	U32 DiagRWAddressHigh;	/*0x18 */
210*4882a593Smuzhiyun 	U32 Reserved2[5];	/*0x1C */
211*4882a593Smuzhiyun 	U32 HostInterruptStatus;	/*0x30 */
212*4882a593Smuzhiyun 	U32 HostInterruptMask;	/*0x34 */
213*4882a593Smuzhiyun 	U32 DCRData;		/*0x38 */
214*4882a593Smuzhiyun 	U32 DCRAddress;		/*0x3C */
215*4882a593Smuzhiyun 	U32 Reserved3[2];	/*0x40 */
216*4882a593Smuzhiyun 	U32 ReplyFreeHostIndex;	/*0x48 */
217*4882a593Smuzhiyun 	U32 Reserved4[8];	/*0x4C */
218*4882a593Smuzhiyun 	U32 ReplyPostHostIndex;	/*0x6C */
219*4882a593Smuzhiyun 	U32 Reserved5;		/*0x70 */
220*4882a593Smuzhiyun 	U32 HCBSize;		/*0x74 */
221*4882a593Smuzhiyun 	U32 HCBAddressLow;	/*0x78 */
222*4882a593Smuzhiyun 	U32 HCBAddressHigh;	/*0x7C */
223*4882a593Smuzhiyun 	U32 Reserved6[12];	/*0x80 */
224*4882a593Smuzhiyun 	U32 Scratchpad[4];	/*0xB0 */
225*4882a593Smuzhiyun 	U32 RequestDescriptorPostLow;	/*0xC0 */
226*4882a593Smuzhiyun 	U32 RequestDescriptorPostHigh;	/*0xC4 */
227*4882a593Smuzhiyun 	U32 AtomicRequestDescriptorPost;/*0xC8 */
228*4882a593Smuzhiyun 	U32 Reserved7[13];	/*0xCC */
229*4882a593Smuzhiyun } MPI2_SYSTEM_INTERFACE_REGS,
230*4882a593Smuzhiyun 	*PTR_MPI2_SYSTEM_INTERFACE_REGS,
231*4882a593Smuzhiyun 	Mpi2SystemInterfaceRegs_t,
232*4882a593Smuzhiyun 	*pMpi2SystemInterfaceRegs_t;
233*4882a593Smuzhiyun 
234*4882a593Smuzhiyun /*
235*4882a593Smuzhiyun  *Defines for working with the Doorbell register.
236*4882a593Smuzhiyun  */
237*4882a593Smuzhiyun #define MPI2_DOORBELL_OFFSET                    (0x00000000)
238*4882a593Smuzhiyun 
239*4882a593Smuzhiyun /*IOC --> System values */
240*4882a593Smuzhiyun #define MPI2_DOORBELL_USED                      (0x08000000)
241*4882a593Smuzhiyun #define MPI2_DOORBELL_WHO_INIT_MASK             (0x07000000)
242*4882a593Smuzhiyun #define MPI2_DOORBELL_WHO_INIT_SHIFT            (24)
243*4882a593Smuzhiyun #define MPI2_DOORBELL_FAULT_CODE_MASK           (0x0000FFFF)
244*4882a593Smuzhiyun #define MPI2_DOORBELL_DATA_MASK                 (0x0000FFFF)
245*4882a593Smuzhiyun 
246*4882a593Smuzhiyun /*System --> IOC values */
247*4882a593Smuzhiyun #define MPI2_DOORBELL_FUNCTION_MASK             (0xFF000000)
248*4882a593Smuzhiyun #define MPI2_DOORBELL_FUNCTION_SHIFT            (24)
249*4882a593Smuzhiyun #define MPI2_DOORBELL_ADD_DWORDS_MASK           (0x00FF0000)
250*4882a593Smuzhiyun #define MPI2_DOORBELL_ADD_DWORDS_SHIFT          (16)
251*4882a593Smuzhiyun 
252*4882a593Smuzhiyun /*
253*4882a593Smuzhiyun  *Defines for the WriteSequence register
254*4882a593Smuzhiyun  */
255*4882a593Smuzhiyun #define MPI2_WRITE_SEQUENCE_OFFSET              (0x00000004)
256*4882a593Smuzhiyun #define MPI2_WRSEQ_KEY_VALUE_MASK               (0x0000000F)
257*4882a593Smuzhiyun #define MPI2_WRSEQ_FLUSH_KEY_VALUE              (0x0)
258*4882a593Smuzhiyun #define MPI2_WRSEQ_1ST_KEY_VALUE                (0xF)
259*4882a593Smuzhiyun #define MPI2_WRSEQ_2ND_KEY_VALUE                (0x4)
260*4882a593Smuzhiyun #define MPI2_WRSEQ_3RD_KEY_VALUE                (0xB)
261*4882a593Smuzhiyun #define MPI2_WRSEQ_4TH_KEY_VALUE                (0x2)
262*4882a593Smuzhiyun #define MPI2_WRSEQ_5TH_KEY_VALUE                (0x7)
263*4882a593Smuzhiyun #define MPI2_WRSEQ_6TH_KEY_VALUE                (0xD)
264*4882a593Smuzhiyun 
265*4882a593Smuzhiyun /*
266*4882a593Smuzhiyun  *Defines for the HostDiagnostic register
267*4882a593Smuzhiyun  */
268*4882a593Smuzhiyun #define MPI2_HOST_DIAGNOSTIC_OFFSET             (0x00000008)
269*4882a593Smuzhiyun 
270*4882a593Smuzhiyun #define MPI26_DIAG_SECURE_BOOT                  (0x80000000)
271*4882a593Smuzhiyun 
272*4882a593Smuzhiyun #define MPI2_DIAG_SBR_RELOAD                    (0x00002000)
273*4882a593Smuzhiyun 
274*4882a593Smuzhiyun #define MPI2_DIAG_BOOT_DEVICE_SELECT_MASK       (0x00001800)
275*4882a593Smuzhiyun #define MPI2_DIAG_BOOT_DEVICE_SELECT_DEFAULT    (0x00000000)
276*4882a593Smuzhiyun #define MPI2_DIAG_BOOT_DEVICE_SELECT_HCDW       (0x00000800)
277*4882a593Smuzhiyun 
278*4882a593Smuzhiyun /* Defines for V7A/V7R HostDiagnostic Register */
279*4882a593Smuzhiyun #define MPI26_DIAG_BOOT_DEVICE_SEL_64FLASH      (0x00000000)
280*4882a593Smuzhiyun #define MPI26_DIAG_BOOT_DEVICE_SEL_64HCDW       (0x00000800)
281*4882a593Smuzhiyun #define MPI26_DIAG_BOOT_DEVICE_SEL_32FLASH      (0x00001000)
282*4882a593Smuzhiyun #define MPI26_DIAG_BOOT_DEVICE_SEL_32HCDW       (0x00001800)
283*4882a593Smuzhiyun 
284*4882a593Smuzhiyun #define MPI2_DIAG_CLEAR_FLASH_BAD_SIG           (0x00000400)
285*4882a593Smuzhiyun #define MPI2_DIAG_FORCE_HCB_ON_RESET            (0x00000200)
286*4882a593Smuzhiyun #define MPI2_DIAG_HCB_MODE                      (0x00000100)
287*4882a593Smuzhiyun #define MPI2_DIAG_DIAG_WRITE_ENABLE             (0x00000080)
288*4882a593Smuzhiyun #define MPI2_DIAG_FLASH_BAD_SIG                 (0x00000040)
289*4882a593Smuzhiyun #define MPI2_DIAG_RESET_HISTORY                 (0x00000020)
290*4882a593Smuzhiyun #define MPI2_DIAG_DIAG_RW_ENABLE                (0x00000010)
291*4882a593Smuzhiyun #define MPI2_DIAG_RESET_ADAPTER                 (0x00000004)
292*4882a593Smuzhiyun #define MPI2_DIAG_HOLD_IOC_RESET                (0x00000002)
293*4882a593Smuzhiyun 
294*4882a593Smuzhiyun /*
295*4882a593Smuzhiyun  *Offsets for DiagRWData and address
296*4882a593Smuzhiyun  */
297*4882a593Smuzhiyun #define MPI2_DIAG_RW_DATA_OFFSET                (0x00000010)
298*4882a593Smuzhiyun #define MPI2_DIAG_RW_ADDRESS_LOW_OFFSET         (0x00000014)
299*4882a593Smuzhiyun #define MPI2_DIAG_RW_ADDRESS_HIGH_OFFSET        (0x00000018)
300*4882a593Smuzhiyun 
301*4882a593Smuzhiyun /*
302*4882a593Smuzhiyun  *Defines for the HostInterruptStatus register
303*4882a593Smuzhiyun  */
304*4882a593Smuzhiyun #define MPI2_HOST_INTERRUPT_STATUS_OFFSET       (0x00000030)
305*4882a593Smuzhiyun #define MPI2_HIS_SYS2IOC_DB_STATUS              (0x80000000)
306*4882a593Smuzhiyun #define MPI2_HIS_IOP_DOORBELL_STATUS MPI2_HIS_SYS2IOC_DB_STATUS
307*4882a593Smuzhiyun #define MPI2_HIS_RESET_IRQ_STATUS               (0x40000000)
308*4882a593Smuzhiyun #define MPI2_HIS_REPLY_DESCRIPTOR_INTERRUPT     (0x00000008)
309*4882a593Smuzhiyun #define MPI2_HIS_IOC2SYS_DB_STATUS              (0x00000001)
310*4882a593Smuzhiyun #define MPI2_HIS_DOORBELL_INTERRUPT MPI2_HIS_IOC2SYS_DB_STATUS
311*4882a593Smuzhiyun 
312*4882a593Smuzhiyun /*
313*4882a593Smuzhiyun  *Defines for the HostInterruptMask register
314*4882a593Smuzhiyun  */
315*4882a593Smuzhiyun #define MPI2_HOST_INTERRUPT_MASK_OFFSET         (0x00000034)
316*4882a593Smuzhiyun #define MPI2_HIM_RESET_IRQ_MASK                 (0x40000000)
317*4882a593Smuzhiyun #define MPI2_HIM_REPLY_INT_MASK                 (0x00000008)
318*4882a593Smuzhiyun #define MPI2_HIM_RIM                            MPI2_HIM_REPLY_INT_MASK
319*4882a593Smuzhiyun #define MPI2_HIM_IOC2SYS_DB_MASK                (0x00000001)
320*4882a593Smuzhiyun #define MPI2_HIM_DIM                            MPI2_HIM_IOC2SYS_DB_MASK
321*4882a593Smuzhiyun 
322*4882a593Smuzhiyun /*
323*4882a593Smuzhiyun  *Offsets for DCRData and address
324*4882a593Smuzhiyun  */
325*4882a593Smuzhiyun #define MPI2_DCR_DATA_OFFSET                    (0x00000038)
326*4882a593Smuzhiyun #define MPI2_DCR_ADDRESS_OFFSET                 (0x0000003C)
327*4882a593Smuzhiyun 
328*4882a593Smuzhiyun /*
329*4882a593Smuzhiyun  *Offset for the Reply Free Queue
330*4882a593Smuzhiyun  */
331*4882a593Smuzhiyun #define MPI2_REPLY_FREE_HOST_INDEX_OFFSET       (0x00000048)
332*4882a593Smuzhiyun 
333*4882a593Smuzhiyun /*
334*4882a593Smuzhiyun  *Defines for the Reply Descriptor Post Queue
335*4882a593Smuzhiyun  */
336*4882a593Smuzhiyun #define MPI2_REPLY_POST_HOST_INDEX_OFFSET       (0x0000006C)
337*4882a593Smuzhiyun #define MPI2_REPLY_POST_HOST_INDEX_MASK         (0x00FFFFFF)
338*4882a593Smuzhiyun #define MPI2_RPHI_MSIX_INDEX_MASK               (0xFF000000)
339*4882a593Smuzhiyun #define MPI2_RPHI_MSIX_INDEX_SHIFT              (24)
340*4882a593Smuzhiyun #define MPI25_SUP_REPLY_POST_HOST_INDEX_OFFSET  (0x0000030C) /*MPI v2.5 only*/
341*4882a593Smuzhiyun 
342*4882a593Smuzhiyun 
343*4882a593Smuzhiyun /*
344*4882a593Smuzhiyun  *Defines for the HCBSize and address
345*4882a593Smuzhiyun  */
346*4882a593Smuzhiyun #define MPI2_HCB_SIZE_OFFSET                    (0x00000074)
347*4882a593Smuzhiyun #define MPI2_HCB_SIZE_SIZE_MASK                 (0xFFFFF000)
348*4882a593Smuzhiyun #define MPI2_HCB_SIZE_HCB_ENABLE                (0x00000001)
349*4882a593Smuzhiyun 
350*4882a593Smuzhiyun #define MPI2_HCB_ADDRESS_LOW_OFFSET             (0x00000078)
351*4882a593Smuzhiyun #define MPI2_HCB_ADDRESS_HIGH_OFFSET            (0x0000007C)
352*4882a593Smuzhiyun 
353*4882a593Smuzhiyun /*
354*4882a593Smuzhiyun  *Offsets for the Scratchpad registers
355*4882a593Smuzhiyun  */
356*4882a593Smuzhiyun #define MPI26_SCRATCHPAD0_OFFSET                (0x000000B0)
357*4882a593Smuzhiyun #define MPI26_SCRATCHPAD1_OFFSET                (0x000000B4)
358*4882a593Smuzhiyun #define MPI26_SCRATCHPAD2_OFFSET                (0x000000B8)
359*4882a593Smuzhiyun #define MPI26_SCRATCHPAD3_OFFSET                (0x000000BC)
360*4882a593Smuzhiyun 
361*4882a593Smuzhiyun /*
362*4882a593Smuzhiyun  *Offsets for the Request Descriptor Post Queue
363*4882a593Smuzhiyun  */
364*4882a593Smuzhiyun #define MPI2_REQUEST_DESCRIPTOR_POST_LOW_OFFSET     (0x000000C0)
365*4882a593Smuzhiyun #define MPI2_REQUEST_DESCRIPTOR_POST_HIGH_OFFSET    (0x000000C4)
366*4882a593Smuzhiyun #define MPI26_ATOMIC_REQUEST_DESCRIPTOR_POST_OFFSET (0x000000C8)
367*4882a593Smuzhiyun 
368*4882a593Smuzhiyun /*Hard Reset delay timings */
369*4882a593Smuzhiyun #define MPI2_HARD_RESET_PCIE_FIRST_READ_DELAY_MICRO_SEC     (50000)
370*4882a593Smuzhiyun #define MPI2_HARD_RESET_PCIE_RESET_READ_WINDOW_MICRO_SEC    (255000)
371*4882a593Smuzhiyun #define MPI2_HARD_RESET_PCIE_SECOND_READ_DELAY_MICRO_SEC    (256000)
372*4882a593Smuzhiyun 
373*4882a593Smuzhiyun /*****************************************************************************
374*4882a593Smuzhiyun *
375*4882a593Smuzhiyun *       Message Descriptors
376*4882a593Smuzhiyun *
377*4882a593Smuzhiyun *****************************************************************************/
378*4882a593Smuzhiyun 
379*4882a593Smuzhiyun /*Request Descriptors */
380*4882a593Smuzhiyun 
381*4882a593Smuzhiyun /*Default Request Descriptor */
382*4882a593Smuzhiyun typedef struct _MPI2_DEFAULT_REQUEST_DESCRIPTOR {
383*4882a593Smuzhiyun 	U8 RequestFlags;	/*0x00 */
384*4882a593Smuzhiyun 	U8 MSIxIndex;		/*0x01 */
385*4882a593Smuzhiyun 	U16 SMID;		/*0x02 */
386*4882a593Smuzhiyun 	U16 LMID;		/*0x04 */
387*4882a593Smuzhiyun 	U16 DescriptorTypeDependent;	/*0x06 */
388*4882a593Smuzhiyun } MPI2_DEFAULT_REQUEST_DESCRIPTOR,
389*4882a593Smuzhiyun 	*PTR_MPI2_DEFAULT_REQUEST_DESCRIPTOR,
390*4882a593Smuzhiyun 	Mpi2DefaultRequestDescriptor_t,
391*4882a593Smuzhiyun 	*pMpi2DefaultRequestDescriptor_t;
392*4882a593Smuzhiyun 
393*4882a593Smuzhiyun /*defines for the RequestFlags field */
394*4882a593Smuzhiyun #define MPI2_REQ_DESCRIPT_FLAGS_TYPE_MASK               (0x1E)
395*4882a593Smuzhiyun #define MPI2_REQ_DESCRIPT_FLAGS_TYPE_RSHIFT             (1)
396*4882a593Smuzhiyun #define MPI2_REQ_DESCRIPT_FLAGS_SCSI_IO                 (0x00)
397*4882a593Smuzhiyun #define MPI2_REQ_DESCRIPT_FLAGS_SCSI_TARGET             (0x02)
398*4882a593Smuzhiyun #define MPI2_REQ_DESCRIPT_FLAGS_HIGH_PRIORITY           (0x06)
399*4882a593Smuzhiyun #define MPI2_REQ_DESCRIPT_FLAGS_DEFAULT_TYPE            (0x08)
400*4882a593Smuzhiyun #define MPI2_REQ_DESCRIPT_FLAGS_RAID_ACCELERATOR        (0x0A)
401*4882a593Smuzhiyun #define MPI25_REQ_DESCRIPT_FLAGS_FAST_PATH_SCSI_IO      (0x0C)
402*4882a593Smuzhiyun #define MPI26_REQ_DESCRIPT_FLAGS_PCIE_ENCAPSULATED      (0x10)
403*4882a593Smuzhiyun 
404*4882a593Smuzhiyun #define MPI2_REQ_DESCRIPT_FLAGS_IOC_FIFO_MARKER         (0x01)
405*4882a593Smuzhiyun 
406*4882a593Smuzhiyun /*High Priority Request Descriptor */
407*4882a593Smuzhiyun typedef struct _MPI2_HIGH_PRIORITY_REQUEST_DESCRIPTOR {
408*4882a593Smuzhiyun 	U8 RequestFlags;	/*0x00 */
409*4882a593Smuzhiyun 	U8 MSIxIndex;		/*0x01 */
410*4882a593Smuzhiyun 	U16 SMID;		/*0x02 */
411*4882a593Smuzhiyun 	U16 LMID;		/*0x04 */
412*4882a593Smuzhiyun 	U16 Reserved1;		/*0x06 */
413*4882a593Smuzhiyun } MPI2_HIGH_PRIORITY_REQUEST_DESCRIPTOR,
414*4882a593Smuzhiyun 	*PTR_MPI2_HIGH_PRIORITY_REQUEST_DESCRIPTOR,
415*4882a593Smuzhiyun 	Mpi2HighPriorityRequestDescriptor_t,
416*4882a593Smuzhiyun 	*pMpi2HighPriorityRequestDescriptor_t;
417*4882a593Smuzhiyun 
418*4882a593Smuzhiyun /*SCSI IO Request Descriptor */
419*4882a593Smuzhiyun typedef struct _MPI2_SCSI_IO_REQUEST_DESCRIPTOR {
420*4882a593Smuzhiyun 	U8 RequestFlags;	/*0x00 */
421*4882a593Smuzhiyun 	U8 MSIxIndex;		/*0x01 */
422*4882a593Smuzhiyun 	U16 SMID;		/*0x02 */
423*4882a593Smuzhiyun 	U16 LMID;		/*0x04 */
424*4882a593Smuzhiyun 	U16 DevHandle;		/*0x06 */
425*4882a593Smuzhiyun } MPI2_SCSI_IO_REQUEST_DESCRIPTOR,
426*4882a593Smuzhiyun 	*PTR_MPI2_SCSI_IO_REQUEST_DESCRIPTOR,
427*4882a593Smuzhiyun 	Mpi2SCSIIORequestDescriptor_t,
428*4882a593Smuzhiyun 	*pMpi2SCSIIORequestDescriptor_t;
429*4882a593Smuzhiyun 
430*4882a593Smuzhiyun /*SCSI Target Request Descriptor */
431*4882a593Smuzhiyun typedef struct _MPI2_SCSI_TARGET_REQUEST_DESCRIPTOR {
432*4882a593Smuzhiyun 	U8 RequestFlags;	/*0x00 */
433*4882a593Smuzhiyun 	U8 MSIxIndex;		/*0x01 */
434*4882a593Smuzhiyun 	U16 SMID;		/*0x02 */
435*4882a593Smuzhiyun 	U16 LMID;		/*0x04 */
436*4882a593Smuzhiyun 	U16 IoIndex;		/*0x06 */
437*4882a593Smuzhiyun } MPI2_SCSI_TARGET_REQUEST_DESCRIPTOR,
438*4882a593Smuzhiyun 	*PTR_MPI2_SCSI_TARGET_REQUEST_DESCRIPTOR,
439*4882a593Smuzhiyun 	Mpi2SCSITargetRequestDescriptor_t,
440*4882a593Smuzhiyun 	*pMpi2SCSITargetRequestDescriptor_t;
441*4882a593Smuzhiyun 
442*4882a593Smuzhiyun /*RAID Accelerator Request Descriptor */
443*4882a593Smuzhiyun typedef struct _MPI2_RAID_ACCEL_REQUEST_DESCRIPTOR {
444*4882a593Smuzhiyun 	U8 RequestFlags;	/*0x00 */
445*4882a593Smuzhiyun 	U8 MSIxIndex;		/*0x01 */
446*4882a593Smuzhiyun 	U16 SMID;		/*0x02 */
447*4882a593Smuzhiyun 	U16 LMID;		/*0x04 */
448*4882a593Smuzhiyun 	U16 Reserved;		/*0x06 */
449*4882a593Smuzhiyun } MPI2_RAID_ACCEL_REQUEST_DESCRIPTOR,
450*4882a593Smuzhiyun 	*PTR_MPI2_RAID_ACCEL_REQUEST_DESCRIPTOR,
451*4882a593Smuzhiyun 	Mpi2RAIDAcceleratorRequestDescriptor_t,
452*4882a593Smuzhiyun 	*pMpi2RAIDAcceleratorRequestDescriptor_t;
453*4882a593Smuzhiyun 
454*4882a593Smuzhiyun /*Fast Path SCSI IO Request Descriptor */
455*4882a593Smuzhiyun typedef MPI2_SCSI_IO_REQUEST_DESCRIPTOR
456*4882a593Smuzhiyun 	MPI25_FP_SCSI_IO_REQUEST_DESCRIPTOR,
457*4882a593Smuzhiyun 	*PTR_MPI25_FP_SCSI_IO_REQUEST_DESCRIPTOR,
458*4882a593Smuzhiyun 	Mpi25FastPathSCSIIORequestDescriptor_t,
459*4882a593Smuzhiyun 	*pMpi25FastPathSCSIIORequestDescriptor_t;
460*4882a593Smuzhiyun 
461*4882a593Smuzhiyun /*PCIe Encapsulated Request Descriptor */
462*4882a593Smuzhiyun typedef MPI2_SCSI_IO_REQUEST_DESCRIPTOR
463*4882a593Smuzhiyun 	MPI26_PCIE_ENCAPSULATED_REQUEST_DESCRIPTOR,
464*4882a593Smuzhiyun 	*PTR_MPI26_PCIE_ENCAPSULATED_REQUEST_DESCRIPTOR,
465*4882a593Smuzhiyun 	Mpi26PCIeEncapsulatedRequestDescriptor_t,
466*4882a593Smuzhiyun 	*pMpi26PCIeEncapsulatedRequestDescriptor_t;
467*4882a593Smuzhiyun 
468*4882a593Smuzhiyun /*union of Request Descriptors */
469*4882a593Smuzhiyun typedef union _MPI2_REQUEST_DESCRIPTOR_UNION {
470*4882a593Smuzhiyun 	MPI2_DEFAULT_REQUEST_DESCRIPTOR Default;
471*4882a593Smuzhiyun 	MPI2_HIGH_PRIORITY_REQUEST_DESCRIPTOR HighPriority;
472*4882a593Smuzhiyun 	MPI2_SCSI_IO_REQUEST_DESCRIPTOR SCSIIO;
473*4882a593Smuzhiyun 	MPI2_SCSI_TARGET_REQUEST_DESCRIPTOR SCSITarget;
474*4882a593Smuzhiyun 	MPI2_RAID_ACCEL_REQUEST_DESCRIPTOR RAIDAccelerator;
475*4882a593Smuzhiyun 	MPI25_FP_SCSI_IO_REQUEST_DESCRIPTOR FastPathSCSIIO;
476*4882a593Smuzhiyun 	MPI26_PCIE_ENCAPSULATED_REQUEST_DESCRIPTOR PCIeEncapsulated;
477*4882a593Smuzhiyun 	U64 Words;
478*4882a593Smuzhiyun } MPI2_REQUEST_DESCRIPTOR_UNION,
479*4882a593Smuzhiyun 	*PTR_MPI2_REQUEST_DESCRIPTOR_UNION,
480*4882a593Smuzhiyun 	Mpi2RequestDescriptorUnion_t,
481*4882a593Smuzhiyun 	*pMpi2RequestDescriptorUnion_t;
482*4882a593Smuzhiyun 
483*4882a593Smuzhiyun /*Atomic Request Descriptors */
484*4882a593Smuzhiyun 
485*4882a593Smuzhiyun /*
486*4882a593Smuzhiyun  * All Atomic Request Descriptors have the same format, so the following
487*4882a593Smuzhiyun  * structure is used for all Atomic Request Descriptors:
488*4882a593Smuzhiyun  *      Atomic Default Request Descriptor
489*4882a593Smuzhiyun  *      Atomic High Priority Request Descriptor
490*4882a593Smuzhiyun  *      Atomic SCSI IO Request Descriptor
491*4882a593Smuzhiyun  *      Atomic SCSI Target Request Descriptor
492*4882a593Smuzhiyun  *      Atomic RAID Accelerator Request Descriptor
493*4882a593Smuzhiyun  *      Atomic Fast Path SCSI IO Request Descriptor
494*4882a593Smuzhiyun  *      Atomic PCIe Encapsulated Request Descriptor
495*4882a593Smuzhiyun  */
496*4882a593Smuzhiyun 
497*4882a593Smuzhiyun /*Atomic Request Descriptor */
498*4882a593Smuzhiyun typedef struct _MPI26_ATOMIC_REQUEST_DESCRIPTOR {
499*4882a593Smuzhiyun 	U8 RequestFlags;	/* 0x00 */
500*4882a593Smuzhiyun 	U8 MSIxIndex;		/* 0x01 */
501*4882a593Smuzhiyun 	U16 SMID;		/* 0x02 */
502*4882a593Smuzhiyun } MPI26_ATOMIC_REQUEST_DESCRIPTOR,
503*4882a593Smuzhiyun 	*PTR_MPI26_ATOMIC_REQUEST_DESCRIPTOR,
504*4882a593Smuzhiyun 	Mpi26AtomicRequestDescriptor_t,
505*4882a593Smuzhiyun 	*pMpi26AtomicRequestDescriptor_t;
506*4882a593Smuzhiyun 
507*4882a593Smuzhiyun /*for the RequestFlags field, use the same
508*4882a593Smuzhiyun  *defines as MPI2_DEFAULT_REQUEST_DESCRIPTOR
509*4882a593Smuzhiyun  */
510*4882a593Smuzhiyun 
511*4882a593Smuzhiyun /*Reply Descriptors */
512*4882a593Smuzhiyun 
513*4882a593Smuzhiyun /*Default Reply Descriptor */
514*4882a593Smuzhiyun typedef struct _MPI2_DEFAULT_REPLY_DESCRIPTOR {
515*4882a593Smuzhiyun 	U8 ReplyFlags;		/*0x00 */
516*4882a593Smuzhiyun 	U8 MSIxIndex;		/*0x01 */
517*4882a593Smuzhiyun 	U16 DescriptorTypeDependent1;	/*0x02 */
518*4882a593Smuzhiyun 	U32 DescriptorTypeDependent2;	/*0x04 */
519*4882a593Smuzhiyun } MPI2_DEFAULT_REPLY_DESCRIPTOR,
520*4882a593Smuzhiyun 	*PTR_MPI2_DEFAULT_REPLY_DESCRIPTOR,
521*4882a593Smuzhiyun 	Mpi2DefaultReplyDescriptor_t,
522*4882a593Smuzhiyun 	*pMpi2DefaultReplyDescriptor_t;
523*4882a593Smuzhiyun 
524*4882a593Smuzhiyun /*defines for the ReplyFlags field */
525*4882a593Smuzhiyun #define MPI2_RPY_DESCRIPT_FLAGS_TYPE_MASK                   (0x0F)
526*4882a593Smuzhiyun #define MPI2_RPY_DESCRIPT_FLAGS_SCSI_IO_SUCCESS             (0x00)
527*4882a593Smuzhiyun #define MPI2_RPY_DESCRIPT_FLAGS_ADDRESS_REPLY               (0x01)
528*4882a593Smuzhiyun #define MPI2_RPY_DESCRIPT_FLAGS_TARGETASSIST_SUCCESS        (0x02)
529*4882a593Smuzhiyun #define MPI2_RPY_DESCRIPT_FLAGS_TARGET_COMMAND_BUFFER       (0x03)
530*4882a593Smuzhiyun #define MPI2_RPY_DESCRIPT_FLAGS_RAID_ACCELERATOR_SUCCESS    (0x05)
531*4882a593Smuzhiyun #define MPI25_RPY_DESCRIPT_FLAGS_FAST_PATH_SCSI_IO_SUCCESS  (0x06)
532*4882a593Smuzhiyun #define MPI26_RPY_DESCRIPT_FLAGS_PCIE_ENCAPSULATED_SUCCESS  (0x08)
533*4882a593Smuzhiyun #define MPI2_RPY_DESCRIPT_FLAGS_UNUSED                      (0x0F)
534*4882a593Smuzhiyun 
535*4882a593Smuzhiyun /*values for marking a reply descriptor as unused */
536*4882a593Smuzhiyun #define MPI2_RPY_DESCRIPT_UNUSED_WORD0_MARK             (0xFFFFFFFF)
537*4882a593Smuzhiyun #define MPI2_RPY_DESCRIPT_UNUSED_WORD1_MARK             (0xFFFFFFFF)
538*4882a593Smuzhiyun 
539*4882a593Smuzhiyun /*Address Reply Descriptor */
540*4882a593Smuzhiyun typedef struct _MPI2_ADDRESS_REPLY_DESCRIPTOR {
541*4882a593Smuzhiyun 	U8 ReplyFlags;		/*0x00 */
542*4882a593Smuzhiyun 	U8 MSIxIndex;		/*0x01 */
543*4882a593Smuzhiyun 	U16 SMID;		/*0x02 */
544*4882a593Smuzhiyun 	U32 ReplyFrameAddress;	/*0x04 */
545*4882a593Smuzhiyun } MPI2_ADDRESS_REPLY_DESCRIPTOR,
546*4882a593Smuzhiyun 	*PTR_MPI2_ADDRESS_REPLY_DESCRIPTOR,
547*4882a593Smuzhiyun 	Mpi2AddressReplyDescriptor_t,
548*4882a593Smuzhiyun 	*pMpi2AddressReplyDescriptor_t;
549*4882a593Smuzhiyun 
550*4882a593Smuzhiyun #define MPI2_ADDRESS_REPLY_SMID_INVALID                 (0x00)
551*4882a593Smuzhiyun 
552*4882a593Smuzhiyun /*SCSI IO Success Reply Descriptor */
553*4882a593Smuzhiyun typedef struct _MPI2_SCSI_IO_SUCCESS_REPLY_DESCRIPTOR {
554*4882a593Smuzhiyun 	U8 ReplyFlags;		/*0x00 */
555*4882a593Smuzhiyun 	U8 MSIxIndex;		/*0x01 */
556*4882a593Smuzhiyun 	U16 SMID;		/*0x02 */
557*4882a593Smuzhiyun 	U16 TaskTag;		/*0x04 */
558*4882a593Smuzhiyun 	U16 Reserved1;		/*0x06 */
559*4882a593Smuzhiyun } MPI2_SCSI_IO_SUCCESS_REPLY_DESCRIPTOR,
560*4882a593Smuzhiyun 	*PTR_MPI2_SCSI_IO_SUCCESS_REPLY_DESCRIPTOR,
561*4882a593Smuzhiyun 	Mpi2SCSIIOSuccessReplyDescriptor_t,
562*4882a593Smuzhiyun 	*pMpi2SCSIIOSuccessReplyDescriptor_t;
563*4882a593Smuzhiyun 
564*4882a593Smuzhiyun /*TargetAssist Success Reply Descriptor */
565*4882a593Smuzhiyun typedef struct _MPI2_TARGETASSIST_SUCCESS_REPLY_DESCRIPTOR {
566*4882a593Smuzhiyun 	U8 ReplyFlags;		/*0x00 */
567*4882a593Smuzhiyun 	U8 MSIxIndex;		/*0x01 */
568*4882a593Smuzhiyun 	U16 SMID;		/*0x02 */
569*4882a593Smuzhiyun 	U8 SequenceNumber;	/*0x04 */
570*4882a593Smuzhiyun 	U8 Reserved1;		/*0x05 */
571*4882a593Smuzhiyun 	U16 IoIndex;		/*0x06 */
572*4882a593Smuzhiyun } MPI2_TARGETASSIST_SUCCESS_REPLY_DESCRIPTOR,
573*4882a593Smuzhiyun 	*PTR_MPI2_TARGETASSIST_SUCCESS_REPLY_DESCRIPTOR,
574*4882a593Smuzhiyun 	Mpi2TargetAssistSuccessReplyDescriptor_t,
575*4882a593Smuzhiyun 	*pMpi2TargetAssistSuccessReplyDescriptor_t;
576*4882a593Smuzhiyun 
577*4882a593Smuzhiyun /*Target Command Buffer Reply Descriptor */
578*4882a593Smuzhiyun typedef struct _MPI2_TARGET_COMMAND_BUFFER_REPLY_DESCRIPTOR {
579*4882a593Smuzhiyun 	U8 ReplyFlags;		/*0x00 */
580*4882a593Smuzhiyun 	U8 MSIxIndex;		/*0x01 */
581*4882a593Smuzhiyun 	U8 VP_ID;		/*0x02 */
582*4882a593Smuzhiyun 	U8 Flags;		/*0x03 */
583*4882a593Smuzhiyun 	U16 InitiatorDevHandle;	/*0x04 */
584*4882a593Smuzhiyun 	U16 IoIndex;		/*0x06 */
585*4882a593Smuzhiyun } MPI2_TARGET_COMMAND_BUFFER_REPLY_DESCRIPTOR,
586*4882a593Smuzhiyun 	*PTR_MPI2_TARGET_COMMAND_BUFFER_REPLY_DESCRIPTOR,
587*4882a593Smuzhiyun 	Mpi2TargetCommandBufferReplyDescriptor_t,
588*4882a593Smuzhiyun 	*pMpi2TargetCommandBufferReplyDescriptor_t;
589*4882a593Smuzhiyun 
590*4882a593Smuzhiyun /*defines for Flags field */
591*4882a593Smuzhiyun #define MPI2_RPY_DESCRIPT_TCB_FLAGS_PHYNUM_MASK     (0x3F)
592*4882a593Smuzhiyun 
593*4882a593Smuzhiyun /*RAID Accelerator Success Reply Descriptor */
594*4882a593Smuzhiyun typedef struct _MPI2_RAID_ACCELERATOR_SUCCESS_REPLY_DESCRIPTOR {
595*4882a593Smuzhiyun 	U8 ReplyFlags;		/*0x00 */
596*4882a593Smuzhiyun 	U8 MSIxIndex;		/*0x01 */
597*4882a593Smuzhiyun 	U16 SMID;		/*0x02 */
598*4882a593Smuzhiyun 	U32 Reserved;		/*0x04 */
599*4882a593Smuzhiyun } MPI2_RAID_ACCELERATOR_SUCCESS_REPLY_DESCRIPTOR,
600*4882a593Smuzhiyun 	*PTR_MPI2_RAID_ACCELERATOR_SUCCESS_REPLY_DESCRIPTOR,
601*4882a593Smuzhiyun 	Mpi2RAIDAcceleratorSuccessReplyDescriptor_t,
602*4882a593Smuzhiyun 	*pMpi2RAIDAcceleratorSuccessReplyDescriptor_t;
603*4882a593Smuzhiyun 
604*4882a593Smuzhiyun /*Fast Path SCSI IO Success Reply Descriptor */
605*4882a593Smuzhiyun typedef MPI2_SCSI_IO_SUCCESS_REPLY_DESCRIPTOR
606*4882a593Smuzhiyun 	MPI25_FP_SCSI_IO_SUCCESS_REPLY_DESCRIPTOR,
607*4882a593Smuzhiyun 	*PTR_MPI25_FP_SCSI_IO_SUCCESS_REPLY_DESCRIPTOR,
608*4882a593Smuzhiyun 	Mpi25FastPathSCSIIOSuccessReplyDescriptor_t,
609*4882a593Smuzhiyun 	*pMpi25FastPathSCSIIOSuccessReplyDescriptor_t;
610*4882a593Smuzhiyun 
611*4882a593Smuzhiyun /*PCIe Encapsulated Success Reply Descriptor */
612*4882a593Smuzhiyun typedef MPI2_RAID_ACCELERATOR_SUCCESS_REPLY_DESCRIPTOR
613*4882a593Smuzhiyun 	MPI26_PCIE_ENCAPSULATED_SUCCESS_REPLY_DESCRIPTOR,
614*4882a593Smuzhiyun 	*PTR_MPI26_PCIE_ENCAPSULATED_SUCCESS_REPLY_DESCRIPTOR,
615*4882a593Smuzhiyun 	Mpi26PCIeEncapsulatedSuccessReplyDescriptor_t,
616*4882a593Smuzhiyun 	*pMpi26PCIeEncapsulatedSuccessReplyDescriptor_t;
617*4882a593Smuzhiyun 
618*4882a593Smuzhiyun /*union of Reply Descriptors */
619*4882a593Smuzhiyun typedef union _MPI2_REPLY_DESCRIPTORS_UNION {
620*4882a593Smuzhiyun 	MPI2_DEFAULT_REPLY_DESCRIPTOR Default;
621*4882a593Smuzhiyun 	MPI2_ADDRESS_REPLY_DESCRIPTOR AddressReply;
622*4882a593Smuzhiyun 	MPI2_SCSI_IO_SUCCESS_REPLY_DESCRIPTOR SCSIIOSuccess;
623*4882a593Smuzhiyun 	MPI2_TARGETASSIST_SUCCESS_REPLY_DESCRIPTOR TargetAssistSuccess;
624*4882a593Smuzhiyun 	MPI2_TARGET_COMMAND_BUFFER_REPLY_DESCRIPTOR TargetCommandBuffer;
625*4882a593Smuzhiyun 	MPI2_RAID_ACCELERATOR_SUCCESS_REPLY_DESCRIPTOR RAIDAcceleratorSuccess;
626*4882a593Smuzhiyun 	MPI25_FP_SCSI_IO_SUCCESS_REPLY_DESCRIPTOR FastPathSCSIIOSuccess;
627*4882a593Smuzhiyun 	MPI26_PCIE_ENCAPSULATED_SUCCESS_REPLY_DESCRIPTOR
628*4882a593Smuzhiyun 						PCIeEncapsulatedSuccess;
629*4882a593Smuzhiyun 	U64 Words;
630*4882a593Smuzhiyun } MPI2_REPLY_DESCRIPTORS_UNION,
631*4882a593Smuzhiyun 	*PTR_MPI2_REPLY_DESCRIPTORS_UNION,
632*4882a593Smuzhiyun 	Mpi2ReplyDescriptorsUnion_t,
633*4882a593Smuzhiyun 	*pMpi2ReplyDescriptorsUnion_t;
634*4882a593Smuzhiyun 
635*4882a593Smuzhiyun /*****************************************************************************
636*4882a593Smuzhiyun *
637*4882a593Smuzhiyun *       Message Functions
638*4882a593Smuzhiyun *
639*4882a593Smuzhiyun *****************************************************************************/
640*4882a593Smuzhiyun 
641*4882a593Smuzhiyun #define MPI2_FUNCTION_SCSI_IO_REQUEST		    (0x00)
642*4882a593Smuzhiyun #define MPI2_FUNCTION_SCSI_TASK_MGMT		    (0x01)
643*4882a593Smuzhiyun #define MPI2_FUNCTION_IOC_INIT                      (0x02)
644*4882a593Smuzhiyun #define MPI2_FUNCTION_IOC_FACTS                     (0x03)
645*4882a593Smuzhiyun #define MPI2_FUNCTION_CONFIG                        (0x04)
646*4882a593Smuzhiyun #define MPI2_FUNCTION_PORT_FACTS                    (0x05)
647*4882a593Smuzhiyun #define MPI2_FUNCTION_PORT_ENABLE                   (0x06)
648*4882a593Smuzhiyun #define MPI2_FUNCTION_EVENT_NOTIFICATION            (0x07)
649*4882a593Smuzhiyun #define MPI2_FUNCTION_EVENT_ACK                     (0x08)
650*4882a593Smuzhiyun #define MPI2_FUNCTION_FW_DOWNLOAD                   (0x09)
651*4882a593Smuzhiyun #define MPI2_FUNCTION_TARGET_ASSIST                 (0x0B)
652*4882a593Smuzhiyun #define MPI2_FUNCTION_TARGET_STATUS_SEND            (0x0C)
653*4882a593Smuzhiyun #define MPI2_FUNCTION_TARGET_MODE_ABORT             (0x0D)
654*4882a593Smuzhiyun #define MPI2_FUNCTION_FW_UPLOAD                     (0x12)
655*4882a593Smuzhiyun #define MPI2_FUNCTION_RAID_ACTION                   (0x15)
656*4882a593Smuzhiyun #define MPI2_FUNCTION_RAID_SCSI_IO_PASSTHROUGH      (0x16)
657*4882a593Smuzhiyun #define MPI2_FUNCTION_TOOLBOX                       (0x17)
658*4882a593Smuzhiyun #define MPI2_FUNCTION_SCSI_ENCLOSURE_PROCESSOR      (0x18)
659*4882a593Smuzhiyun #define MPI2_FUNCTION_SMP_PASSTHROUGH               (0x1A)
660*4882a593Smuzhiyun #define MPI2_FUNCTION_SAS_IO_UNIT_CONTROL           (0x1B)
661*4882a593Smuzhiyun #define MPI2_FUNCTION_IO_UNIT_CONTROL               (0x1B)
662*4882a593Smuzhiyun #define MPI2_FUNCTION_SATA_PASSTHROUGH              (0x1C)
663*4882a593Smuzhiyun #define MPI2_FUNCTION_DIAG_BUFFER_POST              (0x1D)
664*4882a593Smuzhiyun #define MPI2_FUNCTION_DIAG_RELEASE                  (0x1E)
665*4882a593Smuzhiyun #define MPI2_FUNCTION_TARGET_CMD_BUF_BASE_POST      (0x24)
666*4882a593Smuzhiyun #define MPI2_FUNCTION_TARGET_CMD_BUF_LIST_POST      (0x25)
667*4882a593Smuzhiyun #define MPI2_FUNCTION_RAID_ACCELERATOR              (0x2C)
668*4882a593Smuzhiyun #define MPI2_FUNCTION_HOST_BASED_DISCOVERY_ACTION   (0x2F)
669*4882a593Smuzhiyun #define MPI2_FUNCTION_PWR_MGMT_CONTROL              (0x30)
670*4882a593Smuzhiyun #define MPI2_FUNCTION_SEND_HOST_MESSAGE             (0x31)
671*4882a593Smuzhiyun #define MPI2_FUNCTION_NVME_ENCAPSULATED             (0x33)
672*4882a593Smuzhiyun #define MPI2_FUNCTION_MIN_PRODUCT_SPECIFIC          (0xF0)
673*4882a593Smuzhiyun #define MPI2_FUNCTION_MAX_PRODUCT_SPECIFIC          (0xFF)
674*4882a593Smuzhiyun 
675*4882a593Smuzhiyun /*Doorbell functions */
676*4882a593Smuzhiyun #define MPI2_FUNCTION_IOC_MESSAGE_UNIT_RESET        (0x40)
677*4882a593Smuzhiyun #define MPI2_FUNCTION_HANDSHAKE                     (0x42)
678*4882a593Smuzhiyun 
679*4882a593Smuzhiyun /*****************************************************************************
680*4882a593Smuzhiyun *
681*4882a593Smuzhiyun *       IOC Status Values
682*4882a593Smuzhiyun *
683*4882a593Smuzhiyun *****************************************************************************/
684*4882a593Smuzhiyun 
685*4882a593Smuzhiyun /*mask for IOCStatus status value */
686*4882a593Smuzhiyun #define MPI2_IOCSTATUS_MASK                     (0x7FFF)
687*4882a593Smuzhiyun 
688*4882a593Smuzhiyun /****************************************************************************
689*4882a593Smuzhiyun * Common IOCStatus values for all replies
690*4882a593Smuzhiyun ****************************************************************************/
691*4882a593Smuzhiyun 
692*4882a593Smuzhiyun #define MPI2_IOCSTATUS_SUCCESS                      (0x0000)
693*4882a593Smuzhiyun #define MPI2_IOCSTATUS_INVALID_FUNCTION             (0x0001)
694*4882a593Smuzhiyun #define MPI2_IOCSTATUS_BUSY                         (0x0002)
695*4882a593Smuzhiyun #define MPI2_IOCSTATUS_INVALID_SGL                  (0x0003)
696*4882a593Smuzhiyun #define MPI2_IOCSTATUS_INTERNAL_ERROR               (0x0004)
697*4882a593Smuzhiyun #define MPI2_IOCSTATUS_INVALID_VPID                 (0x0005)
698*4882a593Smuzhiyun #define MPI2_IOCSTATUS_INSUFFICIENT_RESOURCES       (0x0006)
699*4882a593Smuzhiyun #define MPI2_IOCSTATUS_INVALID_FIELD                (0x0007)
700*4882a593Smuzhiyun #define MPI2_IOCSTATUS_INVALID_STATE                (0x0008)
701*4882a593Smuzhiyun #define MPI2_IOCSTATUS_OP_STATE_NOT_SUPPORTED       (0x0009)
702*4882a593Smuzhiyun /*MPI v2.6 and later */
703*4882a593Smuzhiyun #define MPI2_IOCSTATUS_INSUFFICIENT_POWER           (0x000A)
704*4882a593Smuzhiyun #define MPI2_IOCSTATUS_FAILURE                      (0x000F)
705*4882a593Smuzhiyun 
706*4882a593Smuzhiyun /****************************************************************************
707*4882a593Smuzhiyun * Config IOCStatus values
708*4882a593Smuzhiyun ****************************************************************************/
709*4882a593Smuzhiyun 
710*4882a593Smuzhiyun #define MPI2_IOCSTATUS_CONFIG_INVALID_ACTION        (0x0020)
711*4882a593Smuzhiyun #define MPI2_IOCSTATUS_CONFIG_INVALID_TYPE          (0x0021)
712*4882a593Smuzhiyun #define MPI2_IOCSTATUS_CONFIG_INVALID_PAGE          (0x0022)
713*4882a593Smuzhiyun #define MPI2_IOCSTATUS_CONFIG_INVALID_DATA          (0x0023)
714*4882a593Smuzhiyun #define MPI2_IOCSTATUS_CONFIG_NO_DEFAULTS           (0x0024)
715*4882a593Smuzhiyun #define MPI2_IOCSTATUS_CONFIG_CANT_COMMIT           (0x0025)
716*4882a593Smuzhiyun 
717*4882a593Smuzhiyun /****************************************************************************
718*4882a593Smuzhiyun * SCSI IO Reply
719*4882a593Smuzhiyun ****************************************************************************/
720*4882a593Smuzhiyun 
721*4882a593Smuzhiyun #define MPI2_IOCSTATUS_SCSI_RECOVERED_ERROR         (0x0040)
722*4882a593Smuzhiyun #define MPI2_IOCSTATUS_SCSI_INVALID_DEVHANDLE       (0x0042)
723*4882a593Smuzhiyun #define MPI2_IOCSTATUS_SCSI_DEVICE_NOT_THERE        (0x0043)
724*4882a593Smuzhiyun #define MPI2_IOCSTATUS_SCSI_DATA_OVERRUN            (0x0044)
725*4882a593Smuzhiyun #define MPI2_IOCSTATUS_SCSI_DATA_UNDERRUN           (0x0045)
726*4882a593Smuzhiyun #define MPI2_IOCSTATUS_SCSI_IO_DATA_ERROR           (0x0046)
727*4882a593Smuzhiyun #define MPI2_IOCSTATUS_SCSI_PROTOCOL_ERROR          (0x0047)
728*4882a593Smuzhiyun #define MPI2_IOCSTATUS_SCSI_TASK_TERMINATED         (0x0048)
729*4882a593Smuzhiyun #define MPI2_IOCSTATUS_SCSI_RESIDUAL_MISMATCH       (0x0049)
730*4882a593Smuzhiyun #define MPI2_IOCSTATUS_SCSI_TASK_MGMT_FAILED        (0x004A)
731*4882a593Smuzhiyun #define MPI2_IOCSTATUS_SCSI_IOC_TERMINATED          (0x004B)
732*4882a593Smuzhiyun #define MPI2_IOCSTATUS_SCSI_EXT_TERMINATED          (0x004C)
733*4882a593Smuzhiyun 
734*4882a593Smuzhiyun /****************************************************************************
735*4882a593Smuzhiyun * For use by SCSI Initiator and SCSI Target end-to-end data protection
736*4882a593Smuzhiyun ****************************************************************************/
737*4882a593Smuzhiyun 
738*4882a593Smuzhiyun #define MPI2_IOCSTATUS_EEDP_GUARD_ERROR             (0x004D)
739*4882a593Smuzhiyun #define MPI2_IOCSTATUS_EEDP_REF_TAG_ERROR           (0x004E)
740*4882a593Smuzhiyun #define MPI2_IOCSTATUS_EEDP_APP_TAG_ERROR           (0x004F)
741*4882a593Smuzhiyun 
742*4882a593Smuzhiyun /****************************************************************************
743*4882a593Smuzhiyun * SCSI Target values
744*4882a593Smuzhiyun ****************************************************************************/
745*4882a593Smuzhiyun 
746*4882a593Smuzhiyun #define MPI2_IOCSTATUS_TARGET_INVALID_IO_INDEX      (0x0062)
747*4882a593Smuzhiyun #define MPI2_IOCSTATUS_TARGET_ABORTED               (0x0063)
748*4882a593Smuzhiyun #define MPI2_IOCSTATUS_TARGET_NO_CONN_RETRYABLE     (0x0064)
749*4882a593Smuzhiyun #define MPI2_IOCSTATUS_TARGET_NO_CONNECTION         (0x0065)
750*4882a593Smuzhiyun #define MPI2_IOCSTATUS_TARGET_XFER_COUNT_MISMATCH   (0x006A)
751*4882a593Smuzhiyun #define MPI2_IOCSTATUS_TARGET_DATA_OFFSET_ERROR     (0x006D)
752*4882a593Smuzhiyun #define MPI2_IOCSTATUS_TARGET_TOO_MUCH_WRITE_DATA   (0x006E)
753*4882a593Smuzhiyun #define MPI2_IOCSTATUS_TARGET_IU_TOO_SHORT          (0x006F)
754*4882a593Smuzhiyun #define MPI2_IOCSTATUS_TARGET_ACK_NAK_TIMEOUT       (0x0070)
755*4882a593Smuzhiyun #define MPI2_IOCSTATUS_TARGET_NAK_RECEIVED          (0x0071)
756*4882a593Smuzhiyun 
757*4882a593Smuzhiyun /****************************************************************************
758*4882a593Smuzhiyun * Serial Attached SCSI values
759*4882a593Smuzhiyun ****************************************************************************/
760*4882a593Smuzhiyun 
761*4882a593Smuzhiyun #define MPI2_IOCSTATUS_SAS_SMP_REQUEST_FAILED       (0x0090)
762*4882a593Smuzhiyun #define MPI2_IOCSTATUS_SAS_SMP_DATA_OVERRUN         (0x0091)
763*4882a593Smuzhiyun 
764*4882a593Smuzhiyun /****************************************************************************
765*4882a593Smuzhiyun * Diagnostic Buffer Post / Diagnostic Release values
766*4882a593Smuzhiyun ****************************************************************************/
767*4882a593Smuzhiyun 
768*4882a593Smuzhiyun #define MPI2_IOCSTATUS_DIAGNOSTIC_RELEASED          (0x00A0)
769*4882a593Smuzhiyun 
770*4882a593Smuzhiyun /****************************************************************************
771*4882a593Smuzhiyun * RAID Accelerator values
772*4882a593Smuzhiyun ****************************************************************************/
773*4882a593Smuzhiyun 
774*4882a593Smuzhiyun #define MPI2_IOCSTATUS_RAID_ACCEL_ERROR             (0x00B0)
775*4882a593Smuzhiyun 
776*4882a593Smuzhiyun /****************************************************************************
777*4882a593Smuzhiyun * IOCStatus flag to indicate that log info is available
778*4882a593Smuzhiyun ****************************************************************************/
779*4882a593Smuzhiyun 
780*4882a593Smuzhiyun #define MPI2_IOCSTATUS_FLAG_LOG_INFO_AVAILABLE      (0x8000)
781*4882a593Smuzhiyun 
782*4882a593Smuzhiyun /****************************************************************************
783*4882a593Smuzhiyun * IOCLogInfo Types
784*4882a593Smuzhiyun ****************************************************************************/
785*4882a593Smuzhiyun 
786*4882a593Smuzhiyun #define MPI2_IOCLOGINFO_TYPE_MASK               (0xF0000000)
787*4882a593Smuzhiyun #define MPI2_IOCLOGINFO_TYPE_SHIFT              (28)
788*4882a593Smuzhiyun #define MPI2_IOCLOGINFO_TYPE_NONE               (0x0)
789*4882a593Smuzhiyun #define MPI2_IOCLOGINFO_TYPE_SCSI               (0x1)
790*4882a593Smuzhiyun #define MPI2_IOCLOGINFO_TYPE_FC                 (0x2)
791*4882a593Smuzhiyun #define MPI2_IOCLOGINFO_TYPE_SAS                (0x3)
792*4882a593Smuzhiyun #define MPI2_IOCLOGINFO_TYPE_ISCSI              (0x4)
793*4882a593Smuzhiyun #define MPI2_IOCLOGINFO_LOG_DATA_MASK           (0x0FFFFFFF)
794*4882a593Smuzhiyun 
795*4882a593Smuzhiyun /*****************************************************************************
796*4882a593Smuzhiyun *
797*4882a593Smuzhiyun *       Standard Message Structures
798*4882a593Smuzhiyun *
799*4882a593Smuzhiyun *****************************************************************************/
800*4882a593Smuzhiyun 
801*4882a593Smuzhiyun /****************************************************************************
802*4882a593Smuzhiyun *Request Message Header for all request messages
803*4882a593Smuzhiyun ****************************************************************************/
804*4882a593Smuzhiyun 
805*4882a593Smuzhiyun typedef struct _MPI2_REQUEST_HEADER {
806*4882a593Smuzhiyun 	U16 FunctionDependent1;	/*0x00 */
807*4882a593Smuzhiyun 	U8 ChainOffset;		/*0x02 */
808*4882a593Smuzhiyun 	U8 Function;		/*0x03 */
809*4882a593Smuzhiyun 	U16 FunctionDependent2;	/*0x04 */
810*4882a593Smuzhiyun 	U8 FunctionDependent3;	/*0x06 */
811*4882a593Smuzhiyun 	U8 MsgFlags;		/*0x07 */
812*4882a593Smuzhiyun 	U8 VP_ID;		/*0x08 */
813*4882a593Smuzhiyun 	U8 VF_ID;		/*0x09 */
814*4882a593Smuzhiyun 	U16 Reserved1;		/*0x0A */
815*4882a593Smuzhiyun } MPI2_REQUEST_HEADER, *PTR_MPI2_REQUEST_HEADER,
816*4882a593Smuzhiyun 	MPI2RequestHeader_t, *pMPI2RequestHeader_t;
817*4882a593Smuzhiyun 
818*4882a593Smuzhiyun /****************************************************************************
819*4882a593Smuzhiyun * Default Reply
820*4882a593Smuzhiyun ****************************************************************************/
821*4882a593Smuzhiyun 
822*4882a593Smuzhiyun typedef struct _MPI2_DEFAULT_REPLY {
823*4882a593Smuzhiyun 	U16 FunctionDependent1;	/*0x00 */
824*4882a593Smuzhiyun 	U8 MsgLength;		/*0x02 */
825*4882a593Smuzhiyun 	U8 Function;		/*0x03 */
826*4882a593Smuzhiyun 	U16 FunctionDependent2;	/*0x04 */
827*4882a593Smuzhiyun 	U8 FunctionDependent3;	/*0x06 */
828*4882a593Smuzhiyun 	U8 MsgFlags;		/*0x07 */
829*4882a593Smuzhiyun 	U8 VP_ID;		/*0x08 */
830*4882a593Smuzhiyun 	U8 VF_ID;		/*0x09 */
831*4882a593Smuzhiyun 	U16 Reserved1;		/*0x0A */
832*4882a593Smuzhiyun 	U16 FunctionDependent5;	/*0x0C */
833*4882a593Smuzhiyun 	U16 IOCStatus;		/*0x0E */
834*4882a593Smuzhiyun 	U32 IOCLogInfo;		/*0x10 */
835*4882a593Smuzhiyun } MPI2_DEFAULT_REPLY, *PTR_MPI2_DEFAULT_REPLY,
836*4882a593Smuzhiyun 	MPI2DefaultReply_t, *pMPI2DefaultReply_t;
837*4882a593Smuzhiyun 
838*4882a593Smuzhiyun /*common version structure/union used in messages and configuration pages */
839*4882a593Smuzhiyun 
840*4882a593Smuzhiyun typedef struct _MPI2_VERSION_STRUCT {
841*4882a593Smuzhiyun 	U8 Dev;			/*0x00 */
842*4882a593Smuzhiyun 	U8 Unit;		/*0x01 */
843*4882a593Smuzhiyun 	U8 Minor;		/*0x02 */
844*4882a593Smuzhiyun 	U8 Major;		/*0x03 */
845*4882a593Smuzhiyun } MPI2_VERSION_STRUCT;
846*4882a593Smuzhiyun 
847*4882a593Smuzhiyun typedef union _MPI2_VERSION_UNION {
848*4882a593Smuzhiyun 	MPI2_VERSION_STRUCT Struct;
849*4882a593Smuzhiyun 	U32 Word;
850*4882a593Smuzhiyun } MPI2_VERSION_UNION;
851*4882a593Smuzhiyun 
852*4882a593Smuzhiyun /*LUN field defines, common to many structures */
853*4882a593Smuzhiyun #define MPI2_LUN_FIRST_LEVEL_ADDRESSING             (0x0000FFFF)
854*4882a593Smuzhiyun #define MPI2_LUN_SECOND_LEVEL_ADDRESSING            (0xFFFF0000)
855*4882a593Smuzhiyun #define MPI2_LUN_THIRD_LEVEL_ADDRESSING             (0x0000FFFF)
856*4882a593Smuzhiyun #define MPI2_LUN_FOURTH_LEVEL_ADDRESSING            (0xFFFF0000)
857*4882a593Smuzhiyun #define MPI2_LUN_LEVEL_1_WORD                       (0xFF00)
858*4882a593Smuzhiyun #define MPI2_LUN_LEVEL_1_DWORD                      (0x0000FF00)
859*4882a593Smuzhiyun 
860*4882a593Smuzhiyun /*****************************************************************************
861*4882a593Smuzhiyun *
862*4882a593Smuzhiyun *       Fusion-MPT MPI Scatter Gather Elements
863*4882a593Smuzhiyun *
864*4882a593Smuzhiyun *****************************************************************************/
865*4882a593Smuzhiyun 
866*4882a593Smuzhiyun /****************************************************************************
867*4882a593Smuzhiyun * MPI Simple Element structures
868*4882a593Smuzhiyun ****************************************************************************/
869*4882a593Smuzhiyun 
870*4882a593Smuzhiyun typedef struct _MPI2_SGE_SIMPLE32 {
871*4882a593Smuzhiyun 	U32 FlagsLength;
872*4882a593Smuzhiyun 	U32 Address;
873*4882a593Smuzhiyun } MPI2_SGE_SIMPLE32, *PTR_MPI2_SGE_SIMPLE32,
874*4882a593Smuzhiyun 	Mpi2SGESimple32_t, *pMpi2SGESimple32_t;
875*4882a593Smuzhiyun 
876*4882a593Smuzhiyun typedef struct _MPI2_SGE_SIMPLE64 {
877*4882a593Smuzhiyun 	U32 FlagsLength;
878*4882a593Smuzhiyun 	U64 Address;
879*4882a593Smuzhiyun } MPI2_SGE_SIMPLE64, *PTR_MPI2_SGE_SIMPLE64,
880*4882a593Smuzhiyun 	Mpi2SGESimple64_t, *pMpi2SGESimple64_t;
881*4882a593Smuzhiyun 
882*4882a593Smuzhiyun typedef struct _MPI2_SGE_SIMPLE_UNION {
883*4882a593Smuzhiyun 	U32 FlagsLength;
884*4882a593Smuzhiyun 	union {
885*4882a593Smuzhiyun 		U32 Address32;
886*4882a593Smuzhiyun 		U64 Address64;
887*4882a593Smuzhiyun 	} u;
888*4882a593Smuzhiyun } MPI2_SGE_SIMPLE_UNION,
889*4882a593Smuzhiyun 	*PTR_MPI2_SGE_SIMPLE_UNION,
890*4882a593Smuzhiyun 	Mpi2SGESimpleUnion_t,
891*4882a593Smuzhiyun 	*pMpi2SGESimpleUnion_t;
892*4882a593Smuzhiyun 
893*4882a593Smuzhiyun /****************************************************************************
894*4882a593Smuzhiyun * MPI Chain Element structures - for MPI v2.0 products only
895*4882a593Smuzhiyun ****************************************************************************/
896*4882a593Smuzhiyun 
897*4882a593Smuzhiyun typedef struct _MPI2_SGE_CHAIN32 {
898*4882a593Smuzhiyun 	U16 Length;
899*4882a593Smuzhiyun 	U8 NextChainOffset;
900*4882a593Smuzhiyun 	U8 Flags;
901*4882a593Smuzhiyun 	U32 Address;
902*4882a593Smuzhiyun } MPI2_SGE_CHAIN32, *PTR_MPI2_SGE_CHAIN32,
903*4882a593Smuzhiyun 	Mpi2SGEChain32_t, *pMpi2SGEChain32_t;
904*4882a593Smuzhiyun 
905*4882a593Smuzhiyun typedef struct _MPI2_SGE_CHAIN64 {
906*4882a593Smuzhiyun 	U16 Length;
907*4882a593Smuzhiyun 	U8 NextChainOffset;
908*4882a593Smuzhiyun 	U8 Flags;
909*4882a593Smuzhiyun 	U64 Address;
910*4882a593Smuzhiyun } MPI2_SGE_CHAIN64, *PTR_MPI2_SGE_CHAIN64,
911*4882a593Smuzhiyun 	Mpi2SGEChain64_t, *pMpi2SGEChain64_t;
912*4882a593Smuzhiyun 
913*4882a593Smuzhiyun typedef struct _MPI2_SGE_CHAIN_UNION {
914*4882a593Smuzhiyun 	U16 Length;
915*4882a593Smuzhiyun 	U8 NextChainOffset;
916*4882a593Smuzhiyun 	U8 Flags;
917*4882a593Smuzhiyun 	union {
918*4882a593Smuzhiyun 		U32 Address32;
919*4882a593Smuzhiyun 		U64 Address64;
920*4882a593Smuzhiyun 	} u;
921*4882a593Smuzhiyun } MPI2_SGE_CHAIN_UNION,
922*4882a593Smuzhiyun 	*PTR_MPI2_SGE_CHAIN_UNION,
923*4882a593Smuzhiyun 	Mpi2SGEChainUnion_t,
924*4882a593Smuzhiyun 	*pMpi2SGEChainUnion_t;
925*4882a593Smuzhiyun 
926*4882a593Smuzhiyun /****************************************************************************
927*4882a593Smuzhiyun * MPI Transaction Context Element structures - for MPI v2.0 products only
928*4882a593Smuzhiyun ****************************************************************************/
929*4882a593Smuzhiyun 
930*4882a593Smuzhiyun typedef struct _MPI2_SGE_TRANSACTION32 {
931*4882a593Smuzhiyun 	U8 Reserved;
932*4882a593Smuzhiyun 	U8 ContextSize;
933*4882a593Smuzhiyun 	U8 DetailsLength;
934*4882a593Smuzhiyun 	U8 Flags;
935*4882a593Smuzhiyun 	U32 TransactionContext[1];
936*4882a593Smuzhiyun 	U32 TransactionDetails[1];
937*4882a593Smuzhiyun } MPI2_SGE_TRANSACTION32,
938*4882a593Smuzhiyun 	*PTR_MPI2_SGE_TRANSACTION32,
939*4882a593Smuzhiyun 	Mpi2SGETransaction32_t,
940*4882a593Smuzhiyun 	*pMpi2SGETransaction32_t;
941*4882a593Smuzhiyun 
942*4882a593Smuzhiyun typedef struct _MPI2_SGE_TRANSACTION64 {
943*4882a593Smuzhiyun 	U8 Reserved;
944*4882a593Smuzhiyun 	U8 ContextSize;
945*4882a593Smuzhiyun 	U8 DetailsLength;
946*4882a593Smuzhiyun 	U8 Flags;
947*4882a593Smuzhiyun 	U32 TransactionContext[2];
948*4882a593Smuzhiyun 	U32 TransactionDetails[1];
949*4882a593Smuzhiyun } MPI2_SGE_TRANSACTION64,
950*4882a593Smuzhiyun 	*PTR_MPI2_SGE_TRANSACTION64,
951*4882a593Smuzhiyun 	Mpi2SGETransaction64_t,
952*4882a593Smuzhiyun 	*pMpi2SGETransaction64_t;
953*4882a593Smuzhiyun 
954*4882a593Smuzhiyun typedef struct _MPI2_SGE_TRANSACTION96 {
955*4882a593Smuzhiyun 	U8 Reserved;
956*4882a593Smuzhiyun 	U8 ContextSize;
957*4882a593Smuzhiyun 	U8 DetailsLength;
958*4882a593Smuzhiyun 	U8 Flags;
959*4882a593Smuzhiyun 	U32 TransactionContext[3];
960*4882a593Smuzhiyun 	U32 TransactionDetails[1];
961*4882a593Smuzhiyun } MPI2_SGE_TRANSACTION96, *PTR_MPI2_SGE_TRANSACTION96,
962*4882a593Smuzhiyun 	Mpi2SGETransaction96_t, *pMpi2SGETransaction96_t;
963*4882a593Smuzhiyun 
964*4882a593Smuzhiyun typedef struct _MPI2_SGE_TRANSACTION128 {
965*4882a593Smuzhiyun 	U8 Reserved;
966*4882a593Smuzhiyun 	U8 ContextSize;
967*4882a593Smuzhiyun 	U8 DetailsLength;
968*4882a593Smuzhiyun 	U8 Flags;
969*4882a593Smuzhiyun 	U32 TransactionContext[4];
970*4882a593Smuzhiyun 	U32 TransactionDetails[1];
971*4882a593Smuzhiyun } MPI2_SGE_TRANSACTION128, *PTR_MPI2_SGE_TRANSACTION128,
972*4882a593Smuzhiyun 	Mpi2SGETransaction_t128, *pMpi2SGETransaction_t128;
973*4882a593Smuzhiyun 
974*4882a593Smuzhiyun typedef struct _MPI2_SGE_TRANSACTION_UNION {
975*4882a593Smuzhiyun 	U8 Reserved;
976*4882a593Smuzhiyun 	U8 ContextSize;
977*4882a593Smuzhiyun 	U8 DetailsLength;
978*4882a593Smuzhiyun 	U8 Flags;
979*4882a593Smuzhiyun 	union {
980*4882a593Smuzhiyun 		U32 TransactionContext32[1];
981*4882a593Smuzhiyun 		U32 TransactionContext64[2];
982*4882a593Smuzhiyun 		U32 TransactionContext96[3];
983*4882a593Smuzhiyun 		U32 TransactionContext128[4];
984*4882a593Smuzhiyun 	} u;
985*4882a593Smuzhiyun 	U32 TransactionDetails[1];
986*4882a593Smuzhiyun } MPI2_SGE_TRANSACTION_UNION,
987*4882a593Smuzhiyun 	*PTR_MPI2_SGE_TRANSACTION_UNION,
988*4882a593Smuzhiyun 	Mpi2SGETransactionUnion_t,
989*4882a593Smuzhiyun 	*pMpi2SGETransactionUnion_t;
990*4882a593Smuzhiyun 
991*4882a593Smuzhiyun /****************************************************************************
992*4882a593Smuzhiyun * MPI SGE union for IO SGL's - for MPI v2.0 products only
993*4882a593Smuzhiyun ****************************************************************************/
994*4882a593Smuzhiyun 
995*4882a593Smuzhiyun typedef struct _MPI2_MPI_SGE_IO_UNION {
996*4882a593Smuzhiyun 	union {
997*4882a593Smuzhiyun 		MPI2_SGE_SIMPLE_UNION Simple;
998*4882a593Smuzhiyun 		MPI2_SGE_CHAIN_UNION Chain;
999*4882a593Smuzhiyun 	} u;
1000*4882a593Smuzhiyun } MPI2_MPI_SGE_IO_UNION, *PTR_MPI2_MPI_SGE_IO_UNION,
1001*4882a593Smuzhiyun 	Mpi2MpiSGEIOUnion_t, *pMpi2MpiSGEIOUnion_t;
1002*4882a593Smuzhiyun 
1003*4882a593Smuzhiyun /****************************************************************************
1004*4882a593Smuzhiyun * MPI SGE union for SGL's with Simple and Transaction elements - for MPI v2.0 products only
1005*4882a593Smuzhiyun ****************************************************************************/
1006*4882a593Smuzhiyun 
1007*4882a593Smuzhiyun typedef struct _MPI2_SGE_TRANS_SIMPLE_UNION {
1008*4882a593Smuzhiyun 	union {
1009*4882a593Smuzhiyun 		MPI2_SGE_SIMPLE_UNION Simple;
1010*4882a593Smuzhiyun 		MPI2_SGE_TRANSACTION_UNION Transaction;
1011*4882a593Smuzhiyun 	} u;
1012*4882a593Smuzhiyun } MPI2_SGE_TRANS_SIMPLE_UNION,
1013*4882a593Smuzhiyun 	*PTR_MPI2_SGE_TRANS_SIMPLE_UNION,
1014*4882a593Smuzhiyun 	Mpi2SGETransSimpleUnion_t,
1015*4882a593Smuzhiyun 	*pMpi2SGETransSimpleUnion_t;
1016*4882a593Smuzhiyun 
1017*4882a593Smuzhiyun /****************************************************************************
1018*4882a593Smuzhiyun * All MPI SGE types union
1019*4882a593Smuzhiyun ****************************************************************************/
1020*4882a593Smuzhiyun 
1021*4882a593Smuzhiyun typedef struct _MPI2_MPI_SGE_UNION {
1022*4882a593Smuzhiyun 	union {
1023*4882a593Smuzhiyun 		MPI2_SGE_SIMPLE_UNION Simple;
1024*4882a593Smuzhiyun 		MPI2_SGE_CHAIN_UNION Chain;
1025*4882a593Smuzhiyun 		MPI2_SGE_TRANSACTION_UNION Transaction;
1026*4882a593Smuzhiyun 	} u;
1027*4882a593Smuzhiyun } MPI2_MPI_SGE_UNION, *PTR_MPI2_MPI_SGE_UNION,
1028*4882a593Smuzhiyun 	Mpi2MpiSgeUnion_t, *pMpi2MpiSgeUnion_t;
1029*4882a593Smuzhiyun 
1030*4882a593Smuzhiyun /****************************************************************************
1031*4882a593Smuzhiyun * MPI SGE field definition and masks
1032*4882a593Smuzhiyun ****************************************************************************/
1033*4882a593Smuzhiyun 
1034*4882a593Smuzhiyun /*Flags field bit definitions */
1035*4882a593Smuzhiyun 
1036*4882a593Smuzhiyun #define MPI2_SGE_FLAGS_LAST_ELEMENT             (0x80)
1037*4882a593Smuzhiyun #define MPI2_SGE_FLAGS_END_OF_BUFFER            (0x40)
1038*4882a593Smuzhiyun #define MPI2_SGE_FLAGS_ELEMENT_TYPE_MASK        (0x30)
1039*4882a593Smuzhiyun #define MPI2_SGE_FLAGS_LOCAL_ADDRESS            (0x08)
1040*4882a593Smuzhiyun #define MPI2_SGE_FLAGS_DIRECTION                (0x04)
1041*4882a593Smuzhiyun #define MPI2_SGE_FLAGS_ADDRESS_SIZE             (0x02)
1042*4882a593Smuzhiyun #define MPI2_SGE_FLAGS_END_OF_LIST              (0x01)
1043*4882a593Smuzhiyun 
1044*4882a593Smuzhiyun #define MPI2_SGE_FLAGS_SHIFT                    (24)
1045*4882a593Smuzhiyun 
1046*4882a593Smuzhiyun #define MPI2_SGE_LENGTH_MASK                    (0x00FFFFFF)
1047*4882a593Smuzhiyun #define MPI2_SGE_CHAIN_LENGTH_MASK              (0x0000FFFF)
1048*4882a593Smuzhiyun 
1049*4882a593Smuzhiyun /*Element Type */
1050*4882a593Smuzhiyun 
1051*4882a593Smuzhiyun #define MPI2_SGE_FLAGS_TRANSACTION_ELEMENT      (0x00)
1052*4882a593Smuzhiyun #define MPI2_SGE_FLAGS_SIMPLE_ELEMENT           (0x10)
1053*4882a593Smuzhiyun #define MPI2_SGE_FLAGS_CHAIN_ELEMENT            (0x30)
1054*4882a593Smuzhiyun #define MPI2_SGE_FLAGS_ELEMENT_MASK             (0x30)
1055*4882a593Smuzhiyun 
1056*4882a593Smuzhiyun /*Address location */
1057*4882a593Smuzhiyun 
1058*4882a593Smuzhiyun #define MPI2_SGE_FLAGS_SYSTEM_ADDRESS           (0x00)
1059*4882a593Smuzhiyun 
1060*4882a593Smuzhiyun /*Direction */
1061*4882a593Smuzhiyun 
1062*4882a593Smuzhiyun #define MPI2_SGE_FLAGS_IOC_TO_HOST              (0x00)
1063*4882a593Smuzhiyun #define MPI2_SGE_FLAGS_HOST_TO_IOC              (0x04)
1064*4882a593Smuzhiyun 
1065*4882a593Smuzhiyun #define MPI2_SGE_FLAGS_DEST (MPI2_SGE_FLAGS_IOC_TO_HOST)
1066*4882a593Smuzhiyun #define MPI2_SGE_FLAGS_SOURCE (MPI2_SGE_FLAGS_HOST_TO_IOC)
1067*4882a593Smuzhiyun 
1068*4882a593Smuzhiyun /*Address Size */
1069*4882a593Smuzhiyun 
1070*4882a593Smuzhiyun #define MPI2_SGE_FLAGS_32_BIT_ADDRESSING        (0x00)
1071*4882a593Smuzhiyun #define MPI2_SGE_FLAGS_64_BIT_ADDRESSING        (0x02)
1072*4882a593Smuzhiyun 
1073*4882a593Smuzhiyun /*Context Size */
1074*4882a593Smuzhiyun 
1075*4882a593Smuzhiyun #define MPI2_SGE_FLAGS_32_BIT_CONTEXT           (0x00)
1076*4882a593Smuzhiyun #define MPI2_SGE_FLAGS_64_BIT_CONTEXT           (0x02)
1077*4882a593Smuzhiyun #define MPI2_SGE_FLAGS_96_BIT_CONTEXT           (0x04)
1078*4882a593Smuzhiyun #define MPI2_SGE_FLAGS_128_BIT_CONTEXT          (0x06)
1079*4882a593Smuzhiyun 
1080*4882a593Smuzhiyun #define MPI2_SGE_CHAIN_OFFSET_MASK              (0x00FF0000)
1081*4882a593Smuzhiyun #define MPI2_SGE_CHAIN_OFFSET_SHIFT             (16)
1082*4882a593Smuzhiyun 
1083*4882a593Smuzhiyun /****************************************************************************
1084*4882a593Smuzhiyun * MPI SGE operation Macros
1085*4882a593Smuzhiyun ****************************************************************************/
1086*4882a593Smuzhiyun 
1087*4882a593Smuzhiyun /*SIMPLE FlagsLength manipulations... */
1088*4882a593Smuzhiyun #define MPI2_SGE_SET_FLAGS(f) ((U32)(f) << MPI2_SGE_FLAGS_SHIFT)
1089*4882a593Smuzhiyun #define MPI2_SGE_GET_FLAGS(f) (((f) & ~MPI2_SGE_LENGTH_MASK) >> \
1090*4882a593Smuzhiyun 					MPI2_SGE_FLAGS_SHIFT)
1091*4882a593Smuzhiyun #define MPI2_SGE_LENGTH(f) ((f) & MPI2_SGE_LENGTH_MASK)
1092*4882a593Smuzhiyun #define MPI2_SGE_CHAIN_LENGTH(f) ((f) & MPI2_SGE_CHAIN_LENGTH_MASK)
1093*4882a593Smuzhiyun 
1094*4882a593Smuzhiyun #define MPI2_SGE_SET_FLAGS_LENGTH(f, l) (MPI2_SGE_SET_FLAGS(f) | \
1095*4882a593Smuzhiyun 					MPI2_SGE_LENGTH(l))
1096*4882a593Smuzhiyun 
1097*4882a593Smuzhiyun #define MPI2_pSGE_GET_FLAGS(psg) MPI2_SGE_GET_FLAGS((psg)->FlagsLength)
1098*4882a593Smuzhiyun #define MPI2_pSGE_GET_LENGTH(psg) MPI2_SGE_LENGTH((psg)->FlagsLength)
1099*4882a593Smuzhiyun #define MPI2_pSGE_SET_FLAGS_LENGTH(psg, f, l) ((psg)->FlagsLength = \
1100*4882a593Smuzhiyun 					MPI2_SGE_SET_FLAGS_LENGTH(f, l))
1101*4882a593Smuzhiyun 
1102*4882a593Smuzhiyun /*CAUTION - The following are READ-MODIFY-WRITE! */
1103*4882a593Smuzhiyun #define MPI2_pSGE_SET_FLAGS(psg, f) ((psg)->FlagsLength |= \
1104*4882a593Smuzhiyun 					MPI2_SGE_SET_FLAGS(f))
1105*4882a593Smuzhiyun #define MPI2_pSGE_SET_LENGTH(psg, l) ((psg)->FlagsLength |= \
1106*4882a593Smuzhiyun 					MPI2_SGE_LENGTH(l))
1107*4882a593Smuzhiyun 
1108*4882a593Smuzhiyun #define MPI2_GET_CHAIN_OFFSET(x) ((x & MPI2_SGE_CHAIN_OFFSET_MASK) >> \
1109*4882a593Smuzhiyun 					MPI2_SGE_CHAIN_OFFSET_SHIFT)
1110*4882a593Smuzhiyun 
1111*4882a593Smuzhiyun /*****************************************************************************
1112*4882a593Smuzhiyun *
1113*4882a593Smuzhiyun *       Fusion-MPT IEEE Scatter Gather Elements
1114*4882a593Smuzhiyun *
1115*4882a593Smuzhiyun *****************************************************************************/
1116*4882a593Smuzhiyun 
1117*4882a593Smuzhiyun /****************************************************************************
1118*4882a593Smuzhiyun * IEEE Simple Element structures
1119*4882a593Smuzhiyun ****************************************************************************/
1120*4882a593Smuzhiyun 
1121*4882a593Smuzhiyun /*MPI2_IEEE_SGE_SIMPLE32 is for MPI v2.0 products only */
1122*4882a593Smuzhiyun typedef struct _MPI2_IEEE_SGE_SIMPLE32 {
1123*4882a593Smuzhiyun 	U32 Address;
1124*4882a593Smuzhiyun 	U32 FlagsLength;
1125*4882a593Smuzhiyun } MPI2_IEEE_SGE_SIMPLE32, *PTR_MPI2_IEEE_SGE_SIMPLE32,
1126*4882a593Smuzhiyun 	Mpi2IeeeSgeSimple32_t, *pMpi2IeeeSgeSimple32_t;
1127*4882a593Smuzhiyun 
1128*4882a593Smuzhiyun typedef struct _MPI2_IEEE_SGE_SIMPLE64 {
1129*4882a593Smuzhiyun 	U64 Address;
1130*4882a593Smuzhiyun 	U32 Length;
1131*4882a593Smuzhiyun 	U16 Reserved1;
1132*4882a593Smuzhiyun 	U8 Reserved2;
1133*4882a593Smuzhiyun 	U8 Flags;
1134*4882a593Smuzhiyun } MPI2_IEEE_SGE_SIMPLE64, *PTR_MPI2_IEEE_SGE_SIMPLE64,
1135*4882a593Smuzhiyun 	Mpi2IeeeSgeSimple64_t, *pMpi2IeeeSgeSimple64_t;
1136*4882a593Smuzhiyun 
1137*4882a593Smuzhiyun typedef union _MPI2_IEEE_SGE_SIMPLE_UNION {
1138*4882a593Smuzhiyun 	MPI2_IEEE_SGE_SIMPLE32 Simple32;
1139*4882a593Smuzhiyun 	MPI2_IEEE_SGE_SIMPLE64 Simple64;
1140*4882a593Smuzhiyun } MPI2_IEEE_SGE_SIMPLE_UNION,
1141*4882a593Smuzhiyun 	*PTR_MPI2_IEEE_SGE_SIMPLE_UNION,
1142*4882a593Smuzhiyun 	Mpi2IeeeSgeSimpleUnion_t,
1143*4882a593Smuzhiyun 	*pMpi2IeeeSgeSimpleUnion_t;
1144*4882a593Smuzhiyun 
1145*4882a593Smuzhiyun /****************************************************************************
1146*4882a593Smuzhiyun * IEEE Chain Element structures
1147*4882a593Smuzhiyun ****************************************************************************/
1148*4882a593Smuzhiyun 
1149*4882a593Smuzhiyun /*MPI2_IEEE_SGE_CHAIN32 is for MPI v2.0 products only */
1150*4882a593Smuzhiyun typedef MPI2_IEEE_SGE_SIMPLE32 MPI2_IEEE_SGE_CHAIN32;
1151*4882a593Smuzhiyun 
1152*4882a593Smuzhiyun /*MPI2_IEEE_SGE_CHAIN64 is for MPI v2.0 products only */
1153*4882a593Smuzhiyun typedef MPI2_IEEE_SGE_SIMPLE64 MPI2_IEEE_SGE_CHAIN64;
1154*4882a593Smuzhiyun 
1155*4882a593Smuzhiyun typedef union _MPI2_IEEE_SGE_CHAIN_UNION {
1156*4882a593Smuzhiyun 	MPI2_IEEE_SGE_CHAIN32 Chain32;
1157*4882a593Smuzhiyun 	MPI2_IEEE_SGE_CHAIN64 Chain64;
1158*4882a593Smuzhiyun } MPI2_IEEE_SGE_CHAIN_UNION,
1159*4882a593Smuzhiyun 	*PTR_MPI2_IEEE_SGE_CHAIN_UNION,
1160*4882a593Smuzhiyun 	Mpi2IeeeSgeChainUnion_t,
1161*4882a593Smuzhiyun 	*pMpi2IeeeSgeChainUnion_t;
1162*4882a593Smuzhiyun 
1163*4882a593Smuzhiyun /*MPI25_IEEE_SGE_CHAIN64 is for MPI v2.5 and later */
1164*4882a593Smuzhiyun typedef struct _MPI25_IEEE_SGE_CHAIN64 {
1165*4882a593Smuzhiyun 	U64 Address;
1166*4882a593Smuzhiyun 	U32 Length;
1167*4882a593Smuzhiyun 	U16 Reserved1;
1168*4882a593Smuzhiyun 	U8 NextChainOffset;
1169*4882a593Smuzhiyun 	U8 Flags;
1170*4882a593Smuzhiyun } MPI25_IEEE_SGE_CHAIN64,
1171*4882a593Smuzhiyun 	*PTR_MPI25_IEEE_SGE_CHAIN64,
1172*4882a593Smuzhiyun 	Mpi25IeeeSgeChain64_t,
1173*4882a593Smuzhiyun 	*pMpi25IeeeSgeChain64_t;
1174*4882a593Smuzhiyun 
1175*4882a593Smuzhiyun /****************************************************************************
1176*4882a593Smuzhiyun * All IEEE SGE types union
1177*4882a593Smuzhiyun ****************************************************************************/
1178*4882a593Smuzhiyun 
1179*4882a593Smuzhiyun /*MPI2_IEEE_SGE_UNION is for MPI v2.0 products only */
1180*4882a593Smuzhiyun typedef struct _MPI2_IEEE_SGE_UNION {
1181*4882a593Smuzhiyun 	union {
1182*4882a593Smuzhiyun 		MPI2_IEEE_SGE_SIMPLE_UNION Simple;
1183*4882a593Smuzhiyun 		MPI2_IEEE_SGE_CHAIN_UNION Chain;
1184*4882a593Smuzhiyun 	} u;
1185*4882a593Smuzhiyun } MPI2_IEEE_SGE_UNION, *PTR_MPI2_IEEE_SGE_UNION,
1186*4882a593Smuzhiyun 	Mpi2IeeeSgeUnion_t, *pMpi2IeeeSgeUnion_t;
1187*4882a593Smuzhiyun 
1188*4882a593Smuzhiyun /****************************************************************************
1189*4882a593Smuzhiyun * IEEE SGE union for IO SGL's
1190*4882a593Smuzhiyun ****************************************************************************/
1191*4882a593Smuzhiyun 
1192*4882a593Smuzhiyun typedef union _MPI25_SGE_IO_UNION {
1193*4882a593Smuzhiyun 	MPI2_IEEE_SGE_SIMPLE64 IeeeSimple;
1194*4882a593Smuzhiyun 	MPI25_IEEE_SGE_CHAIN64 IeeeChain;
1195*4882a593Smuzhiyun } MPI25_SGE_IO_UNION, *PTR_MPI25_SGE_IO_UNION,
1196*4882a593Smuzhiyun 	Mpi25SGEIOUnion_t, *pMpi25SGEIOUnion_t;
1197*4882a593Smuzhiyun 
1198*4882a593Smuzhiyun /****************************************************************************
1199*4882a593Smuzhiyun * IEEE SGE field definitions and masks
1200*4882a593Smuzhiyun ****************************************************************************/
1201*4882a593Smuzhiyun 
1202*4882a593Smuzhiyun /*Flags field bit definitions */
1203*4882a593Smuzhiyun 
1204*4882a593Smuzhiyun #define MPI2_IEEE_SGE_FLAGS_ELEMENT_TYPE_MASK   (0x80)
1205*4882a593Smuzhiyun #define MPI25_IEEE_SGE_FLAGS_END_OF_LIST        (0x40)
1206*4882a593Smuzhiyun 
1207*4882a593Smuzhiyun #define MPI2_IEEE32_SGE_FLAGS_SHIFT             (24)
1208*4882a593Smuzhiyun 
1209*4882a593Smuzhiyun #define MPI2_IEEE32_SGE_LENGTH_MASK             (0x00FFFFFF)
1210*4882a593Smuzhiyun 
1211*4882a593Smuzhiyun /*Element Type */
1212*4882a593Smuzhiyun 
1213*4882a593Smuzhiyun #define MPI2_IEEE_SGE_FLAGS_SIMPLE_ELEMENT      (0x00)
1214*4882a593Smuzhiyun #define MPI2_IEEE_SGE_FLAGS_CHAIN_ELEMENT       (0x80)
1215*4882a593Smuzhiyun 
1216*4882a593Smuzhiyun /*Next Segment Format */
1217*4882a593Smuzhiyun 
1218*4882a593Smuzhiyun #define MPI26_IEEE_SGE_FLAGS_NSF_MASK           (0x1C)
1219*4882a593Smuzhiyun #define MPI26_IEEE_SGE_FLAGS_NSF_MPI_IEEE       (0x00)
1220*4882a593Smuzhiyun #define MPI26_IEEE_SGE_FLAGS_NSF_NVME_PRP       (0x08)
1221*4882a593Smuzhiyun #define MPI26_IEEE_SGE_FLAGS_NSF_NVME_SGL       (0x10)
1222*4882a593Smuzhiyun 
1223*4882a593Smuzhiyun /*Data Location Address Space */
1224*4882a593Smuzhiyun 
1225*4882a593Smuzhiyun #define MPI2_IEEE_SGE_FLAGS_ADDR_MASK           (0x03)
1226*4882a593Smuzhiyun #define MPI2_IEEE_SGE_FLAGS_SYSTEM_ADDR         (0x00)
1227*4882a593Smuzhiyun #define MPI2_IEEE_SGE_FLAGS_IOCDDR_ADDR         (0x01)
1228*4882a593Smuzhiyun #define MPI2_IEEE_SGE_FLAGS_IOCPLB_ADDR         (0x02)
1229*4882a593Smuzhiyun #define MPI2_IEEE_SGE_FLAGS_IOCPLBNTA_ADDR      (0x03)
1230*4882a593Smuzhiyun #define MPI2_IEEE_SGE_FLAGS_SYSTEMPLBPCI_ADDR   (0x03)
1231*4882a593Smuzhiyun #define MPI2_IEEE_SGE_FLAGS_SYSTEMPLBCPI_ADDR \
1232*4882a593Smuzhiyun 	 (MPI2_IEEE_SGE_FLAGS_SYSTEMPLBPCI_ADDR)
1233*4882a593Smuzhiyun #define MPI26_IEEE_SGE_FLAGS_IOCCTL_ADDR        (0x02)
1234*4882a593Smuzhiyun 
1235*4882a593Smuzhiyun /****************************************************************************
1236*4882a593Smuzhiyun * IEEE SGE operation Macros
1237*4882a593Smuzhiyun ****************************************************************************/
1238*4882a593Smuzhiyun 
1239*4882a593Smuzhiyun /*SIMPLE FlagsLength manipulations... */
1240*4882a593Smuzhiyun #define MPI2_IEEE32_SGE_SET_FLAGS(f) ((U32)(f) << MPI2_IEEE32_SGE_FLAGS_SHIFT)
1241*4882a593Smuzhiyun #define MPI2_IEEE32_SGE_GET_FLAGS(f) (((f) & ~MPI2_IEEE32_SGE_LENGTH_MASK) \
1242*4882a593Smuzhiyun 				 >> MPI2_IEEE32_SGE_FLAGS_SHIFT)
1243*4882a593Smuzhiyun #define MPI2_IEEE32_SGE_LENGTH(f)    ((f) & MPI2_IEEE32_SGE_LENGTH_MASK)
1244*4882a593Smuzhiyun 
1245*4882a593Smuzhiyun #define MPI2_IEEE32_SGE_SET_FLAGS_LENGTH(f, l) (MPI2_IEEE32_SGE_SET_FLAGS(f) |\
1246*4882a593Smuzhiyun 						 MPI2_IEEE32_SGE_LENGTH(l))
1247*4882a593Smuzhiyun 
1248*4882a593Smuzhiyun #define MPI2_IEEE32_pSGE_GET_FLAGS(psg) \
1249*4882a593Smuzhiyun 			MPI2_IEEE32_SGE_GET_FLAGS((psg)->FlagsLength)
1250*4882a593Smuzhiyun #define MPI2_IEEE32_pSGE_GET_LENGTH(psg) \
1251*4882a593Smuzhiyun 			MPI2_IEEE32_SGE_LENGTH((psg)->FlagsLength)
1252*4882a593Smuzhiyun #define MPI2_IEEE32_pSGE_SET_FLAGS_LENGTH(psg, f, l) ((psg)->FlagsLength = \
1253*4882a593Smuzhiyun 					MPI2_IEEE32_SGE_SET_FLAGS_LENGTH(f, l))
1254*4882a593Smuzhiyun 
1255*4882a593Smuzhiyun /*CAUTION - The following are READ-MODIFY-WRITE! */
1256*4882a593Smuzhiyun #define MPI2_IEEE32_pSGE_SET_FLAGS(psg, f) ((psg)->FlagsLength |= \
1257*4882a593Smuzhiyun 					MPI2_IEEE32_SGE_SET_FLAGS(f))
1258*4882a593Smuzhiyun #define MPI2_IEEE32_pSGE_SET_LENGTH(psg, l) ((psg)->FlagsLength |= \
1259*4882a593Smuzhiyun 					MPI2_IEEE32_SGE_LENGTH(l))
1260*4882a593Smuzhiyun 
1261*4882a593Smuzhiyun /*****************************************************************************
1262*4882a593Smuzhiyun *
1263*4882a593Smuzhiyun *       Fusion-MPT MPI/IEEE Scatter Gather Unions
1264*4882a593Smuzhiyun *
1265*4882a593Smuzhiyun *****************************************************************************/
1266*4882a593Smuzhiyun 
1267*4882a593Smuzhiyun typedef union _MPI2_SIMPLE_SGE_UNION {
1268*4882a593Smuzhiyun 	MPI2_SGE_SIMPLE_UNION MpiSimple;
1269*4882a593Smuzhiyun 	MPI2_IEEE_SGE_SIMPLE_UNION IeeeSimple;
1270*4882a593Smuzhiyun } MPI2_SIMPLE_SGE_UNION, *PTR_MPI2_SIMPLE_SGE_UNION,
1271*4882a593Smuzhiyun 	Mpi2SimpleSgeUntion_t, *pMpi2SimpleSgeUntion_t;
1272*4882a593Smuzhiyun 
1273*4882a593Smuzhiyun typedef union _MPI2_SGE_IO_UNION {
1274*4882a593Smuzhiyun 	MPI2_SGE_SIMPLE_UNION MpiSimple;
1275*4882a593Smuzhiyun 	MPI2_SGE_CHAIN_UNION MpiChain;
1276*4882a593Smuzhiyun 	MPI2_IEEE_SGE_SIMPLE_UNION IeeeSimple;
1277*4882a593Smuzhiyun 	MPI2_IEEE_SGE_CHAIN_UNION IeeeChain;
1278*4882a593Smuzhiyun } MPI2_SGE_IO_UNION, *PTR_MPI2_SGE_IO_UNION,
1279*4882a593Smuzhiyun 	Mpi2SGEIOUnion_t, *pMpi2SGEIOUnion_t;
1280*4882a593Smuzhiyun 
1281*4882a593Smuzhiyun /****************************************************************************
1282*4882a593Smuzhiyun *
1283*4882a593Smuzhiyun * Values for SGLFlags field, used in many request messages with an SGL
1284*4882a593Smuzhiyun *
1285*4882a593Smuzhiyun ****************************************************************************/
1286*4882a593Smuzhiyun 
1287*4882a593Smuzhiyun /*values for MPI SGL Data Location Address Space subfield */
1288*4882a593Smuzhiyun #define MPI2_SGLFLAGS_ADDRESS_SPACE_MASK            (0x0C)
1289*4882a593Smuzhiyun #define MPI2_SGLFLAGS_SYSTEM_ADDRESS_SPACE          (0x00)
1290*4882a593Smuzhiyun #define MPI2_SGLFLAGS_IOCDDR_ADDRESS_SPACE          (0x04)
1291*4882a593Smuzhiyun #define MPI2_SGLFLAGS_IOCPLB_ADDRESS_SPACE          (0x08)
1292*4882a593Smuzhiyun #define MPI26_SGLFLAGS_IOCPLB_ADDRESS_SPACE         (0x08)
1293*4882a593Smuzhiyun #define MPI2_SGLFLAGS_IOCPLBNTA_ADDRESS_SPACE       (0x0C)
1294*4882a593Smuzhiyun /*values for SGL Type subfield */
1295*4882a593Smuzhiyun #define MPI2_SGLFLAGS_SGL_TYPE_MASK                 (0x03)
1296*4882a593Smuzhiyun #define MPI2_SGLFLAGS_SGL_TYPE_MPI                  (0x00)
1297*4882a593Smuzhiyun #define MPI2_SGLFLAGS_SGL_TYPE_IEEE32               (0x01)
1298*4882a593Smuzhiyun #define MPI2_SGLFLAGS_SGL_TYPE_IEEE64               (0x02)
1299*4882a593Smuzhiyun 
1300*4882a593Smuzhiyun #endif
1301