xref: /freebsd/sys/dev/pms/RefTisa/sallsdk/spc/sainit.c (revision 685dc743)
14e1bc9a0SAchim Leubner /*******************************************************************************
24e1bc9a0SAchim Leubner *Copyright (c) 2014 PMC-Sierra, Inc.  All rights reserved.
34e1bc9a0SAchim Leubner *
44e1bc9a0SAchim Leubner *Redistribution and use in source and binary forms, with or without modification, are permitted provided
54e1bc9a0SAchim Leubner *that the following conditions are met:
64e1bc9a0SAchim Leubner *1. Redistributions of source code must retain the above copyright notice, this list of conditions and the
74e1bc9a0SAchim Leubner *following disclaimer.
84e1bc9a0SAchim Leubner *2. Redistributions in binary form must reproduce the above copyright notice,
94e1bc9a0SAchim Leubner *this list of conditions and the following disclaimer in the documentation and/or other materials provided
104e1bc9a0SAchim Leubner *with the distribution.
114e1bc9a0SAchim Leubner *
124e1bc9a0SAchim Leubner *THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED
134e1bc9a0SAchim Leubner *WARRANTIES,INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
144e1bc9a0SAchim Leubner *FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
154e1bc9a0SAchim Leubner *FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
164e1bc9a0SAchim Leubner *NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
174e1bc9a0SAchim Leubner *BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
184e1bc9a0SAchim Leubner *LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
194e1bc9a0SAchim Leubner *SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
204e1bc9a0SAchim Leubner 
214e1bc9a0SAchim Leubner ********************************************************************************/
224e1bc9a0SAchim Leubner /*******************************************************************************/
234e1bc9a0SAchim Leubner /*! \file sainit.c
244e1bc9a0SAchim Leubner  *  \brief The file implements the functions to initialize the LL layer
254e1bc9a0SAchim Leubner  *
264e1bc9a0SAchim Leubner  */
274e1bc9a0SAchim Leubner /******************************************************************************/
284e1bc9a0SAchim Leubner #include <sys/cdefs.h>
294e1bc9a0SAchim Leubner #include <dev/pms/config.h>
304e1bc9a0SAchim Leubner 
314e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/sallsdk/spc/saglobal.h>
324e1bc9a0SAchim Leubner #ifdef SA_ENABLE_TRACE_FUNCTIONS
334e1bc9a0SAchim Leubner #ifdef siTraceFileID
344e1bc9a0SAchim Leubner #undef siTraceFileID
354e1bc9a0SAchim Leubner #endif
364e1bc9a0SAchim Leubner #define siTraceFileID 'F'
374e1bc9a0SAchim Leubner #endif
384e1bc9a0SAchim Leubner 
394e1bc9a0SAchim Leubner bit32 gLLDebugLevel         = 3;
404e1bc9a0SAchim Leubner 
414e1bc9a0SAchim Leubner #if defined(SALLSDK_DEBUG)
424e1bc9a0SAchim Leubner bit32 gLLDebugLevelSet      = 0; // block reinitialize from updating
434e1bc9a0SAchim Leubner bit32 gLLLogFuncDebugLevel  = 0;
444e1bc9a0SAchim Leubner bit32 gLLSoftResetCounter   = 0;
454e1bc9a0SAchim Leubner #endif
464e1bc9a0SAchim Leubner 
474e1bc9a0SAchim Leubner bit32 gPollForMissingInt;
484e1bc9a0SAchim Leubner 
494e1bc9a0SAchim Leubner #ifdef FW_EVT_LOG_TST
504d24901aSPedro F. Giffuni void  *eventLogAddress = NULL;
514e1bc9a0SAchim Leubner #endif
524e1bc9a0SAchim Leubner 
534e1bc9a0SAchim Leubner extern bit32 gWait_3;
544e1bc9a0SAchim Leubner extern bit32 gWait_2;
554e1bc9a0SAchim Leubner bit32 gFPGA_TEST = 0; // If set unblock fpga functions
564e1bc9a0SAchim Leubner 
574e1bc9a0SAchim Leubner /******************************************************************************/
584e1bc9a0SAchim Leubner /*! \brief Get the memory and lock requirement from LL layer
594e1bc9a0SAchim Leubner  *
604e1bc9a0SAchim Leubner  *  Get the memory and lock requirement from LL layer
614e1bc9a0SAchim Leubner  *
624e1bc9a0SAchim Leubner  *  \param agRoot             Handles for this instance of SAS/SATA hardware
634e1bc9a0SAchim Leubner  *  \param swConfig           Pointer to the software configuration
644e1bc9a0SAchim Leubner  *  \param memoryRequirement  Point to the data structure that holds the different
654e1bc9a0SAchim Leubner  *                                       chunks of memory that are required
664e1bc9a0SAchim Leubner  *  \param usecsPerTick       micro-seconds per tick for the LL layer
674e1bc9a0SAchim Leubner  *  \param maxNumLocks        maximum number of locks for the LL layer
684e1bc9a0SAchim Leubner  *
694e1bc9a0SAchim Leubner  *  \return -void-
704e1bc9a0SAchim Leubner  *
714e1bc9a0SAchim Leubner  */
724e1bc9a0SAchim Leubner /*******************************************************************************/
saGetRequirements(agsaRoot_t * agRoot,agsaSwConfig_t * swConfig,agsaMemoryRequirement_t * memoryRequirement,bit32 * usecsPerTick,bit32 * maxNumLocks)734e1bc9a0SAchim Leubner GLOBAL void saGetRequirements(
744e1bc9a0SAchim Leubner   agsaRoot_t              *agRoot,
754e1bc9a0SAchim Leubner   agsaSwConfig_t          *swConfig,
764e1bc9a0SAchim Leubner   agsaMemoryRequirement_t *memoryRequirement,
774e1bc9a0SAchim Leubner   bit32                   *usecsPerTick,
784e1bc9a0SAchim Leubner   bit32                   *maxNumLocks
794e1bc9a0SAchim Leubner   )
804e1bc9a0SAchim Leubner {
814e1bc9a0SAchim Leubner   bit32               memoryReqCount = 0;
824e1bc9a0SAchim Leubner   bit32               i;
834e1bc9a0SAchim Leubner   static mpiConfig_t  mpiConfig;
844e1bc9a0SAchim Leubner   static mpiMemReq_t  mpiMemoryRequirement;
854e1bc9a0SAchim Leubner 
864e1bc9a0SAchim Leubner 
874e1bc9a0SAchim Leubner   /* sanity check */
884e1bc9a0SAchim Leubner   SA_ASSERT((agNULL != swConfig), "");
894e1bc9a0SAchim Leubner   SA_ASSERT((agNULL != memoryRequirement), "");
904e1bc9a0SAchim Leubner   SA_ASSERT((agNULL != usecsPerTick), "");
914e1bc9a0SAchim Leubner   SA_ASSERT((agNULL != maxNumLocks), "");
924e1bc9a0SAchim Leubner 
934e1bc9a0SAchim Leubner   si_memset(&mpiMemoryRequirement, 0, sizeof(mpiMemReq_t));
944e1bc9a0SAchim Leubner   si_memset(&mpiConfig, 0, sizeof(mpiConfig_t));
954e1bc9a0SAchim Leubner 
964e1bc9a0SAchim Leubner   SA_DBG1(("saGetRequirements:agRoot %p swConfig %p memoryRequirement %p usecsPerTick %p maxNumLocks %p\n",agRoot, swConfig,memoryRequirement,usecsPerTick,maxNumLocks));
974e1bc9a0SAchim Leubner   SA_DBG1(("saGetRequirements: usecsPerTick 0x%x (%d)\n",*usecsPerTick,*usecsPerTick));
984e1bc9a0SAchim Leubner 
994e1bc9a0SAchim Leubner   /* Get Resource Requirements for SPC MPI */
1004e1bc9a0SAchim Leubner   /* Set the default/specified requirements swConfig from TD layer */
1014e1bc9a0SAchim Leubner   siConfiguration(agRoot, &mpiConfig, agNULL, swConfig);
1024e1bc9a0SAchim Leubner   mpiRequirementsGet(&mpiConfig, &mpiMemoryRequirement);
1034e1bc9a0SAchim Leubner 
1044e1bc9a0SAchim Leubner   /* memory requirement for saRoot, CACHE memory */
1054e1bc9a0SAchim Leubner   memoryRequirement->agMemory[LLROOT_MEM_INDEX].singleElementLength = sizeof(agsaLLRoot_t);
1064e1bc9a0SAchim Leubner   memoryRequirement->agMemory[LLROOT_MEM_INDEX].numElements = 1;
1074e1bc9a0SAchim Leubner   memoryRequirement->agMemory[LLROOT_MEM_INDEX].totalLength = sizeof(agsaLLRoot_t);
1084e1bc9a0SAchim Leubner   memoryRequirement->agMemory[LLROOT_MEM_INDEX].alignment = sizeof(void *);
1094e1bc9a0SAchim Leubner   memoryRequirement->agMemory[LLROOT_MEM_INDEX].type = AGSA_CACHED_MEM;
1104e1bc9a0SAchim Leubner   memoryReqCount ++;
1114e1bc9a0SAchim Leubner 
1124e1bc9a0SAchim Leubner   SA_DBG1(("saGetRequirements: agMemory[LLROOT_MEM_INDEX] singleElementLength = 0x%x totalLength = 0x%x align = 0x%x type %x\n",
1134e1bc9a0SAchim Leubner            memoryRequirement->agMemory[LLROOT_MEM_INDEX].singleElementLength,
1144e1bc9a0SAchim Leubner            memoryRequirement->agMemory[LLROOT_MEM_INDEX].totalLength,
1154e1bc9a0SAchim Leubner            memoryRequirement->agMemory[LLROOT_MEM_INDEX].alignment,
1164e1bc9a0SAchim Leubner            memoryRequirement->agMemory[LLROOT_MEM_INDEX].type ));
1174e1bc9a0SAchim Leubner 
1184e1bc9a0SAchim Leubner   /* memory requirement for Device Links, CACHE memory */
1194e1bc9a0SAchim Leubner   memoryRequirement->agMemory[DEVICELINK_MEM_INDEX].singleElementLength = sizeof(agsaDeviceDesc_t);
1204e1bc9a0SAchim Leubner   memoryRequirement->agMemory[DEVICELINK_MEM_INDEX].numElements = swConfig->numDevHandles;
1214e1bc9a0SAchim Leubner   memoryRequirement->agMemory[DEVICELINK_MEM_INDEX].totalLength = sizeof(agsaDeviceDesc_t)
1224e1bc9a0SAchim Leubner                                                                 * swConfig->numDevHandles;
1234e1bc9a0SAchim Leubner   memoryRequirement->agMemory[DEVICELINK_MEM_INDEX].alignment = sizeof(void *);
1244e1bc9a0SAchim Leubner   memoryRequirement->agMemory[DEVICELINK_MEM_INDEX].type = AGSA_CACHED_MEM;
1254e1bc9a0SAchim Leubner   memoryReqCount ++;
1264e1bc9a0SAchim Leubner   SA_DBG1(("saGetRequirements: agMemory[DEVICELINK_MEM_INDEX] singleElementLength = 0x%x totalLength = 0x%x align = 0x%x type %x\n",
1274e1bc9a0SAchim Leubner            memoryRequirement->agMemory[DEVICELINK_MEM_INDEX].singleElementLength,
1284e1bc9a0SAchim Leubner            memoryRequirement->agMemory[DEVICELINK_MEM_INDEX].totalLength,
1294e1bc9a0SAchim Leubner            memoryRequirement->agMemory[DEVICELINK_MEM_INDEX].alignment,
1304e1bc9a0SAchim Leubner            memoryRequirement->agMemory[DEVICELINK_MEM_INDEX].type ));
1314e1bc9a0SAchim Leubner 
1324e1bc9a0SAchim Leubner   /* memory requirement for IORequest Links, CACHE memory */
1334e1bc9a0SAchim Leubner   memoryRequirement->agMemory[IOREQLINK_MEM_INDEX].singleElementLength = sizeof(agsaIORequestDesc_t);
1344e1bc9a0SAchim Leubner   /*
1354e1bc9a0SAchim Leubner   Add SA_RESERVED_REQUEST_COUNT to guarantee quality of service
1364e1bc9a0SAchim Leubner   */
1374e1bc9a0SAchim Leubner   memoryRequirement->agMemory[IOREQLINK_MEM_INDEX].numElements = swConfig->maxActiveIOs + SA_RESERVED_REQUEST_COUNT;
1384e1bc9a0SAchim Leubner   memoryRequirement->agMemory[IOREQLINK_MEM_INDEX].totalLength = sizeof(agsaIORequestDesc_t) *
1394e1bc9a0SAchim Leubner                 memoryRequirement->agMemory[IOREQLINK_MEM_INDEX].numElements;
1404e1bc9a0SAchim Leubner   memoryRequirement->agMemory[IOREQLINK_MEM_INDEX].alignment = sizeof(void *);
1414e1bc9a0SAchim Leubner   memoryRequirement->agMemory[IOREQLINK_MEM_INDEX].type = AGSA_CACHED_MEM;
1424e1bc9a0SAchim Leubner   memoryReqCount ++;
1434e1bc9a0SAchim Leubner 
1444e1bc9a0SAchim Leubner   SA_DBG1(("saGetRequirements: agMemory[IOREQLINK_MEM_INDEX] singleElementLength = 0x%x totalLength = 0x%x align = 0x%x type %x\n",
1454e1bc9a0SAchim Leubner            memoryRequirement->agMemory[IOREQLINK_MEM_INDEX].singleElementLength,
1464e1bc9a0SAchim Leubner            memoryRequirement->agMemory[IOREQLINK_MEM_INDEX].totalLength,
1474e1bc9a0SAchim Leubner            memoryRequirement->agMemory[IOREQLINK_MEM_INDEX].alignment,
1484e1bc9a0SAchim Leubner            memoryRequirement->agMemory[IOREQLINK_MEM_INDEX].type ));
1494e1bc9a0SAchim Leubner 
1504e1bc9a0SAchim Leubner   /* memory requirement for Timer Links, CACHE memory */
1514e1bc9a0SAchim Leubner   memoryRequirement->agMemory[TIMERLINK_MEM_INDEX].singleElementLength = sizeof(agsaTimerDesc_t);
1524e1bc9a0SAchim Leubner   memoryRequirement->agMemory[TIMERLINK_MEM_INDEX].numElements = NUM_TIMERS;
1534e1bc9a0SAchim Leubner   memoryRequirement->agMemory[TIMERLINK_MEM_INDEX].totalLength = sizeof(agsaTimerDesc_t) * NUM_TIMERS;
1544e1bc9a0SAchim Leubner   memoryRequirement->agMemory[TIMERLINK_MEM_INDEX].alignment = sizeof(void *);
1554e1bc9a0SAchim Leubner   memoryRequirement->agMemory[TIMERLINK_MEM_INDEX].type = AGSA_CACHED_MEM;
1564e1bc9a0SAchim Leubner   memoryReqCount ++;
1574e1bc9a0SAchim Leubner   SA_DBG1(("saGetRequirements: agMemory[TIMERLINK_MEM_INDEX] singleElementLength = 0x%x totalLength = 0x%x align = 0x%x type %x\n",
1584e1bc9a0SAchim Leubner            memoryRequirement->agMemory[TIMERLINK_MEM_INDEX].singleElementLength,
1594e1bc9a0SAchim Leubner            memoryRequirement->agMemory[TIMERLINK_MEM_INDEX].totalLength,
1604e1bc9a0SAchim Leubner            memoryRequirement->agMemory[TIMERLINK_MEM_INDEX].alignment,
1614e1bc9a0SAchim Leubner            memoryRequirement->agMemory[TIMERLINK_MEM_INDEX].type ));
1624e1bc9a0SAchim Leubner 
1634e1bc9a0SAchim Leubner #ifdef SA_ENABLE_TRACE_FUNCTIONS
1644e1bc9a0SAchim Leubner 
1654e1bc9a0SAchim Leubner   /* memory requirement for LL trace memory */
1664e1bc9a0SAchim Leubner   memoryRequirement->agMemory[LL_FUNCTION_TRACE].singleElementLength = 1;
1674e1bc9a0SAchim Leubner   memoryRequirement->agMemory[LL_FUNCTION_TRACE].numElements = swConfig->TraceBufferSize;
1684e1bc9a0SAchim Leubner   memoryRequirement->agMemory[LL_FUNCTION_TRACE].totalLength = swConfig->TraceBufferSize;
1694e1bc9a0SAchim Leubner   memoryRequirement->agMemory[LL_FUNCTION_TRACE].alignment = sizeof(void *);
1704e1bc9a0SAchim Leubner   memoryRequirement->agMemory[LL_FUNCTION_TRACE].type = AGSA_CACHED_MEM;
1714e1bc9a0SAchim Leubner   memoryReqCount ++;
1724e1bc9a0SAchim Leubner 
1734e1bc9a0SAchim Leubner   SA_DBG1(("saGetRequirements: agMemory[LL_FUNCTION_TRACE] singleElementLength = 0x%x totalLength = 0x%x align = 0x%x type %x\n",
1744e1bc9a0SAchim Leubner            memoryRequirement->agMemory[LL_FUNCTION_TRACE].singleElementLength,
1754e1bc9a0SAchim Leubner            memoryRequirement->agMemory[LL_FUNCTION_TRACE].totalLength,
1764e1bc9a0SAchim Leubner            memoryRequirement->agMemory[LL_FUNCTION_TRACE].alignment,
1774e1bc9a0SAchim Leubner            memoryRequirement->agMemory[LL_FUNCTION_TRACE].type ));
1784e1bc9a0SAchim Leubner 
1794e1bc9a0SAchim Leubner #endif /* END SA_ENABLE_TRACE_FUNCTIONS */
1804e1bc9a0SAchim Leubner 
1814e1bc9a0SAchim Leubner #ifdef FAST_IO_TEST
1824e1bc9a0SAchim Leubner   {
1834e1bc9a0SAchim Leubner   agsaMem_t *agMemory = memoryRequirement->agMemory;
1844e1bc9a0SAchim Leubner 
1854e1bc9a0SAchim Leubner   /* memory requirement for Super IO CACHE memory */
1864e1bc9a0SAchim Leubner   agMemory[LL_FAST_IO].singleElementLength = sizeof(saFastRequest_t);
1874e1bc9a0SAchim Leubner   agMemory[LL_FAST_IO].numElements = LL_FAST_IO_SIZE;
1884e1bc9a0SAchim Leubner   agMemory[LL_FAST_IO].totalLength = LL_FAST_IO_SIZE *
1894e1bc9a0SAchim Leubner                                      agMemory[LL_FAST_IO].singleElementLength;
1904e1bc9a0SAchim Leubner   agMemory[LL_FAST_IO].alignment = sizeof(void*);
1914e1bc9a0SAchim Leubner   agMemory[LL_FAST_IO].type = AGSA_CACHED_MEM;
1924e1bc9a0SAchim Leubner   memoryReqCount ++;
1934e1bc9a0SAchim Leubner 
1944e1bc9a0SAchim Leubner   SA_DBG1(("saGetRequirements: agMemory[LL_FAST_IO] singleElementLength = 0x%x totalLength = 0x%x align = 0x%x type %x\n",
1954e1bc9a0SAchim Leubner            memoryRequirement->agMemory[LL_FAST_IO].singleElementLength,
1964e1bc9a0SAchim Leubner            memoryRequirement->agMemory[LL_FAST_IO].totalLength,
1974e1bc9a0SAchim Leubner            memoryRequirement->agMemory[LL_FAST_IO].alignment,
1984e1bc9a0SAchim Leubner            memoryRequirement->agMemory[LL_FAST_IO].type ));
1994e1bc9a0SAchim Leubner 
2004e1bc9a0SAchim Leubner   }
2014e1bc9a0SAchim Leubner #endif
2024e1bc9a0SAchim Leubner 
2034e1bc9a0SAchim Leubner #ifdef SA_ENABLE_HDA_FUNCTIONS
2044e1bc9a0SAchim Leubner   {
2054e1bc9a0SAchim Leubner   agsaMem_t *agMemory = memoryRequirement->agMemory;
2064e1bc9a0SAchim Leubner 
2074e1bc9a0SAchim Leubner   /* memory requirement for HDA FW image */
2084e1bc9a0SAchim Leubner   agMemory[HDA_DMA_BUFFER].singleElementLength = (1024 * 1024); /* must be greater than size of aap1 fw image */
2094e1bc9a0SAchim Leubner   agMemory[HDA_DMA_BUFFER].numElements = 1;
2104e1bc9a0SAchim Leubner   agMemory[HDA_DMA_BUFFER].totalLength = agMemory[HDA_DMA_BUFFER].numElements *
2114e1bc9a0SAchim Leubner                                      agMemory[HDA_DMA_BUFFER].singleElementLength;
2124e1bc9a0SAchim Leubner   agMemory[HDA_DMA_BUFFER].alignment = 32;
2134e1bc9a0SAchim Leubner   agMemory[HDA_DMA_BUFFER].type = AGSA_DMA_MEM;
2144e1bc9a0SAchim Leubner   memoryReqCount ++;
2154e1bc9a0SAchim Leubner   SA_DBG1(("saGetRequirements: agMemory[HDA_DMA_BUFFER] singleElementLength = 0x%x totalLength = 0x%x align = 0x%x type %x\n",
2164e1bc9a0SAchim Leubner            memoryRequirement->agMemory[HDA_DMA_BUFFER].singleElementLength,
2174e1bc9a0SAchim Leubner            memoryRequirement->agMemory[HDA_DMA_BUFFER].totalLength,
2184e1bc9a0SAchim Leubner            memoryRequirement->agMemory[HDA_DMA_BUFFER].alignment,
2194e1bc9a0SAchim Leubner            memoryRequirement->agMemory[HDA_DMA_BUFFER].type ));
2204e1bc9a0SAchim Leubner   }
2214e1bc9a0SAchim Leubner #endif /* SA_ENABLE_HDA_FUNCTIONS */
2224e1bc9a0SAchim Leubner 
2234e1bc9a0SAchim Leubner   /* memory requirement for MPI MSGU layer, DMA memory */
2244e1bc9a0SAchim Leubner   for ( i = 0; i < mpiMemoryRequirement.count; i ++ )
2254e1bc9a0SAchim Leubner   {
2264e1bc9a0SAchim Leubner     memoryRequirement->agMemory[memoryReqCount].singleElementLength = mpiMemoryRequirement.region[i].elementSize;
2274e1bc9a0SAchim Leubner     memoryRequirement->agMemory[memoryReqCount].numElements         = mpiMemoryRequirement.region[i].numElements;
2284e1bc9a0SAchim Leubner     memoryRequirement->agMemory[memoryReqCount].totalLength         = mpiMemoryRequirement.region[i].totalLength;
2294e1bc9a0SAchim Leubner     memoryRequirement->agMemory[memoryReqCount].alignment           = mpiMemoryRequirement.region[i].alignment;
2304e1bc9a0SAchim Leubner     memoryRequirement->agMemory[memoryReqCount].type                = mpiMemoryRequirement.region[i].type;
2314e1bc9a0SAchim Leubner     SA_DBG1(("saGetRequirements:MPI agMemory[%d] singleElementLength = 0x%x  totalLength = 0x%x align = 0x%x type %x\n",
2324e1bc9a0SAchim Leubner           memoryReqCount,
2334e1bc9a0SAchim Leubner           memoryRequirement->agMemory[memoryReqCount].singleElementLength,
2344e1bc9a0SAchim Leubner           memoryRequirement->agMemory[memoryReqCount].totalLength,
2354e1bc9a0SAchim Leubner           memoryRequirement->agMemory[memoryReqCount].alignment,
2364e1bc9a0SAchim Leubner           memoryRequirement->agMemory[memoryReqCount].type ));
2374e1bc9a0SAchim Leubner     memoryReqCount ++;
2384e1bc9a0SAchim Leubner   }
2394e1bc9a0SAchim Leubner 
2404e1bc9a0SAchim Leubner 
2414e1bc9a0SAchim Leubner   /* requirement for locks */
2424e1bc9a0SAchim Leubner   if (swConfig->param3 == agNULL)
2434e1bc9a0SAchim Leubner   {
2444e1bc9a0SAchim Leubner     *maxNumLocks = (LL_IOREQ_IBQ_LOCK + AGSA_MAX_INBOUND_Q );
2454e1bc9a0SAchim Leubner     SA_DBG1(("saGetRequirements: param3 == agNULL maxNumLocks   %d\n", *maxNumLocks ));
2464e1bc9a0SAchim Leubner   }
2474e1bc9a0SAchim Leubner   else
2484e1bc9a0SAchim Leubner   {
2494e1bc9a0SAchim Leubner     agsaQueueConfig_t *queueConfig;
2504e1bc9a0SAchim Leubner     queueConfig = (agsaQueueConfig_t *)swConfig->param3;
2514e1bc9a0SAchim Leubner     *maxNumLocks = (LL_IOREQ_IBQ_LOCK_PARM + queueConfig->numInboundQueues );
2524e1bc9a0SAchim Leubner     SA_DBG1(("saGetRequirements: maxNumLocks   %d\n", *maxNumLocks ));
2534e1bc9a0SAchim Leubner   }
2544e1bc9a0SAchim Leubner 
2554e1bc9a0SAchim Leubner 
2564e1bc9a0SAchim Leubner   /* setup the time tick */
2574e1bc9a0SAchim Leubner   *usecsPerTick = SA_USECS_PER_TICK;
2584e1bc9a0SAchim Leubner 
2594e1bc9a0SAchim Leubner   SA_ASSERT(memoryReqCount < AGSA_NUM_MEM_CHUNKS, "saGetRequirements: Exceed max number of memory place holder");
2604e1bc9a0SAchim Leubner 
2614e1bc9a0SAchim Leubner   /* set up memory requirement count */
2624e1bc9a0SAchim Leubner   memoryRequirement->count = memoryReqCount;
2634e1bc9a0SAchim Leubner 
2644e1bc9a0SAchim Leubner   swConfig->legacyInt_X = 1;
2654e1bc9a0SAchim Leubner   swConfig->max_MSI_InterruptVectors = 32;
2664e1bc9a0SAchim Leubner   swConfig->max_MSIX_InterruptVectors = 64;//16;
2674e1bc9a0SAchim Leubner 
2684e1bc9a0SAchim Leubner   SA_DBG1(("saGetRequirements:  swConfig->stallUsec  %d\n",swConfig->stallUsec  ));
2694e1bc9a0SAchim Leubner 
2704e1bc9a0SAchim Leubner #ifdef SA_CONFIG_MDFD_REGISTRY
2714e1bc9a0SAchim Leubner   SA_DBG1(("saGetRequirements:  swConfig->disableMDF %d\n",swConfig->disableMDF));
2724e1bc9a0SAchim Leubner #endif /*SA_CONFIG_MDFD_REGISTRY*/
2734e1bc9a0SAchim Leubner   /*SA_DBG1(("saGetRequirements:  swConfig->enableDIF  %d\n",swConfig->enableDIF  ));*/
2744e1bc9a0SAchim Leubner   /*SA_DBG1(("saGetRequirements:  swConfig->enableEncryption  %d\n",swConfig->enableEncryption  ));*/
2754e1bc9a0SAchim Leubner #ifdef SA_ENABLE_HDA_FUNCTIONS
2764e1bc9a0SAchim Leubner   swConfig->hostDirectAccessSupport = 1;
2774e1bc9a0SAchim Leubner   swConfig->hostDirectAccessMode = 0;
2784e1bc9a0SAchim Leubner #else
2794e1bc9a0SAchim Leubner   swConfig->hostDirectAccessSupport = 0;
2804e1bc9a0SAchim Leubner   swConfig->hostDirectAccessMode = 0;
2814e1bc9a0SAchim Leubner #endif
2824e1bc9a0SAchim Leubner 
2834e1bc9a0SAchim Leubner }
2844e1bc9a0SAchim Leubner 
2854e1bc9a0SAchim Leubner /******************************************************************************/
2864e1bc9a0SAchim Leubner /*! \brief Initialize the Hardware
2874e1bc9a0SAchim Leubner  *
2884e1bc9a0SAchim Leubner  *  Initialize the Hardware
2894e1bc9a0SAchim Leubner  *
2904e1bc9a0SAchim Leubner  *  \param agRoot             Handles for this instance of SAS/SATA hardware
2914e1bc9a0SAchim Leubner  *  \param memoryAllocated    Point to the data structure that holds the different
2924e1bc9a0SAchim Leubner                                         chunks of memory that are required
2934e1bc9a0SAchim Leubner  *  \param hwConfig           Pointer to the hardware configuration
2944e1bc9a0SAchim Leubner  *  \param swConfig           Pointer to the software configuration
2954e1bc9a0SAchim Leubner  *  \param usecsPerTick       micro-seconds per tick for the LL layer
2964e1bc9a0SAchim Leubner  *
2974e1bc9a0SAchim Leubner  *  \return If initialization is successful
2984e1bc9a0SAchim Leubner  *          - \e AGSA_RC_SUCCESS initialization is successful
2994e1bc9a0SAchim Leubner  *          - \e AGSA_RC_FAILURE initialization is not successful
3004e1bc9a0SAchim Leubner  */
3014e1bc9a0SAchim Leubner /*******************************************************************************/
saInitialize(agsaRoot_t * agRoot,agsaMemoryRequirement_t * memoryAllocated,agsaHwConfig_t * hwConfig,agsaSwConfig_t * swConfig,bit32 usecsPerTick)3024e1bc9a0SAchim Leubner GLOBAL bit32 saInitialize(
3034e1bc9a0SAchim Leubner   agsaRoot_t              *agRoot,
3044e1bc9a0SAchim Leubner   agsaMemoryRequirement_t *memoryAllocated,
3054e1bc9a0SAchim Leubner   agsaHwConfig_t          *hwConfig,
3064e1bc9a0SAchim Leubner   agsaSwConfig_t          *swConfig,
3074e1bc9a0SAchim Leubner   bit32                   usecsPerTick
3084e1bc9a0SAchim Leubner   )
3094e1bc9a0SAchim Leubner {
3104e1bc9a0SAchim Leubner   agsaLLRoot_t          *saRoot;
3114e1bc9a0SAchim Leubner   agsaDeviceDesc_t      *pDeviceDesc;
3124e1bc9a0SAchim Leubner   agsaIORequestDesc_t   *pRequestDesc;
3134e1bc9a0SAchim Leubner   agsaTimerDesc_t       *pTimerDesc;
3144e1bc9a0SAchim Leubner   agsaPort_t            *pPort;
3154e1bc9a0SAchim Leubner   agsaPortMap_t         *pPortMap;
3164e1bc9a0SAchim Leubner   agsaDeviceMap_t       *pDeviceMap;
3174e1bc9a0SAchim Leubner   agsaIOMap_t           *pIOMap;
3184e1bc9a0SAchim Leubner   bit32                 maxNumIODevices;
3194e1bc9a0SAchim Leubner   bit32                 i, j;
3204e1bc9a0SAchim Leubner   static mpiMemReq_t    mpiMemoryAllocated;
3214e1bc9a0SAchim Leubner   bit32                 Tried_NO_HDA = agFALSE;
3224e1bc9a0SAchim Leubner   bit32                 Double_Reset_HDA = agFALSE;
3234e1bc9a0SAchim Leubner   bit32                 ret = AGSA_RC_SUCCESS;
3244e1bc9a0SAchim Leubner #ifdef FAST_IO_TEST
3254e1bc9a0SAchim Leubner   void   *fr; /* saFastRequest_t */
3264e1bc9a0SAchim Leubner   bit32  size;
3274e1bc9a0SAchim Leubner   bit32  alignment;
3284e1bc9a0SAchim Leubner #endif
3294e1bc9a0SAchim Leubner 
3304e1bc9a0SAchim Leubner   /* sanity check */
3314e1bc9a0SAchim Leubner   SA_ASSERT((agNULL != agRoot), "");
3324e1bc9a0SAchim Leubner   SA_ASSERT((agNULL != memoryAllocated), "");
3334e1bc9a0SAchim Leubner   SA_ASSERT((agNULL != hwConfig), "");
3344e1bc9a0SAchim Leubner   SA_ASSERT((agNULL != swConfig), "");
3354e1bc9a0SAchim Leubner   SA_ASSERT((LLROOT_MEM_INDEX < memoryAllocated->count), "");
3364e1bc9a0SAchim Leubner   SA_ASSERT((DEVICELINK_MEM_INDEX < memoryAllocated->count), "");
3374e1bc9a0SAchim Leubner   SA_ASSERT((IOREQLINK_MEM_INDEX < memoryAllocated->count), "");
3384e1bc9a0SAchim Leubner   SA_ASSERT((TIMERLINK_MEM_INDEX < memoryAllocated->count), "");
3394e1bc9a0SAchim Leubner 
3404e1bc9a0SAchim Leubner   si_memset(&mpiMemoryAllocated, 0, sizeof(mpiMemReq_t));
3414e1bc9a0SAchim Leubner 
3424e1bc9a0SAchim Leubner   si_macro_check(agRoot);
3434e1bc9a0SAchim Leubner 
3444e1bc9a0SAchim Leubner   SA_DBG1(("saInitialize: WAIT_INCREMENT %d\n", WAIT_INCREMENT ));
3454e1bc9a0SAchim Leubner   SA_DBG1(("saInitialize: usecsPerTick %d\n", usecsPerTick ));
3464e1bc9a0SAchim Leubner   if(! smIS_SPC(agRoot))
3474e1bc9a0SAchim Leubner   {
3484e1bc9a0SAchim Leubner     if(! smIS_SPCV(agRoot))
3494e1bc9a0SAchim Leubner     {
3504e1bc9a0SAchim Leubner       SA_DBG1(("saInitialize: ossaHwRegReadConfig32 ID  reads as %08X\n", ossaHwRegReadConfig32(agRoot,0 ) ));
3514e1bc9a0SAchim Leubner       SA_DBG1(("saInitialize: expect %08X or %08X or\n",  VEN_DEV_SPCV, VEN_DEV_SPCVE));
3524e1bc9a0SAchim Leubner       SA_DBG1(("saInitialize: expect %08X or %08X or\n",  VEN_DEV_SPCVP, VEN_DEV_SPCVEP));
3534e1bc9a0SAchim Leubner       SA_DBG1(("saInitialize: expect %08X or %08X\n",     VEN_DEV_ADAPVEP, VEN_DEV_ADAPVP));
3544e1bc9a0SAchim Leubner       return AGSA_RC_FAILURE;
3554e1bc9a0SAchim Leubner     }
3564e1bc9a0SAchim Leubner   }
3574e1bc9a0SAchim Leubner 
3584e1bc9a0SAchim Leubner   if(  smIS_SPC(agRoot) && smIS_SPCV(agRoot))
3594e1bc9a0SAchim Leubner   {
3604e1bc9a0SAchim Leubner       SA_DBG1(("saInitialize: Macro error !smIS_SPC %d smIS_SPCv %d smIS_SFC %d\n",smIS_SPC(agRoot),smIS_SPCV(agRoot), smIS_SFC(agRoot) ));
3614e1bc9a0SAchim Leubner       return AGSA_RC_FAILURE;
3624e1bc9a0SAchim Leubner   }
3634e1bc9a0SAchim Leubner 
3644e1bc9a0SAchim Leubner   /* Check the memory allocated */
3654e1bc9a0SAchim Leubner   for ( i = 0; i < memoryAllocated->count; i ++ )
3664e1bc9a0SAchim Leubner   {
3674e1bc9a0SAchim Leubner     /* If memory allocation failed  */
3684e1bc9a0SAchim Leubner     if (memoryAllocated->agMemory[i].singleElementLength &&
3694e1bc9a0SAchim Leubner         memoryAllocated->agMemory[i].numElements)
3704e1bc9a0SAchim Leubner     {
3714e1bc9a0SAchim Leubner       if ( (0 != memoryAllocated->agMemory[i].numElements)
3724e1bc9a0SAchim Leubner           && (0 == memoryAllocated->agMemory[i].totalLength) )
3734e1bc9a0SAchim Leubner       {
3744e1bc9a0SAchim Leubner         /* return failure */
3754e1bc9a0SAchim Leubner         SA_DBG1(("saInitialize:AGSA_RC_FAILURE Memory[%d]  singleElementLength = 0x%x  numElements = 0x%x NOT allocated\n",
3764e1bc9a0SAchim Leubner           i,
3774e1bc9a0SAchim Leubner           memoryAllocated->agMemory[i].singleElementLength,
3784e1bc9a0SAchim Leubner           memoryAllocated->agMemory[i].numElements));
3794e1bc9a0SAchim Leubner         ret = AGSA_RC_FAILURE;
3804e1bc9a0SAchim Leubner         return ret;
3814e1bc9a0SAchim Leubner       }
3824e1bc9a0SAchim Leubner       else
3834e1bc9a0SAchim Leubner       {
3844e1bc9a0SAchim Leubner         SA_DBG1(("saInitialize: Memory[%d] singleElementLength = 0x%x  numElements = 0x%x allocated %p\n",
3854e1bc9a0SAchim Leubner           i,
3864e1bc9a0SAchim Leubner           memoryAllocated->agMemory[i].singleElementLength,
3874e1bc9a0SAchim Leubner           memoryAllocated->agMemory[i].numElements,
3884e1bc9a0SAchim Leubner           memoryAllocated->agMemory[i].virtPtr));
3894e1bc9a0SAchim Leubner       }
3904e1bc9a0SAchim Leubner     }
3914e1bc9a0SAchim Leubner   }
3924e1bc9a0SAchim Leubner 
3934e1bc9a0SAchim Leubner   /* Get the saRoot memory address */
3944e1bc9a0SAchim Leubner   saRoot = (agsaLLRoot_t *) (memoryAllocated->agMemory[LLROOT_MEM_INDEX].virtPtr);
3954e1bc9a0SAchim Leubner   SA_ASSERT((agNULL != saRoot), "saRoot");
3964e1bc9a0SAchim Leubner   if(agNULL == saRoot)
3974e1bc9a0SAchim Leubner   {
3984e1bc9a0SAchim Leubner     SA_DBG1(("saInitialize:AGSA_RC_FAILURE saRoot\n"));
3994e1bc9a0SAchim Leubner     return AGSA_RC_FAILURE;
4004e1bc9a0SAchim Leubner   }
4014e1bc9a0SAchim Leubner 
4024e1bc9a0SAchim Leubner   agRoot->sdkData = (void *) saRoot;
4034e1bc9a0SAchim Leubner 
4044e1bc9a0SAchim Leubner   SA_DBG1(("saInitialize: saRoot %p\n",saRoot));
4054e1bc9a0SAchim Leubner 
4064e1bc9a0SAchim Leubner   if ( (memoryAllocated != &saRoot->memoryAllocated) ||
4074e1bc9a0SAchim Leubner        (hwConfig != &saRoot->hwConfig) ||
4084e1bc9a0SAchim Leubner        (swConfig != &saRoot->swConfig) )
4094e1bc9a0SAchim Leubner   {
4104e1bc9a0SAchim Leubner     agsaMemoryRequirement_t *memA = &saRoot->memoryAllocated;
4114e1bc9a0SAchim Leubner     agsaHwConfig_t          *hwC  = &saRoot->hwConfig;
4124e1bc9a0SAchim Leubner     agsaSwConfig_t          *swC  = &saRoot->swConfig;
4134e1bc9a0SAchim Leubner 
4144e1bc9a0SAchim Leubner     /* Copy data here */
4154e1bc9a0SAchim Leubner 
4164e1bc9a0SAchim Leubner     *memA   = *memoryAllocated;
4174e1bc9a0SAchim Leubner     *hwC    = *hwConfig;
4184e1bc9a0SAchim Leubner     *swC    = *swConfig;
4194e1bc9a0SAchim Leubner   }
4204e1bc9a0SAchim Leubner 
4214e1bc9a0SAchim Leubner 
4224e1bc9a0SAchim Leubner #if defined(SALLSDK_DEBUG)
4234e1bc9a0SAchim Leubner   if(gLLDebugLevelSet == 0)
4244e1bc9a0SAchim Leubner   {
4254e1bc9a0SAchim Leubner     gLLDebugLevelSet = 1;
4264e1bc9a0SAchim Leubner     gLLDebugLevel = swConfig->sallDebugLevel & 0xF;
4274e1bc9a0SAchim Leubner     SA_DBG1(("saInitialize:  gLLDebugLevel  %x\n",gLLDebugLevel));
4284e1bc9a0SAchim Leubner   }
4294e1bc9a0SAchim Leubner #endif /* SALLSDK_DEBUG */
4304e1bc9a0SAchim Leubner 
4314e1bc9a0SAchim Leubner #ifdef SA_ENABLE_TRACE_FUNCTIONS
4324e1bc9a0SAchim Leubner 
4334e1bc9a0SAchim Leubner   saRoot->TraceBufferLength = memoryAllocated->agMemory[LL_FUNCTION_TRACE].totalLength;
4344e1bc9a0SAchim Leubner   saRoot->TraceBuffer = memoryAllocated->agMemory[LL_FUNCTION_TRACE].virtPtr;
4354e1bc9a0SAchim Leubner 
4364e1bc9a0SAchim Leubner   siEnableTracing ( agRoot );
4374e1bc9a0SAchim Leubner /*
4384e1bc9a0SAchim Leubner */
4394e1bc9a0SAchim Leubner 
4404e1bc9a0SAchim Leubner #endif /* SA_ENABLE_TRACE_FUNCTIONS */
4414e1bc9a0SAchim Leubner 
4424e1bc9a0SAchim Leubner #ifdef FAST_IO_TEST
4434e1bc9a0SAchim Leubner   {
4444e1bc9a0SAchim Leubner   agsaMem_t *agMemory = memoryAllocated->agMemory;
4454e1bc9a0SAchim Leubner 
4464e1bc9a0SAchim Leubner   /* memory requirement for Super IO CACHE memory */
4474e1bc9a0SAchim Leubner   size = sizeof(saRoot->freeFastReq) / sizeof(saRoot->freeFastReq[0]);
4484e1bc9a0SAchim Leubner 
4494e1bc9a0SAchim Leubner   SA_ASSERT(size == agMemory[LL_FAST_IO].numElements, "");
4504e1bc9a0SAchim Leubner   SA_ASSERT(agMemory[LL_FAST_IO].virtPtr, "");
4514e1bc9a0SAchim Leubner   SA_ASSERT((agMemory[LL_FAST_IO].singleElementLength ==
4524e1bc9a0SAchim Leubner     sizeof(saFastRequest_t)) &&
4534e1bc9a0SAchim Leubner     (agMemory[LL_FAST_IO].numElements == LL_FAST_IO_SIZE) &&
4544e1bc9a0SAchim Leubner     (agMemory[LL_FAST_IO].totalLength == agMemory[LL_FAST_IO].numElements *
4554e1bc9a0SAchim Leubner                                  agMemory[LL_FAST_IO].singleElementLength), "");
4564e1bc9a0SAchim Leubner 
4574e1bc9a0SAchim Leubner   for (i = 0, alignment = agMemory[LL_FAST_IO].alignment,
4584e1bc9a0SAchim Leubner        fr = agMemory[LL_FAST_IO].virtPtr;
4594e1bc9a0SAchim Leubner        i < size; i++,
4604e1bc9a0SAchim Leubner        fr = (void*)((bitptr)fr + (bitptr)(((bit32)sizeof(saFastRequest_t) +
4614e1bc9a0SAchim Leubner                     alignment - 1) & ~(alignment - 1))))
4624e1bc9a0SAchim Leubner   {
4634e1bc9a0SAchim Leubner     saRoot->freeFastReq[i] = fr;
4644e1bc9a0SAchim Leubner   }
4654e1bc9a0SAchim Leubner   saRoot->freeFastIdx = size;
4664e1bc9a0SAchim Leubner   }
4674e1bc9a0SAchim Leubner #endif /* FAST_IO_TEST*/
4684e1bc9a0SAchim Leubner 
4694e1bc9a0SAchim Leubner   smTraceFuncEnter(hpDBG_VERY_LOUD, "m1");
4704e1bc9a0SAchim Leubner 
4714e1bc9a0SAchim Leubner   SA_DBG1(("saInitialize: swConfig->PortRecoveryResetTimer    %x\n",swConfig->PortRecoveryResetTimer ));
4724e1bc9a0SAchim Leubner 
4734e1bc9a0SAchim Leubner   SA_DBG1(("saInitialize: hwDEVICE_ID_VENDID            0x%08x\n", ossaHwRegReadConfig32(agRoot,0)));
4744e1bc9a0SAchim Leubner   SA_DBG1(("saInitialize: CFGSTAT CFGCMD                0x%08x\n", ossaHwRegReadConfig32(agRoot,4)));
4754e1bc9a0SAchim Leubner   SA_DBG1(("saInitialize: CLSCODE REVID                 0x%08x\n", ossaHwRegReadConfig32(agRoot,8)));
4764e1bc9a0SAchim Leubner   SA_DBG1(("saInitialize: BIST DT HDRTYPE LATTIM CLSIZE 0x%08x\n", ossaHwRegReadConfig32(agRoot,12)));
4774e1bc9a0SAchim Leubner   SA_DBG1(("saInitialize: hwSVID                        0x%08x\n", ossaHwRegReadConfig32(agRoot,44)));
4784e1bc9a0SAchim Leubner 
4794e1bc9a0SAchim Leubner 
4804e1bc9a0SAchim Leubner #ifdef SA_ENABLE_PCI_TRIGGER
4814e1bc9a0SAchim Leubner 
4824e1bc9a0SAchim Leubner    SA_DBG1(("saInitialize: SA_ENABLE_PCI_TRIGGER  a       0x%08x %p\n", saRoot->swConfig.PCI_trigger,&saRoot->swConfig.PCI_trigger));
4834e1bc9a0SAchim Leubner 
4844e1bc9a0SAchim Leubner   if( saRoot->swConfig.PCI_trigger & PCI_TRIGGER_INIT_TEST )
4854e1bc9a0SAchim Leubner   {
4864e1bc9a0SAchim Leubner     SA_DBG1(("saInitialize: SA_ENABLE_PCI_TRIGGER         0x%08x %p\n", saRoot->swConfig.PCI_trigger,&saRoot->swConfig.PCI_trigger));
4874e1bc9a0SAchim Leubner     saRoot->swConfig.PCI_trigger &= ~PCI_TRIGGER_INIT_TEST;
4884e1bc9a0SAchim Leubner     siPCITriger(agRoot);
4894e1bc9a0SAchim Leubner   }
4904e1bc9a0SAchim Leubner #endif /* SA_ENABLE_PCI_TRIGGER */
4914e1bc9a0SAchim Leubner 
4924e1bc9a0SAchim Leubner 
4934e1bc9a0SAchim Leubner   saRoot->ChipId = (ossaHwRegReadConfig32(agRoot,0) & 0xFFFF0000);
4944e1bc9a0SAchim Leubner 
4954e1bc9a0SAchim Leubner   SA_DBG1(("saInitialize: saRoot->ChipId                0x%08x\n", saRoot->ChipId));
4964e1bc9a0SAchim Leubner   siUpdateBarOffsetTable(agRoot,saRoot->ChipId);
4974e1bc9a0SAchim Leubner 
4984e1bc9a0SAchim Leubner   if(saRoot->ChipId == VEN_DEV_SPC)
4994e1bc9a0SAchim Leubner   {
5004e1bc9a0SAchim Leubner     if(!  smIS_SPC(agRoot))
5014e1bc9a0SAchim Leubner     {
5024e1bc9a0SAchim Leubner       SA_DBG1(("saInitialize: smIS_SPC macro fail !!!!\n" ));
5034e1bc9a0SAchim Leubner       smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "m1");
5044e1bc9a0SAchim Leubner       return AGSA_RC_FAILURE;
5054e1bc9a0SAchim Leubner     }
5064e1bc9a0SAchim Leubner 
5074e1bc9a0SAchim Leubner     SA_DBG1(("saInitialize:  SPC \n" ));
5084e1bc9a0SAchim Leubner   }
5094e1bc9a0SAchim Leubner   else if(saRoot->ChipId == VEN_DEV_HIL )
5104e1bc9a0SAchim Leubner   {
5114e1bc9a0SAchim Leubner     SA_DBG1(("saInitialize:  SPC HIL\n" ));
5124e1bc9a0SAchim Leubner     if(!  smIS_SPC(agRoot))
5134e1bc9a0SAchim Leubner     {
5144e1bc9a0SAchim Leubner       SA_DBG1(("saInitialize: smIS_SPC macro fail !!!!\n" ));
5154e1bc9a0SAchim Leubner       smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "m1");
5164e1bc9a0SAchim Leubner       return AGSA_RC_FAILURE;
5174e1bc9a0SAchim Leubner     }
5184e1bc9a0SAchim Leubner   }
5194e1bc9a0SAchim Leubner   else if(saRoot->ChipId == VEN_DEV_SPCV)
5204e1bc9a0SAchim Leubner   {
5214e1bc9a0SAchim Leubner     SA_DBG1(("saInitialize:  SPC V\n" ));
5224e1bc9a0SAchim Leubner     if(!  smIS_SPCV(agRoot))
5234e1bc9a0SAchim Leubner     {
5244e1bc9a0SAchim Leubner       SA_DBG1(("saInitialize: smIS_SPCV macro fail !!!!\n" ));
5254e1bc9a0SAchim Leubner       smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "m1");
5264e1bc9a0SAchim Leubner       return AGSA_RC_FAILURE;
5274e1bc9a0SAchim Leubner     }
5284e1bc9a0SAchim Leubner   }
5294e1bc9a0SAchim Leubner   else if(saRoot->ChipId == VEN_DEV_SPCVE)
5304e1bc9a0SAchim Leubner   {
5314e1bc9a0SAchim Leubner     SA_DBG1(("saInitialize:  SPC VE\n" ));
5324e1bc9a0SAchim Leubner     if(!  smIS_SPCV(agRoot))
5334e1bc9a0SAchim Leubner     {
5344e1bc9a0SAchim Leubner       SA_DBG1(("saInitialize: smIS_SPCV macro fail !!!!\n" ));
5354e1bc9a0SAchim Leubner       smTraceFuncExit(hpDBG_VERY_LOUD, 'd', "m1");
5364e1bc9a0SAchim Leubner       return AGSA_RC_FAILURE;
5374e1bc9a0SAchim Leubner     }
5384e1bc9a0SAchim Leubner   }
5394e1bc9a0SAchim Leubner   else if(saRoot->ChipId == VEN_DEV_SPCVP)
5404e1bc9a0SAchim Leubner   {
5414e1bc9a0SAchim Leubner     SA_DBG1(("saInitialize:  SPC VP\n" ));
5424e1bc9a0SAchim Leubner     if(!  smIS_SPCV(agRoot))
5434e1bc9a0SAchim Leubner     {
5444e1bc9a0SAchim Leubner       SA_DBG1(("saInitialize: smIS_SPCV macro fail !!!!\n" ));
5454e1bc9a0SAchim Leubner       smTraceFuncExit(hpDBG_VERY_LOUD, 'e', "m1");
5464e1bc9a0SAchim Leubner       return AGSA_RC_FAILURE;
5474e1bc9a0SAchim Leubner     }
5484e1bc9a0SAchim Leubner   }
5494e1bc9a0SAchim Leubner   else if(saRoot->ChipId == VEN_DEV_SPCVEP)
5504e1bc9a0SAchim Leubner   {
5514e1bc9a0SAchim Leubner     SA_DBG1(("saInitialize:  SPC VEP\n" ));
5524e1bc9a0SAchim Leubner     if(!  smIS_SPCV(agRoot))
5534e1bc9a0SAchim Leubner     {
5544e1bc9a0SAchim Leubner       SA_DBG1(("saInitialize: smIS_SPCV macro fail !!!!\n" ));
5554e1bc9a0SAchim Leubner       smTraceFuncExit(hpDBG_VERY_LOUD, 'f', "m1");
5564e1bc9a0SAchim Leubner       return AGSA_RC_FAILURE;
5574e1bc9a0SAchim Leubner     }
5584e1bc9a0SAchim Leubner   }
5594e1bc9a0SAchim Leubner   else if(saRoot->ChipId == VEN_DEV_ADAPVP)
5604e1bc9a0SAchim Leubner   {
5614e1bc9a0SAchim Leubner     SA_DBG1(("saInitialize: Adaptec 8088\n" ));
5624e1bc9a0SAchim Leubner   }
5634e1bc9a0SAchim Leubner   else if(saRoot->ChipId == VEN_DEV_ADAPVEP)
5644e1bc9a0SAchim Leubner   {
5654e1bc9a0SAchim Leubner     SA_DBG1(("saInitialize: Adaptec 8089\n" ));
5664e1bc9a0SAchim Leubner   }
5674e1bc9a0SAchim Leubner   else if(saRoot->ChipId == VEN_DEV_SPC12V)
5684e1bc9a0SAchim Leubner   {
5694e1bc9a0SAchim Leubner     SA_DBG1(("saInitialize:  SPC 12V\n" ));
5704e1bc9a0SAchim Leubner     if(!  smIS_SPCV(agRoot))
5714e1bc9a0SAchim Leubner     {
5724e1bc9a0SAchim Leubner       SA_DBG1(("saInitialize: smIS_SPCV macro fail !!!!\n" ));
5734e1bc9a0SAchim Leubner       smTraceFuncExit(hpDBG_VERY_LOUD, 'g', "m1");
5744e1bc9a0SAchim Leubner       return AGSA_RC_FAILURE;
5754e1bc9a0SAchim Leubner     }
5764e1bc9a0SAchim Leubner   }
5774e1bc9a0SAchim Leubner   else if(saRoot->ChipId == VEN_DEV_SPC12VE)
5784e1bc9a0SAchim Leubner   {
5794e1bc9a0SAchim Leubner     SA_DBG1(("saInitialize:  SPC 12VE\n" ));
5804e1bc9a0SAchim Leubner     if(!  smIS_SPCV(agRoot))
5814e1bc9a0SAchim Leubner     {
5824e1bc9a0SAchim Leubner       SA_DBG1(("saInitialize: smIS_SPCV macro fail !!!!\n" ));
5834e1bc9a0SAchim Leubner       smTraceFuncExit(hpDBG_VERY_LOUD, 'h', "m1");
5844e1bc9a0SAchim Leubner       return AGSA_RC_FAILURE;
5854e1bc9a0SAchim Leubner     }
5864e1bc9a0SAchim Leubner   }
5874e1bc9a0SAchim Leubner   else if(saRoot->ChipId == VEN_DEV_SPC12VP)
5884e1bc9a0SAchim Leubner   {
5894e1bc9a0SAchim Leubner     SA_DBG1(("saInitialize:  SPC 12VP\n" ));
5904e1bc9a0SAchim Leubner     if(!  smIS_SPCV(agRoot))
5914e1bc9a0SAchim Leubner     {
5924e1bc9a0SAchim Leubner       SA_DBG1(("saInitialize: smIS_SPCV macro fail !!!!\n" ));
5934e1bc9a0SAchim Leubner       smTraceFuncExit(hpDBG_VERY_LOUD, 'i', "m1");
5944e1bc9a0SAchim Leubner       return AGSA_RC_FAILURE;
5954e1bc9a0SAchim Leubner     }
5964e1bc9a0SAchim Leubner   }
5974e1bc9a0SAchim Leubner   else if(saRoot->ChipId == VEN_DEV_SPC12VEP)
5984e1bc9a0SAchim Leubner   {
5994e1bc9a0SAchim Leubner     SA_DBG1(("saInitialize:  SPC 12VEP\n" ));
6004e1bc9a0SAchim Leubner     if(!  smIS_SPCV(agRoot))
6014e1bc9a0SAchim Leubner     {
6024e1bc9a0SAchim Leubner       SA_DBG1(("saInitialize: smIS_SPCV macro fail !!!!\n" ));
6034e1bc9a0SAchim Leubner       smTraceFuncExit(hpDBG_VERY_LOUD, 'j', "m1");
6044e1bc9a0SAchim Leubner       return AGSA_RC_FAILURE;
6054e1bc9a0SAchim Leubner     }
6064e1bc9a0SAchim Leubner   }
6074e1bc9a0SAchim Leubner   else if(saRoot->ChipId == VEN_DEV_SPC12ADP)
6084e1bc9a0SAchim Leubner   {
6094e1bc9a0SAchim Leubner     SA_DBG1(("saInitialize:  SPC 12ADP\n" ));
6104e1bc9a0SAchim Leubner     if(!  smIS_SPCV(agRoot))
6114e1bc9a0SAchim Leubner     {
6124e1bc9a0SAchim Leubner       SA_DBG1(("saInitialize: smIS_SPCV macro fail !!!!\n" ));
6134e1bc9a0SAchim Leubner       smTraceFuncExit(hpDBG_VERY_LOUD, 'k', "m1");
6144e1bc9a0SAchim Leubner       return AGSA_RC_FAILURE;
6154e1bc9a0SAchim Leubner     }
6164e1bc9a0SAchim Leubner   }
6174e1bc9a0SAchim Leubner   else if(saRoot->ChipId == VEN_DEV_SPC12ADPE)
6184e1bc9a0SAchim Leubner   {
6194e1bc9a0SAchim Leubner     SA_DBG1(("saInitialize:  SPC 12ADPE\n" ));
6204e1bc9a0SAchim Leubner     if(!  smIS_SPCV(agRoot))
6214e1bc9a0SAchim Leubner     {
6224e1bc9a0SAchim Leubner       SA_DBG1(("saInitialize: smIS_SPCV macro fail !!!!\n" ));
6234e1bc9a0SAchim Leubner       smTraceFuncExit(hpDBG_VERY_LOUD, 'l', "m1");
6244e1bc9a0SAchim Leubner       return AGSA_RC_FAILURE;
6254e1bc9a0SAchim Leubner     }
6264e1bc9a0SAchim Leubner   }
6274e1bc9a0SAchim Leubner   else if(saRoot->ChipId == VEN_DEV_SPC12ADPP)
6284e1bc9a0SAchim Leubner   {
6294e1bc9a0SAchim Leubner     SA_DBG1(("saInitialize:  SPC 12ADPP\n" ));
6304e1bc9a0SAchim Leubner     if(!  smIS_SPCV(agRoot))
6314e1bc9a0SAchim Leubner     {
6324e1bc9a0SAchim Leubner       SA_DBG1(("saInitialize: smIS_SPCV macro fail !!!!\n" ));
6334e1bc9a0SAchim Leubner       smTraceFuncExit(hpDBG_VERY_LOUD, 'm', "m1");
6344e1bc9a0SAchim Leubner       return AGSA_RC_FAILURE;
6354e1bc9a0SAchim Leubner     }
6364e1bc9a0SAchim Leubner   }
6374e1bc9a0SAchim Leubner   else if(saRoot->ChipId == VEN_DEV_SPC12ADPEP)
6384e1bc9a0SAchim Leubner   {
6394e1bc9a0SAchim Leubner     SA_DBG1(("saInitialize:  SPC 12ADPEP\n" ));
6404e1bc9a0SAchim Leubner     if(!  smIS_SPCV(agRoot))
6414e1bc9a0SAchim Leubner     {
6424e1bc9a0SAchim Leubner       SA_DBG1(("saInitialize: smIS_SPCV macro fail !!!!\n" ));
6434e1bc9a0SAchim Leubner       smTraceFuncExit(hpDBG_VERY_LOUD, 'n', "m1");
6444e1bc9a0SAchim Leubner       return AGSA_RC_FAILURE;
6454e1bc9a0SAchim Leubner     }
6464e1bc9a0SAchim Leubner   }
6474e1bc9a0SAchim Leubner   else if(saRoot->ChipId == VEN_DEV_SPC12SATA)
6484e1bc9a0SAchim Leubner   {
6494e1bc9a0SAchim Leubner     SA_DBG1(("saInitialize:  SPC12SATA\n" ));
6504e1bc9a0SAchim Leubner     if(!  smIS_SPCV(agRoot))
6514e1bc9a0SAchim Leubner     {
6524e1bc9a0SAchim Leubner       SA_DBG1(("saInitialize: smIS_SPCV macro fail !!!!\n" ));
6534e1bc9a0SAchim Leubner       smTraceFuncExit(hpDBG_VERY_LOUD, 'o', "m1");
6544e1bc9a0SAchim Leubner       return AGSA_RC_FAILURE;
6554e1bc9a0SAchim Leubner     }
6564e1bc9a0SAchim Leubner   }
6574e1bc9a0SAchim Leubner   else if(saRoot->ChipId ==  VEN_DEV_9015)
6584e1bc9a0SAchim Leubner   {
6594e1bc9a0SAchim Leubner     SA_DBG1(("saInitialize:  SPC 12V FPGA\n" ));
6604e1bc9a0SAchim Leubner     if(!  smIS_SPCV(agRoot))
6614e1bc9a0SAchim Leubner     {
6624e1bc9a0SAchim Leubner       SA_DBG1(("saInitialize: smIS_SPCV macro fail !!!!\n" ));
6634e1bc9a0SAchim Leubner       smTraceFuncExit(hpDBG_VERY_LOUD, 'p', "m1");
6644e1bc9a0SAchim Leubner       return AGSA_RC_FAILURE;
6654e1bc9a0SAchim Leubner     }
6664e1bc9a0SAchim Leubner   }
6674e1bc9a0SAchim Leubner   else if(saRoot->ChipId ==  VEN_DEV_9060)
6684e1bc9a0SAchim Leubner   {
6694e1bc9a0SAchim Leubner     SA_DBG1(("saInitialize:  SPC 12V FPGA B\n" ));
6704e1bc9a0SAchim Leubner     if(!  smIS_SPCV(agRoot))
6714e1bc9a0SAchim Leubner     {
6724e1bc9a0SAchim Leubner       SA_DBG1(("saInitialize: smIS_SPCV macro fail !!!!\n" ));
6734e1bc9a0SAchim Leubner       smTraceFuncExit(hpDBG_VERY_LOUD, 'q', "m1");
6744e1bc9a0SAchim Leubner       return AGSA_RC_FAILURE;
6754e1bc9a0SAchim Leubner     }
6764e1bc9a0SAchim Leubner   }
6774e1bc9a0SAchim Leubner   else if(saRoot->ChipId == VEN_DEV_SFC)
6784e1bc9a0SAchim Leubner   {
6794e1bc9a0SAchim Leubner     SA_DBG1(("saInitialize: SFC \n" ));
6804e1bc9a0SAchim Leubner   }
6814e1bc9a0SAchim Leubner   else
6824e1bc9a0SAchim Leubner   {
6834e1bc9a0SAchim Leubner     SA_DBG1(("saInitialize saRoot->ChipId %8X expect %8X or %8X\n", saRoot->ChipId,VEN_DEV_SPC, VEN_DEV_SPCV));
6844e1bc9a0SAchim Leubner     SA_ASSERT(0, "ChipId");
6854e1bc9a0SAchim Leubner     smTraceFuncExit(hpDBG_VERY_LOUD, 'r', "m1");
6864e1bc9a0SAchim Leubner     return AGSA_RC_FAILURE;
6874e1bc9a0SAchim Leubner   }
6884e1bc9a0SAchim Leubner 
6894e1bc9a0SAchim Leubner   if( smIS_SPC(agRoot))
6904e1bc9a0SAchim Leubner   {
6914e1bc9a0SAchim Leubner     SA_DBG1(("saInitialize: Rev is A %d B %d C %d\n",smIsCfgSpcREV_A(agRoot),smIsCfgSpcREV_B(agRoot),smIsCfgSpcREV_C(agRoot)));
6924e1bc9a0SAchim Leubner   }
6934e1bc9a0SAchim Leubner   else
6944e1bc9a0SAchim Leubner   {
6954e1bc9a0SAchim Leubner     SA_DBG1(("saInitialize: Rev is A %d B %d C %d\n",smIsCfgVREV_A(agRoot),smIsCfgVREV_B(agRoot),smIsCfgVREV_C(agRoot)));
6964e1bc9a0SAchim Leubner   }
6974e1bc9a0SAchim Leubner 
6984e1bc9a0SAchim Leubner   if( smIS_SPC(agRoot))
6994e1bc9a0SAchim Leubner   {
7004e1bc9a0SAchim Leubner     SA_DBG1(("saInitialize: LINK_CTRL 0x%08x Speed 0x%X Lanes 0x%X \n", ossaHwRegReadConfig32(agRoot,128),
7014e1bc9a0SAchim Leubner       ((ossaHwRegReadConfig32(agRoot,128) & 0x000F0000) >> 16),
7024e1bc9a0SAchim Leubner       ((ossaHwRegReadConfig32(agRoot,128) & 0x0FF00000) >> 20) ));
7034e1bc9a0SAchim Leubner   }
7044e1bc9a0SAchim Leubner   else
7054e1bc9a0SAchim Leubner   {
7064e1bc9a0SAchim Leubner     SA_DBG1(("saInitialize: LINK_CTRL 0x%08x Speed 0x%X Lanes 0x%X \n", ossaHwRegReadConfig32(agRoot,208),
7074e1bc9a0SAchim Leubner       ((ossaHwRegReadConfig32(agRoot,208) & 0x000F0000) >> 16),
7084e1bc9a0SAchim Leubner       ((ossaHwRegReadConfig32(agRoot,208) & 0x0FF00000) >> 20) ));
7094e1bc9a0SAchim Leubner   }
7104e1bc9a0SAchim Leubner 
7114e1bc9a0SAchim Leubner   SA_DBG1(("saInitialize: V_SoftResetRegister  %08X\n",  ossaHwRegReadExt(agRoot, PCIBAR0, V_SoftResetRegister )));
7124e1bc9a0SAchim Leubner 
7134e1bc9a0SAchim Leubner /*
7144e1bc9a0SAchim Leubner   SA_DBG1(("saInitialize:TOP_BOOT_STRAP STRAP_BIT %X\n",  ossaHwRegReadExt(agRoot, PCIBAR1, 0) ));
7154e1bc9a0SAchim Leubner 
7164e1bc9a0SAchim Leubner   SA_DBG1(("SPC_REG_TOP_DEVICE_ID  %8X expect %08X\n",  ossaHwRegReadExt(agRoot, PCIBAR2, SPC_REG_TOP_DEVICE_ID), SPC_TOP_DEVICE_ID));
7174e1bc9a0SAchim Leubner   SA_DBG1(("SPC_REG_TOP_DEVICE_ID  %8X expect %08X\n",  siHalRegReadExt( agRoot, GEN_SPC_REG_TOP_DEVICE_ID,SPC_REG_TOP_DEVICE_ID ) , SPC_TOP_DEVICE_ID));
7184e1bc9a0SAchim Leubner 
7194e1bc9a0SAchim Leubner   SA_DBG1(("SPC_REG_TOP_BOOT_STRAP %8X expect %08X\n",  ossaHwRegReadExt(agRoot, PCIBAR2, SPC_REG_TOP_BOOT_STRAP), SPC_TOP_BOOT_STRAP));
7204e1bc9a0SAchim Leubner 
7214e1bc9a0SAchim Leubner   SA_DBG1(("swConfig->numSASDevHandles =%d\n", swConfig->numDevHandles));
7224e1bc9a0SAchim Leubner */
7234e1bc9a0SAchim Leubner   smTrace(hpDBG_VERY_LOUD,"29",swConfig->numDevHandles);
7244e1bc9a0SAchim Leubner   /* TP:29 swConfig->numDevHandles */
7254e1bc9a0SAchim Leubner 
7264e1bc9a0SAchim Leubner   /* Setup Device link */
7274e1bc9a0SAchim Leubner   /* Save the information of allocated device Link memory */
7284e1bc9a0SAchim Leubner   saRoot->deviceLinkMem = memoryAllocated->agMemory[DEVICELINK_MEM_INDEX];
7294e1bc9a0SAchim Leubner   if(agNULL == saRoot->deviceLinkMem.virtPtr)
7304e1bc9a0SAchim Leubner   {
7314e1bc9a0SAchim Leubner     SA_ASSERT(0, "deviceLinkMem");
7324e1bc9a0SAchim Leubner     smTraceFuncExit(hpDBG_VERY_LOUD, 'q', "m1");
7334e1bc9a0SAchim Leubner     return AGSA_RC_FAILURE;
7344e1bc9a0SAchim Leubner   }
7354e1bc9a0SAchim Leubner 
7364e1bc9a0SAchim Leubner   si_memset(saRoot->deviceLinkMem.virtPtr, 0, saRoot->deviceLinkMem.totalLength);
7374e1bc9a0SAchim Leubner   SA_DBG2(("saInitialize: [%d] saRoot->deviceLinkMem VirtPtr=%p PhysicalLo=%x Count=%x Total=%x type %x\n",
7384e1bc9a0SAchim Leubner     DEVICELINK_MEM_INDEX,
7394e1bc9a0SAchim Leubner     saRoot->deviceLinkMem.virtPtr,
7404e1bc9a0SAchim Leubner     saRoot->deviceLinkMem.phyAddrLower,
7414e1bc9a0SAchim Leubner     saRoot->deviceLinkMem.numElements,
7424e1bc9a0SAchim Leubner     saRoot->deviceLinkMem.totalLength,
7434e1bc9a0SAchim Leubner     saRoot->deviceLinkMem.type));
7444e1bc9a0SAchim Leubner 
7454e1bc9a0SAchim Leubner   maxNumIODevices = swConfig->numDevHandles;
7464e1bc9a0SAchim Leubner   SA_DBG2(("saInitialize:  maxNumIODevices=%d, swConfig->numDevHandles=%d \n",
7474e1bc9a0SAchim Leubner     maxNumIODevices,
7484e1bc9a0SAchim Leubner     swConfig->numDevHandles));
7494e1bc9a0SAchim Leubner 
7504e1bc9a0SAchim Leubner #ifdef SA_ENABLE_PCI_TRIGGER
7514e1bc9a0SAchim Leubner   SA_DBG1(("saInitialize:  swConfig->PCI_trigger= 0x%x\n", swConfig->PCI_trigger));
7524e1bc9a0SAchim Leubner #endif /* SA_ENABLE_PCI_TRIGGER */
7534e1bc9a0SAchim Leubner 
7544e1bc9a0SAchim Leubner   /* Setup free IO Devices link list */
7554e1bc9a0SAchim Leubner   saLlistInitialize(&(saRoot->freeDevicesList));
7564e1bc9a0SAchim Leubner   for ( i = 0; i < (bit32) maxNumIODevices; i ++ )
7574e1bc9a0SAchim Leubner   {
7584e1bc9a0SAchim Leubner     /* get the pointer to the device descriptor */
7594e1bc9a0SAchim Leubner     pDeviceDesc = (agsaDeviceDesc_t *) AGSAMEM_ELEMENT_READ(&(saRoot->deviceLinkMem), i);
7604e1bc9a0SAchim Leubner     /* Initialize device descriptor */
7614e1bc9a0SAchim Leubner     saLlinkInitialize(&(pDeviceDesc->linkNode));
7624e1bc9a0SAchim Leubner 
7634e1bc9a0SAchim Leubner     pDeviceDesc->initiatorDevHandle.osData    = agNULL;
7644e1bc9a0SAchim Leubner     pDeviceDesc->initiatorDevHandle.sdkData   = agNULL;
7654e1bc9a0SAchim Leubner     pDeviceDesc->targetDevHandle.osData       = agNULL;
7664e1bc9a0SAchim Leubner     pDeviceDesc->targetDevHandle.sdkData      = agNULL;
7674e1bc9a0SAchim Leubner     pDeviceDesc->deviceType                   = SAS_SATA_UNKNOWN_DEVICE;
7684e1bc9a0SAchim Leubner     pDeviceDesc->pPort                        = agNULL;
7694e1bc9a0SAchim Leubner     pDeviceDesc->DeviceMapIndex               = 0;
7704e1bc9a0SAchim Leubner 
7714e1bc9a0SAchim Leubner     saLlistInitialize(&(pDeviceDesc->pendingIORequests));
7724e1bc9a0SAchim Leubner 
7734e1bc9a0SAchim Leubner     /* Add the device descriptor to the free IO device link list */
7744e1bc9a0SAchim Leubner     saLlistAdd(&(saRoot->freeDevicesList), &(pDeviceDesc->linkNode));
7754e1bc9a0SAchim Leubner   }
7764e1bc9a0SAchim Leubner 
7774e1bc9a0SAchim Leubner   /* Setup IO Request link */
7784e1bc9a0SAchim Leubner   /* Save the information of allocated IO Request Link memory */
7794e1bc9a0SAchim Leubner   saRoot->IORequestMem = memoryAllocated->agMemory[IOREQLINK_MEM_INDEX];
7804e1bc9a0SAchim Leubner   si_memset(saRoot->IORequestMem.virtPtr, 0, saRoot->IORequestMem.totalLength);
7814e1bc9a0SAchim Leubner 
7824e1bc9a0SAchim Leubner   SA_DBG2(("saInitialize: [%d] saRoot->IORequestMem  VirtPtr=%p PhysicalLo=%x Count=%x Total=%x type %x\n",
7834e1bc9a0SAchim Leubner     IOREQLINK_MEM_INDEX,
7844e1bc9a0SAchim Leubner     saRoot->IORequestMem.virtPtr,
7854e1bc9a0SAchim Leubner     saRoot->IORequestMem.phyAddrLower,
7864e1bc9a0SAchim Leubner     saRoot->IORequestMem.numElements,
7874e1bc9a0SAchim Leubner     saRoot->IORequestMem.totalLength,
7884e1bc9a0SAchim Leubner     saRoot->IORequestMem.type));
7894e1bc9a0SAchim Leubner 
7904e1bc9a0SAchim Leubner   /* Setup free IO  Request link list */
7914e1bc9a0SAchim Leubner   saLlistIOInitialize(&(saRoot->freeIORequests));
7924e1bc9a0SAchim Leubner   saLlistIOInitialize(&(saRoot->freeReservedRequests));
7934e1bc9a0SAchim Leubner   for ( i = 0; i < swConfig->maxActiveIOs; i ++ )
7944e1bc9a0SAchim Leubner   {
7954e1bc9a0SAchim Leubner     /* get the pointer to the request descriptor */
7964e1bc9a0SAchim Leubner     pRequestDesc = (agsaIORequestDesc_t *) AGSAMEM_ELEMENT_READ(&(saRoot->IORequestMem), i);
7974e1bc9a0SAchim Leubner     /* Initialize request descriptor */
7984e1bc9a0SAchim Leubner     saLlinkInitialize(&(pRequestDesc->linkNode));
7994e1bc9a0SAchim Leubner 
8004e1bc9a0SAchim Leubner     pRequestDesc->valid             = agFALSE;
8014e1bc9a0SAchim Leubner     pRequestDesc->requestType       = AGSA_REQ_TYPE_UNKNOWN;
8024e1bc9a0SAchim Leubner     pRequestDesc->pIORequestContext = agNULL;
8034e1bc9a0SAchim Leubner     pRequestDesc->HTag              = i;
8044e1bc9a0SAchim Leubner     pRequestDesc->pDevice           = agNULL;
8054e1bc9a0SAchim Leubner     pRequestDesc->pPort             = agNULL;
8064e1bc9a0SAchim Leubner 
8074e1bc9a0SAchim Leubner     /* Add the request descriptor to the free Reserved Request link list */
8084e1bc9a0SAchim Leubner   /* SMP request must get service so reserve one request when first SMP completes */
8094e1bc9a0SAchim Leubner     if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
8104e1bc9a0SAchim Leubner     {
8114e1bc9a0SAchim Leubner       saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequestDesc->linkNode));
8124e1bc9a0SAchim Leubner     }
8134e1bc9a0SAchim Leubner     else
8144e1bc9a0SAchim Leubner     {
8154e1bc9a0SAchim Leubner     /* Add the request descriptor to the free IO Request link list */
8164e1bc9a0SAchim Leubner       saLlistIOAdd(&(saRoot->freeIORequests), &(pRequestDesc->linkNode));
8174e1bc9a0SAchim Leubner     }
8184e1bc9a0SAchim Leubner 
8194e1bc9a0SAchim Leubner   }
8204e1bc9a0SAchim Leubner 
8214e1bc9a0SAchim Leubner   /* Setup timer link */
8224e1bc9a0SAchim Leubner   /* Save the information of allocated timer Link memory */
8234e1bc9a0SAchim Leubner   saRoot->timerLinkMem = memoryAllocated->agMemory[TIMERLINK_MEM_INDEX];
8244e1bc9a0SAchim Leubner   si_memset(saRoot->timerLinkMem.virtPtr, 0, saRoot->timerLinkMem.totalLength);
8254e1bc9a0SAchim Leubner   SA_DBG2(("saInitialize: [%d] saRoot->timerLinkMem  VirtPtr=%p PhysicalLo=%x Count=%x Total=%x type %x\n",
8264e1bc9a0SAchim Leubner     TIMERLINK_MEM_INDEX,
8274e1bc9a0SAchim Leubner     saRoot->timerLinkMem.virtPtr,
8284e1bc9a0SAchim Leubner     saRoot->timerLinkMem.phyAddrLower,
8294e1bc9a0SAchim Leubner     saRoot->timerLinkMem.numElements,
8304e1bc9a0SAchim Leubner     saRoot->timerLinkMem.totalLength,
8314e1bc9a0SAchim Leubner     saRoot->timerLinkMem.type ));
8324e1bc9a0SAchim Leubner 
8334e1bc9a0SAchim Leubner   /* Setup free timer link list */
8344e1bc9a0SAchim Leubner   saLlistInitialize(&(saRoot->freeTimers));
8354e1bc9a0SAchim Leubner   for ( i = 0; i < NUM_TIMERS; i ++ )
8364e1bc9a0SAchim Leubner   {
8374e1bc9a0SAchim Leubner     /* get the pointer to the timer descriptor */
8384e1bc9a0SAchim Leubner     pTimerDesc = (agsaTimerDesc_t *) AGSAMEM_ELEMENT_READ(&(saRoot->timerLinkMem), i);
8394e1bc9a0SAchim Leubner     /* Initialize timer descriptor */
8404e1bc9a0SAchim Leubner     saLlinkInitialize(&(pTimerDesc->linkNode));
8414e1bc9a0SAchim Leubner 
8424e1bc9a0SAchim Leubner     pTimerDesc->valid         = agFALSE;
8434e1bc9a0SAchim Leubner     pTimerDesc->timeoutTick   = 0;
8444e1bc9a0SAchim Leubner     pTimerDesc->pfnTimeout    = agNULL;
8454e1bc9a0SAchim Leubner     pTimerDesc->Event         = 0;
8464e1bc9a0SAchim Leubner     pTimerDesc->pParm         = agNULL;
8474e1bc9a0SAchim Leubner 
8484e1bc9a0SAchim Leubner     /* Add the timer descriptor to the free timer link list */
8494e1bc9a0SAchim Leubner     saLlistAdd(&(saRoot->freeTimers), &(pTimerDesc->linkNode));
8504e1bc9a0SAchim Leubner   }
8514e1bc9a0SAchim Leubner   /* Setup valid timer link list */
8524e1bc9a0SAchim Leubner   saLlistInitialize(&(saRoot->validTimers));
8534e1bc9a0SAchim Leubner 
8544e1bc9a0SAchim Leubner   /* Setup Phys */
8554e1bc9a0SAchim Leubner   /* Setup PhyCount */
8564e1bc9a0SAchim Leubner   saRoot->phyCount = (bit8) hwConfig->phyCount;
8574e1bc9a0SAchim Leubner   /* Init Phy data structure */
8584e1bc9a0SAchim Leubner   for ( i = 0; i < saRoot->phyCount; i ++ )
8594e1bc9a0SAchim Leubner   {
8604e1bc9a0SAchim Leubner     saRoot->phys[i].pPort = agNULL;
8614e1bc9a0SAchim Leubner     saRoot->phys[i].phyId = (bit8) i;
8624e1bc9a0SAchim Leubner 
8634e1bc9a0SAchim Leubner     /* setup phy status is PHY_STOPPED */
8644e1bc9a0SAchim Leubner     PHY_STATUS_SET(&(saRoot->phys[i]), PHY_STOPPED);
8654e1bc9a0SAchim Leubner   }
8664e1bc9a0SAchim Leubner 
8674e1bc9a0SAchim Leubner   /* Setup Ports */
8684e1bc9a0SAchim Leubner   /* Setup PortCount */
8694e1bc9a0SAchim Leubner   saRoot->portCount = saRoot->phyCount;
8704e1bc9a0SAchim Leubner   /* Setup free port link list */
8714e1bc9a0SAchim Leubner   saLlistInitialize(&(saRoot->freePorts));
8724e1bc9a0SAchim Leubner   for ( i = 0; i < saRoot->portCount; i ++ )
8734e1bc9a0SAchim Leubner   {
8744e1bc9a0SAchim Leubner     /* get the pointer to the port */
8754e1bc9a0SAchim Leubner     pPort = &(saRoot->ports[i]);
8764e1bc9a0SAchim Leubner     /* Initialize port */
8774e1bc9a0SAchim Leubner     saLlinkInitialize(&(pPort->linkNode));
8784e1bc9a0SAchim Leubner 
8794e1bc9a0SAchim Leubner     pPort->portContext.osData   = agNULL;
8804e1bc9a0SAchim Leubner     pPort->portContext.sdkData  = pPort;
8814e1bc9a0SAchim Leubner     pPort->portId         = 0;
8824e1bc9a0SAchim Leubner     pPort->portIdx        = (bit8) i;
8834e1bc9a0SAchim Leubner     pPort->status         = PORT_NORMAL;
8844e1bc9a0SAchim Leubner 
8854e1bc9a0SAchim Leubner     for ( j = 0; j < saRoot->phyCount; j ++ )
8864e1bc9a0SAchim Leubner     {
8874e1bc9a0SAchim Leubner       pPort->phyMap[j] = agFALSE;
8884e1bc9a0SAchim Leubner     }
8894e1bc9a0SAchim Leubner 
8904e1bc9a0SAchim Leubner     saLlistInitialize(&(pPort->listSASATADevices));
8914e1bc9a0SAchim Leubner 
8924e1bc9a0SAchim Leubner     /* Add the port to the free port link list */
8934e1bc9a0SAchim Leubner     saLlistAdd(&(saRoot->freePorts), &(pPort->linkNode));
8944e1bc9a0SAchim Leubner   }
8954e1bc9a0SAchim Leubner   /* Setup valid port link list */
8964e1bc9a0SAchim Leubner   saLlistInitialize(&(saRoot->validPorts));
8974e1bc9a0SAchim Leubner 
8984e1bc9a0SAchim Leubner   /* Init sysIntsActive - default is interrupt enable */
8994e1bc9a0SAchim Leubner   saRoot->sysIntsActive = agFALSE;
9004e1bc9a0SAchim Leubner 
9014e1bc9a0SAchim Leubner   /* setup timer tick granunarity */
9024e1bc9a0SAchim Leubner   saRoot->usecsPerTick = usecsPerTick;
9034e1bc9a0SAchim Leubner 
9044e1bc9a0SAchim Leubner   /* setup smallest timer increment for stall */
9054e1bc9a0SAchim Leubner   saRoot->minStallusecs = swConfig->stallUsec;
9064e1bc9a0SAchim Leubner 
9074e1bc9a0SAchim Leubner   SA_DBG1(("saInitialize: WAIT_INCREMENT %d\n" ,WAIT_INCREMENT ));
9084e1bc9a0SAchim Leubner   if (0 == WAIT_INCREMENT)
9094e1bc9a0SAchim Leubner   {
9104e1bc9a0SAchim Leubner     saRoot->minStallusecs = WAIT_INCREMENT_DEFAULT;
9114e1bc9a0SAchim Leubner   }
9124e1bc9a0SAchim Leubner 
9134e1bc9a0SAchim Leubner   /* initialize LL timer tick */
9144e1bc9a0SAchim Leubner   saRoot->timeTick = 0;
9154e1bc9a0SAchim Leubner 
9164e1bc9a0SAchim Leubner   /* initialize device (de)registration callback fns */
9174e1bc9a0SAchim Leubner   saRoot->DeviceRegistrationCB = agNULL;
9184e1bc9a0SAchim Leubner   saRoot->DeviceDeregistrationCB = agNULL;
9194e1bc9a0SAchim Leubner 
9204e1bc9a0SAchim Leubner   /* Initialize the PortMap for port context */
9214e1bc9a0SAchim Leubner   for ( i = 0; i < saRoot->portCount; i ++ )
9224e1bc9a0SAchim Leubner   {
9234e1bc9a0SAchim Leubner     pPortMap = &(saRoot->PortMap[i]);
9244e1bc9a0SAchim Leubner 
9254e1bc9a0SAchim Leubner     pPortMap->PortContext   = agNULL;
9264e1bc9a0SAchim Leubner     pPortMap->PortID        = PORT_MARK_OFF;
9274e1bc9a0SAchim Leubner     pPortMap->PortStatus    = PORT_NORMAL;
9284e1bc9a0SAchim Leubner     saRoot->autoDeregDeviceflag[i] = 0;
9294e1bc9a0SAchim Leubner   }
9304e1bc9a0SAchim Leubner 
9314e1bc9a0SAchim Leubner   /* Initialize the DeviceMap for device handle */
9324e1bc9a0SAchim Leubner   for ( i = 0; i < MAX_IO_DEVICE_ENTRIES; i ++ )
9334e1bc9a0SAchim Leubner   {
9344e1bc9a0SAchim Leubner     pDeviceMap = &(saRoot->DeviceMap[i]);
9354e1bc9a0SAchim Leubner 
9364e1bc9a0SAchim Leubner     pDeviceMap->DeviceHandle  = agNULL;
9374e1bc9a0SAchim Leubner     pDeviceMap->DeviceIdFromFW   =  i;
9384e1bc9a0SAchim Leubner   }
9394e1bc9a0SAchim Leubner 
9404e1bc9a0SAchim Leubner   /* Initialize the IOMap for IOrequest */
9414e1bc9a0SAchim Leubner   for ( i = 0; i < MAX_ACTIVE_IO_REQUESTS; i ++ )
9424e1bc9a0SAchim Leubner   {
9434e1bc9a0SAchim Leubner     pIOMap = &(saRoot->IOMap[i]);
9444e1bc9a0SAchim Leubner 
9454e1bc9a0SAchim Leubner     pIOMap->IORequest   = agNULL;
9464e1bc9a0SAchim Leubner     pIOMap->Tag         = MARK_OFF;
9474e1bc9a0SAchim Leubner   }
9484e1bc9a0SAchim Leubner 
9494e1bc9a0SAchim Leubner   /* setup mpi configuration */
9504e1bc9a0SAchim Leubner   if (!swConfig->param3)
9514e1bc9a0SAchim Leubner   {
9524e1bc9a0SAchim Leubner     /* default configuration */
9534e1bc9a0SAchim Leubner     siConfiguration(agRoot, &saRoot->mpiConfig, hwConfig, swConfig);
9544e1bc9a0SAchim Leubner   }
9554e1bc9a0SAchim Leubner   else
9564e1bc9a0SAchim Leubner   {
9574e1bc9a0SAchim Leubner     /* get from TD layer and save it */
9584e1bc9a0SAchim Leubner     agsaQueueConfig_t *dCFG = &saRoot->QueueConfig;
9594e1bc9a0SAchim Leubner     agsaQueueConfig_t *sCFG = (agsaQueueConfig_t *)swConfig->param3;
9604e1bc9a0SAchim Leubner 
9614e1bc9a0SAchim Leubner     if (dCFG != sCFG)
9624e1bc9a0SAchim Leubner     {
9634e1bc9a0SAchim Leubner       *dCFG = *sCFG;
9644e1bc9a0SAchim Leubner 
9654e1bc9a0SAchim Leubner       if ((hwConfig->hwInterruptCoalescingTimer) || (hwConfig->hwInterruptCoalescingControl))
9664e1bc9a0SAchim Leubner       {
9674e1bc9a0SAchim Leubner         for ( i = 0; i < sCFG->numOutboundQueues; i ++ )
9684e1bc9a0SAchim Leubner         {
9694e1bc9a0SAchim Leubner           /* disable FW assisted coalescing */
9704e1bc9a0SAchim Leubner           sCFG->outboundQueues[i].interruptDelay = 0;
9714e1bc9a0SAchim Leubner           sCFG->outboundQueues[i].interruptCount = 0;
9724e1bc9a0SAchim Leubner         }
9734e1bc9a0SAchim Leubner 
9744e1bc9a0SAchim Leubner         if(smIS_SPC(agRoot))
9754e1bc9a0SAchim Leubner         {
9764e1bc9a0SAchim Leubner           if (hwConfig->hwInterruptCoalescingTimer == 0)
9774e1bc9a0SAchim Leubner           {
9784e1bc9a0SAchim Leubner             hwConfig->hwInterruptCoalescingTimer = 1;
9794e1bc9a0SAchim Leubner             SA_DBG1(("saInitialize:InterruptCoalescingTimer should not be zero. Force to 1\n"));
9804e1bc9a0SAchim Leubner           }
9814e1bc9a0SAchim Leubner         }
9824e1bc9a0SAchim Leubner       }
9834e1bc9a0SAchim Leubner       ret = siConfiguration(agRoot, &saRoot->mpiConfig, hwConfig, swConfig);
9844e1bc9a0SAchim Leubner       if (AGSA_RC_FAILURE == ret)
9854e1bc9a0SAchim Leubner       {
9864e1bc9a0SAchim Leubner         SA_DBG1(("saInitialize failure queue number=%d\n", saRoot->QueueConfig.numInboundQueues));
9874e1bc9a0SAchim Leubner         agRoot->sdkData = agNULL;
9884e1bc9a0SAchim Leubner         smTraceFuncExit(hpDBG_VERY_LOUD, 'r', "m1");
9894e1bc9a0SAchim Leubner         return ret;
9904e1bc9a0SAchim Leubner       }
9914e1bc9a0SAchim Leubner     }
9924e1bc9a0SAchim Leubner   }
9934e1bc9a0SAchim Leubner 
9944e1bc9a0SAchim Leubner 
9954e1bc9a0SAchim Leubner   saRoot->swConfig.param3 = &saRoot->QueueConfig;
9964e1bc9a0SAchim Leubner 
9974e1bc9a0SAchim Leubner   mpiMemoryAllocated.count = memoryAllocated->count - MPI_MEM_INDEX;
9984e1bc9a0SAchim Leubner   for ( i = 0; i < mpiMemoryAllocated.count; i ++ )
9994e1bc9a0SAchim Leubner   {
10004e1bc9a0SAchim Leubner     mpiMemoryAllocated.region[i].virtPtr        = memoryAllocated->agMemory[MPI_IBQ_OBQ_INDEX + i].virtPtr;
10014e1bc9a0SAchim Leubner     mpiMemoryAllocated.region[i].appHandle      = memoryAllocated->agMemory[MPI_IBQ_OBQ_INDEX + i].osHandle;
10024e1bc9a0SAchim Leubner     mpiMemoryAllocated.region[i].physAddrUpper  = memoryAllocated->agMemory[MPI_IBQ_OBQ_INDEX + i].phyAddrUpper;
10034e1bc9a0SAchim Leubner     mpiMemoryAllocated.region[i].physAddrLower  = memoryAllocated->agMemory[MPI_IBQ_OBQ_INDEX + i].phyAddrLower;
10044e1bc9a0SAchim Leubner     mpiMemoryAllocated.region[i].totalLength    = memoryAllocated->agMemory[MPI_IBQ_OBQ_INDEX + i].totalLength;
10054e1bc9a0SAchim Leubner     mpiMemoryAllocated.region[i].numElements    = memoryAllocated->agMemory[MPI_IBQ_OBQ_INDEX + i].numElements;
10064e1bc9a0SAchim Leubner     mpiMemoryAllocated.region[i].elementSize    = memoryAllocated->agMemory[MPI_IBQ_OBQ_INDEX + i].singleElementLength;
10074e1bc9a0SAchim Leubner     mpiMemoryAllocated.region[i].alignment      = memoryAllocated->agMemory[MPI_IBQ_OBQ_INDEX + i].alignment;
10084e1bc9a0SAchim Leubner     mpiMemoryAllocated.region[i].type           = memoryAllocated->agMemory[MPI_IBQ_OBQ_INDEX + i].type;
10094e1bc9a0SAchim Leubner     SA_DBG2(("saInitialize: memoryAllocated->agMemory[%d] VirtPtr=%p PhysicalLo=%x Count=%x Total=%x type %x\n",
10104e1bc9a0SAchim Leubner       (MPI_IBQ_OBQ_INDEX + i),
10114e1bc9a0SAchim Leubner       memoryAllocated->agMemory[MPI_IBQ_OBQ_INDEX + i].virtPtr,
10124e1bc9a0SAchim Leubner       memoryAllocated->agMemory[MPI_IBQ_OBQ_INDEX + i].phyAddrLower,
10134e1bc9a0SAchim Leubner       memoryAllocated->agMemory[MPI_IBQ_OBQ_INDEX + i].numElements,
10144e1bc9a0SAchim Leubner       memoryAllocated->agMemory[MPI_IBQ_OBQ_INDEX + i].totalLength,
10154e1bc9a0SAchim Leubner       memoryAllocated->agMemory[MPI_IBQ_OBQ_INDEX + i].type));
10164e1bc9a0SAchim Leubner 
10174e1bc9a0SAchim Leubner     /* set to zeros */
10184e1bc9a0SAchim Leubner     SA_DBG1(("saInitialize: Zero memory region %d virt %p allocated %d\n",
10194e1bc9a0SAchim Leubner             i,mpiMemoryAllocated.region[i].virtPtr,    mpiMemoryAllocated.region[i].totalLength));
10204e1bc9a0SAchim Leubner     si_memset(mpiMemoryAllocated.region[i].virtPtr , 0,mpiMemoryAllocated.region[i].totalLength);
10214e1bc9a0SAchim Leubner 
10224e1bc9a0SAchim Leubner   }
10234e1bc9a0SAchim Leubner 
10244e1bc9a0SAchim Leubner   if ((!swConfig->max_MSI_InterruptVectors) &&
10254e1bc9a0SAchim Leubner       (!swConfig->max_MSIX_InterruptVectors) &&
10264e1bc9a0SAchim Leubner       (!swConfig->legacyInt_X))
10274e1bc9a0SAchim Leubner   {
10284e1bc9a0SAchim Leubner     /* polling mode */
10294e1bc9a0SAchim Leubner     SA_DBG1(("saInitialize: configured as polling mode\n"));
10304e1bc9a0SAchim Leubner   }
10314e1bc9a0SAchim Leubner   else
10324e1bc9a0SAchim Leubner   {
10334e1bc9a0SAchim Leubner 
10344e1bc9a0SAchim Leubner     SA_DBG1(("saInitialize: swConfig->max_MSI_InterruptVectors %d\n",swConfig->max_MSI_InterruptVectors));
10354e1bc9a0SAchim Leubner     SA_DBG1(("saInitialize: swConfig->max_MSIX_InterruptVectors %d\n",swConfig->max_MSIX_InterruptVectors));
10364e1bc9a0SAchim Leubner 
10374e1bc9a0SAchim Leubner     if ((swConfig->legacyInt_X > 1) || (swConfig->max_MSI_InterruptVectors > 32) ||
10384e1bc9a0SAchim Leubner       (swConfig->max_MSIX_InterruptVectors > 64))
10394e1bc9a0SAchim Leubner     {
10404e1bc9a0SAchim Leubner       /* error */
10414e1bc9a0SAchim Leubner       agRoot->sdkData = agNULL;
10424e1bc9a0SAchim Leubner       SA_DBG1(("saInitialize:AGSA_RC_FAILURE InterruptVectors A\n"));
10434e1bc9a0SAchim Leubner       smTraceFuncExit(hpDBG_VERY_LOUD, 's', "m1");
10444e1bc9a0SAchim Leubner       return AGSA_RC_FAILURE;
10454e1bc9a0SAchim Leubner     }
10464e1bc9a0SAchim Leubner     if ((swConfig->legacyInt_X) && (swConfig->max_MSI_InterruptVectors))
10474e1bc9a0SAchim Leubner     {
10484e1bc9a0SAchim Leubner       /* error */
10494e1bc9a0SAchim Leubner       agRoot->sdkData = agNULL;
10504e1bc9a0SAchim Leubner       SA_DBG1(("saInitialize:AGSA_RC_FAILURE InterruptVectors B\n"));
10514e1bc9a0SAchim Leubner       smTraceFuncExit(hpDBG_VERY_LOUD, 't', "m1");
10524e1bc9a0SAchim Leubner       return AGSA_RC_FAILURE;
10534e1bc9a0SAchim Leubner     }
10544e1bc9a0SAchim Leubner     else if ((swConfig->legacyInt_X) && (swConfig->max_MSIX_InterruptVectors))
10554e1bc9a0SAchim Leubner     {
10564e1bc9a0SAchim Leubner       /* error */
10574e1bc9a0SAchim Leubner       agRoot->sdkData = agNULL;
10584e1bc9a0SAchim Leubner       SA_DBG1(("saInitialize:AGSA_RC_FAILURE InterruptVectors C\n"));
10594e1bc9a0SAchim Leubner       smTraceFuncExit(hpDBG_VERY_LOUD, 'u', "m1");
10604e1bc9a0SAchim Leubner       return AGSA_RC_FAILURE;
10614e1bc9a0SAchim Leubner     }
10624e1bc9a0SAchim Leubner     else if ((swConfig->max_MSI_InterruptVectors) && (swConfig->max_MSIX_InterruptVectors))
10634e1bc9a0SAchim Leubner     {
10644e1bc9a0SAchim Leubner       /* error */
10654e1bc9a0SAchim Leubner       agRoot->sdkData = agNULL;
10664e1bc9a0SAchim Leubner       SA_DBG1(("saInitialize:AGSA_RC_FAILURE InterruptVectors D\n"));
10674e1bc9a0SAchim Leubner       smTraceFuncExit(hpDBG_VERY_LOUD, 'v', "m1");
10684e1bc9a0SAchim Leubner       return AGSA_RC_FAILURE;
10694e1bc9a0SAchim Leubner     }
10704e1bc9a0SAchim Leubner   }
10714e1bc9a0SAchim Leubner 
10724e1bc9a0SAchim Leubner   /* This section sets common interrupt for Legacy(IRQ) and MSI and MSIX types */
10734e1bc9a0SAchim Leubner   if(smIS_SPC(agRoot))
10744e1bc9a0SAchim Leubner   {
10754e1bc9a0SAchim Leubner     SA_DBG1(("saInitialize:  SPC  interrupts\n" ));
10764e1bc9a0SAchim Leubner 
10774e1bc9a0SAchim Leubner     if (swConfig->legacyInt_X)
10784e1bc9a0SAchim Leubner     {
10794e1bc9a0SAchim Leubner       saRoot->OurInterrupt       = siOurLegacyInterrupt;      /* Called in ISR*/
10804e1bc9a0SAchim Leubner       saRoot->DisableInterrupts  = siDisableLegacyInterrupts; /* Called in ISR*/
10814e1bc9a0SAchim Leubner       saRoot->ReEnableInterrupts = siReenableLegacyInterrupts;/* Called in Delayed Int handler*/
10824e1bc9a0SAchim Leubner     }
10834e1bc9a0SAchim Leubner     else if (swConfig->max_MSIX_InterruptVectors)
10844e1bc9a0SAchim Leubner     {
10854e1bc9a0SAchim Leubner       saRoot->OurInterrupt       = siOurMSIXInterrupt;
10864e1bc9a0SAchim Leubner       saRoot->DisableInterrupts  = siDisableMSIXInterrupts;
10874e1bc9a0SAchim Leubner       saRoot->ReEnableInterrupts = siReenableMSIXInterrupts;
10884e1bc9a0SAchim Leubner     }
10894e1bc9a0SAchim Leubner     else if (swConfig->max_MSI_InterruptVectors)
10904e1bc9a0SAchim Leubner     {
10914e1bc9a0SAchim Leubner       saRoot->OurInterrupt       = siOurMSIInterrupt;
10924e1bc9a0SAchim Leubner       saRoot->DisableInterrupts  = siDisableMSIInterrupts;
10934e1bc9a0SAchim Leubner       saRoot->ReEnableInterrupts = siReenableMSIInterrupts;
10944e1bc9a0SAchim Leubner     }
10954e1bc9a0SAchim Leubner     else
10964e1bc9a0SAchim Leubner     {
10974e1bc9a0SAchim Leubner       /* polling mode */
10984e1bc9a0SAchim Leubner       saRoot->OurInterrupt       = siOurLegacyInterrupt;      /* Called in ISR*/
10994e1bc9a0SAchim Leubner       saRoot->DisableInterrupts  = siDisableLegacyInterrupts; /* Called in ISR*/
11004e1bc9a0SAchim Leubner       saRoot->ReEnableInterrupts = siReenableLegacyInterrupts;/* Called in Delayed Int handler*/
11014e1bc9a0SAchim Leubner     }
11024e1bc9a0SAchim Leubner   }
11034e1bc9a0SAchim Leubner   else
11044e1bc9a0SAchim Leubner   {
11054e1bc9a0SAchim Leubner     SA_DBG1(("saInitialize:  SPC V interrupts\n" ));
11064e1bc9a0SAchim Leubner     if (swConfig->legacyInt_X )
11074e1bc9a0SAchim Leubner     {
11084e1bc9a0SAchim Leubner       SA_DBG1(("saInitialize:  SPC V legacyInt_X\n" ));
11094e1bc9a0SAchim Leubner       saRoot->OurInterrupt       = siOurLegacy_V_Interrupt;      /* Called in ISR*/
11104e1bc9a0SAchim Leubner       saRoot->DisableInterrupts  = siDisableLegacy_V_Interrupts; /* Called in ISR*/
11114e1bc9a0SAchim Leubner       saRoot->ReEnableInterrupts = siReenableLegacy_V_Interrupts;/* Called in Delayed Int handler*/
11124e1bc9a0SAchim Leubner     }
11134e1bc9a0SAchim Leubner     else if (swConfig->max_MSIX_InterruptVectors)
11144e1bc9a0SAchim Leubner     {
11154e1bc9a0SAchim Leubner       SA_DBG1(("saInitialize:  SPC V max_MSIX_InterruptVectors %X\n", swConfig->max_MSIX_InterruptVectors));
11164e1bc9a0SAchim Leubner       saRoot->OurInterrupt       = siOurMSIX_V_Interrupt;       /* */
11174e1bc9a0SAchim Leubner       saRoot->DisableInterrupts  = siDisableMSIX_V_Interrupts;
11184e1bc9a0SAchim Leubner       saRoot->ReEnableInterrupts = siReenableMSIX_V_Interrupts;
11194e1bc9a0SAchim Leubner     }
11204e1bc9a0SAchim Leubner     else if (swConfig->max_MSI_InterruptVectors)
11214e1bc9a0SAchim Leubner     {
11224e1bc9a0SAchim Leubner       SA_DBG1(("saInitialize:  SPC V max_MSI_InterruptVectors\n" ));
11234e1bc9a0SAchim Leubner       saRoot->OurInterrupt       = siOurMSIX_V_Interrupt;        /* */
11244e1bc9a0SAchim Leubner       saRoot->DisableInterrupts  = siDisableMSIX_V_Interrupts;
11254e1bc9a0SAchim Leubner       saRoot->ReEnableInterrupts = siReenableMSIX_V_Interrupts;
11264e1bc9a0SAchim Leubner     }
11274e1bc9a0SAchim Leubner     else
11284e1bc9a0SAchim Leubner     {
11294e1bc9a0SAchim Leubner       /* polling mode */
11304e1bc9a0SAchim Leubner       SA_DBG1(("saInitialize:  SPC V polling mode\n" ));
11314e1bc9a0SAchim Leubner       saRoot->OurInterrupt       = siOurLegacy_V_Interrupt;      /* Called in ISR*/
11324e1bc9a0SAchim Leubner       saRoot->DisableInterrupts  = siDisableLegacy_V_Interrupts; /* Called in ISR*/
11334e1bc9a0SAchim Leubner       saRoot->ReEnableInterrupts = siReenableLegacy_V_Interrupts;/* Called in Delayed Int handler*/
11344e1bc9a0SAchim Leubner     }
11354e1bc9a0SAchim Leubner     SA_DBG1(("saInitialize:  SPC V\n" ));
11364e1bc9a0SAchim Leubner   }
11374e1bc9a0SAchim Leubner 
11384e1bc9a0SAchim Leubner   saRoot->Use64bit =  (saRoot->QueueConfig.numOutboundQueues > 32 ) ? 1 : 0;
11394e1bc9a0SAchim Leubner   if( smIS64bInt(agRoot))
11404e1bc9a0SAchim Leubner   {
11414e1bc9a0SAchim Leubner     SA_DBG1(("saInitialize: Use 64 bits for interrupts %d %d\n" ,saRoot->Use64bit, saRoot->QueueConfig.numOutboundQueues ));
11424e1bc9a0SAchim Leubner   }
11434e1bc9a0SAchim Leubner   else
11444e1bc9a0SAchim Leubner   {
11454e1bc9a0SAchim Leubner     SA_DBG1(("saInitialize: Use 32 bits for interrupts %d %d\n",saRoot->Use64bit , saRoot->QueueConfig.numOutboundQueues  ));
11464e1bc9a0SAchim Leubner   }
11474e1bc9a0SAchim Leubner 
11484e1bc9a0SAchim Leubner #ifdef SA_LL_IBQ_PROTECT
11494e1bc9a0SAchim Leubner   SA_DBG1(("saInitialize: Inbound locking defined since LL_IOREQ_IBQ0_LOCK %d\n",LL_IOREQ_IBQ0_LOCK));
11504e1bc9a0SAchim Leubner #endif /* SA_LL_IBQ_PROTECT */
11514e1bc9a0SAchim Leubner 
11524e1bc9a0SAchim Leubner   /* Disable interrupt */
11534e1bc9a0SAchim Leubner   saRoot->DisableInterrupts(agRoot, 0);
11544e1bc9a0SAchim Leubner   SA_DBG1(("saInitialize: DisableInterrupts sysIntsActive %X\n" ,saRoot->sysIntsActive));
11554e1bc9a0SAchim Leubner 
11564e1bc9a0SAchim Leubner #ifdef SA_FW_TEST_BUNCH_STARTS
11574e1bc9a0SAchim Leubner   saRoot->BunchStarts_Enable        = FALSE;
11584e1bc9a0SAchim Leubner   saRoot->BunchStarts_Threshold     = 5;
11594e1bc9a0SAchim Leubner   saRoot->BunchStarts_Pending       = 0;
11604e1bc9a0SAchim Leubner   saRoot->BunchStarts_TimeoutTicks  = 10;  // N x 100 ms
11614e1bc9a0SAchim Leubner #endif /* SA_FW_TEST_BUNCH_STARTS */
11624e1bc9a0SAchim Leubner 
11634e1bc9a0SAchim Leubner   /* clear the interrupt vector bitmap */
11644e1bc9a0SAchim Leubner   for ( i = 0; i < MAX_NUM_VECTOR; i ++ )
11654e1bc9a0SAchim Leubner   {
11664e1bc9a0SAchim Leubner     saRoot->interruptVecIndexBitMap[i] = 0;
11674e1bc9a0SAchim Leubner     saRoot->interruptVecIndexBitMap1[i] = 0;
11684e1bc9a0SAchim Leubner   }
11694e1bc9a0SAchim Leubner 
11704e1bc9a0SAchim Leubner #if defined(SALLSDK_DEBUG)
11714e1bc9a0SAchim Leubner   smTrace(hpDBG_VERY_LOUD,"2Y",0);
11724e1bc9a0SAchim Leubner   /* TP:2Y SCRATCH_PAD */
11734e1bc9a0SAchim Leubner 
11744e1bc9a0SAchim Leubner   SA_DBG1(("saInitialize: SCRATCH_PAD0 value = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_0)));
11754e1bc9a0SAchim Leubner   SA_DBG1(("saInitialize: SCRATCH_PAD1 value = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_1)));
11764e1bc9a0SAchim Leubner   SA_DBG1(("saInitialize: SCRATCH_PAD2 value = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_2)));
11774e1bc9a0SAchim Leubner   SA_DBG1(("saInitialize: SCRATCH_PAD3 value = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_3)));
11784e1bc9a0SAchim Leubner #endif /* SALLSDK_DEBUG */
11794e1bc9a0SAchim Leubner 
11804e1bc9a0SAchim Leubner   if(smIS_SPCV(agRoot))
11814e1bc9a0SAchim Leubner   {
11824e1bc9a0SAchim Leubner     bit32 ScratchPad1 =0;
11834e1bc9a0SAchim Leubner     bit32 ScratchPad3 =0;
11844e1bc9a0SAchim Leubner 
11854e1bc9a0SAchim Leubner     ScratchPad1 = ossaHwRegRead(agRoot,V_Scratchpad_1_Register);
11864e1bc9a0SAchim Leubner     ScratchPad3 = ossaHwRegRead(agRoot,V_Scratchpad_3_Register);
11874e1bc9a0SAchim Leubner     if((ScratchPad1 & SCRATCH_PAD1_V_RAAE_MASK) ==  SCRATCH_PAD1_V_RAAE_MASK)
11884e1bc9a0SAchim Leubner     {
11894e1bc9a0SAchim Leubner       if(((ScratchPad3 & SCRATCH_PAD3_V_ENC_MASK ) == SCRATCH_PAD3_V_ENC_DIS_ERR ) ||
11904e1bc9a0SAchim Leubner          ((ScratchPad3 & SCRATCH_PAD3_V_ENC_MASK ) == SCRATCH_PAD3_V_ENC_ENA_ERR )    )
11914e1bc9a0SAchim Leubner       {
11924e1bc9a0SAchim Leubner         SA_DBG1(("saInitialize:Warning Encryption Issue SCRATCH_PAD3 value = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_3)));
11934e1bc9a0SAchim Leubner       }
11944e1bc9a0SAchim Leubner     }
11954e1bc9a0SAchim Leubner   }
11964e1bc9a0SAchim Leubner 
11974e1bc9a0SAchim Leubner   if( smIS_SPC(agRoot))
11984e1bc9a0SAchim Leubner   {
11994e1bc9a0SAchim Leubner #ifdef SA_ENABLE_HDA_FUNCTIONS
12004e1bc9a0SAchim Leubner     TryWithHDA_ON:
12014e1bc9a0SAchim Leubner     Double_Reset_HDA = TRUE;
12024e1bc9a0SAchim Leubner 
12034e1bc9a0SAchim Leubner     if (swConfig->hostDirectAccessSupport)
12044e1bc9a0SAchim Leubner     {
12054e1bc9a0SAchim Leubner       if (AGSA_RC_FAILURE == siHDAMode(agRoot, swConfig->hostDirectAccessMode, (agsaFwImg_t *)swConfig->param4))
12064e1bc9a0SAchim Leubner       {
12074e1bc9a0SAchim Leubner         SA_DBG1(("saInitialize:AGSA_RC_FAILURE siHDAMode\n"));
12084e1bc9a0SAchim Leubner         agRoot->sdkData = agNULL;
12094e1bc9a0SAchim Leubner         smTraceFuncExit(hpDBG_VERY_LOUD, 'w', "m1");
12104e1bc9a0SAchim Leubner         return AGSA_RC_FAILURE;
12114e1bc9a0SAchim Leubner       }
12124e1bc9a0SAchim Leubner       else
12134e1bc9a0SAchim Leubner       {
12144e1bc9a0SAchim Leubner         SA_DBG1(("saInitialize:1 Going to HDA mode HDA 0x%X \n",ossaHwRegReadExt(agRoot, PCIBAR3, HDA_RSP_OFFSET1MB+HDA_CMD_CODE_OFFSET)));
12154e1bc9a0SAchim Leubner         if(Double_Reset_HDA == agFALSE)
12164e1bc9a0SAchim Leubner         {
12174e1bc9a0SAchim Leubner           siSpcSoftReset(agRoot, SPC_HDASOFT_RESET_SIGNATURE);
12184e1bc9a0SAchim Leubner           SA_DBG1(("saInitialize: Double_Reset_HDA HDA 0x%X \n",ossaHwRegReadExt(agRoot, PCIBAR3, HDA_RSP_OFFSET1MB+HDA_CMD_CODE_OFFSET)));
12194e1bc9a0SAchim Leubner           Double_Reset_HDA = TRUE;
12204e1bc9a0SAchim Leubner           goto TryWithHDA_ON;
12214e1bc9a0SAchim Leubner         }
12224e1bc9a0SAchim Leubner       }
12234e1bc9a0SAchim Leubner     }
12244e1bc9a0SAchim Leubner     else
12254e1bc9a0SAchim Leubner     {
12264e1bc9a0SAchim Leubner       /* check FW is running */
12274e1bc9a0SAchim Leubner       if (BOOTTLOADERHDA_IDLE == (ossaHwRegReadExt(agRoot, PCIBAR3, HDA_RSP_OFFSET1MB+HDA_CMD_CODE_OFFSET) & HDA_STATUS_BITS))
12284e1bc9a0SAchim Leubner       {
12294e1bc9a0SAchim Leubner         /* HDA mode */
12304e1bc9a0SAchim Leubner         SA_DBG1(("saInitialize: No HDA mode enable and FW is not running.\n"));
12314e1bc9a0SAchim Leubner         if(Tried_NO_HDA != agTRUE )
12324e1bc9a0SAchim Leubner         {
12334e1bc9a0SAchim Leubner 
12344e1bc9a0SAchim Leubner           Tried_NO_HDA = TRUE;
12354e1bc9a0SAchim Leubner           swConfig->hostDirectAccessSupport = 1;
12364e1bc9a0SAchim Leubner           swConfig->hostDirectAccessMode = 1;
12374e1bc9a0SAchim Leubner           siSpcSoftReset(agRoot, SPC_HDASOFT_RESET_SIGNATURE);
12384e1bc9a0SAchim Leubner           SA_DBG1(("saInitialize: 2 Going to HDA mode HDA %X \n",ossaHwRegReadExt(agRoot, PCIBAR3, HDA_RSP_OFFSET1MB+HDA_CMD_CODE_OFFSET)));
12394e1bc9a0SAchim Leubner           goto TryWithHDA_ON;
12404e1bc9a0SAchim Leubner         }
12414e1bc9a0SAchim Leubner         else
12424e1bc9a0SAchim Leubner         {
12434e1bc9a0SAchim Leubner           SA_DBG1(("saInitialize: could not start HDA mode HDA %X \n",ossaHwRegReadExt(agRoot, PCIBAR3, HDA_RSP_OFFSET1MB+HDA_CMD_CODE_OFFSET)));
12444e1bc9a0SAchim Leubner           smTraceFuncExit(hpDBG_VERY_LOUD, 'x', "m1");
12454e1bc9a0SAchim Leubner 
12464e1bc9a0SAchim Leubner           return AGSA_RC_FAILURE;
12474e1bc9a0SAchim Leubner         }
12484e1bc9a0SAchim Leubner         smTraceFuncExit(hpDBG_VERY_LOUD, 'y', "m1");
12494e1bc9a0SAchim Leubner         return AGSA_RC_FAILURE;
12504e1bc9a0SAchim Leubner       }
12514e1bc9a0SAchim Leubner     }
12524e1bc9a0SAchim Leubner #else /* SA_ENABLE_HDA_FUNCTIONS */
12534e1bc9a0SAchim Leubner     /* check FW is running */
12544e1bc9a0SAchim Leubner     if (BOOTTLOADERHDA_IDLE == (ossaHwRegReadExt(agRoot, PCIBAR3, HDA_RSP_OFFSET1MB+HDA_CMD_CODE_OFFSET) & HDA_STATUS_BITS) )
12554e1bc9a0SAchim Leubner     {
12564e1bc9a0SAchim Leubner       /* HDA mode */
12574e1bc9a0SAchim Leubner       SA_DBG1(("saInitialize: No HDA mode enable and FW is not running.\n"));
12584e1bc9a0SAchim Leubner       smTraceFuncExit(hpDBG_VERY_LOUD, 'z', "m1");
12594e1bc9a0SAchim Leubner       return AGSA_RC_FAILURE;
12604e1bc9a0SAchim Leubner     }
12614e1bc9a0SAchim Leubner #endif /* SA_ENABLE_HDA_FUNCTIONS */
12624e1bc9a0SAchim Leubner   }
12634e1bc9a0SAchim Leubner   else
12644e1bc9a0SAchim Leubner   {
12654e1bc9a0SAchim Leubner     SA_DBG1(("saInitialize: SPCv swConfig->hostDirectAccessMode %d swConfig->hostDirectAccessSupport %d\n",swConfig->hostDirectAccessMode,swConfig->hostDirectAccessSupport));
12664e1bc9a0SAchim Leubner     if (swConfig->hostDirectAccessSupport)
12674e1bc9a0SAchim Leubner     {
12684e1bc9a0SAchim Leubner       bit32 hda_status;
12694e1bc9a0SAchim Leubner       bit32 soft_reset_status = AGSA_RC_SUCCESS;
12704e1bc9a0SAchim Leubner 
12714e1bc9a0SAchim Leubner       SA_DBG1(("saInitialize: SPCv load HDA\n"));
12724e1bc9a0SAchim Leubner 
12734e1bc9a0SAchim Leubner       hda_status = (ossaHwRegReadExt(agRoot, PCIBAR0, SPC_V_HDA_RESPONSE_OFFSET+28));
12744e1bc9a0SAchim Leubner 
12754e1bc9a0SAchim Leubner       SA_DBG1(("saInitialize: hda_status 0x%x\n",hda_status));
12764e1bc9a0SAchim Leubner 
12774e1bc9a0SAchim Leubner       siScratchDump(agRoot);
12784e1bc9a0SAchim Leubner 
12794e1bc9a0SAchim Leubner       if( swConfig->hostDirectAccessMode == 0)
12804e1bc9a0SAchim Leubner       {
12814e1bc9a0SAchim Leubner         soft_reset_status = siSoftReset(agRoot, SPC_HDASOFT_RESET_SIGNATURE);
12824e1bc9a0SAchim Leubner         if(soft_reset_status !=  AGSA_RC_SUCCESS)
12834e1bc9a0SAchim Leubner         {
12844e1bc9a0SAchim Leubner           agRoot->sdkData = agNULL;
12854e1bc9a0SAchim Leubner           SA_DBG1(("saInitialize:AGSA_RC_FAILURE soft_reset_status\n"));
12864e1bc9a0SAchim Leubner 
12874e1bc9a0SAchim Leubner           smTraceFuncExit(hpDBG_VERY_LOUD, 'A', "m1");
12884e1bc9a0SAchim Leubner           return AGSA_RC_FAILURE;
12894e1bc9a0SAchim Leubner         }
12904e1bc9a0SAchim Leubner       }
12914e1bc9a0SAchim Leubner 
12924e1bc9a0SAchim Leubner       if((hda_status  & SPC_V_HDAR_RSPCODE_MASK)  != SPC_V_HDAR_IDLE)
12934e1bc9a0SAchim Leubner       {
12944e1bc9a0SAchim Leubner         SA_DBG1(("saInitialize: hda_status not SPC_V_HDAR_IDLE 0x%08x\n", hda_status));
12954e1bc9a0SAchim Leubner         soft_reset_status = siSoftReset(agRoot, SPC_HDASOFT_RESET_SIGNATURE);
12964e1bc9a0SAchim Leubner         hda_status = (ossaHwRegReadExt(agRoot, PCIBAR0, SPC_V_HDA_RESPONSE_OFFSET+28));
12974e1bc9a0SAchim Leubner         if((hda_status  & SPC_V_HDAR_RSPCODE_MASK)  != SPC_V_HDAR_IDLE)
12984e1bc9a0SAchim Leubner         {
12994e1bc9a0SAchim Leubner           SA_DBG1(("saInitialize: 2 reset hda_status not SPC_V_HDAR_IDLE 0x%08x\n", hda_status));
13004e1bc9a0SAchim Leubner         }
13014e1bc9a0SAchim Leubner       }
13024e1bc9a0SAchim Leubner       if(soft_reset_status !=  AGSA_RC_SUCCESS)
13034e1bc9a0SAchim Leubner       {
13044e1bc9a0SAchim Leubner         agRoot->sdkData = agNULL;
13054e1bc9a0SAchim Leubner         SA_DBG1(("saInitialize:AGSA_RC_FAILURE soft_reset_status A\n"));
13064e1bc9a0SAchim Leubner         smTraceFuncExit(hpDBG_VERY_LOUD, 'B', "m1");
13074e1bc9a0SAchim Leubner         return AGSA_RC_FAILURE;
13084e1bc9a0SAchim Leubner       }
13094e1bc9a0SAchim Leubner 
13104e1bc9a0SAchim Leubner #ifdef SA_ENABLE_HDA_FUNCTIONS
13114e1bc9a0SAchim Leubner       if (AGSA_RC_FAILURE == siHDAMode_V(agRoot, swConfig->hostDirectAccessMode, (agsaFwImg_t *)swConfig->param4))
13124e1bc9a0SAchim Leubner       {
13134e1bc9a0SAchim Leubner         SA_DBG1(("saInitialize:AGSA_RC_FAILURE siHDAMode_V\n"));
13144e1bc9a0SAchim Leubner 
13154e1bc9a0SAchim Leubner         siChipResetV(agRoot, SPC_HDASOFT_RESET_SIGNATURE);
13164e1bc9a0SAchim Leubner         agRoot->sdkData = agNULL;
13174e1bc9a0SAchim Leubner         smTraceFuncExit(hpDBG_VERY_LOUD, 'C', "m1");
13184e1bc9a0SAchim Leubner         return AGSA_RC_FAILURE;
13194e1bc9a0SAchim Leubner       }
13204e1bc9a0SAchim Leubner #endif /* SA_ENABLE_HDA_FUNCTIONS */
13214e1bc9a0SAchim Leubner 
13224e1bc9a0SAchim Leubner     }
13234e1bc9a0SAchim Leubner     else
13244e1bc9a0SAchim Leubner     {
13254e1bc9a0SAchim Leubner       SA_DBG1(("saInitialize: SPCv normal\n"));
13264e1bc9a0SAchim Leubner     }
13274e1bc9a0SAchim Leubner 
13284e1bc9a0SAchim Leubner   }
13294e1bc9a0SAchim Leubner 
13304e1bc9a0SAchim Leubner   /* copy the table to the LL layer */
13314e1bc9a0SAchim Leubner   si_memcpy(&saRoot->mpiConfig.phyAnalogConfig, &hwConfig->phyAnalogConfig, sizeof(agsaPhyAnalogSetupTable_t));
13324e1bc9a0SAchim Leubner 
13334e1bc9a0SAchim Leubner #ifdef SALL_API_TEST
13344e1bc9a0SAchim Leubner   /* Initialize the LL IO counter */
13354e1bc9a0SAchim Leubner   si_memset(&saRoot->LLCounters, 0, sizeof(agsaIOCountInfo_t));
13364e1bc9a0SAchim Leubner #endif
13374e1bc9a0SAchim Leubner 
13384e1bc9a0SAchim Leubner   si_memset(&saRoot->IoErrorCount, 0, sizeof(agsaIOErrorEventStats_t));
13394e1bc9a0SAchim Leubner   si_memset(&saRoot->IoEventCount, 0, sizeof(agsaIOErrorEventStats_t));
13404e1bc9a0SAchim Leubner   if(smIS_SPC(agRoot))
13414e1bc9a0SAchim Leubner   {
13424e1bc9a0SAchim Leubner 	  if( smIS_spc8081(agRoot))
13434e1bc9a0SAchim Leubner 	  {
13444e1bc9a0SAchim Leubner 		if (AGSA_RC_FAILURE == siBar4Shift(agRoot, MBIC_GSM_SM_BASE))
13454e1bc9a0SAchim Leubner 		{
13464e1bc9a0SAchim Leubner 		  SA_DBG1(("saInitialize: siBar4Shift FAILED ******************************************\n"));
13474e1bc9a0SAchim Leubner 		}
13484e1bc9a0SAchim Leubner 	  }
13494e1bc9a0SAchim Leubner 	siSpcSoftReset(agRoot, SPC_SOFT_RESET_SIGNATURE);
13504e1bc9a0SAchim Leubner   }
13514e1bc9a0SAchim Leubner   if(smIS_SPCV(agRoot))
13524e1bc9a0SAchim Leubner   {
13534e1bc9a0SAchim Leubner 	SA_DBG1(("saInitialize: saRoot->ChipId == VEN_DEV_SPCV\n"));
13544e1bc9a0SAchim Leubner 	siChipResetV(agRoot, SPC_SOFT_RESET_SIGNATURE);
13554e1bc9a0SAchim Leubner   }
13564e1bc9a0SAchim Leubner 
13574e1bc9a0SAchim Leubner   /* MPI Initialization */
13584e1bc9a0SAchim Leubner   ret = mpiInitialize(agRoot, &mpiMemoryAllocated, &saRoot->mpiConfig);
13594e1bc9a0SAchim Leubner   SA_DBG1(("saInitialize: MaxOutstandingIO 0x%x swConfig->maxActiveIOs 0x%x\n", saRoot->ControllerInfo.maxPendingIO,saRoot->swConfig.maxActiveIOs ));
13604e1bc9a0SAchim Leubner 
13614e1bc9a0SAchim Leubner #ifdef SA_ENABLE_HDA_FUNCTIONS
13624e1bc9a0SAchim Leubner   if( ret  == AGSA_RC_FAILURE && Tried_NO_HDA == agFALSE && smIS_SPC(agRoot))
13634e1bc9a0SAchim Leubner   { /* FW not flashed  */
13644e1bc9a0SAchim Leubner     Tried_NO_HDA=agTRUE;
13654e1bc9a0SAchim Leubner     swConfig->hostDirectAccessSupport = 1;
13664e1bc9a0SAchim Leubner     swConfig->hostDirectAccessMode = 1;
13674e1bc9a0SAchim Leubner     siSoftReset(agRoot, SPC_SOFT_RESET_SIGNATURE);
13684e1bc9a0SAchim Leubner     SA_DBG1(("saInitialize: 3 Going to HDA mode HDA %X \n",ossaHwRegReadExt(agRoot, PCIBAR3, HDA_RSP_OFFSET1MB+HDA_CMD_CODE_OFFSET)));
13694e1bc9a0SAchim Leubner     goto TryWithHDA_ON;
13704e1bc9a0SAchim Leubner   }
13714e1bc9a0SAchim Leubner 
13724e1bc9a0SAchim Leubner #endif /* SA_ENABLE_HDA_FUNCTIONS */
13734e1bc9a0SAchim Leubner 
13744e1bc9a0SAchim Leubner   if( ret  == AGSA_RC_FAILURE)
13754e1bc9a0SAchim Leubner   {
13764e1bc9a0SAchim Leubner     SA_DBG1(("saInitialize:  AGSA_RC_FAILURE mpiInitialize\n"));
13774e1bc9a0SAchim Leubner     SA_DBG1(("saInitialize: SCRATCH_PAD0 value = 0x%x\n", ossaHwRegRead(agRoot, V_Scratchpad_0_Register)));
13784e1bc9a0SAchim Leubner     SA_DBG1(("saInitialize: SCRATCH_PAD1 value = 0x%x\n", ossaHwRegRead(agRoot, V_Scratchpad_1_Register)));
13794e1bc9a0SAchim Leubner     SA_DBG1(("saInitialize: SCRATCH_PAD2 value = 0x%x\n", ossaHwRegRead(agRoot, V_Scratchpad_2_Register)));
13804e1bc9a0SAchim Leubner     SA_DBG1(("saInitialize: SCRATCH_PAD3 value = 0x%x\n", ossaHwRegRead(agRoot, V_Scratchpad_3_Register)));
13814e1bc9a0SAchim Leubner 
13824e1bc9a0SAchim Leubner     if(saRoot->swConfig.fatalErrorInterruptEnable)
13834e1bc9a0SAchim Leubner     {
13844e1bc9a0SAchim Leubner       ossaDisableInterrupts(agRoot,saRoot->swConfig.fatalErrorInterruptVector );
13854e1bc9a0SAchim Leubner     }
13864e1bc9a0SAchim Leubner 
13874e1bc9a0SAchim Leubner     agRoot->sdkData = agNULL;
13884e1bc9a0SAchim Leubner     smTraceFuncExit(hpDBG_VERY_LOUD, 'D', "m1");
13894e1bc9a0SAchim Leubner     return ret;
13904e1bc9a0SAchim Leubner   }
13914e1bc9a0SAchim Leubner 
13924e1bc9a0SAchim Leubner   /* setup hardware interrupt coalescing control and timer registers */
13934e1bc9a0SAchim Leubner   if(smIS_SPCV(agRoot))
13944e1bc9a0SAchim Leubner   {
13954e1bc9a0SAchim Leubner       SA_DBG1(("saInitialize: SPC_V Not set hwInterruptCoalescingTimer\n" ));
13964e1bc9a0SAchim Leubner       SA_DBG1(("saInitialize: SPC_V Not set hwInterruptCoalescingControl\n" ));
13974e1bc9a0SAchim Leubner   }
13984e1bc9a0SAchim Leubner   else
13994e1bc9a0SAchim Leubner   {
14004e1bc9a0SAchim Leubner       ossaHwRegWriteExt(agRoot, PCIBAR1, SPC_ICTIMER,hwConfig->hwInterruptCoalescingTimer );
14014e1bc9a0SAchim Leubner       ossaHwRegWriteExt(agRoot, PCIBAR1, SPC_ICCONTROL, hwConfig->hwInterruptCoalescingControl);
14024e1bc9a0SAchim Leubner   }
14034e1bc9a0SAchim Leubner 
14044e1bc9a0SAchim Leubner 
14054e1bc9a0SAchim Leubner   SA_DBG1(("saInitialize: swConfig->fatalErrorInterruptEnable  %X\n",swConfig->fatalErrorInterruptEnable));
14064e1bc9a0SAchim Leubner 
14074e1bc9a0SAchim Leubner   SA_DBG1(("saInitialize: saRoot->swConfig.fatalErrorInterruptVector  %X\n",saRoot->swConfig.fatalErrorInterruptVector));
14084e1bc9a0SAchim Leubner   SA_DBG1(("saInitialize: swConfig->max_MSI_InterruptVectors   %X\n",swConfig->max_MSI_InterruptVectors));
14094e1bc9a0SAchim Leubner   SA_DBG1(("saInitialize: swConfig->max_MSIX_InterruptVectors  %X\n",swConfig->max_MSIX_InterruptVectors));
14104e1bc9a0SAchim Leubner   SA_DBG1(("saInitialize: swConfig->legacyInt_X                %X\n",swConfig->legacyInt_X));
14114e1bc9a0SAchim Leubner   SA_DBG1(("saInitialize: swConfig->hostDirectAccessSupport    %X\n",swConfig->hostDirectAccessSupport));
14124e1bc9a0SAchim Leubner   SA_DBG1(("saInitialize: swConfig->hostDirectAccessMode       %X\n",swConfig->hostDirectAccessMode));
14134e1bc9a0SAchim Leubner 
14144e1bc9a0SAchim Leubner #ifdef SA_CONFIG_MDFD_REGISTRY
14154e1bc9a0SAchim Leubner   SA_DBG1(("saInitialize: swConfig->disableMDF                 %X\n",swConfig->disableMDF));
14164e1bc9a0SAchim Leubner #endif /*SA_CONFIG_MDFD_REGISTRY*/
14174e1bc9a0SAchim Leubner   /*SA_DBG1(("saInitialize: swConfig->enableDIF                  %X\n",swConfig->enableDIF));*/
14184e1bc9a0SAchim Leubner   /*SA_DBG1(("saInitialize: swConfig->enableEncryption           %X\n",swConfig->enableEncryption));*/
14194e1bc9a0SAchim Leubner 
14204e1bc9a0SAchim Leubner 
14214e1bc9a0SAchim Leubner   /* log message if failure */
14224e1bc9a0SAchim Leubner   if (AGSA_RC_FAILURE == ret)
14234e1bc9a0SAchim Leubner   {
14244e1bc9a0SAchim Leubner     SA_DBG1(("saInitialize:AGSA_RC_FAILURE mpiInitialize\n"));
14254e1bc9a0SAchim Leubner     /* Assign chip status */
14264e1bc9a0SAchim Leubner     saRoot->chipStatus = CHIP_FATAL_ERROR;
14274e1bc9a0SAchim Leubner   }
14284e1bc9a0SAchim Leubner   else
14294e1bc9a0SAchim Leubner   {
14304e1bc9a0SAchim Leubner     /* Assign chip status */
14314e1bc9a0SAchim Leubner     saRoot->chipStatus = CHIP_NORMAL;
14324e1bc9a0SAchim Leubner #ifdef SA_FW_TIMER_READS_STATUS
14334e1bc9a0SAchim Leubner     siTimerAdd(agRoot,SA_FW_TIMER_READS_STATUS_INTERVAL, siReadControllerStatus,0,agNULL  );
14344e1bc9a0SAchim Leubner #endif /* SA_FW_TIMER_READS_STATUS */
14354e1bc9a0SAchim Leubner   }
14364e1bc9a0SAchim Leubner 
14374e1bc9a0SAchim Leubner 
14384e1bc9a0SAchim Leubner   if( ret == AGSA_RC_SUCCESS || ret == AGSA_RC_VERSION_UNTESTED)
14394e1bc9a0SAchim Leubner   {
14404e1bc9a0SAchim Leubner     if(gPollForMissingInt)
14414e1bc9a0SAchim Leubner     {
14424e1bc9a0SAchim Leubner       mpiOCQueue_t         *circularQ;
14434e1bc9a0SAchim Leubner       SA_DBG1(("saInitialize:  saRoot->sysIntsActive %X\n",saRoot->sysIntsActive));
14444e1bc9a0SAchim Leubner 
14454e1bc9a0SAchim Leubner       circularQ = &saRoot->outboundQueue[0];
14464e1bc9a0SAchim Leubner       OSSA_READ_LE_32(circularQ->agRoot, &circularQ->producerIdx, circularQ->piPointer, 0);
14474e1bc9a0SAchim Leubner       SA_DBG1(("saInitialize: PI 0x%03x CI 0x%03x\n",circularQ->producerIdx, circularQ->consumerIdx));
14484e1bc9a0SAchim Leubner     }
14494e1bc9a0SAchim Leubner   }
14504e1bc9a0SAchim Leubner 
14514e1bc9a0SAchim Leubner   /* If fatal error interrupt enable we need checking it during the interrupt */
14524e1bc9a0SAchim Leubner   SA_DBG1(("saInitialize: swConfig.fatalErrorInterruptEnable %d\n",saRoot->swConfig.fatalErrorInterruptEnable));
14534e1bc9a0SAchim Leubner   SA_DBG1(("saInitialize: swConfig.fatalErrorInterruptVector %d\n",saRoot->swConfig.fatalErrorInterruptVector));
14544e1bc9a0SAchim Leubner   SA_DBG1(("saInitialize: swConfig->max_MSIX_InterruptVectors  %X\n",swConfig->max_MSIX_InterruptVectors));
14554e1bc9a0SAchim Leubner 
14564e1bc9a0SAchim Leubner   if(saRoot->swConfig.fatalErrorInterruptEnable)
14574e1bc9a0SAchim Leubner   {
14584e1bc9a0SAchim Leubner 
14594e1bc9a0SAchim Leubner     SA_DBG1(("saInitialize: Doorbell_Set  %08X U %08X\n",
14604e1bc9a0SAchim Leubner                              ossaHwRegReadExt(agRoot, PCIBAR0, V_Outbound_Doorbell_Set_Register),
14614e1bc9a0SAchim Leubner                              ossaHwRegReadExt(agRoot, PCIBAR0, V_Outbound_Doorbell_Set_RegisterU)));
14624e1bc9a0SAchim Leubner     SA_DBG1(("saInitialize: Doorbell_Mask %08X U %08X\n",
14634e1bc9a0SAchim Leubner                              ossaHwRegReadExt(agRoot, PCIBAR0, V_Outbound_Doorbell_Mask_Set_Register ),
14644e1bc9a0SAchim Leubner                              ossaHwRegReadExt(agRoot, PCIBAR0, V_Outbound_Doorbell_Mask_Set_RegisterU )));
14654e1bc9a0SAchim Leubner 
14664e1bc9a0SAchim Leubner     ossaReenableInterrupts(agRoot,saRoot->swConfig.fatalErrorInterruptVector );
14674e1bc9a0SAchim Leubner 
14684e1bc9a0SAchim Leubner     SA_DBG1(("saInitialize: Doorbell_Set  %08X U %08X\n",
14694e1bc9a0SAchim Leubner                              ossaHwRegReadExt(agRoot, PCIBAR0, V_Outbound_Doorbell_Set_Register),
14704e1bc9a0SAchim Leubner                              ossaHwRegReadExt(agRoot, PCIBAR0, V_Outbound_Doorbell_Set_RegisterU)));
14714e1bc9a0SAchim Leubner     SA_DBG1(("saInitialize: Doorbell_Mask %08X U %08X\n",
14724e1bc9a0SAchim Leubner                              ossaHwRegReadExt(agRoot, PCIBAR0, V_Outbound_Doorbell_Mask_Set_Register ),
14734e1bc9a0SAchim Leubner                              ossaHwRegReadExt(agRoot, PCIBAR0, V_Outbound_Doorbell_Mask_Set_RegisterU )));
14744e1bc9a0SAchim Leubner   }
14754e1bc9a0SAchim Leubner 
14764e1bc9a0SAchim Leubner 
14774e1bc9a0SAchim Leubner   SA_DBG1(("saInitialize: siDumpActiveIORequests\n"));
14784e1bc9a0SAchim Leubner   siDumpActiveIORequests(agRoot, saRoot->swConfig.maxActiveIOs);
14794e1bc9a0SAchim Leubner 
14804e1bc9a0SAchim Leubner   smTraceFuncExit(hpDBG_VERY_LOUD, 'E', "m1");
14814e1bc9a0SAchim Leubner   /* return */
14824e1bc9a0SAchim Leubner   return ret;
14834e1bc9a0SAchim Leubner }
14844e1bc9a0SAchim Leubner 
14854e1bc9a0SAchim Leubner 
14864e1bc9a0SAchim Leubner 
14874e1bc9a0SAchim Leubner #ifdef SA_FW_TIMER_READS_STATUS
14884e1bc9a0SAchim Leubner 
siReadControllerStatus(agsaRoot_t * agRoot,bit32 Event,void * pParm)14894e1bc9a0SAchim Leubner bit32 siReadControllerStatus(
14904e1bc9a0SAchim Leubner                                   agsaRoot_t      *agRoot,
14914e1bc9a0SAchim Leubner                                   bit32           Event,
14924e1bc9a0SAchim Leubner                                   void *          pParm
14934e1bc9a0SAchim Leubner                                   )
14944e1bc9a0SAchim Leubner {
14954e1bc9a0SAchim Leubner   bit32 to_ret =0;
14964e1bc9a0SAchim Leubner   agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
14974e1bc9a0SAchim Leubner   mpiReadGSTable(agRoot,  &saRoot->mpiGSTable);
14984e1bc9a0SAchim Leubner 
14994e1bc9a0SAchim Leubner   if(smIS_SPCV_2_IOP(agRoot))
15004e1bc9a0SAchim Leubner   {
15014e1bc9a0SAchim Leubner     if(saRoot->Iop1Tcnt_last  == saRoot->mpiGSTable.Iop1Tcnt )
15024e1bc9a0SAchim Leubner     SA_DBG2(("siReadControllerStatus: Iop1 %d STUCK\n", saRoot->mpiGSTable.Iop1Tcnt));
15034e1bc9a0SAchim Leubner   }
15044e1bc9a0SAchim Leubner 
15054e1bc9a0SAchim Leubner   if( saRoot->MsguTcnt_last == saRoot->mpiGSTable.MsguTcnt || saRoot->IopTcnt_last  == saRoot->mpiGSTable.IopTcnt )
15064e1bc9a0SAchim Leubner   {
15074e1bc9a0SAchim Leubner     SA_DBG1(("siReadControllerStatus: Msgu %d Iop %d\n",saRoot->mpiGSTable.MsguTcnt, saRoot->mpiGSTable.IopTcnt));
15084e1bc9a0SAchim Leubner     saFatalInterruptHandler(agRoot,  saRoot->swConfig.fatalErrorInterruptVector  );
15094e1bc9a0SAchim Leubner   }
15104e1bc9a0SAchim Leubner   SA_DBG2(("siReadControllerStatus: Msgu %d Iop %d\n",saRoot->mpiGSTable.MsguTcnt, saRoot->mpiGSTable.IopTcnt));
15114e1bc9a0SAchim Leubner 
15124e1bc9a0SAchim Leubner   saRoot->MsguTcnt_last = saRoot->mpiGSTable.MsguTcnt;
15134e1bc9a0SAchim Leubner   saRoot->IopTcnt_last  = saRoot->mpiGSTable.IopTcnt;
15144e1bc9a0SAchim Leubner   saRoot->Iop1Tcnt_last = saRoot->mpiGSTable.Iop1Tcnt;
15154e1bc9a0SAchim Leubner 
15164e1bc9a0SAchim Leubner 
15174e1bc9a0SAchim Leubner   if(gPollForMissingInt)
15184e1bc9a0SAchim Leubner   {
15194e1bc9a0SAchim Leubner     mpiOCQueue_t         *circularQ;
15204e1bc9a0SAchim Leubner     SA_DBG4(("siReadControllerStatus:  saRoot->sysIntsActive %X\n",saRoot->sysIntsActive));
15214e1bc9a0SAchim Leubner 
15224e1bc9a0SAchim Leubner     circularQ = &saRoot->outboundQueue[0];
15234e1bc9a0SAchim Leubner     OSSA_READ_LE_32(circularQ->agRoot, &circularQ->producerIdx, circularQ->piPointer, 0);
15244e1bc9a0SAchim Leubner     if(circularQ->producerIdx != circularQ->consumerIdx)
15254e1bc9a0SAchim Leubner     {
15264e1bc9a0SAchim Leubner       SA_DBG1(("siReadControllerStatus:  saRoot->sysIntsActive %X\n",saRoot->sysIntsActive));
15274e1bc9a0SAchim Leubner       SA_DBG1(("siReadControllerStatus: PI 0x%03x CI 0x%03x\n",circularQ->producerIdx, circularQ->consumerIdx));
15284e1bc9a0SAchim Leubner 
15294e1bc9a0SAchim Leubner       SA_DBG1(("siReadControllerStatus:IN MSGU_READ_ODMR %08X\n",siHalRegReadExt(agRoot, GEN_MSGU_ODMR, V_Outbound_Doorbell_Mask_Set_Register )));
15304e1bc9a0SAchim Leubner       SA_DBG1(("siReadControllerStatus:MSGU_READ_ODR  %08X\n",siHalRegReadExt(agRoot, GEN_MSGU_ODR, V_Outbound_Doorbell_Set_Register)));
15314e1bc9a0SAchim Leubner       ossaHwRegWriteExt(agRoot, PCIBAR0,V_Outbound_Doorbell_Clear_Register, 0xFFFFFFFF );
15324e1bc9a0SAchim Leubner 
15334e1bc9a0SAchim Leubner     }
15344e1bc9a0SAchim Leubner   }
15354e1bc9a0SAchim Leubner 
15364e1bc9a0SAchim Leubner   siTimerAdd(agRoot,SA_FW_TIMER_READS_STATUS_INTERVAL, siReadControllerStatus,Event,pParm  );
15374e1bc9a0SAchim Leubner 
15384e1bc9a0SAchim Leubner   return(to_ret);
15394e1bc9a0SAchim Leubner }
15404e1bc9a0SAchim Leubner 
15414e1bc9a0SAchim Leubner #endif /* SA_FW_TIMER_READS_STATUS */
15424e1bc9a0SAchim Leubner 
15434e1bc9a0SAchim Leubner /******************************************************************************/
15444e1bc9a0SAchim Leubner /*! \brief Routine to do SPC configuration with default or specified values
15454e1bc9a0SAchim Leubner  *
15464e1bc9a0SAchim Leubner  *  Set up configuration table in LL Layer
15474e1bc9a0SAchim Leubner  *
15484e1bc9a0SAchim Leubner  *  \param agRoot    handles for this instance of SAS/SATA hardware
15494e1bc9a0SAchim Leubner  *  \param mpiConfig MPI Configuration
15504e1bc9a0SAchim Leubner  *  \param swConfig  Pointer to the software configuration
15514e1bc9a0SAchim Leubner  *
15524e1bc9a0SAchim Leubner  *  \return -void-
15534e1bc9a0SAchim Leubner  */
15544e1bc9a0SAchim Leubner /*******************************************************************************/
siConfiguration(agsaRoot_t * agRoot,mpiConfig_t * mpiConfig,agsaHwConfig_t * hwConfig,agsaSwConfig_t * swConfig)15554e1bc9a0SAchim Leubner GLOBAL bit32 siConfiguration(
15564e1bc9a0SAchim Leubner   agsaRoot_t      *agRoot,
15574e1bc9a0SAchim Leubner   mpiConfig_t     *mpiConfig,
15584e1bc9a0SAchim Leubner   agsaHwConfig_t  *hwConfig,
15594e1bc9a0SAchim Leubner   agsaSwConfig_t  *swConfig
15604e1bc9a0SAchim Leubner   )
15614e1bc9a0SAchim Leubner {
15624e1bc9a0SAchim Leubner   agsaQueueConfig_t *queueConfig;
15634e1bc9a0SAchim Leubner   bit32             intOption, enable64 = 0;
15644e1bc9a0SAchim Leubner   bit8              i;
15654e1bc9a0SAchim Leubner 
15664e1bc9a0SAchim Leubner 
15674e1bc9a0SAchim Leubner   /* sanity check */
15684e1bc9a0SAchim Leubner   SA_ASSERT( (agNULL != agRoot), "");
15694e1bc9a0SAchim Leubner 
15704e1bc9a0SAchim Leubner   smTraceFuncEnter(hpDBG_VERY_LOUD,"m2");
15714e1bc9a0SAchim Leubner 
15724e1bc9a0SAchim Leubner   si_memset(mpiConfig, 0, sizeof(mpiConfig_t));
15734e1bc9a0SAchim Leubner   SA_DBG1(("siConfiguration: si_memset mpiConfig\n"));
15744e1bc9a0SAchim Leubner 
15754e1bc9a0SAchim Leubner #if defined(SALLSDK_DEBUG)
15764e1bc9a0SAchim Leubner   sidump_swConfig(swConfig);
15774e1bc9a0SAchim Leubner #endif
15784e1bc9a0SAchim Leubner   mpiConfig->mainConfig.custset                      = swConfig->FWConfig;
15794e1bc9a0SAchim Leubner 
15804e1bc9a0SAchim Leubner   SA_DBG1(("siConfiguration:custset              %8X  %8X\n",mpiConfig->mainConfig.custset,swConfig->FWConfig));
15814e1bc9a0SAchim Leubner 
15824e1bc9a0SAchim Leubner   if (swConfig->param3 == agNULL)
15834e1bc9a0SAchim Leubner   {
15844e1bc9a0SAchim Leubner     SA_DBG1(("siConfiguration: swConfig->param3 == agNULL\n"));
15854e1bc9a0SAchim Leubner     /* initialize the mpiConfig */
15864e1bc9a0SAchim Leubner     /* We configure the Host main part of configuration table */
15874e1bc9a0SAchim Leubner     mpiConfig->mainConfig.iQNPPD_HPPD_GEvent          = 0;
15884e1bc9a0SAchim Leubner     mpiConfig->mainConfig.outboundHWEventPID0_3       = 0;
15894e1bc9a0SAchim Leubner     mpiConfig->mainConfig.outboundHWEventPID4_7       = 0;
15904e1bc9a0SAchim Leubner     mpiConfig->mainConfig.outboundNCQEventPID0_3      = 0;
15914e1bc9a0SAchim Leubner     mpiConfig->mainConfig.outboundNCQEventPID4_7      = 0;
15924e1bc9a0SAchim Leubner     mpiConfig->mainConfig.outboundTargetITNexusEventPID0_3 = 0;
15934e1bc9a0SAchim Leubner     mpiConfig->mainConfig.outboundTargetITNexusEventPID4_7 = 0;
15944e1bc9a0SAchim Leubner     mpiConfig->mainConfig.outboundTargetSSPEventPID0_3 = 0;
15954e1bc9a0SAchim Leubner     mpiConfig->mainConfig.outboundTargetSSPEventPID4_7 = 0;
15964e1bc9a0SAchim Leubner 
15974e1bc9a0SAchim Leubner     mpiConfig->mainConfig.ioAbortDelay                    = 0;
15984e1bc9a0SAchim Leubner 
15994e1bc9a0SAchim Leubner     mpiConfig->mainConfig.upperEventLogAddress        = 0;
16004e1bc9a0SAchim Leubner     mpiConfig->mainConfig.lowerEventLogAddress        = 0;
16014e1bc9a0SAchim Leubner     mpiConfig->mainConfig.eventLogSize                = MPI_LOGSIZE;
16024e1bc9a0SAchim Leubner     mpiConfig->mainConfig.eventLogOption              = 0;
16034e1bc9a0SAchim Leubner     mpiConfig->mainConfig.upperIOPeventLogAddress     = 0;
16044e1bc9a0SAchim Leubner     mpiConfig->mainConfig.lowerIOPeventLogAddress     = 0;
16054e1bc9a0SAchim Leubner     mpiConfig->mainConfig.IOPeventLogSize             = MPI_LOGSIZE;
16064e1bc9a0SAchim Leubner     mpiConfig->mainConfig.IOPeventLogOption           = 0;
16074e1bc9a0SAchim Leubner     mpiConfig->mainConfig.FatalErrorInterrupt         = 0;
16084e1bc9a0SAchim Leubner 
16094e1bc9a0SAchim Leubner     /* save the default value */
16104e1bc9a0SAchim Leubner     mpiConfig->numInboundQueues = AGSA_MAX_INBOUND_Q;
16114e1bc9a0SAchim Leubner     mpiConfig->numOutboundQueues = AGSA_MAX_OUTBOUND_Q;
16124e1bc9a0SAchim Leubner     mpiConfig->maxNumInboundQueues = AGSA_MAX_INBOUND_Q;
16134e1bc9a0SAchim Leubner     mpiConfig->maxNumOutboundQueues = AGSA_MAX_OUTBOUND_Q;
16144e1bc9a0SAchim Leubner 
16154e1bc9a0SAchim Leubner     /* configure inbound queues */
16164e1bc9a0SAchim Leubner     for ( i = 0; i < AGSA_MAX_INBOUND_Q; i ++ )
16174e1bc9a0SAchim Leubner     {
16184e1bc9a0SAchim Leubner       mpiConfig->inboundQueues[i].numElements   = INBOUND_DEPTH_SIZE;
16194e1bc9a0SAchim Leubner       mpiConfig->inboundQueues[i].elementSize   = IOMB_SIZE64;
16204e1bc9a0SAchim Leubner       mpiConfig->inboundQueues[i].priority      = MPI_QUEUE_NORMAL;
16214e1bc9a0SAchim Leubner     }
16224e1bc9a0SAchim Leubner 
16234e1bc9a0SAchim Leubner     /* configure outbound queues */
16244e1bc9a0SAchim Leubner     for ( i = 0; i < AGSA_MAX_OUTBOUND_Q; i ++ )
16254e1bc9a0SAchim Leubner     {
16264e1bc9a0SAchim Leubner       mpiConfig->outboundQueues[i].numElements        = OUTBOUND_DEPTH_SIZE;
16274e1bc9a0SAchim Leubner       mpiConfig->outboundQueues[i].elementSize        = IOMB_SIZE64;
16284e1bc9a0SAchim Leubner       mpiConfig->outboundQueues[i].interruptVector    = 0;
16294e1bc9a0SAchim Leubner       mpiConfig->outboundQueues[i].interruptDelay     = 0;
16304e1bc9a0SAchim Leubner       mpiConfig->outboundQueues[i].interruptThreshold = 0;
16314e1bc9a0SAchim Leubner       /* always enable OQ interrupt */
16324e1bc9a0SAchim Leubner       mpiConfig->outboundQueues[i].interruptEnable    = 1;
16334e1bc9a0SAchim Leubner     }
16344e1bc9a0SAchim Leubner   }
16354e1bc9a0SAchim Leubner   else
16364e1bc9a0SAchim Leubner   { /* Parm3 is not null  */
16374e1bc9a0SAchim Leubner     queueConfig = (agsaQueueConfig_t *)swConfig->param3;
16384e1bc9a0SAchim Leubner 
16394e1bc9a0SAchim Leubner #if defined(SALLSDK_DEBUG)
16404e1bc9a0SAchim Leubner     sidump_Q_config( queueConfig );
16414e1bc9a0SAchim Leubner #endif
16424e1bc9a0SAchim Leubner 
16434e1bc9a0SAchim Leubner     SA_DBG1(("siConfiguration: swConfig->param3 == %p\n",queueConfig));
16444e1bc9a0SAchim Leubner 
16454e1bc9a0SAchim Leubner     if ((queueConfig->numInboundQueues > AGSA_MAX_INBOUND_Q) ||
16464e1bc9a0SAchim Leubner       (queueConfig->numOutboundQueues > AGSA_MAX_OUTBOUND_Q))
16474e1bc9a0SAchim Leubner     {
16484e1bc9a0SAchim Leubner       smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "m2");
16494e1bc9a0SAchim Leubner       SA_DBG1(("siConfiguration:AGSA_RC_FAILURE MAX_Q\n"));
16504e1bc9a0SAchim Leubner 
16514e1bc9a0SAchim Leubner       return AGSA_RC_FAILURE;
16524e1bc9a0SAchim Leubner     }
16534e1bc9a0SAchim Leubner 
16544e1bc9a0SAchim Leubner     if ((queueConfig->numInboundQueues  == 0 ||
16554e1bc9a0SAchim Leubner          queueConfig->numOutboundQueues == 0    ))
16564e1bc9a0SAchim Leubner     {
16574e1bc9a0SAchim Leubner       smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "m2");
16584e1bc9a0SAchim Leubner       SA_DBG1(("siConfiguration:AGSA_RC_FAILURE NO_Q\n"));
16594e1bc9a0SAchim Leubner       return AGSA_RC_FAILURE;
16604e1bc9a0SAchim Leubner     }
16614e1bc9a0SAchim Leubner     mpiConfig->mainConfig.eventLogSize = swConfig->sizefEventLog1 * KBYTES;
16624e1bc9a0SAchim Leubner     mpiConfig->mainConfig.eventLogOption  = swConfig->eventLog1Option;
16634e1bc9a0SAchim Leubner     mpiConfig->mainConfig.IOPeventLogSize = swConfig->sizefEventLog2 * KBYTES;
16644e1bc9a0SAchim Leubner     mpiConfig->mainConfig.IOPeventLogOption = swConfig->eventLog2Option;
16654e1bc9a0SAchim Leubner 
16664e1bc9a0SAchim Leubner     if ((queueConfig->numInboundQueues > IQ_NUM_32) || (queueConfig->numOutboundQueues > OQ_NUM_32))
16674e1bc9a0SAchim Leubner     {
16684e1bc9a0SAchim Leubner       enable64 = 1;
16694e1bc9a0SAchim Leubner     }
16704e1bc9a0SAchim Leubner 
16714e1bc9a0SAchim Leubner     if (agNULL == hwConfig)
16724e1bc9a0SAchim Leubner     {
16734e1bc9a0SAchim Leubner       intOption = 0;
16744e1bc9a0SAchim Leubner     }
16754e1bc9a0SAchim Leubner     else
16764e1bc9a0SAchim Leubner     {
16774e1bc9a0SAchim Leubner 
16784e1bc9a0SAchim Leubner #if defined(SALLSDK_DEBUG)
16794e1bc9a0SAchim Leubner       sidump_hwConfig(hwConfig);
16804e1bc9a0SAchim Leubner #endif
16814e1bc9a0SAchim Leubner 
16824e1bc9a0SAchim Leubner 
16834e1bc9a0SAchim Leubner       if(smIS_SPCV(agRoot))
16844e1bc9a0SAchim Leubner       {
16854e1bc9a0SAchim Leubner         intOption = 0;
16864e1bc9a0SAchim Leubner       }
16874e1bc9a0SAchim Leubner       else
16884e1bc9a0SAchim Leubner       {
16894e1bc9a0SAchim Leubner         intOption = hwConfig->intReassertionOption & INT_OPTION;
16904e1bc9a0SAchim Leubner       }
16914e1bc9a0SAchim Leubner 
16924e1bc9a0SAchim Leubner     }
16934e1bc9a0SAchim Leubner 
16944e1bc9a0SAchim Leubner     /* Enable SGPIO */
16954e1bc9a0SAchim Leubner     swConfig->sgpioSupportEnable = 1;
16964e1bc9a0SAchim Leubner 
16974e1bc9a0SAchim Leubner     /* set bit for normal priority or high priority path */
16984e1bc9a0SAchim Leubner     /* set fatal error interrupt enable and vector */
16994e1bc9a0SAchim Leubner     /* set Interrupt Reassertion enable and 64 IQ/OQ enable */
17004e1bc9a0SAchim Leubner     mpiConfig->mainConfig.FatalErrorInterrupt =
17014e1bc9a0SAchim Leubner                                  (swConfig->fatalErrorInterruptEnable)                       /* bit 0*/     |
17024e1bc9a0SAchim Leubner          (hwConfig == agNULL ? 0: (hwConfig->hwOption & HW_CFG_PICI_EFFECTIVE_ADDRESS ? (0x1 << SHIFT1): 0))|
17034e1bc9a0SAchim Leubner                                      (swConfig->sgpioSupportEnable                    ? (0x1 << SHIFT2): 0) |
17044e1bc9a0SAchim Leubner     /* compile option SA_ENABLE_POISION_TLP */(SA_PTNFE_POISION_TLP                          << SHIFT3)     |
17054e1bc9a0SAchim Leubner #ifdef SA_CONFIG_MDFD_REGISTRY
17064e1bc9a0SAchim Leubner                                             (swConfig->disableMDF                     ? (0x1 << SHIFT4): 0) |
17074e1bc9a0SAchim Leubner #else
17084e1bc9a0SAchim Leubner     /* compile option SA_DISABLE_MDFD       */   (SA_MDFD_MULTI_DATA_FETCH                      << SHIFT4)  |
17094e1bc9a0SAchim Leubner #endif /*SA_CONFIG_MDFD_REGISTRY*/
17104e1bc9a0SAchim Leubner     /* compile option SA_DISABLE_OB_COAL    */(SA_OUTBOUND_COALESCE                          << SHIFT5)     |
17114e1bc9a0SAchim Leubner     /* compile option SA_ENABLE_ARBTE       */(SA_ARBTE                                      << SHIFT6)     |
17124e1bc9a0SAchim Leubner                                ((swConfig->fatalErrorInterruptVector & FATAL_ERROR_INT_BITS) << SHIFT8)     |
17134e1bc9a0SAchim Leubner                                               (enable64                                      << SHIFT16)    |
17144e1bc9a0SAchim Leubner                                               (intOption                                     << SHIFT17);
17154e1bc9a0SAchim Leubner 
17164e1bc9a0SAchim Leubner 
17174e1bc9a0SAchim Leubner     SA_DBG1(("siConfiguration: swConfig->fatalErrorInterruptEnable  %X\n",swConfig->fatalErrorInterruptEnable));
17184e1bc9a0SAchim Leubner     SA_DBG1(("siConfiguration: swConfig->fatalErrorInterruptVector  %X\n",swConfig->fatalErrorInterruptVector));
17194e1bc9a0SAchim Leubner 
17204e1bc9a0SAchim Leubner 
17214e1bc9a0SAchim Leubner 
17224e1bc9a0SAchim Leubner     /* initialize the mpiConfig */
17234e1bc9a0SAchim Leubner     /* We configure the Host main part of configuration table */
17244e1bc9a0SAchim Leubner     mpiConfig->mainConfig.outboundTargetITNexusEventPID0_3 = 0;
17254e1bc9a0SAchim Leubner     mpiConfig->mainConfig.outboundTargetITNexusEventPID4_7 = 0;
17264e1bc9a0SAchim Leubner     mpiConfig->mainConfig.outboundTargetSSPEventPID0_3 = 0;
17274e1bc9a0SAchim Leubner     mpiConfig->mainConfig.outboundTargetSSPEventPID4_7 = 0;
17284e1bc9a0SAchim Leubner     mpiConfig->mainConfig.ioAbortDelay = 0;
17294e1bc9a0SAchim Leubner     mpiConfig->mainConfig.PortRecoveryTimerPortResetTimer = swConfig->PortRecoveryResetTimer;
17304e1bc9a0SAchim Leubner 
17314e1bc9a0SAchim Leubner     /* get parameter from queueConfig */
17324e1bc9a0SAchim Leubner     mpiConfig->mainConfig.iQNPPD_HPPD_GEvent          = queueConfig->iqNormalPriorityProcessingDepth |
17334e1bc9a0SAchim Leubner                                                         (queueConfig->iqHighPriorityProcessingDepth << SHIFT8) |
17344e1bc9a0SAchim Leubner                                                         (queueConfig->generalEventQueue << SHIFT16) |
17354e1bc9a0SAchim Leubner                                                         (queueConfig->tgtDeviceRemovedEventQueue << SHIFT24);
17364e1bc9a0SAchim Leubner 
17374e1bc9a0SAchim Leubner     mpiConfig->mainConfig.outboundHWEventPID0_3       = queueConfig->sasHwEventQueue[0] |
17384e1bc9a0SAchim Leubner                                                         (queueConfig->sasHwEventQueue[1] << SHIFT8)  |
17394e1bc9a0SAchim Leubner                                                         (queueConfig->sasHwEventQueue[2] << SHIFT16) |
17404e1bc9a0SAchim Leubner                                                         (queueConfig->sasHwEventQueue[3] << SHIFT24);
17414e1bc9a0SAchim Leubner     mpiConfig->mainConfig.outboundHWEventPID4_7       = queueConfig->sasHwEventQueue[4] |
17424e1bc9a0SAchim Leubner                                                         (queueConfig->sasHwEventQueue[5] << SHIFT8)  |
17434e1bc9a0SAchim Leubner                                                         (queueConfig->sasHwEventQueue[6] << SHIFT16) |
17444e1bc9a0SAchim Leubner                                                         (queueConfig->sasHwEventQueue[7] << SHIFT24);
17454e1bc9a0SAchim Leubner     mpiConfig->mainConfig.outboundNCQEventPID0_3      = queueConfig->sataNCQErrorEventQueue[0] |
17464e1bc9a0SAchim Leubner                                                         (queueConfig->sataNCQErrorEventQueue[1] << SHIFT8)  |
17474e1bc9a0SAchim Leubner                                                         (queueConfig->sataNCQErrorEventQueue[2] << SHIFT16) |
17484e1bc9a0SAchim Leubner                                                         (queueConfig->sataNCQErrorEventQueue[3] << SHIFT24);
17494e1bc9a0SAchim Leubner     mpiConfig->mainConfig.outboundNCQEventPID4_7      = queueConfig->sataNCQErrorEventQueue[4] |
17504e1bc9a0SAchim Leubner                                                         (queueConfig->sataNCQErrorEventQueue[5] << SHIFT8)  |
17514e1bc9a0SAchim Leubner                                                         (queueConfig->sataNCQErrorEventQueue[6] << SHIFT16) |
17524e1bc9a0SAchim Leubner                                                         (queueConfig->sataNCQErrorEventQueue[7] << SHIFT24);
17534e1bc9a0SAchim Leubner     /* save it */
17544e1bc9a0SAchim Leubner     mpiConfig->numInboundQueues = queueConfig->numInboundQueues;
17554e1bc9a0SAchim Leubner     mpiConfig->numOutboundQueues = queueConfig->numOutboundQueues;
17564e1bc9a0SAchim Leubner     mpiConfig->queueOption = queueConfig->queueOption;
17574e1bc9a0SAchim Leubner 
17584e1bc9a0SAchim Leubner     SA_DBG2(("siConfiguration: numInboundQueues=%d numOutboundQueues=%d\n",
17594e1bc9a0SAchim Leubner     queueConfig->numInboundQueues,
17604e1bc9a0SAchim Leubner     queueConfig->numOutboundQueues));
17614e1bc9a0SAchim Leubner 
17624e1bc9a0SAchim Leubner     /* configure inbound queues */
17634e1bc9a0SAchim Leubner     /* We configure the size of queue based on swConfig */
17644e1bc9a0SAchim Leubner     for( i = 0; i < queueConfig->numInboundQueues; i ++ )
17654e1bc9a0SAchim Leubner     {
17664e1bc9a0SAchim Leubner       mpiConfig->inboundQueues[i].numElements   = (bit16)queueConfig->inboundQueues[i].elementCount;
1767aeb665b5SEd Maste       mpiConfig->inboundQueues[i].elementSize   = (bit16)queueConfig->inboundQueues[i].elementSize;
17684e1bc9a0SAchim Leubner       mpiConfig->inboundQueues[i].priority      = queueConfig->inboundQueues[i].priority;
17694e1bc9a0SAchim Leubner 
17704e1bc9a0SAchim Leubner       SA_DBG2(("siConfiguration: IBQ%d:elementCount=%d elementSize=%d priority=%d Total Size 0x%X\n",
17714e1bc9a0SAchim Leubner       i,
17724e1bc9a0SAchim Leubner       queueConfig->inboundQueues[i].elementCount,
17734e1bc9a0SAchim Leubner       queueConfig->inboundQueues[i].elementSize,
17744e1bc9a0SAchim Leubner       queueConfig->inboundQueues[i].priority,
17754e1bc9a0SAchim Leubner       queueConfig->inboundQueues[i].elementCount * queueConfig->inboundQueues[i].elementSize ));
17764e1bc9a0SAchim Leubner     }
17774e1bc9a0SAchim Leubner 
17784e1bc9a0SAchim Leubner     /* configura outbound queues */
17794e1bc9a0SAchim Leubner     /* We configure the size of queue based on swConfig */
17804e1bc9a0SAchim Leubner     for( i = 0; i < queueConfig->numOutboundQueues; i ++ )
17814e1bc9a0SAchim Leubner     {
17824e1bc9a0SAchim Leubner       mpiConfig->outboundQueues[i].numElements        = (bit16)queueConfig->outboundQueues[i].elementCount;
17834e1bc9a0SAchim Leubner       mpiConfig->outboundQueues[i].elementSize        = (bit16)queueConfig->outboundQueues[i].elementSize;
17844e1bc9a0SAchim Leubner       mpiConfig->outboundQueues[i].interruptVector    = (bit8)queueConfig->outboundQueues[i].interruptVectorIndex;
17854e1bc9a0SAchim Leubner       mpiConfig->outboundQueues[i].interruptDelay     = (bit16)queueConfig->outboundQueues[i].interruptDelay;
17864e1bc9a0SAchim Leubner       mpiConfig->outboundQueues[i].interruptThreshold = (bit8)queueConfig->outboundQueues[i].interruptCount;
17874e1bc9a0SAchim Leubner       mpiConfig->outboundQueues[i].interruptEnable    = (bit32)queueConfig->outboundQueues[i].interruptEnable;
17884e1bc9a0SAchim Leubner 
17894e1bc9a0SAchim Leubner       SA_DBG2(("siConfiguration: OBQ%d:elementCount=%d elementSize=%d interruptCount=%d interruptEnable=%d\n",
17904e1bc9a0SAchim Leubner       i,
17914e1bc9a0SAchim Leubner       queueConfig->outboundQueues[i].elementCount,
17924e1bc9a0SAchim Leubner       queueConfig->outboundQueues[i].elementSize,
17934e1bc9a0SAchim Leubner       queueConfig->outboundQueues[i].interruptCount,
17944e1bc9a0SAchim Leubner       queueConfig->outboundQueues[i].interruptEnable));
17954e1bc9a0SAchim Leubner     }
17964e1bc9a0SAchim Leubner   }
17974e1bc9a0SAchim Leubner 
17984e1bc9a0SAchim Leubner   SA_DBG1(("siConfiguration:mpiConfig->mainConfig.FatalErrorInterrupt 0x%X\n",mpiConfig->mainConfig.FatalErrorInterrupt));
17994e1bc9a0SAchim Leubner   SA_DBG1(("siConfiguration:swConfig->fatalErrorInterruptVector       0x%X\n",swConfig->fatalErrorInterruptVector));
18004e1bc9a0SAchim Leubner   SA_DBG1(("siConfiguration:enable64                                  0x%X\n",enable64));
18014e1bc9a0SAchim Leubner   SA_DBG1(("siConfiguration:PortRecoveryResetTimer                    0x%X\n",swConfig->PortRecoveryResetTimer));
18024e1bc9a0SAchim Leubner 
18034e1bc9a0SAchim Leubner   smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "m2");
18044e1bc9a0SAchim Leubner 
18054e1bc9a0SAchim Leubner   /* return */
18064e1bc9a0SAchim Leubner   return AGSA_RC_SUCCESS;
18074e1bc9a0SAchim Leubner }
18084e1bc9a0SAchim Leubner 
18094e1bc9a0SAchim Leubner #ifdef FW_EVT_LOG_TST
saLogDump(agsaRoot_t * agRoot,U32 * eventLogSize,U32 ** eventLogAddress_)18104e1bc9a0SAchim Leubner void saLogDump(agsaRoot_t *agRoot,
18114e1bc9a0SAchim Leubner                U32    *eventLogSize,
18124e1bc9a0SAchim Leubner                U32   **eventLogAddress_)
18134e1bc9a0SAchim Leubner {
18144e1bc9a0SAchim Leubner   agsaLLRoot_t *saRoot =  (agsaLLRoot_t *)(agRoot->sdkData);
18154e1bc9a0SAchim Leubner   //mpiConfig_t  *mpiConfig = &saRoot->mpiConfig;
18164e1bc9a0SAchim Leubner   mpiHostLLConfigDescriptor_t *mpiConfig = &saRoot->mainConfigTable;
18174e1bc9a0SAchim Leubner 
18184e1bc9a0SAchim Leubner   *eventLogAddress_ = (U32*)eventLogAddress;
18194e1bc9a0SAchim Leubner   *eventLogSize = (U32)mpiConfig->eventLogSize;
18204e1bc9a0SAchim Leubner }
18214e1bc9a0SAchim Leubner #endif
18224e1bc9a0SAchim Leubner 
18234e1bc9a0SAchim Leubner /*******************************************************************************/
18244e1bc9a0SAchim Leubner /** \fn mpiInitialize(agsaRoot *agRoot, mpiMemReq_t* memoryAllocated, mpiConfig_t* config)
18254e1bc9a0SAchim Leubner  *  \brief Initializes the MPI Message Unit
18264e1bc9a0SAchim Leubner  *  \param agRoot           Pointer to a data structure containing LL layer context handles
18274e1bc9a0SAchim Leubner  *  \param memoryAllocated  Data structure that holds the different chunks of memory that are allocated
18284e1bc9a0SAchim Leubner  *  \param config           MPI configuration
18294e1bc9a0SAchim Leubner  *
18304e1bc9a0SAchim Leubner  * This function is called to initialize SPC_HOST_MPI internal data structures and the SPC hardware.
18314e1bc9a0SAchim Leubner  * This function is competed synch->ronously (there is no callback)
18324e1bc9a0SAchim Leubner  *
18334e1bc9a0SAchim Leubner  * Return:
18344e1bc9a0SAchim Leubner  *         AGSA_RC_SUCCESS if initialization succeeded.
18354e1bc9a0SAchim Leubner  *         AGSA_RC_FAILURE if initialization failed.
18364e1bc9a0SAchim Leubner  */
18374e1bc9a0SAchim Leubner /*******************************************************************************/
mpiInitialize(agsaRoot_t * agRoot,mpiMemReq_t * memoryAllocated,mpiConfig_t * config)18384e1bc9a0SAchim Leubner GLOBAL bit32 mpiInitialize(agsaRoot_t *agRoot,
18394e1bc9a0SAchim Leubner                            mpiMemReq_t* memoryAllocated,
18404e1bc9a0SAchim Leubner                            mpiConfig_t* config)
18414e1bc9a0SAchim Leubner {
18424e1bc9a0SAchim Leubner   static spc_configMainDescriptor_t mainCfg;              /* main part of MPI configuration */
18434e1bc9a0SAchim Leubner   static spc_inboundQueueDescriptor_t inQueueCfg;         /* Inbound queue HW configuration structure */
18444e1bc9a0SAchim Leubner   static spc_outboundQueueDescriptor_t outQueueCfg;       /* Outbound queue HW configuration structure */
18454e1bc9a0SAchim Leubner   bit16 qIdx, i, indexoffset;                      /* Queue index */
18464e1bc9a0SAchim Leubner   bit16 mIdx = 0;                                  /* Memory region index */
18474e1bc9a0SAchim Leubner   bit32 MSGUCfgTblDWIdx, GSTLenMPIS;
18484e1bc9a0SAchim Leubner   bit32 MSGUCfgTblBase, ret = AGSA_RC_SUCCESS;
18494e1bc9a0SAchim Leubner   bit32 value, togglevalue;
18504e1bc9a0SAchim Leubner   bit32 saveOffset;
18514e1bc9a0SAchim Leubner   bit32 inboundoffset, outboundoffset;
18524e1bc9a0SAchim Leubner   bit8  pcibar;
18534e1bc9a0SAchim Leubner   bit16 maxinbound = AGSA_MAX_INBOUND_Q;
18544e1bc9a0SAchim Leubner   bit16 maxoutbound = AGSA_MAX_OUTBOUND_Q;
18554e1bc9a0SAchim Leubner   bit32 OB_CIPCIBar;
18564e1bc9a0SAchim Leubner   bit32 IB_PIPCIBar;
18574e1bc9a0SAchim Leubner   bit32 max_wait_time;
18584e1bc9a0SAchim Leubner   bit32 max_wait_count;
18594e1bc9a0SAchim Leubner   bit32 memOffset;
18604e1bc9a0SAchim Leubner   agsaLLRoot_t *saRoot;
18614e1bc9a0SAchim Leubner   mpiICQueue_t *circularIQ = agNULL;
18624e1bc9a0SAchim Leubner   mpiOCQueue_t *circularOQ;
18634e1bc9a0SAchim Leubner 
18644e1bc9a0SAchim Leubner   bit32 mpiUnInitFailed = 0;
18654e1bc9a0SAchim Leubner   bit32 mpiStartToggleFailed = 0;
18664e1bc9a0SAchim Leubner 
18674e1bc9a0SAchim Leubner 
18684e1bc9a0SAchim Leubner #if defined(SALLSDK_DEBUG)
18694e1bc9a0SAchim Leubner  bit8 phycount = AGSA_MAX_VALID_PHYS;
18704e1bc9a0SAchim Leubner #endif /* SALLSDK_DEBUG */
18714e1bc9a0SAchim Leubner 
18724e1bc9a0SAchim Leubner   SA_DBG1(("mpiInitialize: Entering\n"));
18734e1bc9a0SAchim Leubner   SA_ASSERT(NULL != agRoot, "agRoot argument cannot be null");
18744e1bc9a0SAchim Leubner   SA_ASSERT(NULL != memoryAllocated, "memoryAllocated argument cannot be null");
18754e1bc9a0SAchim Leubner   SA_ASSERT(NULL != config, "config argument cannot be null");
18764e1bc9a0SAchim Leubner   SA_ASSERT(0 == (sizeof(spc_inboundQueueDescriptor_t) % 4), "spc_inboundQueueDescriptor_t type size has to be divisible by 4");
18774e1bc9a0SAchim Leubner 
18784e1bc9a0SAchim Leubner   saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
18794e1bc9a0SAchim Leubner 
18804e1bc9a0SAchim Leubner   si_memset(&mainCfg,0,sizeof(spc_configMainDescriptor_t));
18814e1bc9a0SAchim Leubner   si_memset(&inQueueCfg,0,sizeof(spc_inboundQueueDescriptor_t));
18824e1bc9a0SAchim Leubner   si_memset(&outQueueCfg,0,sizeof(spc_outboundQueueDescriptor_t));
18834e1bc9a0SAchim Leubner 
18844e1bc9a0SAchim Leubner   SA_ASSERT((agNULL !=saRoot ), "");
18854e1bc9a0SAchim Leubner   if(saRoot == agNULL)
18864e1bc9a0SAchim Leubner   {
18874e1bc9a0SAchim Leubner     SA_DBG1(("mpiInitialize: saRoot == agNULL\n"));
18884e1bc9a0SAchim Leubner     return(AGSA_RC_FAILURE);
18894e1bc9a0SAchim Leubner   }
18904e1bc9a0SAchim Leubner   smTraceFuncEnter(hpDBG_VERY_LOUD,"m3");
18914e1bc9a0SAchim Leubner 
18924e1bc9a0SAchim Leubner   /*Shift BAR 4 for SPC HAILEAH*/
18934e1bc9a0SAchim Leubner   if(smIS_SPC(agRoot))
18944e1bc9a0SAchim Leubner   {
18954e1bc9a0SAchim Leubner     if( smIS_HIL(agRoot))
18964e1bc9a0SAchim Leubner     {
18974e1bc9a0SAchim Leubner       if (AGSA_RC_FAILURE == siBar4Shift(agRoot, MBIC_GSM_SM_BASE))
18984e1bc9a0SAchim Leubner       {
18994e1bc9a0SAchim Leubner         SA_DBG1(("mpiInitialize: siBar4Shift FAILED ******************************************\n"));
19004e1bc9a0SAchim Leubner         return AGSA_RC_FAILURE;
19014e1bc9a0SAchim Leubner       }
19024e1bc9a0SAchim Leubner     }
19034e1bc9a0SAchim Leubner   }
19044e1bc9a0SAchim Leubner 
19054e1bc9a0SAchim Leubner   /* Wait for the SPC Configuration Table to be ready */
19064e1bc9a0SAchim Leubner   ret = mpiWaitForConfigTable(agRoot, &mainCfg);
19074e1bc9a0SAchim Leubner   if (AGSA_RC_FAILURE == ret)
19084e1bc9a0SAchim Leubner   {
19094e1bc9a0SAchim Leubner     /* return error if MPI Configuration Table not ready */
19104e1bc9a0SAchim Leubner     SA_DBG1(("mpiInitialize: mpiWaitForConfigTable FAILED ******************************************\n"));
19114e1bc9a0SAchim Leubner     smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "m3");
19124e1bc9a0SAchim Leubner     return ret;
19134e1bc9a0SAchim Leubner   }
19144e1bc9a0SAchim Leubner 
19154e1bc9a0SAchim Leubner   /* read scratch pad0 to get PCI BAR and offset of configuration table */
19164e1bc9a0SAchim Leubner   MSGUCfgTblBase = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_0,MSGU_SCRATCH_PAD_0);
19174e1bc9a0SAchim Leubner   /* get PCI BAR */
19184e1bc9a0SAchim Leubner   MSGUCfgTblBase = (MSGUCfgTblBase & SCRATCH_PAD0_BAR_MASK) >> SHIFT26;
19194e1bc9a0SAchim Leubner   /* get pci Bar index */
19204e1bc9a0SAchim Leubner   pcibar = (bit8)mpiGetPCIBarIndex(agRoot, MSGUCfgTblBase);
19214e1bc9a0SAchim Leubner 
19224e1bc9a0SAchim Leubner   SA_DBG1(("mpiInitialize: MSGUCfgTblBase = 0x%x\n", MSGUCfgTblBase));
19234e1bc9a0SAchim Leubner #if defined(SALLSDK_DEBUG)
19244e1bc9a0SAchim Leubner   /* get Phy count from configuration table */
19254e1bc9a0SAchim Leubner   phycount = (bit8)((mainCfg.ContrlCapFlag & PHY_COUNT_BITS) >> SHIFT19);
19264e1bc9a0SAchim Leubner 
19274e1bc9a0SAchim Leubner   SA_DBG1(("mpiInitialize: Number of PHYs = 0x%x\n", phycount));
19284e1bc9a0SAchim Leubner 
19294e1bc9a0SAchim Leubner   smTrace(hpDBG_VERY_LOUD,"70",phycount);
19304e1bc9a0SAchim Leubner   /* TP:70 phycount */
19314e1bc9a0SAchim Leubner #endif /* SALLSDK_DEBUG */
19324e1bc9a0SAchim Leubner 
19334e1bc9a0SAchim Leubner   /* get High Priority IQ support flag */
19344e1bc9a0SAchim Leubner   if (mainCfg.ContrlCapFlag & HP_SUPPORT_BIT)
19354e1bc9a0SAchim Leubner   {
19364e1bc9a0SAchim Leubner     SA_DBG1(("mpiInitialize: High Priority IQ support from SPC\n"));
19374e1bc9a0SAchim Leubner   }
19384e1bc9a0SAchim Leubner   /* get Interrupt Coalescing Support flag */
19394e1bc9a0SAchim Leubner   if (mainCfg.ContrlCapFlag & INT_COL_BIT)
19404e1bc9a0SAchim Leubner   {
19414e1bc9a0SAchim Leubner     SA_DBG1(("mpiInitialize: Interrupt Coalescing support from SPC\n"));
19424e1bc9a0SAchim Leubner   }
19434e1bc9a0SAchim Leubner 
19444e1bc9a0SAchim Leubner   /* get configured the number of inbound/outbound queues */
19454e1bc9a0SAchim Leubner   if (memoryAllocated->count == TOTAL_MPI_MEM_CHUNKS)
19464e1bc9a0SAchim Leubner   {
19474e1bc9a0SAchim Leubner     config->maxNumInboundQueues  = AGSA_MAX_INBOUND_Q;
19484e1bc9a0SAchim Leubner     config->maxNumOutboundQueues = AGSA_MAX_OUTBOUND_Q;
19494e1bc9a0SAchim Leubner   }
19504e1bc9a0SAchim Leubner   else
19514e1bc9a0SAchim Leubner   {
19524e1bc9a0SAchim Leubner     config->maxNumInboundQueues  = config->numInboundQueues;
19534e1bc9a0SAchim Leubner     config->maxNumOutboundQueues = config->numOutboundQueues;
19544e1bc9a0SAchim Leubner     maxinbound  = config->numInboundQueues;
19554e1bc9a0SAchim Leubner     maxoutbound = config->numOutboundQueues;
19564e1bc9a0SAchim Leubner   }
19574e1bc9a0SAchim Leubner 
19584e1bc9a0SAchim Leubner   SA_DBG1(("mpiInitialize: Number of IQ %d\n", maxinbound));
19594e1bc9a0SAchim Leubner   SA_DBG1(("mpiInitialize: Number of OQ %d\n", maxoutbound));
19604e1bc9a0SAchim Leubner 
19614e1bc9a0SAchim Leubner   /* get inbound queue offset */
19624e1bc9a0SAchim Leubner   inboundoffset = mainCfg.inboundQueueOffset;
19634e1bc9a0SAchim Leubner   /* get outbound queue offset */
19644e1bc9a0SAchim Leubner   outboundoffset = mainCfg.outboundQueueOffset;
19654e1bc9a0SAchim Leubner 
19664e1bc9a0SAchim Leubner   if(smIS_SPCV(agRoot))
19674e1bc9a0SAchim Leubner   {
19684e1bc9a0SAchim Leubner     SA_DBG2(("mpiInitialize: Offset of IQ %d\n", (inboundoffset & 0xFF000000) >> 24));
19694e1bc9a0SAchim Leubner     SA_DBG2(("mpiInitialize: Offset of OQ %d\n", (outboundoffset & 0xFF000000) >> 24));
19704e1bc9a0SAchim Leubner     inboundoffset &= 0x00FFFFFF;
19714e1bc9a0SAchim Leubner     outboundoffset &= 0x00FFFFFF;
19724e1bc9a0SAchim Leubner   }
19734e1bc9a0SAchim Leubner   /* get offset of the configuration table */
19744e1bc9a0SAchim Leubner   MSGUCfgTblDWIdx = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_0,MSGU_SCRATCH_PAD_0);
19754e1bc9a0SAchim Leubner   MSGUCfgTblDWIdx = MSGUCfgTblDWIdx & SCRATCH_PAD0_OFFSET_MASK;
19764e1bc9a0SAchim Leubner 
19774e1bc9a0SAchim Leubner   saveOffset = MSGUCfgTblDWIdx;
19784e1bc9a0SAchim Leubner 
19794e1bc9a0SAchim Leubner   /* Checks if the configuration memory region size is the same as the mpiConfigMain */
19804e1bc9a0SAchim Leubner   if(memoryAllocated->region[mIdx].totalLength != sizeof(bit8) * config->mainConfig.eventLogSize)
19814e1bc9a0SAchim Leubner   {
19824e1bc9a0SAchim Leubner     SA_DBG1(("ERROR: The memory region [%d] 0x%X != 0x%X does not have the size of the MSGU event log ******************************************\n",
19834e1bc9a0SAchim Leubner       mIdx,memoryAllocated->region[mIdx].totalLength,config->mainConfig.eventLogSize));
19844e1bc9a0SAchim Leubner     smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "m3");
19854e1bc9a0SAchim Leubner     return AGSA_RC_FAILURE;
19864e1bc9a0SAchim Leubner   }
19874e1bc9a0SAchim Leubner 
19884e1bc9a0SAchim Leubner   mainCfg.iQNPPD_HPPD_GEvent               = config->mainConfig.iQNPPD_HPPD_GEvent;
19894e1bc9a0SAchim Leubner 
19904e1bc9a0SAchim Leubner   if(smIS_SPCV(agRoot))
19914e1bc9a0SAchim Leubner   {
19924e1bc9a0SAchim Leubner     mainCfg.outboundHWEventPID0_3            = 0;
19934e1bc9a0SAchim Leubner     mainCfg.outboundHWEventPID4_7            = 0;
19944e1bc9a0SAchim Leubner     mainCfg.outboundNCQEventPID0_3           = 0;
19954e1bc9a0SAchim Leubner     mainCfg.outboundNCQEventPID4_7           = 0;
19964e1bc9a0SAchim Leubner     mainCfg.outboundTargetITNexusEventPID0_3 = 0;
19974e1bc9a0SAchim Leubner     mainCfg.outboundTargetITNexusEventPID4_7 = 0;
19984e1bc9a0SAchim Leubner     mainCfg.outboundTargetSSPEventPID0_3     = 0;
19994e1bc9a0SAchim Leubner     mainCfg.outboundTargetSSPEventPID4_7     = 0;
20004e1bc9a0SAchim Leubner     mainCfg.ioAbortDelay                     = 0;  /* SPCV reserved */
20014e1bc9a0SAchim Leubner     mainCfg.custset                          = 0;
20024e1bc9a0SAchim Leubner     mainCfg.portRecoveryResetTimer           = config->mainConfig.PortRecoveryTimerPortResetTimer;
20034e1bc9a0SAchim Leubner     SA_DBG1(("mpiInitialize:custset V                %8X\n",mainCfg.custset));
20044e1bc9a0SAchim Leubner     SA_DBG1(("mpiInitialize:portRecoveryResetTimer V %8X\n",mainCfg.portRecoveryResetTimer));
20054e1bc9a0SAchim Leubner 
20064e1bc9a0SAchim Leubner     mainCfg.interruptReassertionDelay        = saRoot->hwConfig.intReassertionOption;
20074e1bc9a0SAchim Leubner     SA_DBG1(("mpiInitialize:interruptReassertionDelay V %8X\n", mainCfg.interruptReassertionDelay));
20084e1bc9a0SAchim Leubner 
20094e1bc9a0SAchim Leubner 
20104e1bc9a0SAchim Leubner   }
20114e1bc9a0SAchim Leubner   else
20124e1bc9a0SAchim Leubner   {
20134e1bc9a0SAchim Leubner     mainCfg.outboundHWEventPID0_3            = config->mainConfig.outboundHWEventPID0_3;
20144e1bc9a0SAchim Leubner     mainCfg.outboundHWEventPID4_7            = config->mainConfig.outboundHWEventPID4_7;
20154e1bc9a0SAchim Leubner     mainCfg.outboundNCQEventPID0_3           = config->mainConfig.outboundNCQEventPID0_3;
20164e1bc9a0SAchim Leubner     mainCfg.outboundNCQEventPID4_7           = config->mainConfig.outboundNCQEventPID4_7;
20174e1bc9a0SAchim Leubner     mainCfg.outboundTargetITNexusEventPID0_3 = config->mainConfig.outboundTargetITNexusEventPID0_3;
20184e1bc9a0SAchim Leubner     mainCfg.outboundTargetITNexusEventPID4_7 = config->mainConfig.outboundTargetITNexusEventPID4_7;
20194e1bc9a0SAchim Leubner     mainCfg.outboundTargetSSPEventPID0_3     = config->mainConfig.outboundTargetSSPEventPID0_3;
20204e1bc9a0SAchim Leubner     mainCfg.outboundTargetSSPEventPID4_7     = config->mainConfig.outboundTargetSSPEventPID4_7;
20214e1bc9a0SAchim Leubner     mainCfg.ioAbortDelay                     = config->mainConfig.ioAbortDelay;
20224e1bc9a0SAchim Leubner     mainCfg.custset                          = config->mainConfig.custset;
20234e1bc9a0SAchim Leubner 
20244e1bc9a0SAchim Leubner     SA_DBG1(("mpiInitialize:custset spc     %8X\n",mainCfg.custset));
20254e1bc9a0SAchim Leubner 
20264e1bc9a0SAchim Leubner   }
20274e1bc9a0SAchim Leubner #ifdef FW_EVT_LOG_TST
20284e1bc9a0SAchim Leubner   eventLogAddress = memoryAllocated->region[mIdx].virtPtr;
20294e1bc9a0SAchim Leubner #endif
20304e1bc9a0SAchim Leubner   mainCfg.upperEventLogAddress             = memoryAllocated->region[mIdx].physAddrUpper;
20314e1bc9a0SAchim Leubner   mainCfg.lowerEventLogAddress             = memoryAllocated->region[mIdx].physAddrLower;
20324e1bc9a0SAchim Leubner   mainCfg.eventLogSize                     = config->mainConfig.eventLogSize;
20334e1bc9a0SAchim Leubner   mainCfg.eventLogOption                   = config->mainConfig.eventLogOption;
20344e1bc9a0SAchim Leubner 
20354e1bc9a0SAchim Leubner   mIdx++;
20364e1bc9a0SAchim Leubner 
20374e1bc9a0SAchim Leubner   /* Checks if the configuration memory region size is the same as the mpiConfigMain */
20384e1bc9a0SAchim Leubner   if(memoryAllocated->region[mIdx].totalLength != sizeof(bit8) * config->mainConfig.IOPeventLogSize)
20394e1bc9a0SAchim Leubner   {
20404e1bc9a0SAchim Leubner     SA_DBG1(("ERROR: The memory region does not have the size of the IOP event log\n"));
20414e1bc9a0SAchim Leubner     smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "m3");
20424e1bc9a0SAchim Leubner     return AGSA_RC_FAILURE;
20434e1bc9a0SAchim Leubner   }
20444e1bc9a0SAchim Leubner 
20454e1bc9a0SAchim Leubner   mainCfg.upperIOPeventLogAddress     = memoryAllocated->region[mIdx].physAddrUpper;
20464e1bc9a0SAchim Leubner   mainCfg.lowerIOPeventLogAddress     = memoryAllocated->region[mIdx].physAddrLower;
20474e1bc9a0SAchim Leubner   mainCfg.IOPeventLogSize             = config->mainConfig.IOPeventLogSize;
20484e1bc9a0SAchim Leubner   mainCfg.IOPeventLogOption           = config->mainConfig.IOPeventLogOption;
20494e1bc9a0SAchim Leubner   mainCfg.FatalErrorInterrupt         = config->mainConfig.FatalErrorInterrupt;
20504e1bc9a0SAchim Leubner 
20514e1bc9a0SAchim Leubner   SA_DBG1(("mpiInitialize: iQNPPD_HPPD_GEvent 0x%x\n", mainCfg.iQNPPD_HPPD_GEvent));
20524e1bc9a0SAchim Leubner   if(smIS_SPCV(agRoot))
20534e1bc9a0SAchim Leubner   {
20544e1bc9a0SAchim Leubner   }
20554e1bc9a0SAchim Leubner   else
20564e1bc9a0SAchim Leubner   {
20574e1bc9a0SAchim Leubner     SA_DBG3(("mpiInitialize: outboundHWEventPID0_3 0x%x\n", mainCfg.outboundHWEventPID0_3));
20584e1bc9a0SAchim Leubner     SA_DBG3(("mpiInitialize: outboundHWEventPID4_7 0x%x\n", mainCfg.outboundHWEventPID4_7));
20594e1bc9a0SAchim Leubner     SA_DBG3(("mpiInitialize: outboundNCQEventPID0_3 0x%x\n", mainCfg.outboundNCQEventPID0_3));
20604e1bc9a0SAchim Leubner     SA_DBG3(("mpiInitialize: outboundNCQEventPID4_7 0x%x\n", mainCfg.outboundNCQEventPID4_7));
20614e1bc9a0SAchim Leubner     SA_DBG3(("mpiInitialize: outboundTargetITNexusEventPID0_3 0x%x\n", mainCfg.outboundTargetITNexusEventPID0_3));
20624e1bc9a0SAchim Leubner     SA_DBG3(("mpiInitialize: outboundTargetITNexusEventPID4_7 0x%x\n", mainCfg.outboundTargetITNexusEventPID4_7));
20634e1bc9a0SAchim Leubner     SA_DBG3(("mpiInitialize: outboundTargetSSPEventPID0_3 0x%x\n", mainCfg.outboundTargetSSPEventPID0_3));
20644e1bc9a0SAchim Leubner     SA_DBG3(("mpiInitialize: outboundTargetSSPEventPID4_7 0x%x\n", mainCfg.outboundTargetSSPEventPID4_7));
20654e1bc9a0SAchim Leubner   }
20664e1bc9a0SAchim Leubner 
20674e1bc9a0SAchim Leubner   SA_DBG3(("mpiInitialize: upperEventLogAddress 0x%x\n", mainCfg.upperEventLogAddress));
20684e1bc9a0SAchim Leubner   SA_DBG3(("mpiInitialize: lowerEventLogAddress 0x%x\n", mainCfg.lowerEventLogAddress));
20694e1bc9a0SAchim Leubner   SA_DBG3(("mpiInitialize: eventLogSize 0x%x\n", mainCfg.eventLogSize));
20704e1bc9a0SAchim Leubner   SA_DBG3(("mpiInitialize: eventLogOption 0x%x\n", mainCfg.eventLogOption));
20714e1bc9a0SAchim Leubner #ifdef FW_EVT_LOG_TST
20724e1bc9a0SAchim Leubner   SA_DBG3(("mpiInitialize: eventLogAddress 0x%p\n", eventLogAddress));
20734e1bc9a0SAchim Leubner #endif
20744e1bc9a0SAchim Leubner   SA_DBG3(("mpiInitialize: upperIOPLogAddress 0x%x\n", mainCfg.upperIOPeventLogAddress));
20754e1bc9a0SAchim Leubner   SA_DBG3(("mpiInitialize: lowerIOPLogAddress 0x%x\n", mainCfg.lowerIOPeventLogAddress));
20764e1bc9a0SAchim Leubner   SA_DBG3(("mpiInitialize: IOPeventLogSize 0x%x\n", mainCfg.IOPeventLogSize));
20774e1bc9a0SAchim Leubner   SA_DBG3(("mpiInitialize: IOPeventLogOption 0x%x\n", mainCfg.IOPeventLogOption));
20784e1bc9a0SAchim Leubner   SA_DBG3(("mpiInitialize: FatalErrorInterrupt 0x%x\n", mainCfg.FatalErrorInterrupt));
20794e1bc9a0SAchim Leubner   SA_DBG3(("mpiInitialize: HDAModeFlags 0x%x\n", mainCfg.HDAModeFlags));
20804e1bc9a0SAchim Leubner   SA_DBG3(("mpiInitialize: analogSetupTblOffset 0x%08x\n", mainCfg.analogSetupTblOffset));
20814e1bc9a0SAchim Leubner 
20824e1bc9a0SAchim Leubner   saRoot->mainConfigTable.iQNPPD_HPPD_GEvent               = mainCfg.iQNPPD_HPPD_GEvent;
20834e1bc9a0SAchim Leubner 
20844e1bc9a0SAchim Leubner   if(smIS_SPCV(agRoot))
20854e1bc9a0SAchim Leubner   {
20864e1bc9a0SAchim Leubner   /* SPCV - reserved fields */
20874e1bc9a0SAchim Leubner     saRoot->mainConfigTable.outboundHWEventPID0_3            = 0;
20884e1bc9a0SAchim Leubner     saRoot->mainConfigTable.outboundHWEventPID4_7            = 0;
20894e1bc9a0SAchim Leubner     saRoot->mainConfigTable.outboundNCQEventPID0_3           = 0;
20904e1bc9a0SAchim Leubner     saRoot->mainConfigTable.outboundNCQEventPID4_7           = 0;
20914e1bc9a0SAchim Leubner     saRoot->mainConfigTable.outboundTargetITNexusEventPID0_3 = 0;
20924e1bc9a0SAchim Leubner     saRoot->mainConfigTable.outboundTargetITNexusEventPID4_7 = 0;
20934e1bc9a0SAchim Leubner     saRoot->mainConfigTable.outboundTargetSSPEventPID0_3     = 0;
20944e1bc9a0SAchim Leubner     saRoot->mainConfigTable.outboundTargetSSPEventPID4_7     = 0;
20954e1bc9a0SAchim Leubner     saRoot->mainConfigTable.ioAbortDelay                     = 0;
20964e1bc9a0SAchim Leubner     saRoot->mainConfigTable.custset                          = 0;
20974e1bc9a0SAchim Leubner 
20984e1bc9a0SAchim Leubner   }
20994e1bc9a0SAchim Leubner   else
21004e1bc9a0SAchim Leubner   {
21014e1bc9a0SAchim Leubner     saRoot->mainConfigTable.outboundHWEventPID0_3            = mainCfg.outboundHWEventPID0_3;
21024e1bc9a0SAchim Leubner     saRoot->mainConfigTable.outboundHWEventPID4_7            = mainCfg.outboundHWEventPID4_7;
21034e1bc9a0SAchim Leubner     saRoot->mainConfigTable.outboundNCQEventPID0_3           = mainCfg.outboundNCQEventPID0_3;
21044e1bc9a0SAchim Leubner     saRoot->mainConfigTable.outboundNCQEventPID4_7           = mainCfg.outboundNCQEventPID4_7;
21054e1bc9a0SAchim Leubner     saRoot->mainConfigTable.outboundTargetITNexusEventPID0_3 = mainCfg.outboundTargetITNexusEventPID0_3;
21064e1bc9a0SAchim Leubner     saRoot->mainConfigTable.outboundTargetITNexusEventPID4_7 = mainCfg.outboundTargetITNexusEventPID4_7;
21074e1bc9a0SAchim Leubner     saRoot->mainConfigTable.outboundTargetSSPEventPID0_3     = mainCfg.outboundTargetSSPEventPID0_3;
21084e1bc9a0SAchim Leubner     saRoot->mainConfigTable.outboundTargetSSPEventPID4_7     = mainCfg.outboundTargetSSPEventPID4_7;
21094e1bc9a0SAchim Leubner     saRoot->mainConfigTable.ioAbortDelay                     = mainCfg.ioAbortDelay;
21104e1bc9a0SAchim Leubner     saRoot->mainConfigTable.custset                          = mainCfg.custset;
21114e1bc9a0SAchim Leubner 
21124e1bc9a0SAchim Leubner   }
21134e1bc9a0SAchim Leubner 
21144e1bc9a0SAchim Leubner   saRoot->mainConfigTable.upperEventLogAddress             = mainCfg.upperEventLogAddress;
21154e1bc9a0SAchim Leubner   saRoot->mainConfigTable.lowerEventLogAddress             = mainCfg.lowerEventLogAddress;
21164e1bc9a0SAchim Leubner   saRoot->mainConfigTable.eventLogSize                     = mainCfg.eventLogSize;
21174e1bc9a0SAchim Leubner   saRoot->mainConfigTable.eventLogOption                   = mainCfg.eventLogOption;
21184e1bc9a0SAchim Leubner   saRoot->mainConfigTable.upperIOPeventLogAddress          = mainCfg.upperIOPeventLogAddress;
21194e1bc9a0SAchim Leubner   saRoot->mainConfigTable.lowerIOPeventLogAddress          = mainCfg.lowerIOPeventLogAddress;
21204e1bc9a0SAchim Leubner   saRoot->mainConfigTable.IOPeventLogSize                  = mainCfg.IOPeventLogSize;
21214e1bc9a0SAchim Leubner   saRoot->mainConfigTable.IOPeventLogOption                = mainCfg.IOPeventLogOption;
21224e1bc9a0SAchim Leubner   saRoot->mainConfigTable.FatalErrorInterrupt              = mainCfg.FatalErrorInterrupt;
21234e1bc9a0SAchim Leubner 
21244e1bc9a0SAchim Leubner 
21254e1bc9a0SAchim Leubner   if(smIS_SPCV(agRoot))
21264e1bc9a0SAchim Leubner   {
21274e1bc9a0SAchim Leubner     ;/* SPCV - reserved fields */
21284e1bc9a0SAchim Leubner   }
21294e1bc9a0SAchim Leubner   else
21304e1bc9a0SAchim Leubner   {
21314e1bc9a0SAchim Leubner     saRoot->mainConfigTable.HDAModeFlags                     = mainCfg.HDAModeFlags;
21324e1bc9a0SAchim Leubner   }
21334e1bc9a0SAchim Leubner 
21344e1bc9a0SAchim Leubner   saRoot->mainConfigTable.analogSetupTblOffset             = mainCfg.analogSetupTblOffset;
21354e1bc9a0SAchim Leubner 
21364e1bc9a0SAchim Leubner   smTrace(hpDBG_VERY_LOUD,"71",mIdx);
21374e1bc9a0SAchim Leubner   /* TP:71 71 mIdx  */
21384e1bc9a0SAchim Leubner 
21394e1bc9a0SAchim Leubner 
21404e1bc9a0SAchim Leubner 
21414e1bc9a0SAchim Leubner   ossaHwRegWriteExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_IQNPPD_HPPD_OFFSET),
21424e1bc9a0SAchim Leubner                      mainCfg.iQNPPD_HPPD_GEvent);
21434e1bc9a0SAchim Leubner 
21444e1bc9a0SAchim Leubner   SA_DBG3(("mpiInitialize: Offset 0x%08x mainCfg.iQNPPD_HPPD_GEvent 0x%x\n", (bit32)(MSGUCfgTblDWIdx + MAIN_IQNPPD_HPPD_OFFSET), mainCfg.iQNPPD_HPPD_GEvent));
21454e1bc9a0SAchim Leubner 
21464e1bc9a0SAchim Leubner   if(smIS_SPC6V(agRoot))
21474e1bc9a0SAchim Leubner   {
21484e1bc9a0SAchim Leubner     if(smIsCfgVREV_B(agRoot))
21494e1bc9a0SAchim Leubner     {
21504e1bc9a0SAchim Leubner       ossaHwRegWriteExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_IO_ABORT_DELAY),
21514e1bc9a0SAchim Leubner                      MAIN_IO_ABORT_DELAY_END_TO_END_CRC_DISABLE);
21524e1bc9a0SAchim Leubner 
21534e1bc9a0SAchim Leubner       SA_DBG1(("mpiInitialize:SPCV - MAIN_IO_ABORT_DELAY_END_TO_END_CRC_DISABLE\n" ));
21544e1bc9a0SAchim Leubner     }
21554e1bc9a0SAchim Leubner     if(smIsCfgVREV_C(agRoot))
21564e1bc9a0SAchim Leubner     {
21574e1bc9a0SAchim Leubner       SA_DBG1(("mpiInitialize:SPCV - END_TO_END_CRC On\n" ));
21584e1bc9a0SAchim Leubner     }
21594e1bc9a0SAchim Leubner     SA_DBG3(("mpiInitialize:SPCV - rest reserved field  \n" ));
21604e1bc9a0SAchim Leubner     ;/* SPCV - reserved field */
21614e1bc9a0SAchim Leubner   }
21624e1bc9a0SAchim Leubner   else if(smIS_SPC(agRoot))
21634e1bc9a0SAchim Leubner   {
21644e1bc9a0SAchim Leubner     ossaHwRegWriteExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_OB_HW_EVENT_PID03_OFFSET),
21654e1bc9a0SAchim Leubner                        mainCfg.outboundHWEventPID0_3);
21664e1bc9a0SAchim Leubner     ossaHwRegWriteExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_OB_HW_EVENT_PID47_OFFSET),
21674e1bc9a0SAchim Leubner                        mainCfg.outboundHWEventPID4_7);
21684e1bc9a0SAchim Leubner     ossaHwRegWriteExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_OB_NCQ_EVENT_PID03_OFFSET),
21694e1bc9a0SAchim Leubner                        mainCfg.outboundNCQEventPID0_3);
21704e1bc9a0SAchim Leubner     ossaHwRegWriteExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_OB_NCQ_EVENT_PID47_OFFSET),
21714e1bc9a0SAchim Leubner                        mainCfg.outboundNCQEventPID4_7);
21724e1bc9a0SAchim Leubner     ossaHwRegWriteExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_TITNX_EVENT_PID03_OFFSET),
21734e1bc9a0SAchim Leubner                        mainCfg.outboundTargetITNexusEventPID0_3);
21744e1bc9a0SAchim Leubner     ossaHwRegWriteExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_TITNX_EVENT_PID47_OFFSET),
21754e1bc9a0SAchim Leubner                        mainCfg.outboundTargetITNexusEventPID4_7);
21764e1bc9a0SAchim Leubner     ossaHwRegWriteExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_OB_SSP_EVENT_PID03_OFFSET),
21774e1bc9a0SAchim Leubner                        mainCfg.outboundTargetSSPEventPID0_3);
21784e1bc9a0SAchim Leubner     ossaHwRegWriteExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_OB_SSP_EVENT_PID47_OFFSET),
21794e1bc9a0SAchim Leubner                        mainCfg.outboundTargetSSPEventPID4_7);
21804e1bc9a0SAchim Leubner     ossaHwRegWriteExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_CUSTOMER_SETTING),
21814e1bc9a0SAchim Leubner                        mainCfg.custset);
21824e1bc9a0SAchim Leubner   }else
21834e1bc9a0SAchim Leubner   {
21844e1bc9a0SAchim Leubner     if(smIsCfgVREV_A(agRoot))
21854e1bc9a0SAchim Leubner     {
21864e1bc9a0SAchim Leubner        ossaHwRegWriteExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_IO_ABORT_DELAY),
21874e1bc9a0SAchim Leubner                      MAIN_IO_ABORT_DELAY_END_TO_END_CRC_DISABLE);  /* */
21884e1bc9a0SAchim Leubner        SA_DBG1(("mpiInitialize:SPCV12G - offset MAIN_IO_ABORT_DELAY 0x%x value MAIN_IO_ABORT_DELAY_END_TO_END_CRC_DISABLE 0x%x\n",MAIN_IO_ABORT_DELAY ,MAIN_IO_ABORT_DELAY_END_TO_END_CRC_DISABLE));
21894e1bc9a0SAchim Leubner        SA_DBG1(("mpiInitialize:SPCV12G - END_TO_END_CRC OFF for rev A %d\n",smIsCfgVREV_A(agRoot) ));
21904e1bc9a0SAchim Leubner     }
21914e1bc9a0SAchim Leubner     else if(smIsCfgVREV_B(agRoot))
21924e1bc9a0SAchim Leubner     {
21934e1bc9a0SAchim Leubner        SA_DBG1(("mpiInitialize:SPCV12G - END_TO_END_CRC ON rev B %d ****************************\n",smIsCfgVREV_B(agRoot) ));
21944e1bc9a0SAchim Leubner        /*ossaHwRegWriteExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_IO_ABORT_DELAY),
21954e1bc9a0SAchim Leubner                      MAIN_IO_ABORT_DELAY_END_TO_END_CRC_DISABLE);
21964e1bc9a0SAchim Leubner        */
21974e1bc9a0SAchim Leubner     }
21984e1bc9a0SAchim Leubner     else if(smIsCfgVREV_C(agRoot))
21994e1bc9a0SAchim Leubner     {
22004e1bc9a0SAchim Leubner        SA_DBG1(("mpiInitialize:SPCV12G - END_TO_END_CRC on rev C %d\n",smIsCfgVREV_C(agRoot) ));
22014e1bc9a0SAchim Leubner     }
22024e1bc9a0SAchim Leubner     else
22034e1bc9a0SAchim Leubner     {
22044e1bc9a0SAchim Leubner        ossaHwRegWriteExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_IO_ABORT_DELAY),
22054e1bc9a0SAchim Leubner                      MAIN_IO_ABORT_DELAY_END_TO_END_CRC_DISABLE);
22064e1bc9a0SAchim Leubner        SA_DBG1(("mpiInitialize:SPCV12G - END_TO_END_CRC Off unknown rev 0x%x\n", ossaHwRegReadConfig32((agRoot), 8 )));
22074e1bc9a0SAchim Leubner     }
22084e1bc9a0SAchim Leubner   }
22094e1bc9a0SAchim Leubner 
22104e1bc9a0SAchim Leubner   ossaHwRegWriteExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_EVENT_LOG_ADDR_HI),       mainCfg.upperEventLogAddress);
22114e1bc9a0SAchim Leubner   ossaHwRegWriteExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_EVENT_LOG_ADDR_LO),       mainCfg.lowerEventLogAddress);
22124e1bc9a0SAchim Leubner   ossaHwRegWriteExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_EVENT_LOG_BUFF_SIZE),     mainCfg.eventLogSize);
22134e1bc9a0SAchim Leubner   ossaHwRegWriteExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_EVENT_LOG_OPTION),        mainCfg.eventLogOption);
22144e1bc9a0SAchim Leubner   ossaHwRegWriteExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_IOP_EVENT_LOG_ADDR_HI),   mainCfg.upperIOPeventLogAddress);
22154e1bc9a0SAchim Leubner   ossaHwRegWriteExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_IOP_EVENT_LOG_ADDR_LO),   mainCfg.lowerIOPeventLogAddress);
22164e1bc9a0SAchim Leubner   ossaHwRegWriteExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_IOP_EVENT_LOG_BUFF_SIZE), mainCfg.IOPeventLogSize);
22174e1bc9a0SAchim Leubner   ossaHwRegWriteExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_IOP_EVENT_LOG_OPTION),    mainCfg.IOPeventLogOption);
22184e1bc9a0SAchim Leubner   ossaHwRegWriteExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_FATAL_ERROR_INTERRUPT),   mainCfg.FatalErrorInterrupt);
22194e1bc9a0SAchim Leubner   ossaHwRegWriteExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_PRECTD_PRESETD),          mainCfg.portRecoveryResetTimer);
22204e1bc9a0SAchim Leubner 
22214e1bc9a0SAchim Leubner   SA_DBG3(("mpiInitialize: Offset 0x%08x upperEventLogAddress    0x%x\n",(bit32)(MSGUCfgTblDWIdx + MAIN_EVENT_LOG_ADDR_HI), mainCfg.upperEventLogAddress ));
22224e1bc9a0SAchim Leubner   SA_DBG3(("mpiInitialize: Offset 0x%08x lowerEventLogAddress    0x%x\n",(bit32)(MSGUCfgTblDWIdx + MAIN_EVENT_LOG_ADDR_LO), mainCfg.lowerEventLogAddress ));
22234e1bc9a0SAchim Leubner   SA_DBG3(("mpiInitialize: Offset 0x%08x eventLogSize            0x%x\n",(bit32)(MSGUCfgTblDWIdx + MAIN_EVENT_LOG_BUFF_SIZE), mainCfg.eventLogSize ));
22244e1bc9a0SAchim Leubner   SA_DBG3(("mpiInitialize: Offset 0x%08x eventLogOption          0x%x\n",(bit32)(MSGUCfgTblDWIdx + MAIN_EVENT_LOG_OPTION), mainCfg.eventLogOption ));
22254e1bc9a0SAchim Leubner   SA_DBG3(("mpiInitialize: Offset 0x%08x upperIOPeventLogAddress 0x%x\n",(bit32)(MSGUCfgTblDWIdx + MAIN_IOP_EVENT_LOG_ADDR_HI), mainCfg.upperIOPeventLogAddress ));
22264e1bc9a0SAchim Leubner   SA_DBG3(("mpiInitialize: Offset 0x%08x lowerIOPeventLogAddress 0x%x\n",(bit32)(MSGUCfgTblDWIdx + MAIN_IOP_EVENT_LOG_ADDR_LO), mainCfg.lowerIOPeventLogAddress ));
22274e1bc9a0SAchim Leubner   SA_DBG3(("mpiInitialize: Offset 0x%08x IOPeventLogSize         0x%x\n",(bit32)(MSGUCfgTblDWIdx + MAIN_IOP_EVENT_LOG_BUFF_SIZE), mainCfg.IOPeventLogSize ));
22284e1bc9a0SAchim Leubner   SA_DBG3(("mpiInitialize: Offset 0x%08x IOPeventLogOption       0x%x\n",(bit32)(MSGUCfgTblDWIdx + MAIN_IOP_EVENT_LOG_OPTION), mainCfg.IOPeventLogOption ));
22294e1bc9a0SAchim Leubner   SA_DBG3(("mpiInitialize: Offset 0x%08x FatalErrorInterrupt     0x%x\n",(bit32)(MSGUCfgTblDWIdx + MAIN_FATAL_ERROR_INTERRUPT), mainCfg.FatalErrorInterrupt ));
22304e1bc9a0SAchim Leubner   SA_DBG3(("mpiInitialize: Offset 0x%08x PortRecoveryResetTimer  0x%x\n",(bit32)(MSGUCfgTblDWIdx + MAIN_PRECTD_PRESETD), mainCfg.portRecoveryResetTimer ));
22314e1bc9a0SAchim Leubner 
22324e1bc9a0SAchim Leubner   ossaHwRegWriteExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_IRAD_RESERVED),           mainCfg.interruptReassertionDelay);
22334e1bc9a0SAchim Leubner   SA_DBG3(("mpiInitialize: Offset 0x%08x InterruptReassertionDelay 0x%x\n",(bit32)(MSGUCfgTblDWIdx + MAIN_IRAD_RESERVED), mainCfg.interruptReassertionDelay ));
22344e1bc9a0SAchim Leubner 
22354e1bc9a0SAchim Leubner   mIdx++;
22364e1bc9a0SAchim Leubner 
22374e1bc9a0SAchim Leubner   /* skip the ci and pi memory region */
22384e1bc9a0SAchim Leubner   mIdx++;
22394e1bc9a0SAchim Leubner   mIdx++;
22404e1bc9a0SAchim Leubner 
22414e1bc9a0SAchim Leubner   smTrace(hpDBG_VERY_LOUD,"72",mIdx);
22424e1bc9a0SAchim Leubner   /* TP:72 mIdx  */
22434e1bc9a0SAchim Leubner   smTrace(hpDBG_VERY_LOUD,"Bc",maxinbound);
22444e1bc9a0SAchim Leubner   /* TP:Bc  maxinbound  */
22454e1bc9a0SAchim Leubner   smTrace(hpDBG_VERY_LOUD,"Bd",pcibar);
22464e1bc9a0SAchim Leubner   /* TP:Bd pcibar   */
22474e1bc9a0SAchim Leubner 
22484e1bc9a0SAchim Leubner   /* index offset */
22494e1bc9a0SAchim Leubner   indexoffset = 0;
22504e1bc9a0SAchim Leubner   memOffset   = 0;
22514e1bc9a0SAchim Leubner 
22524e1bc9a0SAchim Leubner   /* Memory regions for the inbound queues */
22534e1bc9a0SAchim Leubner   for(qIdx = 0; qIdx < maxinbound; qIdx++)
22544e1bc9a0SAchim Leubner   {
22554e1bc9a0SAchim Leubner     /* point back to the begin then plus offset to next queue */
22564e1bc9a0SAchim Leubner     smTrace(hpDBG_VERY_LOUD,"Bd",pcibar);
22574e1bc9a0SAchim Leubner     /* TP:Bd pcibar   */
22584e1bc9a0SAchim Leubner     MSGUCfgTblDWIdx = saveOffset;
22594e1bc9a0SAchim Leubner     MSGUCfgTblDWIdx += inboundoffset;
22604e1bc9a0SAchim Leubner     MSGUCfgTblDWIdx += (sizeof(spc_inboundQueueDescriptor_t) * qIdx);
22614e1bc9a0SAchim Leubner     SA_DBG1(("mpiInitialize: A saveOffset 0x%x MSGUCfgTblDWIdx 0x%x\n",saveOffset ,MSGUCfgTblDWIdx));
22624e1bc9a0SAchim Leubner 
22634e1bc9a0SAchim Leubner     /* if the MPI configuration says that this queue is disabled ... */
22644e1bc9a0SAchim Leubner     if(0 == config->inboundQueues[qIdx].numElements)
22654e1bc9a0SAchim Leubner     {
22664e1bc9a0SAchim Leubner       /* ... Clears the configuration table for this queue */
22674e1bc9a0SAchim Leubner 
22684e1bc9a0SAchim Leubner       inQueueCfg.elementPriSizeCount= 0;
22694e1bc9a0SAchim Leubner       inQueueCfg.upperBaseAddress = 0;
22704e1bc9a0SAchim Leubner       inQueueCfg.lowerBaseAddress = 0;
22714e1bc9a0SAchim Leubner       inQueueCfg.ciUpperBaseAddress = 0;
22724e1bc9a0SAchim Leubner       inQueueCfg.ciLowerBaseAddress = 0;
22734e1bc9a0SAchim Leubner       /* skip inQueueCfg.PIPCIBar (PM8000 write access) */
22744e1bc9a0SAchim Leubner       /* skip inQueueCfg.PIOffset (PM8000 write access) */
22754e1bc9a0SAchim Leubner 
22764e1bc9a0SAchim Leubner       /* Update the inbound configuration table in SPC GSM */
22774e1bc9a0SAchim Leubner       mpiUpdateIBQueueCfgTable(agRoot, &inQueueCfg, MSGUCfgTblDWIdx, pcibar);
22784e1bc9a0SAchim Leubner     }
22794e1bc9a0SAchim Leubner 
22804e1bc9a0SAchim Leubner     /* If the queue is enabled, then ... */
22814e1bc9a0SAchim Leubner     else
22824e1bc9a0SAchim Leubner     {
22834e1bc9a0SAchim Leubner       bit32 memSize = config->inboundQueues[qIdx].numElements * config->inboundQueues[qIdx].elementSize;
22844e1bc9a0SAchim Leubner       bit32 remainder = memSize & 127;
22854e1bc9a0SAchim Leubner 
22864e1bc9a0SAchim Leubner       /* Calculate the size of this queue padded to 128 bytes */
22874e1bc9a0SAchim Leubner       if (remainder > 0)
22884e1bc9a0SAchim Leubner       {
22894e1bc9a0SAchim Leubner         memSize += (128 - remainder);
22904e1bc9a0SAchim Leubner       }
22914e1bc9a0SAchim Leubner 
22924e1bc9a0SAchim Leubner       /* ... first checks that the memory region has the right size */
22934e1bc9a0SAchim Leubner       if( (memoryAllocated->region[mIdx].totalLength - memOffset < memSize) ||
22944e1bc9a0SAchim Leubner           (NULL == memoryAllocated->region[mIdx].virtPtr) ||
22954e1bc9a0SAchim Leubner           (0 == memoryAllocated->region[mIdx].totalLength))
22964e1bc9a0SAchim Leubner       {
22974e1bc9a0SAchim Leubner         SA_DBG1(("mpiInitialize: ERROR The memory region does not have the right size for this inbound queue"));
22984e1bc9a0SAchim Leubner         smTraceFuncExit(hpDBG_VERY_LOUD, 'd', "m3");
22994e1bc9a0SAchim Leubner         return AGSA_RC_FAILURE;
23004e1bc9a0SAchim Leubner       }
23014e1bc9a0SAchim Leubner       else
23024e1bc9a0SAchim Leubner       {
23034e1bc9a0SAchim Leubner         /* Then, using the MPI configuration argument, initializes the corresponding element on the saRoot */
23044e1bc9a0SAchim Leubner         saRoot->inboundQueue[qIdx].numElements  = config->inboundQueues[qIdx].numElements;
23054e1bc9a0SAchim Leubner         saRoot->inboundQueue[qIdx].elementSize  = config->inboundQueues[qIdx].elementSize;
23064e1bc9a0SAchim Leubner         saRoot->inboundQueue[qIdx].priority     = config->inboundQueues[qIdx].priority;
23074e1bc9a0SAchim Leubner         si_memcpy(&saRoot->inboundQueue[qIdx].memoryRegion, &memoryAllocated->region[mIdx], sizeof(mpiMem_t));
23084e1bc9a0SAchim Leubner         saRoot->inboundQueue[qIdx].memoryRegion.virtPtr =
23094e1bc9a0SAchim Leubner           (bit8 *)saRoot->inboundQueue[qIdx].memoryRegion.virtPtr + memOffset;
23104e1bc9a0SAchim Leubner         saRoot->inboundQueue[qIdx].memoryRegion.physAddrLower += memOffset;
23114e1bc9a0SAchim Leubner         saRoot->inboundQueue[qIdx].memoryRegion.elementSize = memSize;
23124e1bc9a0SAchim Leubner         saRoot->inboundQueue[qIdx].memoryRegion.totalLength = memSize;
23134e1bc9a0SAchim Leubner         saRoot->inboundQueue[qIdx].memoryRegion.numElements = 1;
23144e1bc9a0SAchim Leubner 
23154e1bc9a0SAchim Leubner         /* Initialize the local copy of PIs, CIs */
23164e1bc9a0SAchim Leubner         SA_DBG1(("mpiInitialize: queue %d PI CI zero\n",qIdx));
23174e1bc9a0SAchim Leubner         saRoot->inboundQueue[qIdx].producerIdx = 0;
23184e1bc9a0SAchim Leubner         saRoot->inboundQueue[qIdx].consumerIdx = 0;
23194e1bc9a0SAchim Leubner         saRoot->inboundQueue[qIdx].agRoot = agRoot;
23204e1bc9a0SAchim Leubner 
23214e1bc9a0SAchim Leubner         /* MPI memory region for inbound CIs are 2 */
23224e1bc9a0SAchim Leubner         saRoot->inboundQueue[qIdx].ciPointer = (((bit8 *)(memoryAllocated->region[MPI_CI_INDEX].virtPtr)) + qIdx * 4);
23234e1bc9a0SAchim Leubner         /* ... and in the local structure we will use to copy to the HW configuration table */
23244e1bc9a0SAchim Leubner 
23254e1bc9a0SAchim Leubner         /* CI base address */
23264e1bc9a0SAchim Leubner         inQueueCfg.elementPriSizeCount= config->inboundQueues[qIdx].numElements |
23274e1bc9a0SAchim Leubner                                         (config->inboundQueues[qIdx].elementSize << SHIFT16) |
23284e1bc9a0SAchim Leubner                                         (config->inboundQueues[qIdx].priority << SHIFT30);
23294e1bc9a0SAchim Leubner         inQueueCfg.upperBaseAddress   = saRoot->inboundQueue[qIdx].memoryRegion.physAddrUpper;
23304e1bc9a0SAchim Leubner         inQueueCfg.lowerBaseAddress   = saRoot->inboundQueue[qIdx].memoryRegion.physAddrLower;
23314e1bc9a0SAchim Leubner         inQueueCfg.ciUpperBaseAddress = memoryAllocated->region[MPI_CI_INDEX].physAddrUpper;
23324e1bc9a0SAchim Leubner         inQueueCfg.ciLowerBaseAddress = memoryAllocated->region[MPI_CI_INDEX].physAddrLower + qIdx * 4;
23334e1bc9a0SAchim Leubner 
23344e1bc9a0SAchim Leubner         /* write the configured data of inbound queue to SPC GSM */
23354e1bc9a0SAchim Leubner         mpiUpdateIBQueueCfgTable(agRoot, &inQueueCfg, MSGUCfgTblDWIdx, pcibar);
23364e1bc9a0SAchim Leubner         /* get inbound PI PCI Bar and Offset */
23374e1bc9a0SAchim Leubner         /* get the PI PCI Bar offset and convert it to logical BAR */
23384e1bc9a0SAchim Leubner         IB_PIPCIBar = ossaHwRegReadExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + IB_PIPCI_BAR));
23394e1bc9a0SAchim Leubner         saRoot->inboundQueue[qIdx].PIPCIBar     = mpiGetPCIBarIndex(agRoot, IB_PIPCIBar);
23404e1bc9a0SAchim Leubner         saRoot->inboundQueue[qIdx].PIPCIOffset  = ossaHwRegReadExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + IB_PIPCI_BAR_OFFSET));
23414e1bc9a0SAchim Leubner         saRoot->inboundQueue[qIdx].qNumber      = qIdx;
23424e1bc9a0SAchim Leubner 
23434e1bc9a0SAchim Leubner         memOffset += memSize;
23444e1bc9a0SAchim Leubner 
23454e1bc9a0SAchim Leubner         if ((0 == ((qIdx + 1) % MAX_QUEUE_EACH_MEM)) ||
23464e1bc9a0SAchim Leubner             (qIdx == (maxinbound - 1)))
23474e1bc9a0SAchim Leubner         {
23484e1bc9a0SAchim Leubner           mIdx++;
23494e1bc9a0SAchim Leubner           indexoffset += MAX_QUEUE_EACH_MEM;
23504e1bc9a0SAchim Leubner           memOffset = 0;
23514e1bc9a0SAchim Leubner         }
23524e1bc9a0SAchim Leubner 
23534e1bc9a0SAchim Leubner       } /* else for memeory ok */
23544e1bc9a0SAchim Leubner     } /* queue enable */
23554e1bc9a0SAchim Leubner   } /* loop for inbound queue */
23564e1bc9a0SAchim Leubner 
23574e1bc9a0SAchim Leubner   smTrace(hpDBG_VERY_LOUD,"73",0);
23584e1bc9a0SAchim Leubner   /* TP:73  outbound queues  */
23594e1bc9a0SAchim Leubner 
23604e1bc9a0SAchim Leubner   /* index offset */
23614e1bc9a0SAchim Leubner   indexoffset = 0;
23624e1bc9a0SAchim Leubner   memOffset = 0;
23634e1bc9a0SAchim Leubner   /* Let's process the memory regions for the outbound queues */
23644e1bc9a0SAchim Leubner   for(qIdx = 0; qIdx < maxoutbound; qIdx++)
23654e1bc9a0SAchim Leubner   {
23664e1bc9a0SAchim Leubner     /* point back to the begin then plus offset to next queue */
23674e1bc9a0SAchim Leubner     MSGUCfgTblDWIdx  = saveOffset;
23684e1bc9a0SAchim Leubner     MSGUCfgTblDWIdx += outboundoffset;
23694e1bc9a0SAchim Leubner     MSGUCfgTblDWIdx += (sizeof(spc_outboundQueueDescriptor_t) * qIdx);
23704e1bc9a0SAchim Leubner 
23714e1bc9a0SAchim Leubner     /* if the MPI configuration says that this queue is disabled ... */
23724e1bc9a0SAchim Leubner     if(0 == config->outboundQueues[qIdx].numElements)
23734e1bc9a0SAchim Leubner     {
23744e1bc9a0SAchim Leubner       /* ... Clears the configuration table for this queue */
23754e1bc9a0SAchim Leubner       outQueueCfg.upperBaseAddress   = 0;
23764e1bc9a0SAchim Leubner       outQueueCfg.lowerBaseAddress   = 0;
23774e1bc9a0SAchim Leubner       outQueueCfg.piUpperBaseAddress = 0;
23784e1bc9a0SAchim Leubner       outQueueCfg.piLowerBaseAddress = 0;
23794e1bc9a0SAchim Leubner       /* skip outQueueCfg.CIPCIBar = 0; read access only */
23804e1bc9a0SAchim Leubner       /* skip outQueueCfg.CIOffset = 0; read access only */
23814e1bc9a0SAchim Leubner       outQueueCfg.elementSizeCount     = 0;
23824e1bc9a0SAchim Leubner       outQueueCfg.interruptVecCntDelay = 0;
23834e1bc9a0SAchim Leubner 
23844e1bc9a0SAchim Leubner       /* Updated the configuration table in SPC GSM */
23854e1bc9a0SAchim Leubner       mpiUpdateOBQueueCfgTable(agRoot, &outQueueCfg, MSGUCfgTblDWIdx, pcibar);
23864e1bc9a0SAchim Leubner     }
23874e1bc9a0SAchim Leubner 
23884e1bc9a0SAchim Leubner     /* If the outbound queue is enabled, then ... */
23894e1bc9a0SAchim Leubner     else
23904e1bc9a0SAchim Leubner     {
23914e1bc9a0SAchim Leubner       bit32 memSize = config->outboundQueues[qIdx].numElements * config->outboundQueues[qIdx].elementSize;
23924e1bc9a0SAchim Leubner       bit32 remainder = memSize & 127;
23934e1bc9a0SAchim Leubner 
23944e1bc9a0SAchim Leubner       /* Calculate the size of this queue padded to 128 bytes */
23954e1bc9a0SAchim Leubner       if (remainder > 0)
23964e1bc9a0SAchim Leubner       {
23974e1bc9a0SAchim Leubner           memSize += (128 - remainder);
23984e1bc9a0SAchim Leubner       }
23994e1bc9a0SAchim Leubner 
24004e1bc9a0SAchim Leubner       /* ... first checks that the memory region has the right size */
24014e1bc9a0SAchim Leubner       if((memoryAllocated->region[mIdx].totalLength - memOffset < memSize) ||
24024e1bc9a0SAchim Leubner          (NULL == memoryAllocated->region[mIdx].virtPtr) ||
24034e1bc9a0SAchim Leubner          (0 == memoryAllocated->region[mIdx].totalLength))
24044e1bc9a0SAchim Leubner       {
24054e1bc9a0SAchim Leubner         SA_DBG1(("ERROR: The memory region does not have the right size for this outbound queue"));
24064e1bc9a0SAchim Leubner         smTraceFuncExit(hpDBG_VERY_LOUD, 'e', "m3");
24074e1bc9a0SAchim Leubner         return AGSA_RC_FAILURE;
24084e1bc9a0SAchim Leubner       }
24094e1bc9a0SAchim Leubner       else
24104e1bc9a0SAchim Leubner       {
24114e1bc9a0SAchim Leubner         /* Then, using the MPI configuration argument, initializes the corresponding element on the MPI context ... */
24124e1bc9a0SAchim Leubner         saRoot->outboundQueue[qIdx].numElements  = config->outboundQueues[qIdx].numElements;
24134e1bc9a0SAchim Leubner         saRoot->outboundQueue[qIdx].elementSize  = config->outboundQueues[qIdx].elementSize;
24144e1bc9a0SAchim Leubner         si_memcpy(&saRoot->outboundQueue[qIdx].memoryRegion, &memoryAllocated->region[mIdx], sizeof(mpiMem_t));
24154e1bc9a0SAchim Leubner         saRoot->outboundQueue[qIdx].memoryRegion.virtPtr =
24164e1bc9a0SAchim Leubner             (bit8 *)saRoot->outboundQueue[qIdx].memoryRegion.virtPtr + memOffset;
24174e1bc9a0SAchim Leubner         saRoot->outboundQueue[qIdx].memoryRegion.physAddrLower += memOffset;
24184e1bc9a0SAchim Leubner         saRoot->outboundQueue[qIdx].memoryRegion.elementSize = memSize;
24194e1bc9a0SAchim Leubner         saRoot->outboundQueue[qIdx].memoryRegion.totalLength = memSize;
24204e1bc9a0SAchim Leubner         saRoot->outboundQueue[qIdx].memoryRegion.numElements = 1;
24214e1bc9a0SAchim Leubner         saRoot->outboundQueue[qIdx].producerIdx = 0;
24224e1bc9a0SAchim Leubner         saRoot->outboundQueue[qIdx].consumerIdx = 0;
24234e1bc9a0SAchim Leubner         saRoot->outboundQueue[qIdx].agRoot = agRoot;
24244e1bc9a0SAchim Leubner 
24254e1bc9a0SAchim Leubner         /* MPI memory region for outbound PIs are 3 */
24264e1bc9a0SAchim Leubner         saRoot->outboundQueue[qIdx].piPointer = (((bit8 *)(memoryAllocated->region[MPI_CI_INDEX + 1].virtPtr))+ qIdx * 4);
24274e1bc9a0SAchim Leubner         /* ... and in the local structure we will use to copy to the HW configuration table */
24284e1bc9a0SAchim Leubner         outQueueCfg.upperBaseAddress = saRoot->outboundQueue[qIdx].memoryRegion.physAddrUpper;
24294e1bc9a0SAchim Leubner         outQueueCfg.lowerBaseAddress = saRoot->outboundQueue[qIdx].memoryRegion.physAddrLower;
24304e1bc9a0SAchim Leubner 
24314e1bc9a0SAchim Leubner         /* PI base address */
24324e1bc9a0SAchim Leubner         outQueueCfg.piUpperBaseAddress = memoryAllocated->region[MPI_CI_INDEX + 1].physAddrUpper;
24334e1bc9a0SAchim Leubner         outQueueCfg.piLowerBaseAddress = memoryAllocated->region[MPI_CI_INDEX + 1].physAddrLower + qIdx * 4;
24344e1bc9a0SAchim Leubner         outQueueCfg.elementSizeCount = config->outboundQueues[qIdx].numElements |
24354e1bc9a0SAchim Leubner                                        (config->outboundQueues[qIdx].elementSize << SHIFT16);
24364e1bc9a0SAchim Leubner 
24374e1bc9a0SAchim Leubner         /* enable/disable interrupt - use saSystemInterruptsActive() API */
24384e1bc9a0SAchim Leubner         /* instead of ossaHwRegWrite(agRoot, MSGU_ODMR, 0); */
24394e1bc9a0SAchim Leubner         /* Outbound Doorbell Auto disable */
24404e1bc9a0SAchim Leubner         /* LL does not use ossaHwRegWriteExt(agRoot, PCIBAR1, SPC_ODAR, 0xffffffff); */
24414e1bc9a0SAchim Leubner         if (config->outboundQueues[qIdx].interruptEnable)
24424e1bc9a0SAchim Leubner         {
24434e1bc9a0SAchim Leubner           /* enable interrupt flag bit30 of outbound table */
24444e1bc9a0SAchim Leubner           outQueueCfg.elementSizeCount |= OB_PROPERTY_INT_ENABLE;
24454e1bc9a0SAchim Leubner         }
24464e1bc9a0SAchim Leubner         if(smIS_SPCV(agRoot))
24474e1bc9a0SAchim Leubner         {
24484e1bc9a0SAchim Leubner           outQueueCfg.interruptVecCntDelay = ((config->outboundQueues[qIdx].interruptVector    & INT_VEC_BITS  ) << SHIFT24);
24494e1bc9a0SAchim Leubner         }
24504e1bc9a0SAchim Leubner         else
24514e1bc9a0SAchim Leubner         {
24524e1bc9a0SAchim Leubner           outQueueCfg.interruptVecCntDelay =  (config->outboundQueues[qIdx].interruptDelay     & INT_DELAY_BITS)             |
24534e1bc9a0SAchim Leubner                                              ((config->outboundQueues[qIdx].interruptThreshold & INT_THR_BITS  ) << SHIFT16) |
24544e1bc9a0SAchim Leubner                                              ((config->outboundQueues[qIdx].interruptVector    & INT_VEC_BITS  ) << SHIFT24);
24554e1bc9a0SAchim Leubner         }
24564e1bc9a0SAchim Leubner 
24574e1bc9a0SAchim Leubner         /* create a VectorIndex Bit Map */
24584e1bc9a0SAchim Leubner         if (qIdx < OQ_NUM_32)
24594e1bc9a0SAchim Leubner         {
24604e1bc9a0SAchim Leubner           saRoot->interruptVecIndexBitMap[config->outboundQueues[qIdx].interruptVector] |= (1 << qIdx);
24614e1bc9a0SAchim Leubner           SA_DBG2(("mpiInitialize:below 32 saRoot->interruptVecIndexBitMap[config->outboundQueues[qIdx].interruptVector] 0x%08x\n",saRoot->interruptVecIndexBitMap[config->outboundQueues[qIdx].interruptVector]));
24624e1bc9a0SAchim Leubner         }
24634e1bc9a0SAchim Leubner         else
24644e1bc9a0SAchim Leubner         {
24654e1bc9a0SAchim Leubner           saRoot->interruptVecIndexBitMap1[config->outboundQueues[qIdx].interruptVector] |= (1 << (qIdx - OQ_NUM_32));
24664e1bc9a0SAchim Leubner           SA_DBG2(("mpiInitialize:Above 32 saRoot->interruptVecIndexBitMap1[config->outboundQueues[qIdx].interruptVector] 0x%08x\n",saRoot->interruptVecIndexBitMap1[config->outboundQueues[qIdx].interruptVector]));
24674e1bc9a0SAchim Leubner         }
24684e1bc9a0SAchim Leubner         /* Update the outbound configuration table */
24694e1bc9a0SAchim Leubner         mpiUpdateOBQueueCfgTable(agRoot, &outQueueCfg, MSGUCfgTblDWIdx, pcibar);
24704e1bc9a0SAchim Leubner 
24714e1bc9a0SAchim Leubner         /* read the CI PCIBar offset and convert it to logical bar */
24724e1bc9a0SAchim Leubner         OB_CIPCIBar = ossaHwRegReadExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + OB_CIPCI_BAR));
24734e1bc9a0SAchim Leubner         saRoot->outboundQueue[qIdx].CIPCIBar    = mpiGetPCIBarIndex(agRoot, OB_CIPCIBar);
24744e1bc9a0SAchim Leubner         saRoot->outboundQueue[qIdx].CIPCIOffset = ossaHwRegReadExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + OB_CIPCI_BAR_OFFSET));
24754e1bc9a0SAchim Leubner         saRoot->outboundQueue[qIdx].DIntTOffset = ossaHwRegReadExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + OB_DYNAMIC_COALES_OFFSET));
24764e1bc9a0SAchim Leubner         saRoot->outboundQueue[qIdx].qNumber      = qIdx;
24774e1bc9a0SAchim Leubner 
24784e1bc9a0SAchim Leubner         memOffset += memSize;
24794e1bc9a0SAchim Leubner 
24804e1bc9a0SAchim Leubner         if ((0 == ((qIdx + 1) % MAX_QUEUE_EACH_MEM)) ||
24814e1bc9a0SAchim Leubner             (qIdx == (maxoutbound - 1)))
24824e1bc9a0SAchim Leubner         {
24834e1bc9a0SAchim Leubner           mIdx++;
24844e1bc9a0SAchim Leubner           indexoffset += MAX_QUEUE_EACH_MEM;
24854e1bc9a0SAchim Leubner           memOffset =0;
24864e1bc9a0SAchim Leubner         }
24874e1bc9a0SAchim Leubner       }
24884e1bc9a0SAchim Leubner     }
24894e1bc9a0SAchim Leubner   }
24904e1bc9a0SAchim Leubner 
24914e1bc9a0SAchim Leubner   /* calculate number of vectors */
24924e1bc9a0SAchim Leubner   saRoot->numInterruptVectors = 0;
24934e1bc9a0SAchim Leubner   for (qIdx = 0; qIdx < MAX_NUM_VECTOR; qIdx++)
24944e1bc9a0SAchim Leubner   {
24954e1bc9a0SAchim Leubner     if ((saRoot->interruptVecIndexBitMap[qIdx]) || (saRoot->interruptVecIndexBitMap1[qIdx]))
24964e1bc9a0SAchim Leubner     {
24974e1bc9a0SAchim Leubner       (saRoot->numInterruptVectors)++;
24984e1bc9a0SAchim Leubner     }
24994e1bc9a0SAchim Leubner   }
25004e1bc9a0SAchim Leubner 
25014e1bc9a0SAchim Leubner   SA_DBG2(("mpiInitialize:(saRoot->numInterruptVectors) 0x%x\n",(saRoot->numInterruptVectors)));
25024e1bc9a0SAchim Leubner 
25034e1bc9a0SAchim Leubner   if(smIS_SPCV(agRoot))
25044e1bc9a0SAchim Leubner   {
25054e1bc9a0SAchim Leubner     /* setup interrupt vector table  */
25064e1bc9a0SAchim Leubner     mpiWrIntVecTable(agRoot,config);
25074e1bc9a0SAchim Leubner   }
25084e1bc9a0SAchim Leubner 
25094e1bc9a0SAchim Leubner   if(smIS_SPCV(agRoot))
25104e1bc9a0SAchim Leubner   {
25114e1bc9a0SAchim Leubner     mpiWrAnalogSetupTable(agRoot,config);
25124e1bc9a0SAchim Leubner   }
25134e1bc9a0SAchim Leubner 
25144e1bc9a0SAchim Leubner   /* setup phy analog registers */
25154e1bc9a0SAchim Leubner   mpiWriteCALAll(agRoot, &config->phyAnalogConfig);
25164e1bc9a0SAchim Leubner 
25174e1bc9a0SAchim Leubner   {
25184e1bc9a0SAchim Leubner     bit32 pcibar = 0;
25194e1bc9a0SAchim Leubner     bit32 TableOffset;
25204e1bc9a0SAchim Leubner     pcibar = siGetPciBar(agRoot);
25214e1bc9a0SAchim Leubner     TableOffset = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_0,MSGU_SCRATCH_PAD_0);
25224e1bc9a0SAchim Leubner     TableOffset &= SCRATCH_PAD0_OFFSET_MASK;
25234e1bc9a0SAchim Leubner     SA_DBG1(("mpiInitialize: mpiContextTable TableOffset 0x%08X contains 0x%08X\n",TableOffset,ossaHwRegReadExt(agRoot, pcibar, TableOffset )));
25244e1bc9a0SAchim Leubner 
25254e1bc9a0SAchim Leubner     SA_ASSERT( (ossaHwRegReadExt(agRoot, pcibar, TableOffset ) == 0x53434D50), "Config table signiture");
25264e1bc9a0SAchim Leubner 
25274e1bc9a0SAchim Leubner     SA_DBG1(("mpiInitialize: AGSA_MPI_MAIN_CONFIGURATION_TABLE           0x%08X\n", 0));
25284e1bc9a0SAchim Leubner     SA_DBG1(("mpiInitialize: AGSA_MPI_GENERAL_STATUS_TABLE               0x%08X\n", (ossaHwRegReadExt(agRoot, pcibar, TableOffset+MAIN_GST_OFFSET) & 0xFFFF )));
25294e1bc9a0SAchim Leubner     SA_DBG1(("mpiInitialize: AGSA_MPI_INBOUND_QUEUE_CONFIGURATION_TABLE  0x%08X\n", (ossaHwRegReadExt(agRoot, pcibar, TableOffset+MAIN_IBQ_OFFSET)  & 0xFFFF)));
25304e1bc9a0SAchim Leubner     SA_DBG1(("mpiInitialize: AGSA_MPI_OUTBOUND_QUEUE_CONFIGURATION_TABLE 0x%08X\n", (ossaHwRegReadExt(agRoot, pcibar, TableOffset+MAIN_OBQ_OFFSET)  & 0xFFFF)));
25314e1bc9a0SAchim Leubner     SA_DBG1(("mpiInitialize: AGSA_MPI_SAS_PHY_ANALOG_SETUP_TABLE         0x%08X\n", (ossaHwRegReadExt(agRoot, pcibar, TableOffset+MAIN_ANALOG_SETUP_OFFSET) & 0xFFFF )));
25324e1bc9a0SAchim Leubner     SA_DBG1(("mpiInitialize: AGSA_MPI_INTERRUPT_VECTOR_TABLE             0x%08X\n", (ossaHwRegReadExt(agRoot, pcibar, TableOffset+MAIN_INT_VEC_TABLE_OFFSET) & 0xFFFF)));
25334e1bc9a0SAchim Leubner     SA_DBG1(("mpiInitialize: AGSA_MPI_PER_SAS_PHY_ATTRIBUTE_TABLE        0x%08X\n", (ossaHwRegReadExt(agRoot, pcibar, TableOffset+MAIN_PHY_ATTRIBUTE_OFFSET) & 0xFFFF)));
25344e1bc9a0SAchim Leubner     SA_DBG1(("mpiInitialize: AGSA_MPI_OUTBOUND_QUEUE_FAILOVER_TABLE      0x%08X\n", (ossaHwRegReadExt(agRoot, pcibar, TableOffset+MAIN_MOQFOT_MOQFOES) & 0xFFFF)));
25354e1bc9a0SAchim Leubner 
25364e1bc9a0SAchim Leubner   }
25374e1bc9a0SAchim Leubner 
25384e1bc9a0SAchim Leubner   if(agNULL !=  saRoot->swConfig.mpiContextTable )
25394e1bc9a0SAchim Leubner   {
25404e1bc9a0SAchim Leubner     agsaMPIContext_t * context = (agsaMPIContext_t * )saRoot->swConfig.mpiContextTable;
25414e1bc9a0SAchim Leubner     bit32 length = saRoot->swConfig.mpiContextTablelen;
25424e1bc9a0SAchim Leubner     bit32 pcibar = 0;
25434e1bc9a0SAchim Leubner     bit32 TableOffset;
25444e1bc9a0SAchim Leubner     pcibar = siGetPciBar(agRoot);
25454e1bc9a0SAchim Leubner     TableOffset = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_0,MSGU_SCRATCH_PAD_0);
25464e1bc9a0SAchim Leubner     TableOffset &= SCRATCH_PAD0_OFFSET_MASK;
25474e1bc9a0SAchim Leubner     SA_DBG1(("mpiInitialize: mpiContextTable TableOffset 0x%08X contains 0x%08X\n",TableOffset,ossaHwRegReadExt(agRoot, pcibar, TableOffset )));
25484e1bc9a0SAchim Leubner 
25494e1bc9a0SAchim Leubner     SA_ASSERT( (ossaHwRegReadExt(agRoot, pcibar, TableOffset ) == 0x53434D50), "Config table signiture");
25504e1bc9a0SAchim Leubner     if ( (ossaHwRegReadExt(agRoot, pcibar, TableOffset ) != 0x53434D50))
25514e1bc9a0SAchim Leubner     {
25524e1bc9a0SAchim Leubner       SA_DBG1(("mpiInitialize: TableOffset 0x%x reads 0x%x expect 0x%x \n",TableOffset,ossaHwRegReadExt(agRoot, pcibar, TableOffset ),0x53434D50));
25534e1bc9a0SAchim Leubner     }
25544e1bc9a0SAchim Leubner 
25554e1bc9a0SAchim Leubner     if(context )
25564e1bc9a0SAchim Leubner     {
25574e1bc9a0SAchim Leubner       SA_DBG1(("mpiInitialize: MPITableType 0x%x context->offset 0x%x context->value 0x%x\n",context->MPITableType,context->offset,context->value));
25584e1bc9a0SAchim Leubner       while( length != 0)
25594e1bc9a0SAchim Leubner       {
25604e1bc9a0SAchim Leubner         switch(context->MPITableType)
25614e1bc9a0SAchim Leubner         {
25624e1bc9a0SAchim Leubner 
25634e1bc9a0SAchim Leubner         bit32 OffsetInMain;
25644e1bc9a0SAchim Leubner         case AGSA_MPI_MAIN_CONFIGURATION_TABLE:
25654e1bc9a0SAchim Leubner           SA_DBG1(("mpiInitialize:  AGSA_MPI_MAIN_CONFIGURATION_TABLE %d 0x%x + 0x%x = 0x%x\n",context->MPITableType,TableOffset, context->offset, context->value));
25664e1bc9a0SAchim Leubner           OffsetInMain = TableOffset;
25674e1bc9a0SAchim Leubner           ossaHwRegWriteExt(agRoot, pcibar, OffsetInMain + (context->offset * 4) , context->value);
25684e1bc9a0SAchim Leubner           break;
25694e1bc9a0SAchim Leubner         case AGSA_MPI_GENERAL_STATUS_TABLE:
25704e1bc9a0SAchim Leubner           SA_DBG1(("mpiInitialize: AGSA_MPI_GENERAL_STATUS_TABLE %d offset 0x%x + 0x%x = 0x%x\n",context->MPITableType ,TableOffset+MAIN_GST_OFFSET, context->offset, context->value  ));
25714e1bc9a0SAchim Leubner           OffsetInMain = (ossaHwRegReadExt(agRoot, pcibar, TableOffset+MAIN_GST_OFFSET ) & 0xFFFF) + TableOffset;
25724e1bc9a0SAchim Leubner           ossaHwRegWriteExt(agRoot, pcibar, OffsetInMain + (context->offset * 4), context->value);
25734e1bc9a0SAchim Leubner           break;
25744e1bc9a0SAchim Leubner         case AGSA_MPI_INBOUND_QUEUE_CONFIGURATION_TABLE:
25754e1bc9a0SAchim Leubner           SA_DBG1(("mpiInitialize: AGSA_MPI_INBOUND_QUEUE_CONFIGURATION_TABLE %d offset 0x%x + 0x%x = 0x%x\n",context->MPITableType,TableOffset+MAIN_IBQ_OFFSET, context->offset, context->value));
25764e1bc9a0SAchim Leubner           OffsetInMain = (ossaHwRegReadExt(agRoot, pcibar, TableOffset+MAIN_IBQ_OFFSET ) & 0xFFFF)  + TableOffset;
25774e1bc9a0SAchim Leubner           ossaHwRegWriteExt(agRoot, pcibar, OffsetInMain + (context->offset * 4), context->value);
25784e1bc9a0SAchim Leubner           break;
25794e1bc9a0SAchim Leubner         case AGSA_MPI_OUTBOUND_QUEUE_CONFIGURATION_TABLE:
25804e1bc9a0SAchim Leubner           SA_DBG1(("mpiInitialize: AGSA_MPI_OUTBOUND_QUEUE_CONFIGURATION_TABLE %d offset 0x%x + 0x%x = 0x%x\n",context->MPITableType,TableOffset+MAIN_OBQ_OFFSET, context->offset, context->value));
25814e1bc9a0SAchim Leubner           OffsetInMain = (ossaHwRegReadExt(agRoot, pcibar, TableOffset+MAIN_OBQ_OFFSET ) & 0xFFFF)  + TableOffset;
25824e1bc9a0SAchim Leubner           ossaHwRegWriteExt(agRoot, pcibar, OffsetInMain + (context->offset * 4), context->value);
25834e1bc9a0SAchim Leubner           break;
25844e1bc9a0SAchim Leubner         case AGSA_MPI_SAS_PHY_ANALOG_SETUP_TABLE:
25854e1bc9a0SAchim Leubner           SA_DBG1(("mpiInitialize: AGSA_MPI_SAS_PHY_ANALOG_SETUP_TABLE %d offset 0x%x + 0x%x = 0x%x\n",context->MPITableType,TableOffset+MAIN_ANALOG_SETUP_OFFSET, context->offset, context->value));
25864e1bc9a0SAchim Leubner           OffsetInMain = (ossaHwRegReadExt(agRoot, pcibar, TableOffset+ MAIN_ANALOG_SETUP_OFFSET) & 0xFFFF)  + TableOffset;
25874e1bc9a0SAchim Leubner           ossaHwRegWriteExt(agRoot, pcibar, OffsetInMain + (context->offset * 4), context->value);
25884e1bc9a0SAchim Leubner           break;
25894e1bc9a0SAchim Leubner         case AGSA_MPI_INTERRUPT_VECTOR_TABLE:
25904e1bc9a0SAchim Leubner           SA_DBG1(("mpiInitialize: AGSA_MPI_INTERRUPT_VECTOR_TABLE %d offset 0x%x + 0x%x = 0x%x\n",context->MPITableType,TableOffset+MAIN_INT_VEC_TABLE_OFFSET, context->offset, context->value));
25914e1bc9a0SAchim Leubner           OffsetInMain = (ossaHwRegReadExt(agRoot, pcibar, TableOffset+ MAIN_INT_VEC_TABLE_OFFSET) & 0xFFFF)  + TableOffset;
25924e1bc9a0SAchim Leubner           ossaHwRegWriteExt(agRoot, pcibar, OffsetInMain + (context->offset * 4), context->value);
25934e1bc9a0SAchim Leubner           break;
25944e1bc9a0SAchim Leubner         case AGSA_MPI_PER_SAS_PHY_ATTRIBUTE_TABLE:
25954e1bc9a0SAchim Leubner           SA_DBG1(("mpiInitialize: AGSA_MPI_PER_SAS_PHY_ATTRIBUTE_TABLE %d offset 0x%x + 0x%x = 0x%x\n",context->MPITableType,TableOffset+MAIN_PHY_ATTRIBUTE_OFFSET, context->offset, context->value));
25964e1bc9a0SAchim Leubner           OffsetInMain = (ossaHwRegReadExt(agRoot, pcibar, TableOffset+MAIN_PHY_ATTRIBUTE_OFFSET ) & 0xFFFF)  + TableOffset;
25974e1bc9a0SAchim Leubner           ossaHwRegWriteExt(agRoot, pcibar, OffsetInMain + (context->offset * 4), context->value);
25984e1bc9a0SAchim Leubner           break;
25994e1bc9a0SAchim Leubner         case AGSA_MPI_OUTBOUND_QUEUE_FAILOVER_TABLE:
26004e1bc9a0SAchim Leubner           SA_DBG1(("mpiInitialize: AGSA_MPI_OUTBOUND_QUEUE_FAILOVER_TABLE %d offset 0x%x + 0x%x = 0x%x\n",context->MPITableType,TableOffset+MAIN_MOQFOT_MOQFOES, context->offset, context->value));
26014e1bc9a0SAchim Leubner           OffsetInMain = (ossaHwRegReadExt(agRoot, pcibar, TableOffset+MAIN_MOQFOT_MOQFOES ) & 0xFFFF)  + TableOffset;
26024e1bc9a0SAchim Leubner           ossaHwRegWriteExt(agRoot, pcibar, OffsetInMain + (context->offset * 4), context->value);
26034e1bc9a0SAchim Leubner           break;
26044e1bc9a0SAchim Leubner         default:
26054e1bc9a0SAchim Leubner           SA_DBG1(("mpiInitialize: error MPITableType unknown %d offset 0x%x value 0x%x\n",context->MPITableType, context->offset, context->value));
26064e1bc9a0SAchim Leubner           break;
26074e1bc9a0SAchim Leubner         }
26084e1bc9a0SAchim Leubner         if(smIS_SPC12V(agRoot))
26094e1bc9a0SAchim Leubner         {
26104e1bc9a0SAchim Leubner           if (saRoot->ControllerInfo.fwInterfaceRev > 0x301 )
26114e1bc9a0SAchim Leubner           {
26124e1bc9a0SAchim Leubner             SA_DBG1(("mpiInitialize: MAIN_AWT_MIDRANGE 0x%08X\n",
26134e1bc9a0SAchim Leubner                     ossaHwRegReadExt(agRoot, pcibar, TableOffset + MAIN_AWT_MIDRANGE)
26144e1bc9a0SAchim Leubner                      ));
26154e1bc9a0SAchim Leubner           }
26164e1bc9a0SAchim Leubner         }
26174e1bc9a0SAchim Leubner         if(length >= sizeof(agsaMPIContext_t))
26184e1bc9a0SAchim Leubner         {
26194e1bc9a0SAchim Leubner           length -= sizeof(agsaMPIContext_t);
26204e1bc9a0SAchim Leubner           context++;
26214e1bc9a0SAchim Leubner 
26224e1bc9a0SAchim Leubner         }
26234e1bc9a0SAchim Leubner         else
26244e1bc9a0SAchim Leubner         {
26254e1bc9a0SAchim Leubner           length = 0;
26264e1bc9a0SAchim Leubner         }
26274e1bc9a0SAchim Leubner       }
26284e1bc9a0SAchim Leubner 
26294e1bc9a0SAchim Leubner     }
26304e1bc9a0SAchim Leubner 
26314e1bc9a0SAchim Leubner     SA_DBG1(("mpiInitialize:  context %p saRoot->swConfig.mpiContextTable %p %d\n",context,saRoot->swConfig.mpiContextTable,context == saRoot->swConfig.mpiContextTable ? 1 : 0));
26324e1bc9a0SAchim Leubner 
26334e1bc9a0SAchim Leubner     if ( (ossaHwRegReadExt(agRoot, pcibar, TableOffset ) != 0x53434D50))
26344e1bc9a0SAchim Leubner     {
26354e1bc9a0SAchim Leubner       SA_DBG1(("mpiInitialize:TableOffset 0x%x reads 0x%x expect 0x%x \n",TableOffset,ossaHwRegReadExt(agRoot, pcibar, TableOffset ),0x53434D50));
26364e1bc9a0SAchim Leubner     }
26374e1bc9a0SAchim Leubner 
26384e1bc9a0SAchim Leubner     SA_ASSERT( (ossaHwRegReadExt(agRoot, pcibar, TableOffset ) == 0x53434D50), "Config table signiture After");
26394e1bc9a0SAchim Leubner   }
26404e1bc9a0SAchim Leubner   /* At this point the Message Unit configuration table is set up. Now we need to ring the doorbell */
26414e1bc9a0SAchim Leubner   togglevalue = 0;
26424e1bc9a0SAchim Leubner 
26434e1bc9a0SAchim Leubner   smTrace(hpDBG_VERY_LOUD,"74",  siHalRegReadExt(agRoot, GEN_MSGU_IBDB_SET, MSGU_IBDB_SET ));
26444e1bc9a0SAchim Leubner   /* TP:74 Doorbell */
26454e1bc9a0SAchim Leubner 
26464e1bc9a0SAchim Leubner   /* Write bit0=1 to Inbound DoorBell Register to tell the SPC FW the table is updated */
26474e1bc9a0SAchim Leubner   siHalRegWriteExt(agRoot, GEN_MSGU_IBDB_SET, MSGU_IBDB_SET, SPC_MSGU_CFG_TABLE_UPDATE);
26484e1bc9a0SAchim Leubner 
26494e1bc9a0SAchim Leubner   if(siHalRegReadExt(agRoot, GEN_MSGU_IBDB_SET, MSGU_IBDB_SET ) & SPC_MSGU_CFG_TABLE_UPDATE)
26504e1bc9a0SAchim Leubner   {
26514e1bc9a0SAchim Leubner     SA_DBG1(("mpiInitialize: SPC_MSGU_CFG_TABLE_UPDATE (0x%X) \n",  siHalRegReadExt(agRoot, GEN_MSGU_IBDB_SET, MSGU_IBDB_SET)));
26524e1bc9a0SAchim Leubner   }
26534e1bc9a0SAchim Leubner   else
26544e1bc9a0SAchim Leubner   {
26554e1bc9a0SAchim Leubner     SA_DBG1(("mpiInitialize: SPC_MSGU_CFG_TABLE_UPDATE not set (0x%X)\n",  siHalRegReadExt(agRoot, GEN_MSGU_IBDB_SET, MSGU_IBDB_SET)));
26564e1bc9a0SAchim Leubner     ossaStallThread(agRoot, WAIT_INCREMENT);
26574e1bc9a0SAchim Leubner   }
26584e1bc9a0SAchim Leubner 
26594e1bc9a0SAchim Leubner   smTrace(hpDBG_VERY_LOUD,"A5",  siHalRegReadExt(agRoot, GEN_MSGU_IBDB_SET, MSGU_IBDB_SET ));
26604e1bc9a0SAchim Leubner   /* TP:A5 Doorbell */
26614e1bc9a0SAchim Leubner 
26624e1bc9a0SAchim Leubner /*
26634e1bc9a0SAchim Leubner //  ossaHwRegWrite(agRoot, MSGU_IBDB_SET, SPC_MSGU_CFG_TABLE_UPDATE);
26644e1bc9a0SAchim Leubner   MSGU_WRITE_IDR(SPC_MSGU_CFG_TABLE_UPDATE);
26654e1bc9a0SAchim Leubner */
26664e1bc9a0SAchim Leubner 
26674e1bc9a0SAchim Leubner 
26684e1bc9a0SAchim Leubner   /* wait until Inbound DoorBell Clear Register toggled */
26694e1bc9a0SAchim Leubner WaitLonger:
26704e1bc9a0SAchim Leubner   max_wait_time = WAIT_SECONDS(gWait_2);  /* 2 sec */
26714e1bc9a0SAchim Leubner   max_wait_count = MAKE_MODULO(max_wait_time,WAIT_INCREMENT);
26724e1bc9a0SAchim Leubner   do
26734e1bc9a0SAchim Leubner   {
26744e1bc9a0SAchim Leubner     ossaStallThread(agRoot, WAIT_INCREMENT);
26754e1bc9a0SAchim Leubner     value = MSGU_READ_IDR;
26764e1bc9a0SAchim Leubner     value &= SPC_MSGU_CFG_TABLE_UPDATE;
26774e1bc9a0SAchim Leubner   } while ((value != togglevalue) && (max_wait_count -= WAIT_INCREMENT));
26784e1bc9a0SAchim Leubner 
26794e1bc9a0SAchim Leubner   smTrace(hpDBG_VERY_LOUD,"80", max_wait_count);
26804e1bc9a0SAchim Leubner   /* TP:80 TP max_wait_count */
26814e1bc9a0SAchim Leubner   if (!max_wait_count &&  mpiStartToggleFailed < 5 )
26824e1bc9a0SAchim Leubner   {
26834e1bc9a0SAchim Leubner      SA_DBG1(("mpiInitialize: mpiStartToggleFailed  count %d\n", mpiStartToggleFailed));
26844e1bc9a0SAchim Leubner      mpiStartToggleFailed++;
26854e1bc9a0SAchim Leubner     goto WaitLonger;
26864e1bc9a0SAchim Leubner   }
26874e1bc9a0SAchim Leubner 
26884e1bc9a0SAchim Leubner   if (!max_wait_count )
26894e1bc9a0SAchim Leubner   {
26904e1bc9a0SAchim Leubner 
26914e1bc9a0SAchim Leubner     SA_DBG1(("mpiInitialize: TIMEOUT:IBDB value/toggle = 0x%x 0x%x\n", value, togglevalue));
26924e1bc9a0SAchim Leubner     MSGUCfgTblDWIdx = saveOffset;
26934e1bc9a0SAchim Leubner     GSTLenMPIS = ossaHwRegReadExt(agRoot, pcibar, (bit32)MSGUCfgTblDWIdx + (bit32)(mainCfg.GSTOffset + GST_GSTLEN_MPIS_OFFSET));
26944e1bc9a0SAchim Leubner     SA_DBG1(("mpiInitialize: MPI State = 0x%x\n", GSTLenMPIS));
26954e1bc9a0SAchim Leubner     smTraceFuncExit(hpDBG_VERY_LOUD, 'f', "m3");
26964e1bc9a0SAchim Leubner     return AGSA_RC_FAILURE;
26974e1bc9a0SAchim Leubner   }
26984e1bc9a0SAchim Leubner   smTrace(hpDBG_VERY_LOUD,"81", mpiStartToggleFailed );
26994e1bc9a0SAchim Leubner   /* TP:81 TP */
27004e1bc9a0SAchim Leubner 
27014e1bc9a0SAchim Leubner   /* check the MPI-State for initialization */
27024e1bc9a0SAchim Leubner   MSGUCfgTblDWIdx = saveOffset;
27034e1bc9a0SAchim Leubner   GSTLenMPIS = ossaHwRegReadExt(agRoot, pcibar, (bit32)MSGUCfgTblDWIdx + (bit32)(mainCfg.GSTOffset + GST_GSTLEN_MPIS_OFFSET));
27044e1bc9a0SAchim Leubner   if ( (GST_MPI_STATE_UNINIT == (GSTLenMPIS & GST_MPI_STATE_MASK)) && ( mpiUnInitFailed < 5 ) )
27054e1bc9a0SAchim Leubner   {
27064e1bc9a0SAchim Leubner     SA_DBG1(("mpiInitialize: MPI State = 0x%x mpiUnInitFailed count %d\n", GSTLenMPIS & GST_MPI_STATE_MASK,mpiUnInitFailed));
27074e1bc9a0SAchim Leubner     ossaStallThread(agRoot, (20 * 1000));
27084e1bc9a0SAchim Leubner 
27094e1bc9a0SAchim Leubner     mpiUnInitFailed++;
27104e1bc9a0SAchim Leubner     goto WaitLonger;
27114e1bc9a0SAchim Leubner   }
27124e1bc9a0SAchim Leubner 
27134e1bc9a0SAchim Leubner   if (GST_MPI_STATE_INIT != (GSTLenMPIS & GST_MPI_STATE_MASK))
27144e1bc9a0SAchim Leubner   {
27154e1bc9a0SAchim Leubner     SA_DBG1(("mpiInitialize: Error Not GST_MPI_STATE_INIT MPI State = 0x%x\n", GSTLenMPIS & GST_MPI_STATE_MASK));
27164e1bc9a0SAchim Leubner     smTraceFuncExit(hpDBG_VERY_LOUD, 'g', "m3");
27174e1bc9a0SAchim Leubner     return AGSA_RC_FAILURE;
27184e1bc9a0SAchim Leubner   }
27194e1bc9a0SAchim Leubner   smTrace(hpDBG_VERY_LOUD,"82", 0);
27204e1bc9a0SAchim Leubner   /* TP:82 TP */
27214e1bc9a0SAchim Leubner 
27224e1bc9a0SAchim Leubner   /* check MPI Initialization error */
27234e1bc9a0SAchim Leubner   GSTLenMPIS = GSTLenMPIS >> SHIFT16;
27244e1bc9a0SAchim Leubner   if (0x0000 != GSTLenMPIS)
27254e1bc9a0SAchim Leubner   {
27264e1bc9a0SAchim Leubner     SA_DBG1(("mpiInitialize: MPI Error = 0x%x\n", GSTLenMPIS));
27274e1bc9a0SAchim Leubner     smTraceFuncExit(hpDBG_VERY_LOUD, 'h', "m3");
27284e1bc9a0SAchim Leubner     return AGSA_RC_FAILURE;
27294e1bc9a0SAchim Leubner   }
27304e1bc9a0SAchim Leubner   smTrace(hpDBG_VERY_LOUD,"83", 0);
27314e1bc9a0SAchim Leubner   /* TP:83 TP */
27324e1bc9a0SAchim Leubner 
27334e1bc9a0SAchim Leubner   /* reread IQ PI offset from SPC if IQ/OQ > 32 */
27344e1bc9a0SAchim Leubner   if ((maxinbound > IQ_NUM_32) || (maxoutbound > OQ_NUM_32))
27354e1bc9a0SAchim Leubner   {
27364e1bc9a0SAchim Leubner     for(qIdx = 0; qIdx < maxinbound; qIdx++)
27374e1bc9a0SAchim Leubner     {
27384e1bc9a0SAchim Leubner       /* point back to the begin then plus offset to next queue */
27394e1bc9a0SAchim Leubner       MSGUCfgTblDWIdx = saveOffset;
27404e1bc9a0SAchim Leubner       MSGUCfgTblDWIdx += inboundoffset;
27414e1bc9a0SAchim Leubner       MSGUCfgTblDWIdx += (sizeof(spc_inboundQueueDescriptor_t) * qIdx);
27424e1bc9a0SAchim Leubner       saRoot->inboundQueue[qIdx].PIPCIOffset = ossaHwRegReadExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + IB_PIPCI_BAR_OFFSET));
27434e1bc9a0SAchim Leubner     }
27444e1bc9a0SAchim Leubner   }
27454e1bc9a0SAchim Leubner   smTrace(hpDBG_VERY_LOUD,"84", 0);
27464e1bc9a0SAchim Leubner   /* TP:84 TP */
27474e1bc9a0SAchim Leubner 
27484e1bc9a0SAchim Leubner   /* at least one inbound queue and one outbound queue enabled */
27494e1bc9a0SAchim Leubner   if ((0 == config->inboundQueues[0].numElements) || (0 == config->outboundQueues[0].numElements))
27504e1bc9a0SAchim Leubner   {
27514e1bc9a0SAchim Leubner     SA_DBG1(("mpiInitialize: Error,IQ0 or OQ0 have to enable\n"));
27524e1bc9a0SAchim Leubner     smTraceFuncExit(hpDBG_VERY_LOUD, 'i', "m3");
27534e1bc9a0SAchim Leubner     return AGSA_RC_FAILURE;
27544e1bc9a0SAchim Leubner   }
27554e1bc9a0SAchim Leubner   smTrace(hpDBG_VERY_LOUD,"85", 0);
27564e1bc9a0SAchim Leubner   /* TP:85 TP */
27574e1bc9a0SAchim Leubner 
27584e1bc9a0SAchim Leubner   /* clean the inbound queues */
27594e1bc9a0SAchim Leubner   for (i = 0; i < config->numInboundQueues; i ++)
27604e1bc9a0SAchim Leubner   {
27614e1bc9a0SAchim Leubner     if(0 != config->inboundQueues[i].numElements)
27624e1bc9a0SAchim Leubner     {
27634e1bc9a0SAchim Leubner       circularIQ = &saRoot->inboundQueue[i];
27644e1bc9a0SAchim Leubner       si_memset(circularIQ->memoryRegion.virtPtr, 0, circularIQ->memoryRegion.totalLength);
27654e1bc9a0SAchim Leubner       si_memset(saRoot->inboundQueue[i].ciPointer, 0, sizeof(bit32));
27664e1bc9a0SAchim Leubner 
27674e1bc9a0SAchim Leubner       if(smIS_SPCV(agRoot))
27684e1bc9a0SAchim Leubner       {
27694e1bc9a0SAchim Leubner         ossaHwRegWriteExt(circularIQ->agRoot, circularIQ->PIPCIBar, circularIQ->PIPCIOffset, 0);
27704e1bc9a0SAchim Leubner         SA_DBG1(("mpiInitialize:  SPC V writes IQ %2d offset 0x%x\n",i ,circularIQ->PIPCIOffset));
27714e1bc9a0SAchim Leubner       }
27724e1bc9a0SAchim Leubner     }
27734e1bc9a0SAchim Leubner   }
27744e1bc9a0SAchim Leubner   smTrace(hpDBG_VERY_LOUD,"86", 0);
27754e1bc9a0SAchim Leubner   /* TP:86 TP */
27764e1bc9a0SAchim Leubner 
27774e1bc9a0SAchim Leubner   /* clean the outbound queues */
27784e1bc9a0SAchim Leubner   for (i = 0; i < config->numOutboundQueues; i ++)
27794e1bc9a0SAchim Leubner   {
27804e1bc9a0SAchim Leubner     if(0 != config->outboundQueues[i].numElements)
27814e1bc9a0SAchim Leubner     {
27824e1bc9a0SAchim Leubner       circularOQ = &saRoot->outboundQueue[i];
27834e1bc9a0SAchim Leubner       si_memset(circularOQ->memoryRegion.virtPtr, 0, circularOQ->memoryRegion.totalLength);
27844e1bc9a0SAchim Leubner       si_memset(saRoot->outboundQueue[i].piPointer, 0, sizeof(bit32));
27854e1bc9a0SAchim Leubner       if(smIS_SPCV(agRoot))
27864e1bc9a0SAchim Leubner       {
27874e1bc9a0SAchim Leubner         ossaHwRegWriteExt(circularOQ->agRoot, circularOQ->CIPCIBar, circularOQ->CIPCIOffset, 0);
27884e1bc9a0SAchim Leubner         SA_DBG2(("mpiInitialize:  SPC V writes OQ %2d offset 0x%x\n",i ,circularOQ->CIPCIOffset));
27894e1bc9a0SAchim Leubner       }
27904e1bc9a0SAchim Leubner 
27914e1bc9a0SAchim Leubner     }
27924e1bc9a0SAchim Leubner   }
27934e1bc9a0SAchim Leubner 
27944e1bc9a0SAchim Leubner 
27954e1bc9a0SAchim Leubner   smTrace(hpDBG_VERY_LOUD,"75",0);
27964e1bc9a0SAchim Leubner   /* TP:75 AAP1 IOP */
27974e1bc9a0SAchim Leubner 
27984e1bc9a0SAchim Leubner   /* read back AAP1 and IOP event log address and size */
27994e1bc9a0SAchim Leubner   MSGUCfgTblDWIdx = saveOffset;
28004e1bc9a0SAchim Leubner   value = ossaHwRegReadExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_EVENT_LOG_ADDR_HI));
28014e1bc9a0SAchim Leubner   saRoot->mainConfigTable.upperEventLogAddress = value;
28024e1bc9a0SAchim Leubner   SA_DBG1(("mpiInitialize: upperEventLogAddress 0x%x\n", value));
28034e1bc9a0SAchim Leubner   value = ossaHwRegReadExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_EVENT_LOG_ADDR_LO));
28044e1bc9a0SAchim Leubner   saRoot->mainConfigTable.lowerEventLogAddress = value;
28054e1bc9a0SAchim Leubner   SA_DBG1(("mpiInitialize: lowerEventLogAddress 0x%x\n", value));
28064e1bc9a0SAchim Leubner   value = ossaHwRegReadExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_EVENT_LOG_BUFF_SIZE));
28074e1bc9a0SAchim Leubner   saRoot->mainConfigTable.eventLogSize = value;
28084e1bc9a0SAchim Leubner   SA_DBG1(("mpiInitialize: eventLogSize 0x%x\n", value));
28094e1bc9a0SAchim Leubner   value = ossaHwRegReadExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_EVENT_LOG_OPTION));
28104e1bc9a0SAchim Leubner   saRoot->mainConfigTable.eventLogOption = value;
28114e1bc9a0SAchim Leubner   SA_DBG1(("mpiInitialize: eventLogOption 0x%x\n", value));
28124e1bc9a0SAchim Leubner   SA_DBG1(("mpiInitialize: EventLog dd /p %08X`%08X L %x\n",saRoot->mainConfigTable.upperEventLogAddress,saRoot->mainConfigTable.lowerEventLogAddress,saRoot->mainConfigTable.eventLogSize/4 ));
28134e1bc9a0SAchim Leubner 
28144e1bc9a0SAchim Leubner   value = ossaHwRegReadExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_IOP_EVENT_LOG_ADDR_HI));
28154e1bc9a0SAchim Leubner   saRoot->mainConfigTable.upperIOPeventLogAddress = value;
28164e1bc9a0SAchim Leubner   SA_DBG1(("mpiInitialize: upperIOPLogAddress 0x%x\n", value));
28174e1bc9a0SAchim Leubner   value = ossaHwRegReadExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_IOP_EVENT_LOG_ADDR_LO));
28184e1bc9a0SAchim Leubner   saRoot->mainConfigTable.lowerIOPeventLogAddress = value;
28194e1bc9a0SAchim Leubner   SA_DBG1(("mpiInitialize: lowerIOPLogAddress 0x%x\n", value));
28204e1bc9a0SAchim Leubner   SA_DBG1(("mpiInitialize: IOPLog   dd /p %08X`%08X L %x\n",saRoot->mainConfigTable.upperIOPeventLogAddress,saRoot->mainConfigTable.lowerIOPeventLogAddress,saRoot->mainConfigTable.IOPeventLogSize/4 ));
28214e1bc9a0SAchim Leubner   value = ossaHwRegReadExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_IOP_EVENT_LOG_BUFF_SIZE));
28224e1bc9a0SAchim Leubner   saRoot->mainConfigTable.IOPeventLogSize = value;
28234e1bc9a0SAchim Leubner   SA_DBG1(("mpiInitialize: IOPeventLogSize 0x%x\n", value));
28244e1bc9a0SAchim Leubner   value = ossaHwRegReadExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_IOP_EVENT_LOG_OPTION));
28254e1bc9a0SAchim Leubner   saRoot->mainConfigTable.IOPeventLogOption = value;
28264e1bc9a0SAchim Leubner   SA_DBG1(("mpiInitialize: IOPeventLogOption 0x%x\n", value));
28274e1bc9a0SAchim Leubner   value = ossaHwRegReadExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_FATAL_ERROR_INTERRUPT));
28284e1bc9a0SAchim Leubner 
28294e1bc9a0SAchim Leubner #ifdef SA_PRINTOUT_IN_WINDBG
28304e1bc9a0SAchim Leubner #ifndef DBG
28314e1bc9a0SAchim Leubner   DbgPrint("mpiInitialize: EventLog (%d) dd /p %08X`%08X L %x\n",
28324e1bc9a0SAchim Leubner           saRoot->mainConfigTable.eventLogOption,
28334e1bc9a0SAchim Leubner           saRoot->mainConfigTable.upperEventLogAddress,
28344e1bc9a0SAchim Leubner           saRoot->mainConfigTable.lowerEventLogAddress,
28354e1bc9a0SAchim Leubner           saRoot->mainConfigTable.eventLogSize/4 );
28364e1bc9a0SAchim Leubner   DbgPrint("mpiInitialize: IOPLog   (%d) dd /p %08X`%08X L %x\n",
28374e1bc9a0SAchim Leubner           saRoot->mainConfigTable.IOPeventLogOption,
28384e1bc9a0SAchim Leubner           saRoot->mainConfigTable.upperIOPeventLogAddress,
28394e1bc9a0SAchim Leubner           saRoot->mainConfigTable.lowerIOPeventLogAddress,
28404e1bc9a0SAchim Leubner           saRoot->mainConfigTable.IOPeventLogSize/4 );
28414e1bc9a0SAchim Leubner #endif /* DBG  */
28424e1bc9a0SAchim Leubner #endif /* SA_PRINTOUT_IN_WINDBG  */
28434e1bc9a0SAchim Leubner 
28444e1bc9a0SAchim Leubner   saRoot->mainConfigTable.FatalErrorInterrupt = value;
28454e1bc9a0SAchim Leubner   smTrace(hpDBG_VERY_LOUD,"76",value);
28464e1bc9a0SAchim Leubner   /* TP:76 FatalErrorInterrupt */
28474e1bc9a0SAchim Leubner 
28484e1bc9a0SAchim Leubner   SA_DBG1(("mpiInitialize: hwConfig->hwOption %X\n", saRoot->hwConfig.hwOption  ));
28494e1bc9a0SAchim Leubner 
28504e1bc9a0SAchim Leubner   SA_DBG1(("mpiInitialize: FatalErrorInterrupt 0x%x\n", value));
28514e1bc9a0SAchim Leubner 
28524e1bc9a0SAchim Leubner   /* read back Register Dump offset and length */
28534e1bc9a0SAchim Leubner   value = ossaHwRegReadExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_FATAL_ERROR_RDUMP0_OFFSET));
28544e1bc9a0SAchim Leubner   saRoot->mainConfigTable.FatalErrorDumpOffset0 = value;
28554e1bc9a0SAchim Leubner   SA_DBG1(("mpiInitialize: FatalErrorDumpOffset0 0x%x\n", value));
28564e1bc9a0SAchim Leubner   value = ossaHwRegReadExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_FATAL_ERROR_RDUMP0_LENGTH));
28574e1bc9a0SAchim Leubner   saRoot->mainConfigTable.FatalErrorDumpLength0 = value;
28584e1bc9a0SAchim Leubner   SA_DBG1(("mpiInitialize: FatalErrorDumpLength0 0x%x\n", value));
28594e1bc9a0SAchim Leubner   value = ossaHwRegReadExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_FATAL_ERROR_RDUMP1_OFFSET));
28604e1bc9a0SAchim Leubner   saRoot->mainConfigTable.FatalErrorDumpOffset1 = value;
28614e1bc9a0SAchim Leubner   SA_DBG1(("mpiInitialize: FatalErrorDumpOffset1 0x%x\n", value));
28624e1bc9a0SAchim Leubner   value = ossaHwRegReadExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_FATAL_ERROR_RDUMP1_LENGTH));
28634e1bc9a0SAchim Leubner   saRoot->mainConfigTable.FatalErrorDumpLength1 = value;
28644e1bc9a0SAchim Leubner   SA_DBG1(("mpiInitialize: FatalErrorDumpLength1 0x%x\n", value));
28654e1bc9a0SAchim Leubner 
28664e1bc9a0SAchim Leubner   value = ossaHwRegReadExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_PRECTD_PRESETD));
28674e1bc9a0SAchim Leubner   saRoot->mainConfigTable.PortRecoveryTimerPortResetTimer = value;
28684e1bc9a0SAchim Leubner 
28694e1bc9a0SAchim Leubner   SA_DBG1(("mpiInitialize: PortRecoveryTimerPortResetTimer 0x%x\n", value));
28704e1bc9a0SAchim Leubner   value = ossaHwRegReadExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_IRAD_RESERVED));
28714e1bc9a0SAchim Leubner   saRoot->mainConfigTable.InterruptReassertionDelay = value;
28724e1bc9a0SAchim Leubner 
28734e1bc9a0SAchim Leubner   SA_DBG1(("mpiInitialize: InterruptReassertionDelay 0x%x\n", value));
28744e1bc9a0SAchim Leubner 
28754e1bc9a0SAchim Leubner 
28764e1bc9a0SAchim Leubner   if(smIS_SPCV(agRoot))
28774e1bc9a0SAchim Leubner   {
28784e1bc9a0SAchim Leubner     bit32 sp1;
28794e1bc9a0SAchim Leubner     sp1= ossaHwRegRead(agRoot,V_Scratchpad_1_Register );
28804e1bc9a0SAchim Leubner     if(SCRATCH_PAD1_V_ERROR_STATE(sp1))
28814e1bc9a0SAchim Leubner     {
28824e1bc9a0SAchim Leubner       SA_DBG1(("mpiInitialize: SCRATCH_PAD1_V_ERROR_STAT 0x%x\n",sp1 ));
28834e1bc9a0SAchim Leubner       ret = AGSA_RC_FAILURE;
28844e1bc9a0SAchim Leubner     }
28854e1bc9a0SAchim Leubner 
28864e1bc9a0SAchim Leubner   }
28874e1bc9a0SAchim Leubner 
28884e1bc9a0SAchim Leubner   smTraceFuncExit(hpDBG_VERY_LOUD, 'j', "m3");
28894e1bc9a0SAchim Leubner   return ret;
28904e1bc9a0SAchim Leubner }
28914e1bc9a0SAchim Leubner 
28924e1bc9a0SAchim Leubner /*******************************************************************************/
28934e1bc9a0SAchim Leubner /** \fn mpiWaitForConfigTable(agsaRoot_t *agRoot, spc_configMainDescriptor_t *config)
28944e1bc9a0SAchim Leubner  *  \brief Reading and Writing the Configuration Table
28954e1bc9a0SAchim Leubner  *  \param agsaRoot Pointer to a data structure containing LL layer context handles
28964e1bc9a0SAchim Leubner  *  \param config   Pointer to Configuration Table
28974e1bc9a0SAchim Leubner  *
28984e1bc9a0SAchim Leubner  * Return:
28994e1bc9a0SAchim Leubner  *         AGSA_RC_SUCCESS if read the configuration table from SPC sucessful
29004e1bc9a0SAchim Leubner  *         AGSA_RC_FAILURE if read the configuration table from SPC failed
29014e1bc9a0SAchim Leubner  */
29024e1bc9a0SAchim Leubner /*******************************************************************************/
mpiWaitForConfigTable(agsaRoot_t * agRoot,spc_configMainDescriptor_t * config)29034e1bc9a0SAchim Leubner GLOBAL bit32 mpiWaitForConfigTable(agsaRoot_t                 *agRoot,
29044e1bc9a0SAchim Leubner                                    spc_configMainDescriptor_t *config)
29054e1bc9a0SAchim Leubner {
29064e1bc9a0SAchim Leubner   agsaLLRoot_t  *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
29074e1bc9a0SAchim Leubner   bit32    MSGUCfgTblBase, ret = AGSA_RC_SUCCESS;
29084e1bc9a0SAchim Leubner   bit32    CfgTblDWIdx;
29094e1bc9a0SAchim Leubner   bit32    value, value1;
29104e1bc9a0SAchim Leubner   bit32    max_wait_time;
29114e1bc9a0SAchim Leubner   bit32    max_wait_count;
29124e1bc9a0SAchim Leubner   bit32    Signature, ExpSignature;
29134e1bc9a0SAchim Leubner   bit8     pcibar;
29144e1bc9a0SAchim Leubner 
29154e1bc9a0SAchim Leubner   SA_DBG2(("mpiWaitForConfigTable: Entering\n"));
29164e1bc9a0SAchim Leubner   SA_ASSERT(NULL != agRoot, "agRoot argument cannot be null");
29174e1bc9a0SAchim Leubner 
29184e1bc9a0SAchim Leubner   smTraceFuncEnter(hpDBG_VERY_LOUD,"m4");
29194e1bc9a0SAchim Leubner 
29204e1bc9a0SAchim Leubner 
29214e1bc9a0SAchim Leubner   /* check error state */
29224e1bc9a0SAchim Leubner   value = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_1,MSGU_SCRATCH_PAD_1);
29234e1bc9a0SAchim Leubner   value1 = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_2,MSGU_SCRATCH_PAD_2);
29244e1bc9a0SAchim Leubner 
29254e1bc9a0SAchim Leubner   if( smIS_SPC(agRoot) )
29264e1bc9a0SAchim Leubner   {
29274e1bc9a0SAchim Leubner     SA_DBG1(("mpiWaitForConfigTable: Waiting for SPC FW becoming ready.P1 0x%X P2 0x%X\n",value,value1));
29284e1bc9a0SAchim Leubner 
29294e1bc9a0SAchim Leubner   /* check AAP error */
29304e1bc9a0SAchim Leubner   if (SCRATCH_PAD1_ERR == (value & SCRATCH_PAD_STATE_MASK))
29314e1bc9a0SAchim Leubner   {
29324e1bc9a0SAchim Leubner     /* error state */
29334e1bc9a0SAchim Leubner     SA_DBG1(("mpiWaitForConfigTable: AAP error state and code 0x%x, ScratchPad2=0x%x\n", value, value1));
29344e1bc9a0SAchim Leubner #if defined(SALLSDK_DEBUG)
29354e1bc9a0SAchim Leubner     SA_DBG1(("mpiWaitForConfigTable: SCRATCH_PAD0 value = 0x%x\n", siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_0,MSGU_SCRATCH_PAD_0)));
29364e1bc9a0SAchim Leubner     SA_DBG1(("mpiWaitForConfigTable: SCRATCH_PAD3 value = 0x%x\n", siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_3,MSGU_SCRATCH_PAD_3)));
29374e1bc9a0SAchim Leubner #endif
29384e1bc9a0SAchim Leubner     smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "m4");
29394e1bc9a0SAchim Leubner     return AGSA_RC_FAILURE;
29404e1bc9a0SAchim Leubner   }
29414e1bc9a0SAchim Leubner 
29424e1bc9a0SAchim Leubner   /* check IOP error */
29434e1bc9a0SAchim Leubner   if (SCRATCH_PAD2_ERR == (value1 & SCRATCH_PAD_STATE_MASK))
29444e1bc9a0SAchim Leubner   {
29454e1bc9a0SAchim Leubner     /* error state */
29464e1bc9a0SAchim Leubner     SA_DBG1(("mpiWaitForConfigTable: IOP error state and code 0x%x, ScratchPad1=0x%x\n", value1, value));
29474e1bc9a0SAchim Leubner #if defined(SALLSDK_DEBUG)
29484e1bc9a0SAchim Leubner     SA_DBG1(("mpiWaitForConfigTable: SCRATCH_PAD0 value = 0x%x\n", siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_0,MSGU_SCRATCH_PAD_0)));
29494e1bc9a0SAchim Leubner     SA_DBG1(("mpiWaitForConfigTable: SCRATCH_PAD3 value = 0x%x\n", siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_3,MSGU_SCRATCH_PAD_3)));
29504e1bc9a0SAchim Leubner #endif
29514e1bc9a0SAchim Leubner     smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "m4");
29524e1bc9a0SAchim Leubner     return AGSA_RC_FAILURE;
29534e1bc9a0SAchim Leubner   }
29544e1bc9a0SAchim Leubner 
29554e1bc9a0SAchim Leubner   /* bit 4-31 of scratch pad1 should be zeros if it is not in error state */
29564e1bc9a0SAchim Leubner #ifdef DONT_DO /*                                                                        */
29574e1bc9a0SAchim Leubner   if (value & SCRATCH_PAD1_STATE_MASK)
29584e1bc9a0SAchim Leubner   {
29594e1bc9a0SAchim Leubner     /* error case */
29604e1bc9a0SAchim Leubner     SA_DBG1(("mpiWaitForConfigTable: wrong state failure, scratchPad1 0x%x\n", value));
29614e1bc9a0SAchim Leubner     SA_DBG1(("mpiWaitForConfigTable: ScratchPad0 AAP error code 0x%x\n", siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_0,MSGU_SCRATCH_PAD_0)));
29624e1bc9a0SAchim Leubner #if defined(SALLSDK_DEBUG)
29634e1bc9a0SAchim Leubner     SA_DBG1(("mpiWaitForConfigTable: SCRATCH_PAD2 value = 0x%x\n", siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_2,MSGU_SCRATCH_PAD_0)));
29644e1bc9a0SAchim Leubner     SA_DBG1(("mpiWaitForConfigTable: SCRATCH_PAD3 value = 0x%x\n", siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_3,MSGU_SCRATCH_PAD_3)));
29654e1bc9a0SAchim Leubner #endif
29664e1bc9a0SAchim Leubner     smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "m4");
29674e1bc9a0SAchim Leubner     return AGSA_RC_FAILURE;
29684e1bc9a0SAchim Leubner   }
29694e1bc9a0SAchim Leubner 
29704e1bc9a0SAchim Leubner   /* bit 4-31 of scratch pad2 should be zeros if it is not in error state */
29714e1bc9a0SAchim Leubner   if (value1 & SCRATCH_PAD2_STATE_MASK)
29724e1bc9a0SAchim Leubner   {
29734e1bc9a0SAchim Leubner     /* error case */
29744e1bc9a0SAchim Leubner     SA_DBG1(("mpiWaitForConfigTable: wrong state failure, scratchPad2 0x%x\n", value1));
29754e1bc9a0SAchim Leubner     SA_DBG1(("mpiWaitForConfigTable: ScratchPad3 IOP error code 0x%x\n",siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_3,MSGU_SCRATCH_PAD_3) ));
29764e1bc9a0SAchim Leubner #if defined(SALLSDK_DEBUG)
29774e1bc9a0SAchim Leubner     SA_DBG1(("mpiWaitForConfigTable: SCRATCH_PAD0 value = 0x%x\n", siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_0,MSGU_SCRATCH_PAD_0)));
29784e1bc9a0SAchim Leubner     SA_DBG1(("mpiWaitForConfigTable: SCRATCH_PAD1 value = 0x%x\n", siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_1,MSGU_SCRATCH_PAD_1)));
29794e1bc9a0SAchim Leubner #endif
29804e1bc9a0SAchim Leubner     smTraceFuncExit(hpDBG_VERY_LOUD, 'd', "m4");
29814e1bc9a0SAchim Leubner 
29824e1bc9a0SAchim Leubner     return AGSA_RC_FAILURE;
29834e1bc9a0SAchim Leubner   }
29844e1bc9a0SAchim Leubner #endif /* DONT_DO */
29854e1bc9a0SAchim Leubner 
29864e1bc9a0SAchim Leubner   /* checking the fw and IOP in ready state */
29874e1bc9a0SAchim Leubner   max_wait_time = WAIT_SECONDS(gWait_2);  /* 2 sec timeout */
29884e1bc9a0SAchim Leubner   max_wait_count = MAKE_MODULO(max_wait_time,WAIT_INCREMENT);
29894e1bc9a0SAchim Leubner   /* wait until scratch pad 1 and 2 registers in ready state  */
29904e1bc9a0SAchim Leubner   do
29914e1bc9a0SAchim Leubner   {
29924e1bc9a0SAchim Leubner     ossaStallThread(agRoot, WAIT_INCREMENT);
29934e1bc9a0SAchim Leubner     value =siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_1,MSGU_SCRATCH_PAD_1) & SCRATCH_PAD1_RDY;
29944e1bc9a0SAchim Leubner     value1 =siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_2,MSGU_SCRATCH_PAD_2)  & SCRATCH_PAD2_RDY;
29954e1bc9a0SAchim Leubner     if(smIS_SPCV(agRoot))
29964e1bc9a0SAchim Leubner     {
29974e1bc9a0SAchim Leubner       SA_DBG1(("mpiWaitForConfigTable:VEN_DEV_SPCV force  SCRATCH_PAD2 RDY 1 %08X 2 %08X\n" ,value,value1));
29984e1bc9a0SAchim Leubner       value1 =3;
29994e1bc9a0SAchim Leubner     }
30004e1bc9a0SAchim Leubner 
30014e1bc9a0SAchim Leubner     if ((max_wait_count -= WAIT_INCREMENT) == 0)
30024e1bc9a0SAchim Leubner     {
30034e1bc9a0SAchim Leubner       SA_DBG1(("mpiWaitForConfigTable: Timeout!! SCRATCH_PAD1/2 value = 0x%x 0x%x\n", value, value1));
30044e1bc9a0SAchim Leubner       break;
30054e1bc9a0SAchim Leubner     }
30064e1bc9a0SAchim Leubner   } while ((value != SCRATCH_PAD1_RDY) || (value1 != SCRATCH_PAD2_RDY));
30074e1bc9a0SAchim Leubner 
30084e1bc9a0SAchim Leubner   if (!max_wait_count)
30094e1bc9a0SAchim Leubner   {
30104e1bc9a0SAchim Leubner     SA_DBG1(("mpiWaitForConfigTable: timeout failure\n"));
30114e1bc9a0SAchim Leubner #if defined(SALLSDK_DEBUG)
30124e1bc9a0SAchim Leubner     SA_DBG1(("mpiWaitForConfigTable: SCRATCH_PAD0 value = 0x%x\n", siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_0,MSGU_SCRATCH_PAD_0)));
30134e1bc9a0SAchim Leubner     SA_DBG1(("mpiWaitForConfigTable: SCRATCH_PAD3 value = 0x%x\n", siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_3,MSGU_SCRATCH_PAD_3)));
30144e1bc9a0SAchim Leubner #endif
30154e1bc9a0SAchim Leubner     smTraceFuncExit(hpDBG_VERY_LOUD, 'e', "m4");
30164e1bc9a0SAchim Leubner     return AGSA_RC_FAILURE;
30174e1bc9a0SAchim Leubner   }
30184e1bc9a0SAchim Leubner 
30194e1bc9a0SAchim Leubner   }else
30204e1bc9a0SAchim Leubner   {
30214e1bc9a0SAchim Leubner 
30224e1bc9a0SAchim Leubner     if(((value & SCRATCH_PAD1_V_BOOTSTATE_HDA_SEEPROM ) == SCRATCH_PAD1_V_BOOTSTATE_HDA_SEEPROM))
30234e1bc9a0SAchim Leubner     {
30244e1bc9a0SAchim Leubner       SA_DBG1(("mpiWaitForConfigTable: HDA mode set in SEEPROM SP1 0x%X\n",value));
30254e1bc9a0SAchim Leubner     }
30264e1bc9a0SAchim Leubner     if(((value & SCRATCH_PAD1_V_READY) != SCRATCH_PAD1_V_READY) ||
30274e1bc9a0SAchim Leubner        (value == 0xffffffff))
30284e1bc9a0SAchim Leubner     {
30294e1bc9a0SAchim Leubner       SA_DBG1(("mpiWaitForConfigTable: Waiting for _V_ FW becoming ready.P1 0x%X P2 0x%X\n",value,value1));
30304e1bc9a0SAchim Leubner 
30314e1bc9a0SAchim Leubner       /* checking the fw and IOP in ready state */
30324e1bc9a0SAchim Leubner       max_wait_time = WAIT_SECONDS(gWait_2);  /* 2 sec timeout */
30334e1bc9a0SAchim Leubner       max_wait_count = MAKE_MODULO(max_wait_time,WAIT_INCREMENT);
30344e1bc9a0SAchim Leubner       /* wait until scratch pad 1 and 2 registers in ready state  */
30354e1bc9a0SAchim Leubner       do
30364e1bc9a0SAchim Leubner       {
30374e1bc9a0SAchim Leubner         ossaStallThread(agRoot, WAIT_INCREMENT);
30384e1bc9a0SAchim Leubner         value = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_1,MSGU_SCRATCH_PAD_1);
30394e1bc9a0SAchim Leubner         value1 = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_2,MSGU_SCRATCH_PAD_2);
30404e1bc9a0SAchim Leubner 
30414e1bc9a0SAchim Leubner         if ((max_wait_count -= WAIT_INCREMENT) == 0)
30424e1bc9a0SAchim Leubner         {
30434e1bc9a0SAchim Leubner           SA_DBG1(("mpiWaitForConfigTable: Timeout!! SCRATCH_PAD1/2 value = 0x%x 0x%x\n", value, value1));
30444e1bc9a0SAchim Leubner           return AGSA_RC_FAILURE;
30454e1bc9a0SAchim Leubner         }
30464e1bc9a0SAchim Leubner       } while (((value & SCRATCH_PAD1_V_READY) != SCRATCH_PAD1_V_READY) ||
30474e1bc9a0SAchim Leubner                (value == 0xffffffff));
30484e1bc9a0SAchim Leubner     }
30494e1bc9a0SAchim Leubner   }
30504e1bc9a0SAchim Leubner 
30514e1bc9a0SAchim Leubner 
30524e1bc9a0SAchim Leubner   SA_DBG1(("mpiWaitForConfigTable: FW Ready, SCRATCH_PAD1/2 value = 0x%x 0x%x\n", value, value1));
30534e1bc9a0SAchim Leubner 
30544e1bc9a0SAchim Leubner   /* read scratch pad0 to get PCI BAR and offset of configuration table */
30554e1bc9a0SAchim Leubner   MSGUCfgTblBase = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_0,MSGU_SCRATCH_PAD_0);
30564e1bc9a0SAchim Leubner   /* get offset */
30574e1bc9a0SAchim Leubner   CfgTblDWIdx = MSGUCfgTblBase & SCRATCH_PAD0_OFFSET_MASK;
30584e1bc9a0SAchim Leubner   /* get PCI BAR */
30594e1bc9a0SAchim Leubner   MSGUCfgTblBase = (MSGUCfgTblBase & SCRATCH_PAD0_BAR_MASK) >> SHIFT26;
30604e1bc9a0SAchim Leubner 
30614e1bc9a0SAchim Leubner   if(smIS_SPC(agRoot))
30624e1bc9a0SAchim Leubner   {
30634e1bc9a0SAchim Leubner     if( smIS_spc8081(agRoot))
30644e1bc9a0SAchim Leubner     {
30654e1bc9a0SAchim Leubner       if (BAR4 != MSGUCfgTblBase)
30664e1bc9a0SAchim Leubner       {
30674e1bc9a0SAchim Leubner         SA_DBG1(("mpiWaitForConfigTable: smIS_spc8081 PCI BAR is not BAR4, bar=0x%x - failure\n", MSGUCfgTblBase));
30684e1bc9a0SAchim Leubner         smTraceFuncExit(hpDBG_VERY_LOUD, 'f', "m4");
30694e1bc9a0SAchim Leubner         return AGSA_RC_FAILURE;
30704e1bc9a0SAchim Leubner       }
30714e1bc9a0SAchim Leubner     }
30724e1bc9a0SAchim Leubner     else
30734e1bc9a0SAchim Leubner     {
30744e1bc9a0SAchim Leubner       if (BAR5 != MSGUCfgTblBase)
30754e1bc9a0SAchim Leubner       {
30764e1bc9a0SAchim Leubner         SA_DBG1(("mpiWaitForConfigTable: PCI BAR is not BAR5, bar=0x%x - failure\n", MSGUCfgTblBase));
30774e1bc9a0SAchim Leubner         smTraceFuncExit(hpDBG_VERY_LOUD, 'g', "m4");
30784e1bc9a0SAchim Leubner         return AGSA_RC_FAILURE;
30794e1bc9a0SAchim Leubner       }
30804e1bc9a0SAchim Leubner     }
30814e1bc9a0SAchim Leubner   }
30824e1bc9a0SAchim Leubner 
30834e1bc9a0SAchim Leubner   /* convert the PCI BAR to logical bar number */
30844e1bc9a0SAchim Leubner   pcibar = (bit8)mpiGetPCIBarIndex(agRoot, MSGUCfgTblBase);
30854e1bc9a0SAchim Leubner 
30864e1bc9a0SAchim Leubner   /* read signature from the configuration table */
30874e1bc9a0SAchim Leubner   Signature = ossaHwRegReadExt(agRoot, pcibar, (bit32)CfgTblDWIdx);
30884e1bc9a0SAchim Leubner 
30894e1bc9a0SAchim Leubner   /* Error return if the signature is not "PMCS" */
30904e1bc9a0SAchim Leubner   ExpSignature = ('P') | ('M' << SHIFT8) | ('C' << SHIFT16) | ('S' << SHIFT24);
30914e1bc9a0SAchim Leubner 
30924e1bc9a0SAchim Leubner   if (Signature != ExpSignature)
30934e1bc9a0SAchim Leubner   {
30944e1bc9a0SAchim Leubner     SA_DBG1(("mpiWaitForConfigTable: Signature value = 0x%x\n", Signature));
30954e1bc9a0SAchim Leubner     smTraceFuncExit(hpDBG_VERY_LOUD, 'h', "m4");
30964e1bc9a0SAchim Leubner     return AGSA_RC_FAILURE;
30974e1bc9a0SAchim Leubner   }
30984e1bc9a0SAchim Leubner 
30994e1bc9a0SAchim Leubner   /* save Signature */
31004e1bc9a0SAchim Leubner   si_memcpy(&config->Signature, &Signature, sizeof(Signature));
31014e1bc9a0SAchim Leubner 
31024e1bc9a0SAchim Leubner   /* read Interface Revsion from the configuration table */
31034e1bc9a0SAchim Leubner   config->InterfaceRev = ossaHwRegReadExt(agRoot, pcibar, (bit32)CfgTblDWIdx + MAIN_INTERFACE_REVISION);
31044e1bc9a0SAchim Leubner 
31054e1bc9a0SAchim Leubner   /* read FW Revsion from the configuration table */
31064e1bc9a0SAchim Leubner   config->FWRevision = ossaHwRegReadExt(agRoot, pcibar, (bit32)CfgTblDWIdx + MAIN_FW_REVISION);
31074e1bc9a0SAchim Leubner 
31084e1bc9a0SAchim Leubner   /* read Max Outstanding IO from the configuration table */
31094e1bc9a0SAchim Leubner   config->MaxOutstandingIO = ossaHwRegReadExt(agRoot, pcibar, (bit32)CfgTblDWIdx + MAIN_MAX_OUTSTANDING_IO_OFFSET);
31104e1bc9a0SAchim Leubner 
31114e1bc9a0SAchim Leubner   /* read Max SGL and Max Devices from the configuration table */
31124e1bc9a0SAchim Leubner   config->MDevMaxSGL = ossaHwRegReadExt(agRoot, pcibar, (bit32)CfgTblDWIdx + MAIN_MAX_SGL_OFFSET);
31134e1bc9a0SAchim Leubner 
31144e1bc9a0SAchim Leubner   /* read Controller Cap Flags from the configuration table */
31154e1bc9a0SAchim Leubner   config->ContrlCapFlag = ossaHwRegReadExt(agRoot, pcibar, (bit32)CfgTblDWIdx + MAIN_CNTRL_CAP_OFFSET);
31164e1bc9a0SAchim Leubner 
31174e1bc9a0SAchim Leubner   /* read GST Table Offset from the configuration table */
31184e1bc9a0SAchim Leubner   config->GSTOffset = ossaHwRegReadExt(agRoot, pcibar, (bit32)CfgTblDWIdx + MAIN_GST_OFFSET);
31194e1bc9a0SAchim Leubner 
31204e1bc9a0SAchim Leubner   /* read Inbound Queue Offset from the configuration table */
31214e1bc9a0SAchim Leubner   config->inboundQueueOffset = ossaHwRegReadExt(agRoot, pcibar, (bit32)CfgTblDWIdx + MAIN_IBQ_OFFSET);
31224e1bc9a0SAchim Leubner 
31234e1bc9a0SAchim Leubner   /* read Outbound Queue Offset from the configuration table */
31244e1bc9a0SAchim Leubner   config->outboundQueueOffset = ossaHwRegReadExt(agRoot, pcibar, (bit32)CfgTblDWIdx + MAIN_OBQ_OFFSET);
31254e1bc9a0SAchim Leubner 
31264e1bc9a0SAchim Leubner 
31274e1bc9a0SAchim Leubner   if(smIS_SPCV(agRoot))
31284e1bc9a0SAchim Leubner   {
31294e1bc9a0SAchim Leubner     ;/* SPCV - reserved field */
31304e1bc9a0SAchim Leubner   }
31314e1bc9a0SAchim Leubner   else
31324e1bc9a0SAchim Leubner   {
31334e1bc9a0SAchim Leubner     /* read HDA Flags from the configuration table */
31344e1bc9a0SAchim Leubner     config->HDAModeFlags = ossaHwRegReadExt(agRoot, pcibar, (bit32)CfgTblDWIdx + MAIN_HDA_FLAGS_OFFSET);
31354e1bc9a0SAchim Leubner   }
31364e1bc9a0SAchim Leubner 
31374e1bc9a0SAchim Leubner   /* read analog Setting offset from the configuration table */
31384e1bc9a0SAchim Leubner   config->analogSetupTblOffset = ossaHwRegReadExt(agRoot, pcibar, (bit32)CfgTblDWIdx + MAIN_ANALOG_SETUP_OFFSET);
31394e1bc9a0SAchim Leubner 
31404e1bc9a0SAchim Leubner   if(smIS_SPCV(agRoot))
31414e1bc9a0SAchim Leubner   {
31424e1bc9a0SAchim Leubner     ;/* SPCV - reserved field */
31434e1bc9a0SAchim Leubner     /* read interrupt vector table offset */
31444e1bc9a0SAchim Leubner     config->InterruptVecTblOffset = ossaHwRegReadExt(agRoot, pcibar, (bit32)CfgTblDWIdx + MAIN_INT_VEC_TABLE_OFFSET);
31454e1bc9a0SAchim Leubner     /* read phy attribute table offset */
31464e1bc9a0SAchim Leubner     config->phyAttributeTblOffset = ossaHwRegReadExt(agRoot, pcibar, (bit32)CfgTblDWIdx + MAIN_PHY_ATTRIBUTE_OFFSET);
31474e1bc9a0SAchim Leubner     SA_DBG1(("mpiWaitForConfigTable: INT Vector Tble Offset = 0x%x\n", config->InterruptVecTblOffset));
31484e1bc9a0SAchim Leubner     SA_DBG1(("mpiWaitForConfigTable: Phy Attribute Tble Offset = 0x%x\n", config->phyAttributeTblOffset));
31494e1bc9a0SAchim Leubner   }
31504e1bc9a0SAchim Leubner   else
31514e1bc9a0SAchim Leubner   {
31524e1bc9a0SAchim Leubner     ;/* SPC - Not used */
31534e1bc9a0SAchim Leubner   }
31544e1bc9a0SAchim Leubner 
31554e1bc9a0SAchim Leubner   /* read Error Dump Offset and Length */
31564e1bc9a0SAchim Leubner   config->FatalErrorDumpOffset0 = ossaHwRegReadExt(agRoot, pcibar, (bit32)CfgTblDWIdx + MAIN_FATAL_ERROR_RDUMP0_OFFSET);
31574e1bc9a0SAchim Leubner   config->FatalErrorDumpLength0 = ossaHwRegReadExt(agRoot, pcibar, (bit32)CfgTblDWIdx + MAIN_FATAL_ERROR_RDUMP0_LENGTH);
31584e1bc9a0SAchim Leubner   config->FatalErrorDumpOffset1 = ossaHwRegReadExt(agRoot, pcibar, (bit32)CfgTblDWIdx + MAIN_FATAL_ERROR_RDUMP1_OFFSET);
31594e1bc9a0SAchim Leubner   config->FatalErrorDumpLength1 = ossaHwRegReadExt(agRoot, pcibar, (bit32)CfgTblDWIdx + MAIN_FATAL_ERROR_RDUMP1_LENGTH);
31604e1bc9a0SAchim Leubner 
31614e1bc9a0SAchim Leubner   SA_DBG1(("mpiWaitForConfigTable: Interface Revision value = 0x%08x\n", config->InterfaceRev));
31624e1bc9a0SAchim Leubner   SA_DBG1(("mpiWaitForConfigTable: FW Revision value = 0x%08x\n", config->FWRevision));
31634e1bc9a0SAchim Leubner 
31644e1bc9a0SAchim Leubner   if(smIS_SPC(agRoot))
31654e1bc9a0SAchim Leubner   {
31664e1bc9a0SAchim Leubner     SA_DBG1(("mpiWaitForConfigTable: sTSDK ver. 0x%08x\n", STSDK_LL_SPC_VERSION));
31674e1bc9a0SAchim Leubner   }
31684e1bc9a0SAchim Leubner   if(smIS_SPC6V(agRoot))
31694e1bc9a0SAchim Leubner   {
31704e1bc9a0SAchim Leubner     SA_DBG1(("mpiWaitForConfigTable: sTSDK ver. 0x%08x\n",STSDK_LL_VERSION ));
31714e1bc9a0SAchim Leubner   }
31724e1bc9a0SAchim Leubner   if(smIS_SPC12V(agRoot))
31734e1bc9a0SAchim Leubner   {
31744e1bc9a0SAchim Leubner     SA_DBG1(("mpiWaitForConfigTable: sTSDK ver. 0x%08x\n",STSDK_LL_12G_VERSION ));
31754e1bc9a0SAchim Leubner   }
31764e1bc9a0SAchim Leubner 
31774e1bc9a0SAchim Leubner   SA_DBG1(("mpiWaitForConfigTable: MaxOutstandingIO value = 0x%08x\n", config->MaxOutstandingIO));
31784e1bc9a0SAchim Leubner   SA_DBG1(("mpiWaitForConfigTable: MDevMaxSGL value = 0x%08x\n", config->MDevMaxSGL));
31794e1bc9a0SAchim Leubner   SA_DBG1(("mpiWaitForConfigTable: ContrlCapFlag value = 0x%08x\n", config->ContrlCapFlag));
31804e1bc9a0SAchim Leubner   SA_DBG1(("mpiWaitForConfigTable: GSTOffset value = 0x%08x\n", config->GSTOffset));
31814e1bc9a0SAchim Leubner   SA_DBG1(("mpiWaitForConfigTable: inboundQueueOffset value = 0x%08x\n", config->inboundQueueOffset));
31824e1bc9a0SAchim Leubner   SA_DBG1(("mpiWaitForConfigTable: outboundQueueOffset value = 0x%08x\n", config->outboundQueueOffset));
31834e1bc9a0SAchim Leubner   SA_DBG1(("mpiWaitForConfigTable: FatalErrorDumpOffset0 value = 0x%08x\n", config->FatalErrorDumpOffset0));
31844e1bc9a0SAchim Leubner   SA_DBG1(("mpiWaitForConfigTable: FatalErrorDumpLength0 value = 0x%08x\n", config->FatalErrorDumpLength0));
31854e1bc9a0SAchim Leubner   SA_DBG1(("mpiWaitForConfigTable: FatalErrorDumpOffset1 value = 0x%08x\n", config->FatalErrorDumpOffset1));
31864e1bc9a0SAchim Leubner   SA_DBG1(("mpiWaitForConfigTable: FatalErrorDumpLength1 value = 0x%08x\n", config->FatalErrorDumpLength1));
31874e1bc9a0SAchim Leubner 
31884e1bc9a0SAchim Leubner 
31894e1bc9a0SAchim Leubner   SA_DBG1(("mpiWaitForConfigTable: HDAModeFlags value = 0x%08x\n", config->HDAModeFlags));
31904e1bc9a0SAchim Leubner   SA_DBG1(("mpiWaitForConfigTable: analogSetupTblOffset value = 0x%08x\n", config->analogSetupTblOffset));
31914e1bc9a0SAchim Leubner 
31924e1bc9a0SAchim Leubner   /* check interface version */
31934e1bc9a0SAchim Leubner 
31944e1bc9a0SAchim Leubner   if(smIS_SPC6V(agRoot))
31954e1bc9a0SAchim Leubner   {
31964e1bc9a0SAchim Leubner     if (config->InterfaceRev != STSDK_LL_INTERFACE_VERSION)
31974e1bc9a0SAchim Leubner     {
31984e1bc9a0SAchim Leubner       SA_DBG1(("mpiWaitForConfigTable: V sTSDK interface ver. 0x%x does not match InterfaceRev 0x%x warning!\n", STSDK_LL_INTERFACE_VERSION, config->InterfaceRev));
31994e1bc9a0SAchim Leubner       ret = AGSA_RC_VERSION_UNTESTED;
32004e1bc9a0SAchim Leubner       if ((config->InterfaceRev & STSDK_LL_INTERFACE_VERSION_IGNORE_MASK) != (STSDK_LL_INTERFACE_VERSION & STSDK_LL_INTERFACE_VERSION_IGNORE_MASK))
32014e1bc9a0SAchim Leubner       {
32024e1bc9a0SAchim Leubner         SA_DBG1(("mpiWaitForConfigTable: V sTSDK interface ver. 0x%x incompatible with InterfaceRev 0x%x warning!\n", STSDK_LL_INTERFACE_VERSION, config->InterfaceRev));
32034e1bc9a0SAchim Leubner         ret = AGSA_RC_VERSION_INCOMPATIBLE;
32044e1bc9a0SAchim Leubner         smTraceFuncExit(hpDBG_VERY_LOUD, 'i', "m4");
32054e1bc9a0SAchim Leubner         return ret;
32064e1bc9a0SAchim Leubner       }
32074e1bc9a0SAchim Leubner     }
32084e1bc9a0SAchim Leubner   }
32094e1bc9a0SAchim Leubner   else if(smIS_SPC12V(agRoot))
32104e1bc9a0SAchim Leubner   {
32114e1bc9a0SAchim Leubner     if (config->InterfaceRev != STSDK_LL_12G_INTERFACE_VERSION)
32124e1bc9a0SAchim Leubner     {
32134e1bc9a0SAchim Leubner       SA_DBG1(("mpiWaitForConfigTable: 12g V sTSDK interface ver. 0x%x does not match InterfaceRev 0x%x warning!\n", STSDK_LL_12G_INTERFACE_VERSION, config->InterfaceRev));
32144e1bc9a0SAchim Leubner       ret = AGSA_RC_VERSION_UNTESTED;
32154e1bc9a0SAchim Leubner       if ((config->InterfaceRev & STSDK_LL_INTERFACE_VERSION_IGNORE_MASK) != (STSDK_LL_12G_INTERFACE_VERSION & STSDK_LL_INTERFACE_VERSION_IGNORE_MASK))
32164e1bc9a0SAchim Leubner       {
32174e1bc9a0SAchim Leubner         SA_DBG1(("mpiWaitForConfigTable: V sTSDK interface ver. 0x%x incompatible with InterfaceRev 0x%x warning!\n", STSDK_LL_12G_INTERFACE_VERSION, config->InterfaceRev));
32184e1bc9a0SAchim Leubner         ret = AGSA_RC_VERSION_INCOMPATIBLE;
32194e1bc9a0SAchim Leubner         ret = AGSA_RC_VERSION_UNTESTED;
32204e1bc9a0SAchim Leubner         smTraceFuncExit(hpDBG_VERY_LOUD, 'j', "m4");
32214e1bc9a0SAchim Leubner         return ret;
32224e1bc9a0SAchim Leubner       }
32234e1bc9a0SAchim Leubner     }
32244e1bc9a0SAchim Leubner   }
32254e1bc9a0SAchim Leubner   else
32264e1bc9a0SAchim Leubner   {
32274e1bc9a0SAchim Leubner     if (config->InterfaceRev != STSDK_LL_OLD_INTERFACE_VERSION)
32284e1bc9a0SAchim Leubner     {
32294e1bc9a0SAchim Leubner       SA_DBG1(("mpiWaitForConfigTable: SPC sTSDK interface ver. 0x%08x not compatible with InterfaceRev 0x%x warning!\n", STSDK_LL_INTERFACE_VERSION, config->InterfaceRev));
32304e1bc9a0SAchim Leubner       ret = AGSA_RC_VERSION_INCOMPATIBLE;
32314e1bc9a0SAchim Leubner       smTraceFuncExit(hpDBG_VERY_LOUD, 'k', "m4");
32324e1bc9a0SAchim Leubner       return ret;
32334e1bc9a0SAchim Leubner     }
32344e1bc9a0SAchim Leubner 
32354e1bc9a0SAchim Leubner   }
32364e1bc9a0SAchim Leubner 
32374e1bc9a0SAchim Leubner 
32384e1bc9a0SAchim Leubner   /* Check FW versions */
32394e1bc9a0SAchim Leubner   if(smIS_SPC6V(agRoot))
32404e1bc9a0SAchim Leubner   {
32414e1bc9a0SAchim Leubner     SA_DBG1(("mpiWaitForConfigTable:6 sTSDK ver. sa.h 0x%08x config 0x%08x\n", STSDK_LL_VERSION, config->FWRevision));
32424e1bc9a0SAchim Leubner     /* check FW and LL sTSDK version */
32434e1bc9a0SAchim Leubner     if (config->FWRevision !=  MATCHING_V_FW_VERSION )
32444e1bc9a0SAchim Leubner     {
32454e1bc9a0SAchim Leubner       if (config->FWRevision >  MATCHING_V_FW_VERSION)
32464e1bc9a0SAchim Leubner       {
32474e1bc9a0SAchim Leubner         SA_DBG1(("mpiWaitForConfigTable: sTSDK ver. 0x%x hadn't tested with FW ver. 0x%08x warning!\n", STSDK_LL_VERSION, config->FWRevision));
32484e1bc9a0SAchim Leubner         ret = AGSA_RC_VERSION_UNTESTED;
32494e1bc9a0SAchim Leubner       }
32504e1bc9a0SAchim Leubner 
32514e1bc9a0SAchim Leubner       else if (config->FWRevision <  MIN_FW_SPCVE_VERSION_SUPPORTED)
32524e1bc9a0SAchim Leubner       {
32534e1bc9a0SAchim Leubner         SA_DBG1(("mpiWaitForConfigTable: sTSDK ver. 0x%x not compatible with FW ver. 0x%08x warning!\n", STSDK_LL_VERSION, config->FWRevision));
32544e1bc9a0SAchim Leubner         ret = AGSA_RC_VERSION_INCOMPATIBLE;
32554e1bc9a0SAchim Leubner         smTraceFuncExit(hpDBG_VERY_LOUD, 'l', "m4");
32564e1bc9a0SAchim Leubner         return ret;
32574e1bc9a0SAchim Leubner       }
32584e1bc9a0SAchim Leubner       else
32594e1bc9a0SAchim Leubner       {
32604e1bc9a0SAchim Leubner         SA_DBG1(("mpiWaitForConfigTable: sTSDK ver. 0x%x mismatch with FW ver. 0x%08x warning!\n",STSDK_LL_VERSION , config->FWRevision));
32614e1bc9a0SAchim Leubner         ret = AGSA_RC_VERSION_UNTESTED;
32624e1bc9a0SAchim Leubner       }
32634e1bc9a0SAchim Leubner     }
32644e1bc9a0SAchim Leubner   }else if(smIS_SPC12V(agRoot))
32654e1bc9a0SAchim Leubner   {
32664e1bc9a0SAchim Leubner     SA_DBG1(("mpiWaitForConfigTable:12 sTSDK ver. sa.h 0x%08x config 0x%08x\n", STSDK_LL_12G_VERSION, config->FWRevision));
32674e1bc9a0SAchim Leubner     /* check FW and LL sTSDK version */
32684e1bc9a0SAchim Leubner     if (config->FWRevision !=  MATCHING_12G_V_FW_VERSION )
32694e1bc9a0SAchim Leubner     {
32704e1bc9a0SAchim Leubner       if (config->FWRevision >  MATCHING_12G_V_FW_VERSION)
32714e1bc9a0SAchim Leubner       {
32724e1bc9a0SAchim Leubner         SA_DBG1(("mpiWaitForConfigTable: sTSDK ver. 0x%x hadn't tested with FW ver. 0x%08x warning!\n", STSDK_LL_12G_VERSION, config->FWRevision));
32734e1bc9a0SAchim Leubner         ret = AGSA_RC_VERSION_UNTESTED;
32744e1bc9a0SAchim Leubner       }
32754e1bc9a0SAchim Leubner 
32764e1bc9a0SAchim Leubner       else if (config->FWRevision <  MIN_FW_12G_SPCVE_VERSION_SUPPORTED)
32774e1bc9a0SAchim Leubner       {
32784e1bc9a0SAchim Leubner         SA_DBG1(("mpiWaitForConfigTable: sTSDK ver. 0x%x not compatible with FW ver. 0x%08x warning!\n", STSDK_LL_12G_VERSION, config->FWRevision));
32794e1bc9a0SAchim Leubner         ret = AGSA_RC_VERSION_INCOMPATIBLE;
32804e1bc9a0SAchim Leubner         smTraceFuncExit(hpDBG_VERY_LOUD, 'm', "m4");
32814e1bc9a0SAchim Leubner         return ret;
32824e1bc9a0SAchim Leubner       }
32834e1bc9a0SAchim Leubner       else
32844e1bc9a0SAchim Leubner       {
32854e1bc9a0SAchim Leubner         SA_DBG1(("mpiWaitForConfigTable: sTSDK ver. 0x%x mismatch with FW ver. 0x%08x warning!\n",STSDK_LL_12G_VERSION , config->FWRevision));
32864e1bc9a0SAchim Leubner         ret = AGSA_RC_VERSION_UNTESTED;
32874e1bc9a0SAchim Leubner       }
32884e1bc9a0SAchim Leubner     }
32894e1bc9a0SAchim Leubner   }
32904e1bc9a0SAchim Leubner   else
32914e1bc9a0SAchim Leubner   {
32924e1bc9a0SAchim Leubner     if (config->FWRevision != MATCHING_SPC_FW_VERSION )
32934e1bc9a0SAchim Leubner     {
32944e1bc9a0SAchim Leubner       if (config->FWRevision >  MATCHING_SPC_FW_VERSION)
32954e1bc9a0SAchim Leubner       {
32964e1bc9a0SAchim Leubner         SA_DBG1(("mpiWaitForConfigTable: sTSDK ver. 0x%x hadn't tested with FW ver. 0x%08x warning!\n", STSDK_LL_SPC_VERSION, config->FWRevision));
32974e1bc9a0SAchim Leubner         ret = AGSA_RC_VERSION_UNTESTED;
32984e1bc9a0SAchim Leubner       }
32994e1bc9a0SAchim Leubner       else if (config->FWRevision <  MIN_FW_SPC_VERSION_SUPPORTED)
33004e1bc9a0SAchim Leubner       {
33014e1bc9a0SAchim Leubner         SA_DBG1(("mpiWaitForConfigTable: sTSDK ver. 0x%x not compatible with FW ver. 0x%08x warning!\n", STSDK_LL_SPC_VERSION, config->FWRevision));
33024e1bc9a0SAchim Leubner         ret = AGSA_RC_VERSION_INCOMPATIBLE;
33034e1bc9a0SAchim Leubner         smTraceFuncExit(hpDBG_VERY_LOUD, 'n', "m4");
33044e1bc9a0SAchim Leubner         return ret;
33054e1bc9a0SAchim Leubner       }
33064e1bc9a0SAchim Leubner       else
33074e1bc9a0SAchim Leubner       {
33084e1bc9a0SAchim Leubner         SA_DBG1(("mpiWaitForConfigTable: sTSDK ver. 0x%x mismatch with FW ver. 0x%08x warning!\n",STSDK_LL_SPC_VERSION , config->FWRevision));
33094e1bc9a0SAchim Leubner         ret = AGSA_RC_VERSION_UNTESTED;
33104e1bc9a0SAchim Leubner       }
33114e1bc9a0SAchim Leubner     }
33124e1bc9a0SAchim Leubner   }
33134e1bc9a0SAchim Leubner   SA_DBG1(("mpiWaitForConfigTable: ILA version 0x%08X\n",  ossaHwRegReadExt(agRoot, pcibar, (bit32)CfgTblDWIdx + MAIN_ILAT_ILAV_ILASMRN_ILAMRN_ILAMJN) ));
33144e1bc9a0SAchim Leubner 
33154e1bc9a0SAchim Leubner 
33164e1bc9a0SAchim Leubner   if(smIS_SPC12V(agRoot))
33174e1bc9a0SAchim Leubner   {
33184e1bc9a0SAchim Leubner     if (config->InterfaceRev > 0x301 )
33194e1bc9a0SAchim Leubner     {
33204e1bc9a0SAchim Leubner       SA_DBG1(("mpiWaitForConfigTable: MAIN_INACTIVE_ILA_REVSION 0x%08X\n",  ossaHwRegReadExt(agRoot, pcibar, (bit32)CfgTblDWIdx + MAIN_INACTIVE_ILA_REVSION) ));
33214e1bc9a0SAchim Leubner       SA_DBG1(("mpiWaitForConfigTable: MAIN_SEEPROM_REVSION 0x%08X\n",  ossaHwRegReadExt(agRoot, pcibar, (bit32)CfgTblDWIdx + MAIN_SEEPROM_REVSION) ));
33224e1bc9a0SAchim Leubner     }
33234e1bc9a0SAchim Leubner   }
33244e1bc9a0SAchim Leubner 
33254e1bc9a0SAchim Leubner   if(smIS_SPC12V(agRoot))
33264e1bc9a0SAchim Leubner   {
33274e1bc9a0SAchim Leubner     if (config->InterfaceRev > 0x301 )
33284e1bc9a0SAchim Leubner     {
33294e1bc9a0SAchim Leubner       SA_DBG1(("mpiWaitForConfigTable: MAIN_AWT_MIDRANGE 0x%08X\n",  ossaHwRegReadExt(agRoot, pcibar, (bit32)CfgTblDWIdx + MAIN_AWT_MIDRANGE) ));
33304e1bc9a0SAchim Leubner     }
33314e1bc9a0SAchim Leubner   }
33324e1bc9a0SAchim Leubner 
33334e1bc9a0SAchim Leubner 
33344e1bc9a0SAchim Leubner   if(smIS_SFC(agRoot))
33354e1bc9a0SAchim Leubner   {
33364e1bc9a0SAchim Leubner     /* always success for SFC*/
33374e1bc9a0SAchim Leubner     ret = AGSA_RC_SUCCESS;
33384e1bc9a0SAchim Leubner   }
33394e1bc9a0SAchim Leubner 
33404e1bc9a0SAchim Leubner   if (agNULL != saRoot)
33414e1bc9a0SAchim Leubner   {
33424e1bc9a0SAchim Leubner     /* save the information */
33434e1bc9a0SAchim Leubner     saRoot->ControllerInfo.signature = Signature;
33444e1bc9a0SAchim Leubner     saRoot->ControllerInfo.fwInterfaceRev = config->InterfaceRev;
33454e1bc9a0SAchim Leubner 
33464e1bc9a0SAchim Leubner     if(smIS_SPCV(agRoot))
33474e1bc9a0SAchim Leubner     {
33484e1bc9a0SAchim Leubner       saRoot->ControllerInfo.hwRevision = (ossaHwRegReadConfig32(agRoot,8) & 0xFF);
33494e1bc9a0SAchim Leubner       SA_DBG1(("mpiWaitForConfigTable: hwRevision 0x%x\n",saRoot->ControllerInfo.hwRevision  ));
33504e1bc9a0SAchim Leubner     }
33514e1bc9a0SAchim Leubner     else
33524e1bc9a0SAchim Leubner     {
33534e1bc9a0SAchim Leubner       saRoot->ControllerInfo.hwRevision = SPC_READ_DEV_REV;
33544e1bc9a0SAchim Leubner     }
33554e1bc9a0SAchim Leubner 
33564e1bc9a0SAchim Leubner     saRoot->ControllerInfo.fwRevision = config->FWRevision;
33574e1bc9a0SAchim Leubner     saRoot->ControllerInfo.ilaRevision  = config->ilaRevision;
33584e1bc9a0SAchim Leubner     saRoot->ControllerInfo.maxPendingIO = config->MaxOutstandingIO;
33594e1bc9a0SAchim Leubner     saRoot->ControllerInfo.maxSgElements = config->MDevMaxSGL & 0xFFFF;
33604e1bc9a0SAchim Leubner     saRoot->ControllerInfo.maxDevices = (config->MDevMaxSGL & MAX_DEV_BITS) >> SHIFT16;
33614e1bc9a0SAchim Leubner     saRoot->ControllerInfo.queueSupport = config->ContrlCapFlag & Q_SUPPORT_BITS;
33624e1bc9a0SAchim Leubner     saRoot->ControllerInfo.phyCount = (bit8)((config->ContrlCapFlag & PHY_COUNT_BITS) >> SHIFT19);
33634e1bc9a0SAchim Leubner     saRoot->ControllerInfo.sasSpecsSupport = (config->ContrlCapFlag & SAS_SPEC_BITS) >> SHIFT25;
33644e1bc9a0SAchim Leubner     SA_DBG1(("mpiWaitForConfigTable: MaxOutstandingIO 0x%x swConfig->maxActiveIOs 0x%x\n", config->MaxOutstandingIO,saRoot->swConfig.maxActiveIOs ));
33654e1bc9a0SAchim Leubner 
33664e1bc9a0SAchim Leubner     if(smIS_SPCV(agRoot))
33674e1bc9a0SAchim Leubner     {
33684e1bc9a0SAchim Leubner       ;/* SPCV - reserved field */
33694e1bc9a0SAchim Leubner     }
33704e1bc9a0SAchim Leubner     else
33714e1bc9a0SAchim Leubner     {
33724e1bc9a0SAchim Leubner       saRoot->ControllerInfo.controllerSetting = (bit8)config->HDAModeFlags;
33734e1bc9a0SAchim Leubner     }
33744e1bc9a0SAchim Leubner 
33754e1bc9a0SAchim Leubner     saRoot->ControllerInfo.sdkInterfaceRev = STSDK_LL_INTERFACE_VERSION;
33764e1bc9a0SAchim Leubner     saRoot->ControllerInfo.sdkRevision = STSDK_LL_VERSION;
33774e1bc9a0SAchim Leubner     saRoot->mainConfigTable.regDumpPCIBAR = pcibar;
33784e1bc9a0SAchim Leubner     saRoot->mainConfigTable.FatalErrorDumpOffset0 = config->FatalErrorDumpOffset0;
33794e1bc9a0SAchim Leubner     saRoot->mainConfigTable.FatalErrorDumpLength0 = config->FatalErrorDumpLength0;
33804e1bc9a0SAchim Leubner     saRoot->mainConfigTable.FatalErrorDumpOffset1 = config->FatalErrorDumpOffset1;
33814e1bc9a0SAchim Leubner     saRoot->mainConfigTable.FatalErrorDumpLength1 = config->FatalErrorDumpLength1;
33824e1bc9a0SAchim Leubner 
33834e1bc9a0SAchim Leubner     if(smIS_SPCV(agRoot))
33844e1bc9a0SAchim Leubner     {
33854e1bc9a0SAchim Leubner       ;/* SPCV - reserved field */
33864e1bc9a0SAchim Leubner     }
33874e1bc9a0SAchim Leubner     else
33884e1bc9a0SAchim Leubner     {
33894e1bc9a0SAchim Leubner       saRoot->mainConfigTable.HDAModeFlags = config->HDAModeFlags;
33904e1bc9a0SAchim Leubner     }
33914e1bc9a0SAchim Leubner 
33924e1bc9a0SAchim Leubner     saRoot->mainConfigTable.analogSetupTblOffset = config->analogSetupTblOffset;
33934e1bc9a0SAchim Leubner 
33944e1bc9a0SAchim Leubner     if(smIS_SPCV(agRoot))
33954e1bc9a0SAchim Leubner     {
33964e1bc9a0SAchim Leubner       saRoot->mainConfigTable.InterruptVecTblOffset = config->InterruptVecTblOffset;
33974e1bc9a0SAchim Leubner       saRoot->mainConfigTable.phyAttributeTblOffset = config->phyAttributeTblOffset;
33984e1bc9a0SAchim Leubner       saRoot->mainConfigTable.PortRecoveryTimerPortResetTimer = config->portRecoveryResetTimer;
33994e1bc9a0SAchim Leubner     }
34004e1bc9a0SAchim Leubner 
34014e1bc9a0SAchim Leubner     SA_DBG1(("mpiWaitForConfigTable: Signature = 0x%x\n", Signature));
34024e1bc9a0SAchim Leubner     SA_DBG1(("mpiWaitForConfigTable: hwRevision = 0x%x\n", saRoot->ControllerInfo.hwRevision));
34034e1bc9a0SAchim Leubner     SA_DBG1(("mpiWaitForConfigTable: FW Revision = 0x%x\n", config->FWRevision));
34044e1bc9a0SAchim Leubner     SA_DBG1(("mpiWaitForConfigTable: Max Sgl = 0x%x\n", saRoot->ControllerInfo.maxSgElements));
34054e1bc9a0SAchim Leubner     SA_DBG1(("mpiWaitForConfigTable: Max Device = 0x%x\n", saRoot->ControllerInfo.maxDevices));
34064e1bc9a0SAchim Leubner     SA_DBG1(("mpiWaitForConfigTable: Queue Support = 0x%x\n", saRoot->ControllerInfo.queueSupport));
34074e1bc9a0SAchim Leubner     SA_DBG1(("mpiWaitForConfigTable: Phy Count = 0x%x\n", saRoot->ControllerInfo.phyCount));
34084e1bc9a0SAchim Leubner     SA_DBG1(("mpiWaitForConfigTable: sas Specs Support = 0x%x\n", saRoot->ControllerInfo.sasSpecsSupport));
34094e1bc9a0SAchim Leubner 
34104e1bc9a0SAchim Leubner   }
34114e1bc9a0SAchim Leubner 
34124e1bc9a0SAchim Leubner 
34134e1bc9a0SAchim Leubner   if(ret != AGSA_RC_SUCCESS )
34144e1bc9a0SAchim Leubner   {
34154e1bc9a0SAchim Leubner     SA_DBG1(("mpiWaitForConfigTable: return 0x%x not AGSA_RC_SUCCESS warning!\n", ret));
34164e1bc9a0SAchim Leubner   }
34174e1bc9a0SAchim Leubner 
34184e1bc9a0SAchim Leubner 
34194e1bc9a0SAchim Leubner   smTraceFuncExit(hpDBG_VERY_LOUD, 'o', "m4");
34204e1bc9a0SAchim Leubner   return ret;
34214e1bc9a0SAchim Leubner }
34224e1bc9a0SAchim Leubner 
34234e1bc9a0SAchim Leubner /*******************************************************************************/
34244e1bc9a0SAchim Leubner /** \fn mpiUnInitConfigTable(agsaRoot_t *agRoot, spc_configMainDescriptor_t *config)
34254e1bc9a0SAchim Leubner  *  \brief UnInitialization Configuration Table
34264e1bc9a0SAchim Leubner  *  \param agsaRoot Pointer to a data structure containing LL layer context handles
34274e1bc9a0SAchim Leubner  *
34284e1bc9a0SAchim Leubner  * Return:
34294e1bc9a0SAchim Leubner  *         AGSA_RC_SUCCESS if Un-initialize the configuration table sucessful
34304e1bc9a0SAchim Leubner  *         AGSA_RC_FAILURE if Un-initialize the configuration table failed
34314e1bc9a0SAchim Leubner  */
34324e1bc9a0SAchim Leubner /*******************************************************************************/
mpiUnInitConfigTable(agsaRoot_t * agRoot)34334e1bc9a0SAchim Leubner GLOBAL bit32 mpiUnInitConfigTable(agsaRoot_t *agRoot)
34344e1bc9a0SAchim Leubner {
34354e1bc9a0SAchim Leubner   bit32    MSGUCfgTblBase;
34364e1bc9a0SAchim Leubner   bit32    CfgTblDWIdx, GSTOffset, GSTLenMPIS;
34374e1bc9a0SAchim Leubner   bit32    value, togglevalue;
34384e1bc9a0SAchim Leubner   bit32    max_wait_time;
34394e1bc9a0SAchim Leubner   bit32    max_wait_count;
34404e1bc9a0SAchim Leubner   bit8     pcibar;
34414e1bc9a0SAchim Leubner 
34424e1bc9a0SAchim Leubner   smTraceFuncEnter(hpDBG_VERY_LOUD,"m7");
34434e1bc9a0SAchim Leubner   SA_DBG1(("mpiUnInitConfigTable: agRoot %p\n",agRoot));
34444e1bc9a0SAchim Leubner   SA_ASSERT(NULL != agRoot, "agRoot argument cannot be null");
34454e1bc9a0SAchim Leubner 
34464e1bc9a0SAchim Leubner   togglevalue = 0;
34474e1bc9a0SAchim Leubner 
34484e1bc9a0SAchim Leubner   /* read scratch pad0 to get PCI BAR and offset of configuration table */
34494e1bc9a0SAchim Leubner   MSGUCfgTblBase =siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_0,MSGU_SCRATCH_PAD_0);
34504e1bc9a0SAchim Leubner 
34514e1bc9a0SAchim Leubner   if(MSGUCfgTblBase == 0xFFFFFFFF)
34524e1bc9a0SAchim Leubner   {
34534e1bc9a0SAchim Leubner     SA_DBG1(("mpiUnInitConfigTable: MSGUCfgTblBase = 0x%x AGSA_RC_FAILURE\n",MSGUCfgTblBase));
34544e1bc9a0SAchim Leubner     return AGSA_RC_FAILURE;
34554e1bc9a0SAchim Leubner   }
34564e1bc9a0SAchim Leubner 
34574e1bc9a0SAchim Leubner   /* get offset */
34584e1bc9a0SAchim Leubner   CfgTblDWIdx = MSGUCfgTblBase & SCRATCH_PAD0_OFFSET_MASK;
34594e1bc9a0SAchim Leubner   /* get PCI BAR */
34604e1bc9a0SAchim Leubner   MSGUCfgTblBase = (MSGUCfgTblBase & SCRATCH_PAD0_BAR_MASK) >> SHIFT26;
34614e1bc9a0SAchim Leubner 
34624e1bc9a0SAchim Leubner   /* convert the PCI BAR to logical bar number */
34634e1bc9a0SAchim Leubner   pcibar = (bit8)mpiGetPCIBarIndex(agRoot, MSGUCfgTblBase);
34644e1bc9a0SAchim Leubner 
34654e1bc9a0SAchim Leubner   /* Write bit 1 to Inbound DoorBell Register */
34664e1bc9a0SAchim Leubner   siHalRegWriteExt(agRoot, GEN_MSGU_IBDB_SET, MSGU_IBDB_SET, SPC_MSGU_CFG_TABLE_RESET);
34674e1bc9a0SAchim Leubner 
34684e1bc9a0SAchim Leubner   /* wait until Inbound DoorBell Clear Register toggled */
34694e1bc9a0SAchim Leubner   max_wait_time = WAIT_SECONDS(gWait_2);  /* 2 sec */
34704e1bc9a0SAchim Leubner   max_wait_count = MAKE_MODULO(max_wait_time,WAIT_INCREMENT);
34714e1bc9a0SAchim Leubner   do
34724e1bc9a0SAchim Leubner   {
34734e1bc9a0SAchim Leubner     ossaStallThread(agRoot, WAIT_INCREMENT);
34744e1bc9a0SAchim Leubner     value = MSGU_READ_IDR;
34754e1bc9a0SAchim Leubner     value &= SPC_MSGU_CFG_TABLE_RESET;
34764e1bc9a0SAchim Leubner   } while ((value != togglevalue) && (max_wait_count -= WAIT_INCREMENT));
34774e1bc9a0SAchim Leubner 
34784e1bc9a0SAchim Leubner   if (!max_wait_count)
34794e1bc9a0SAchim Leubner   {
34804e1bc9a0SAchim Leubner     SA_DBG1(("mpiUnInitConfigTable: TIMEOUT:IBDB value/toggle = 0x%x 0x%x\n", value, togglevalue));
34814e1bc9a0SAchim Leubner     smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "m7");
34824e1bc9a0SAchim Leubner 
34834e1bc9a0SAchim Leubner     if(smIS_SPC(agRoot) )
34844e1bc9a0SAchim Leubner     {
34854e1bc9a0SAchim Leubner       return AGSA_RC_FAILURE;
34864e1bc9a0SAchim Leubner     }
34874e1bc9a0SAchim Leubner 
34884e1bc9a0SAchim Leubner   }
34894e1bc9a0SAchim Leubner 
34904e1bc9a0SAchim Leubner   /* check the MPI-State for termination in progress */
34914e1bc9a0SAchim Leubner   /* wait until Inbound DoorBell Clear Register toggled */
34924e1bc9a0SAchim Leubner   max_wait_time = WAIT_SECONDS(gWait_2);  /* 2 sec */
34934e1bc9a0SAchim Leubner   max_wait_count = MAKE_MODULO(max_wait_time,WAIT_INCREMENT);
34944e1bc9a0SAchim Leubner   GSTOffset = ossaHwRegReadExt(agRoot, pcibar, (bit32)CfgTblDWIdx + MAIN_GST_OFFSET);
34954e1bc9a0SAchim Leubner   do
34964e1bc9a0SAchim Leubner   {
34974e1bc9a0SAchim Leubner     ossaStallThread(agRoot, WAIT_INCREMENT);
34984e1bc9a0SAchim Leubner 
34994e1bc9a0SAchim Leubner     if(GSTOffset == 0xFFFFFFFF)
35004e1bc9a0SAchim Leubner     {
35014e1bc9a0SAchim Leubner       SA_DBG1(("mpiUnInitConfigTable:AGSA_RC_FAILURE GSTOffset = 0x%x\n",GSTOffset));
35024e1bc9a0SAchim Leubner       return AGSA_RC_FAILURE;
35034e1bc9a0SAchim Leubner     }
35044e1bc9a0SAchim Leubner 
35054e1bc9a0SAchim Leubner     GSTLenMPIS = ossaHwRegReadExt(agRoot, pcibar, (bit32)CfgTblDWIdx + (bit32)(GSTOffset + GST_GSTLEN_MPIS_OFFSET));
35064e1bc9a0SAchim Leubner     if (GST_MPI_STATE_UNINIT == (GSTLenMPIS & GST_MPI_STATE_MASK))
35074e1bc9a0SAchim Leubner     {
35084e1bc9a0SAchim Leubner       break;
35094e1bc9a0SAchim Leubner     }
35104e1bc9a0SAchim Leubner   } while (max_wait_count -= WAIT_INCREMENT);
35114e1bc9a0SAchim Leubner 
35124e1bc9a0SAchim Leubner   if (!max_wait_count)
35134e1bc9a0SAchim Leubner   {
35144e1bc9a0SAchim Leubner     SA_DBG1(("mpiUnInitConfigTable: TIMEOUT, MPI State = 0x%x\n", GSTLenMPIS & GST_MPI_STATE_MASK));
35154e1bc9a0SAchim Leubner #if defined(SALLSDK_DEBUG)
35164e1bc9a0SAchim Leubner 
35174e1bc9a0SAchim Leubner     SA_DBG1(("mpiUnInitConfigTable: SCRATCH_PAD0 value = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_0)));
35184e1bc9a0SAchim Leubner     SA_DBG1(("mpiUnInitConfigTable: SCRATCH_PAD1 value = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_1)));
35194e1bc9a0SAchim Leubner     SA_DBG1(("mpiUnInitConfigTable: SCRATCH_PAD2 value = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_2)));
35204e1bc9a0SAchim Leubner     SA_DBG1(("mpiUnInitConfigTable: SCRATCH_PAD3 value = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_3)));
35214e1bc9a0SAchim Leubner #endif
35224e1bc9a0SAchim Leubner 
35234e1bc9a0SAchim Leubner     smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "m7");
35244e1bc9a0SAchim Leubner     return AGSA_RC_FAILURE;
35254e1bc9a0SAchim Leubner   }
35264e1bc9a0SAchim Leubner 
35274e1bc9a0SAchim Leubner   smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "m7");
35284e1bc9a0SAchim Leubner   return AGSA_RC_SUCCESS;
35294e1bc9a0SAchim Leubner }
35304e1bc9a0SAchim Leubner 
35314e1bc9a0SAchim Leubner /*******************************************************************************/
35324e1bc9a0SAchim Leubner /** \fn void mpiUpdateIBQueueCfgTable(agsaRoot_t *agRoot, spc_inboundQueueDescriptor_t *outQueueCfg,
35334e1bc9a0SAchim Leubner  *                               bit32 QueueTableOffset,bit8 pcibar)
35344e1bc9a0SAchim Leubner  *  \brief Writing to the inbound queue of the Configuration Table
35354e1bc9a0SAchim Leubner  *  \param agsaRoot Pointer to a data structure containing both application and LL layer context handles
35364e1bc9a0SAchim Leubner  *  \param outQueueCfg      Pointer to inbuond configuration area
35374e1bc9a0SAchim Leubner  *  \param QueueTableOffset Queue configuration table offset
35384e1bc9a0SAchim Leubner  *  \param pcibar           PCI BAR
35394e1bc9a0SAchim Leubner  *
35404e1bc9a0SAchim Leubner  * Return:
35414e1bc9a0SAchim Leubner  *         None
35424e1bc9a0SAchim Leubner  */
35434e1bc9a0SAchim Leubner /*******************************************************************************/
mpiUpdateIBQueueCfgTable(agsaRoot_t * agRoot,spc_inboundQueueDescriptor_t * inQueueCfg,bit32 QueueTableOffset,bit8 pcibar)35444e1bc9a0SAchim Leubner GLOBAL void mpiUpdateIBQueueCfgTable(agsaRoot_t             *agRoot,
35454e1bc9a0SAchim Leubner                               spc_inboundQueueDescriptor_t  *inQueueCfg,
35464e1bc9a0SAchim Leubner                               bit32                         QueueTableOffset,
35474e1bc9a0SAchim Leubner                               bit8                          pcibar)
35484e1bc9a0SAchim Leubner {
35494e1bc9a0SAchim Leubner   smTraceFuncEnter(hpDBG_VERY_LOUD,"m5");
35504e1bc9a0SAchim Leubner 
35514e1bc9a0SAchim Leubner   smTrace(hpDBG_VERY_LOUD,"Ba",QueueTableOffset);
35524e1bc9a0SAchim Leubner   /* TP:Ba QueueTableOffset */
35534e1bc9a0SAchim Leubner   smTrace(hpDBG_VERY_LOUD,"Bb",pcibar);
35544e1bc9a0SAchim Leubner   /* TP:Bb pcibar */
35554e1bc9a0SAchim Leubner 
35564e1bc9a0SAchim Leubner   ossaHwRegWriteExt(agRoot, pcibar, (bit32)(QueueTableOffset + IB_PROPERITY_OFFSET), inQueueCfg->elementPriSizeCount);
35574e1bc9a0SAchim Leubner   ossaHwRegWriteExt(agRoot, pcibar, (bit32)(QueueTableOffset + IB_BASE_ADDR_HI_OFFSET), inQueueCfg->upperBaseAddress);
35584e1bc9a0SAchim Leubner   ossaHwRegWriteExt(agRoot, pcibar, (bit32)(QueueTableOffset + IB_BASE_ADDR_LO_OFFSET), inQueueCfg->lowerBaseAddress);
35594e1bc9a0SAchim Leubner   ossaHwRegWriteExt(agRoot, pcibar, (bit32)(QueueTableOffset + IB_CI_BASE_ADDR_HI_OFFSET), inQueueCfg->ciUpperBaseAddress);
35604e1bc9a0SAchim Leubner   ossaHwRegWriteExt(agRoot, pcibar, (bit32)(QueueTableOffset + IB_CI_BASE_ADDR_LO_OFFSET), inQueueCfg->ciLowerBaseAddress);
35614e1bc9a0SAchim Leubner 
35624e1bc9a0SAchim Leubner 
35634e1bc9a0SAchim Leubner   SA_DBG3(("mpiUpdateIBQueueCfgTable: Offset 0x%08x elementPriSizeCount 0x%x\n",(bit32)(QueueTableOffset + IB_PROPERITY_OFFSET), inQueueCfg->elementPriSizeCount));
35644e1bc9a0SAchim Leubner   SA_DBG3(("mpiUpdateIBQueueCfgTable: Offset 0x%08x upperBaseAddress    0x%x\n",(bit32)(QueueTableOffset + IB_BASE_ADDR_HI_OFFSET), inQueueCfg->upperBaseAddress));
35654e1bc9a0SAchim Leubner   SA_DBG3(("mpiUpdateIBQueueCfgTable: Offset 0x%08x lowerBaseAddress    0x%x\n",(bit32)(QueueTableOffset + IB_BASE_ADDR_LO_OFFSET), inQueueCfg->lowerBaseAddress));
35664e1bc9a0SAchim Leubner   SA_DBG3(("mpiUpdateIBQueueCfgTable: Offset 0x%08x ciUpperBaseAddress  0x%x\n",(bit32)(QueueTableOffset + IB_CI_BASE_ADDR_HI_OFFSET), inQueueCfg->ciUpperBaseAddress));
35674e1bc9a0SAchim Leubner   SA_DBG3(("mpiUpdateIBQueueCfgTable: Offset 0x%08x ciLowerBaseAddress  0x%x\n",(bit32)(QueueTableOffset + IB_CI_BASE_ADDR_LO_OFFSET), inQueueCfg->ciLowerBaseAddress));
35684e1bc9a0SAchim Leubner 
35694e1bc9a0SAchim Leubner   smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "m5");
35704e1bc9a0SAchim Leubner }
35714e1bc9a0SAchim Leubner 
35724e1bc9a0SAchim Leubner /*******************************************************************************/
35734e1bc9a0SAchim Leubner /** \fn void mpiUpdateOBQueueCfgTable(agsaRoot_t *agRoot, spc_outboundQueueDescriptor_t *outQueueCfg,
35744e1bc9a0SAchim Leubner  *                               bit32 QueueTableOffset,bit8 pcibar)
35754e1bc9a0SAchim Leubner  *  \brief Writing to the inbound queue of the Configuration Table
35764e1bc9a0SAchim Leubner  *  \param agsaRoot         Pointer to a data structure containing both application
35774e1bc9a0SAchim Leubner  *                          and LL layer context handles
35784e1bc9a0SAchim Leubner  *  \param outQueueCfg      Pointer to outbuond configuration area
35794e1bc9a0SAchim Leubner  *  \param QueueTableOffset Queue configuration table offset
35804e1bc9a0SAchim Leubner  *  \param pcibar           PCI BAR
35814e1bc9a0SAchim Leubner  *
35824e1bc9a0SAchim Leubner  * Return:
35834e1bc9a0SAchim Leubner  *         None
35844e1bc9a0SAchim Leubner  */
35854e1bc9a0SAchim Leubner /*******************************************************************************/
mpiUpdateOBQueueCfgTable(agsaRoot_t * agRoot,spc_outboundQueueDescriptor_t * outQueueCfg,bit32 QueueTableOffset,bit8 pcibar)35864e1bc9a0SAchim Leubner GLOBAL void mpiUpdateOBQueueCfgTable(agsaRoot_t             *agRoot,
35874e1bc9a0SAchim Leubner                               spc_outboundQueueDescriptor_t *outQueueCfg,
35884e1bc9a0SAchim Leubner                               bit32                         QueueTableOffset,
35894e1bc9a0SAchim Leubner                               bit8                          pcibar)
35904e1bc9a0SAchim Leubner {
35914e1bc9a0SAchim Leubner 
35924e1bc9a0SAchim Leubner   smTraceFuncEnter(hpDBG_VERY_LOUD,"m8");
35934e1bc9a0SAchim Leubner 
35944e1bc9a0SAchim Leubner   ossaHwRegWriteExt(agRoot, pcibar, (bit32)(QueueTableOffset + OB_PROPERITY_OFFSET), outQueueCfg->elementSizeCount);
35954e1bc9a0SAchim Leubner   ossaHwRegWriteExt(agRoot, pcibar, (bit32)(QueueTableOffset + OB_BASE_ADDR_HI_OFFSET), outQueueCfg->upperBaseAddress);
35964e1bc9a0SAchim Leubner   ossaHwRegWriteExt(agRoot, pcibar, (bit32)(QueueTableOffset + OB_BASE_ADDR_LO_OFFSET), outQueueCfg->lowerBaseAddress);
35974e1bc9a0SAchim Leubner   ossaHwRegWriteExt(agRoot, pcibar, (bit32)(QueueTableOffset + OB_PI_BASE_ADDR_HI_OFFSET), outQueueCfg->piUpperBaseAddress);
35984e1bc9a0SAchim Leubner   ossaHwRegWriteExt(agRoot, pcibar, (bit32)(QueueTableOffset + OB_PI_BASE_ADDR_LO_OFFSET), outQueueCfg->piLowerBaseAddress);
35994e1bc9a0SAchim Leubner   ossaHwRegWriteExt(agRoot, pcibar, (bit32)(QueueTableOffset + OB_INTERRUPT_COALES_OFFSET), outQueueCfg->interruptVecCntDelay);
36004e1bc9a0SAchim Leubner 
36014e1bc9a0SAchim Leubner   SA_DBG3(("mpiUpdateOBQueueCfgTable: Offset 0x%08x elementSizeCount     0x%x\n",(bit32)(QueueTableOffset + OB_PROPERITY_OFFSET), outQueueCfg->elementSizeCount));
36024e1bc9a0SAchim Leubner   SA_DBG3(("mpiUpdateOBQueueCfgTable: Offset 0x%08x upperBaseAddress     0x%x\n",(bit32)(QueueTableOffset + OB_BASE_ADDR_HI_OFFSET), outQueueCfg->upperBaseAddress));
36034e1bc9a0SAchim Leubner   SA_DBG3(("mpiUpdateOBQueueCfgTable: Offset 0x%08x lowerBaseAddress     0x%x\n",(bit32)(QueueTableOffset + OB_BASE_ADDR_LO_OFFSET), outQueueCfg->lowerBaseAddress));
36044e1bc9a0SAchim Leubner   SA_DBG3(("mpiUpdateOBQueueCfgTable: Offset 0x%08x piUpperBaseAddress   0x%x\n",(bit32)(QueueTableOffset + OB_PI_BASE_ADDR_HI_OFFSET), outQueueCfg->piUpperBaseAddress));
36054e1bc9a0SAchim Leubner   SA_DBG3(("mpiUpdateOBQueueCfgTable: Offset 0x%08x piLowerBaseAddress   0x%x\n",(bit32)(QueueTableOffset + OB_PI_BASE_ADDR_LO_OFFSET), outQueueCfg->piLowerBaseAddress));
36064e1bc9a0SAchim Leubner   SA_DBG3(("mpiUpdateOBQueueCfgTable: Offset 0x%08x interruptVecCntDelay 0x%x\n",(bit32)(QueueTableOffset + OB_INTERRUPT_COALES_OFFSET), outQueueCfg->interruptVecCntDelay));
36074e1bc9a0SAchim Leubner   smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "m8");
36084e1bc9a0SAchim Leubner }
36094e1bc9a0SAchim Leubner 
36104e1bc9a0SAchim Leubner 
36114e1bc9a0SAchim Leubner 
36124e1bc9a0SAchim Leubner /*******************************************************************************/
36134e1bc9a0SAchim Leubner /** \fn void mpiUpdateOBQueueCfgTable(agsaRoot_t *agRoot, spc_outboundQueueDescriptor_t *outQueueCfg,
36144e1bc9a0SAchim Leubner  *                               bit32 QueueTableOffset,bit8 pcibar)
36154e1bc9a0SAchim Leubner  *  \brief Writing to the inbound queue of the Configuration Table
36164e1bc9a0SAchim Leubner  *  \param agsaRoot         Pointer to a data structure containing both application
36174e1bc9a0SAchim Leubner  *                          and LL layer context handles
36184e1bc9a0SAchim Leubner  *  \param outQueueCfg      Pointer to outbuond configuration area
36194e1bc9a0SAchim Leubner  *  \param QueueTableOffset Queue configuration table offset
36204e1bc9a0SAchim Leubner  *  \param pcibar           PCI BAR
36214e1bc9a0SAchim Leubner  *
36224e1bc9a0SAchim Leubner  * Return:
36234e1bc9a0SAchim Leubner  *         None
36244e1bc9a0SAchim Leubner  */
36254e1bc9a0SAchim Leubner /*******************************************************************************/
mpiUpdateFatalErrorTable(agsaRoot_t * agRoot,bit32 FerrTableOffset,bit32 lowerBaseAddress,bit32 upperBaseAddress,bit32 length,bit8 pcibar)36264e1bc9a0SAchim Leubner GLOBAL void mpiUpdateFatalErrorTable(agsaRoot_t             *agRoot,
36274e1bc9a0SAchim Leubner                               bit32                         FerrTableOffset,
36284e1bc9a0SAchim Leubner                               bit32                         lowerBaseAddress,
36294e1bc9a0SAchim Leubner                               bit32                         upperBaseAddress,
36304e1bc9a0SAchim Leubner                               bit32                         length,
36314e1bc9a0SAchim Leubner                               bit8                          pcibar)
36324e1bc9a0SAchim Leubner {
36334e1bc9a0SAchim Leubner 
36344e1bc9a0SAchim Leubner   smTraceFuncEnter(hpDBG_VERY_LOUD,"2U");
36354e1bc9a0SAchim Leubner 
36364e1bc9a0SAchim Leubner   ossaHwRegWriteExt(agRoot, pcibar, (bit32)(FerrTableOffset + MPI_FATAL_EDUMP_TABLE_LO_OFFSET), lowerBaseAddress);
36374e1bc9a0SAchim Leubner   ossaHwRegWriteExt(agRoot, pcibar, (bit32)(FerrTableOffset + MPI_FATAL_EDUMP_TABLE_HI_OFFSET), upperBaseAddress);
36384e1bc9a0SAchim Leubner   ossaHwRegWriteExt(agRoot, pcibar, (bit32)(FerrTableOffset + MPI_FATAL_EDUMP_TABLE_LENGTH), length);
36394e1bc9a0SAchim Leubner   ossaHwRegWriteExt(agRoot, pcibar, (bit32)(FerrTableOffset + MPI_FATAL_EDUMP_TABLE_HANDSHAKE), 0);
36404e1bc9a0SAchim Leubner   ossaHwRegWriteExt(agRoot, pcibar, (bit32)(FerrTableOffset + MPI_FATAL_EDUMP_TABLE_STATUS), 0);
36414e1bc9a0SAchim Leubner 
36424e1bc9a0SAchim Leubner 
36434e1bc9a0SAchim Leubner   SA_DBG3(("mpiUpdateFatalErrorTable: Offset 0x%08x  MPI_FATAL_EDUMP_TABLE_LO_OFFSET 0x%x\n",FerrTableOffset + MPI_FATAL_EDUMP_TABLE_LO_OFFSET, lowerBaseAddress));
36444e1bc9a0SAchim Leubner   SA_DBG3(("mpiUpdateFatalErrorTable: Offset 0x%08x  MPI_FATAL_EDUMP_TABLE_HI_OFFSET 0x%x\n",FerrTableOffset + MPI_FATAL_EDUMP_TABLE_HI_OFFSET,upperBaseAddress ));
36454e1bc9a0SAchim Leubner   SA_DBG3(("mpiUpdateFatalErrorTable: Offset 0x%08x  MPI_FATAL_EDUMP_TABLE_LENGTH    0x%x\n",FerrTableOffset + MPI_FATAL_EDUMP_TABLE_LENGTH, length));
36464e1bc9a0SAchim Leubner   SA_DBG3(("mpiUpdateFatalErrorTable: Offset 0x%08x  MPI_FATAL_EDUMP_TABLE_HANDSHAKE 0x%x\n",FerrTableOffset + MPI_FATAL_EDUMP_TABLE_HANDSHAKE,0 ));
36474e1bc9a0SAchim Leubner   SA_DBG3(("mpiUpdateFatalErrorTable: Offset 0x%08x  MPI_FATAL_EDUMP_TABLE_STATUS    0x%x\n",FerrTableOffset + MPI_FATAL_EDUMP_TABLE_STATUS,0 ));
36484e1bc9a0SAchim Leubner   smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2U");
36494e1bc9a0SAchim Leubner }
36504e1bc9a0SAchim Leubner 
36514e1bc9a0SAchim Leubner 
36524e1bc9a0SAchim Leubner /*******************************************************************************/
36534e1bc9a0SAchim Leubner /** \fn bit32 mpiGetPCIBarIndex(agsaRoot_t *agRoot, pciBar)
36544e1bc9a0SAchim Leubner  *  \brief Get PCI BAR Index from PCI BAR
36554e1bc9a0SAchim Leubner  *  \param agsaRoot Pointer to a data structure containing both application and LL layer context handles
36564e1bc9a0SAchim Leubner  *  \param pciBar - PCI BAR
36574e1bc9a0SAchim Leubner  *
36584e1bc9a0SAchim Leubner  * Return:
36594e1bc9a0SAchim Leubner  *         PCI BAR Index
36604e1bc9a0SAchim Leubner  */
36614e1bc9a0SAchim Leubner /*******************************************************************************/
mpiGetPCIBarIndex(agsaRoot_t * agRoot,bit32 pciBar)36624e1bc9a0SAchim Leubner GLOBAL bit32 mpiGetPCIBarIndex(agsaRoot_t *agRoot, bit32 pciBar)
36634e1bc9a0SAchim Leubner {
36644e1bc9a0SAchim Leubner   switch(pciBar)
36654e1bc9a0SAchim Leubner   {
36664e1bc9a0SAchim Leubner   case BAR0:
36674e1bc9a0SAchim Leubner   case BAR1:
36684e1bc9a0SAchim Leubner       pciBar = PCIBAR0;
36694e1bc9a0SAchim Leubner       break;
36704e1bc9a0SAchim Leubner   case BAR2:
36714e1bc9a0SAchim Leubner   case BAR3:
36724e1bc9a0SAchim Leubner       pciBar = PCIBAR1;
36734e1bc9a0SAchim Leubner       break;
36744e1bc9a0SAchim Leubner   case BAR4:
36754e1bc9a0SAchim Leubner       pciBar = PCIBAR2;
36764e1bc9a0SAchim Leubner       break;
36774e1bc9a0SAchim Leubner   case BAR5:
36784e1bc9a0SAchim Leubner       pciBar = PCIBAR3;
36794e1bc9a0SAchim Leubner       break;
36804e1bc9a0SAchim Leubner   default:
36814e1bc9a0SAchim Leubner       pciBar = PCIBAR0;
36824e1bc9a0SAchim Leubner       break;
36834e1bc9a0SAchim Leubner   }
36844e1bc9a0SAchim Leubner 
36854e1bc9a0SAchim Leubner   return pciBar;
36864e1bc9a0SAchim Leubner }
36874e1bc9a0SAchim Leubner 
36884e1bc9a0SAchim Leubner /*******************************************************************************/
36894e1bc9a0SAchim Leubner /** \fn void mpiReadGSTTable(agsaRoot_t *agRoot, spc_GSTableDescriptor_t *mpiGSTable)
36904e1bc9a0SAchim Leubner  *  \brief Reading the General Status Table
36914e1bc9a0SAchim Leubner  *
36924e1bc9a0SAchim Leubner  *  \param agsaRoot         Handles for this instance of SAS/SATA LLL
36934e1bc9a0SAchim Leubner  *  \param mpiGSTable       Pointer of General Status Table
36944e1bc9a0SAchim Leubner  *
36954e1bc9a0SAchim Leubner  * Return:
36964e1bc9a0SAchim Leubner  *         None
36974e1bc9a0SAchim Leubner  */
36984e1bc9a0SAchim Leubner /*******************************************************************************/
mpiReadGSTable(agsaRoot_t * agRoot,spc_GSTableDescriptor_t * mpiGSTable)36994e1bc9a0SAchim Leubner GLOBAL void mpiReadGSTable(agsaRoot_t             *agRoot,
37004e1bc9a0SAchim Leubner                          spc_GSTableDescriptor_t  *mpiGSTable)
37014e1bc9a0SAchim Leubner {
37024e1bc9a0SAchim Leubner   bit32 CFGTableOffset, TableOffset;
37034e1bc9a0SAchim Leubner   bit32 GSTableOffset;
37044e1bc9a0SAchim Leubner   bit8  i, pcibar;
37054e1bc9a0SAchim Leubner 
37064e1bc9a0SAchim Leubner   smTraceFuncEnter(hpDBG_VERY_LOUD,"m9");
37074e1bc9a0SAchim Leubner 
37084e1bc9a0SAchim Leubner   /* get offset of the configuration table */
37094e1bc9a0SAchim Leubner   TableOffset = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_0,MSGU_SCRATCH_PAD_0);
37104e1bc9a0SAchim Leubner 
37114e1bc9a0SAchim Leubner   if(0xFFFFFFFF ==  TableOffset)
37124e1bc9a0SAchim Leubner   {
37134e1bc9a0SAchim Leubner     SA_ASSERT(0xFFFFFFFF ==  TableOffset, "Chip PCI dead");
37144e1bc9a0SAchim Leubner 
37154e1bc9a0SAchim Leubner     SA_DBG1(("mpiReadGSTable: Chip PCI dead  TableOffset 0x%x\n", TableOffset));
37164e1bc9a0SAchim Leubner     return;
37174e1bc9a0SAchim Leubner   }
37184e1bc9a0SAchim Leubner 
37194e1bc9a0SAchim Leubner //  SA_DBG1(("mpiReadGSTable: TableOffset 0x%x\n", TableOffset));
37204e1bc9a0SAchim Leubner   CFGTableOffset = TableOffset & SCRATCH_PAD0_OFFSET_MASK;
37214e1bc9a0SAchim Leubner 
37224e1bc9a0SAchim Leubner   /* get PCI BAR */
37234e1bc9a0SAchim Leubner   TableOffset = (TableOffset & SCRATCH_PAD0_BAR_MASK) >> SHIFT26;
37244e1bc9a0SAchim Leubner   /* convert the PCI BAR to logical bar number */
37254e1bc9a0SAchim Leubner   pcibar = (bit8)mpiGetPCIBarIndex(agRoot, TableOffset);
37264e1bc9a0SAchim Leubner 
37274e1bc9a0SAchim Leubner   /* read GST Table Offset from the configuration table */
37284e1bc9a0SAchim Leubner   GSTableOffset = ossaHwRegReadExt(agRoot, pcibar, (bit32)CFGTableOffset + MAIN_GST_OFFSET);
37294e1bc9a0SAchim Leubner //  SA_DBG1(("mpiReadGSTable: GSTableOffset 0x%x\n",GSTableOffset ));
37304e1bc9a0SAchim Leubner 
37314e1bc9a0SAchim Leubner   GSTableOffset = CFGTableOffset + GSTableOffset;
37324e1bc9a0SAchim Leubner 
37334e1bc9a0SAchim Leubner   mpiGSTable->GSTLenMPIS = ossaHwRegReadExt(agRoot, pcibar, (bit32)(GSTableOffset + GST_GSTLEN_MPIS_OFFSET));
37344e1bc9a0SAchim Leubner   mpiGSTable->IQFreezeState0 = ossaHwRegReadExt(agRoot, pcibar, (bit32)(GSTableOffset + GST_IQ_FREEZE_STATE0_OFFSET));
37354e1bc9a0SAchim Leubner   mpiGSTable->IQFreezeState1 = ossaHwRegReadExt(agRoot, pcibar, (bit32)(GSTableOffset + GST_IQ_FREEZE_STATE1_OFFSET));
37364e1bc9a0SAchim Leubner   mpiGSTable->MsguTcnt       = ossaHwRegReadExt(agRoot, pcibar, (bit32)(GSTableOffset + GST_MSGUTCNT_OFFSET));
37374e1bc9a0SAchim Leubner   mpiGSTable->IopTcnt        = ossaHwRegReadExt(agRoot, pcibar, (bit32)(GSTableOffset + GST_IOPTCNT_OFFSET));
37384e1bc9a0SAchim Leubner   mpiGSTable->Iop1Tcnt       = ossaHwRegReadExt(agRoot, pcibar, (bit32)(GSTableOffset + GST_IOP1TCNT_OFFSET));
37394e1bc9a0SAchim Leubner 
37404e1bc9a0SAchim Leubner   SA_DBG4(("mpiReadGSTable: GSTLenMPIS     0x%x\n", mpiGSTable->GSTLenMPIS));
37414e1bc9a0SAchim Leubner   SA_DBG4(("mpiReadGSTable: GSTLen         0x%x\n", (mpiGSTable->GSTLenMPIS & 0xfff8) >> SHIFT3));
37424e1bc9a0SAchim Leubner   SA_DBG4(("mpiReadGSTable: IQFreezeState0 0x%x\n", mpiGSTable->IQFreezeState0));
37434e1bc9a0SAchim Leubner   SA_DBG4(("mpiReadGSTable: IQFreezeState1 0x%x\n", mpiGSTable->IQFreezeState1));
37444e1bc9a0SAchim Leubner   SA_DBG4(("mpiReadGSTable: MsguTcnt       0x%x\n", mpiGSTable->MsguTcnt));
37454e1bc9a0SAchim Leubner   SA_DBG4(("mpiReadGSTable: IopTcnt        0x%x\n", mpiGSTable->IopTcnt));
37464e1bc9a0SAchim Leubner   SA_DBG4(("mpiReadGSTable: Iop1Tcnt       0x%x\n", mpiGSTable->Iop1Tcnt));
37474e1bc9a0SAchim Leubner 
37484e1bc9a0SAchim Leubner 
37494e1bc9a0SAchim Leubner   if(smIS_SPCV(agRoot))
37504e1bc9a0SAchim Leubner   {
37514e1bc9a0SAchim Leubner     /***** read Phy State from SAS Phy Attribute Table */
37524e1bc9a0SAchim Leubner     TableOffset = ossaHwRegReadExt(agRoot, pcibar, (bit32)CFGTableOffset + MAIN_PHY_ATTRIBUTE_OFFSET);
37534e1bc9a0SAchim Leubner     TableOffset &= 0x00FFFFFF;
37544e1bc9a0SAchim Leubner     TableOffset = TableOffset + CFGTableOffset;
37554e1bc9a0SAchim Leubner     for (i = 0; i < 8; i++)
37564e1bc9a0SAchim Leubner     {
37574e1bc9a0SAchim Leubner       mpiGSTable->PhyState[i] = ossaHwRegReadExt(agRoot, pcibar, (bit32)(TableOffset + i * sizeof(phyAttrb_t)));
37584e1bc9a0SAchim Leubner       SA_DBG4(("mpiReadGSTable: PhyState[0x%x] 0x%x\n", i, mpiGSTable->PhyState[i]));
37594e1bc9a0SAchim Leubner     }
37604e1bc9a0SAchim Leubner   }
37614e1bc9a0SAchim Leubner   else
37624e1bc9a0SAchim Leubner   {
37634e1bc9a0SAchim Leubner     for (i = 0; i < 8; i++)
37644e1bc9a0SAchim Leubner     {
37654e1bc9a0SAchim Leubner       mpiGSTable->PhyState[i] = ossaHwRegReadExt(agRoot, pcibar, (bit32)(GSTableOffset + GST_PHYSTATE_OFFSET + i * 4));
37664e1bc9a0SAchim Leubner       SA_DBG4(("mpiReadGSTable: PhyState[0x%x] 0x%x\n", i, mpiGSTable->PhyState[i]));
37674e1bc9a0SAchim Leubner     }
37684e1bc9a0SAchim Leubner   }
37694e1bc9a0SAchim Leubner 
37704e1bc9a0SAchim Leubner   mpiGSTable->GPIOpins = ossaHwRegReadExt(agRoot, pcibar, (bit32)(GSTableOffset + GST_GPIO_PINS_OFFSET));
37714e1bc9a0SAchim Leubner   SA_DBG4(("mpiReadGSTable: GPIOpins 0x%x\n", mpiGSTable->GPIOpins));
37724e1bc9a0SAchim Leubner 
37734e1bc9a0SAchim Leubner   for (i = 0; i < 8; i++)
37744e1bc9a0SAchim Leubner   {
37754e1bc9a0SAchim Leubner     mpiGSTable->recoverErrInfo[i] = ossaHwRegReadExt(agRoot, pcibar, (bit32)(GSTableOffset + GST_RERRINFO_OFFSET));
37764e1bc9a0SAchim Leubner     SA_DBG4(("mpiReadGSTable: recoverErrInfo[0x%x] 0x%x\n", i, mpiGSTable->recoverErrInfo[i]));
37774e1bc9a0SAchim Leubner   }
37784e1bc9a0SAchim Leubner 
37794e1bc9a0SAchim Leubner   smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "m9");
37804e1bc9a0SAchim Leubner 
37814e1bc9a0SAchim Leubner }
37824e1bc9a0SAchim Leubner 
37834e1bc9a0SAchim Leubner /*******************************************************************************/
37844e1bc9a0SAchim Leubner /** \fn void siInitResources(agsaRoot_t *agRoot)
37854e1bc9a0SAchim Leubner  *  Initialization of LL resources
37864e1bc9a0SAchim Leubner  *
37874e1bc9a0SAchim Leubner  *  \param agsaRoot         Handles for this instance of SAS/SATA LLL
37884e1bc9a0SAchim Leubner  *  \param memoryAllocated  Point to the data structure that holds the different
37894e1bc9a0SAchim Leubner  *                          chunks of memory that are required
37904e1bc9a0SAchim Leubner  *
37914e1bc9a0SAchim Leubner  * Return:
37924e1bc9a0SAchim Leubner  *         None
37934e1bc9a0SAchim Leubner  */
37944e1bc9a0SAchim Leubner /*******************************************************************************/
siInitResources(agsaRoot_t * agRoot,agsaMemoryRequirement_t * memoryAllocated,agsaHwConfig_t * hwConfig,agsaSwConfig_t * swConfig,bit32 usecsPerTick)37954e1bc9a0SAchim Leubner GLOBAL void siInitResources(agsaRoot_t              *agRoot,
37964e1bc9a0SAchim Leubner                             agsaMemoryRequirement_t *memoryAllocated,
37974e1bc9a0SAchim Leubner                             agsaHwConfig_t          *hwConfig,
37984e1bc9a0SAchim Leubner                             agsaSwConfig_t          *swConfig,
37994e1bc9a0SAchim Leubner                             bit32                   usecsPerTick)
38004e1bc9a0SAchim Leubner {
38014e1bc9a0SAchim Leubner   agsaLLRoot_t          *saRoot;
38024e1bc9a0SAchim Leubner   agsaDeviceDesc_t      *pDeviceDesc;
38034e1bc9a0SAchim Leubner   agsaIORequestDesc_t   *pRequestDesc;
38044e1bc9a0SAchim Leubner   agsaTimerDesc_t       *pTimerDesc;
38054e1bc9a0SAchim Leubner   agsaPort_t            *pPort;
38064e1bc9a0SAchim Leubner   agsaPortMap_t         *pPortMap;
38074e1bc9a0SAchim Leubner   agsaDeviceMap_t       *pDeviceMap;
38084e1bc9a0SAchim Leubner   agsaIOMap_t           *pIOMap;
38094e1bc9a0SAchim Leubner   bit32                 maxNumIODevices;
38104e1bc9a0SAchim Leubner   bit32                 i, j;
38114e1bc9a0SAchim Leubner   mpiICQueue_t          *circularIQ;
38124e1bc9a0SAchim Leubner   mpiOCQueue_t          *circularOQ;
38134e1bc9a0SAchim Leubner 
38144e1bc9a0SAchim Leubner   if (agNULL == agRoot)
38154e1bc9a0SAchim Leubner   {
38164e1bc9a0SAchim Leubner     return;
38174e1bc9a0SAchim Leubner   }
38184e1bc9a0SAchim Leubner 
38194e1bc9a0SAchim Leubner   /* Get the saRoot memory address */
38204e1bc9a0SAchim Leubner   saRoot = (agsaLLRoot_t *) (memoryAllocated->agMemory[LLROOT_MEM_INDEX].virtPtr);
38214e1bc9a0SAchim Leubner   agRoot->sdkData = (void *) saRoot;
38224e1bc9a0SAchim Leubner 
38234e1bc9a0SAchim Leubner   /* Setup Device link */
38244e1bc9a0SAchim Leubner   /* Save the information of allocated device Link memory */
38254e1bc9a0SAchim Leubner   saRoot->deviceLinkMem = memoryAllocated->agMemory[DEVICELINK_MEM_INDEX];
38264e1bc9a0SAchim Leubner   si_memset(saRoot->deviceLinkMem.virtPtr, 0, saRoot->deviceLinkMem.totalLength);
38274e1bc9a0SAchim Leubner   SA_DBG2(("siInitResources: [%d] saRoot->deviceLinkMem VirtPtr=%p PhysicalLo=%x Count=%x Total=%x type %x\n" ,
38284e1bc9a0SAchim Leubner     DEVICELINK_MEM_INDEX,
38294e1bc9a0SAchim Leubner     saRoot->deviceLinkMem.virtPtr,
38304e1bc9a0SAchim Leubner     saRoot->deviceLinkMem.phyAddrLower,
38314e1bc9a0SAchim Leubner     saRoot->deviceLinkMem.numElements,
38324e1bc9a0SAchim Leubner     saRoot->deviceLinkMem.totalLength,
38334e1bc9a0SAchim Leubner     saRoot->deviceLinkMem.type));
38344e1bc9a0SAchim Leubner 
38354e1bc9a0SAchim Leubner   maxNumIODevices = swConfig->numDevHandles;
38364e1bc9a0SAchim Leubner   SA_DBG2(("siInitResources:  maxNumIODevices=%d, swConfig->numDevHandles=%d \n",
38374e1bc9a0SAchim Leubner     maxNumIODevices,
38384e1bc9a0SAchim Leubner     swConfig->numDevHandles));
38394e1bc9a0SAchim Leubner 
38404e1bc9a0SAchim Leubner   /* Setup free IO Devices link list */
38414e1bc9a0SAchim Leubner   saLlistInitialize(&(saRoot->freeDevicesList));
38424e1bc9a0SAchim Leubner   for ( i = 0; i < (bit32) maxNumIODevices; i ++ )
38434e1bc9a0SAchim Leubner   {
38444e1bc9a0SAchim Leubner     /* get the pointer to the device descriptor */
38454e1bc9a0SAchim Leubner     pDeviceDesc = (agsaDeviceDesc_t *) AGSAMEM_ELEMENT_READ(&(saRoot->deviceLinkMem), i);
38464e1bc9a0SAchim Leubner     /* Initialize device descriptor */
38474e1bc9a0SAchim Leubner     saLlinkInitialize(&(pDeviceDesc->linkNode));
38484e1bc9a0SAchim Leubner 
38494e1bc9a0SAchim Leubner     pDeviceDesc->initiatorDevHandle.osData    = agNULL;
38504e1bc9a0SAchim Leubner     pDeviceDesc->initiatorDevHandle.sdkData   = agNULL;
38514e1bc9a0SAchim Leubner     pDeviceDesc->targetDevHandle.osData       = agNULL;
38524e1bc9a0SAchim Leubner     pDeviceDesc->targetDevHandle.sdkData      = agNULL;
38534e1bc9a0SAchim Leubner     pDeviceDesc->deviceType                   = SAS_SATA_UNKNOWN_DEVICE;
38544e1bc9a0SAchim Leubner     pDeviceDesc->pPort                        = agNULL;
38554e1bc9a0SAchim Leubner     pDeviceDesc->DeviceMapIndex               = 0;
38564e1bc9a0SAchim Leubner 
38574e1bc9a0SAchim Leubner     saLlistInitialize(&(pDeviceDesc->pendingIORequests));
38584e1bc9a0SAchim Leubner 
38594e1bc9a0SAchim Leubner     /* Add the device descriptor to the free IO device link list */
38604e1bc9a0SAchim Leubner     saLlistAdd(&(saRoot->freeDevicesList), &(pDeviceDesc->linkNode));
38614e1bc9a0SAchim Leubner   }
38624e1bc9a0SAchim Leubner 
38634e1bc9a0SAchim Leubner   /* Setup IO Request link */
38644e1bc9a0SAchim Leubner   /* Save the information of allocated IO Request Link memory */
38654e1bc9a0SAchim Leubner   saRoot->IORequestMem = memoryAllocated->agMemory[IOREQLINK_MEM_INDEX];
38664e1bc9a0SAchim Leubner   si_memset(saRoot->IORequestMem.virtPtr, 0, saRoot->IORequestMem.totalLength);
38674e1bc9a0SAchim Leubner 
38684e1bc9a0SAchim Leubner   SA_DBG2(("siInitResources: [%d] saRoot->IORequestMem  VirtPtr=%p PhysicalLo=%x Count=%x Total=%x type %x\n",
38694e1bc9a0SAchim Leubner     IOREQLINK_MEM_INDEX,
38704e1bc9a0SAchim Leubner     saRoot->IORequestMem.virtPtr,
38714e1bc9a0SAchim Leubner     saRoot->IORequestMem.phyAddrLower,
38724e1bc9a0SAchim Leubner     saRoot->IORequestMem.numElements,
38734e1bc9a0SAchim Leubner     saRoot->IORequestMem.totalLength,
38744e1bc9a0SAchim Leubner     saRoot->IORequestMem.type));
38754e1bc9a0SAchim Leubner 
38764e1bc9a0SAchim Leubner   /* Setup free IO  Request link list */
38774e1bc9a0SAchim Leubner   saLlistIOInitialize(&(saRoot->freeIORequests));
38784e1bc9a0SAchim Leubner   saLlistIOInitialize(&(saRoot->freeReservedRequests));
38794e1bc9a0SAchim Leubner   for ( i = 0; i < swConfig->maxActiveIOs; i ++ )
38804e1bc9a0SAchim Leubner   {
38814e1bc9a0SAchim Leubner     /* get the pointer to the request descriptor */
38824e1bc9a0SAchim Leubner     pRequestDesc = (agsaIORequestDesc_t *) AGSAMEM_ELEMENT_READ(&(saRoot->IORequestMem), i);
38834e1bc9a0SAchim Leubner     /* Initialize request descriptor */
38844e1bc9a0SAchim Leubner     saLlinkIOInitialize(&(pRequestDesc->linkNode));
38854e1bc9a0SAchim Leubner 
38864e1bc9a0SAchim Leubner     pRequestDesc->valid             = agFALSE;
38874e1bc9a0SAchim Leubner     pRequestDesc->requestType       = AGSA_REQ_TYPE_UNKNOWN;
38884e1bc9a0SAchim Leubner     pRequestDesc->pIORequestContext = agNULL;
38894e1bc9a0SAchim Leubner     pRequestDesc->HTag              = i;
38904e1bc9a0SAchim Leubner     pRequestDesc->pDevice           = agNULL;
38914e1bc9a0SAchim Leubner     pRequestDesc->pPort             = agNULL;
38924e1bc9a0SAchim Leubner 
38934e1bc9a0SAchim Leubner     /* Add the request descriptor to the free IO Request link list */
38944e1bc9a0SAchim Leubner     /* Add the request descriptor to the free Reserved Request link list */
38954e1bc9a0SAchim Leubner   /* SMP request must get service so reserve one request when first SMP completes */
38964e1bc9a0SAchim Leubner     if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT)
38974e1bc9a0SAchim Leubner     {
38984e1bc9a0SAchim Leubner       saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequestDesc->linkNode));
38994e1bc9a0SAchim Leubner     }
39004e1bc9a0SAchim Leubner     else
39014e1bc9a0SAchim Leubner     {
39024e1bc9a0SAchim Leubner       saLlistIOAdd(&(saRoot->freeIORequests), &(pRequestDesc->linkNode));
39034e1bc9a0SAchim Leubner     }
39044e1bc9a0SAchim Leubner   }
39054e1bc9a0SAchim Leubner 
39064e1bc9a0SAchim Leubner 
39074e1bc9a0SAchim Leubner   /* Setup timer link */
39084e1bc9a0SAchim Leubner   /* Save the information of allocated timer Link memory */
39094e1bc9a0SAchim Leubner   saRoot->timerLinkMem = memoryAllocated->agMemory[TIMERLINK_MEM_INDEX];
39104e1bc9a0SAchim Leubner   si_memset(saRoot->timerLinkMem.virtPtr, 0, saRoot->timerLinkMem.totalLength);
39114e1bc9a0SAchim Leubner   SA_DBG2(("siInitResources: [%d] saRoot->timerLinkMem  VirtPtr=%p PhysicalLo=%x Count=%x Total=%x type %x\n",
39124e1bc9a0SAchim Leubner     TIMERLINK_MEM_INDEX,
39134e1bc9a0SAchim Leubner     saRoot->timerLinkMem.virtPtr,
39144e1bc9a0SAchim Leubner     saRoot->timerLinkMem.phyAddrLower,
39154e1bc9a0SAchim Leubner     saRoot->timerLinkMem.numElements,
39164e1bc9a0SAchim Leubner     saRoot->timerLinkMem.totalLength,
39174e1bc9a0SAchim Leubner     saRoot->timerLinkMem.type));
39184e1bc9a0SAchim Leubner 
39194e1bc9a0SAchim Leubner   /* Setup free timer link list */
39204e1bc9a0SAchim Leubner   saLlistInitialize(&(saRoot->freeTimers));
39214e1bc9a0SAchim Leubner   for ( i = 0; i < NUM_TIMERS; i ++ )
39224e1bc9a0SAchim Leubner   {
39234e1bc9a0SAchim Leubner     /* get the pointer to the timer descriptor */
39244e1bc9a0SAchim Leubner     pTimerDesc = (agsaTimerDesc_t *) AGSAMEM_ELEMENT_READ(&(saRoot->timerLinkMem), i);
39254e1bc9a0SAchim Leubner     /* Initialize timer descriptor */
39264e1bc9a0SAchim Leubner     saLlinkInitialize(&(pTimerDesc->linkNode));
39274e1bc9a0SAchim Leubner 
39284e1bc9a0SAchim Leubner     pTimerDesc->valid         = agFALSE;
39294e1bc9a0SAchim Leubner     pTimerDesc->timeoutTick   = 0;
39304e1bc9a0SAchim Leubner     pTimerDesc->pfnTimeout    = agNULL;
39314e1bc9a0SAchim Leubner     pTimerDesc->Event         = 0;
39324e1bc9a0SAchim Leubner     pTimerDesc->pParm         = agNULL;
39334e1bc9a0SAchim Leubner 
39344e1bc9a0SAchim Leubner     /* Add the timer descriptor to the free timer link list */
39354e1bc9a0SAchim Leubner     saLlistAdd(&(saRoot->freeTimers), &(pTimerDesc->linkNode));
39364e1bc9a0SAchim Leubner   }
39374e1bc9a0SAchim Leubner   /* Setup valid timer link list */
39384e1bc9a0SAchim Leubner   saLlistInitialize(&(saRoot->validTimers));
39394e1bc9a0SAchim Leubner 
39404e1bc9a0SAchim Leubner   /* Setup Phys */
39414e1bc9a0SAchim Leubner   /* Setup PhyCount */
39424e1bc9a0SAchim Leubner   saRoot->phyCount = (bit8) hwConfig->phyCount;
39434e1bc9a0SAchim Leubner   /* Init Phy data structure */
39444e1bc9a0SAchim Leubner   for ( i = 0; i < saRoot->phyCount; i ++ )
39454e1bc9a0SAchim Leubner   {
39464e1bc9a0SAchim Leubner     saRoot->phys[i].pPort = agNULL;
39474e1bc9a0SAchim Leubner     saRoot->phys[i].phyId = (bit8) i;
39484e1bc9a0SAchim Leubner 
39494e1bc9a0SAchim Leubner     /* setup phy status is PHY_STOPPED */
39504e1bc9a0SAchim Leubner     PHY_STATUS_SET(&(saRoot->phys[i]), PHY_STOPPED);
39514e1bc9a0SAchim Leubner   }
39524e1bc9a0SAchim Leubner 
39534e1bc9a0SAchim Leubner   /* Setup Ports */
39544e1bc9a0SAchim Leubner   /* Setup PortCount */
39554e1bc9a0SAchim Leubner   saRoot->portCount = saRoot->phyCount;
39564e1bc9a0SAchim Leubner   /* Setup free port link list */
39574e1bc9a0SAchim Leubner   saLlistInitialize(&(saRoot->freePorts));
39584e1bc9a0SAchim Leubner   for ( i = 0; i < saRoot->portCount; i ++ )
39594e1bc9a0SAchim Leubner   {
39604e1bc9a0SAchim Leubner     /* get the pointer to the port */
39614e1bc9a0SAchim Leubner     pPort = &(saRoot->ports[i]);
39624e1bc9a0SAchim Leubner     /* Initialize port */
39634e1bc9a0SAchim Leubner     saLlinkInitialize(&(pPort->linkNode));
39644e1bc9a0SAchim Leubner 
39654e1bc9a0SAchim Leubner     pPort->portContext.osData   = agNULL;
39664e1bc9a0SAchim Leubner     pPort->portContext.sdkData  = pPort;
39674e1bc9a0SAchim Leubner     pPort->portId         = 0;
39684e1bc9a0SAchim Leubner     pPort->portIdx        = (bit8) i;
39694e1bc9a0SAchim Leubner     pPort->status         = PORT_NORMAL;
39704e1bc9a0SAchim Leubner 
39714e1bc9a0SAchim Leubner     for ( j = 0; j < saRoot->phyCount; j ++ )
39724e1bc9a0SAchim Leubner     {
39734e1bc9a0SAchim Leubner       pPort->phyMap[j] = agFALSE;
39744e1bc9a0SAchim Leubner     }
39754e1bc9a0SAchim Leubner 
39764e1bc9a0SAchim Leubner     saLlistInitialize(&(pPort->listSASATADevices));
39774e1bc9a0SAchim Leubner 
39784e1bc9a0SAchim Leubner     /* Add the port to the free port link list */
39794e1bc9a0SAchim Leubner     saLlistAdd(&(saRoot->freePorts), &(pPort->linkNode));
39804e1bc9a0SAchim Leubner   }
39814e1bc9a0SAchim Leubner   /* Setup valid port link list */
39824e1bc9a0SAchim Leubner   saLlistInitialize(&(saRoot->validPorts));
39834e1bc9a0SAchim Leubner 
39844e1bc9a0SAchim Leubner   /* Init sysIntsActive */
39854e1bc9a0SAchim Leubner   saRoot->sysIntsActive = agFALSE;
39864e1bc9a0SAchim Leubner 
39874e1bc9a0SAchim Leubner   /* setup timer tick granunarity */
39884e1bc9a0SAchim Leubner   saRoot->usecsPerTick = usecsPerTick;
39894e1bc9a0SAchim Leubner 
39904e1bc9a0SAchim Leubner   /* initialize LL timer tick */
39914e1bc9a0SAchim Leubner   saRoot->timeTick = 0;
39924e1bc9a0SAchim Leubner 
39934e1bc9a0SAchim Leubner   /* initialize device (de)registration callback fns */
39944e1bc9a0SAchim Leubner   saRoot->DeviceRegistrationCB = agNULL;
39954e1bc9a0SAchim Leubner   saRoot->DeviceDeregistrationCB = agNULL;
39964e1bc9a0SAchim Leubner 
39974e1bc9a0SAchim Leubner   /* Initialize the PortMap for port context */
39984e1bc9a0SAchim Leubner   for ( i = 0; i < saRoot->portCount; i ++ )
39994e1bc9a0SAchim Leubner   {
40004e1bc9a0SAchim Leubner     pPortMap = &(saRoot->PortMap[i]);
40014e1bc9a0SAchim Leubner 
40024e1bc9a0SAchim Leubner     pPortMap->PortContext   = agNULL;
40034e1bc9a0SAchim Leubner     pPortMap->PortID        = PORT_MARK_OFF;
40044e1bc9a0SAchim Leubner     pPortMap->PortStatus    = PORT_NORMAL;
40054e1bc9a0SAchim Leubner     saRoot->autoDeregDeviceflag[i] = 0;
40064e1bc9a0SAchim Leubner   }
40074e1bc9a0SAchim Leubner 
40084e1bc9a0SAchim Leubner   /* Initialize the DeviceMap for device handle */
40094e1bc9a0SAchim Leubner   for ( i = 0; i < MAX_IO_DEVICE_ENTRIES; i ++ )
40104e1bc9a0SAchim Leubner   {
40114e1bc9a0SAchim Leubner     pDeviceMap = &(saRoot->DeviceMap[i]);
40124e1bc9a0SAchim Leubner 
40134e1bc9a0SAchim Leubner     pDeviceMap->DeviceHandle  = agNULL;
40144e1bc9a0SAchim Leubner     pDeviceMap->DeviceIdFromFW   =  i;
40154e1bc9a0SAchim Leubner   }
40164e1bc9a0SAchim Leubner 
40174e1bc9a0SAchim Leubner   /* Initialize the IOMap for IOrequest */
40184e1bc9a0SAchim Leubner   for ( i = 0; i < MAX_ACTIVE_IO_REQUESTS; i ++ )
40194e1bc9a0SAchim Leubner   {
40204e1bc9a0SAchim Leubner     pIOMap = &(saRoot->IOMap[i]);
40214e1bc9a0SAchim Leubner 
40224e1bc9a0SAchim Leubner     pIOMap->IORequest   = agNULL;
40234e1bc9a0SAchim Leubner     pIOMap->Tag         = MARK_OFF;
40244e1bc9a0SAchim Leubner   }
40254e1bc9a0SAchim Leubner 
40264e1bc9a0SAchim Leubner   /* clean the inbound queues */
40274e1bc9a0SAchim Leubner   for (i = 0; i < saRoot->QueueConfig.numInboundQueues; i ++)
40284e1bc9a0SAchim Leubner   {
40294e1bc9a0SAchim Leubner     if(0 != saRoot->inboundQueue[i].numElements)
40304e1bc9a0SAchim Leubner     {
40314e1bc9a0SAchim Leubner       circularIQ = &saRoot->inboundQueue[i];
40324e1bc9a0SAchim Leubner       si_memset(circularIQ->memoryRegion.virtPtr, 0, circularIQ->memoryRegion.totalLength);
40334e1bc9a0SAchim Leubner       si_memset(saRoot->inboundQueue[i].ciPointer, 0, sizeof(bit32));
40344e1bc9a0SAchim Leubner     }
40354e1bc9a0SAchim Leubner   }
40364e1bc9a0SAchim Leubner   /* clean the outbound queues */
40374e1bc9a0SAchim Leubner   for (i = 0; i < saRoot->QueueConfig.numOutboundQueues; i ++)
40384e1bc9a0SAchim Leubner   {
40394e1bc9a0SAchim Leubner     if(0 != saRoot->outboundQueue[i].numElements)
40404e1bc9a0SAchim Leubner     {
40414e1bc9a0SAchim Leubner       circularOQ = &saRoot->outboundQueue[i];
40424e1bc9a0SAchim Leubner       si_memset(circularOQ->memoryRegion.virtPtr, 0, circularOQ->memoryRegion.totalLength);
40434e1bc9a0SAchim Leubner       si_memset(saRoot->outboundQueue[i].piPointer, 0, sizeof(bit32));
40444e1bc9a0SAchim Leubner       circularOQ->producerIdx = 0;
40454e1bc9a0SAchim Leubner       circularOQ->consumerIdx = 0;
40464e1bc9a0SAchim Leubner       SA_DBG3(("siInitResource: Q %d  Clean PI 0x%03x CI 0x%03x\n", i,circularOQ->producerIdx, circularOQ->consumerIdx));
40474e1bc9a0SAchim Leubner     }
40484e1bc9a0SAchim Leubner   }
40494e1bc9a0SAchim Leubner 
40504e1bc9a0SAchim Leubner   return;
40514e1bc9a0SAchim Leubner }
40524e1bc9a0SAchim Leubner 
40534e1bc9a0SAchim Leubner /*******************************************************************************/
40544e1bc9a0SAchim Leubner /** \fn void mpiReadCALTable(agsaRoot_t *agRoot,
40554e1bc9a0SAchim Leubner  *                           spc_SPASTable_t *mpiCALTable, bit32 index)
40564e1bc9a0SAchim Leubner  *  \brief Reading the Phy Analog Setup Register Table
40574e1bc9a0SAchim Leubner  *  \param agsaRoot    Handles for this instance of SAS/SATA LLL
40584e1bc9a0SAchim Leubner  *  \param mpiCALTable Pointer of Phy Calibration Table
40594e1bc9a0SAchim Leubner  *
40604e1bc9a0SAchim Leubner  * Return:
40614e1bc9a0SAchim Leubner  *         None
40624e1bc9a0SAchim Leubner  */
40634e1bc9a0SAchim Leubner /*******************************************************************************/
mpiReadCALTable(agsaRoot_t * agRoot,spc_SPASTable_t * mpiCALTable,bit32 index)40644e1bc9a0SAchim Leubner GLOBAL void mpiReadCALTable(agsaRoot_t      *agRoot,
40654e1bc9a0SAchim Leubner                             spc_SPASTable_t *mpiCALTable,
40664e1bc9a0SAchim Leubner                             bit32           index)
40674e1bc9a0SAchim Leubner {
40684e1bc9a0SAchim Leubner   bit32 CFGTableOffset, TableOffset;
40694e1bc9a0SAchim Leubner   bit32 CALTableOffset;
40704e1bc9a0SAchim Leubner   bit8  pcibar;
40714e1bc9a0SAchim Leubner 
40724e1bc9a0SAchim Leubner   /* get offset of the configuration table */
40734e1bc9a0SAchim Leubner   TableOffset = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_0,MSGU_SCRATCH_PAD_0);
40744e1bc9a0SAchim Leubner 
40754e1bc9a0SAchim Leubner   CFGTableOffset = TableOffset & SCRATCH_PAD0_OFFSET_MASK;
40764e1bc9a0SAchim Leubner 
40774e1bc9a0SAchim Leubner   /* get PCI BAR */
40784e1bc9a0SAchim Leubner   TableOffset = (TableOffset & SCRATCH_PAD0_BAR_MASK) >> SHIFT26;
40794e1bc9a0SAchim Leubner   /* convert the PCI BAR to logical bar number */
40804e1bc9a0SAchim Leubner   pcibar = (bit8)mpiGetPCIBarIndex(agRoot, TableOffset);
40814e1bc9a0SAchim Leubner 
40824e1bc9a0SAchim Leubner   /* read Calibration Table Offset from the configuration table */
40834e1bc9a0SAchim Leubner   CALTableOffset = ossaHwRegReadExt(agRoot, pcibar, (bit32)CFGTableOffset + MAIN_ANALOG_SETUP_OFFSET);
40844e1bc9a0SAchim Leubner   if(smIS_SPCV(agRoot))
40854e1bc9a0SAchim Leubner   {
40864e1bc9a0SAchim Leubner     CALTableOffset &= 0x00FFFFFF;
40874e1bc9a0SAchim Leubner   }
40884e1bc9a0SAchim Leubner   CALTableOffset = CFGTableOffset + CALTableOffset + (index * ANALOG_SETUP_ENTRY_SIZE * 4);
40894e1bc9a0SAchim Leubner 
40904e1bc9a0SAchim Leubner   mpiCALTable->spaReg0 = ossaHwRegReadExt(agRoot, pcibar, (bit32)(CALTableOffset + TX_PORT_CFG1_OFFSET));
40914e1bc9a0SAchim Leubner   mpiCALTable->spaReg1 = ossaHwRegReadExt(agRoot, pcibar, (bit32)(CALTableOffset + TX_PORT_CFG2_OFFSET));
40924e1bc9a0SAchim Leubner   mpiCALTable->spaReg2 = ossaHwRegReadExt(agRoot, pcibar, (bit32)(CALTableOffset + TX_PORT_CFG3_OFFSET));
40934e1bc9a0SAchim Leubner   mpiCALTable->spaReg3 = ossaHwRegReadExt(agRoot, pcibar, (bit32)(CALTableOffset + TX_CFG_OFFSET));
40944e1bc9a0SAchim Leubner   mpiCALTable->spaReg4 = ossaHwRegReadExt(agRoot, pcibar, (bit32)(CALTableOffset + RV_PORT_CFG1_OFFSET));
40954e1bc9a0SAchim Leubner   mpiCALTable->spaReg5 = ossaHwRegReadExt(agRoot, pcibar, (bit32)(CALTableOffset + RV_PORT_CFG2_OFFSET));
40964e1bc9a0SAchim Leubner   mpiCALTable->spaReg6 = ossaHwRegReadExt(agRoot, pcibar, (bit32)(CALTableOffset + RV_CFG1_OFFSET));
40974e1bc9a0SAchim Leubner   mpiCALTable->spaReg7 = ossaHwRegReadExt(agRoot, pcibar, (bit32)(CALTableOffset + RV_CFG2_OFFSET));
40984e1bc9a0SAchim Leubner 
40994e1bc9a0SAchim Leubner   SA_DBG3(("mpiReadCALTable: spaReg0 0x%x\n", mpiCALTable->spaReg0));
41004e1bc9a0SAchim Leubner   SA_DBG3(("mpiReadCALTable: spaReg1 0x%x\n", mpiCALTable->spaReg1));
41014e1bc9a0SAchim Leubner   SA_DBG3(("mpiReadCALTable: spaReg2 0x%x\n", mpiCALTable->spaReg2));
41024e1bc9a0SAchim Leubner   SA_DBG3(("mpiReadCALTable: spaReg3 0x%x\n", mpiCALTable->spaReg3));
41034e1bc9a0SAchim Leubner   SA_DBG3(("mpiReadCALTable: spaReg4 0x%x\n", mpiCALTable->spaReg4));
41044e1bc9a0SAchim Leubner   SA_DBG3(("mpiReadCALTable: spaReg5 0x%x\n", mpiCALTable->spaReg5));
41054e1bc9a0SAchim Leubner   SA_DBG3(("mpiReadCALTable: spaReg6 0x%x\n", mpiCALTable->spaReg6));
41064e1bc9a0SAchim Leubner   SA_DBG3(("mpiReadCALTable: spaReg7 0x%x\n", mpiCALTable->spaReg7));
41074e1bc9a0SAchim Leubner }
41084e1bc9a0SAchim Leubner 
41094e1bc9a0SAchim Leubner /*******************************************************************************/
41104e1bc9a0SAchim Leubner /** \fn void mpiWriteCALTable(agsaRoot_t *agRoot,
41114e1bc9a0SAchim Leubner  *                            spc_SPASTable_t *mpiCALTable, index)
41124e1bc9a0SAchim Leubner  *  \brief Writing the Phy Analog Setup Register Table
41134e1bc9a0SAchim Leubner  *  \param agsaRoot    Handles for this instance of SAS/SATA LLL
41144e1bc9a0SAchim Leubner  *  \param mpiCALTable Pointer of Phy Calibration Table
41154e1bc9a0SAchim Leubner  *
41164e1bc9a0SAchim Leubner  * Return:
41174e1bc9a0SAchim Leubner  *         None
41184e1bc9a0SAchim Leubner  */
41194e1bc9a0SAchim Leubner /*******************************************************************************/
mpiWriteCALTable(agsaRoot_t * agRoot,spc_SPASTable_t * mpiCALTable,bit32 index)41204e1bc9a0SAchim Leubner GLOBAL void mpiWriteCALTable(agsaRoot_t     *agRoot,
41214e1bc9a0SAchim Leubner                             spc_SPASTable_t *mpiCALTable,
41224e1bc9a0SAchim Leubner                             bit32           index)
41234e1bc9a0SAchim Leubner {
41244e1bc9a0SAchim Leubner   bit32 CFGTableOffset, TableOffset;
41254e1bc9a0SAchim Leubner   bit32 CALTableOffset;
41264e1bc9a0SAchim Leubner   bit8  pcibar;
41274e1bc9a0SAchim Leubner 
41284e1bc9a0SAchim Leubner   smTraceFuncEnter(hpDBG_VERY_LOUD,"m6");
41294e1bc9a0SAchim Leubner 
41304e1bc9a0SAchim Leubner   /* get offset of the configuration table */
41314e1bc9a0SAchim Leubner   TableOffset = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_0,MSGU_SCRATCH_PAD_0);
41324e1bc9a0SAchim Leubner 
41334e1bc9a0SAchim Leubner   CFGTableOffset = TableOffset & SCRATCH_PAD0_OFFSET_MASK;
41344e1bc9a0SAchim Leubner 
41354e1bc9a0SAchim Leubner   /* get PCI BAR */
41364e1bc9a0SAchim Leubner   TableOffset = (TableOffset & SCRATCH_PAD0_BAR_MASK) >> SHIFT26;
41374e1bc9a0SAchim Leubner   /* convert the PCI BAR to logical bar number */
41384e1bc9a0SAchim Leubner   pcibar = (bit8)mpiGetPCIBarIndex(agRoot, TableOffset);
41394e1bc9a0SAchim Leubner 
41404e1bc9a0SAchim Leubner   /* read Calibration Table Offset from the configuration table */
41414e1bc9a0SAchim Leubner   CALTableOffset = ossaHwRegReadExt(agRoot, pcibar, (bit32)CFGTableOffset + MAIN_ANALOG_SETUP_OFFSET);
41424e1bc9a0SAchim Leubner   if(smIS_SPCV(agRoot))
41434e1bc9a0SAchim Leubner   {
41444e1bc9a0SAchim Leubner     CALTableOffset &= 0x00FFFFFF;
41454e1bc9a0SAchim Leubner   }
41464e1bc9a0SAchim Leubner   CALTableOffset = CFGTableOffset + CALTableOffset + (index * ANALOG_SETUP_ENTRY_SIZE * 4);
41474e1bc9a0SAchim Leubner 
41484e1bc9a0SAchim Leubner   ossaHwRegWriteExt(agRoot, pcibar, (bit32)(CALTableOffset + TX_PORT_CFG1_OFFSET), mpiCALTable->spaReg0);
41494e1bc9a0SAchim Leubner   ossaHwRegWriteExt(agRoot, pcibar, (bit32)(CALTableOffset + TX_PORT_CFG2_OFFSET), mpiCALTable->spaReg1);
41504e1bc9a0SAchim Leubner   ossaHwRegWriteExt(agRoot, pcibar, (bit32)(CALTableOffset + TX_PORT_CFG3_OFFSET), mpiCALTable->spaReg2);
41514e1bc9a0SAchim Leubner   ossaHwRegWriteExt(agRoot, pcibar, (bit32)(CALTableOffset + TX_CFG_OFFSET),       mpiCALTable->spaReg3);
41524e1bc9a0SAchim Leubner   ossaHwRegWriteExt(agRoot, pcibar, (bit32)(CALTableOffset + RV_PORT_CFG1_OFFSET), mpiCALTable->spaReg4);
41534e1bc9a0SAchim Leubner   ossaHwRegWriteExt(agRoot, pcibar, (bit32)(CALTableOffset + RV_PORT_CFG2_OFFSET), mpiCALTable->spaReg5);
41544e1bc9a0SAchim Leubner   ossaHwRegWriteExt(agRoot, pcibar, (bit32)(CALTableOffset + RV_CFG1_OFFSET),      mpiCALTable->spaReg6);
41554e1bc9a0SAchim Leubner   ossaHwRegWriteExt(agRoot, pcibar, (bit32)(CALTableOffset + RV_CFG2_OFFSET),      mpiCALTable->spaReg7);
41564e1bc9a0SAchim Leubner 
41574e1bc9a0SAchim Leubner   SA_DBG4(("mpiWriteCALTable: Offset 0x%08x  spaReg0 0x%x 0x%x 0x%x 0x%x\n",(bit32)(CALTableOffset + TX_PORT_CFG1_OFFSET), mpiCALTable->spaReg0, mpiCALTable->spaReg1, mpiCALTable->spaReg2, mpiCALTable->spaReg3));
41584e1bc9a0SAchim Leubner   SA_DBG4(("mpiWriteCALTable: Offset 0x%08x  spaReg4 0x%x 0x%x 0x%x 0x%x\n",(bit32)(CALTableOffset + RV_PORT_CFG1_OFFSET), mpiCALTable->spaReg4, mpiCALTable->spaReg5, mpiCALTable->spaReg6, mpiCALTable->spaReg7));
41594e1bc9a0SAchim Leubner 
41604e1bc9a0SAchim Leubner   smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "m6");
41614e1bc9a0SAchim Leubner }
41624e1bc9a0SAchim Leubner 
41634e1bc9a0SAchim Leubner /*******************************************************************************/
41644e1bc9a0SAchim Leubner /** \fn void mpiWriteCALAll(agsaRoot_t *agRoot,
41654e1bc9a0SAchim Leubner  *                          agsaPhyAnalogSetupTable_t *mpiCALTable)
41664e1bc9a0SAchim Leubner  *  \brief Writing the Phy Analog Setup Register Table
41674e1bc9a0SAchim Leubner  *  \param agsaRoot    Handles for this instance of SAS/SATA LLL
41684e1bc9a0SAchim Leubner  *  \param mpiCALTable Pointer of Phy Calibration Table
41694e1bc9a0SAchim Leubner  *
41704e1bc9a0SAchim Leubner  * Return:
41714e1bc9a0SAchim Leubner  *         None
41724e1bc9a0SAchim Leubner  */
41734e1bc9a0SAchim Leubner /*******************************************************************************/
mpiWriteCALAll(agsaRoot_t * agRoot,agsaPhyAnalogSetupTable_t * mpiCALTable)41744e1bc9a0SAchim Leubner GLOBAL void mpiWriteCALAll(agsaRoot_t     *agRoot,
41754e1bc9a0SAchim Leubner                            agsaPhyAnalogSetupTable_t *mpiCALTable)
41764e1bc9a0SAchim Leubner {
41774e1bc9a0SAchim Leubner   bit8 i;
41784e1bc9a0SAchim Leubner   smTraceFuncEnter(hpDBG_VERY_LOUD,"mz");
41794e1bc9a0SAchim Leubner 
41804e1bc9a0SAchim Leubner   if(smIS_SPCV(agRoot))
41814e1bc9a0SAchim Leubner   {
41824e1bc9a0SAchim Leubner     smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "mz");
41834e1bc9a0SAchim Leubner     return;
41844e1bc9a0SAchim Leubner   }
41854e1bc9a0SAchim Leubner 
41864e1bc9a0SAchim Leubner   for (i = 0; i < MAX_INDEX; i++)
41874e1bc9a0SAchim Leubner   {
41884e1bc9a0SAchim Leubner     mpiWriteCALTable(agRoot, (spc_SPASTable_t *)&mpiCALTable->phyAnalogSetupRegisters[i], i);
41894e1bc9a0SAchim Leubner   }
41904e1bc9a0SAchim Leubner   smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "mz");
41914e1bc9a0SAchim Leubner }
41924e1bc9a0SAchim Leubner 
mpiWrAnalogSetupTable(agsaRoot_t * agRoot,mpiConfig_t * config)41934e1bc9a0SAchim Leubner GLOBAL void mpiWrAnalogSetupTable(agsaRoot_t *agRoot,
41944e1bc9a0SAchim Leubner                                    mpiConfig_t      *config
41954e1bc9a0SAchim Leubner                                  )
41964e1bc9a0SAchim Leubner {
41974e1bc9a0SAchim Leubner 
41984e1bc9a0SAchim Leubner   bit32 AnalogTableBase,CFGTableOffset, value,phy;
41994e1bc9a0SAchim Leubner   bit32 AnalogtableSize;
42004e1bc9a0SAchim Leubner   bit8  pcibar;
42014e1bc9a0SAchim Leubner   value = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_0,MSGU_SCRATCH_PAD_0);
42024e1bc9a0SAchim Leubner   pcibar = (bit8)mpiGetPCIBarIndex(agRoot, value);
42034e1bc9a0SAchim Leubner 
42044e1bc9a0SAchim Leubner   CFGTableOffset = value & SCRATCH_PAD0_OFFSET_MASK;
42054e1bc9a0SAchim Leubner   AnalogtableSize  = AnalogTableBase = ossaHwRegReadExt(agRoot,pcibar , (bit32)CFGTableOffset + MAIN_ANALOG_SETUP_OFFSET);
42064e1bc9a0SAchim Leubner   AnalogtableSize &= 0xFF000000;
42074e1bc9a0SAchim Leubner   AnalogtableSize >>= SHIFT24;
42084e1bc9a0SAchim Leubner   AnalogTableBase &= 0x00FFFFFF;
42094e1bc9a0SAchim Leubner 
42104e1bc9a0SAchim Leubner   AnalogTableBase = CFGTableOffset + AnalogTableBase;
42114e1bc9a0SAchim Leubner 
42124e1bc9a0SAchim Leubner //   config->phyAnalogConfig.phyAnalogSetupRegisters[0].spaRegister0 = 0;
42134e1bc9a0SAchim Leubner   SA_DBG1(("mpiWrAnalogSetupTable:Analogtable Base Offset %08X pcibar %d\n",AnalogTableBase, pcibar ));
42144e1bc9a0SAchim Leubner 
42154e1bc9a0SAchim Leubner   SA_DBG1(("mpiWrAnalogSetupTable:%d %d\n",(int)sizeof(agsaPhyAnalogSetupRegisters_t), AnalogtableSize));
42164e1bc9a0SAchim Leubner 
42174e1bc9a0SAchim Leubner   for(phy = 0; phy < 10; phy++) /* upto 10 phys See PM*/
42184e1bc9a0SAchim Leubner   {
42194e1bc9a0SAchim Leubner       ossaHwRegWriteExt(agRoot, pcibar,(AnalogTableBase + ( AnalogtableSize * phy)+ 0 ),config->phyAnalogConfig.phyAnalogSetupRegisters[phy].spaRegister0 );
42204e1bc9a0SAchim Leubner       ossaHwRegWriteExt(agRoot, pcibar,(AnalogTableBase + ( AnalogtableSize * phy)+ 4 ),config->phyAnalogConfig.phyAnalogSetupRegisters[phy].spaRegister1 );
42214e1bc9a0SAchim Leubner       ossaHwRegWriteExt(agRoot, pcibar,(AnalogTableBase + ( AnalogtableSize * phy)+ 8 ),config->phyAnalogConfig.phyAnalogSetupRegisters[phy].spaRegister2 );
42224e1bc9a0SAchim Leubner       ossaHwRegWriteExt(agRoot, pcibar,(AnalogTableBase + ( AnalogtableSize * phy)+ 12),config->phyAnalogConfig.phyAnalogSetupRegisters[phy].spaRegister3 );
42234e1bc9a0SAchim Leubner       ossaHwRegWriteExt(agRoot, pcibar,(AnalogTableBase + ( AnalogtableSize * phy)+ 16),config->phyAnalogConfig.phyAnalogSetupRegisters[phy].spaRegister4 );
42244e1bc9a0SAchim Leubner       ossaHwRegWriteExt(agRoot, pcibar,(AnalogTableBase + ( AnalogtableSize * phy)+ 20),config->phyAnalogConfig.phyAnalogSetupRegisters[phy].spaRegister5 );
42254e1bc9a0SAchim Leubner       ossaHwRegWriteExt(agRoot, pcibar,(AnalogTableBase + ( AnalogtableSize * phy)+ 24),config->phyAnalogConfig.phyAnalogSetupRegisters[phy].spaRegister6 );
42264e1bc9a0SAchim Leubner       ossaHwRegWriteExt(agRoot, pcibar,(AnalogTableBase + ( AnalogtableSize * phy)+ 28),config->phyAnalogConfig.phyAnalogSetupRegisters[phy].spaRegister7 );
42274e1bc9a0SAchim Leubner       ossaHwRegWriteExt(agRoot, pcibar,(AnalogTableBase + ( AnalogtableSize * phy)+ 32),config->phyAnalogConfig.phyAnalogSetupRegisters[phy].spaRegister8 );
42284e1bc9a0SAchim Leubner       ossaHwRegWriteExt(agRoot, pcibar,(AnalogTableBase + ( AnalogtableSize * phy)+ 36),config->phyAnalogConfig.phyAnalogSetupRegisters[phy].spaRegister9 );
42294e1bc9a0SAchim Leubner 
42304e1bc9a0SAchim Leubner       SA_DBG4(("mpiWrAnalogSetupTable:phy %d Offset 0x%08x spaRegister0 0x%x 0x%x\n",phy, (bit32) AnalogTableBase+ (AnalogtableSize * phy) + 0,config->phyAnalogConfig.phyAnalogSetupRegisters[phy].spaRegister0 ,ossaHwRegReadExt(agRoot, pcibar,AnalogTableBase + ( AnalogtableSize * phy)+ 0 )));
42314e1bc9a0SAchim Leubner       SA_DBG4(("mpiWrAnalogSetupTable:phy %d Offset 0x%08x spaRegister1 0x%x 0x%x\n",phy, (bit32) AnalogTableBase+ (AnalogtableSize * phy) + 4,config->phyAnalogConfig.phyAnalogSetupRegisters[phy].spaRegister1 ,ossaHwRegReadExt(agRoot, pcibar,AnalogTableBase + ( AnalogtableSize * phy)+ 4 )));
42324e1bc9a0SAchim Leubner       SA_DBG4(("mpiWrAnalogSetupTable:phy %d Offset 0x%08x spaRegister2 0x%x\n",phy, (bit32) AnalogTableBase+ (AnalogtableSize * phy) + 8,config->phyAnalogConfig.phyAnalogSetupRegisters[phy].spaRegister2 ));
42334e1bc9a0SAchim Leubner       SA_DBG4(("mpiWrAnalogSetupTable:phy %d Offset 0x%08x spaRegister3 0x%x\n",phy, (bit32) AnalogTableBase+ (AnalogtableSize * phy) +12,config->phyAnalogConfig.phyAnalogSetupRegisters[phy].spaRegister3 ));
42344e1bc9a0SAchim Leubner       SA_DBG4(("mpiWrAnalogSetupTable:phy %d Offset 0x%08x spaRegister4 0x%x\n",phy, (bit32) AnalogTableBase+ (AnalogtableSize * phy) +16,config->phyAnalogConfig.phyAnalogSetupRegisters[phy].spaRegister4 ));
42354e1bc9a0SAchim Leubner       SA_DBG4(("mpiWrAnalogSetupTable:phy %d Offset 0x%08x spaRegister5 0x%x\n",phy, (bit32) AnalogTableBase+ (AnalogtableSize * phy) +20,config->phyAnalogConfig.phyAnalogSetupRegisters[phy].spaRegister5 ));
42364e1bc9a0SAchim Leubner       SA_DBG4(("mpiWrAnalogSetupTable:phy %d Offset 0x%08x spaRegister6 0x%x\n",phy, (bit32) AnalogTableBase+ (AnalogtableSize * phy) +24,config->phyAnalogConfig.phyAnalogSetupRegisters[phy].spaRegister6 ));
42374e1bc9a0SAchim Leubner       SA_DBG4(("mpiWrAnalogSetupTable:phy %d Offset 0x%08x spaRegister7 0x%x\n",phy, (bit32) AnalogTableBase+ (AnalogtableSize * phy) +28,config->phyAnalogConfig.phyAnalogSetupRegisters[phy].spaRegister7 ));
42384e1bc9a0SAchim Leubner       SA_DBG4(("mpiWrAnalogSetupTable:phy %d Offset 0x%08x spaRegister8 0x%x\n",phy, (bit32) AnalogTableBase+ (AnalogtableSize * phy) +32,config->phyAnalogConfig.phyAnalogSetupRegisters[phy].spaRegister8 ));
42394e1bc9a0SAchim Leubner       SA_DBG4(("mpiWrAnalogSetupTable:phy %d Offset 0x%08x spaRegister9 0x%x\n",phy, (bit32) AnalogTableBase+ (AnalogtableSize * phy) +36,config->phyAnalogConfig.phyAnalogSetupRegisters[phy].spaRegister9 ));
42404e1bc9a0SAchim Leubner   }
42414e1bc9a0SAchim Leubner 
42424e1bc9a0SAchim Leubner }
42434e1bc9a0SAchim Leubner 
42444e1bc9a0SAchim Leubner 
mpiWrIntVecTable(agsaRoot_t * agRoot,mpiConfig_t * config)42454e1bc9a0SAchim Leubner GLOBAL void mpiWrIntVecTable(agsaRoot_t *agRoot,
42464e1bc9a0SAchim Leubner                             mpiConfig_t* config
42474e1bc9a0SAchim Leubner                             )
42484e1bc9a0SAchim Leubner {
42494e1bc9a0SAchim Leubner   bit32 CFGTableOffset, value;
42504e1bc9a0SAchim Leubner   bit32 INTVTableOffset;
42514e1bc9a0SAchim Leubner   bit32 ValuetoWrite;
42524e1bc9a0SAchim Leubner   bit8  pcibar, i,obq;
42534e1bc9a0SAchim Leubner 
42544e1bc9a0SAchim Leubner   /* get offset of the configuration table */
42554e1bc9a0SAchim Leubner   value = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_0,MSGU_SCRATCH_PAD_0);
42564e1bc9a0SAchim Leubner 
42574e1bc9a0SAchim Leubner   CFGTableOffset = value & SCRATCH_PAD0_OFFSET_MASK;
42584e1bc9a0SAchim Leubner 
42594e1bc9a0SAchim Leubner   /* get PCI BAR */
42604e1bc9a0SAchim Leubner   value = (value & SCRATCH_PAD0_BAR_MASK) >> SHIFT26;
42614e1bc9a0SAchim Leubner   /* convert the PCI BAR to logical bar number */
42624e1bc9a0SAchim Leubner   pcibar = (bit8)mpiGetPCIBarIndex(agRoot, value);
42634e1bc9a0SAchim Leubner 
42644e1bc9a0SAchim Leubner   /* read Interrupt Table Offset from the main configuration table */
42654e1bc9a0SAchim Leubner   INTVTableOffset = ossaHwRegReadExt(agRoot, pcibar, (bit32)CFGTableOffset + MAIN_INT_VEC_TABLE_OFFSET);
42664e1bc9a0SAchim Leubner   INTVTableOffset &= 0x00FFFFFF;
42674e1bc9a0SAchim Leubner   INTVTableOffset = CFGTableOffset + INTVTableOffset;
42684e1bc9a0SAchim Leubner   SA_DBG1(("mpiWrIntVecTable: Base Offset %08X\n",(bit32)(INTVTableOffset + INT_VT_Coal_CNT_TO ) ));
42694e1bc9a0SAchim Leubner 
42704e1bc9a0SAchim Leubner   for (i = 0; i < MAX_NUM_VECTOR; i ++)
42714e1bc9a0SAchim Leubner   {
42724e1bc9a0SAchim Leubner     bit32 found=0;
42734e1bc9a0SAchim Leubner     for (obq = 0; obq < MAX_NUM_VECTOR; obq++)
42744e1bc9a0SAchim Leubner     { /* find OBQ for  vector i */
42754e1bc9a0SAchim Leubner       if( config->outboundQueues[obq].interruptVector == i )
42764e1bc9a0SAchim Leubner       {
42774e1bc9a0SAchim Leubner         found=1;
42784e1bc9a0SAchim Leubner         break;
42794e1bc9a0SAchim Leubner       }
42804e1bc9a0SAchim Leubner     }
42814e1bc9a0SAchim Leubner 
42824e1bc9a0SAchim Leubner     if(!found )
42834e1bc9a0SAchim Leubner     {
42844e1bc9a0SAchim Leubner       continue;
42854e1bc9a0SAchim Leubner     }
42864e1bc9a0SAchim Leubner 
42874e1bc9a0SAchim Leubner     ValuetoWrite = (( config->outboundQueues[obq].interruptDelay << SHIFT15) | config->outboundQueues[obq].interruptThreshold  );
42884e1bc9a0SAchim Leubner 
42894e1bc9a0SAchim Leubner     ossaHwRegWriteExt(agRoot, pcibar, (bit32)(INTVTableOffset + INT_VT_Coal_CNT_TO + i * sizeof(InterruptVT_t)), ValuetoWrite );
42904e1bc9a0SAchim Leubner 
42914e1bc9a0SAchim Leubner     SA_DBG3(("mpiWrIntVecTable: Q %d interruptDelay 0x%X interruptThreshold 0x%X \n",i,
42924e1bc9a0SAchim Leubner              config->outboundQueues[i].interruptDelay,  config->outboundQueues[i].interruptThreshold ));
42934e1bc9a0SAchim Leubner 
42944e1bc9a0SAchim Leubner     SA_DBG3(("mpiWrIntVecTable: %d INT_VT_Coal_CNT_TO Bar %d Offset %3X Writing 0x%08x\n",i,
42954e1bc9a0SAchim Leubner             pcibar,
42964e1bc9a0SAchim Leubner             (bit32)(INTVTableOffset + INT_VT_Coal_CNT_TO + i * sizeof(InterruptVT_t)),
42974e1bc9a0SAchim Leubner             ValuetoWrite));
42984e1bc9a0SAchim Leubner 
42994e1bc9a0SAchim Leubner   }
43004e1bc9a0SAchim Leubner 
43014e1bc9a0SAchim Leubner   for (i = 0; i < MAX_NUM_VECTOR; i++)
43024e1bc9a0SAchim Leubner   {
43034e1bc9a0SAchim Leubner     /* read interrupt colescing control and timer  */
43044e1bc9a0SAchim Leubner     value = ossaHwRegReadExt(agRoot, pcibar, (bit32)(INTVTableOffset + INT_VT_Coal_CNT_TO + i * sizeof(InterruptVT_t)));
43054e1bc9a0SAchim Leubner     SA_DBG4(("mpiWrIntVecTable: Offset 0x%08x Interrupt Colescing iccict[%02d] 0x%x\n", (bit32)(INTVTableOffset + INT_VT_Coal_CNT_TO + i * sizeof(InterruptVT_t)), i, value));
43064e1bc9a0SAchim Leubner   }
43074e1bc9a0SAchim Leubner }
43084e1bc9a0SAchim Leubner 
mpiWrPhyAttrbTable(agsaRoot_t * agRoot,sasPhyAttribute_t * phyAttrib)43094e1bc9a0SAchim Leubner GLOBAL void mpiWrPhyAttrbTable(agsaRoot_t *agRoot, sasPhyAttribute_t *phyAttrib)
43104e1bc9a0SAchim Leubner {
43114e1bc9a0SAchim Leubner   bit32 CFGTableOffset, value;
43124e1bc9a0SAchim Leubner   bit32 PHYTableOffset;
43134e1bc9a0SAchim Leubner   bit8  pcibar, i;
43144e1bc9a0SAchim Leubner 
43154e1bc9a0SAchim Leubner   /* get offset of the configuration table */
43164e1bc9a0SAchim Leubner   value = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_0,MSGU_SCRATCH_PAD_0);
43174e1bc9a0SAchim Leubner 
43184e1bc9a0SAchim Leubner   CFGTableOffset = value & SCRATCH_PAD0_OFFSET_MASK;
43194e1bc9a0SAchim Leubner 
43204e1bc9a0SAchim Leubner   /* get PCI BAR */
43214e1bc9a0SAchim Leubner   value = (value & SCRATCH_PAD0_BAR_MASK) >> SHIFT26;
43224e1bc9a0SAchim Leubner   /* convert the PCI BAR to logical bar number */
43234e1bc9a0SAchim Leubner   pcibar = (bit8)mpiGetPCIBarIndex(agRoot, value);
43244e1bc9a0SAchim Leubner 
43254e1bc9a0SAchim Leubner   /* read Phy Attribute Table Offset from the configuration table */
43264e1bc9a0SAchim Leubner   PHYTableOffset = ossaHwRegReadExt(agRoot, pcibar, (bit32)CFGTableOffset + MAIN_PHY_ATTRIBUTE_OFFSET);
43274e1bc9a0SAchim Leubner 
43284e1bc9a0SAchim Leubner   PHYTableOffset &=0x00FFFFFF;
43294e1bc9a0SAchim Leubner 
43304e1bc9a0SAchim Leubner   PHYTableOffset = CFGTableOffset + PHYTableOffset + PHY_EVENT_OQ;
43314e1bc9a0SAchim Leubner 
43324e1bc9a0SAchim Leubner   SA_DBG1(("mpiWrPhyAttrbTable: PHYTableOffset 0x%08x\n", PHYTableOffset));
43334e1bc9a0SAchim Leubner 
43344e1bc9a0SAchim Leubner   /* write OQ event per phy */
43354e1bc9a0SAchim Leubner   for (i = 0; i < MAX_VALID_PHYS; i ++)
43364e1bc9a0SAchim Leubner   {
43374e1bc9a0SAchim Leubner     ossaHwRegWriteExt(agRoot, pcibar, (bit32)(PHYTableOffset + i * sizeof(phyAttrb_t)), phyAttrib->phyAttribute[i].phyEventOQ);
43384e1bc9a0SAchim Leubner 
43394e1bc9a0SAchim Leubner   SA_DBG3(("mpiWrPhyAttrbTable:%d Offset 0x%08x phyAttribute 0x%x\n",i,(bit32)(PHYTableOffset + i * sizeof(phyAttrb_t)), phyAttrib->phyAttribute[i].phyEventOQ ));
43404e1bc9a0SAchim Leubner 
43414e1bc9a0SAchim Leubner 
43424e1bc9a0SAchim Leubner   }
43434e1bc9a0SAchim Leubner 
43444e1bc9a0SAchim Leubner   for (i = 0; i < MAX_VALID_PHYS; i ++)
43454e1bc9a0SAchim Leubner   {
43464e1bc9a0SAchim Leubner     value = ossaHwRegReadExt(agRoot, pcibar, (bit32)(PHYTableOffset + i * sizeof(phyAttrb_t)));
43474e1bc9a0SAchim Leubner   SA_DBG1(("mpiWrPhyAttrbTable: OQ Event per phy[%x] 0x%x\n", i, value));
43484e1bc9a0SAchim Leubner   }
43494e1bc9a0SAchim Leubner }
43504e1bc9a0SAchim Leubner 
43514e1bc9a0SAchim Leubner 
43524e1bc9a0SAchim Leubner #ifdef TEST /******************************************************************/
43534e1bc9a0SAchim Leubner /*******************************************************************************/
43544e1bc9a0SAchim Leubner /** \fn mpiFreezeInboundQueue(agsaRoot_t *agRoot)
43554e1bc9a0SAchim Leubner  *  \brief Freeze the inbound queue
43564e1bc9a0SAchim Leubner  *
43574e1bc9a0SAchim Leubner  *  \param agRoot             Handles for this instance of SAS/SATA hardware
43584e1bc9a0SAchim Leubner  *  \param bitMapQueueNum0    bit map for inbound queue number 0 - 31 to freeze
43594e1bc9a0SAchim Leubner  *  \param bitMapQueueNum1    bit map for inbound queue number 32 - 63 to freeze
43604e1bc9a0SAchim Leubner  *
43614e1bc9a0SAchim Leubner  * Return:
43624e1bc9a0SAchim Leubner  *         AGSA_RC_SUCCESS if Un-initialize the configuration table sucessful
43634e1bc9a0SAchim Leubner  *         AGSA_RC_FAILURE if Un-initialize the configuration table failed
43644e1bc9a0SAchim Leubner  */
43654e1bc9a0SAchim Leubner /*******************************************************************************/
mpiFreezeInboundQueue(agsaRoot_t * agRoot,bit32 bitMapQueueNum0,bit32 bitMapQueueNum1)43664e1bc9a0SAchim Leubner GLOBAL bit32 mpiFreezeInboundQueue(agsaRoot_t *agRoot, bit32 bitMapQueueNum0, bit32 bitMapQueueNum1)
43674e1bc9a0SAchim Leubner {
43684e1bc9a0SAchim Leubner   bit32    value, togglevalue;
43694e1bc9a0SAchim Leubner   bit32    max_wait_time;
43704e1bc9a0SAchim Leubner   bit32    max_wait_count;
43714e1bc9a0SAchim Leubner 
43724e1bc9a0SAchim Leubner   SA_DBG2(("Entering function:mpiFreezeInboundQueue\n"));
43734e1bc9a0SAchim Leubner   SA_ASSERT(NULL != agRoot, "agRoot argument cannot be null");
43744e1bc9a0SAchim Leubner 
43754e1bc9a0SAchim Leubner   togglevalue = 0;
43764e1bc9a0SAchim Leubner 
43774e1bc9a0SAchim Leubner   if (bitMapQueueNum0)
43784e1bc9a0SAchim Leubner   {
43794e1bc9a0SAchim Leubner     /* update the inbound queue number to HOST_SCRATCH_PAD1 register for queue 0 to 31 */
43804e1bc9a0SAchim Leubner     SA_DBG1(("mpiFreezeInboundQueue: SCRATCH_PAD0 value = 0x%x\n", siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_0,MSGU_SCRATCH_PAD_0)));
43814e1bc9a0SAchim Leubner     SA_DBG1(("mpiFreezeInboundQueue: SCRATCH_PAD3 value = 0x%x\n", siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_3,MSGU_SCRATCH_PAD_3)));
43824e1bc9a0SAchim Leubner 
43834e1bc9a0SAchim Leubner     value = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_0,MSGU_SCRATCH_PAD_1);
43844e1bc9a0SAchim Leubner     value |= bitMapQueueNum0;
43854e1bc9a0SAchim Leubner     siHalRegWriteExt(agRoot, GEN_MSGU_HOST_SCRATCH_PAD_1, MSGU_HOST_SCRATCH_PAD_1, value);
43864e1bc9a0SAchim Leubner   }
43874e1bc9a0SAchim Leubner 
43884e1bc9a0SAchim Leubner   if (bitMapQueueNum1)
43894e1bc9a0SAchim Leubner   {
43904e1bc9a0SAchim Leubner     /* update the inbound queue number to HOST_SCRATCH_PAD2 register for queue 32 to 63 */
43914e1bc9a0SAchim Leubner     value = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_2,MSGU_SCRATCH_PAD_2);
43924e1bc9a0SAchim Leubner     value |= bitMapQueueNum1;
43934e1bc9a0SAchim Leubner     siHalRegWriteExt(agRoot, GEN_MSGU_HOST_SCRATCH_PAD_2, MSGU_HOST_SCRATCH_PAD_2, value);
43944e1bc9a0SAchim Leubner   }
43954e1bc9a0SAchim Leubner 
43964e1bc9a0SAchim Leubner   /* Write bit 2 to Inbound DoorBell Register */
43974e1bc9a0SAchim Leubner   siHalRegWriteExt(agRoot, GEN_MSGU_IBDB_SET, MSGU_IBDB_SET, IBDB_IBQ_FREEZE);
43984e1bc9a0SAchim Leubner 
43994e1bc9a0SAchim Leubner   /* wait until Inbound DoorBell Clear Register toggled */
44004e1bc9a0SAchim Leubner   max_wait_time = WAIT_SECONDS(gWait_2);  /* 2 sec */
44014e1bc9a0SAchim Leubner   max_wait_count = MAKE_MODULO(max_wait_time,WAIT_INCREMENT);
44024e1bc9a0SAchim Leubner   do
44034e1bc9a0SAchim Leubner   {
44044e1bc9a0SAchim Leubner     ossaStallThread(agRoot, WAIT_INCREMENT);
44054e1bc9a0SAchim Leubner     /* Read Inbound DoorBell Register - for RevB */
44064e1bc9a0SAchim Leubner //    value = ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_IBDB_SET);
44074e1bc9a0SAchim Leubner     value = MSGU_READ_IDR;
44084e1bc9a0SAchim Leubner     value &= IBDB_IBQ_FREEZE;
44094e1bc9a0SAchim Leubner   } while ((value != togglevalue) && (max_wait_count -= WAIT_INCREMENT));
44104e1bc9a0SAchim Leubner 
44114e1bc9a0SAchim Leubner   if (!max_wait_count)
44124e1bc9a0SAchim Leubner   {
44134e1bc9a0SAchim Leubner     SA_DBG1(("mpiFreezeInboundQueue: IBDB value/toggle = 0x%x 0x%x\n", value, togglevalue));
44144e1bc9a0SAchim Leubner     return AGSA_RC_FAILURE;
44154e1bc9a0SAchim Leubner   }
44164e1bc9a0SAchim Leubner 
44174e1bc9a0SAchim Leubner   return AGSA_RC_SUCCESS;
44184e1bc9a0SAchim Leubner }
44194e1bc9a0SAchim Leubner 
44204e1bc9a0SAchim Leubner /******************************************************************************/
44214e1bc9a0SAchim Leubner /** \fn mpiUnFreezeInboundQueue(agsaRoot_t *agRoot)
44224e1bc9a0SAchim Leubner  *  \brief Freeze the inbound queue
44234e1bc9a0SAchim Leubner  *
44244e1bc9a0SAchim Leubner  *  \param agRoot             Handles for this instance of SAS/SATA hardware
44254e1bc9a0SAchim Leubner  *  \param bitMapQueueNum0    bit map for inbound queue number 0 - 31 to freeze
44264e1bc9a0SAchim Leubner  *  \param bitMapQueueNum1    bit map for inbound queue number 32 - 63 to freeze
44274e1bc9a0SAchim Leubner  *
44284e1bc9a0SAchim Leubner  * Return:
44294e1bc9a0SAchim Leubner  *         AGSA_RC_SUCCESS if Un-initialize the configuration table sucessful
44304e1bc9a0SAchim Leubner  *         AGSA_RC_FAILURE if Un-initialize the configuration table failed
44314e1bc9a0SAchim Leubner  */
44324e1bc9a0SAchim Leubner /******************************************************************************/
mpiUnFreezeInboundQueue(agsaRoot_t * agRoot,bit32 bitMapQueueNum0,bit32 bitMapQueueNum1)44334e1bc9a0SAchim Leubner GLOBAL bit32 mpiUnFreezeInboundQueue(agsaRoot_t *agRoot, bit32 bitMapQueueNum0, bit32 bitMapQueueNum1)
44344e1bc9a0SAchim Leubner {
44354e1bc9a0SAchim Leubner   bit32    value, togglevalue;
44364e1bc9a0SAchim Leubner   bit32    max_wait_time;
44374e1bc9a0SAchim Leubner   bit32    max_wait_count;
44384e1bc9a0SAchim Leubner 
44394e1bc9a0SAchim Leubner   SA_DBG2(("Entering function:mpiUnFreezeInboundQueue\n"));
44404e1bc9a0SAchim Leubner   SA_ASSERT(NULL != agRoot, "agRoot argument cannot be null");
44414e1bc9a0SAchim Leubner 
44424e1bc9a0SAchim Leubner   togglevalue = 0;
44434e1bc9a0SAchim Leubner 
44444e1bc9a0SAchim Leubner   if (bitMapQueueNum0)
44454e1bc9a0SAchim Leubner   {
44464e1bc9a0SAchim Leubner     /* update the inbound queue number to HOST_SCRATCH_PAD1 register - for queue 0 to 31 */
44474e1bc9a0SAchim Leubner     value = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_1,MSGU_SCRATCH_PAD_1);
44484e1bc9a0SAchim Leubner     value |= bitMapQueueNum0;
44494e1bc9a0SAchim Leubner     siHalRegWriteExt(agRoot, GEN_MSGU_HOST_SCRATCH_PAD_1, MSGU_HOST_SCRATCH_PAD_1, value);
44504e1bc9a0SAchim Leubner   }
44514e1bc9a0SAchim Leubner 
44524e1bc9a0SAchim Leubner   if (bitMapQueueNum1)
44534e1bc9a0SAchim Leubner   {
44544e1bc9a0SAchim Leubner     /* update the inbound queue number to HOST_SCRATCH_PAD2 register - for queue 32 to 63 */
44554e1bc9a0SAchim Leubner     value = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_2,MSGU_SCRATCH_PAD_2);
44564e1bc9a0SAchim Leubner     value |= bitMapQueueNum1;
44574e1bc9a0SAchim Leubner     siHalRegWriteExt(agRoot, GEN_MSGU_HOST_SCRATCH_PAD_2, MSGU_HOST_SCRATCH_PAD_2, value);
44584e1bc9a0SAchim Leubner   }
44594e1bc9a0SAchim Leubner 
44604e1bc9a0SAchim Leubner   /* Write bit 2 to Inbound DoorBell Register */
44614e1bc9a0SAchim Leubner   siHalRegWriteExt(agRoot, GEN_MSGU_IBDB_SET, MSGU_IBDB_SET, IBDB_IBQ_UNFREEZE);
44624e1bc9a0SAchim Leubner 
44634e1bc9a0SAchim Leubner   /* wait until Inbound DoorBell Clear Register toggled */
44644e1bc9a0SAchim Leubner   max_wait_time = WAIT_SECONDS(gWait_2);  /* 2 sec */
44654e1bc9a0SAchim Leubner   max_wait_count = MAKE_MODULO(max_wait_time,WAIT_INCREMENT);
44664e1bc9a0SAchim Leubner   do
44674e1bc9a0SAchim Leubner   {
44684e1bc9a0SAchim Leubner     ossaStallThread(agRoot, WAIT_INCREMENT);
44694e1bc9a0SAchim Leubner     /* Read Inbound DoorBell Register - for RevB */
44704e1bc9a0SAchim Leubner     value = MSGU_READ_IDR;
44714e1bc9a0SAchim Leubner     value &= IBDB_IBQ_UNFREEZE;
44724e1bc9a0SAchim Leubner   } while ((value != togglevalue) && (max_wait_count -= WAIT_INCREMENT));
44734e1bc9a0SAchim Leubner 
44744e1bc9a0SAchim Leubner   if (!max_wait_count)
44754e1bc9a0SAchim Leubner   {
44764e1bc9a0SAchim Leubner     SA_DBG1(("mpiUnFreezeInboundQueue: IBDB value/toggle = 0x%x 0x%x\n", value, togglevalue));
44774e1bc9a0SAchim Leubner     return AGSA_RC_FAILURE;
44784e1bc9a0SAchim Leubner   }
44794e1bc9a0SAchim Leubner 
44804e1bc9a0SAchim Leubner   return AGSA_RC_SUCCESS;
44814e1bc9a0SAchim Leubner }
44824e1bc9a0SAchim Leubner 
44834e1bc9a0SAchim Leubner #endif /* TEST ****************************************************************/
44844e1bc9a0SAchim Leubner 
si_check_V_HDA(agsaRoot_t * agRoot)44854e1bc9a0SAchim Leubner GLOBAL bit32 si_check_V_HDA(agsaRoot_t *agRoot)
44864e1bc9a0SAchim Leubner {
44874e1bc9a0SAchim Leubner   bit32 ret = AGSA_RC_SUCCESS;
44884e1bc9a0SAchim Leubner   bit32 hda_status = 0;
44894e1bc9a0SAchim Leubner 
44904e1bc9a0SAchim Leubner   hda_status = (ossaHwRegReadExt(agRoot, PCIBAR0, SPC_V_HDA_RESPONSE_OFFSET+28));
44914e1bc9a0SAchim Leubner 
44924e1bc9a0SAchim Leubner   SA_DBG1(("si_check_V_HDA: hda_status 0x%08X\n",hda_status ));
44934e1bc9a0SAchim Leubner 
44944e1bc9a0SAchim Leubner   if((hda_status  & SPC_V_HDAR_RSPCODE_MASK)  == SPC_V_HDAR_IDLE)
44954e1bc9a0SAchim Leubner   {
44964e1bc9a0SAchim Leubner     /* HDA mode */
44974e1bc9a0SAchim Leubner     SA_DBG1(("si_check_V_HDA: HDA mode, value = 0x%x\n", hda_status));
44984e1bc9a0SAchim Leubner     ret = AGSA_RC_HDA_NO_FW_RUNNING;
44994e1bc9a0SAchim Leubner   }
45004e1bc9a0SAchim Leubner 
45014e1bc9a0SAchim Leubner 
45024e1bc9a0SAchim Leubner   return(ret);
45034e1bc9a0SAchim Leubner }
si_check_V_Ready(agsaRoot_t * agRoot)45044e1bc9a0SAchim Leubner GLOBAL bit32  si_check_V_Ready(agsaRoot_t *agRoot)
45054e1bc9a0SAchim Leubner {
45064e1bc9a0SAchim Leubner   bit32 ret = AGSA_RC_SUCCESS;
45074e1bc9a0SAchim Leubner   bit32    SCRATCH_PAD1;
45084e1bc9a0SAchim Leubner   bit32    max_wait_time;
45094e1bc9a0SAchim Leubner   bit32    max_wait_count;
45104e1bc9a0SAchim Leubner /* ILA */
45114e1bc9a0SAchim Leubner   max_wait_time = (200 * 1000); /* wait 200 milliseconds */
45124e1bc9a0SAchim Leubner   max_wait_count = MAKE_MODULO(max_wait_time,WAIT_INCREMENT);
45134e1bc9a0SAchim Leubner   do
45144e1bc9a0SAchim Leubner   {
45154e1bc9a0SAchim Leubner     ossaStallThread(agRoot, WAIT_INCREMENT);
45164e1bc9a0SAchim Leubner     SCRATCH_PAD1 = ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_1);
45174e1bc9a0SAchim Leubner   } while (((SCRATCH_PAD1 & SCRATCH_PAD1_V_ILA_MASK) != SCRATCH_PAD1_V_ILA_MASK) && (max_wait_count -= WAIT_INCREMENT));
45184e1bc9a0SAchim Leubner 
45194e1bc9a0SAchim Leubner   if (!max_wait_count)
45204e1bc9a0SAchim Leubner   {
45214e1bc9a0SAchim Leubner     SA_DBG1(("si_check_V_Ready: SCRATCH_PAD1_V_ILA_MASK (0x%x)  not set SCRATCH_PAD1 = 0x%x\n",SCRATCH_PAD1_V_ILA_MASK, SCRATCH_PAD1));
45224e1bc9a0SAchim Leubner     return( AGSA_RC_FAILURE);
45234e1bc9a0SAchim Leubner   }
45244e1bc9a0SAchim Leubner   /* RAAE */
45254e1bc9a0SAchim Leubner   max_wait_time = (200 * 1000); /* wait 200 milliseconds */
45264e1bc9a0SAchim Leubner   max_wait_count = MAKE_MODULO(max_wait_time,WAIT_INCREMENT);
45274e1bc9a0SAchim Leubner   do
45284e1bc9a0SAchim Leubner   {
45294e1bc9a0SAchim Leubner     ossaStallThread(agRoot, WAIT_INCREMENT);
45304e1bc9a0SAchim Leubner     SCRATCH_PAD1 = ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_1);
45314e1bc9a0SAchim Leubner   } while (((SCRATCH_PAD1 & SCRATCH_PAD1_V_RAAE_MASK) != SCRATCH_PAD1_V_RAAE_MASK) && (max_wait_count -= WAIT_INCREMENT));
45324e1bc9a0SAchim Leubner 
45334e1bc9a0SAchim Leubner   if (!max_wait_count)
45344e1bc9a0SAchim Leubner   {
45354e1bc9a0SAchim Leubner     SA_DBG1(("si_check_V_Ready: SCRATCH_PAD1_V_RAAE_MASK (0x%x) not set SCRATCH_PAD1 = 0x%x\n",SCRATCH_PAD1_V_RAAE_MASK, SCRATCH_PAD1));
45364e1bc9a0SAchim Leubner     return( AGSA_RC_FAILURE);
45374e1bc9a0SAchim Leubner 
45384e1bc9a0SAchim Leubner   }
45394e1bc9a0SAchim Leubner   /* IOP0 */
45404e1bc9a0SAchim Leubner   max_wait_time = (200 * 1000); /* wait 200 milliseconds */
45414e1bc9a0SAchim Leubner   max_wait_count = MAKE_MODULO(max_wait_time,WAIT_INCREMENT);
45424e1bc9a0SAchim Leubner   do
45434e1bc9a0SAchim Leubner   {
45444e1bc9a0SAchim Leubner     ossaStallThread(agRoot, WAIT_INCREMENT);
45454e1bc9a0SAchim Leubner     SCRATCH_PAD1 = ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_1);
45464e1bc9a0SAchim Leubner   } while (((SCRATCH_PAD1 & SCRATCH_PAD1_V_IOP0_MASK) != SCRATCH_PAD1_V_IOP0_MASK) && (max_wait_count -= WAIT_INCREMENT));
45474e1bc9a0SAchim Leubner 
45484e1bc9a0SAchim Leubner   if (!max_wait_count)
45494e1bc9a0SAchim Leubner   {
45504e1bc9a0SAchim Leubner     SA_DBG1(("si_check_V_Ready: SCRATCH_PAD1_V_IOP0_MASK (0x%x) not set SCRATCH_PAD1 = 0x%x\n",SCRATCH_PAD1_V_IOP0_MASK ,SCRATCH_PAD1));
45514e1bc9a0SAchim Leubner     return( AGSA_RC_FAILURE);
45524e1bc9a0SAchim Leubner 
45534e1bc9a0SAchim Leubner   }
45544e1bc9a0SAchim Leubner 
45554e1bc9a0SAchim Leubner   /* IOP1 */
45564e1bc9a0SAchim Leubner   max_wait_time = (200 * 1000); /* wait 200 milliseconds */
45574e1bc9a0SAchim Leubner   max_wait_count = MAKE_MODULO(max_wait_time,WAIT_INCREMENT);
45584e1bc9a0SAchim Leubner   do
45594e1bc9a0SAchim Leubner   {
45604e1bc9a0SAchim Leubner     ossaStallThread(agRoot, WAIT_INCREMENT);
45614e1bc9a0SAchim Leubner     SCRATCH_PAD1 = ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_1);
45624e1bc9a0SAchim Leubner   } while (((SCRATCH_PAD1 & SCRATCH_PAD1_V_IOP1_MASK) != SCRATCH_PAD1_V_IOP1_MASK) && (max_wait_count -= WAIT_INCREMENT));
45634e1bc9a0SAchim Leubner 
45644e1bc9a0SAchim Leubner   if (!max_wait_count)
45654e1bc9a0SAchim Leubner   {
45664e1bc9a0SAchim Leubner     SA_DBG1(("si_check_V_Ready: SCRATCH_PAD1_V_IOP1_MASK (0x%x) not set SCRATCH_PAD1 = 0x%x\n",SCRATCH_PAD1_V_IOP1_MASK, SCRATCH_PAD1));
45674e1bc9a0SAchim Leubner     // return( AGSA_RC_FAILURE);
45684e1bc9a0SAchim Leubner   }
45694e1bc9a0SAchim Leubner 
45704e1bc9a0SAchim Leubner   return(ret);
45714e1bc9a0SAchim Leubner }
45724e1bc9a0SAchim Leubner 
siScratchDump(agsaRoot_t * agRoot)45734e1bc9a0SAchim Leubner GLOBAL bit32 siScratchDump(agsaRoot_t *agRoot)
45744e1bc9a0SAchim Leubner {
45754e1bc9a0SAchim Leubner   bit32 SCRATCH_PAD1;
45764e1bc9a0SAchim Leubner   bit32 ret =0;
45774e1bc9a0SAchim Leubner #ifdef SALLSDK_DEBUG
45784e1bc9a0SAchim Leubner   bit32 SCRATCH_PAD2;
45794e1bc9a0SAchim Leubner   bit32 SCRATCH_PAD3;
45804e1bc9a0SAchim Leubner   bit32 SCRATCH_PAD0;
45814e1bc9a0SAchim Leubner 
45824e1bc9a0SAchim Leubner   SCRATCH_PAD0 = ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_0);
45834e1bc9a0SAchim Leubner   SCRATCH_PAD2 = ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_2);
45844e1bc9a0SAchim Leubner   SCRATCH_PAD3 = ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_3);
45854e1bc9a0SAchim Leubner #endif  /* SALLSDK_DEBUG */
45864e1bc9a0SAchim Leubner   SCRATCH_PAD1 = ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_1);
45874e1bc9a0SAchim Leubner   SA_DBG1(("siScratchDump: SCRATCH_PAD 0 0x%08x 1 0x%08x 2 0x%08x 3 0x%08x\n",SCRATCH_PAD0,SCRATCH_PAD1,SCRATCH_PAD2,SCRATCH_PAD3 ));
45884e1bc9a0SAchim Leubner 
45894e1bc9a0SAchim Leubner   if((SCRATCH_PAD1 & SCRATCH_PAD1_V_RESERVED) == SCRATCH_PAD1_V_RESERVED  )
45904e1bc9a0SAchim Leubner   {
45914e1bc9a0SAchim Leubner     SA_DBG1(("siScratchDump: SCRATCH_PAD1 SCRATCH_PAD1_V_RESERVED 0x%08x\n", SCRATCH_PAD1_V_RESERVED));
45924e1bc9a0SAchim Leubner   }
45934e1bc9a0SAchim Leubner   else
45944e1bc9a0SAchim Leubner   {
45954e1bc9a0SAchim Leubner     if((SCRATCH_PAD1 & SCRATCH_PAD1_V_RAAE_MASK) == SCRATCH_PAD1_V_RAAE_MASK  )
45964e1bc9a0SAchim Leubner     {
45974e1bc9a0SAchim Leubner       SA_DBG1(("siScratchDump: SCRATCH_PAD1 valid 0x%08x\n",SCRATCH_PAD0 ));
45984e1bc9a0SAchim Leubner       SA_DBG1(("siScratchDump: RAAE ready 0x%08x\n",SCRATCH_PAD1 & SCRATCH_PAD1_V_RAAE_MASK));
45994e1bc9a0SAchim Leubner     }
46004e1bc9a0SAchim Leubner     if((SCRATCH_PAD1 & SCRATCH_PAD1_V_ILA_MASK) == SCRATCH_PAD1_V_ILA_MASK)
46014e1bc9a0SAchim Leubner     {
46024e1bc9a0SAchim Leubner       SA_DBG1(("siScratchDump: ILA  ready 0x%08x\n", SCRATCH_PAD1 & SCRATCH_PAD1_V_ILA_MASK));
46034e1bc9a0SAchim Leubner     }
46044e1bc9a0SAchim Leubner 
46054e1bc9a0SAchim Leubner     if(SCRATCH_PAD1 & SCRATCH_PAD1_V_BOOTSTATE_MASK)
46064e1bc9a0SAchim Leubner     {
46074e1bc9a0SAchim Leubner       SA_DBG1(("siScratchDump: BOOTSTATE not success 0x%08x\n",SCRATCH_PAD1 & SCRATCH_PAD1_V_BOOTSTATE_MASK));
46084e1bc9a0SAchim Leubner     }
46094e1bc9a0SAchim Leubner 
46104e1bc9a0SAchim Leubner     if((SCRATCH_PAD1 & SCRATCH_PAD1_V_IOP0_MASK) == SCRATCH_PAD1_V_IOP0_MASK)
46114e1bc9a0SAchim Leubner     {
46124e1bc9a0SAchim Leubner       SA_DBG1(("siScratchDump: IOP0 ready 0x%08x\n",SCRATCH_PAD1 & SCRATCH_PAD1_V_IOP0_MASK));
46134e1bc9a0SAchim Leubner     }
46144e1bc9a0SAchim Leubner     if((SCRATCH_PAD1 & SCRATCH_PAD1_V_IOP1_MASK) == SCRATCH_PAD1_V_IOP1_MASK)
46154e1bc9a0SAchim Leubner     {
46164e1bc9a0SAchim Leubner       SA_DBG1(("siScratchDump: IOP1 ready 0x%08x\n",SCRATCH_PAD1 & SCRATCH_PAD1_V_IOP1_MASK ));
46174e1bc9a0SAchim Leubner     }
46184e1bc9a0SAchim Leubner     if((SCRATCH_PAD1 & SCRATCH_PAD1_V_READY) == SCRATCH_PAD1_V_READY)
46194e1bc9a0SAchim Leubner     {
46204e1bc9a0SAchim Leubner       SA_DBG1(("siScratchDump: SCRATCH_PAD1_V_READY  0x%08x\n",SCRATCH_PAD1 & SCRATCH_PAD1_V_READY ));
46214e1bc9a0SAchim Leubner     }
46224e1bc9a0SAchim Leubner     if((SCRATCH_PAD1 & SCRATCH_PAD1_V_BOOTSTATE_MASK) == SCRATCH_PAD1_V_BOOTSTATE_MASK)
46234e1bc9a0SAchim Leubner     {
46244e1bc9a0SAchim Leubner       SA_DBG1(("siScratchDump: SCRATCH_PAD1_V_BOOTSTATE_MASK  0x%08x\n",SCRATCH_PAD1 & SCRATCH_PAD1_V_BOOTSTATE_MASK ));
46254e1bc9a0SAchim Leubner     }
46264e1bc9a0SAchim Leubner   }
46274e1bc9a0SAchim Leubner   return(ret);
46284e1bc9a0SAchim Leubner 
46294e1bc9a0SAchim Leubner }
46304e1bc9a0SAchim Leubner 
46314e1bc9a0SAchim Leubner 
si_macro_check(agsaRoot_t * agRoot)46324e1bc9a0SAchim Leubner void si_macro_check(agsaRoot_t *agRoot)
46334e1bc9a0SAchim Leubner {
46344e1bc9a0SAchim Leubner 
46354e1bc9a0SAchim Leubner   SA_DBG1(("si_macro_check:smIS_SPC      %d\n",smIS_SPC(agRoot)  ));
46364e1bc9a0SAchim Leubner   SA_DBG1(("si_macro_check:smIS_HIL      %d\n",smIS_HIL(agRoot)  ));
46374e1bc9a0SAchim Leubner   SA_DBG1(("si_macro_check:smIS_SFC      %d\n",smIS_SFC(agRoot)  ));
46384e1bc9a0SAchim Leubner 
46394e1bc9a0SAchim Leubner   SA_DBG1(("si_macro_check:smIS_spc8001  %d\n",smIS_spc8001(agRoot)  ));
46404e1bc9a0SAchim Leubner   SA_DBG1(("si_macro_check:smIS_spc8081  %d\n",smIS_spc8081(agRoot)  ));
46414e1bc9a0SAchim Leubner 
46424e1bc9a0SAchim Leubner   SA_DBG1(("si_macro_check:smIS_SPCV8008 %d\n",smIS_SPCV8008(agRoot)  ));
46434e1bc9a0SAchim Leubner   SA_DBG1(("si_macro_check:smIS_SPCV8009 %d\n",smIS_SPCV8009(agRoot)  ));
46444e1bc9a0SAchim Leubner   SA_DBG1(("si_macro_check:smIS_SPCV8018 %d\n",smIS_SPCV8018(agRoot)  ));
46454e1bc9a0SAchim Leubner   SA_DBG1(("si_macro_check:smIS_SPCV8019 %d\n",smIS_SPCV8019(agRoot)  ));
46464e1bc9a0SAchim Leubner   SA_DBG1(("si_macro_check:smIS_ADAP8088 %d\n",smIS_ADAP8088(agRoot)  ));
46474e1bc9a0SAchim Leubner   SA_DBG1(("si_macro_check:smIS_ADAP8089 %d\n",smIS_ADAP8089(agRoot)  ));
46484e1bc9a0SAchim Leubner   SA_DBG1(("si_macro_check:smIS_SPCV8070 %d\n",smIS_SPCV8070(agRoot)  ));
46494e1bc9a0SAchim Leubner   SA_DBG1(("si_macro_check:smIS_SPCV8071 %d\n",smIS_SPCV8071(agRoot)  ));
46504e1bc9a0SAchim Leubner   SA_DBG1(("si_macro_check:smIS_SPCV8072 %d\n",smIS_SPCV8072(agRoot)  ));
46514e1bc9a0SAchim Leubner   SA_DBG1(("si_macro_check:smIS_SPCV8073 %d\n",smIS_SPCV8073(agRoot)  ));
46524e1bc9a0SAchim Leubner   SA_DBG1(("si_macro_check:smIS_SPCV8074 %d\n",smIS_SPCV8074(agRoot)  ));
46534e1bc9a0SAchim Leubner   SA_DBG1(("si_macro_check:smIS_SPCV8075 %d\n",smIS_SPCV8075(agRoot)  ));
46544e1bc9a0SAchim Leubner   SA_DBG1(("si_macro_check:smIS_SPCV8076 %d\n",smIS_SPCV8076(agRoot)  ));
46554e1bc9a0SAchim Leubner   SA_DBG1(("si_macro_check:smIS_SPCV8077 %d\n",smIS_SPCV8077(agRoot)  ));
46564e1bc9a0SAchim Leubner   SA_DBG1(("si_macro_check:smIS_SPCV9015 %d\n",smIS_SPCV9015(agRoot)  ));
46574e1bc9a0SAchim Leubner   SA_DBG1(("si_macro_check:smIS_SPCV9060 %d\n",smIS_SPCV9060(agRoot)  ));
46584e1bc9a0SAchim Leubner   SA_DBG1(("si_macro_check:smIS_SPCV     %d\n",smIS_SPCV(agRoot)      ));
46594e1bc9a0SAchim Leubner 
46604e1bc9a0SAchim Leubner   SA_DBG1(("si_macro_check:smIS64bInt    %d\n", smIS64bInt(agRoot)    ));
46614e1bc9a0SAchim Leubner 
46624e1bc9a0SAchim Leubner }
46634e1bc9a0SAchim Leubner 
4664