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