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