xref: /freebsd/sys/dev/pms/RefTisa/sallsdk/spc/mpi.h (revision 0b3105a37d7adcadcb720112fed4dc4e8040be99)
1 /*******************************************************************************
2 *Copyright (c) 2014 PMC-Sierra, Inc.  All rights reserved.
3 *
4 *Redistribution and use in source and binary forms, with or without modification, are permitted provided
5 *that the following conditions are met:
6 *1. Redistributions of source code must retain the above copyright notice, this list of conditions and the
7 *following disclaimer.
8 *2. Redistributions in binary form must reproduce the above copyright notice,
9 *this list of conditions and the following disclaimer in the documentation and/or other materials provided
10 *with the distribution.
11 *
12 *THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED
13 *WARRANTIES,INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
14 *FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
15 *FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
16 *NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
17 *BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
18 *LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
19 *SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
20 *
21 * $FreeBSD$
22 *
23 ********************************************************************************/
24 
25 /*******************************************************************************/
26 /*! \file mpi.h
27  *  \brief The file defines the MPI constants and structures
28  *
29  * The file defines the MPI constants and structures
30  *
31  */
32 /*******************************************************************************/
33 
34 #ifndef __MPI_H__
35 #define __MPI_H__
36 
37 /*******************************************************************************/
38 
39 /*******************************************************************************/
40 /* CONSTANTS                                                                   */
41 /*******************************************************************************/
42 /*******************************************************************************/
43 #define MPI_QUEUE_PRIORITY_HIGHEST      0xFF  /**< Highest queue priority */
44 #define MPI_QUEUE_PRIORITY_LOWEST       0x00  /**< Lowest queue priority */
45 
46 #define MPI_MAX_INBOUND_QUEUES          64     /**< Maximum number of inbound queues */
47 #define MPI_MAX_OUTBOUND_QUEUES         64     /**< Maximum number of outbound queues */
48 
49                                                /**< Max # of memory chunks supported */
50 #define MPI_MAX_MEM_REGIONS             (MPI_MAX_INBOUND_QUEUES + MPI_MAX_OUTBOUND_QUEUES) + 4
51 #define MPI_LOGSIZE                     4096  /**< default size */
52 
53 #define MPI_IB_NUM_MASK                 0x0000FFFF /**< Mask of Inbound Queue Number */
54 #define MPI_OB_NUM_MASK                 0xFFFF0000 /**< Mask of Outbound Queue Number */
55 #define MPI_OB_SHIFT                    16         /**< bits shift for outbound queue number */
56 
57 
58 #define BAR0                            0x10
59 #define BAR1                            0x14
60 #define BAR2                            0x18
61 #define BAR3                            0x1C
62 #define BAR4                            0x20
63 #define BAR5                            0x24
64 
65 /*******************************************************************************/
66 /*******************************************************************************/
67 /* ENUMERATIONS                                                                */
68 /*******************************************************************************/
69 
70 /*******************************************************************************/
71 /*******************************************************************************/
72 /** \enum mpiMsgCategory_e,
73  *  \brief MPI message categories
74  */
75 /*******************************************************************************/
76 enum mpiMsgCategory_e
77 {
78   MPI_CATEGORY_ETHERNET = 0,
79   MPI_CATEGORY_FC,
80   MPI_CATEGORY_SAS_SATA,
81   MPI_CATEGORY_SCSI
82 };
83 
84 typedef enum mpiMsgCategory_e mpiMsgCategory_t;
85 
86 /*******************************************************************************/
87 /*******************************************************************************/
88 /* TYPES                                                                       */
89 /*******************************************************************************/
90 /*******************************************************************************/
91 
92 
93 /*******************************************************************************/
94 /*******************************************************************************/
95 /* DATA STRUCTURES                                                             */
96 /*******************************************************************************/
97 /*******************************************************************************/
98 
99 /*******************************************************************************/
100 /** \struct mpiMem_s
101  *  \brief Structure that descibes memory regions
102  *
103  * The mpiMemoryDescriptor_t is used to describe the attributes for a memory
104  * region. Each element in the memory chunk has to be physically contiguous.
105  * Different elements in the memory chunk do not necessarily have to be
106  * contiguous to each other.
107  */
108 /*******************************************************************************/
109 struct mpiMem_s
110 {
111   void*        virtPtr;       /**< Virtual pointer to the memory region */
112   void*        appHandle;     /**< Handle used for the application to free memory */
113   bit32        physAddrUpper; /**< Upper 32 bits of physical address */
114   bit32        physAddrLower; /**< Lower 32 bits of physical address */
115   bit32        totalLength;   /**< Total length in bytes allocated */
116   bit32        numElements;   /**< Number of elements */
117   bit32        elementSize;   /**< Size in bytes of an element */
118   bit32        alignment;     /**< Alignment in bytes needed. A value of one indicates */
119                               /**< no specific alignment requirement */
120   bit32        type;          /**< Memory type */
121   bit32        reserved;      /**< Reserved */
122 };
123 
124 typedef struct mpiMem_s mpiMem_t;
125 
126 /*******************************************************************************/
127 /** \struct mpiMemReq_s
128  *  \brief Describes MPI memory requirements
129  *
130  * The mpiMemRequirements_t  is used to specify the memory allocation requirement
131  * for the MPI. This is the data structure used in the mpiGetRequirements()
132  * and the mpiInitialize() function calls
133  */
134 /*******************************************************************************/
135 struct mpiMemReq_s
136 {
137   bit32     count;                        /**< The number of element in the mpiMemory array */
138   mpiMem_t  region[MPI_MAX_MEM_REGIONS];  /**< Pointer to the array of structures that define memroy regions */
139 };
140 
141 typedef struct mpiMemReq_s mpiMemReq_t;
142 
143 /*******************************************************************************/
144 /** \struct mpiQCQueue_s
145  *  \brief Circular Queue descriptor
146  *
147  * This structure holds outbound circular queue attributes.
148  */
149 /*******************************************************************************/
150 struct mpiOCQueue_s
151 {
152   bit32                     qNumber;      /**< this queue number */
153   bit32                     numElements;  /**< The total number of queue elements. A value 0 disables the queue */
154   bit32                     elementSize;  /**< The size of each queue element, in bytes */
155   bit32                     priority;     /**< The queue priority. Possible values for this field are */
156                                           /**< MPI_QUEUE_PRIORITY_HIGHEST and MPI_QUEUE_PRIORITY_LOWEST */
157   bit32                     CIPCIBar;     /**< PCI Bar */
158   bit32                     CIPCIOffset;  /**< PCI Offset */
159   bit32                     DIntTOffset;  /**< Dynamic Interrupt Coalescing Timeout offset */
160   void*                     piPointer;    /**< pointer of PI (virtual address)*/
161   mpiMem_t                  memoryRegion; /**< Queue's memory region descriptor */
162   bit32                     producerIdx;  /**< Copy of the producer index */
163   bit32                     consumerIdx;  /**< Copy of the consumer index */
164   bit32                     pcibar;       /**< CPI Logical Bar Number */
165   agsaRoot_t                *agRoot;      /**< Pointer of LL Layer structure */
166 };
167 
168 typedef struct mpiOCQueue_s mpiOCQueue_t;
169 
170 /*******************************************************************************/
171 /** \struct mpiICQueue_s
172  *  \brief Circular Queue descriptor
173  *
174  * This structure holds inbound circular queue attributes.
175  */
176 /*******************************************************************************/
177 struct mpiICQueue_s
178 {
179   bit32                     qNumber;      /**< this queue number */
180   bit32                     numElements;  /**< The total number of queue elements. A value 0 disables the queue */
181   bit32                     elementSize;  /**< The size of each queue element, in bytes */
182   bit32                     priority;     /**< The queue priority. Possible values for this field are */
183                                           /**< MPI_QUEUE_PRIORITY_HIGHEST and MPI_QUEUE_PRIORITY_LOWEST */
184   bit32                     PIPCIBar;     /**< PCI Bar */
185   bit32                     PIPCIOffset;  /**< PCI Offset */
186   void*                     ciPointer;    /**< Pointer of CI (virtual Address) */
187   mpiMem_t                  memoryRegion; /**< Queue's memory region descriptor */
188   bit32                     producerIdx;  /**< Copy of the producer index */
189   bit32                     consumerIdx;  /**< Copy of the consumer index */
190 #ifdef SA_FW_TEST_BUNCH_STARTS
191   bit32                     BunchStarts_QPending;     // un-started bunched IOs on queue
192   bit32                     BunchStarts_QPendingTick; // tick value when 1st IO is bunched
193 #endif /* SA_FW_TEST_BUNCH_STARTS */
194   agsaRoot_t                *agRoot;      /**< Pointer of LL Layer structure */
195 };
196 
197 typedef struct mpiICQueue_s mpiICQueue_t;
198 
199 struct mpiHostLLConfigDescriptor_s
200 {
201   bit32 regDumpPCIBAR;
202   bit32 iQNPPD_HPPD_GEvent;                 /**< inbound Queue Process depth */
203         /* bit0-7   inbound normal priority process depth */
204         /* bit8-15  inbound high priority process depth */
205         /* bit16-23 OQ number to receive GENERAL_EVENT Notification */
206         /* bit24-31 reserved */
207   bit32 outboundHWEventPID0_3;              /**< outbound HW event for PortId 0 to 3 */
208         /* bit0-7   outbound queue number of SAS_HW event for PortId 0 */
209         /* bit8-15  outbound queue number of SAS_HW event for PortId 1 */
210         /* bit16-23 outbound queue number of SAS_HW event for PortId 2 */
211         /* bit24-31 outbound queue number of SAS_HW event for PortId 3 */
212   bit32 outboundHWEventPID4_7;              /**< outbound HW event for PortId 4 to 7 */
213         /* bit0-7   outbound queue number of SAS_HW event for PortId 4 */
214         /* bit8-15  outbound queue number of SAS_HW event for PortId 5 */
215         /* bit16-23 outbound queue number of SAS_HW event for PortId 6 */
216         /* bit24-31 outbound queue number of SAS_HW event for PortId 7 */
217   bit32 outboundNCQEventPID0_3;             /**< outbound NCQ event for PortId 0 to 3 */
218         /* bit0-7   outbound queue number of SATA_NCQ event for PortId 0 */
219         /* bit8-15  outbound queue number of SATA_NCQ event for PortId 1 */
220         /* bit16-23 outbound queue number of SATA_NCQ event for PortId 2 */
221         /* bit24-31 outbound queue number of SATA_NCQ event for PortId 3 */
222   bit32 outboundNCQEventPID4_7;             /**< outbound NCQ event for PortId 4 to 7 */
223         /* bit0-7   outbound queue number of SATA_NCQ event for PortId 4 */
224         /* bit8-15  outbound queue number of SATA_NCQ event for PortId 5 */
225         /* bit16-23 outbound queue number of SATA_NCQ event for PortId 6 */
226         /* bit24-31 outbound queue number of SATA_NCQ event for PortId 7 */
227   bit32 outboundTargetITNexusEventPID0_3;   /**< outbound target ITNexus Event for PortId 0 to 3 */
228         /* bit0-7   outbound queue number of ITNexus event for PortId 0 */
229         /* bit8-15  outbound queue number of ITNexus event for PortId 1 */
230         /* bit16-23 outbound queue number of ITNexus event for PortId 2 */
231         /* bit24-31 outbound queue number of ITNexus event for PortId 3 */
232   bit32 outboundTargetITNexusEventPID4_7;   /**< outbound target ITNexus Event for PortId 4 to 7 */
233         /* bit0-7   outbound queue number of ITNexus event for PortId 4 */
234         /* bit8-15  outbound queue number of ITNexus event for PortId 5 */
235         /* bit16-23 outbound queue number of ITNexus event for PortId 6 */
236         /* bit24-31 outbound queue number of ITNexus event for PortId 7 */
237   bit32 outboundTargetSSPEventPID0_3;       /**< outbound target SSP event for PordId 0 to 3 */
238         /* bit0-7   outbound queue number of SSP event for PortId 0 */
239         /* bit8-15  outbound queue number of SSP event for PortId 1 */
240         /* bit16-23 outbound queue number of SSP event for PortId 2 */
241         /* bit24-31 outbound queue number of SSP event for PortId 3 */
242   bit32 outboundTargetSSPEventPID4_7;       /**< outbound target SSP event for PordId 4 to 7 */
243         /* bit0-7   outbound queue number of SSP event for PortId 4 */
244         /* bit8-15  outbound queue number of SSP event for PortId 5 */
245         /* bit16-23 outbound queue number of SSP event for PortId 6 */
246         /* bit24-31 outbound queue number of SSP event for PortId 7 */
247   bit32 ioAbortDelay;   /* was reserved */                 /**< io Abort delay MPI_TABLE_CHANGE */
248   bit32 custset;                          /**< custset */
249   bit32 upperEventLogAddress;               /**< Upper physical MSGU Event log address */
250   bit32 lowerEventLogAddress;               /**< Lower physical MSGU Event log address */
251   bit32 eventLogSize;                       /**< Size of MSGU Event log, 0 means log disable */
252   bit32 eventLogOption;                     /**< Option of MSGU Event log */
253         /* bit3-0 log severity, 0x0 Disable Logging */
254         /*                      0x1 Critical Error */
255         /*                      0x2 Minor Error    */
256         /*                      0x3 Warning        */
257         /*                      0x4 Information    */
258         /*                      0x5 Debugging      */
259         /*                      0x6 - 0xF Reserved */
260   bit32 upperIOPeventLogAddress;           /**< Upper physical IOP Event log address */
261   bit32 lowerIOPeventLogAddress;           /**< Lower physical IOP Event log address */
262   bit32 IOPeventLogSize;                   /**< Size of IOP Event log, 0 means log disable */
263   bit32 IOPeventLogOption;                 /**< Option of IOP Event log */
264         /* bit3-0 log severity, 0x0 Disable Logging */
265         /*                      0x1 Critical Error */
266         /*                      0x2 Minor Error    */
267         /*                      0x3 Warning        */
268         /*                      0x4 Information    */
269         /*                      0x5 Debugging      */
270         /*                      0x6 - 0xF Reserved */
271   bit32 FatalErrorInterrupt;               /**< Fatal Error Interrupt enable and vector */
272         /* bit0     Fatal Error Interrupt Enable   */
273         /* bit1     PI/CI Address                  */
274         /* bit5     enable or disable outbound coalesce   */
275         /* bit7-6  reserved */
276         /* bit15-8  Fatal Error Interrupt Vector   */
277         /* bit31-16 Reserved                       */
278   bit32 FatalErrorDumpOffset0;             /**< Fatal Error Register Dump Offset for MSGU */
279   bit32 FatalErrorDumpLength0;             /**< Fatal Error Register Dump Length for MSGU */
280   bit32 FatalErrorDumpOffset1;             /**< Fatal Error Register Dump Offset for IOP */
281   bit32 FatalErrorDumpLength1;             /**< Fatal Error Register Dump Length for IOP */
282   bit32 HDAModeFlags;                      /**< HDA Mode Flags */
283         /* bit1-0   Bootstrap pins */
284         /* bit2     Force HDA Mode bit */
285         /* bit3     HDA Firmware load method */
286   bit32 analogSetupTblOffset;              /**< Phy Calibration Table offset */
287         /* bit23-0  phy calib table offset */
288         /* bit31-24 entry size */
289   bit32 InterruptVecTblOffset;             /**< DW23 Interrupt Vector Table */
290         /* bit23-0  interrupt vector table offset */
291         /* bit31-24 entry size */
292   bit32 phyAttributeTblOffset;             /**< DW24 SAS Phy Attribute Table Offset */
293         /* bit23-0  phy attribute table offset */
294         /* bit31-24 entry size */
295   bit32 PortRecoveryTimerPortResetTimer;  /**< DW25 Port Recovery Timer and Port Reset Timer */
296   bit32 InterruptReassertionDelay;        /**< DW26 Interrupt Reassertion Delay 0:23 Reserved 24:31 */
297 };
298 
299 typedef struct mpiHostLLConfigDescriptor_s mpiHostLLConfigDescriptor_t;
300 
301 /*******************************************************************************/
302 /** \struct mpiInboundQueueDescriptor_s
303  *  \brief MPI inbound queue attributes
304  *
305  * The mpiInboundQueueDescriptor_t structure is used to describe an inbound queue
306  * attributes
307  */
308 /*******************************************************************************/
309 struct mpiInboundQueueDescriptor_s
310 {
311   bit32                     numElements;     /**< The total number of queue elements. A value 0 disables the queue */
312   bit32                     elementSize;     /**< The size of each queue element, in bytes */
313   bit32                     priority;        /**< The queue priority. Possible values for this field are */
314                                               /**< MPI_QUEUE_PRIORITY_HIGHEST and MPI_QUEUE_PRIORITY_LOWEST */
315   bit32                     PIPCIBar;        /**< PI PCIe Bar */
316   bit32                     PIOffset;        /**< PI PCI Bar Offset */
317   void*                     ciPointer;       /**< Pointer of CI (virtual Address) */
318 };
319 
320 typedef struct mpiInboundQueueDescriptor_s mpiInboundQueueDescriptor_t;
321 
322 /*******************************************************************************/
323 /** \struct mpiOutboundQueueDescriptor_s
324  *  \brief MPI outbound queue attributes
325  *
326  * The mpiOutboundQueueDescriptor_t structure is used to describe an outbound queue
327  * attributes
328  */
329 /*******************************************************************************/
330 struct mpiOutboundQueueDescriptor_s
331 {
332   bit32                     numElements;        /**< The total number of queue elements. A value 0 disables the queue */
333   bit32                     elementSize;        /**< The size of each queue element, in bytes */
334   bit32                     interruptDelay;     /**< Delay in microseconds before the interrupt is asserted */
335                                                  /**< if the interrupt threshold has not been reached */
336   bit32                     interruptThreshold; /**< Number of interrupt events before the interrupt is asserted */
337                                                  /**< If set to 0, interrupts for this queue are disablec */
338   bit32                     interruptVector;    /**< Interrupt vector assigned to this queue */
339   bit32                     CIPCIBar;           /**< offset 0x14:PCI BAR for CI Offset */
340   bit32                     CIOffset;           /**< offset 0x18:Offset address for outbound queue CI */
341   bit32                     DIntTOffset;        /**< Dynamic Interrupt Coalescing Timeout offset */
342   bit32                     interruptEnable;    /**< Interrupt enable flag */
343   void*                     piPointer;          /**< pointer of PI (virtual address)*/
344 };
345 
346 typedef struct mpiOutboundQueueDescriptor_s mpiOutboundQueueDescriptor_t;
347 
348 /*******************************************************************************/
349 /** \struct mpiPhyCalibration_s
350  *  \brief MPI Phy Calibration Table
351  *
352  * The mpiPhyCalibration_s structure is used to set Phy Calibration
353  * attributes
354  */
355 /*******************************************************************************/
356 struct mpiPhyCalibration_s
357 {
358   bit32   spaReg0;            /* transmitter per port configuration 1 SAS_SATA G1 */
359   bit32   spaReg1;            /* transmitter per port configuration 2 SAS_SATA G1*/
360   bit32   spaReg2;            /* transmitter per port configuration 3 SAS_SATA G1*/
361   bit32   spaReg3;            /* transmitter configuration 1 */
362   bit32   spaReg4;            /* reveiver per port configuration 1 SAS_SATA G1G2 */
363   bit32   spaReg5;            /* reveiver per port configuration 2 SAS_SATA G3 */
364   bit32   spaReg6;            /* reveiver per configuration 1 */
365   bit32   spaReg7;            /* reveiver per configuration 2 */
366   bit32   reserved[2];        /* reserved */
367 };
368 
369 typedef struct mpiPhyCalibration_s mpiPhyCalibration_t;
370 
371 #define ANALOG_SETUP_ENTRY_NO              10
372 #define ANALOG_SETUP_ENTRY_SIZE            10
373 
374 
375 /*******************************************************************************/
376 /** \struct mpiConfig_s
377  *  \brief MPI layer configuration parameters
378  *
379  * The mpiConfig_s structure is used as a parameter passed in
380  * mpiGetRequirements() and mpiInitialize() to describe the MPI software
381  * configuration
382  */
383 /*******************************************************************************/
384 struct mpiVConfig_s
385 {
386   mpiHostLLConfigDescriptor_t  mainConfig;                              /**< main part of configuration table */
387   mpiInboundQueueDescriptor_t  inboundQueues[MPI_MAX_INBOUND_QUEUES];   /**< mpiQueueDescriptor structures that provide initialization */
388                                                                         /**< attributes for the inbound queues. The maximum number of */
389                                                                         /**< inbound queues is MPI_MAX_INBOUND_QUEUES */
390   mpiOutboundQueueDescriptor_t outboundQueues[MPI_MAX_OUTBOUND_QUEUES]; /**< mpiQueueDescriptor structures that provide initialization */
391                                                                         /**< attributes for the outbound queues. The maximum number of */
392                                                                         /**< inbound queues is MPI_MAX_OUTBOUND_QUEUES */
393   agsaPhyAnalogSetupTable_t    phyAnalogConfig;
394   mpiInterruptVT_t             interruptVTable;
395   sasPhyAttribute_t            phyAttributeTable;
396   bit16   numInboundQueues;
397   bit16   numOutboundQueues;
398   bit16   maxNumInboundQueues;
399   bit16   maxNumOutboundQueues;
400   bit32   queueOption;
401 };
402 
403 /*******************************************************************************/
404 /** \struct mpiConfig_s
405  *  \brief MPI layer configuration parameters
406  *
407  * The mpiConfig_s structure is used as a parameter passed in
408  * mpiGetRequirements() and mpiInitialize() to describe the MPI software
409  * configuration
410  */
411 /*******************************************************************************/
412 struct mpiConfig_s
413 {
414   mpiHostLLConfigDescriptor_t  mainConfig;                              /**< main part of configuration table */
415   mpiInboundQueueDescriptor_t  inboundQueues[MPI_MAX_INBOUND_QUEUES];   /**< mpiQueueDescriptor structures that provide initialization */
416                                                                         /**< attributes for the inbound queues. The maximum number of */
417                                                                         /**< inbound queues is MPI_MAX_INBOUND_QUEUES */
418   mpiOutboundQueueDescriptor_t outboundQueues[MPI_MAX_OUTBOUND_QUEUES]; /**< mpiQueueDescriptor structures that provide initialization */
419                                                                         /**< attributes for the outbound queues. The maximum number of */
420                                                                         /**< inbound queues is MPI_MAX_OUTBOUND_QUEUES */
421   agsaPhyAnalogSetupTable_t    phyAnalogConfig;
422   bit16   numInboundQueues;
423   bit16   numOutboundQueues;
424   bit16   maxNumInboundQueues;
425   bit16   maxNumOutboundQueues;
426   bit32   queueOption;
427 };
428 
429 typedef struct mpiConfig_s  mpiConfig_t;
430 
431 #define TX_PORT_CFG1_OFFSET                0x00
432 #define TX_PORT_CFG2_OFFSET                0x04
433 #define TX_PORT_CFG3_OFFSET                0x08
434 #define TX_CFG_OFFSET                      0x0c
435 #define RV_PORT_CFG1_OFFSET                0x10
436 #define RV_PORT_CFG2_OFFSET                0x14
437 #define RV_CFG1_OFFSET                     0x18
438 #define RV_CFG2_OFFSET                     0x1c
439 
440 /*******************************************************************************/
441 /*******************************************************************************/
442 /* FUNCTIONS                                                                   */
443 /*******************************************************************************/
444 /*******************************************************************************/
445 /*******************************************************************************/
446 void      mpiRequirementsGet(mpiConfig_t *config, mpiMemReq_t *memoryRequirement);
447 FORCEINLINE bit32 mpiMsgFreeGet(mpiICQueue_t *circularQ, bit16 messageSize, void** messagePtr);
448 FORCEINLINE bit32 mpiMsgProduce(mpiICQueue_t *circularQ, void* messagePtr,
449                         mpiMsgCategory_t category, bit16 opCode,
450                         bit8 responseQueue, bit8 hiPriority);
451 #ifdef LOOPBACK_MPI
452 GLOBAL bit32 mpiMsgProduceOQ(mpiOCQueue_t *circularQ, void *messagePtr,
453                              mpiMsgCategory_t category, bit16 opCode,
454                              bit8 responseQueue, bit8 hiPriority);
455 GLOBAL bit32 mpiMsgFreeGetOQ(mpiOCQueue_t *circularQ, bit16 messageSize,
456                              void** messagePtr);
457 #endif
458 
459 #ifdef FAST_IO_TEST
460 bit32     mpiMsgPrepare(mpiICQueue_t *circularQ, void* messagePtr,
461                         mpiMsgCategory_t category, bit16 opCode,
462                         bit8 responseQueue, bit8 hiPriority);
463 
464 bit32     mpiMsgProduceSend(mpiICQueue_t *circularQ, void* messagePtr,
465                         mpiMsgCategory_t category, bit16 opCode,
466                         bit8 responseQueue, bit8 hiPriority, int sendFl);
467 GLOBAL void mpiIBQMsgSend(mpiICQueue_t *circularQ);
468 #define INQ(queueNum) (bit8)(queueNum & MPI_IB_NUM_MASK)
469 #define OUQ(queueNum) (bit8)((queueNum & MPI_OB_NUM_MASK) >> MPI_OB_SHIFT)
470 #endif
471 
472 FORCEINLINE bit32 mpiMsgConsume(mpiOCQueue_t *circularQ, void** messagePtr1, mpiMsgCategory_t *pCategory, bit16* pOpCode, bit8 *pBC);
473 FORCEINLINE bit32 mpiMsgFreeSet(mpiOCQueue_t *circularQ, void* messagePtr1, bit8 bc);
474 
475 #endif /* __MPI_H__ */
476 
477