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