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;
1767*aeb665b5SEd 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