1285242Sachim/******************************************************************************* 2285242Sachim*Copyright (c) 2014 PMC-Sierra, Inc. All rights reserved. 3285242Sachim* 4285242Sachim*Redistribution and use in source and binary forms, with or without modification, are permitted provided 5285242Sachim*that the following conditions are met: 6285242Sachim*1. Redistributions of source code must retain the above copyright notice, this list of conditions and the 7285242Sachim*following disclaimer. 8285242Sachim*2. Redistributions in binary form must reproduce the above copyright notice, 9285242Sachim*this list of conditions and the following disclaimer in the documentation and/or other materials provided 10285242Sachim*with the distribution. 11285242Sachim* 12285242Sachim*THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED 13285242Sachim*WARRANTIES,INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 14285242Sachim*FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 15285242Sachim*FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 16285242Sachim*NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 17285242Sachim*BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 18285242Sachim*LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 19285242Sachim*SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE 20285242Sachim 21285242Sachim********************************************************************************/ 22285242Sachim/*******************************************************************************/ 23285242Sachim/*! \file sainit.c 24285242Sachim * \brief The file implements the functions to initialize the LL layer 25285242Sachim * 26285242Sachim */ 27285242Sachim/******************************************************************************/ 28285242Sachim#include <sys/cdefs.h> 29285242Sachim__FBSDID("$FreeBSD: stable/11/sys/dev/pms/RefTisa/sallsdk/spc/sainit.c 315221 2017-03-14 02:06:03Z pfg $"); 30285242Sachim#include <dev/pms/config.h> 31285242Sachim 32285242Sachim#include <dev/pms/RefTisa/sallsdk/spc/saglobal.h> 33285242Sachim#ifdef SA_ENABLE_TRACE_FUNCTIONS 34285242Sachim#ifdef siTraceFileID 35285242Sachim#undef siTraceFileID 36285242Sachim#endif 37285242Sachim#define siTraceFileID 'F' 38285242Sachim#endif 39285242Sachim 40285242Sachimbit32 gLLDebugLevel = 3; 41285242Sachim 42285242Sachim#if defined(SALLSDK_DEBUG) 43285242Sachimbit32 gLLDebugLevelSet = 0; // block reinitialize from updating 44285242Sachimbit32 gLLLogFuncDebugLevel = 0; 45285242Sachimbit32 gLLSoftResetCounter = 0; 46285242Sachim#endif 47285242Sachim 48285242Sachimbit32 gPollForMissingInt; 49285242Sachim 50285242Sachim#ifdef FW_EVT_LOG_TST 51315221Spfgvoid *eventLogAddress = NULL; 52285242Sachim#endif 53285242Sachim 54285242Sachimextern bit32 gWait_3; 55285242Sachimextern bit32 gWait_2; 56285242Sachimbit32 gFPGA_TEST = 0; // If set unblock fpga functions 57285242Sachim 58285242Sachim/******************************************************************************/ 59285242Sachim/*! \brief Get the memory and lock requirement from LL layer 60285242Sachim * 61285242Sachim * Get the memory and lock requirement from LL layer 62285242Sachim * 63285242Sachim * \param agRoot Handles for this instance of SAS/SATA hardware 64285242Sachim * \param swConfig Pointer to the software configuration 65285242Sachim * \param memoryRequirement Point to the data structure that holds the different 66285242Sachim * chunks of memory that are required 67285242Sachim * \param usecsPerTick micro-seconds per tick for the LL layer 68285242Sachim * \param maxNumLocks maximum number of locks for the LL layer 69285242Sachim * 70285242Sachim * \return -void- 71285242Sachim * 72285242Sachim */ 73285242Sachim/*******************************************************************************/ 74285242SachimGLOBAL void saGetRequirements( 75285242Sachim agsaRoot_t *agRoot, 76285242Sachim agsaSwConfig_t *swConfig, 77285242Sachim agsaMemoryRequirement_t *memoryRequirement, 78285242Sachim bit32 *usecsPerTick, 79285242Sachim bit32 *maxNumLocks 80285242Sachim ) 81285242Sachim{ 82285242Sachim bit32 memoryReqCount = 0; 83285242Sachim bit32 i; 84285242Sachim static mpiConfig_t mpiConfig; 85285242Sachim static mpiMemReq_t mpiMemoryRequirement; 86285242Sachim 87285242Sachim 88285242Sachim /* sanity check */ 89285242Sachim SA_ASSERT((agNULL != swConfig), ""); 90285242Sachim SA_ASSERT((agNULL != memoryRequirement), ""); 91285242Sachim SA_ASSERT((agNULL != usecsPerTick), ""); 92285242Sachim SA_ASSERT((agNULL != maxNumLocks), ""); 93285242Sachim 94285242Sachim si_memset(&mpiMemoryRequirement, 0, sizeof(mpiMemReq_t)); 95285242Sachim si_memset(&mpiConfig, 0, sizeof(mpiConfig_t)); 96285242Sachim 97285242Sachim SA_DBG1(("saGetRequirements:agRoot %p swConfig %p memoryRequirement %p usecsPerTick %p maxNumLocks %p\n",agRoot, swConfig,memoryRequirement,usecsPerTick,maxNumLocks)); 98285242Sachim SA_DBG1(("saGetRequirements: usecsPerTick 0x%x (%d)\n",*usecsPerTick,*usecsPerTick)); 99285242Sachim 100285242Sachim /* Get Resource Requirements for SPC MPI */ 101285242Sachim /* Set the default/specified requirements swConfig from TD layer */ 102285242Sachim siConfiguration(agRoot, &mpiConfig, agNULL, swConfig); 103285242Sachim mpiRequirementsGet(&mpiConfig, &mpiMemoryRequirement); 104285242Sachim 105285242Sachim /* memory requirement for saRoot, CACHE memory */ 106285242Sachim memoryRequirement->agMemory[LLROOT_MEM_INDEX].singleElementLength = sizeof(agsaLLRoot_t); 107285242Sachim memoryRequirement->agMemory[LLROOT_MEM_INDEX].numElements = 1; 108285242Sachim memoryRequirement->agMemory[LLROOT_MEM_INDEX].totalLength = sizeof(agsaLLRoot_t); 109285242Sachim memoryRequirement->agMemory[LLROOT_MEM_INDEX].alignment = sizeof(void *); 110285242Sachim memoryRequirement->agMemory[LLROOT_MEM_INDEX].type = AGSA_CACHED_MEM; 111285242Sachim memoryReqCount ++; 112285242Sachim 113285242Sachim SA_DBG1(("saGetRequirements: agMemory[LLROOT_MEM_INDEX] singleElementLength = 0x%x totalLength = 0x%x align = 0x%x type %x\n", 114285242Sachim memoryRequirement->agMemory[LLROOT_MEM_INDEX].singleElementLength, 115285242Sachim memoryRequirement->agMemory[LLROOT_MEM_INDEX].totalLength, 116285242Sachim memoryRequirement->agMemory[LLROOT_MEM_INDEX].alignment, 117285242Sachim memoryRequirement->agMemory[LLROOT_MEM_INDEX].type )); 118285242Sachim 119285242Sachim /* memory requirement for Device Links, CACHE memory */ 120285242Sachim memoryRequirement->agMemory[DEVICELINK_MEM_INDEX].singleElementLength = sizeof(agsaDeviceDesc_t); 121285242Sachim memoryRequirement->agMemory[DEVICELINK_MEM_INDEX].numElements = swConfig->numDevHandles; 122285242Sachim memoryRequirement->agMemory[DEVICELINK_MEM_INDEX].totalLength = sizeof(agsaDeviceDesc_t) 123285242Sachim * swConfig->numDevHandles; 124285242Sachim memoryRequirement->agMemory[DEVICELINK_MEM_INDEX].alignment = sizeof(void *); 125285242Sachim memoryRequirement->agMemory[DEVICELINK_MEM_INDEX].type = AGSA_CACHED_MEM; 126285242Sachim memoryReqCount ++; 127285242Sachim SA_DBG1(("saGetRequirements: agMemory[DEVICELINK_MEM_INDEX] singleElementLength = 0x%x totalLength = 0x%x align = 0x%x type %x\n", 128285242Sachim memoryRequirement->agMemory[DEVICELINK_MEM_INDEX].singleElementLength, 129285242Sachim memoryRequirement->agMemory[DEVICELINK_MEM_INDEX].totalLength, 130285242Sachim memoryRequirement->agMemory[DEVICELINK_MEM_INDEX].alignment, 131285242Sachim memoryRequirement->agMemory[DEVICELINK_MEM_INDEX].type )); 132285242Sachim 133285242Sachim /* memory requirement for IORequest Links, CACHE memory */ 134285242Sachim memoryRequirement->agMemory[IOREQLINK_MEM_INDEX].singleElementLength = sizeof(agsaIORequestDesc_t); 135285242Sachim /* 136285242Sachim Add SA_RESERVED_REQUEST_COUNT to guarantee quality of service 137285242Sachim */ 138285242Sachim memoryRequirement->agMemory[IOREQLINK_MEM_INDEX].numElements = swConfig->maxActiveIOs + SA_RESERVED_REQUEST_COUNT; 139285242Sachim memoryRequirement->agMemory[IOREQLINK_MEM_INDEX].totalLength = sizeof(agsaIORequestDesc_t) * 140285242Sachim memoryRequirement->agMemory[IOREQLINK_MEM_INDEX].numElements; 141285242Sachim memoryRequirement->agMemory[IOREQLINK_MEM_INDEX].alignment = sizeof(void *); 142285242Sachim memoryRequirement->agMemory[IOREQLINK_MEM_INDEX].type = AGSA_CACHED_MEM; 143285242Sachim memoryReqCount ++; 144285242Sachim 145285242Sachim SA_DBG1(("saGetRequirements: agMemory[IOREQLINK_MEM_INDEX] singleElementLength = 0x%x totalLength = 0x%x align = 0x%x type %x\n", 146285242Sachim memoryRequirement->agMemory[IOREQLINK_MEM_INDEX].singleElementLength, 147285242Sachim memoryRequirement->agMemory[IOREQLINK_MEM_INDEX].totalLength, 148285242Sachim memoryRequirement->agMemory[IOREQLINK_MEM_INDEX].alignment, 149285242Sachim memoryRequirement->agMemory[IOREQLINK_MEM_INDEX].type )); 150285242Sachim 151285242Sachim /* memory requirement for Timer Links, CACHE memory */ 152285242Sachim memoryRequirement->agMemory[TIMERLINK_MEM_INDEX].singleElementLength = sizeof(agsaTimerDesc_t); 153285242Sachim memoryRequirement->agMemory[TIMERLINK_MEM_INDEX].numElements = NUM_TIMERS; 154285242Sachim memoryRequirement->agMemory[TIMERLINK_MEM_INDEX].totalLength = sizeof(agsaTimerDesc_t) * NUM_TIMERS; 155285242Sachim memoryRequirement->agMemory[TIMERLINK_MEM_INDEX].alignment = sizeof(void *); 156285242Sachim memoryRequirement->agMemory[TIMERLINK_MEM_INDEX].type = AGSA_CACHED_MEM; 157285242Sachim memoryReqCount ++; 158285242Sachim SA_DBG1(("saGetRequirements: agMemory[TIMERLINK_MEM_INDEX] singleElementLength = 0x%x totalLength = 0x%x align = 0x%x type %x\n", 159285242Sachim memoryRequirement->agMemory[TIMERLINK_MEM_INDEX].singleElementLength, 160285242Sachim memoryRequirement->agMemory[TIMERLINK_MEM_INDEX].totalLength, 161285242Sachim memoryRequirement->agMemory[TIMERLINK_MEM_INDEX].alignment, 162285242Sachim memoryRequirement->agMemory[TIMERLINK_MEM_INDEX].type )); 163285242Sachim 164285242Sachim#ifdef SA_ENABLE_TRACE_FUNCTIONS 165285242Sachim 166285242Sachim /* memory requirement for LL trace memory */ 167285242Sachim memoryRequirement->agMemory[LL_FUNCTION_TRACE].singleElementLength = 1; 168285242Sachim memoryRequirement->agMemory[LL_FUNCTION_TRACE].numElements = swConfig->TraceBufferSize; 169285242Sachim memoryRequirement->agMemory[LL_FUNCTION_TRACE].totalLength = swConfig->TraceBufferSize; 170285242Sachim memoryRequirement->agMemory[LL_FUNCTION_TRACE].alignment = sizeof(void *); 171285242Sachim memoryRequirement->agMemory[LL_FUNCTION_TRACE].type = AGSA_CACHED_MEM; 172285242Sachim memoryReqCount ++; 173285242Sachim 174285242Sachim SA_DBG1(("saGetRequirements: agMemory[LL_FUNCTION_TRACE] singleElementLength = 0x%x totalLength = 0x%x align = 0x%x type %x\n", 175285242Sachim memoryRequirement->agMemory[LL_FUNCTION_TRACE].singleElementLength, 176285242Sachim memoryRequirement->agMemory[LL_FUNCTION_TRACE].totalLength, 177285242Sachim memoryRequirement->agMemory[LL_FUNCTION_TRACE].alignment, 178285242Sachim memoryRequirement->agMemory[LL_FUNCTION_TRACE].type )); 179285242Sachim 180285242Sachim#endif /* END SA_ENABLE_TRACE_FUNCTIONS */ 181285242Sachim 182285242Sachim#ifdef FAST_IO_TEST 183285242Sachim { 184285242Sachim agsaMem_t *agMemory = memoryRequirement->agMemory; 185285242Sachim 186285242Sachim /* memory requirement for Super IO CACHE memory */ 187285242Sachim agMemory[LL_FAST_IO].singleElementLength = sizeof(saFastRequest_t); 188285242Sachim agMemory[LL_FAST_IO].numElements = LL_FAST_IO_SIZE; 189285242Sachim agMemory[LL_FAST_IO].totalLength = LL_FAST_IO_SIZE * 190285242Sachim agMemory[LL_FAST_IO].singleElementLength; 191285242Sachim agMemory[LL_FAST_IO].alignment = sizeof(void*); 192285242Sachim agMemory[LL_FAST_IO].type = AGSA_CACHED_MEM; 193285242Sachim memoryReqCount ++; 194285242Sachim 195285242Sachim SA_DBG1(("saGetRequirements: agMemory[LL_FAST_IO] singleElementLength = 0x%x totalLength = 0x%x align = 0x%x type %x\n", 196285242Sachim memoryRequirement->agMemory[LL_FAST_IO].singleElementLength, 197285242Sachim memoryRequirement->agMemory[LL_FAST_IO].totalLength, 198285242Sachim memoryRequirement->agMemory[LL_FAST_IO].alignment, 199285242Sachim memoryRequirement->agMemory[LL_FAST_IO].type )); 200285242Sachim 201285242Sachim } 202285242Sachim#endif 203285242Sachim 204285242Sachim#ifdef SA_ENABLE_HDA_FUNCTIONS 205285242Sachim { 206285242Sachim agsaMem_t *agMemory = memoryRequirement->agMemory; 207285242Sachim 208285242Sachim /* memory requirement for HDA FW image */ 209285242Sachim agMemory[HDA_DMA_BUFFER].singleElementLength = (1024 * 1024); /* must be greater than size of aap1 fw image */ 210285242Sachim agMemory[HDA_DMA_BUFFER].numElements = 1; 211285242Sachim agMemory[HDA_DMA_BUFFER].totalLength = agMemory[HDA_DMA_BUFFER].numElements * 212285242Sachim agMemory[HDA_DMA_BUFFER].singleElementLength; 213285242Sachim agMemory[HDA_DMA_BUFFER].alignment = 32; 214285242Sachim agMemory[HDA_DMA_BUFFER].type = AGSA_DMA_MEM; 215285242Sachim memoryReqCount ++; 216285242Sachim SA_DBG1(("saGetRequirements: agMemory[HDA_DMA_BUFFER] singleElementLength = 0x%x totalLength = 0x%x align = 0x%x type %x\n", 217285242Sachim memoryRequirement->agMemory[HDA_DMA_BUFFER].singleElementLength, 218285242Sachim memoryRequirement->agMemory[HDA_DMA_BUFFER].totalLength, 219285242Sachim memoryRequirement->agMemory[HDA_DMA_BUFFER].alignment, 220285242Sachim memoryRequirement->agMemory[HDA_DMA_BUFFER].type )); 221285242Sachim } 222285242Sachim#endif /* SA_ENABLE_HDA_FUNCTIONS */ 223285242Sachim 224285242Sachim /* memory requirement for MPI MSGU layer, DMA memory */ 225285242Sachim for ( i = 0; i < mpiMemoryRequirement.count; i ++ ) 226285242Sachim { 227285242Sachim memoryRequirement->agMemory[memoryReqCount].singleElementLength = mpiMemoryRequirement.region[i].elementSize; 228285242Sachim memoryRequirement->agMemory[memoryReqCount].numElements = mpiMemoryRequirement.region[i].numElements; 229285242Sachim memoryRequirement->agMemory[memoryReqCount].totalLength = mpiMemoryRequirement.region[i].totalLength; 230285242Sachim memoryRequirement->agMemory[memoryReqCount].alignment = mpiMemoryRequirement.region[i].alignment; 231285242Sachim memoryRequirement->agMemory[memoryReqCount].type = mpiMemoryRequirement.region[i].type; 232285242Sachim SA_DBG1(("saGetRequirements:MPI agMemory[%d] singleElementLength = 0x%x totalLength = 0x%x align = 0x%x type %x\n", 233285242Sachim memoryReqCount, 234285242Sachim memoryRequirement->agMemory[memoryReqCount].singleElementLength, 235285242Sachim memoryRequirement->agMemory[memoryReqCount].totalLength, 236285242Sachim memoryRequirement->agMemory[memoryReqCount].alignment, 237285242Sachim memoryRequirement->agMemory[memoryReqCount].type )); 238285242Sachim memoryReqCount ++; 239285242Sachim } 240285242Sachim 241285242Sachim 242285242Sachim /* requirement for locks */ 243285242Sachim if (swConfig->param3 == agNULL) 244285242Sachim { 245285242Sachim *maxNumLocks = (LL_IOREQ_IBQ_LOCK + AGSA_MAX_INBOUND_Q ); 246285242Sachim SA_DBG1(("saGetRequirements: param3 == agNULL maxNumLocks %d\n", *maxNumLocks )); 247285242Sachim } 248285242Sachim else 249285242Sachim { 250285242Sachim agsaQueueConfig_t *queueConfig; 251285242Sachim queueConfig = (agsaQueueConfig_t *)swConfig->param3; 252285242Sachim *maxNumLocks = (LL_IOREQ_IBQ_LOCK_PARM + queueConfig->numInboundQueues ); 253285242Sachim SA_DBG1(("saGetRequirements: maxNumLocks %d\n", *maxNumLocks )); 254285242Sachim } 255285242Sachim 256285242Sachim 257285242Sachim /* setup the time tick */ 258285242Sachim *usecsPerTick = SA_USECS_PER_TICK; 259285242Sachim 260285242Sachim SA_ASSERT(memoryReqCount < AGSA_NUM_MEM_CHUNKS, "saGetRequirements: Exceed max number of memory place holder"); 261285242Sachim 262285242Sachim /* set up memory requirement count */ 263285242Sachim memoryRequirement->count = memoryReqCount; 264285242Sachim 265285242Sachim swConfig->legacyInt_X = 1; 266285242Sachim swConfig->max_MSI_InterruptVectors = 32; 267285242Sachim swConfig->max_MSIX_InterruptVectors = 64;//16; 268285242Sachim 269285242Sachim SA_DBG1(("saGetRequirements: swConfig->stallUsec %d\n",swConfig->stallUsec )); 270285242Sachim 271285242Sachim#ifdef SA_CONFIG_MDFD_REGISTRY 272285242Sachim SA_DBG1(("saGetRequirements: swConfig->disableMDF %d\n",swConfig->disableMDF)); 273285242Sachim#endif /*SA_CONFIG_MDFD_REGISTRY*/ 274285242Sachim /*SA_DBG1(("saGetRequirements: swConfig->enableDIF %d\n",swConfig->enableDIF ));*/ 275285242Sachim /*SA_DBG1(("saGetRequirements: swConfig->enableEncryption %d\n",swConfig->enableEncryption ));*/ 276285242Sachim#ifdef SA_ENABLE_HDA_FUNCTIONS 277285242Sachim swConfig->hostDirectAccessSupport = 1; 278285242Sachim swConfig->hostDirectAccessMode = 0; 279285242Sachim#else 280285242Sachim swConfig->hostDirectAccessSupport = 0; 281285242Sachim swConfig->hostDirectAccessMode = 0; 282285242Sachim#endif 283285242Sachim 284285242Sachim} 285285242Sachim 286285242Sachim/******************************************************************************/ 287285242Sachim/*! \brief Initialize the Hardware 288285242Sachim * 289285242Sachim * Initialize the Hardware 290285242Sachim * 291285242Sachim * \param agRoot Handles for this instance of SAS/SATA hardware 292285242Sachim * \param memoryAllocated Point to the data structure that holds the different 293285242Sachim chunks of memory that are required 294285242Sachim * \param hwConfig Pointer to the hardware configuration 295285242Sachim * \param swConfig Pointer to the software configuration 296285242Sachim * \param usecsPerTick micro-seconds per tick for the LL layer 297285242Sachim * 298285242Sachim * \return If initialization is successful 299285242Sachim * - \e AGSA_RC_SUCCESS initialization is successful 300285242Sachim * - \e AGSA_RC_FAILURE initialization is not successful 301285242Sachim */ 302285242Sachim/*******************************************************************************/ 303285242SachimGLOBAL bit32 saInitialize( 304285242Sachim agsaRoot_t *agRoot, 305285242Sachim agsaMemoryRequirement_t *memoryAllocated, 306285242Sachim agsaHwConfig_t *hwConfig, 307285242Sachim agsaSwConfig_t *swConfig, 308285242Sachim bit32 usecsPerTick 309285242Sachim ) 310285242Sachim{ 311285242Sachim agsaLLRoot_t *saRoot; 312285242Sachim agsaDeviceDesc_t *pDeviceDesc; 313285242Sachim agsaIORequestDesc_t *pRequestDesc; 314285242Sachim agsaTimerDesc_t *pTimerDesc; 315285242Sachim agsaPort_t *pPort; 316285242Sachim agsaPortMap_t *pPortMap; 317285242Sachim agsaDeviceMap_t *pDeviceMap; 318285242Sachim agsaIOMap_t *pIOMap; 319285242Sachim bit32 maxNumIODevices; 320285242Sachim bit32 i, j; 321285242Sachim static mpiMemReq_t mpiMemoryAllocated; 322285242Sachim bit32 Tried_NO_HDA = agFALSE; 323285242Sachim bit32 Double_Reset_HDA = agFALSE; 324285242Sachim bit32 ret = AGSA_RC_SUCCESS; 325285242Sachim#ifdef FAST_IO_TEST 326285242Sachim void *fr; /* saFastRequest_t */ 327285242Sachim bit32 size; 328285242Sachim bit32 alignment; 329285242Sachim#endif 330285242Sachim 331285242Sachim /* sanity check */ 332285242Sachim SA_ASSERT((agNULL != agRoot), ""); 333285242Sachim SA_ASSERT((agNULL != memoryAllocated), ""); 334285242Sachim SA_ASSERT((agNULL != hwConfig), ""); 335285242Sachim SA_ASSERT((agNULL != swConfig), ""); 336285242Sachim SA_ASSERT((LLROOT_MEM_INDEX < memoryAllocated->count), ""); 337285242Sachim SA_ASSERT((DEVICELINK_MEM_INDEX < memoryAllocated->count), ""); 338285242Sachim SA_ASSERT((IOREQLINK_MEM_INDEX < memoryAllocated->count), ""); 339285242Sachim SA_ASSERT((TIMERLINK_MEM_INDEX < memoryAllocated->count), ""); 340285242Sachim 341285242Sachim si_memset(&mpiMemoryAllocated, 0, sizeof(mpiMemReq_t)); 342285242Sachim 343285242Sachim si_macro_check(agRoot); 344285242Sachim 345285242Sachim SA_DBG1(("saInitialize: WAIT_INCREMENT %d\n", WAIT_INCREMENT )); 346285242Sachim SA_DBG1(("saInitialize: usecsPerTick %d\n", usecsPerTick )); 347285242Sachim if(! smIS_SPC(agRoot)) 348285242Sachim { 349285242Sachim if(! smIS_SPCV(agRoot)) 350285242Sachim { 351285242Sachim SA_DBG1(("saInitialize: ossaHwRegReadConfig32 ID reads as %08X\n", ossaHwRegReadConfig32(agRoot,0 ) )); 352285242Sachim SA_DBG1(("saInitialize: expect %08X or %08X or\n", VEN_DEV_SPCV, VEN_DEV_SPCVE)); 353285242Sachim SA_DBG1(("saInitialize: expect %08X or %08X or\n", VEN_DEV_SPCVP, VEN_DEV_SPCVEP)); 354285242Sachim SA_DBG1(("saInitialize: expect %08X or %08X\n", VEN_DEV_ADAPVEP, VEN_DEV_ADAPVP)); 355285242Sachim return AGSA_RC_FAILURE; 356285242Sachim } 357285242Sachim } 358285242Sachim 359285242Sachim if( smIS_SPC(agRoot) && smIS_SPCV(agRoot)) 360285242Sachim { 361285242Sachim SA_DBG1(("saInitialize: Macro error !smIS_SPC %d smIS_SPCv %d smIS_SFC %d\n",smIS_SPC(agRoot),smIS_SPCV(agRoot), smIS_SFC(agRoot) )); 362285242Sachim return AGSA_RC_FAILURE; 363285242Sachim } 364285242Sachim 365285242Sachim /* Check the memory allocated */ 366285242Sachim for ( i = 0; i < memoryAllocated->count; i ++ ) 367285242Sachim { 368285242Sachim /* If memory allocation failed */ 369285242Sachim if (memoryAllocated->agMemory[i].singleElementLength && 370285242Sachim memoryAllocated->agMemory[i].numElements) 371285242Sachim { 372285242Sachim if ( (0 != memoryAllocated->agMemory[i].numElements) 373285242Sachim && (0 == memoryAllocated->agMemory[i].totalLength) ) 374285242Sachim { 375285242Sachim /* return failure */ 376285242Sachim SA_DBG1(("saInitialize:AGSA_RC_FAILURE Memory[%d] singleElementLength = 0x%x numElements = 0x%x NOT allocated\n", 377285242Sachim i, 378285242Sachim memoryAllocated->agMemory[i].singleElementLength, 379285242Sachim memoryAllocated->agMemory[i].numElements)); 380285242Sachim ret = AGSA_RC_FAILURE; 381285242Sachim return ret; 382285242Sachim } 383285242Sachim else 384285242Sachim { 385285242Sachim SA_DBG1(("saInitialize: Memory[%d] singleElementLength = 0x%x numElements = 0x%x allocated %p\n", 386285242Sachim i, 387285242Sachim memoryAllocated->agMemory[i].singleElementLength, 388285242Sachim memoryAllocated->agMemory[i].numElements, 389285242Sachim memoryAllocated->agMemory[i].virtPtr)); 390285242Sachim } 391285242Sachim } 392285242Sachim } 393285242Sachim 394285242Sachim /* Get the saRoot memory address */ 395285242Sachim saRoot = (agsaLLRoot_t *) (memoryAllocated->agMemory[LLROOT_MEM_INDEX].virtPtr); 396285242Sachim SA_ASSERT((agNULL != saRoot), "saRoot"); 397285242Sachim if(agNULL == saRoot) 398285242Sachim { 399285242Sachim SA_DBG1(("saInitialize:AGSA_RC_FAILURE saRoot\n")); 400285242Sachim return AGSA_RC_FAILURE; 401285242Sachim } 402285242Sachim 403285242Sachim agRoot->sdkData = (void *) saRoot; 404285242Sachim 405285242Sachim SA_DBG1(("saInitialize: saRoot %p\n",saRoot)); 406285242Sachim 407285242Sachim if ( (memoryAllocated != &saRoot->memoryAllocated) || 408285242Sachim (hwConfig != &saRoot->hwConfig) || 409285242Sachim (swConfig != &saRoot->swConfig) ) 410285242Sachim { 411285242Sachim agsaMemoryRequirement_t *memA = &saRoot->memoryAllocated; 412285242Sachim agsaHwConfig_t *hwC = &saRoot->hwConfig; 413285242Sachim agsaSwConfig_t *swC = &saRoot->swConfig; 414285242Sachim 415285242Sachim /* Copy data here */ 416285242Sachim 417285242Sachim *memA = *memoryAllocated; 418285242Sachim *hwC = *hwConfig; 419285242Sachim *swC = *swConfig; 420285242Sachim } 421285242Sachim 422285242Sachim 423285242Sachim#if defined(SALLSDK_DEBUG) 424285242Sachim if(gLLDebugLevelSet == 0) 425285242Sachim { 426285242Sachim gLLDebugLevelSet = 1; 427285242Sachim gLLDebugLevel = swConfig->sallDebugLevel & 0xF; 428285242Sachim SA_DBG1(("saInitialize: gLLDebugLevel %x\n",gLLDebugLevel)); 429285242Sachim } 430285242Sachim#endif /* SALLSDK_DEBUG */ 431285242Sachim 432285242Sachim#ifdef SA_ENABLE_TRACE_FUNCTIONS 433285242Sachim 434285242Sachim saRoot->TraceBufferLength = memoryAllocated->agMemory[LL_FUNCTION_TRACE].totalLength; 435285242Sachim saRoot->TraceBuffer = memoryAllocated->agMemory[LL_FUNCTION_TRACE].virtPtr; 436285242Sachim 437285242Sachim siEnableTracing ( agRoot ); 438285242Sachim/* 439285242Sachim*/ 440285242Sachim 441285242Sachim#endif /* SA_ENABLE_TRACE_FUNCTIONS */ 442285242Sachim 443285242Sachim#ifdef FAST_IO_TEST 444285242Sachim { 445285242Sachim agsaMem_t *agMemory = memoryAllocated->agMemory; 446285242Sachim 447285242Sachim /* memory requirement for Super IO CACHE memory */ 448285242Sachim size = sizeof(saRoot->freeFastReq) / sizeof(saRoot->freeFastReq[0]); 449285242Sachim 450285242Sachim SA_ASSERT(size == agMemory[LL_FAST_IO].numElements, ""); 451285242Sachim SA_ASSERT(agMemory[LL_FAST_IO].virtPtr, ""); 452285242Sachim SA_ASSERT((agMemory[LL_FAST_IO].singleElementLength == 453285242Sachim sizeof(saFastRequest_t)) && 454285242Sachim (agMemory[LL_FAST_IO].numElements == LL_FAST_IO_SIZE) && 455285242Sachim (agMemory[LL_FAST_IO].totalLength == agMemory[LL_FAST_IO].numElements * 456285242Sachim agMemory[LL_FAST_IO].singleElementLength), ""); 457285242Sachim 458285242Sachim for (i = 0, alignment = agMemory[LL_FAST_IO].alignment, 459285242Sachim fr = agMemory[LL_FAST_IO].virtPtr; 460285242Sachim i < size; i++, 461285242Sachim fr = (void*)((bitptr)fr + (bitptr)(((bit32)sizeof(saFastRequest_t) + 462285242Sachim alignment - 1) & ~(alignment - 1)))) 463285242Sachim { 464285242Sachim saRoot->freeFastReq[i] = fr; 465285242Sachim } 466285242Sachim saRoot->freeFastIdx = size; 467285242Sachim } 468285242Sachim#endif /* FAST_IO_TEST*/ 469285242Sachim 470285242Sachim smTraceFuncEnter(hpDBG_VERY_LOUD, "m1"); 471285242Sachim 472285242Sachim SA_DBG1(("saInitialize: swConfig->PortRecoveryResetTimer %x\n",swConfig->PortRecoveryResetTimer )); 473285242Sachim 474285242Sachim SA_DBG1(("saInitialize: hwDEVICE_ID_VENDID 0x%08x\n", ossaHwRegReadConfig32(agRoot,0))); 475285242Sachim SA_DBG1(("saInitialize: CFGSTAT CFGCMD 0x%08x\n", ossaHwRegReadConfig32(agRoot,4))); 476285242Sachim SA_DBG1(("saInitialize: CLSCODE REVID 0x%08x\n", ossaHwRegReadConfig32(agRoot,8))); 477285242Sachim SA_DBG1(("saInitialize: BIST DT HDRTYPE LATTIM CLSIZE 0x%08x\n", ossaHwRegReadConfig32(agRoot,12))); 478285242Sachim SA_DBG1(("saInitialize: hwSVID 0x%08x\n", ossaHwRegReadConfig32(agRoot,44))); 479285242Sachim 480285242Sachim 481285242Sachim#ifdef SA_ENABLE_PCI_TRIGGER 482285242Sachim 483285242Sachim SA_DBG1(("saInitialize: SA_ENABLE_PCI_TRIGGER a 0x%08x %p\n", saRoot->swConfig.PCI_trigger,&saRoot->swConfig.PCI_trigger)); 484285242Sachim 485285242Sachim if( saRoot->swConfig.PCI_trigger & PCI_TRIGGER_INIT_TEST ) 486285242Sachim { 487285242Sachim SA_DBG1(("saInitialize: SA_ENABLE_PCI_TRIGGER 0x%08x %p\n", saRoot->swConfig.PCI_trigger,&saRoot->swConfig.PCI_trigger)); 488285242Sachim saRoot->swConfig.PCI_trigger &= ~PCI_TRIGGER_INIT_TEST; 489285242Sachim siPCITriger(agRoot); 490285242Sachim } 491285242Sachim#endif /* SA_ENABLE_PCI_TRIGGER */ 492285242Sachim 493285242Sachim 494285242Sachim saRoot->ChipId = (ossaHwRegReadConfig32(agRoot,0) & 0xFFFF0000); 495285242Sachim 496285242Sachim SA_DBG1(("saInitialize: saRoot->ChipId 0x%08x\n", saRoot->ChipId)); 497285242Sachim siUpdateBarOffsetTable(agRoot,saRoot->ChipId); 498285242Sachim 499285242Sachim if(saRoot->ChipId == VEN_DEV_SPC) 500285242Sachim { 501285242Sachim if(! smIS_SPC(agRoot)) 502285242Sachim { 503285242Sachim SA_DBG1(("saInitialize: smIS_SPC macro fail !!!!\n" )); 504285242Sachim smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "m1"); 505285242Sachim return AGSA_RC_FAILURE; 506285242Sachim } 507285242Sachim 508285242Sachim SA_DBG1(("saInitialize: SPC \n" )); 509285242Sachim } 510285242Sachim else if(saRoot->ChipId == VEN_DEV_HIL ) 511285242Sachim { 512285242Sachim SA_DBG1(("saInitialize: SPC HIL\n" )); 513285242Sachim if(! smIS_SPC(agRoot)) 514285242Sachim { 515285242Sachim SA_DBG1(("saInitialize: smIS_SPC macro fail !!!!\n" )); 516285242Sachim smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "m1"); 517285242Sachim return AGSA_RC_FAILURE; 518285242Sachim } 519285242Sachim } 520285242Sachim else if(saRoot->ChipId == VEN_DEV_SPCV) 521285242Sachim { 522285242Sachim SA_DBG1(("saInitialize: SPC V\n" )); 523285242Sachim if(! smIS_SPCV(agRoot)) 524285242Sachim { 525285242Sachim SA_DBG1(("saInitialize: smIS_SPCV macro fail !!!!\n" )); 526285242Sachim smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "m1"); 527285242Sachim return AGSA_RC_FAILURE; 528285242Sachim } 529285242Sachim } 530285242Sachim else if(saRoot->ChipId == VEN_DEV_SPCVE) 531285242Sachim { 532285242Sachim SA_DBG1(("saInitialize: SPC VE\n" )); 533285242Sachim if(! smIS_SPCV(agRoot)) 534285242Sachim { 535285242Sachim SA_DBG1(("saInitialize: smIS_SPCV macro fail !!!!\n" )); 536285242Sachim smTraceFuncExit(hpDBG_VERY_LOUD, 'd', "m1"); 537285242Sachim return AGSA_RC_FAILURE; 538285242Sachim } 539285242Sachim } 540285242Sachim else if(saRoot->ChipId == VEN_DEV_SPCVP) 541285242Sachim { 542285242Sachim SA_DBG1(("saInitialize: SPC VP\n" )); 543285242Sachim if(! smIS_SPCV(agRoot)) 544285242Sachim { 545285242Sachim SA_DBG1(("saInitialize: smIS_SPCV macro fail !!!!\n" )); 546285242Sachim smTraceFuncExit(hpDBG_VERY_LOUD, 'e', "m1"); 547285242Sachim return AGSA_RC_FAILURE; 548285242Sachim } 549285242Sachim } 550285242Sachim else if(saRoot->ChipId == VEN_DEV_SPCVEP) 551285242Sachim { 552285242Sachim SA_DBG1(("saInitialize: SPC VEP\n" )); 553285242Sachim if(! smIS_SPCV(agRoot)) 554285242Sachim { 555285242Sachim SA_DBG1(("saInitialize: smIS_SPCV macro fail !!!!\n" )); 556285242Sachim smTraceFuncExit(hpDBG_VERY_LOUD, 'f', "m1"); 557285242Sachim return AGSA_RC_FAILURE; 558285242Sachim } 559285242Sachim } 560285242Sachim else if(saRoot->ChipId == VEN_DEV_ADAPVP) 561285242Sachim { 562285242Sachim SA_DBG1(("saInitialize: Adaptec 8088\n" )); 563285242Sachim } 564285242Sachim else if(saRoot->ChipId == VEN_DEV_ADAPVEP) 565285242Sachim { 566285242Sachim SA_DBG1(("saInitialize: Adaptec 8089\n" )); 567285242Sachim } 568285242Sachim else if(saRoot->ChipId == VEN_DEV_SPC12V) 569285242Sachim { 570285242Sachim SA_DBG1(("saInitialize: SPC 12V\n" )); 571285242Sachim if(! smIS_SPCV(agRoot)) 572285242Sachim { 573285242Sachim SA_DBG1(("saInitialize: smIS_SPCV macro fail !!!!\n" )); 574285242Sachim smTraceFuncExit(hpDBG_VERY_LOUD, 'g', "m1"); 575285242Sachim return AGSA_RC_FAILURE; 576285242Sachim } 577285242Sachim } 578285242Sachim else if(saRoot->ChipId == VEN_DEV_SPC12VE) 579285242Sachim { 580285242Sachim SA_DBG1(("saInitialize: SPC 12VE\n" )); 581285242Sachim if(! smIS_SPCV(agRoot)) 582285242Sachim { 583285242Sachim SA_DBG1(("saInitialize: smIS_SPCV macro fail !!!!\n" )); 584285242Sachim smTraceFuncExit(hpDBG_VERY_LOUD, 'h', "m1"); 585285242Sachim return AGSA_RC_FAILURE; 586285242Sachim } 587285242Sachim } 588285242Sachim else if(saRoot->ChipId == VEN_DEV_SPC12VP) 589285242Sachim { 590285242Sachim SA_DBG1(("saInitialize: SPC 12VP\n" )); 591285242Sachim if(! smIS_SPCV(agRoot)) 592285242Sachim { 593285242Sachim SA_DBG1(("saInitialize: smIS_SPCV macro fail !!!!\n" )); 594285242Sachim smTraceFuncExit(hpDBG_VERY_LOUD, 'i', "m1"); 595285242Sachim return AGSA_RC_FAILURE; 596285242Sachim } 597285242Sachim } 598285242Sachim else if(saRoot->ChipId == VEN_DEV_SPC12VEP) 599285242Sachim { 600285242Sachim SA_DBG1(("saInitialize: SPC 12VEP\n" )); 601285242Sachim if(! smIS_SPCV(agRoot)) 602285242Sachim { 603285242Sachim SA_DBG1(("saInitialize: smIS_SPCV macro fail !!!!\n" )); 604285242Sachim smTraceFuncExit(hpDBG_VERY_LOUD, 'j', "m1"); 605285242Sachim return AGSA_RC_FAILURE; 606285242Sachim } 607285242Sachim } 608285242Sachim else if(saRoot->ChipId == VEN_DEV_SPC12ADP) 609285242Sachim { 610285242Sachim SA_DBG1(("saInitialize: SPC 12ADP\n" )); 611285242Sachim if(! smIS_SPCV(agRoot)) 612285242Sachim { 613285242Sachim SA_DBG1(("saInitialize: smIS_SPCV macro fail !!!!\n" )); 614285242Sachim smTraceFuncExit(hpDBG_VERY_LOUD, 'k', "m1"); 615285242Sachim return AGSA_RC_FAILURE; 616285242Sachim } 617285242Sachim } 618285242Sachim else if(saRoot->ChipId == VEN_DEV_SPC12ADPE) 619285242Sachim { 620285242Sachim SA_DBG1(("saInitialize: SPC 12ADPE\n" )); 621285242Sachim if(! smIS_SPCV(agRoot)) 622285242Sachim { 623285242Sachim SA_DBG1(("saInitialize: smIS_SPCV macro fail !!!!\n" )); 624285242Sachim smTraceFuncExit(hpDBG_VERY_LOUD, 'l', "m1"); 625285242Sachim return AGSA_RC_FAILURE; 626285242Sachim } 627285242Sachim } 628285242Sachim else if(saRoot->ChipId == VEN_DEV_SPC12ADPP) 629285242Sachim { 630285242Sachim SA_DBG1(("saInitialize: SPC 12ADPP\n" )); 631285242Sachim if(! smIS_SPCV(agRoot)) 632285242Sachim { 633285242Sachim SA_DBG1(("saInitialize: smIS_SPCV macro fail !!!!\n" )); 634285242Sachim smTraceFuncExit(hpDBG_VERY_LOUD, 'm', "m1"); 635285242Sachim return AGSA_RC_FAILURE; 636285242Sachim } 637285242Sachim } 638285242Sachim else if(saRoot->ChipId == VEN_DEV_SPC12ADPEP) 639285242Sachim { 640285242Sachim SA_DBG1(("saInitialize: SPC 12ADPEP\n" )); 641285242Sachim if(! smIS_SPCV(agRoot)) 642285242Sachim { 643285242Sachim SA_DBG1(("saInitialize: smIS_SPCV macro fail !!!!\n" )); 644285242Sachim smTraceFuncExit(hpDBG_VERY_LOUD, 'n', "m1"); 645285242Sachim return AGSA_RC_FAILURE; 646285242Sachim } 647285242Sachim } 648285242Sachim else if(saRoot->ChipId == VEN_DEV_SPC12SATA) 649285242Sachim { 650285242Sachim SA_DBG1(("saInitialize: SPC12SATA\n" )); 651285242Sachim if(! smIS_SPCV(agRoot)) 652285242Sachim { 653285242Sachim SA_DBG1(("saInitialize: smIS_SPCV macro fail !!!!\n" )); 654285242Sachim smTraceFuncExit(hpDBG_VERY_LOUD, 'o', "m1"); 655285242Sachim return AGSA_RC_FAILURE; 656285242Sachim } 657285242Sachim } 658285242Sachim else if(saRoot->ChipId == VEN_DEV_9015) 659285242Sachim { 660285242Sachim SA_DBG1(("saInitialize: SPC 12V FPGA\n" )); 661285242Sachim if(! smIS_SPCV(agRoot)) 662285242Sachim { 663285242Sachim SA_DBG1(("saInitialize: smIS_SPCV macro fail !!!!\n" )); 664285242Sachim smTraceFuncExit(hpDBG_VERY_LOUD, 'p', "m1"); 665285242Sachim return AGSA_RC_FAILURE; 666285242Sachim } 667285242Sachim } 668285242Sachim else if(saRoot->ChipId == VEN_DEV_9060) 669285242Sachim { 670285242Sachim SA_DBG1(("saInitialize: SPC 12V FPGA B\n" )); 671285242Sachim if(! smIS_SPCV(agRoot)) 672285242Sachim { 673285242Sachim SA_DBG1(("saInitialize: smIS_SPCV macro fail !!!!\n" )); 674285242Sachim smTraceFuncExit(hpDBG_VERY_LOUD, 'q', "m1"); 675285242Sachim return AGSA_RC_FAILURE; 676285242Sachim } 677285242Sachim } 678285242Sachim else if(saRoot->ChipId == VEN_DEV_SFC) 679285242Sachim { 680285242Sachim SA_DBG1(("saInitialize: SFC \n" )); 681285242Sachim } 682285242Sachim else 683285242Sachim { 684285242Sachim SA_DBG1(("saInitialize saRoot->ChipId %8X expect %8X or %8X\n", saRoot->ChipId,VEN_DEV_SPC, VEN_DEV_SPCV)); 685285242Sachim SA_ASSERT(0, "ChipId"); 686285242Sachim smTraceFuncExit(hpDBG_VERY_LOUD, 'r', "m1"); 687285242Sachim return AGSA_RC_FAILURE; 688285242Sachim } 689285242Sachim 690285242Sachim if( smIS_SPC(agRoot)) 691285242Sachim { 692285242Sachim SA_DBG1(("saInitialize: Rev is A %d B %d C %d\n",smIsCfgSpcREV_A(agRoot),smIsCfgSpcREV_B(agRoot),smIsCfgSpcREV_C(agRoot))); 693285242Sachim } 694285242Sachim else 695285242Sachim { 696285242Sachim SA_DBG1(("saInitialize: Rev is A %d B %d C %d\n",smIsCfgVREV_A(agRoot),smIsCfgVREV_B(agRoot),smIsCfgVREV_C(agRoot))); 697285242Sachim } 698285242Sachim 699285242Sachim if( smIS_SPC(agRoot)) 700285242Sachim { 701285242Sachim SA_DBG1(("saInitialize: LINK_CTRL 0x%08x Speed 0x%X Lanes 0x%X \n", ossaHwRegReadConfig32(agRoot,128), 702285242Sachim ((ossaHwRegReadConfig32(agRoot,128) & 0x000F0000) >> 16), 703285242Sachim ((ossaHwRegReadConfig32(agRoot,128) & 0x0FF00000) >> 20) )); 704285242Sachim } 705285242Sachim else 706285242Sachim { 707285242Sachim SA_DBG1(("saInitialize: LINK_CTRL 0x%08x Speed 0x%X Lanes 0x%X \n", ossaHwRegReadConfig32(agRoot,208), 708285242Sachim ((ossaHwRegReadConfig32(agRoot,208) & 0x000F0000) >> 16), 709285242Sachim ((ossaHwRegReadConfig32(agRoot,208) & 0x0FF00000) >> 20) )); 710285242Sachim } 711285242Sachim 712285242Sachim SA_DBG1(("saInitialize: V_SoftResetRegister %08X\n", ossaHwRegReadExt(agRoot, PCIBAR0, V_SoftResetRegister ))); 713285242Sachim 714285242Sachim/* 715285242Sachim SA_DBG1(("saInitialize:TOP_BOOT_STRAP STRAP_BIT %X\n", ossaHwRegReadExt(agRoot, PCIBAR1, 0) )); 716285242Sachim 717285242Sachim SA_DBG1(("SPC_REG_TOP_DEVICE_ID %8X expect %08X\n", ossaHwRegReadExt(agRoot, PCIBAR2, SPC_REG_TOP_DEVICE_ID), SPC_TOP_DEVICE_ID)); 718285242Sachim 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)); 719285242Sachim 720285242Sachim SA_DBG1(("SPC_REG_TOP_BOOT_STRAP %8X expect %08X\n", ossaHwRegReadExt(agRoot, PCIBAR2, SPC_REG_TOP_BOOT_STRAP), SPC_TOP_BOOT_STRAP)); 721285242Sachim 722285242Sachim SA_DBG1(("swConfig->numSASDevHandles =%d\n", swConfig->numDevHandles)); 723285242Sachim*/ 724285242Sachim smTrace(hpDBG_VERY_LOUD,"29",swConfig->numDevHandles); 725285242Sachim /* TP:29 swConfig->numDevHandles */ 726285242Sachim 727285242Sachim /* Setup Device link */ 728285242Sachim /* Save the information of allocated device Link memory */ 729285242Sachim saRoot->deviceLinkMem = memoryAllocated->agMemory[DEVICELINK_MEM_INDEX]; 730285242Sachim if(agNULL == saRoot->deviceLinkMem.virtPtr) 731285242Sachim { 732285242Sachim SA_ASSERT(0, "deviceLinkMem"); 733285242Sachim smTraceFuncExit(hpDBG_VERY_LOUD, 'q', "m1"); 734285242Sachim return AGSA_RC_FAILURE; 735285242Sachim } 736285242Sachim 737285242Sachim si_memset(saRoot->deviceLinkMem.virtPtr, 0, saRoot->deviceLinkMem.totalLength); 738285242Sachim SA_DBG2(("saInitialize: [%d] saRoot->deviceLinkMem VirtPtr=%p PhysicalLo=%x Count=%x Total=%x type %x\n", 739285242Sachim DEVICELINK_MEM_INDEX, 740285242Sachim saRoot->deviceLinkMem.virtPtr, 741285242Sachim saRoot->deviceLinkMem.phyAddrLower, 742285242Sachim saRoot->deviceLinkMem.numElements, 743285242Sachim saRoot->deviceLinkMem.totalLength, 744285242Sachim saRoot->deviceLinkMem.type)); 745285242Sachim 746285242Sachim maxNumIODevices = swConfig->numDevHandles; 747285242Sachim SA_DBG2(("saInitialize: maxNumIODevices=%d, swConfig->numDevHandles=%d \n", 748285242Sachim maxNumIODevices, 749285242Sachim swConfig->numDevHandles)); 750285242Sachim 751285242Sachim#ifdef SA_ENABLE_PCI_TRIGGER 752285242Sachim SA_DBG1(("saInitialize: swConfig->PCI_trigger= 0x%x\n", swConfig->PCI_trigger)); 753285242Sachim#endif /* SA_ENABLE_PCI_TRIGGER */ 754285242Sachim 755285242Sachim /* Setup free IO Devices link list */ 756285242Sachim saLlistInitialize(&(saRoot->freeDevicesList)); 757285242Sachim for ( i = 0; i < (bit32) maxNumIODevices; i ++ ) 758285242Sachim { 759285242Sachim /* get the pointer to the device descriptor */ 760285242Sachim pDeviceDesc = (agsaDeviceDesc_t *) AGSAMEM_ELEMENT_READ(&(saRoot->deviceLinkMem), i); 761285242Sachim /* Initialize device descriptor */ 762285242Sachim saLlinkInitialize(&(pDeviceDesc->linkNode)); 763285242Sachim 764285242Sachim pDeviceDesc->initiatorDevHandle.osData = agNULL; 765285242Sachim pDeviceDesc->initiatorDevHandle.sdkData = agNULL; 766285242Sachim pDeviceDesc->targetDevHandle.osData = agNULL; 767285242Sachim pDeviceDesc->targetDevHandle.sdkData = agNULL; 768285242Sachim pDeviceDesc->deviceType = SAS_SATA_UNKNOWN_DEVICE; 769285242Sachim pDeviceDesc->pPort = agNULL; 770285242Sachim pDeviceDesc->DeviceMapIndex = 0; 771285242Sachim 772285242Sachim saLlistInitialize(&(pDeviceDesc->pendingIORequests)); 773285242Sachim 774285242Sachim /* Add the device descriptor to the free IO device link list */ 775285242Sachim saLlistAdd(&(saRoot->freeDevicesList), &(pDeviceDesc->linkNode)); 776285242Sachim } 777285242Sachim 778285242Sachim /* Setup IO Request link */ 779285242Sachim /* Save the information of allocated IO Request Link memory */ 780285242Sachim saRoot->IORequestMem = memoryAllocated->agMemory[IOREQLINK_MEM_INDEX]; 781285242Sachim si_memset(saRoot->IORequestMem.virtPtr, 0, saRoot->IORequestMem.totalLength); 782285242Sachim 783285242Sachim SA_DBG2(("saInitialize: [%d] saRoot->IORequestMem VirtPtr=%p PhysicalLo=%x Count=%x Total=%x type %x\n", 784285242Sachim IOREQLINK_MEM_INDEX, 785285242Sachim saRoot->IORequestMem.virtPtr, 786285242Sachim saRoot->IORequestMem.phyAddrLower, 787285242Sachim saRoot->IORequestMem.numElements, 788285242Sachim saRoot->IORequestMem.totalLength, 789285242Sachim saRoot->IORequestMem.type)); 790285242Sachim 791285242Sachim /* Setup free IO Request link list */ 792285242Sachim saLlistIOInitialize(&(saRoot->freeIORequests)); 793285242Sachim saLlistIOInitialize(&(saRoot->freeReservedRequests)); 794285242Sachim for ( i = 0; i < swConfig->maxActiveIOs; i ++ ) 795285242Sachim { 796285242Sachim /* get the pointer to the request descriptor */ 797285242Sachim pRequestDesc = (agsaIORequestDesc_t *) AGSAMEM_ELEMENT_READ(&(saRoot->IORequestMem), i); 798285242Sachim /* Initialize request descriptor */ 799285242Sachim saLlinkInitialize(&(pRequestDesc->linkNode)); 800285242Sachim 801285242Sachim pRequestDesc->valid = agFALSE; 802285242Sachim pRequestDesc->requestType = AGSA_REQ_TYPE_UNKNOWN; 803285242Sachim pRequestDesc->pIORequestContext = agNULL; 804285242Sachim pRequestDesc->HTag = i; 805285242Sachim pRequestDesc->pDevice = agNULL; 806285242Sachim pRequestDesc->pPort = agNULL; 807285242Sachim 808285242Sachim /* Add the request descriptor to the free Reserved Request link list */ 809285242Sachim /* SMP request must get service so reserve one request when first SMP completes */ 810285242Sachim if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT) 811285242Sachim { 812285242Sachim saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequestDesc->linkNode)); 813285242Sachim } 814285242Sachim else 815285242Sachim { 816285242Sachim /* Add the request descriptor to the free IO Request link list */ 817285242Sachim saLlistIOAdd(&(saRoot->freeIORequests), &(pRequestDesc->linkNode)); 818285242Sachim } 819285242Sachim 820285242Sachim } 821285242Sachim 822285242Sachim /* Setup timer link */ 823285242Sachim /* Save the information of allocated timer Link memory */ 824285242Sachim saRoot->timerLinkMem = memoryAllocated->agMemory[TIMERLINK_MEM_INDEX]; 825285242Sachim si_memset(saRoot->timerLinkMem.virtPtr, 0, saRoot->timerLinkMem.totalLength); 826285242Sachim SA_DBG2(("saInitialize: [%d] saRoot->timerLinkMem VirtPtr=%p PhysicalLo=%x Count=%x Total=%x type %x\n", 827285242Sachim TIMERLINK_MEM_INDEX, 828285242Sachim saRoot->timerLinkMem.virtPtr, 829285242Sachim saRoot->timerLinkMem.phyAddrLower, 830285242Sachim saRoot->timerLinkMem.numElements, 831285242Sachim saRoot->timerLinkMem.totalLength, 832285242Sachim saRoot->timerLinkMem.type )); 833285242Sachim 834285242Sachim /* Setup free timer link list */ 835285242Sachim saLlistInitialize(&(saRoot->freeTimers)); 836285242Sachim for ( i = 0; i < NUM_TIMERS; i ++ ) 837285242Sachim { 838285242Sachim /* get the pointer to the timer descriptor */ 839285242Sachim pTimerDesc = (agsaTimerDesc_t *) AGSAMEM_ELEMENT_READ(&(saRoot->timerLinkMem), i); 840285242Sachim /* Initialize timer descriptor */ 841285242Sachim saLlinkInitialize(&(pTimerDesc->linkNode)); 842285242Sachim 843285242Sachim pTimerDesc->valid = agFALSE; 844285242Sachim pTimerDesc->timeoutTick = 0; 845285242Sachim pTimerDesc->pfnTimeout = agNULL; 846285242Sachim pTimerDesc->Event = 0; 847285242Sachim pTimerDesc->pParm = agNULL; 848285242Sachim 849285242Sachim /* Add the timer descriptor to the free timer link list */ 850285242Sachim saLlistAdd(&(saRoot->freeTimers), &(pTimerDesc->linkNode)); 851285242Sachim } 852285242Sachim /* Setup valid timer link list */ 853285242Sachim saLlistInitialize(&(saRoot->validTimers)); 854285242Sachim 855285242Sachim /* Setup Phys */ 856285242Sachim /* Setup PhyCount */ 857285242Sachim saRoot->phyCount = (bit8) hwConfig->phyCount; 858285242Sachim /* Init Phy data structure */ 859285242Sachim for ( i = 0; i < saRoot->phyCount; i ++ ) 860285242Sachim { 861285242Sachim saRoot->phys[i].pPort = agNULL; 862285242Sachim saRoot->phys[i].phyId = (bit8) i; 863285242Sachim 864285242Sachim /* setup phy status is PHY_STOPPED */ 865285242Sachim PHY_STATUS_SET(&(saRoot->phys[i]), PHY_STOPPED); 866285242Sachim } 867285242Sachim 868285242Sachim /* Setup Ports */ 869285242Sachim /* Setup PortCount */ 870285242Sachim saRoot->portCount = saRoot->phyCount; 871285242Sachim /* Setup free port link list */ 872285242Sachim saLlistInitialize(&(saRoot->freePorts)); 873285242Sachim for ( i = 0; i < saRoot->portCount; i ++ ) 874285242Sachim { 875285242Sachim /* get the pointer to the port */ 876285242Sachim pPort = &(saRoot->ports[i]); 877285242Sachim /* Initialize port */ 878285242Sachim saLlinkInitialize(&(pPort->linkNode)); 879285242Sachim 880285242Sachim pPort->portContext.osData = agNULL; 881285242Sachim pPort->portContext.sdkData = pPort; 882285242Sachim pPort->portId = 0; 883285242Sachim pPort->portIdx = (bit8) i; 884285242Sachim pPort->status = PORT_NORMAL; 885285242Sachim 886285242Sachim for ( j = 0; j < saRoot->phyCount; j ++ ) 887285242Sachim { 888285242Sachim pPort->phyMap[j] = agFALSE; 889285242Sachim } 890285242Sachim 891285242Sachim saLlistInitialize(&(pPort->listSASATADevices)); 892285242Sachim 893285242Sachim /* Add the port to the free port link list */ 894285242Sachim saLlistAdd(&(saRoot->freePorts), &(pPort->linkNode)); 895285242Sachim } 896285242Sachim /* Setup valid port link list */ 897285242Sachim saLlistInitialize(&(saRoot->validPorts)); 898285242Sachim 899285242Sachim /* Init sysIntsActive - default is interrupt enable */ 900285242Sachim saRoot->sysIntsActive = agFALSE; 901285242Sachim 902285242Sachim /* setup timer tick granunarity */ 903285242Sachim saRoot->usecsPerTick = usecsPerTick; 904285242Sachim 905285242Sachim /* setup smallest timer increment for stall */ 906285242Sachim saRoot->minStallusecs = swConfig->stallUsec; 907285242Sachim 908285242Sachim SA_DBG1(("saInitialize: WAIT_INCREMENT %d\n" ,WAIT_INCREMENT )); 909285242Sachim if (0 == WAIT_INCREMENT) 910285242Sachim { 911285242Sachim saRoot->minStallusecs = WAIT_INCREMENT_DEFAULT; 912285242Sachim } 913285242Sachim 914285242Sachim /* initialize LL timer tick */ 915285242Sachim saRoot->timeTick = 0; 916285242Sachim 917285242Sachim /* initialize device (de)registration callback fns */ 918285242Sachim saRoot->DeviceRegistrationCB = agNULL; 919285242Sachim saRoot->DeviceDeregistrationCB = agNULL; 920285242Sachim 921285242Sachim /* Initialize the PortMap for port context */ 922285242Sachim for ( i = 0; i < saRoot->portCount; i ++ ) 923285242Sachim { 924285242Sachim pPortMap = &(saRoot->PortMap[i]); 925285242Sachim 926285242Sachim pPortMap->PortContext = agNULL; 927285242Sachim pPortMap->PortID = PORT_MARK_OFF; 928285242Sachim pPortMap->PortStatus = PORT_NORMAL; 929285242Sachim saRoot->autoDeregDeviceflag[i] = 0; 930285242Sachim } 931285242Sachim 932285242Sachim /* Initialize the DeviceMap for device handle */ 933285242Sachim for ( i = 0; i < MAX_IO_DEVICE_ENTRIES; i ++ ) 934285242Sachim { 935285242Sachim pDeviceMap = &(saRoot->DeviceMap[i]); 936285242Sachim 937285242Sachim pDeviceMap->DeviceHandle = agNULL; 938285242Sachim pDeviceMap->DeviceIdFromFW = i; 939285242Sachim } 940285242Sachim 941285242Sachim /* Initialize the IOMap for IOrequest */ 942285242Sachim for ( i = 0; i < MAX_ACTIVE_IO_REQUESTS; i ++ ) 943285242Sachim { 944285242Sachim pIOMap = &(saRoot->IOMap[i]); 945285242Sachim 946285242Sachim pIOMap->IORequest = agNULL; 947285242Sachim pIOMap->Tag = MARK_OFF; 948285242Sachim } 949285242Sachim 950285242Sachim /* setup mpi configuration */ 951285242Sachim if (!swConfig->param3) 952285242Sachim { 953285242Sachim /* default configuration */ 954285242Sachim siConfiguration(agRoot, &saRoot->mpiConfig, hwConfig, swConfig); 955285242Sachim } 956285242Sachim else 957285242Sachim { 958285242Sachim /* get from TD layer and save it */ 959285242Sachim agsaQueueConfig_t *dCFG = &saRoot->QueueConfig; 960285242Sachim agsaQueueConfig_t *sCFG = (agsaQueueConfig_t *)swConfig->param3; 961285242Sachim 962285242Sachim if (dCFG != sCFG) 963285242Sachim { 964285242Sachim *dCFG = *sCFG; 965285242Sachim 966285242Sachim if ((hwConfig->hwInterruptCoalescingTimer) || (hwConfig->hwInterruptCoalescingControl)) 967285242Sachim { 968285242Sachim for ( i = 0; i < sCFG->numOutboundQueues; i ++ ) 969285242Sachim { 970285242Sachim /* disable FW assisted coalescing */ 971285242Sachim sCFG->outboundQueues[i].interruptDelay = 0; 972285242Sachim sCFG->outboundQueues[i].interruptCount = 0; 973285242Sachim } 974285242Sachim 975285242Sachim if(smIS_SPC(agRoot)) 976285242Sachim { 977285242Sachim if (hwConfig->hwInterruptCoalescingTimer == 0) 978285242Sachim { 979285242Sachim hwConfig->hwInterruptCoalescingTimer = 1; 980285242Sachim SA_DBG1(("saInitialize:InterruptCoalescingTimer should not be zero. Force to 1\n")); 981285242Sachim } 982285242Sachim } 983285242Sachim } 984285242Sachim ret = siConfiguration(agRoot, &saRoot->mpiConfig, hwConfig, swConfig); 985285242Sachim if (AGSA_RC_FAILURE == ret) 986285242Sachim { 987285242Sachim SA_DBG1(("saInitialize failure queue number=%d\n", saRoot->QueueConfig.numInboundQueues)); 988285242Sachim agRoot->sdkData = agNULL; 989285242Sachim smTraceFuncExit(hpDBG_VERY_LOUD, 'r', "m1"); 990285242Sachim return ret; 991285242Sachim } 992285242Sachim } 993285242Sachim } 994285242Sachim 995285242Sachim 996285242Sachim saRoot->swConfig.param3 = &saRoot->QueueConfig; 997285242Sachim 998285242Sachim mpiMemoryAllocated.count = memoryAllocated->count - MPI_MEM_INDEX; 999285242Sachim for ( i = 0; i < mpiMemoryAllocated.count; i ++ ) 1000285242Sachim { 1001285242Sachim mpiMemoryAllocated.region[i].virtPtr = memoryAllocated->agMemory[MPI_IBQ_OBQ_INDEX + i].virtPtr; 1002285242Sachim mpiMemoryAllocated.region[i].appHandle = memoryAllocated->agMemory[MPI_IBQ_OBQ_INDEX + i].osHandle; 1003285242Sachim mpiMemoryAllocated.region[i].physAddrUpper = memoryAllocated->agMemory[MPI_IBQ_OBQ_INDEX + i].phyAddrUpper; 1004285242Sachim mpiMemoryAllocated.region[i].physAddrLower = memoryAllocated->agMemory[MPI_IBQ_OBQ_INDEX + i].phyAddrLower; 1005285242Sachim mpiMemoryAllocated.region[i].totalLength = memoryAllocated->agMemory[MPI_IBQ_OBQ_INDEX + i].totalLength; 1006285242Sachim mpiMemoryAllocated.region[i].numElements = memoryAllocated->agMemory[MPI_IBQ_OBQ_INDEX + i].numElements; 1007285242Sachim mpiMemoryAllocated.region[i].elementSize = memoryAllocated->agMemory[MPI_IBQ_OBQ_INDEX + i].singleElementLength; 1008285242Sachim mpiMemoryAllocated.region[i].alignment = memoryAllocated->agMemory[MPI_IBQ_OBQ_INDEX + i].alignment; 1009285242Sachim mpiMemoryAllocated.region[i].type = memoryAllocated->agMemory[MPI_IBQ_OBQ_INDEX + i].type; 1010285242Sachim SA_DBG2(("saInitialize: memoryAllocated->agMemory[%d] VirtPtr=%p PhysicalLo=%x Count=%x Total=%x type %x\n", 1011285242Sachim (MPI_IBQ_OBQ_INDEX + i), 1012285242Sachim memoryAllocated->agMemory[MPI_IBQ_OBQ_INDEX + i].virtPtr, 1013285242Sachim memoryAllocated->agMemory[MPI_IBQ_OBQ_INDEX + i].phyAddrLower, 1014285242Sachim memoryAllocated->agMemory[MPI_IBQ_OBQ_INDEX + i].numElements, 1015285242Sachim memoryAllocated->agMemory[MPI_IBQ_OBQ_INDEX + i].totalLength, 1016285242Sachim memoryAllocated->agMemory[MPI_IBQ_OBQ_INDEX + i].type)); 1017285242Sachim 1018285242Sachim /* set to zeros */ 1019285242Sachim SA_DBG1(("saInitialize: Zero memory region %d virt %p allocated %d\n", 1020285242Sachim i,mpiMemoryAllocated.region[i].virtPtr, mpiMemoryAllocated.region[i].totalLength)); 1021285242Sachim si_memset(mpiMemoryAllocated.region[i].virtPtr , 0,mpiMemoryAllocated.region[i].totalLength); 1022285242Sachim 1023285242Sachim } 1024285242Sachim 1025285242Sachim if ((!swConfig->max_MSI_InterruptVectors) && 1026285242Sachim (!swConfig->max_MSIX_InterruptVectors) && 1027285242Sachim (!swConfig->legacyInt_X)) 1028285242Sachim { 1029285242Sachim /* polling mode */ 1030285242Sachim SA_DBG1(("saInitialize: configured as polling mode\n")); 1031285242Sachim } 1032285242Sachim else 1033285242Sachim { 1034285242Sachim 1035285242Sachim SA_DBG1(("saInitialize: swConfig->max_MSI_InterruptVectors %d\n",swConfig->max_MSI_InterruptVectors)); 1036285242Sachim SA_DBG1(("saInitialize: swConfig->max_MSIX_InterruptVectors %d\n",swConfig->max_MSIX_InterruptVectors)); 1037285242Sachim 1038285242Sachim if ((swConfig->legacyInt_X > 1) || (swConfig->max_MSI_InterruptVectors > 32) || 1039285242Sachim (swConfig->max_MSIX_InterruptVectors > 64)) 1040285242Sachim { 1041285242Sachim /* error */ 1042285242Sachim agRoot->sdkData = agNULL; 1043285242Sachim SA_DBG1(("saInitialize:AGSA_RC_FAILURE InterruptVectors A\n")); 1044285242Sachim smTraceFuncExit(hpDBG_VERY_LOUD, 's', "m1"); 1045285242Sachim return AGSA_RC_FAILURE; 1046285242Sachim } 1047285242Sachim if ((swConfig->legacyInt_X) && (swConfig->max_MSI_InterruptVectors)) 1048285242Sachim { 1049285242Sachim /* error */ 1050285242Sachim agRoot->sdkData = agNULL; 1051285242Sachim SA_DBG1(("saInitialize:AGSA_RC_FAILURE InterruptVectors B\n")); 1052285242Sachim smTraceFuncExit(hpDBG_VERY_LOUD, 't', "m1"); 1053285242Sachim return AGSA_RC_FAILURE; 1054285242Sachim } 1055285242Sachim else if ((swConfig->legacyInt_X) && (swConfig->max_MSIX_InterruptVectors)) 1056285242Sachim { 1057285242Sachim /* error */ 1058285242Sachim agRoot->sdkData = agNULL; 1059285242Sachim SA_DBG1(("saInitialize:AGSA_RC_FAILURE InterruptVectors C\n")); 1060285242Sachim smTraceFuncExit(hpDBG_VERY_LOUD, 'u', "m1"); 1061285242Sachim return AGSA_RC_FAILURE; 1062285242Sachim } 1063285242Sachim else if ((swConfig->max_MSI_InterruptVectors) && (swConfig->max_MSIX_InterruptVectors)) 1064285242Sachim { 1065285242Sachim /* error */ 1066285242Sachim agRoot->sdkData = agNULL; 1067285242Sachim SA_DBG1(("saInitialize:AGSA_RC_FAILURE InterruptVectors D\n")); 1068285242Sachim smTraceFuncExit(hpDBG_VERY_LOUD, 'v', "m1"); 1069285242Sachim return AGSA_RC_FAILURE; 1070285242Sachim } 1071285242Sachim } 1072285242Sachim 1073285242Sachim /* This section sets common interrupt for Legacy(IRQ) and MSI and MSIX types */ 1074285242Sachim if(smIS_SPC(agRoot)) 1075285242Sachim { 1076285242Sachim SA_DBG1(("saInitialize: SPC interrupts\n" )); 1077285242Sachim 1078285242Sachim if (swConfig->legacyInt_X) 1079285242Sachim { 1080285242Sachim saRoot->OurInterrupt = siOurLegacyInterrupt; /* Called in ISR*/ 1081285242Sachim saRoot->DisableInterrupts = siDisableLegacyInterrupts; /* Called in ISR*/ 1082285242Sachim saRoot->ReEnableInterrupts = siReenableLegacyInterrupts;/* Called in Delayed Int handler*/ 1083285242Sachim } 1084285242Sachim else if (swConfig->max_MSIX_InterruptVectors) 1085285242Sachim { 1086285242Sachim saRoot->OurInterrupt = siOurMSIXInterrupt; 1087285242Sachim saRoot->DisableInterrupts = siDisableMSIXInterrupts; 1088285242Sachim saRoot->ReEnableInterrupts = siReenableMSIXInterrupts; 1089285242Sachim } 1090285242Sachim else if (swConfig->max_MSI_InterruptVectors) 1091285242Sachim { 1092285242Sachim saRoot->OurInterrupt = siOurMSIInterrupt; 1093285242Sachim saRoot->DisableInterrupts = siDisableMSIInterrupts; 1094285242Sachim saRoot->ReEnableInterrupts = siReenableMSIInterrupts; 1095285242Sachim } 1096285242Sachim else 1097285242Sachim { 1098285242Sachim /* polling mode */ 1099285242Sachim saRoot->OurInterrupt = siOurLegacyInterrupt; /* Called in ISR*/ 1100285242Sachim saRoot->DisableInterrupts = siDisableLegacyInterrupts; /* Called in ISR*/ 1101285242Sachim saRoot->ReEnableInterrupts = siReenableLegacyInterrupts;/* Called in Delayed Int handler*/ 1102285242Sachim } 1103285242Sachim } 1104285242Sachim else 1105285242Sachim { 1106285242Sachim SA_DBG1(("saInitialize: SPC V interrupts\n" )); 1107285242Sachim if (swConfig->legacyInt_X ) 1108285242Sachim { 1109285242Sachim SA_DBG1(("saInitialize: SPC V legacyInt_X\n" )); 1110285242Sachim saRoot->OurInterrupt = siOurLegacy_V_Interrupt; /* Called in ISR*/ 1111285242Sachim saRoot->DisableInterrupts = siDisableLegacy_V_Interrupts; /* Called in ISR*/ 1112285242Sachim saRoot->ReEnableInterrupts = siReenableLegacy_V_Interrupts;/* Called in Delayed Int handler*/ 1113285242Sachim } 1114285242Sachim else if (swConfig->max_MSIX_InterruptVectors) 1115285242Sachim { 1116285242Sachim SA_DBG1(("saInitialize: SPC V max_MSIX_InterruptVectors %X\n", swConfig->max_MSIX_InterruptVectors)); 1117285242Sachim saRoot->OurInterrupt = siOurMSIX_V_Interrupt; /* */ 1118285242Sachim saRoot->DisableInterrupts = siDisableMSIX_V_Interrupts; 1119285242Sachim saRoot->ReEnableInterrupts = siReenableMSIX_V_Interrupts; 1120285242Sachim } 1121285242Sachim else if (swConfig->max_MSI_InterruptVectors) 1122285242Sachim { 1123285242Sachim SA_DBG1(("saInitialize: SPC V max_MSI_InterruptVectors\n" )); 1124285242Sachim saRoot->OurInterrupt = siOurMSIX_V_Interrupt; /* */ 1125285242Sachim saRoot->DisableInterrupts = siDisableMSIX_V_Interrupts; 1126285242Sachim saRoot->ReEnableInterrupts = siReenableMSIX_V_Interrupts; 1127285242Sachim } 1128285242Sachim else 1129285242Sachim { 1130285242Sachim /* polling mode */ 1131285242Sachim SA_DBG1(("saInitialize: SPC V polling mode\n" )); 1132285242Sachim saRoot->OurInterrupt = siOurLegacy_V_Interrupt; /* Called in ISR*/ 1133285242Sachim saRoot->DisableInterrupts = siDisableLegacy_V_Interrupts; /* Called in ISR*/ 1134285242Sachim saRoot->ReEnableInterrupts = siReenableLegacy_V_Interrupts;/* Called in Delayed Int handler*/ 1135285242Sachim } 1136285242Sachim SA_DBG1(("saInitialize: SPC V\n" )); 1137285242Sachim } 1138285242Sachim 1139285242Sachim saRoot->Use64bit = (saRoot->QueueConfig.numOutboundQueues > 32 ) ? 1 : 0; 1140285242Sachim if( smIS64bInt(agRoot)) 1141285242Sachim { 1142285242Sachim SA_DBG1(("saInitialize: Use 64 bits for interrupts %d %d\n" ,saRoot->Use64bit, saRoot->QueueConfig.numOutboundQueues )); 1143285242Sachim } 1144285242Sachim else 1145285242Sachim { 1146285242Sachim SA_DBG1(("saInitialize: Use 32 bits for interrupts %d %d\n",saRoot->Use64bit , saRoot->QueueConfig.numOutboundQueues )); 1147285242Sachim } 1148285242Sachim 1149285242Sachim#ifdef SA_LL_IBQ_PROTECT 1150285242Sachim SA_DBG1(("saInitialize: Inbound locking defined since LL_IOREQ_IBQ0_LOCK %d\n",LL_IOREQ_IBQ0_LOCK)); 1151285242Sachim#endif /* SA_LL_IBQ_PROTECT */ 1152285242Sachim 1153285242Sachim /* Disable interrupt */ 1154285242Sachim saRoot->DisableInterrupts(agRoot, 0); 1155285242Sachim SA_DBG1(("saInitialize: DisableInterrupts sysIntsActive %X\n" ,saRoot->sysIntsActive)); 1156285242Sachim 1157285242Sachim#ifdef SA_FW_TEST_BUNCH_STARTS 1158285242Sachim saRoot->BunchStarts_Enable = FALSE; 1159285242Sachim saRoot->BunchStarts_Threshold = 5; 1160285242Sachim saRoot->BunchStarts_Pending = 0; 1161285242Sachim saRoot->BunchStarts_TimeoutTicks = 10; // N x 100 ms 1162285242Sachim#endif /* SA_FW_TEST_BUNCH_STARTS */ 1163285242Sachim 1164285242Sachim /* clear the interrupt vector bitmap */ 1165285242Sachim for ( i = 0; i < MAX_NUM_VECTOR; i ++ ) 1166285242Sachim { 1167285242Sachim saRoot->interruptVecIndexBitMap[i] = 0; 1168285242Sachim saRoot->interruptVecIndexBitMap1[i] = 0; 1169285242Sachim } 1170285242Sachim 1171285242Sachim#if defined(SALLSDK_DEBUG) 1172285242Sachim smTrace(hpDBG_VERY_LOUD,"2Y",0); 1173285242Sachim /* TP:2Y SCRATCH_PAD */ 1174285242Sachim 1175285242Sachim SA_DBG1(("saInitialize: SCRATCH_PAD0 value = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_0))); 1176285242Sachim SA_DBG1(("saInitialize: SCRATCH_PAD1 value = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_1))); 1177285242Sachim SA_DBG1(("saInitialize: SCRATCH_PAD2 value = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_2))); 1178285242Sachim SA_DBG1(("saInitialize: SCRATCH_PAD3 value = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_3))); 1179285242Sachim#endif /* SALLSDK_DEBUG */ 1180285242Sachim 1181285242Sachim if(smIS_SPCV(agRoot)) 1182285242Sachim { 1183285242Sachim bit32 ScratchPad1 =0; 1184285242Sachim bit32 ScratchPad3 =0; 1185285242Sachim 1186285242Sachim ScratchPad1 = ossaHwRegRead(agRoot,V_Scratchpad_1_Register); 1187285242Sachim ScratchPad3 = ossaHwRegRead(agRoot,V_Scratchpad_3_Register); 1188285242Sachim if((ScratchPad1 & SCRATCH_PAD1_V_RAAE_MASK) == SCRATCH_PAD1_V_RAAE_MASK) 1189285242Sachim { 1190285242Sachim if(((ScratchPad3 & SCRATCH_PAD3_V_ENC_MASK ) == SCRATCH_PAD3_V_ENC_DIS_ERR ) || 1191285242Sachim ((ScratchPad3 & SCRATCH_PAD3_V_ENC_MASK ) == SCRATCH_PAD3_V_ENC_ENA_ERR ) ) 1192285242Sachim { 1193285242Sachim SA_DBG1(("saInitialize:Warning Encryption Issue SCRATCH_PAD3 value = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_3))); 1194285242Sachim } 1195285242Sachim } 1196285242Sachim } 1197285242Sachim 1198285242Sachim if( smIS_SPC(agRoot)) 1199285242Sachim { 1200285242Sachim#ifdef SA_ENABLE_HDA_FUNCTIONS 1201285242Sachim TryWithHDA_ON: 1202285242Sachim Double_Reset_HDA = TRUE; 1203285242Sachim 1204285242Sachim if (swConfig->hostDirectAccessSupport) 1205285242Sachim { 1206285242Sachim if (AGSA_RC_FAILURE == siHDAMode(agRoot, swConfig->hostDirectAccessMode, (agsaFwImg_t *)swConfig->param4)) 1207285242Sachim { 1208285242Sachim SA_DBG1(("saInitialize:AGSA_RC_FAILURE siHDAMode\n")); 1209285242Sachim agRoot->sdkData = agNULL; 1210285242Sachim smTraceFuncExit(hpDBG_VERY_LOUD, 'w', "m1"); 1211285242Sachim return AGSA_RC_FAILURE; 1212285242Sachim } 1213285242Sachim else 1214285242Sachim { 1215285242Sachim SA_DBG1(("saInitialize:1 Going to HDA mode HDA 0x%X \n",ossaHwRegReadExt(agRoot, PCIBAR3, HDA_RSP_OFFSET1MB+HDA_CMD_CODE_OFFSET))); 1216285242Sachim if(Double_Reset_HDA == agFALSE) 1217285242Sachim { 1218285242Sachim siSpcSoftReset(agRoot, SPC_HDASOFT_RESET_SIGNATURE); 1219285242Sachim SA_DBG1(("saInitialize: Double_Reset_HDA HDA 0x%X \n",ossaHwRegReadExt(agRoot, PCIBAR3, HDA_RSP_OFFSET1MB+HDA_CMD_CODE_OFFSET))); 1220285242Sachim Double_Reset_HDA = TRUE; 1221285242Sachim goto TryWithHDA_ON; 1222285242Sachim } 1223285242Sachim } 1224285242Sachim } 1225285242Sachim else 1226285242Sachim { 1227285242Sachim /* check FW is running */ 1228285242Sachim if (BOOTTLOADERHDA_IDLE == (ossaHwRegReadExt(agRoot, PCIBAR3, HDA_RSP_OFFSET1MB+HDA_CMD_CODE_OFFSET) & HDA_STATUS_BITS)) 1229285242Sachim { 1230285242Sachim /* HDA mode */ 1231285242Sachim SA_DBG1(("saInitialize: No HDA mode enable and FW is not running.\n")); 1232285242Sachim if(Tried_NO_HDA != agTRUE ) 1233285242Sachim { 1234285242Sachim 1235285242Sachim Tried_NO_HDA = TRUE; 1236285242Sachim swConfig->hostDirectAccessSupport = 1; 1237285242Sachim swConfig->hostDirectAccessMode = 1; 1238285242Sachim siSpcSoftReset(agRoot, SPC_HDASOFT_RESET_SIGNATURE); 1239285242Sachim SA_DBG1(("saInitialize: 2 Going to HDA mode HDA %X \n",ossaHwRegReadExt(agRoot, PCIBAR3, HDA_RSP_OFFSET1MB+HDA_CMD_CODE_OFFSET))); 1240285242Sachim goto TryWithHDA_ON; 1241285242Sachim } 1242285242Sachim else 1243285242Sachim { 1244285242Sachim SA_DBG1(("saInitialize: could not start HDA mode HDA %X \n",ossaHwRegReadExt(agRoot, PCIBAR3, HDA_RSP_OFFSET1MB+HDA_CMD_CODE_OFFSET))); 1245285242Sachim smTraceFuncExit(hpDBG_VERY_LOUD, 'x', "m1"); 1246285242Sachim 1247285242Sachim return AGSA_RC_FAILURE; 1248285242Sachim } 1249285242Sachim smTraceFuncExit(hpDBG_VERY_LOUD, 'y', "m1"); 1250285242Sachim return AGSA_RC_FAILURE; 1251285242Sachim } 1252285242Sachim } 1253285242Sachim#else /* SA_ENABLE_HDA_FUNCTIONS */ 1254285242Sachim /* check FW is running */ 1255285242Sachim if (BOOTTLOADERHDA_IDLE == (ossaHwRegReadExt(agRoot, PCIBAR3, HDA_RSP_OFFSET1MB+HDA_CMD_CODE_OFFSET) & HDA_STATUS_BITS) ) 1256285242Sachim { 1257285242Sachim /* HDA mode */ 1258285242Sachim SA_DBG1(("saInitialize: No HDA mode enable and FW is not running.\n")); 1259285242Sachim smTraceFuncExit(hpDBG_VERY_LOUD, 'z', "m1"); 1260285242Sachim return AGSA_RC_FAILURE; 1261285242Sachim } 1262285242Sachim#endif /* SA_ENABLE_HDA_FUNCTIONS */ 1263285242Sachim } 1264285242Sachim else 1265285242Sachim { 1266285242Sachim SA_DBG1(("saInitialize: SPCv swConfig->hostDirectAccessMode %d swConfig->hostDirectAccessSupport %d\n",swConfig->hostDirectAccessMode,swConfig->hostDirectAccessSupport)); 1267285242Sachim if (swConfig->hostDirectAccessSupport) 1268285242Sachim { 1269285242Sachim bit32 hda_status; 1270285242Sachim bit32 soft_reset_status = AGSA_RC_SUCCESS; 1271285242Sachim 1272285242Sachim SA_DBG1(("saInitialize: SPCv load HDA\n")); 1273285242Sachim 1274285242Sachim hda_status = (ossaHwRegReadExt(agRoot, PCIBAR0, SPC_V_HDA_RESPONSE_OFFSET+28)); 1275285242Sachim 1276285242Sachim SA_DBG1(("saInitialize: hda_status 0x%x\n",hda_status)); 1277285242Sachim 1278285242Sachim siScratchDump(agRoot); 1279285242Sachim 1280285242Sachim if( swConfig->hostDirectAccessMode == 0) 1281285242Sachim { 1282285242Sachim soft_reset_status = siSoftReset(agRoot, SPC_HDASOFT_RESET_SIGNATURE); 1283285242Sachim if(soft_reset_status != AGSA_RC_SUCCESS) 1284285242Sachim { 1285285242Sachim agRoot->sdkData = agNULL; 1286285242Sachim SA_DBG1(("saInitialize:AGSA_RC_FAILURE soft_reset_status\n")); 1287285242Sachim 1288285242Sachim smTraceFuncExit(hpDBG_VERY_LOUD, 'A', "m1"); 1289285242Sachim return AGSA_RC_FAILURE; 1290285242Sachim } 1291285242Sachim } 1292285242Sachim 1293285242Sachim if((hda_status & SPC_V_HDAR_RSPCODE_MASK) != SPC_V_HDAR_IDLE) 1294285242Sachim { 1295285242Sachim SA_DBG1(("saInitialize: hda_status not SPC_V_HDAR_IDLE 0x%08x\n", hda_status)); 1296285242Sachim soft_reset_status = siSoftReset(agRoot, SPC_HDASOFT_RESET_SIGNATURE); 1297285242Sachim hda_status = (ossaHwRegReadExt(agRoot, PCIBAR0, SPC_V_HDA_RESPONSE_OFFSET+28)); 1298285242Sachim if((hda_status & SPC_V_HDAR_RSPCODE_MASK) != SPC_V_HDAR_IDLE) 1299285242Sachim { 1300285242Sachim SA_DBG1(("saInitialize: 2 reset hda_status not SPC_V_HDAR_IDLE 0x%08x\n", hda_status)); 1301285242Sachim } 1302285242Sachim } 1303285242Sachim if(soft_reset_status != AGSA_RC_SUCCESS) 1304285242Sachim { 1305285242Sachim agRoot->sdkData = agNULL; 1306285242Sachim SA_DBG1(("saInitialize:AGSA_RC_FAILURE soft_reset_status A\n")); 1307285242Sachim smTraceFuncExit(hpDBG_VERY_LOUD, 'B', "m1"); 1308285242Sachim return AGSA_RC_FAILURE; 1309285242Sachim } 1310285242Sachim 1311285242Sachim#ifdef SA_ENABLE_HDA_FUNCTIONS 1312285242Sachim if (AGSA_RC_FAILURE == siHDAMode_V(agRoot, swConfig->hostDirectAccessMode, (agsaFwImg_t *)swConfig->param4)) 1313285242Sachim { 1314285242Sachim SA_DBG1(("saInitialize:AGSA_RC_FAILURE siHDAMode_V\n")); 1315285242Sachim 1316285242Sachim siChipResetV(agRoot, SPC_HDASOFT_RESET_SIGNATURE); 1317285242Sachim agRoot->sdkData = agNULL; 1318285242Sachim smTraceFuncExit(hpDBG_VERY_LOUD, 'C', "m1"); 1319285242Sachim return AGSA_RC_FAILURE; 1320285242Sachim } 1321285242Sachim#endif /* SA_ENABLE_HDA_FUNCTIONS */ 1322285242Sachim 1323285242Sachim } 1324285242Sachim else 1325285242Sachim { 1326285242Sachim SA_DBG1(("saInitialize: SPCv normal\n")); 1327285242Sachim } 1328285242Sachim 1329285242Sachim } 1330285242Sachim 1331285242Sachim /* copy the table to the LL layer */ 1332285242Sachim si_memcpy(&saRoot->mpiConfig.phyAnalogConfig, &hwConfig->phyAnalogConfig, sizeof(agsaPhyAnalogSetupTable_t)); 1333285242Sachim 1334285242Sachim#ifdef SALL_API_TEST 1335285242Sachim /* Initialize the LL IO counter */ 1336285242Sachim si_memset(&saRoot->LLCounters, 0, sizeof(agsaIOCountInfo_t)); 1337285242Sachim#endif 1338285242Sachim 1339285242Sachim si_memset(&saRoot->IoErrorCount, 0, sizeof(agsaIOErrorEventStats_t)); 1340285242Sachim si_memset(&saRoot->IoEventCount, 0, sizeof(agsaIOErrorEventStats_t)); 1341285242Sachim if(smIS_SPC(agRoot)) 1342285242Sachim { 1343285242Sachim if( smIS_spc8081(agRoot)) 1344285242Sachim { 1345285242Sachim if (AGSA_RC_FAILURE == siBar4Shift(agRoot, MBIC_GSM_SM_BASE)) 1346285242Sachim { 1347285242Sachim SA_DBG1(("saInitialize: siBar4Shift FAILED ******************************************\n")); 1348285242Sachim } 1349285242Sachim } 1350285242Sachim siSpcSoftReset(agRoot, SPC_SOFT_RESET_SIGNATURE); 1351285242Sachim } 1352285242Sachim if(smIS_SPCV(agRoot)) 1353285242Sachim { 1354285242Sachim SA_DBG1(("saInitialize: saRoot->ChipId == VEN_DEV_SPCV\n")); 1355285242Sachim siChipResetV(agRoot, SPC_SOFT_RESET_SIGNATURE); 1356285242Sachim } 1357285242Sachim 1358285242Sachim /* MPI Initialization */ 1359285242Sachim ret = mpiInitialize(agRoot, &mpiMemoryAllocated, &saRoot->mpiConfig); 1360285242Sachim SA_DBG1(("saInitialize: MaxOutstandingIO 0x%x swConfig->maxActiveIOs 0x%x\n", saRoot->ControllerInfo.maxPendingIO,saRoot->swConfig.maxActiveIOs )); 1361285242Sachim 1362285242Sachim#ifdef SA_ENABLE_HDA_FUNCTIONS 1363285242Sachim if( ret == AGSA_RC_FAILURE && Tried_NO_HDA == agFALSE && smIS_SPC(agRoot)) 1364285242Sachim { /* FW not flashed */ 1365285242Sachim Tried_NO_HDA=agTRUE; 1366285242Sachim swConfig->hostDirectAccessSupport = 1; 1367285242Sachim swConfig->hostDirectAccessMode = 1; 1368285242Sachim siSoftReset(agRoot, SPC_SOFT_RESET_SIGNATURE); 1369285242Sachim SA_DBG1(("saInitialize: 3 Going to HDA mode HDA %X \n",ossaHwRegReadExt(agRoot, PCIBAR3, HDA_RSP_OFFSET1MB+HDA_CMD_CODE_OFFSET))); 1370285242Sachim goto TryWithHDA_ON; 1371285242Sachim } 1372285242Sachim 1373285242Sachim#endif /* SA_ENABLE_HDA_FUNCTIONS */ 1374285242Sachim 1375285242Sachim if( ret == AGSA_RC_FAILURE) 1376285242Sachim { 1377285242Sachim SA_DBG1(("saInitialize: AGSA_RC_FAILURE mpiInitialize\n")); 1378285242Sachim SA_DBG1(("saInitialize: SCRATCH_PAD0 value = 0x%x\n", ossaHwRegRead(agRoot, V_Scratchpad_0_Register))); 1379285242Sachim SA_DBG1(("saInitialize: SCRATCH_PAD1 value = 0x%x\n", ossaHwRegRead(agRoot, V_Scratchpad_1_Register))); 1380285242Sachim SA_DBG1(("saInitialize: SCRATCH_PAD2 value = 0x%x\n", ossaHwRegRead(agRoot, V_Scratchpad_2_Register))); 1381285242Sachim SA_DBG1(("saInitialize: SCRATCH_PAD3 value = 0x%x\n", ossaHwRegRead(agRoot, V_Scratchpad_3_Register))); 1382285242Sachim 1383285242Sachim if(saRoot->swConfig.fatalErrorInterruptEnable) 1384285242Sachim { 1385285242Sachim ossaDisableInterrupts(agRoot,saRoot->swConfig.fatalErrorInterruptVector ); 1386285242Sachim } 1387285242Sachim 1388285242Sachim agRoot->sdkData = agNULL; 1389285242Sachim smTraceFuncExit(hpDBG_VERY_LOUD, 'D', "m1"); 1390285242Sachim return ret; 1391285242Sachim } 1392285242Sachim 1393285242Sachim /* setup hardware interrupt coalescing control and timer registers */ 1394285242Sachim if(smIS_SPCV(agRoot)) 1395285242Sachim { 1396285242Sachim SA_DBG1(("saInitialize: SPC_V Not set hwInterruptCoalescingTimer\n" )); 1397285242Sachim SA_DBG1(("saInitialize: SPC_V Not set hwInterruptCoalescingControl\n" )); 1398285242Sachim } 1399285242Sachim else 1400285242Sachim { 1401285242Sachim ossaHwRegWriteExt(agRoot, PCIBAR1, SPC_ICTIMER,hwConfig->hwInterruptCoalescingTimer ); 1402285242Sachim ossaHwRegWriteExt(agRoot, PCIBAR1, SPC_ICCONTROL, hwConfig->hwInterruptCoalescingControl); 1403285242Sachim } 1404285242Sachim 1405285242Sachim 1406285242Sachim SA_DBG1(("saInitialize: swConfig->fatalErrorInterruptEnable %X\n",swConfig->fatalErrorInterruptEnable)); 1407285242Sachim 1408285242Sachim SA_DBG1(("saInitialize: saRoot->swConfig.fatalErrorInterruptVector %X\n",saRoot->swConfig.fatalErrorInterruptVector)); 1409285242Sachim SA_DBG1(("saInitialize: swConfig->max_MSI_InterruptVectors %X\n",swConfig->max_MSI_InterruptVectors)); 1410285242Sachim SA_DBG1(("saInitialize: swConfig->max_MSIX_InterruptVectors %X\n",swConfig->max_MSIX_InterruptVectors)); 1411285242Sachim SA_DBG1(("saInitialize: swConfig->legacyInt_X %X\n",swConfig->legacyInt_X)); 1412285242Sachim SA_DBG1(("saInitialize: swConfig->hostDirectAccessSupport %X\n",swConfig->hostDirectAccessSupport)); 1413285242Sachim SA_DBG1(("saInitialize: swConfig->hostDirectAccessMode %X\n",swConfig->hostDirectAccessMode)); 1414285242Sachim 1415285242Sachim#ifdef SA_CONFIG_MDFD_REGISTRY 1416285242Sachim SA_DBG1(("saInitialize: swConfig->disableMDF %X\n",swConfig->disableMDF)); 1417285242Sachim#endif /*SA_CONFIG_MDFD_REGISTRY*/ 1418285242Sachim /*SA_DBG1(("saInitialize: swConfig->enableDIF %X\n",swConfig->enableDIF));*/ 1419285242Sachim /*SA_DBG1(("saInitialize: swConfig->enableEncryption %X\n",swConfig->enableEncryption));*/ 1420285242Sachim 1421285242Sachim 1422285242Sachim /* log message if failure */ 1423285242Sachim if (AGSA_RC_FAILURE == ret) 1424285242Sachim { 1425285242Sachim SA_DBG1(("saInitialize:AGSA_RC_FAILURE mpiInitialize\n")); 1426285242Sachim /* Assign chip status */ 1427285242Sachim saRoot->chipStatus = CHIP_FATAL_ERROR; 1428285242Sachim } 1429285242Sachim else 1430285242Sachim { 1431285242Sachim /* Assign chip status */ 1432285242Sachim saRoot->chipStatus = CHIP_NORMAL; 1433285242Sachim#ifdef SA_FW_TIMER_READS_STATUS 1434285242Sachim siTimerAdd(agRoot,SA_FW_TIMER_READS_STATUS_INTERVAL, siReadControllerStatus,0,agNULL ); 1435285242Sachim#endif /* SA_FW_TIMER_READS_STATUS */ 1436285242Sachim } 1437285242Sachim 1438285242Sachim 1439285242Sachim if( ret == AGSA_RC_SUCCESS || ret == AGSA_RC_VERSION_UNTESTED) 1440285242Sachim { 1441285242Sachim if(gPollForMissingInt) 1442285242Sachim { 1443285242Sachim mpiOCQueue_t *circularQ; 1444285242Sachim SA_DBG1(("saInitialize: saRoot->sysIntsActive %X\n",saRoot->sysIntsActive)); 1445285242Sachim 1446285242Sachim circularQ = &saRoot->outboundQueue[0]; 1447285242Sachim OSSA_READ_LE_32(circularQ->agRoot, &circularQ->producerIdx, circularQ->piPointer, 0); 1448285242Sachim SA_DBG1(("saInitialize: PI 0x%03x CI 0x%03x\n",circularQ->producerIdx, circularQ->consumerIdx)); 1449285242Sachim } 1450285242Sachim } 1451285242Sachim 1452285242Sachim /* If fatal error interrupt enable we need checking it during the interrupt */ 1453285242Sachim SA_DBG1(("saInitialize: swConfig.fatalErrorInterruptEnable %d\n",saRoot->swConfig.fatalErrorInterruptEnable)); 1454285242Sachim SA_DBG1(("saInitialize: swConfig.fatalErrorInterruptVector %d\n",saRoot->swConfig.fatalErrorInterruptVector)); 1455285242Sachim SA_DBG1(("saInitialize: swConfig->max_MSIX_InterruptVectors %X\n",swConfig->max_MSIX_InterruptVectors)); 1456285242Sachim 1457285242Sachim if(saRoot->swConfig.fatalErrorInterruptEnable) 1458285242Sachim { 1459285242Sachim 1460285242Sachim SA_DBG1(("saInitialize: Doorbell_Set %08X U %08X\n", 1461285242Sachim ossaHwRegReadExt(agRoot, PCIBAR0, V_Outbound_Doorbell_Set_Register), 1462285242Sachim ossaHwRegReadExt(agRoot, PCIBAR0, V_Outbound_Doorbell_Set_RegisterU))); 1463285242Sachim SA_DBG1(("saInitialize: Doorbell_Mask %08X U %08X\n", 1464285242Sachim ossaHwRegReadExt(agRoot, PCIBAR0, V_Outbound_Doorbell_Mask_Set_Register ), 1465285242Sachim ossaHwRegReadExt(agRoot, PCIBAR0, V_Outbound_Doorbell_Mask_Set_RegisterU ))); 1466285242Sachim 1467285242Sachim ossaReenableInterrupts(agRoot,saRoot->swConfig.fatalErrorInterruptVector ); 1468285242Sachim 1469285242Sachim SA_DBG1(("saInitialize: Doorbell_Set %08X U %08X\n", 1470285242Sachim ossaHwRegReadExt(agRoot, PCIBAR0, V_Outbound_Doorbell_Set_Register), 1471285242Sachim ossaHwRegReadExt(agRoot, PCIBAR0, V_Outbound_Doorbell_Set_RegisterU))); 1472285242Sachim SA_DBG1(("saInitialize: Doorbell_Mask %08X U %08X\n", 1473285242Sachim ossaHwRegReadExt(agRoot, PCIBAR0, V_Outbound_Doorbell_Mask_Set_Register ), 1474285242Sachim ossaHwRegReadExt(agRoot, PCIBAR0, V_Outbound_Doorbell_Mask_Set_RegisterU ))); 1475285242Sachim } 1476285242Sachim 1477285242Sachim 1478285242Sachim SA_DBG1(("saInitialize: siDumpActiveIORequests\n")); 1479285242Sachim siDumpActiveIORequests(agRoot, saRoot->swConfig.maxActiveIOs); 1480285242Sachim 1481285242Sachim smTraceFuncExit(hpDBG_VERY_LOUD, 'E', "m1"); 1482285242Sachim /* return */ 1483285242Sachim return ret; 1484285242Sachim} 1485285242Sachim 1486285242Sachim 1487285242Sachim 1488285242Sachim#ifdef SA_FW_TIMER_READS_STATUS 1489285242Sachim 1490285242Sachimbit32 siReadControllerStatus( 1491285242Sachim agsaRoot_t *agRoot, 1492285242Sachim bit32 Event, 1493285242Sachim void * pParm 1494285242Sachim ) 1495285242Sachim{ 1496285242Sachim bit32 to_ret =0; 1497285242Sachim agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData); 1498285242Sachim mpiReadGSTable(agRoot, &saRoot->mpiGSTable); 1499285242Sachim 1500285242Sachim if(smIS_SPCV_2_IOP(agRoot)) 1501285242Sachim { 1502285242Sachim if(saRoot->Iop1Tcnt_last == saRoot->mpiGSTable.Iop1Tcnt ) 1503285242Sachim SA_DBG2(("siReadControllerStatus: Iop1 %d STUCK\n", saRoot->mpiGSTable.Iop1Tcnt)); 1504285242Sachim } 1505285242Sachim 1506285242Sachim if( saRoot->MsguTcnt_last == saRoot->mpiGSTable.MsguTcnt || saRoot->IopTcnt_last == saRoot->mpiGSTable.IopTcnt ) 1507285242Sachim { 1508285242Sachim SA_DBG1(("siReadControllerStatus: Msgu %d Iop %d\n",saRoot->mpiGSTable.MsguTcnt, saRoot->mpiGSTable.IopTcnt)); 1509285242Sachim saFatalInterruptHandler(agRoot, saRoot->swConfig.fatalErrorInterruptVector ); 1510285242Sachim } 1511285242Sachim SA_DBG2(("siReadControllerStatus: Msgu %d Iop %d\n",saRoot->mpiGSTable.MsguTcnt, saRoot->mpiGSTable.IopTcnt)); 1512285242Sachim 1513285242Sachim saRoot->MsguTcnt_last = saRoot->mpiGSTable.MsguTcnt; 1514285242Sachim saRoot->IopTcnt_last = saRoot->mpiGSTable.IopTcnt; 1515285242Sachim saRoot->Iop1Tcnt_last = saRoot->mpiGSTable.Iop1Tcnt; 1516285242Sachim 1517285242Sachim 1518285242Sachim if(gPollForMissingInt) 1519285242Sachim { 1520285242Sachim mpiOCQueue_t *circularQ; 1521285242Sachim SA_DBG4(("siReadControllerStatus: saRoot->sysIntsActive %X\n",saRoot->sysIntsActive)); 1522285242Sachim 1523285242Sachim circularQ = &saRoot->outboundQueue[0]; 1524285242Sachim OSSA_READ_LE_32(circularQ->agRoot, &circularQ->producerIdx, circularQ->piPointer, 0); 1525285242Sachim if(circularQ->producerIdx != circularQ->consumerIdx) 1526285242Sachim { 1527285242Sachim SA_DBG1(("siReadControllerStatus: saRoot->sysIntsActive %X\n",saRoot->sysIntsActive)); 1528285242Sachim SA_DBG1(("siReadControllerStatus: PI 0x%03x CI 0x%03x\n",circularQ->producerIdx, circularQ->consumerIdx)); 1529285242Sachim 1530285242Sachim SA_DBG1(("siReadControllerStatus:IN MSGU_READ_ODMR %08X\n",siHalRegReadExt(agRoot, GEN_MSGU_ODMR, V_Outbound_Doorbell_Mask_Set_Register ))); 1531285242Sachim SA_DBG1(("siReadControllerStatus:MSGU_READ_ODR %08X\n",siHalRegReadExt(agRoot, GEN_MSGU_ODR, V_Outbound_Doorbell_Set_Register))); 1532285242Sachim ossaHwRegWriteExt(agRoot, PCIBAR0,V_Outbound_Doorbell_Clear_Register, 0xFFFFFFFF ); 1533285242Sachim 1534285242Sachim } 1535285242Sachim } 1536285242Sachim 1537285242Sachim siTimerAdd(agRoot,SA_FW_TIMER_READS_STATUS_INTERVAL, siReadControllerStatus,Event,pParm ); 1538285242Sachim 1539285242Sachim return(to_ret); 1540285242Sachim} 1541285242Sachim 1542285242Sachim#endif /* SA_FW_TIMER_READS_STATUS */ 1543285242Sachim 1544285242Sachim/******************************************************************************/ 1545285242Sachim/*! \brief Routine to do SPC configuration with default or specified values 1546285242Sachim * 1547285242Sachim * Set up configuration table in LL Layer 1548285242Sachim * 1549285242Sachim * \param agRoot handles for this instance of SAS/SATA hardware 1550285242Sachim * \param mpiConfig MPI Configuration 1551285242Sachim * \param swConfig Pointer to the software configuration 1552285242Sachim * 1553285242Sachim * \return -void- 1554285242Sachim */ 1555285242Sachim/*******************************************************************************/ 1556285242SachimGLOBAL bit32 siConfiguration( 1557285242Sachim agsaRoot_t *agRoot, 1558285242Sachim mpiConfig_t *mpiConfig, 1559285242Sachim agsaHwConfig_t *hwConfig, 1560285242Sachim agsaSwConfig_t *swConfig 1561285242Sachim ) 1562285242Sachim{ 1563285242Sachim agsaQueueConfig_t *queueConfig; 1564285242Sachim bit32 intOption, enable64 = 0; 1565285242Sachim bit8 i; 1566285242Sachim 1567285242Sachim 1568285242Sachim /* sanity check */ 1569285242Sachim SA_ASSERT( (agNULL != agRoot), ""); 1570285242Sachim 1571285242Sachim smTraceFuncEnter(hpDBG_VERY_LOUD,"m2"); 1572285242Sachim 1573285242Sachim si_memset(mpiConfig, 0, sizeof(mpiConfig_t)); 1574285242Sachim SA_DBG1(("siConfiguration: si_memset mpiConfig\n")); 1575285242Sachim 1576285242Sachim#if defined(SALLSDK_DEBUG) 1577285242Sachim sidump_swConfig(swConfig); 1578285242Sachim#endif 1579285242Sachim mpiConfig->mainConfig.custset = swConfig->FWConfig; 1580285242Sachim 1581285242Sachim SA_DBG1(("siConfiguration:custset %8X %8X\n",mpiConfig->mainConfig.custset,swConfig->FWConfig)); 1582285242Sachim 1583285242Sachim if (swConfig->param3 == agNULL) 1584285242Sachim { 1585285242Sachim SA_DBG1(("siConfiguration: swConfig->param3 == agNULL\n")); 1586285242Sachim /* initialize the mpiConfig */ 1587285242Sachim /* We configure the Host main part of configuration table */ 1588285242Sachim mpiConfig->mainConfig.iQNPPD_HPPD_GEvent = 0; 1589285242Sachim mpiConfig->mainConfig.outboundHWEventPID0_3 = 0; 1590285242Sachim mpiConfig->mainConfig.outboundHWEventPID4_7 = 0; 1591285242Sachim mpiConfig->mainConfig.outboundNCQEventPID0_3 = 0; 1592285242Sachim mpiConfig->mainConfig.outboundNCQEventPID4_7 = 0; 1593285242Sachim mpiConfig->mainConfig.outboundTargetITNexusEventPID0_3 = 0; 1594285242Sachim mpiConfig->mainConfig.outboundTargetITNexusEventPID4_7 = 0; 1595285242Sachim mpiConfig->mainConfig.outboundTargetSSPEventPID0_3 = 0; 1596285242Sachim mpiConfig->mainConfig.outboundTargetSSPEventPID4_7 = 0; 1597285242Sachim 1598285242Sachim mpiConfig->mainConfig.ioAbortDelay = 0; 1599285242Sachim 1600285242Sachim mpiConfig->mainConfig.upperEventLogAddress = 0; 1601285242Sachim mpiConfig->mainConfig.lowerEventLogAddress = 0; 1602285242Sachim mpiConfig->mainConfig.eventLogSize = MPI_LOGSIZE; 1603285242Sachim mpiConfig->mainConfig.eventLogOption = 0; 1604285242Sachim mpiConfig->mainConfig.upperIOPeventLogAddress = 0; 1605285242Sachim mpiConfig->mainConfig.lowerIOPeventLogAddress = 0; 1606285242Sachim mpiConfig->mainConfig.IOPeventLogSize = MPI_LOGSIZE; 1607285242Sachim mpiConfig->mainConfig.IOPeventLogOption = 0; 1608285242Sachim mpiConfig->mainConfig.FatalErrorInterrupt = 0; 1609285242Sachim 1610285242Sachim /* save the default value */ 1611285242Sachim mpiConfig->numInboundQueues = AGSA_MAX_INBOUND_Q; 1612285242Sachim mpiConfig->numOutboundQueues = AGSA_MAX_OUTBOUND_Q; 1613285242Sachim mpiConfig->maxNumInboundQueues = AGSA_MAX_INBOUND_Q; 1614285242Sachim mpiConfig->maxNumOutboundQueues = AGSA_MAX_OUTBOUND_Q; 1615285242Sachim 1616285242Sachim /* configure inbound queues */ 1617285242Sachim for ( i = 0; i < AGSA_MAX_INBOUND_Q; i ++ ) 1618285242Sachim { 1619285242Sachim mpiConfig->inboundQueues[i].numElements = INBOUND_DEPTH_SIZE; 1620285242Sachim mpiConfig->inboundQueues[i].elementSize = IOMB_SIZE64; 1621285242Sachim mpiConfig->inboundQueues[i].priority = MPI_QUEUE_NORMAL; 1622285242Sachim } 1623285242Sachim 1624285242Sachim /* configure outbound queues */ 1625285242Sachim for ( i = 0; i < AGSA_MAX_OUTBOUND_Q; i ++ ) 1626285242Sachim { 1627285242Sachim mpiConfig->outboundQueues[i].numElements = OUTBOUND_DEPTH_SIZE; 1628285242Sachim mpiConfig->outboundQueues[i].elementSize = IOMB_SIZE64; 1629285242Sachim mpiConfig->outboundQueues[i].interruptVector = 0; 1630285242Sachim mpiConfig->outboundQueues[i].interruptDelay = 0; 1631285242Sachim mpiConfig->outboundQueues[i].interruptThreshold = 0; 1632285242Sachim /* always enable OQ interrupt */ 1633285242Sachim mpiConfig->outboundQueues[i].interruptEnable = 1; 1634285242Sachim } 1635285242Sachim } 1636285242Sachim else 1637285242Sachim { /* Parm3 is not null */ 1638285242Sachim queueConfig = (agsaQueueConfig_t *)swConfig->param3; 1639285242Sachim 1640285242Sachim#if defined(SALLSDK_DEBUG) 1641285242Sachim sidump_Q_config( queueConfig ); 1642285242Sachim#endif 1643285242Sachim 1644285242Sachim SA_DBG1(("siConfiguration: swConfig->param3 == %p\n",queueConfig)); 1645285242Sachim 1646285242Sachim if ((queueConfig->numInboundQueues > AGSA_MAX_INBOUND_Q) || 1647285242Sachim (queueConfig->numOutboundQueues > AGSA_MAX_OUTBOUND_Q)) 1648285242Sachim { 1649285242Sachim smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "m2"); 1650285242Sachim SA_DBG1(("siConfiguration:AGSA_RC_FAILURE MAX_Q\n")); 1651285242Sachim 1652285242Sachim return AGSA_RC_FAILURE; 1653285242Sachim } 1654285242Sachim 1655285242Sachim if ((queueConfig->numInboundQueues == 0 || 1656285242Sachim queueConfig->numOutboundQueues == 0 )) 1657285242Sachim { 1658285242Sachim smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "m2"); 1659285242Sachim SA_DBG1(("siConfiguration:AGSA_RC_FAILURE NO_Q\n")); 1660285242Sachim return AGSA_RC_FAILURE; 1661285242Sachim } 1662285242Sachim mpiConfig->mainConfig.eventLogSize = swConfig->sizefEventLog1 * KBYTES; 1663285242Sachim mpiConfig->mainConfig.eventLogOption = swConfig->eventLog1Option; 1664285242Sachim mpiConfig->mainConfig.IOPeventLogSize = swConfig->sizefEventLog2 * KBYTES; 1665285242Sachim mpiConfig->mainConfig.IOPeventLogOption = swConfig->eventLog2Option; 1666285242Sachim 1667285242Sachim if ((queueConfig->numInboundQueues > IQ_NUM_32) || (queueConfig->numOutboundQueues > OQ_NUM_32)) 1668285242Sachim { 1669285242Sachim enable64 = 1; 1670285242Sachim } 1671285242Sachim 1672285242Sachim if (agNULL == hwConfig) 1673285242Sachim { 1674285242Sachim intOption = 0; 1675285242Sachim } 1676285242Sachim else 1677285242Sachim { 1678285242Sachim 1679285242Sachim#if defined(SALLSDK_DEBUG) 1680285242Sachim sidump_hwConfig(hwConfig); 1681285242Sachim#endif 1682285242Sachim 1683285242Sachim 1684285242Sachim if(smIS_SPCV(agRoot)) 1685285242Sachim { 1686285242Sachim intOption = 0; 1687285242Sachim } 1688285242Sachim else 1689285242Sachim { 1690285242Sachim intOption = hwConfig->intReassertionOption & INT_OPTION; 1691285242Sachim } 1692285242Sachim 1693285242Sachim } 1694285242Sachim 1695285242Sachim /* Enable SGPIO */ 1696285242Sachim swConfig->sgpioSupportEnable = 1; 1697285242Sachim 1698285242Sachim /* set bit for normal priority or high priority path */ 1699285242Sachim /* set fatal error interrupt enable and vector */ 1700285242Sachim /* set Interrupt Reassertion enable and 64 IQ/OQ enable */ 1701285242Sachim mpiConfig->mainConfig.FatalErrorInterrupt = 1702285242Sachim (swConfig->fatalErrorInterruptEnable) /* bit 0*/ | 1703285242Sachim (hwConfig == agNULL ? 0: (hwConfig->hwOption & HW_CFG_PICI_EFFECTIVE_ADDRESS ? (0x1 << SHIFT1): 0))| 1704285242Sachim (swConfig->sgpioSupportEnable ? (0x1 << SHIFT2): 0) | 1705285242Sachim /* compile option SA_ENABLE_POISION_TLP */(SA_PTNFE_POISION_TLP << SHIFT3) | 1706285242Sachim#ifdef SA_CONFIG_MDFD_REGISTRY 1707285242Sachim (swConfig->disableMDF ? (0x1 << SHIFT4): 0) | 1708285242Sachim#else 1709285242Sachim /* compile option SA_DISABLE_MDFD */ (SA_MDFD_MULTI_DATA_FETCH << SHIFT4) | 1710285242Sachim#endif /*SA_CONFIG_MDFD_REGISTRY*/ 1711285242Sachim /* compile option SA_DISABLE_OB_COAL */(SA_OUTBOUND_COALESCE << SHIFT5) | 1712285242Sachim /* compile option SA_ENABLE_ARBTE */(SA_ARBTE << SHIFT6) | 1713285242Sachim ((swConfig->fatalErrorInterruptVector & FATAL_ERROR_INT_BITS) << SHIFT8) | 1714285242Sachim (enable64 << SHIFT16) | 1715285242Sachim (intOption << SHIFT17); 1716285242Sachim 1717285242Sachim 1718285242Sachim SA_DBG1(("siConfiguration: swConfig->fatalErrorInterruptEnable %X\n",swConfig->fatalErrorInterruptEnable)); 1719285242Sachim SA_DBG1(("siConfiguration: swConfig->fatalErrorInterruptVector %X\n",swConfig->fatalErrorInterruptVector)); 1720285242Sachim 1721285242Sachim 1722285242Sachim 1723285242Sachim /* initialize the mpiConfig */ 1724285242Sachim /* We configure the Host main part of configuration table */ 1725285242Sachim mpiConfig->mainConfig.outboundTargetITNexusEventPID0_3 = 0; 1726285242Sachim mpiConfig->mainConfig.outboundTargetITNexusEventPID4_7 = 0; 1727285242Sachim mpiConfig->mainConfig.outboundTargetSSPEventPID0_3 = 0; 1728285242Sachim mpiConfig->mainConfig.outboundTargetSSPEventPID4_7 = 0; 1729285242Sachim mpiConfig->mainConfig.ioAbortDelay = 0; 1730285242Sachim mpiConfig->mainConfig.PortRecoveryTimerPortResetTimer = swConfig->PortRecoveryResetTimer; 1731285242Sachim 1732285242Sachim /* get parameter from queueConfig */ 1733285242Sachim mpiConfig->mainConfig.iQNPPD_HPPD_GEvent = queueConfig->iqNormalPriorityProcessingDepth | 1734285242Sachim (queueConfig->iqHighPriorityProcessingDepth << SHIFT8) | 1735285242Sachim (queueConfig->generalEventQueue << SHIFT16) | 1736285242Sachim (queueConfig->tgtDeviceRemovedEventQueue << SHIFT24); 1737285242Sachim 1738285242Sachim mpiConfig->mainConfig.outboundHWEventPID0_3 = queueConfig->sasHwEventQueue[0] | 1739285242Sachim (queueConfig->sasHwEventQueue[1] << SHIFT8) | 1740285242Sachim (queueConfig->sasHwEventQueue[2] << SHIFT16) | 1741285242Sachim (queueConfig->sasHwEventQueue[3] << SHIFT24); 1742285242Sachim mpiConfig->mainConfig.outboundHWEventPID4_7 = queueConfig->sasHwEventQueue[4] | 1743285242Sachim (queueConfig->sasHwEventQueue[5] << SHIFT8) | 1744285242Sachim (queueConfig->sasHwEventQueue[6] << SHIFT16) | 1745285242Sachim (queueConfig->sasHwEventQueue[7] << SHIFT24); 1746285242Sachim mpiConfig->mainConfig.outboundNCQEventPID0_3 = queueConfig->sataNCQErrorEventQueue[0] | 1747285242Sachim (queueConfig->sataNCQErrorEventQueue[1] << SHIFT8) | 1748285242Sachim (queueConfig->sataNCQErrorEventQueue[2] << SHIFT16) | 1749285242Sachim (queueConfig->sataNCQErrorEventQueue[3] << SHIFT24); 1750285242Sachim mpiConfig->mainConfig.outboundNCQEventPID4_7 = queueConfig->sataNCQErrorEventQueue[4] | 1751285242Sachim (queueConfig->sataNCQErrorEventQueue[5] << SHIFT8) | 1752285242Sachim (queueConfig->sataNCQErrorEventQueue[6] << SHIFT16) | 1753285242Sachim (queueConfig->sataNCQErrorEventQueue[7] << SHIFT24); 1754285242Sachim /* save it */ 1755285242Sachim mpiConfig->numInboundQueues = queueConfig->numInboundQueues; 1756285242Sachim mpiConfig->numOutboundQueues = queueConfig->numOutboundQueues; 1757285242Sachim mpiConfig->queueOption = queueConfig->queueOption; 1758285242Sachim 1759285242Sachim SA_DBG2(("siConfiguration: numInboundQueues=%d numOutboundQueues=%d\n", 1760285242Sachim queueConfig->numInboundQueues, 1761285242Sachim queueConfig->numOutboundQueues)); 1762285242Sachim 1763285242Sachim /* configure inbound queues */ 1764285242Sachim /* We configure the size of queue based on swConfig */ 1765285242Sachim for( i = 0; i < queueConfig->numInboundQueues; i ++ ) 1766285242Sachim { 1767285242Sachim mpiConfig->inboundQueues[i].numElements = (bit16)queueConfig->inboundQueues[i].elementCount; 1768285242Sachim mpiConfig->inboundQueues[i].elementSize = (bit16)queueConfig->inboundQueues[i].elementSize;; 1769285242Sachim mpiConfig->inboundQueues[i].priority = queueConfig->inboundQueues[i].priority; 1770285242Sachim 1771285242Sachim SA_DBG2(("siConfiguration: IBQ%d:elementCount=%d elementSize=%d priority=%d Total Size 0x%X\n", 1772285242Sachim i, 1773285242Sachim queueConfig->inboundQueues[i].elementCount, 1774285242Sachim queueConfig->inboundQueues[i].elementSize, 1775285242Sachim queueConfig->inboundQueues[i].priority, 1776285242Sachim queueConfig->inboundQueues[i].elementCount * queueConfig->inboundQueues[i].elementSize )); 1777285242Sachim } 1778285242Sachim 1779285242Sachim /* configura outbound queues */ 1780285242Sachim /* We configure the size of queue based on swConfig */ 1781285242Sachim for( i = 0; i < queueConfig->numOutboundQueues; i ++ ) 1782285242Sachim { 1783285242Sachim mpiConfig->outboundQueues[i].numElements = (bit16)queueConfig->outboundQueues[i].elementCount; 1784285242Sachim mpiConfig->outboundQueues[i].elementSize = (bit16)queueConfig->outboundQueues[i].elementSize; 1785285242Sachim mpiConfig->outboundQueues[i].interruptVector = (bit8)queueConfig->outboundQueues[i].interruptVectorIndex; 1786285242Sachim mpiConfig->outboundQueues[i].interruptDelay = (bit16)queueConfig->outboundQueues[i].interruptDelay; 1787285242Sachim mpiConfig->outboundQueues[i].interruptThreshold = (bit8)queueConfig->outboundQueues[i].interruptCount; 1788285242Sachim mpiConfig->outboundQueues[i].interruptEnable = (bit32)queueConfig->outboundQueues[i].interruptEnable; 1789285242Sachim 1790285242Sachim SA_DBG2(("siConfiguration: OBQ%d:elementCount=%d elementSize=%d interruptCount=%d interruptEnable=%d\n", 1791285242Sachim i, 1792285242Sachim queueConfig->outboundQueues[i].elementCount, 1793285242Sachim queueConfig->outboundQueues[i].elementSize, 1794285242Sachim queueConfig->outboundQueues[i].interruptCount, 1795285242Sachim queueConfig->outboundQueues[i].interruptEnable)); 1796285242Sachim } 1797285242Sachim } 1798285242Sachim 1799285242Sachim SA_DBG1(("siConfiguration:mpiConfig->mainConfig.FatalErrorInterrupt 0x%X\n",mpiConfig->mainConfig.FatalErrorInterrupt)); 1800285242Sachim SA_DBG1(("siConfiguration:swConfig->fatalErrorInterruptVector 0x%X\n",swConfig->fatalErrorInterruptVector)); 1801285242Sachim SA_DBG1(("siConfiguration:enable64 0x%X\n",enable64)); 1802285242Sachim SA_DBG1(("siConfiguration:PortRecoveryResetTimer 0x%X\n",swConfig->PortRecoveryResetTimer)); 1803285242Sachim 1804285242Sachim smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "m2"); 1805285242Sachim 1806285242Sachim /* return */ 1807285242Sachim return AGSA_RC_SUCCESS; 1808285242Sachim} 1809285242Sachim 1810285242Sachim#ifdef FW_EVT_LOG_TST 1811285242Sachimvoid saLogDump(agsaRoot_t *agRoot, 1812285242Sachim U32 *eventLogSize, 1813285242Sachim U32 **eventLogAddress_) 1814285242Sachim{ 1815285242Sachim agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData); 1816285242Sachim //mpiConfig_t *mpiConfig = &saRoot->mpiConfig; 1817285242Sachim mpiHostLLConfigDescriptor_t *mpiConfig = &saRoot->mainConfigTable; 1818285242Sachim 1819285242Sachim *eventLogAddress_ = (U32*)eventLogAddress; 1820285242Sachim *eventLogSize = (U32)mpiConfig->eventLogSize; 1821285242Sachim} 1822285242Sachim#endif 1823285242Sachim 1824285242Sachim/*******************************************************************************/ 1825285242Sachim/** \fn mpiInitialize(agsaRoot *agRoot, mpiMemReq_t* memoryAllocated, mpiConfig_t* config) 1826285242Sachim * \brief Initializes the MPI Message Unit 1827285242Sachim * \param agRoot Pointer to a data structure containing LL layer context handles 1828285242Sachim * \param memoryAllocated Data structure that holds the different chunks of memory that are allocated 1829285242Sachim * \param config MPI configuration 1830285242Sachim * 1831285242Sachim * This function is called to initialize SPC_HOST_MPI internal data structures and the SPC hardware. 1832285242Sachim * This function is competed synch->ronously (there is no callback) 1833285242Sachim * 1834285242Sachim * Return: 1835285242Sachim * AGSA_RC_SUCCESS if initialization succeeded. 1836285242Sachim * AGSA_RC_FAILURE if initialization failed. 1837285242Sachim */ 1838285242Sachim/*******************************************************************************/ 1839285242SachimGLOBAL bit32 mpiInitialize(agsaRoot_t *agRoot, 1840285242Sachim mpiMemReq_t* memoryAllocated, 1841285242Sachim mpiConfig_t* config) 1842285242Sachim{ 1843285242Sachim static spc_configMainDescriptor_t mainCfg; /* main part of MPI configuration */ 1844285242Sachim static spc_inboundQueueDescriptor_t inQueueCfg; /* Inbound queue HW configuration structure */ 1845285242Sachim static spc_outboundQueueDescriptor_t outQueueCfg; /* Outbound queue HW configuration structure */ 1846285242Sachim bit16 qIdx, i, indexoffset; /* Queue index */ 1847285242Sachim bit16 mIdx = 0; /* Memory region index */ 1848285242Sachim bit32 MSGUCfgTblDWIdx, GSTLenMPIS; 1849285242Sachim bit32 MSGUCfgTblBase, ret = AGSA_RC_SUCCESS; 1850285242Sachim bit32 value, togglevalue; 1851285242Sachim bit32 saveOffset; 1852285242Sachim bit32 inboundoffset, outboundoffset; 1853285242Sachim bit8 pcibar; 1854285242Sachim bit16 maxinbound = AGSA_MAX_INBOUND_Q; 1855285242Sachim bit16 maxoutbound = AGSA_MAX_OUTBOUND_Q; 1856285242Sachim bit32 OB_CIPCIBar; 1857285242Sachim bit32 IB_PIPCIBar; 1858285242Sachim bit32 max_wait_time; 1859285242Sachim bit32 max_wait_count; 1860285242Sachim bit32 memOffset; 1861285242Sachim agsaLLRoot_t *saRoot; 1862285242Sachim mpiICQueue_t *circularIQ = agNULL; 1863285242Sachim mpiOCQueue_t *circularOQ; 1864285242Sachim 1865285242Sachim bit32 mpiUnInitFailed = 0; 1866285242Sachim bit32 mpiStartToggleFailed = 0; 1867285242Sachim 1868285242Sachim 1869285242Sachim#if defined(SALLSDK_DEBUG) 1870285242Sachim bit8 phycount = AGSA_MAX_VALID_PHYS; 1871285242Sachim#endif /* SALLSDK_DEBUG */ 1872285242Sachim 1873285242Sachim SA_DBG1(("mpiInitialize: Entering\n")); 1874285242Sachim SA_ASSERT(NULL != agRoot, "agRoot argument cannot be null"); 1875285242Sachim SA_ASSERT(NULL != memoryAllocated, "memoryAllocated argument cannot be null"); 1876285242Sachim SA_ASSERT(NULL != config, "config argument cannot be null"); 1877285242Sachim SA_ASSERT(0 == (sizeof(spc_inboundQueueDescriptor_t) % 4), "spc_inboundQueueDescriptor_t type size has to be divisible by 4"); 1878285242Sachim 1879285242Sachim saRoot = (agsaLLRoot_t *)(agRoot->sdkData); 1880285242Sachim 1881285242Sachim si_memset(&mainCfg,0,sizeof(spc_configMainDescriptor_t)); 1882285242Sachim si_memset(&inQueueCfg,0,sizeof(spc_inboundQueueDescriptor_t)); 1883285242Sachim si_memset(&outQueueCfg,0,sizeof(spc_outboundQueueDescriptor_t)); 1884285242Sachim 1885285242Sachim SA_ASSERT((agNULL !=saRoot ), ""); 1886285242Sachim if(saRoot == agNULL) 1887285242Sachim { 1888285242Sachim SA_DBG1(("mpiInitialize: saRoot == agNULL\n")); 1889285242Sachim return(AGSA_RC_FAILURE); 1890285242Sachim } 1891285242Sachim smTraceFuncEnter(hpDBG_VERY_LOUD,"m3"); 1892285242Sachim 1893285242Sachim /*Shift BAR 4 for SPC HAILEAH*/ 1894285242Sachim if(smIS_SPC(agRoot)) 1895285242Sachim { 1896285242Sachim if( smIS_HIL(agRoot)) 1897285242Sachim { 1898285242Sachim if (AGSA_RC_FAILURE == siBar4Shift(agRoot, MBIC_GSM_SM_BASE)) 1899285242Sachim { 1900285242Sachim SA_DBG1(("mpiInitialize: siBar4Shift FAILED ******************************************\n")); 1901285242Sachim return AGSA_RC_FAILURE; 1902285242Sachim } 1903285242Sachim } 1904285242Sachim } 1905285242Sachim 1906285242Sachim /* Wait for the SPC Configuration Table to be ready */ 1907285242Sachim ret = mpiWaitForConfigTable(agRoot, &mainCfg); 1908285242Sachim if (AGSA_RC_FAILURE == ret) 1909285242Sachim { 1910285242Sachim /* return error if MPI Configuration Table not ready */ 1911285242Sachim SA_DBG1(("mpiInitialize: mpiWaitForConfigTable FAILED ******************************************\n")); 1912285242Sachim smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "m3"); 1913285242Sachim return ret; 1914285242Sachim } 1915285242Sachim 1916285242Sachim /* read scratch pad0 to get PCI BAR and offset of configuration table */ 1917285242Sachim MSGUCfgTblBase = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_0,MSGU_SCRATCH_PAD_0); 1918285242Sachim /* get PCI BAR */ 1919285242Sachim MSGUCfgTblBase = (MSGUCfgTblBase & SCRATCH_PAD0_BAR_MASK) >> SHIFT26; 1920285242Sachim /* get pci Bar index */ 1921285242Sachim pcibar = (bit8)mpiGetPCIBarIndex(agRoot, MSGUCfgTblBase); 1922285242Sachim 1923285242Sachim SA_DBG1(("mpiInitialize: MSGUCfgTblBase = 0x%x\n", MSGUCfgTblBase)); 1924285242Sachim#if defined(SALLSDK_DEBUG) 1925285242Sachim /* get Phy count from configuration table */ 1926285242Sachim phycount = (bit8)((mainCfg.ContrlCapFlag & PHY_COUNT_BITS) >> SHIFT19); 1927285242Sachim 1928285242Sachim SA_DBG1(("mpiInitialize: Number of PHYs = 0x%x\n", phycount)); 1929285242Sachim 1930285242Sachim smTrace(hpDBG_VERY_LOUD,"70",phycount); 1931285242Sachim /* TP:70 phycount */ 1932285242Sachim#endif /* SALLSDK_DEBUG */ 1933285242Sachim 1934285242Sachim /* get High Priority IQ support flag */ 1935285242Sachim if (mainCfg.ContrlCapFlag & HP_SUPPORT_BIT) 1936285242Sachim { 1937285242Sachim SA_DBG1(("mpiInitialize: High Priority IQ support from SPC\n")); 1938285242Sachim } 1939285242Sachim /* get Interrupt Coalescing Support flag */ 1940285242Sachim if (mainCfg.ContrlCapFlag & INT_COL_BIT) 1941285242Sachim { 1942285242Sachim SA_DBG1(("mpiInitialize: Interrupt Coalescing support from SPC\n")); 1943285242Sachim } 1944285242Sachim 1945285242Sachim /* get configured the number of inbound/outbound queues */ 1946285242Sachim if (memoryAllocated->count == TOTAL_MPI_MEM_CHUNKS) 1947285242Sachim { 1948285242Sachim config->maxNumInboundQueues = AGSA_MAX_INBOUND_Q; 1949285242Sachim config->maxNumOutboundQueues = AGSA_MAX_OUTBOUND_Q; 1950285242Sachim } 1951285242Sachim else 1952285242Sachim { 1953285242Sachim config->maxNumInboundQueues = config->numInboundQueues; 1954285242Sachim config->maxNumOutboundQueues = config->numOutboundQueues; 1955285242Sachim maxinbound = config->numInboundQueues; 1956285242Sachim maxoutbound = config->numOutboundQueues; 1957285242Sachim } 1958285242Sachim 1959285242Sachim SA_DBG1(("mpiInitialize: Number of IQ %d\n", maxinbound)); 1960285242Sachim SA_DBG1(("mpiInitialize: Number of OQ %d\n", maxoutbound)); 1961285242Sachim 1962285242Sachim /* get inbound queue offset */ 1963285242Sachim inboundoffset = mainCfg.inboundQueueOffset; 1964285242Sachim /* get outbound queue offset */ 1965285242Sachim outboundoffset = mainCfg.outboundQueueOffset; 1966285242Sachim 1967285242Sachim if(smIS_SPCV(agRoot)) 1968285242Sachim { 1969285242Sachim SA_DBG2(("mpiInitialize: Offset of IQ %d\n", (inboundoffset & 0xFF000000) >> 24)); 1970285242Sachim SA_DBG2(("mpiInitialize: Offset of OQ %d\n", (outboundoffset & 0xFF000000) >> 24)); 1971285242Sachim inboundoffset &= 0x00FFFFFF; 1972285242Sachim outboundoffset &= 0x00FFFFFF; 1973285242Sachim } 1974285242Sachim /* get offset of the configuration table */ 1975285242Sachim MSGUCfgTblDWIdx = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_0,MSGU_SCRATCH_PAD_0); 1976285242Sachim MSGUCfgTblDWIdx = MSGUCfgTblDWIdx & SCRATCH_PAD0_OFFSET_MASK; 1977285242Sachim 1978285242Sachim saveOffset = MSGUCfgTblDWIdx; 1979285242Sachim 1980285242Sachim /* Checks if the configuration memory region size is the same as the mpiConfigMain */ 1981285242Sachim if(memoryAllocated->region[mIdx].totalLength != sizeof(bit8) * config->mainConfig.eventLogSize) 1982285242Sachim { 1983285242Sachim SA_DBG1(("ERROR: The memory region [%d] 0x%X != 0x%X does not have the size of the MSGU event log ******************************************\n", 1984285242Sachim mIdx,memoryAllocated->region[mIdx].totalLength,config->mainConfig.eventLogSize)); 1985285242Sachim smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "m3"); 1986285242Sachim return AGSA_RC_FAILURE; 1987285242Sachim } 1988285242Sachim 1989285242Sachim mainCfg.iQNPPD_HPPD_GEvent = config->mainConfig.iQNPPD_HPPD_GEvent; 1990285242Sachim 1991285242Sachim if(smIS_SPCV(agRoot)) 1992285242Sachim { 1993285242Sachim mainCfg.outboundHWEventPID0_3 = 0; 1994285242Sachim mainCfg.outboundHWEventPID4_7 = 0; 1995285242Sachim mainCfg.outboundNCQEventPID0_3 = 0; 1996285242Sachim mainCfg.outboundNCQEventPID4_7 = 0; 1997285242Sachim mainCfg.outboundTargetITNexusEventPID0_3 = 0; 1998285242Sachim mainCfg.outboundTargetITNexusEventPID4_7 = 0; 1999285242Sachim mainCfg.outboundTargetSSPEventPID0_3 = 0; 2000285242Sachim mainCfg.outboundTargetSSPEventPID4_7 = 0; 2001285242Sachim mainCfg.ioAbortDelay = 0; /* SPCV reserved */ 2002285242Sachim mainCfg.custset = 0; 2003285242Sachim mainCfg.portRecoveryResetTimer = config->mainConfig.PortRecoveryTimerPortResetTimer; 2004285242Sachim SA_DBG1(("mpiInitialize:custset V %8X\n",mainCfg.custset)); 2005285242Sachim SA_DBG1(("mpiInitialize:portRecoveryResetTimer V %8X\n",mainCfg.portRecoveryResetTimer)); 2006285242Sachim 2007285242Sachim mainCfg.interruptReassertionDelay = saRoot->hwConfig.intReassertionOption; 2008285242Sachim SA_DBG1(("mpiInitialize:interruptReassertionDelay V %8X\n", mainCfg.interruptReassertionDelay)); 2009285242Sachim 2010285242Sachim 2011285242Sachim } 2012285242Sachim else 2013285242Sachim { 2014285242Sachim mainCfg.outboundHWEventPID0_3 = config->mainConfig.outboundHWEventPID0_3; 2015285242Sachim mainCfg.outboundHWEventPID4_7 = config->mainConfig.outboundHWEventPID4_7; 2016285242Sachim mainCfg.outboundNCQEventPID0_3 = config->mainConfig.outboundNCQEventPID0_3; 2017285242Sachim mainCfg.outboundNCQEventPID4_7 = config->mainConfig.outboundNCQEventPID4_7; 2018285242Sachim mainCfg.outboundTargetITNexusEventPID0_3 = config->mainConfig.outboundTargetITNexusEventPID0_3; 2019285242Sachim mainCfg.outboundTargetITNexusEventPID4_7 = config->mainConfig.outboundTargetITNexusEventPID4_7; 2020285242Sachim mainCfg.outboundTargetSSPEventPID0_3 = config->mainConfig.outboundTargetSSPEventPID0_3; 2021285242Sachim mainCfg.outboundTargetSSPEventPID4_7 = config->mainConfig.outboundTargetSSPEventPID4_7; 2022285242Sachim mainCfg.ioAbortDelay = config->mainConfig.ioAbortDelay; 2023285242Sachim mainCfg.custset = config->mainConfig.custset; 2024285242Sachim 2025285242Sachim SA_DBG1(("mpiInitialize:custset spc %8X\n",mainCfg.custset)); 2026285242Sachim 2027285242Sachim } 2028285242Sachim#ifdef FW_EVT_LOG_TST 2029285242Sachim eventLogAddress = memoryAllocated->region[mIdx].virtPtr; 2030285242Sachim#endif 2031285242Sachim mainCfg.upperEventLogAddress = memoryAllocated->region[mIdx].physAddrUpper; 2032285242Sachim mainCfg.lowerEventLogAddress = memoryAllocated->region[mIdx].physAddrLower; 2033285242Sachim mainCfg.eventLogSize = config->mainConfig.eventLogSize; 2034285242Sachim mainCfg.eventLogOption = config->mainConfig.eventLogOption; 2035285242Sachim 2036285242Sachim mIdx++; 2037285242Sachim 2038285242Sachim /* Checks if the configuration memory region size is the same as the mpiConfigMain */ 2039285242Sachim if(memoryAllocated->region[mIdx].totalLength != sizeof(bit8) * config->mainConfig.IOPeventLogSize) 2040285242Sachim { 2041285242Sachim SA_DBG1(("ERROR: The memory region does not have the size of the IOP event log\n")); 2042285242Sachim smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "m3"); 2043285242Sachim return AGSA_RC_FAILURE; 2044285242Sachim } 2045285242Sachim 2046285242Sachim mainCfg.upperIOPeventLogAddress = memoryAllocated->region[mIdx].physAddrUpper; 2047285242Sachim mainCfg.lowerIOPeventLogAddress = memoryAllocated->region[mIdx].physAddrLower; 2048285242Sachim mainCfg.IOPeventLogSize = config->mainConfig.IOPeventLogSize; 2049285242Sachim mainCfg.IOPeventLogOption = config->mainConfig.IOPeventLogOption; 2050285242Sachim mainCfg.FatalErrorInterrupt = config->mainConfig.FatalErrorInterrupt; 2051285242Sachim 2052285242Sachim SA_DBG1(("mpiInitialize: iQNPPD_HPPD_GEvent 0x%x\n", mainCfg.iQNPPD_HPPD_GEvent)); 2053285242Sachim if(smIS_SPCV(agRoot)) 2054285242Sachim { 2055285242Sachim } 2056285242Sachim else 2057285242Sachim { 2058285242Sachim SA_DBG3(("mpiInitialize: outboundHWEventPID0_3 0x%x\n", mainCfg.outboundHWEventPID0_3)); 2059285242Sachim SA_DBG3(("mpiInitialize: outboundHWEventPID4_7 0x%x\n", mainCfg.outboundHWEventPID4_7)); 2060285242Sachim SA_DBG3(("mpiInitialize: outboundNCQEventPID0_3 0x%x\n", mainCfg.outboundNCQEventPID0_3)); 2061285242Sachim SA_DBG3(("mpiInitialize: outboundNCQEventPID4_7 0x%x\n", mainCfg.outboundNCQEventPID4_7)); 2062285242Sachim SA_DBG3(("mpiInitialize: outboundTargetITNexusEventPID0_3 0x%x\n", mainCfg.outboundTargetITNexusEventPID0_3)); 2063285242Sachim SA_DBG3(("mpiInitialize: outboundTargetITNexusEventPID4_7 0x%x\n", mainCfg.outboundTargetITNexusEventPID4_7)); 2064285242Sachim SA_DBG3(("mpiInitialize: outboundTargetSSPEventPID0_3 0x%x\n", mainCfg.outboundTargetSSPEventPID0_3)); 2065285242Sachim SA_DBG3(("mpiInitialize: outboundTargetSSPEventPID4_7 0x%x\n", mainCfg.outboundTargetSSPEventPID4_7)); 2066285242Sachim } 2067285242Sachim 2068285242Sachim SA_DBG3(("mpiInitialize: upperEventLogAddress 0x%x\n", mainCfg.upperEventLogAddress)); 2069285242Sachim SA_DBG3(("mpiInitialize: lowerEventLogAddress 0x%x\n", mainCfg.lowerEventLogAddress)); 2070285242Sachim SA_DBG3(("mpiInitialize: eventLogSize 0x%x\n", mainCfg.eventLogSize)); 2071285242Sachim SA_DBG3(("mpiInitialize: eventLogOption 0x%x\n", mainCfg.eventLogOption)); 2072285242Sachim#ifdef FW_EVT_LOG_TST 2073285242Sachim SA_DBG3(("mpiInitialize: eventLogAddress 0x%p\n", eventLogAddress)); 2074285242Sachim#endif 2075285242Sachim SA_DBG3(("mpiInitialize: upperIOPLogAddress 0x%x\n", mainCfg.upperIOPeventLogAddress)); 2076285242Sachim SA_DBG3(("mpiInitialize: lowerIOPLogAddress 0x%x\n", mainCfg.lowerIOPeventLogAddress)); 2077285242Sachim SA_DBG3(("mpiInitialize: IOPeventLogSize 0x%x\n", mainCfg.IOPeventLogSize)); 2078285242Sachim SA_DBG3(("mpiInitialize: IOPeventLogOption 0x%x\n", mainCfg.IOPeventLogOption)); 2079285242Sachim SA_DBG3(("mpiInitialize: FatalErrorInterrupt 0x%x\n", mainCfg.FatalErrorInterrupt)); 2080285242Sachim SA_DBG3(("mpiInitialize: HDAModeFlags 0x%x\n", mainCfg.HDAModeFlags)); 2081285242Sachim SA_DBG3(("mpiInitialize: analogSetupTblOffset 0x%08x\n", mainCfg.analogSetupTblOffset)); 2082285242Sachim 2083285242Sachim saRoot->mainConfigTable.iQNPPD_HPPD_GEvent = mainCfg.iQNPPD_HPPD_GEvent; 2084285242Sachim 2085285242Sachim if(smIS_SPCV(agRoot)) 2086285242Sachim { 2087285242Sachim /* SPCV - reserved fields */ 2088285242Sachim saRoot->mainConfigTable.outboundHWEventPID0_3 = 0; 2089285242Sachim saRoot->mainConfigTable.outboundHWEventPID4_7 = 0; 2090285242Sachim saRoot->mainConfigTable.outboundNCQEventPID0_3 = 0; 2091285242Sachim saRoot->mainConfigTable.outboundNCQEventPID4_7 = 0; 2092285242Sachim saRoot->mainConfigTable.outboundTargetITNexusEventPID0_3 = 0; 2093285242Sachim saRoot->mainConfigTable.outboundTargetITNexusEventPID4_7 = 0; 2094285242Sachim saRoot->mainConfigTable.outboundTargetSSPEventPID0_3 = 0; 2095285242Sachim saRoot->mainConfigTable.outboundTargetSSPEventPID4_7 = 0; 2096285242Sachim saRoot->mainConfigTable.ioAbortDelay = 0; 2097285242Sachim saRoot->mainConfigTable.custset = 0; 2098285242Sachim 2099285242Sachim } 2100285242Sachim else 2101285242Sachim { 2102285242Sachim saRoot->mainConfigTable.outboundHWEventPID0_3 = mainCfg.outboundHWEventPID0_3; 2103285242Sachim saRoot->mainConfigTable.outboundHWEventPID4_7 = mainCfg.outboundHWEventPID4_7; 2104285242Sachim saRoot->mainConfigTable.outboundNCQEventPID0_3 = mainCfg.outboundNCQEventPID0_3; 2105285242Sachim saRoot->mainConfigTable.outboundNCQEventPID4_7 = mainCfg.outboundNCQEventPID4_7; 2106285242Sachim saRoot->mainConfigTable.outboundTargetITNexusEventPID0_3 = mainCfg.outboundTargetITNexusEventPID0_3; 2107285242Sachim saRoot->mainConfigTable.outboundTargetITNexusEventPID4_7 = mainCfg.outboundTargetITNexusEventPID4_7; 2108285242Sachim saRoot->mainConfigTable.outboundTargetSSPEventPID0_3 = mainCfg.outboundTargetSSPEventPID0_3; 2109285242Sachim saRoot->mainConfigTable.outboundTargetSSPEventPID4_7 = mainCfg.outboundTargetSSPEventPID4_7; 2110285242Sachim saRoot->mainConfigTable.ioAbortDelay = mainCfg.ioAbortDelay; 2111285242Sachim saRoot->mainConfigTable.custset = mainCfg.custset; 2112285242Sachim 2113285242Sachim } 2114285242Sachim 2115285242Sachim saRoot->mainConfigTable.upperEventLogAddress = mainCfg.upperEventLogAddress; 2116285242Sachim saRoot->mainConfigTable.lowerEventLogAddress = mainCfg.lowerEventLogAddress; 2117285242Sachim saRoot->mainConfigTable.eventLogSize = mainCfg.eventLogSize; 2118285242Sachim saRoot->mainConfigTable.eventLogOption = mainCfg.eventLogOption; 2119285242Sachim saRoot->mainConfigTable.upperIOPeventLogAddress = mainCfg.upperIOPeventLogAddress; 2120285242Sachim saRoot->mainConfigTable.lowerIOPeventLogAddress = mainCfg.lowerIOPeventLogAddress; 2121285242Sachim saRoot->mainConfigTable.IOPeventLogSize = mainCfg.IOPeventLogSize; 2122285242Sachim saRoot->mainConfigTable.IOPeventLogOption = mainCfg.IOPeventLogOption; 2123285242Sachim saRoot->mainConfigTable.FatalErrorInterrupt = mainCfg.FatalErrorInterrupt; 2124285242Sachim 2125285242Sachim 2126285242Sachim if(smIS_SPCV(agRoot)) 2127285242Sachim { 2128285242Sachim ;/* SPCV - reserved fields */ 2129285242Sachim } 2130285242Sachim else 2131285242Sachim { 2132285242Sachim saRoot->mainConfigTable.HDAModeFlags = mainCfg.HDAModeFlags; 2133285242Sachim } 2134285242Sachim 2135285242Sachim saRoot->mainConfigTable.analogSetupTblOffset = mainCfg.analogSetupTblOffset; 2136285242Sachim 2137285242Sachim smTrace(hpDBG_VERY_LOUD,"71",mIdx); 2138285242Sachim /* TP:71 71 mIdx */ 2139285242Sachim 2140285242Sachim 2141285242Sachim 2142285242Sachim ossaHwRegWriteExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_IQNPPD_HPPD_OFFSET), 2143285242Sachim mainCfg.iQNPPD_HPPD_GEvent); 2144285242Sachim 2145285242Sachim SA_DBG3(("mpiInitialize: Offset 0x%08x mainCfg.iQNPPD_HPPD_GEvent 0x%x\n", (bit32)(MSGUCfgTblDWIdx + MAIN_IQNPPD_HPPD_OFFSET), mainCfg.iQNPPD_HPPD_GEvent)); 2146285242Sachim 2147285242Sachim if(smIS_SPC6V(agRoot)) 2148285242Sachim { 2149285242Sachim if(smIsCfgVREV_B(agRoot)) 2150285242Sachim { 2151285242Sachim ossaHwRegWriteExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_IO_ABORT_DELAY), 2152285242Sachim MAIN_IO_ABORT_DELAY_END_TO_END_CRC_DISABLE); 2153285242Sachim 2154285242Sachim SA_DBG1(("mpiInitialize:SPCV - MAIN_IO_ABORT_DELAY_END_TO_END_CRC_DISABLE\n" )); 2155285242Sachim } 2156285242Sachim if(smIsCfgVREV_C(agRoot)) 2157285242Sachim { 2158285242Sachim SA_DBG1(("mpiInitialize:SPCV - END_TO_END_CRC On\n" )); 2159285242Sachim } 2160285242Sachim SA_DBG3(("mpiInitialize:SPCV - rest reserved field \n" )); 2161285242Sachim ;/* SPCV - reserved field */ 2162285242Sachim } 2163285242Sachim else if(smIS_SPC(agRoot)) 2164285242Sachim { 2165285242Sachim ossaHwRegWriteExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_OB_HW_EVENT_PID03_OFFSET), 2166285242Sachim mainCfg.outboundHWEventPID0_3); 2167285242Sachim ossaHwRegWriteExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_OB_HW_EVENT_PID47_OFFSET), 2168285242Sachim mainCfg.outboundHWEventPID4_7); 2169285242Sachim ossaHwRegWriteExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_OB_NCQ_EVENT_PID03_OFFSET), 2170285242Sachim mainCfg.outboundNCQEventPID0_3); 2171285242Sachim ossaHwRegWriteExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_OB_NCQ_EVENT_PID47_OFFSET), 2172285242Sachim mainCfg.outboundNCQEventPID4_7); 2173285242Sachim ossaHwRegWriteExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_TITNX_EVENT_PID03_OFFSET), 2174285242Sachim mainCfg.outboundTargetITNexusEventPID0_3); 2175285242Sachim ossaHwRegWriteExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_TITNX_EVENT_PID47_OFFSET), 2176285242Sachim mainCfg.outboundTargetITNexusEventPID4_7); 2177285242Sachim ossaHwRegWriteExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_OB_SSP_EVENT_PID03_OFFSET), 2178285242Sachim mainCfg.outboundTargetSSPEventPID0_3); 2179285242Sachim ossaHwRegWriteExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_OB_SSP_EVENT_PID47_OFFSET), 2180285242Sachim mainCfg.outboundTargetSSPEventPID4_7); 2181285242Sachim ossaHwRegWriteExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_CUSTOMER_SETTING), 2182285242Sachim mainCfg.custset); 2183285242Sachim }else 2184285242Sachim { 2185285242Sachim if(smIsCfgVREV_A(agRoot)) 2186285242Sachim { 2187285242Sachim ossaHwRegWriteExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_IO_ABORT_DELAY), 2188285242Sachim MAIN_IO_ABORT_DELAY_END_TO_END_CRC_DISABLE); /* */ 2189285242Sachim 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)); 2190285242Sachim SA_DBG1(("mpiInitialize:SPCV12G - END_TO_END_CRC OFF for rev A %d\n",smIsCfgVREV_A(agRoot) )); 2191285242Sachim } 2192285242Sachim else if(smIsCfgVREV_B(agRoot)) 2193285242Sachim { 2194285242Sachim SA_DBG1(("mpiInitialize:SPCV12G - END_TO_END_CRC ON rev B %d ****************************\n",smIsCfgVREV_B(agRoot) )); 2195285242Sachim /*ossaHwRegWriteExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_IO_ABORT_DELAY), 2196285242Sachim MAIN_IO_ABORT_DELAY_END_TO_END_CRC_DISABLE); 2197285242Sachim */ 2198285242Sachim } 2199285242Sachim else if(smIsCfgVREV_C(agRoot)) 2200285242Sachim { 2201285242Sachim SA_DBG1(("mpiInitialize:SPCV12G - END_TO_END_CRC on rev C %d\n",smIsCfgVREV_C(agRoot) )); 2202285242Sachim } 2203285242Sachim else 2204285242Sachim { 2205285242Sachim ossaHwRegWriteExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_IO_ABORT_DELAY), 2206285242Sachim MAIN_IO_ABORT_DELAY_END_TO_END_CRC_DISABLE); 2207285242Sachim SA_DBG1(("mpiInitialize:SPCV12G - END_TO_END_CRC Off unknown rev 0x%x\n", ossaHwRegReadConfig32((agRoot), 8 ))); 2208285242Sachim } 2209285242Sachim } 2210285242Sachim 2211285242Sachim ossaHwRegWriteExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_EVENT_LOG_ADDR_HI), mainCfg.upperEventLogAddress); 2212285242Sachim ossaHwRegWriteExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_EVENT_LOG_ADDR_LO), mainCfg.lowerEventLogAddress); 2213285242Sachim ossaHwRegWriteExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_EVENT_LOG_BUFF_SIZE), mainCfg.eventLogSize); 2214285242Sachim ossaHwRegWriteExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_EVENT_LOG_OPTION), mainCfg.eventLogOption); 2215285242Sachim ossaHwRegWriteExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_IOP_EVENT_LOG_ADDR_HI), mainCfg.upperIOPeventLogAddress); 2216285242Sachim ossaHwRegWriteExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_IOP_EVENT_LOG_ADDR_LO), mainCfg.lowerIOPeventLogAddress); 2217285242Sachim ossaHwRegWriteExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_IOP_EVENT_LOG_BUFF_SIZE), mainCfg.IOPeventLogSize); 2218285242Sachim ossaHwRegWriteExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_IOP_EVENT_LOG_OPTION), mainCfg.IOPeventLogOption); 2219285242Sachim ossaHwRegWriteExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_FATAL_ERROR_INTERRUPT), mainCfg.FatalErrorInterrupt); 2220285242Sachim ossaHwRegWriteExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_PRECTD_PRESETD), mainCfg.portRecoveryResetTimer); 2221285242Sachim 2222285242Sachim SA_DBG3(("mpiInitialize: Offset 0x%08x upperEventLogAddress 0x%x\n",(bit32)(MSGUCfgTblDWIdx + MAIN_EVENT_LOG_ADDR_HI), mainCfg.upperEventLogAddress )); 2223285242Sachim SA_DBG3(("mpiInitialize: Offset 0x%08x lowerEventLogAddress 0x%x\n",(bit32)(MSGUCfgTblDWIdx + MAIN_EVENT_LOG_ADDR_LO), mainCfg.lowerEventLogAddress )); 2224285242Sachim SA_DBG3(("mpiInitialize: Offset 0x%08x eventLogSize 0x%x\n",(bit32)(MSGUCfgTblDWIdx + MAIN_EVENT_LOG_BUFF_SIZE), mainCfg.eventLogSize )); 2225285242Sachim SA_DBG3(("mpiInitialize: Offset 0x%08x eventLogOption 0x%x\n",(bit32)(MSGUCfgTblDWIdx + MAIN_EVENT_LOG_OPTION), mainCfg.eventLogOption )); 2226285242Sachim SA_DBG3(("mpiInitialize: Offset 0x%08x upperIOPeventLogAddress 0x%x\n",(bit32)(MSGUCfgTblDWIdx + MAIN_IOP_EVENT_LOG_ADDR_HI), mainCfg.upperIOPeventLogAddress )); 2227285242Sachim SA_DBG3(("mpiInitialize: Offset 0x%08x lowerIOPeventLogAddress 0x%x\n",(bit32)(MSGUCfgTblDWIdx + MAIN_IOP_EVENT_LOG_ADDR_LO), mainCfg.lowerIOPeventLogAddress )); 2228285242Sachim SA_DBG3(("mpiInitialize: Offset 0x%08x IOPeventLogSize 0x%x\n",(bit32)(MSGUCfgTblDWIdx + MAIN_IOP_EVENT_LOG_BUFF_SIZE), mainCfg.IOPeventLogSize )); 2229285242Sachim SA_DBG3(("mpiInitialize: Offset 0x%08x IOPeventLogOption 0x%x\n",(bit32)(MSGUCfgTblDWIdx + MAIN_IOP_EVENT_LOG_OPTION), mainCfg.IOPeventLogOption )); 2230285242Sachim SA_DBG3(("mpiInitialize: Offset 0x%08x FatalErrorInterrupt 0x%x\n",(bit32)(MSGUCfgTblDWIdx + MAIN_FATAL_ERROR_INTERRUPT), mainCfg.FatalErrorInterrupt )); 2231285242Sachim SA_DBG3(("mpiInitialize: Offset 0x%08x PortRecoveryResetTimer 0x%x\n",(bit32)(MSGUCfgTblDWIdx + MAIN_PRECTD_PRESETD), mainCfg.portRecoveryResetTimer )); 2232285242Sachim 2233285242Sachim ossaHwRegWriteExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_IRAD_RESERVED), mainCfg.interruptReassertionDelay); 2234285242Sachim SA_DBG3(("mpiInitialize: Offset 0x%08x InterruptReassertionDelay 0x%x\n",(bit32)(MSGUCfgTblDWIdx + MAIN_IRAD_RESERVED), mainCfg.interruptReassertionDelay )); 2235285242Sachim 2236285242Sachim mIdx++; 2237285242Sachim 2238285242Sachim /* skip the ci and pi memory region */ 2239285242Sachim mIdx++; 2240285242Sachim mIdx++; 2241285242Sachim 2242285242Sachim smTrace(hpDBG_VERY_LOUD,"72",mIdx); 2243285242Sachim /* TP:72 mIdx */ 2244285242Sachim smTrace(hpDBG_VERY_LOUD,"Bc",maxinbound); 2245285242Sachim /* TP:Bc maxinbound */ 2246285242Sachim smTrace(hpDBG_VERY_LOUD,"Bd",pcibar); 2247285242Sachim /* TP:Bd pcibar */ 2248285242Sachim 2249285242Sachim /* index offset */ 2250285242Sachim indexoffset = 0; 2251285242Sachim memOffset = 0; 2252285242Sachim 2253285242Sachim /* Memory regions for the inbound queues */ 2254285242Sachim for(qIdx = 0; qIdx < maxinbound; qIdx++) 2255285242Sachim { 2256285242Sachim /* point back to the begin then plus offset to next queue */ 2257285242Sachim smTrace(hpDBG_VERY_LOUD,"Bd",pcibar); 2258285242Sachim /* TP:Bd pcibar */ 2259285242Sachim MSGUCfgTblDWIdx = saveOffset; 2260285242Sachim MSGUCfgTblDWIdx += inboundoffset; 2261285242Sachim MSGUCfgTblDWIdx += (sizeof(spc_inboundQueueDescriptor_t) * qIdx); 2262285242Sachim SA_DBG1(("mpiInitialize: A saveOffset 0x%x MSGUCfgTblDWIdx 0x%x\n",saveOffset ,MSGUCfgTblDWIdx)); 2263285242Sachim 2264285242Sachim /* if the MPI configuration says that this queue is disabled ... */ 2265285242Sachim if(0 == config->inboundQueues[qIdx].numElements) 2266285242Sachim { 2267285242Sachim /* ... Clears the configuration table for this queue */ 2268285242Sachim 2269285242Sachim inQueueCfg.elementPriSizeCount= 0; 2270285242Sachim inQueueCfg.upperBaseAddress = 0; 2271285242Sachim inQueueCfg.lowerBaseAddress = 0; 2272285242Sachim inQueueCfg.ciUpperBaseAddress = 0; 2273285242Sachim inQueueCfg.ciLowerBaseAddress = 0; 2274285242Sachim /* skip inQueueCfg.PIPCIBar (PM8000 write access) */ 2275285242Sachim /* skip inQueueCfg.PIOffset (PM8000 write access) */ 2276285242Sachim 2277285242Sachim /* Update the inbound configuration table in SPC GSM */ 2278285242Sachim mpiUpdateIBQueueCfgTable(agRoot, &inQueueCfg, MSGUCfgTblDWIdx, pcibar); 2279285242Sachim } 2280285242Sachim 2281285242Sachim /* If the queue is enabled, then ... */ 2282285242Sachim else 2283285242Sachim { 2284285242Sachim bit32 memSize = config->inboundQueues[qIdx].numElements * config->inboundQueues[qIdx].elementSize; 2285285242Sachim bit32 remainder = memSize & 127; 2286285242Sachim 2287285242Sachim /* Calculate the size of this queue padded to 128 bytes */ 2288285242Sachim if (remainder > 0) 2289285242Sachim { 2290285242Sachim memSize += (128 - remainder); 2291285242Sachim } 2292285242Sachim 2293285242Sachim /* ... first checks that the memory region has the right size */ 2294285242Sachim if( (memoryAllocated->region[mIdx].totalLength - memOffset < memSize) || 2295285242Sachim (NULL == memoryAllocated->region[mIdx].virtPtr) || 2296285242Sachim (0 == memoryAllocated->region[mIdx].totalLength)) 2297285242Sachim { 2298285242Sachim SA_DBG1(("mpiInitialize: ERROR The memory region does not have the right size for this inbound queue")); 2299285242Sachim smTraceFuncExit(hpDBG_VERY_LOUD, 'd', "m3"); 2300285242Sachim return AGSA_RC_FAILURE; 2301285242Sachim } 2302285242Sachim else 2303285242Sachim { 2304285242Sachim /* Then, using the MPI configuration argument, initializes the corresponding element on the saRoot */ 2305285242Sachim saRoot->inboundQueue[qIdx].numElements = config->inboundQueues[qIdx].numElements; 2306285242Sachim saRoot->inboundQueue[qIdx].elementSize = config->inboundQueues[qIdx].elementSize; 2307285242Sachim saRoot->inboundQueue[qIdx].priority = config->inboundQueues[qIdx].priority; 2308285242Sachim si_memcpy(&saRoot->inboundQueue[qIdx].memoryRegion, &memoryAllocated->region[mIdx], sizeof(mpiMem_t)); 2309285242Sachim saRoot->inboundQueue[qIdx].memoryRegion.virtPtr = 2310285242Sachim (bit8 *)saRoot->inboundQueue[qIdx].memoryRegion.virtPtr + memOffset; 2311285242Sachim saRoot->inboundQueue[qIdx].memoryRegion.physAddrLower += memOffset; 2312285242Sachim saRoot->inboundQueue[qIdx].memoryRegion.elementSize = memSize; 2313285242Sachim saRoot->inboundQueue[qIdx].memoryRegion.totalLength = memSize; 2314285242Sachim saRoot->inboundQueue[qIdx].memoryRegion.numElements = 1; 2315285242Sachim 2316285242Sachim /* Initialize the local copy of PIs, CIs */ 2317285242Sachim SA_DBG1(("mpiInitialize: queue %d PI CI zero\n",qIdx)); 2318285242Sachim saRoot->inboundQueue[qIdx].producerIdx = 0; 2319285242Sachim saRoot->inboundQueue[qIdx].consumerIdx = 0; 2320285242Sachim saRoot->inboundQueue[qIdx].agRoot = agRoot; 2321285242Sachim 2322285242Sachim /* MPI memory region for inbound CIs are 2 */ 2323285242Sachim saRoot->inboundQueue[qIdx].ciPointer = (((bit8 *)(memoryAllocated->region[MPI_CI_INDEX].virtPtr)) + qIdx * 4); 2324285242Sachim /* ... and in the local structure we will use to copy to the HW configuration table */ 2325285242Sachim 2326285242Sachim /* CI base address */ 2327285242Sachim inQueueCfg.elementPriSizeCount= config->inboundQueues[qIdx].numElements | 2328285242Sachim (config->inboundQueues[qIdx].elementSize << SHIFT16) | 2329285242Sachim (config->inboundQueues[qIdx].priority << SHIFT30); 2330285242Sachim inQueueCfg.upperBaseAddress = saRoot->inboundQueue[qIdx].memoryRegion.physAddrUpper; 2331285242Sachim inQueueCfg.lowerBaseAddress = saRoot->inboundQueue[qIdx].memoryRegion.physAddrLower; 2332285242Sachim inQueueCfg.ciUpperBaseAddress = memoryAllocated->region[MPI_CI_INDEX].physAddrUpper; 2333285242Sachim inQueueCfg.ciLowerBaseAddress = memoryAllocated->region[MPI_CI_INDEX].physAddrLower + qIdx * 4; 2334285242Sachim 2335285242Sachim /* write the configured data of inbound queue to SPC GSM */ 2336285242Sachim mpiUpdateIBQueueCfgTable(agRoot, &inQueueCfg, MSGUCfgTblDWIdx, pcibar); 2337285242Sachim /* get inbound PI PCI Bar and Offset */ 2338285242Sachim /* get the PI PCI Bar offset and convert it to logical BAR */ 2339285242Sachim IB_PIPCIBar = ossaHwRegReadExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + IB_PIPCI_BAR)); 2340285242Sachim saRoot->inboundQueue[qIdx].PIPCIBar = mpiGetPCIBarIndex(agRoot, IB_PIPCIBar); 2341285242Sachim saRoot->inboundQueue[qIdx].PIPCIOffset = ossaHwRegReadExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + IB_PIPCI_BAR_OFFSET)); 2342285242Sachim saRoot->inboundQueue[qIdx].qNumber = qIdx; 2343285242Sachim 2344285242Sachim memOffset += memSize; 2345285242Sachim 2346285242Sachim if ((0 == ((qIdx + 1) % MAX_QUEUE_EACH_MEM)) || 2347285242Sachim (qIdx == (maxinbound - 1))) 2348285242Sachim { 2349285242Sachim mIdx++; 2350285242Sachim indexoffset += MAX_QUEUE_EACH_MEM; 2351285242Sachim memOffset = 0; 2352285242Sachim } 2353285242Sachim 2354285242Sachim } /* else for memeory ok */ 2355285242Sachim } /* queue enable */ 2356285242Sachim } /* loop for inbound queue */ 2357285242Sachim 2358285242Sachim smTrace(hpDBG_VERY_LOUD,"73",0); 2359285242Sachim /* TP:73 outbound queues */ 2360285242Sachim 2361285242Sachim /* index offset */ 2362285242Sachim indexoffset = 0; 2363285242Sachim memOffset = 0; 2364285242Sachim /* Let's process the memory regions for the outbound queues */ 2365285242Sachim for(qIdx = 0; qIdx < maxoutbound; qIdx++) 2366285242Sachim { 2367285242Sachim /* point back to the begin then plus offset to next queue */ 2368285242Sachim MSGUCfgTblDWIdx = saveOffset; 2369285242Sachim MSGUCfgTblDWIdx += outboundoffset; 2370285242Sachim MSGUCfgTblDWIdx += (sizeof(spc_outboundQueueDescriptor_t) * qIdx); 2371285242Sachim 2372285242Sachim /* if the MPI configuration says that this queue is disabled ... */ 2373285242Sachim if(0 == config->outboundQueues[qIdx].numElements) 2374285242Sachim { 2375285242Sachim /* ... Clears the configuration table for this queue */ 2376285242Sachim outQueueCfg.upperBaseAddress = 0; 2377285242Sachim outQueueCfg.lowerBaseAddress = 0; 2378285242Sachim outQueueCfg.piUpperBaseAddress = 0; 2379285242Sachim outQueueCfg.piLowerBaseAddress = 0; 2380285242Sachim /* skip outQueueCfg.CIPCIBar = 0; read access only */ 2381285242Sachim /* skip outQueueCfg.CIOffset = 0; read access only */ 2382285242Sachim outQueueCfg.elementSizeCount = 0; 2383285242Sachim outQueueCfg.interruptVecCntDelay = 0; 2384285242Sachim 2385285242Sachim /* Updated the configuration table in SPC GSM */ 2386285242Sachim mpiUpdateOBQueueCfgTable(agRoot, &outQueueCfg, MSGUCfgTblDWIdx, pcibar); 2387285242Sachim } 2388285242Sachim 2389285242Sachim /* If the outbound queue is enabled, then ... */ 2390285242Sachim else 2391285242Sachim { 2392285242Sachim bit32 memSize = config->outboundQueues[qIdx].numElements * config->outboundQueues[qIdx].elementSize; 2393285242Sachim bit32 remainder = memSize & 127; 2394285242Sachim 2395285242Sachim /* Calculate the size of this queue padded to 128 bytes */ 2396285242Sachim if (remainder > 0) 2397285242Sachim { 2398285242Sachim memSize += (128 - remainder); 2399285242Sachim } 2400285242Sachim 2401285242Sachim /* ... first checks that the memory region has the right size */ 2402285242Sachim if((memoryAllocated->region[mIdx].totalLength - memOffset < memSize) || 2403285242Sachim (NULL == memoryAllocated->region[mIdx].virtPtr) || 2404285242Sachim (0 == memoryAllocated->region[mIdx].totalLength)) 2405285242Sachim { 2406285242Sachim SA_DBG1(("ERROR: The memory region does not have the right size for this outbound queue")); 2407285242Sachim smTraceFuncExit(hpDBG_VERY_LOUD, 'e', "m3"); 2408285242Sachim return AGSA_RC_FAILURE; 2409285242Sachim } 2410285242Sachim else 2411285242Sachim { 2412285242Sachim /* Then, using the MPI configuration argument, initializes the corresponding element on the MPI context ... */ 2413285242Sachim saRoot->outboundQueue[qIdx].numElements = config->outboundQueues[qIdx].numElements; 2414285242Sachim saRoot->outboundQueue[qIdx].elementSize = config->outboundQueues[qIdx].elementSize; 2415285242Sachim si_memcpy(&saRoot->outboundQueue[qIdx].memoryRegion, &memoryAllocated->region[mIdx], sizeof(mpiMem_t)); 2416285242Sachim saRoot->outboundQueue[qIdx].memoryRegion.virtPtr = 2417285242Sachim (bit8 *)saRoot->outboundQueue[qIdx].memoryRegion.virtPtr + memOffset; 2418285242Sachim saRoot->outboundQueue[qIdx].memoryRegion.physAddrLower += memOffset; 2419285242Sachim saRoot->outboundQueue[qIdx].memoryRegion.elementSize = memSize; 2420285242Sachim saRoot->outboundQueue[qIdx].memoryRegion.totalLength = memSize; 2421285242Sachim saRoot->outboundQueue[qIdx].memoryRegion.numElements = 1; 2422285242Sachim saRoot->outboundQueue[qIdx].producerIdx = 0; 2423285242Sachim saRoot->outboundQueue[qIdx].consumerIdx = 0; 2424285242Sachim saRoot->outboundQueue[qIdx].agRoot = agRoot; 2425285242Sachim 2426285242Sachim /* MPI memory region for outbound PIs are 3 */ 2427285242Sachim saRoot->outboundQueue[qIdx].piPointer = (((bit8 *)(memoryAllocated->region[MPI_CI_INDEX + 1].virtPtr))+ qIdx * 4); 2428285242Sachim /* ... and in the local structure we will use to copy to the HW configuration table */ 2429285242Sachim outQueueCfg.upperBaseAddress = saRoot->outboundQueue[qIdx].memoryRegion.physAddrUpper; 2430285242Sachim outQueueCfg.lowerBaseAddress = saRoot->outboundQueue[qIdx].memoryRegion.physAddrLower; 2431285242Sachim 2432285242Sachim /* PI base address */ 2433285242Sachim outQueueCfg.piUpperBaseAddress = memoryAllocated->region[MPI_CI_INDEX + 1].physAddrUpper; 2434285242Sachim outQueueCfg.piLowerBaseAddress = memoryAllocated->region[MPI_CI_INDEX + 1].physAddrLower + qIdx * 4; 2435285242Sachim outQueueCfg.elementSizeCount = config->outboundQueues[qIdx].numElements | 2436285242Sachim (config->outboundQueues[qIdx].elementSize << SHIFT16); 2437285242Sachim 2438285242Sachim /* enable/disable interrupt - use saSystemInterruptsActive() API */ 2439285242Sachim /* instead of ossaHwRegWrite(agRoot, MSGU_ODMR, 0); */ 2440285242Sachim /* Outbound Doorbell Auto disable */ 2441285242Sachim /* LL does not use ossaHwRegWriteExt(agRoot, PCIBAR1, SPC_ODAR, 0xffffffff); */ 2442285242Sachim if (config->outboundQueues[qIdx].interruptEnable) 2443285242Sachim { 2444285242Sachim /* enable interrupt flag bit30 of outbound table */ 2445285242Sachim outQueueCfg.elementSizeCount |= OB_PROPERTY_INT_ENABLE; 2446285242Sachim } 2447285242Sachim if(smIS_SPCV(agRoot)) 2448285242Sachim { 2449285242Sachim outQueueCfg.interruptVecCntDelay = ((config->outboundQueues[qIdx].interruptVector & INT_VEC_BITS ) << SHIFT24); 2450285242Sachim } 2451285242Sachim else 2452285242Sachim { 2453285242Sachim outQueueCfg.interruptVecCntDelay = (config->outboundQueues[qIdx].interruptDelay & INT_DELAY_BITS) | 2454285242Sachim ((config->outboundQueues[qIdx].interruptThreshold & INT_THR_BITS ) << SHIFT16) | 2455285242Sachim ((config->outboundQueues[qIdx].interruptVector & INT_VEC_BITS ) << SHIFT24); 2456285242Sachim } 2457285242Sachim 2458285242Sachim /* create a VectorIndex Bit Map */ 2459285242Sachim if (qIdx < OQ_NUM_32) 2460285242Sachim { 2461285242Sachim saRoot->interruptVecIndexBitMap[config->outboundQueues[qIdx].interruptVector] |= (1 << qIdx); 2462285242Sachim SA_DBG2(("mpiInitialize:below 32 saRoot->interruptVecIndexBitMap[config->outboundQueues[qIdx].interruptVector] 0x%08x\n",saRoot->interruptVecIndexBitMap[config->outboundQueues[qIdx].interruptVector])); 2463285242Sachim } 2464285242Sachim else 2465285242Sachim { 2466285242Sachim saRoot->interruptVecIndexBitMap1[config->outboundQueues[qIdx].interruptVector] |= (1 << (qIdx - OQ_NUM_32)); 2467285242Sachim SA_DBG2(("mpiInitialize:Above 32 saRoot->interruptVecIndexBitMap1[config->outboundQueues[qIdx].interruptVector] 0x%08x\n",saRoot->interruptVecIndexBitMap1[config->outboundQueues[qIdx].interruptVector])); 2468285242Sachim } 2469285242Sachim /* Update the outbound configuration table */ 2470285242Sachim mpiUpdateOBQueueCfgTable(agRoot, &outQueueCfg, MSGUCfgTblDWIdx, pcibar); 2471285242Sachim 2472285242Sachim /* read the CI PCIBar offset and convert it to logical bar */ 2473285242Sachim OB_CIPCIBar = ossaHwRegReadExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + OB_CIPCI_BAR)); 2474285242Sachim saRoot->outboundQueue[qIdx].CIPCIBar = mpiGetPCIBarIndex(agRoot, OB_CIPCIBar); 2475285242Sachim saRoot->outboundQueue[qIdx].CIPCIOffset = ossaHwRegReadExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + OB_CIPCI_BAR_OFFSET)); 2476285242Sachim saRoot->outboundQueue[qIdx].DIntTOffset = ossaHwRegReadExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + OB_DYNAMIC_COALES_OFFSET)); 2477285242Sachim saRoot->outboundQueue[qIdx].qNumber = qIdx; 2478285242Sachim 2479285242Sachim memOffset += memSize; 2480285242Sachim 2481285242Sachim if ((0 == ((qIdx + 1) % MAX_QUEUE_EACH_MEM)) || 2482285242Sachim (qIdx == (maxoutbound - 1))) 2483285242Sachim { 2484285242Sachim mIdx++; 2485285242Sachim indexoffset += MAX_QUEUE_EACH_MEM; 2486285242Sachim memOffset =0; 2487285242Sachim } 2488285242Sachim } 2489285242Sachim } 2490285242Sachim } 2491285242Sachim 2492285242Sachim /* calculate number of vectors */ 2493285242Sachim saRoot->numInterruptVectors = 0; 2494285242Sachim for (qIdx = 0; qIdx < MAX_NUM_VECTOR; qIdx++) 2495285242Sachim { 2496285242Sachim if ((saRoot->interruptVecIndexBitMap[qIdx]) || (saRoot->interruptVecIndexBitMap1[qIdx])) 2497285242Sachim { 2498285242Sachim (saRoot->numInterruptVectors)++; 2499285242Sachim } 2500285242Sachim } 2501285242Sachim 2502285242Sachim SA_DBG2(("mpiInitialize:(saRoot->numInterruptVectors) 0x%x\n",(saRoot->numInterruptVectors))); 2503285242Sachim 2504285242Sachim if(smIS_SPCV(agRoot)) 2505285242Sachim { 2506285242Sachim /* setup interrupt vector table */ 2507285242Sachim mpiWrIntVecTable(agRoot,config); 2508285242Sachim } 2509285242Sachim 2510285242Sachim if(smIS_SPCV(agRoot)) 2511285242Sachim { 2512285242Sachim mpiWrAnalogSetupTable(agRoot,config); 2513285242Sachim } 2514285242Sachim 2515285242Sachim /* setup phy analog registers */ 2516285242Sachim mpiWriteCALAll(agRoot, &config->phyAnalogConfig); 2517285242Sachim 2518285242Sachim { 2519285242Sachim bit32 pcibar = 0; 2520285242Sachim bit32 TableOffset; 2521285242Sachim pcibar = siGetPciBar(agRoot); 2522285242Sachim TableOffset = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_0,MSGU_SCRATCH_PAD_0); 2523285242Sachim TableOffset &= SCRATCH_PAD0_OFFSET_MASK; 2524285242Sachim SA_DBG1(("mpiInitialize: mpiContextTable TableOffset 0x%08X contains 0x%08X\n",TableOffset,ossaHwRegReadExt(agRoot, pcibar, TableOffset ))); 2525285242Sachim 2526285242Sachim SA_ASSERT( (ossaHwRegReadExt(agRoot, pcibar, TableOffset ) == 0x53434D50), "Config table signiture"); 2527285242Sachim 2528285242Sachim SA_DBG1(("mpiInitialize: AGSA_MPI_MAIN_CONFIGURATION_TABLE 0x%08X\n", 0)); 2529285242Sachim SA_DBG1(("mpiInitialize: AGSA_MPI_GENERAL_STATUS_TABLE 0x%08X\n", (ossaHwRegReadExt(agRoot, pcibar, TableOffset+MAIN_GST_OFFSET) & 0xFFFF ))); 2530285242Sachim SA_DBG1(("mpiInitialize: AGSA_MPI_INBOUND_QUEUE_CONFIGURATION_TABLE 0x%08X\n", (ossaHwRegReadExt(agRoot, pcibar, TableOffset+MAIN_IBQ_OFFSET) & 0xFFFF))); 2531285242Sachim SA_DBG1(("mpiInitialize: AGSA_MPI_OUTBOUND_QUEUE_CONFIGURATION_TABLE 0x%08X\n", (ossaHwRegReadExt(agRoot, pcibar, TableOffset+MAIN_OBQ_OFFSET) & 0xFFFF))); 2532285242Sachim SA_DBG1(("mpiInitialize: AGSA_MPI_SAS_PHY_ANALOG_SETUP_TABLE 0x%08X\n", (ossaHwRegReadExt(agRoot, pcibar, TableOffset+MAIN_ANALOG_SETUP_OFFSET) & 0xFFFF ))); 2533285242Sachim SA_DBG1(("mpiInitialize: AGSA_MPI_INTERRUPT_VECTOR_TABLE 0x%08X\n", (ossaHwRegReadExt(agRoot, pcibar, TableOffset+MAIN_INT_VEC_TABLE_OFFSET) & 0xFFFF))); 2534285242Sachim SA_DBG1(("mpiInitialize: AGSA_MPI_PER_SAS_PHY_ATTRIBUTE_TABLE 0x%08X\n", (ossaHwRegReadExt(agRoot, pcibar, TableOffset+MAIN_PHY_ATTRIBUTE_OFFSET) & 0xFFFF))); 2535285242Sachim SA_DBG1(("mpiInitialize: AGSA_MPI_OUTBOUND_QUEUE_FAILOVER_TABLE 0x%08X\n", (ossaHwRegReadExt(agRoot, pcibar, TableOffset+MAIN_MOQFOT_MOQFOES) & 0xFFFF))); 2536285242Sachim 2537285242Sachim } 2538285242Sachim 2539285242Sachim if(agNULL != saRoot->swConfig.mpiContextTable ) 2540285242Sachim { 2541285242Sachim agsaMPIContext_t * context = (agsaMPIContext_t * )saRoot->swConfig.mpiContextTable; 2542285242Sachim bit32 length = saRoot->swConfig.mpiContextTablelen; 2543285242Sachim bit32 pcibar = 0; 2544285242Sachim bit32 TableOffset; 2545285242Sachim pcibar = siGetPciBar(agRoot); 2546285242Sachim TableOffset = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_0,MSGU_SCRATCH_PAD_0); 2547285242Sachim TableOffset &= SCRATCH_PAD0_OFFSET_MASK; 2548285242Sachim SA_DBG1(("mpiInitialize: mpiContextTable TableOffset 0x%08X contains 0x%08X\n",TableOffset,ossaHwRegReadExt(agRoot, pcibar, TableOffset ))); 2549285242Sachim 2550285242Sachim SA_ASSERT( (ossaHwRegReadExt(agRoot, pcibar, TableOffset ) == 0x53434D50), "Config table signiture"); 2551285242Sachim if ( (ossaHwRegReadExt(agRoot, pcibar, TableOffset ) != 0x53434D50)) 2552285242Sachim { 2553285242Sachim SA_DBG1(("mpiInitialize: TableOffset 0x%x reads 0x%x expect 0x%x \n",TableOffset,ossaHwRegReadExt(agRoot, pcibar, TableOffset ),0x53434D50)); 2554285242Sachim } 2555285242Sachim 2556285242Sachim if(context ) 2557285242Sachim { 2558285242Sachim SA_DBG1(("mpiInitialize: MPITableType 0x%x context->offset 0x%x context->value 0x%x\n",context->MPITableType,context->offset,context->value)); 2559285242Sachim while( length != 0) 2560285242Sachim { 2561285242Sachim switch(context->MPITableType) 2562285242Sachim { 2563285242Sachim 2564285242Sachim bit32 OffsetInMain; 2565285242Sachim case AGSA_MPI_MAIN_CONFIGURATION_TABLE: 2566285242Sachim SA_DBG1(("mpiInitialize: AGSA_MPI_MAIN_CONFIGURATION_TABLE %d 0x%x + 0x%x = 0x%x\n",context->MPITableType,TableOffset, context->offset, context->value)); 2567285242Sachim OffsetInMain = TableOffset; 2568285242Sachim ossaHwRegWriteExt(agRoot, pcibar, OffsetInMain + (context->offset * 4) , context->value); 2569285242Sachim break; 2570285242Sachim case AGSA_MPI_GENERAL_STATUS_TABLE: 2571285242Sachim 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 )); 2572285242Sachim OffsetInMain = (ossaHwRegReadExt(agRoot, pcibar, TableOffset+MAIN_GST_OFFSET ) & 0xFFFF) + TableOffset; 2573285242Sachim ossaHwRegWriteExt(agRoot, pcibar, OffsetInMain + (context->offset * 4), context->value); 2574285242Sachim break; 2575285242Sachim case AGSA_MPI_INBOUND_QUEUE_CONFIGURATION_TABLE: 2576285242Sachim 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)); 2577285242Sachim OffsetInMain = (ossaHwRegReadExt(agRoot, pcibar, TableOffset+MAIN_IBQ_OFFSET ) & 0xFFFF) + TableOffset; 2578285242Sachim ossaHwRegWriteExt(agRoot, pcibar, OffsetInMain + (context->offset * 4), context->value); 2579285242Sachim break; 2580285242Sachim case AGSA_MPI_OUTBOUND_QUEUE_CONFIGURATION_TABLE: 2581285242Sachim 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)); 2582285242Sachim OffsetInMain = (ossaHwRegReadExt(agRoot, pcibar, TableOffset+MAIN_OBQ_OFFSET ) & 0xFFFF) + TableOffset; 2583285242Sachim ossaHwRegWriteExt(agRoot, pcibar, OffsetInMain + (context->offset * 4), context->value); 2584285242Sachim break; 2585285242Sachim case AGSA_MPI_SAS_PHY_ANALOG_SETUP_TABLE: 2586285242Sachim 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)); 2587285242Sachim OffsetInMain = (ossaHwRegReadExt(agRoot, pcibar, TableOffset+ MAIN_ANALOG_SETUP_OFFSET) & 0xFFFF) + TableOffset; 2588285242Sachim ossaHwRegWriteExt(agRoot, pcibar, OffsetInMain + (context->offset * 4), context->value); 2589285242Sachim break; 2590285242Sachim case AGSA_MPI_INTERRUPT_VECTOR_TABLE: 2591285242Sachim 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)); 2592285242Sachim OffsetInMain = (ossaHwRegReadExt(agRoot, pcibar, TableOffset+ MAIN_INT_VEC_TABLE_OFFSET) & 0xFFFF) + TableOffset; 2593285242Sachim ossaHwRegWriteExt(agRoot, pcibar, OffsetInMain + (context->offset * 4), context->value); 2594285242Sachim break; 2595285242Sachim case AGSA_MPI_PER_SAS_PHY_ATTRIBUTE_TABLE: 2596285242Sachim 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)); 2597285242Sachim OffsetInMain = (ossaHwRegReadExt(agRoot, pcibar, TableOffset+MAIN_PHY_ATTRIBUTE_OFFSET ) & 0xFFFF) + TableOffset; 2598285242Sachim ossaHwRegWriteExt(agRoot, pcibar, OffsetInMain + (context->offset * 4), context->value); 2599285242Sachim break; 2600285242Sachim case AGSA_MPI_OUTBOUND_QUEUE_FAILOVER_TABLE: 2601285242Sachim 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)); 2602285242Sachim OffsetInMain = (ossaHwRegReadExt(agRoot, pcibar, TableOffset+MAIN_MOQFOT_MOQFOES ) & 0xFFFF) + TableOffset; 2603285242Sachim ossaHwRegWriteExt(agRoot, pcibar, OffsetInMain + (context->offset * 4), context->value); 2604285242Sachim break; 2605285242Sachim default: 2606285242Sachim SA_DBG1(("mpiInitialize: error MPITableType unknown %d offset 0x%x value 0x%x\n",context->MPITableType, context->offset, context->value)); 2607285242Sachim break; 2608285242Sachim } 2609285242Sachim if(smIS_SPC12V(agRoot)) 2610285242Sachim { 2611285242Sachim if (saRoot->ControllerInfo.fwInterfaceRev > 0x301 ) 2612285242Sachim { 2613285242Sachim SA_DBG1(("mpiInitialize: MAIN_AWT_MIDRANGE 0x%08X\n", 2614285242Sachim ossaHwRegReadExt(agRoot, pcibar, TableOffset + MAIN_AWT_MIDRANGE) 2615285242Sachim )); 2616285242Sachim } 2617285242Sachim } 2618285242Sachim if(length >= sizeof(agsaMPIContext_t)) 2619285242Sachim { 2620285242Sachim length -= sizeof(agsaMPIContext_t); 2621285242Sachim context++; 2622285242Sachim 2623285242Sachim } 2624285242Sachim else 2625285242Sachim { 2626285242Sachim length = 0; 2627285242Sachim } 2628285242Sachim } 2629285242Sachim 2630285242Sachim } 2631285242Sachim 2632285242Sachim SA_DBG1(("mpiInitialize: context %p saRoot->swConfig.mpiContextTable %p %d\n",context,saRoot->swConfig.mpiContextTable,context == saRoot->swConfig.mpiContextTable ? 1 : 0)); 2633285242Sachim 2634285242Sachim if ( (ossaHwRegReadExt(agRoot, pcibar, TableOffset ) != 0x53434D50)) 2635285242Sachim { 2636285242Sachim SA_DBG1(("mpiInitialize:TableOffset 0x%x reads 0x%x expect 0x%x \n",TableOffset,ossaHwRegReadExt(agRoot, pcibar, TableOffset ),0x53434D50)); 2637285242Sachim } 2638285242Sachim 2639285242Sachim SA_ASSERT( (ossaHwRegReadExt(agRoot, pcibar, TableOffset ) == 0x53434D50), "Config table signiture After"); 2640285242Sachim } 2641285242Sachim /* At this point the Message Unit configuration table is set up. Now we need to ring the doorbell */ 2642285242Sachim togglevalue = 0; 2643285242Sachim 2644285242Sachim smTrace(hpDBG_VERY_LOUD,"74", siHalRegReadExt(agRoot, GEN_MSGU_IBDB_SET, MSGU_IBDB_SET )); 2645285242Sachim /* TP:74 Doorbell */ 2646285242Sachim 2647285242Sachim /* Write bit0=1 to Inbound DoorBell Register to tell the SPC FW the table is updated */ 2648285242Sachim siHalRegWriteExt(agRoot, GEN_MSGU_IBDB_SET, MSGU_IBDB_SET, SPC_MSGU_CFG_TABLE_UPDATE); 2649285242Sachim 2650285242Sachim if(siHalRegReadExt(agRoot, GEN_MSGU_IBDB_SET, MSGU_IBDB_SET ) & SPC_MSGU_CFG_TABLE_UPDATE) 2651285242Sachim { 2652285242Sachim SA_DBG1(("mpiInitialize: SPC_MSGU_CFG_TABLE_UPDATE (0x%X) \n", siHalRegReadExt(agRoot, GEN_MSGU_IBDB_SET, MSGU_IBDB_SET))); 2653285242Sachim } 2654285242Sachim else 2655285242Sachim { 2656285242Sachim SA_DBG1(("mpiInitialize: SPC_MSGU_CFG_TABLE_UPDATE not set (0x%X)\n", siHalRegReadExt(agRoot, GEN_MSGU_IBDB_SET, MSGU_IBDB_SET))); 2657285242Sachim ossaStallThread(agRoot, WAIT_INCREMENT); 2658285242Sachim } 2659285242Sachim 2660285242Sachim smTrace(hpDBG_VERY_LOUD,"A5", siHalRegReadExt(agRoot, GEN_MSGU_IBDB_SET, MSGU_IBDB_SET )); 2661285242Sachim /* TP:A5 Doorbell */ 2662285242Sachim 2663285242Sachim/* 2664285242Sachim// ossaHwRegWrite(agRoot, MSGU_IBDB_SET, SPC_MSGU_CFG_TABLE_UPDATE); 2665285242Sachim MSGU_WRITE_IDR(SPC_MSGU_CFG_TABLE_UPDATE); 2666285242Sachim*/ 2667285242Sachim 2668285242Sachim 2669285242Sachim /* wait until Inbound DoorBell Clear Register toggled */ 2670285242SachimWaitLonger: 2671285242Sachim max_wait_time = WAIT_SECONDS(gWait_2); /* 2 sec */ 2672285242Sachim max_wait_count = MAKE_MODULO(max_wait_time,WAIT_INCREMENT); 2673285242Sachim do 2674285242Sachim { 2675285242Sachim ossaStallThread(agRoot, WAIT_INCREMENT); 2676285242Sachim value = MSGU_READ_IDR; 2677285242Sachim value &= SPC_MSGU_CFG_TABLE_UPDATE; 2678285242Sachim } while ((value != togglevalue) && (max_wait_count -= WAIT_INCREMENT)); 2679285242Sachim 2680285242Sachim smTrace(hpDBG_VERY_LOUD,"80", max_wait_count); 2681285242Sachim /* TP:80 TP max_wait_count */ 2682285242Sachim if (!max_wait_count && mpiStartToggleFailed < 5 ) 2683285242Sachim { 2684285242Sachim SA_DBG1(("mpiInitialize: mpiStartToggleFailed count %d\n", mpiStartToggleFailed)); 2685285242Sachim mpiStartToggleFailed++; 2686285242Sachim goto WaitLonger; 2687285242Sachim } 2688285242Sachim 2689285242Sachim if (!max_wait_count ) 2690285242Sachim { 2691285242Sachim 2692285242Sachim SA_DBG1(("mpiInitialize: TIMEOUT:IBDB value/toggle = 0x%x 0x%x\n", value, togglevalue)); 2693285242Sachim MSGUCfgTblDWIdx = saveOffset; 2694285242Sachim GSTLenMPIS = ossaHwRegReadExt(agRoot, pcibar, (bit32)MSGUCfgTblDWIdx + (bit32)(mainCfg.GSTOffset + GST_GSTLEN_MPIS_OFFSET)); 2695285242Sachim SA_DBG1(("mpiInitialize: MPI State = 0x%x\n", GSTLenMPIS)); 2696285242Sachim smTraceFuncExit(hpDBG_VERY_LOUD, 'f', "m3"); 2697285242Sachim return AGSA_RC_FAILURE; 2698285242Sachim } 2699285242Sachim smTrace(hpDBG_VERY_LOUD,"81", mpiStartToggleFailed ); 2700285242Sachim /* TP:81 TP */ 2701285242Sachim 2702285242Sachim /* check the MPI-State for initialization */ 2703285242Sachim MSGUCfgTblDWIdx = saveOffset; 2704285242Sachim GSTLenMPIS = ossaHwRegReadExt(agRoot, pcibar, (bit32)MSGUCfgTblDWIdx + (bit32)(mainCfg.GSTOffset + GST_GSTLEN_MPIS_OFFSET)); 2705285242Sachim if ( (GST_MPI_STATE_UNINIT == (GSTLenMPIS & GST_MPI_STATE_MASK)) && ( mpiUnInitFailed < 5 ) ) 2706285242Sachim { 2707285242Sachim SA_DBG1(("mpiInitialize: MPI State = 0x%x mpiUnInitFailed count %d\n", GSTLenMPIS & GST_MPI_STATE_MASK,mpiUnInitFailed)); 2708285242Sachim ossaStallThread(agRoot, (20 * 1000)); 2709285242Sachim 2710285242Sachim mpiUnInitFailed++; 2711285242Sachim goto WaitLonger; 2712285242Sachim } 2713285242Sachim 2714285242Sachim if (GST_MPI_STATE_INIT != (GSTLenMPIS & GST_MPI_STATE_MASK)) 2715285242Sachim { 2716285242Sachim SA_DBG1(("mpiInitialize: Error Not GST_MPI_STATE_INIT MPI State = 0x%x\n", GSTLenMPIS & GST_MPI_STATE_MASK)); 2717285242Sachim smTraceFuncExit(hpDBG_VERY_LOUD, 'g', "m3"); 2718285242Sachim return AGSA_RC_FAILURE; 2719285242Sachim } 2720285242Sachim smTrace(hpDBG_VERY_LOUD,"82", 0); 2721285242Sachim /* TP:82 TP */ 2722285242Sachim 2723285242Sachim /* check MPI Initialization error */ 2724285242Sachim GSTLenMPIS = GSTLenMPIS >> SHIFT16; 2725285242Sachim if (0x0000 != GSTLenMPIS) 2726285242Sachim { 2727285242Sachim SA_DBG1(("mpiInitialize: MPI Error = 0x%x\n", GSTLenMPIS)); 2728285242Sachim smTraceFuncExit(hpDBG_VERY_LOUD, 'h', "m3"); 2729285242Sachim return AGSA_RC_FAILURE; 2730285242Sachim } 2731285242Sachim smTrace(hpDBG_VERY_LOUD,"83", 0); 2732285242Sachim /* TP:83 TP */ 2733285242Sachim 2734285242Sachim /* reread IQ PI offset from SPC if IQ/OQ > 32 */ 2735285242Sachim if ((maxinbound > IQ_NUM_32) || (maxoutbound > OQ_NUM_32)) 2736285242Sachim { 2737285242Sachim for(qIdx = 0; qIdx < maxinbound; qIdx++) 2738285242Sachim { 2739285242Sachim /* point back to the begin then plus offset to next queue */ 2740285242Sachim MSGUCfgTblDWIdx = saveOffset; 2741285242Sachim MSGUCfgTblDWIdx += inboundoffset; 2742285242Sachim MSGUCfgTblDWIdx += (sizeof(spc_inboundQueueDescriptor_t) * qIdx); 2743285242Sachim saRoot->inboundQueue[qIdx].PIPCIOffset = ossaHwRegReadExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + IB_PIPCI_BAR_OFFSET)); 2744285242Sachim } 2745285242Sachim } 2746285242Sachim smTrace(hpDBG_VERY_LOUD,"84", 0); 2747285242Sachim /* TP:84 TP */ 2748285242Sachim 2749285242Sachim /* at least one inbound queue and one outbound queue enabled */ 2750285242Sachim if ((0 == config->inboundQueues[0].numElements) || (0 == config->outboundQueues[0].numElements)) 2751285242Sachim { 2752285242Sachim SA_DBG1(("mpiInitialize: Error,IQ0 or OQ0 have to enable\n")); 2753285242Sachim smTraceFuncExit(hpDBG_VERY_LOUD, 'i', "m3"); 2754285242Sachim return AGSA_RC_FAILURE; 2755285242Sachim } 2756285242Sachim smTrace(hpDBG_VERY_LOUD,"85", 0); 2757285242Sachim /* TP:85 TP */ 2758285242Sachim 2759285242Sachim /* clean the inbound queues */ 2760285242Sachim for (i = 0; i < config->numInboundQueues; i ++) 2761285242Sachim { 2762285242Sachim if(0 != config->inboundQueues[i].numElements) 2763285242Sachim { 2764285242Sachim circularIQ = &saRoot->inboundQueue[i]; 2765285242Sachim si_memset(circularIQ->memoryRegion.virtPtr, 0, circularIQ->memoryRegion.totalLength); 2766285242Sachim si_memset(saRoot->inboundQueue[i].ciPointer, 0, sizeof(bit32)); 2767285242Sachim 2768285242Sachim if(smIS_SPCV(agRoot)) 2769285242Sachim { 2770285242Sachim ossaHwRegWriteExt(circularIQ->agRoot, circularIQ->PIPCIBar, circularIQ->PIPCIOffset, 0); 2771285242Sachim SA_DBG1(("mpiInitialize: SPC V writes IQ %2d offset 0x%x\n",i ,circularIQ->PIPCIOffset)); 2772285242Sachim } 2773285242Sachim } 2774285242Sachim } 2775285242Sachim smTrace(hpDBG_VERY_LOUD,"86", 0); 2776285242Sachim /* TP:86 TP */ 2777285242Sachim 2778285242Sachim /* clean the outbound queues */ 2779285242Sachim for (i = 0; i < config->numOutboundQueues; i ++) 2780285242Sachim { 2781285242Sachim if(0 != config->outboundQueues[i].numElements) 2782285242Sachim { 2783285242Sachim circularOQ = &saRoot->outboundQueue[i]; 2784285242Sachim si_memset(circularOQ->memoryRegion.virtPtr, 0, circularOQ->memoryRegion.totalLength); 2785285242Sachim si_memset(saRoot->outboundQueue[i].piPointer, 0, sizeof(bit32)); 2786285242Sachim if(smIS_SPCV(agRoot)) 2787285242Sachim { 2788285242Sachim ossaHwRegWriteExt(circularOQ->agRoot, circularOQ->CIPCIBar, circularOQ->CIPCIOffset, 0); 2789285242Sachim SA_DBG2(("mpiInitialize: SPC V writes OQ %2d offset 0x%x\n",i ,circularOQ->CIPCIOffset)); 2790285242Sachim } 2791285242Sachim 2792285242Sachim } 2793285242Sachim } 2794285242Sachim 2795285242Sachim 2796285242Sachim smTrace(hpDBG_VERY_LOUD,"75",0); 2797285242Sachim /* TP:75 AAP1 IOP */ 2798285242Sachim 2799285242Sachim /* read back AAP1 and IOP event log address and size */ 2800285242Sachim MSGUCfgTblDWIdx = saveOffset; 2801285242Sachim value = ossaHwRegReadExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_EVENT_LOG_ADDR_HI)); 2802285242Sachim saRoot->mainConfigTable.upperEventLogAddress = value; 2803285242Sachim SA_DBG1(("mpiInitialize: upperEventLogAddress 0x%x\n", value)); 2804285242Sachim value = ossaHwRegReadExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_EVENT_LOG_ADDR_LO)); 2805285242Sachim saRoot->mainConfigTable.lowerEventLogAddress = value; 2806285242Sachim SA_DBG1(("mpiInitialize: lowerEventLogAddress 0x%x\n", value)); 2807285242Sachim value = ossaHwRegReadExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_EVENT_LOG_BUFF_SIZE)); 2808285242Sachim saRoot->mainConfigTable.eventLogSize = value; 2809285242Sachim SA_DBG1(("mpiInitialize: eventLogSize 0x%x\n", value)); 2810285242Sachim value = ossaHwRegReadExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_EVENT_LOG_OPTION)); 2811285242Sachim saRoot->mainConfigTable.eventLogOption = value; 2812285242Sachim SA_DBG1(("mpiInitialize: eventLogOption 0x%x\n", value)); 2813285242Sachim SA_DBG1(("mpiInitialize: EventLog dd /p %08X`%08X L %x\n",saRoot->mainConfigTable.upperEventLogAddress,saRoot->mainConfigTable.lowerEventLogAddress,saRoot->mainConfigTable.eventLogSize/4 )); 2814285242Sachim 2815285242Sachim value = ossaHwRegReadExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_IOP_EVENT_LOG_ADDR_HI)); 2816285242Sachim saRoot->mainConfigTable.upperIOPeventLogAddress = value; 2817285242Sachim SA_DBG1(("mpiInitialize: upperIOPLogAddress 0x%x\n", value)); 2818285242Sachim value = ossaHwRegReadExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_IOP_EVENT_LOG_ADDR_LO)); 2819285242Sachim saRoot->mainConfigTable.lowerIOPeventLogAddress = value; 2820285242Sachim SA_DBG1(("mpiInitialize: lowerIOPLogAddress 0x%x\n", value)); 2821285242Sachim SA_DBG1(("mpiInitialize: IOPLog dd /p %08X`%08X L %x\n",saRoot->mainConfigTable.upperIOPeventLogAddress,saRoot->mainConfigTable.lowerIOPeventLogAddress,saRoot->mainConfigTable.IOPeventLogSize/4 )); 2822285242Sachim value = ossaHwRegReadExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_IOP_EVENT_LOG_BUFF_SIZE)); 2823285242Sachim saRoot->mainConfigTable.IOPeventLogSize = value; 2824285242Sachim SA_DBG1(("mpiInitialize: IOPeventLogSize 0x%x\n", value)); 2825285242Sachim value = ossaHwRegReadExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_IOP_EVENT_LOG_OPTION)); 2826285242Sachim saRoot->mainConfigTable.IOPeventLogOption = value; 2827285242Sachim SA_DBG1(("mpiInitialize: IOPeventLogOption 0x%x\n", value)); 2828285242Sachim value = ossaHwRegReadExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_FATAL_ERROR_INTERRUPT)); 2829285242Sachim 2830285242Sachim#ifdef SA_PRINTOUT_IN_WINDBG 2831285242Sachim#ifndef DBG 2832285242Sachim DbgPrint("mpiInitialize: EventLog (%d) dd /p %08X`%08X L %x\n", 2833285242Sachim saRoot->mainConfigTable.eventLogOption, 2834285242Sachim saRoot->mainConfigTable.upperEventLogAddress, 2835285242Sachim saRoot->mainConfigTable.lowerEventLogAddress, 2836285242Sachim saRoot->mainConfigTable.eventLogSize/4 ); 2837285242Sachim DbgPrint("mpiInitialize: IOPLog (%d) dd /p %08X`%08X L %x\n", 2838285242Sachim saRoot->mainConfigTable.IOPeventLogOption, 2839285242Sachim saRoot->mainConfigTable.upperIOPeventLogAddress, 2840285242Sachim saRoot->mainConfigTable.lowerIOPeventLogAddress, 2841285242Sachim saRoot->mainConfigTable.IOPeventLogSize/4 ); 2842285242Sachim#endif /* DBG */ 2843285242Sachim#endif /* SA_PRINTOUT_IN_WINDBG */ 2844285242Sachim 2845285242Sachim saRoot->mainConfigTable.FatalErrorInterrupt = value; 2846285242Sachim smTrace(hpDBG_VERY_LOUD,"76",value); 2847285242Sachim /* TP:76 FatalErrorInterrupt */ 2848285242Sachim 2849285242Sachim SA_DBG1(("mpiInitialize: hwConfig->hwOption %X\n", saRoot->hwConfig.hwOption )); 2850285242Sachim 2851285242Sachim SA_DBG1(("mpiInitialize: FatalErrorInterrupt 0x%x\n", value)); 2852285242Sachim 2853285242Sachim /* read back Register Dump offset and length */ 2854285242Sachim value = ossaHwRegReadExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_FATAL_ERROR_RDUMP0_OFFSET)); 2855285242Sachim saRoot->mainConfigTable.FatalErrorDumpOffset0 = value; 2856285242Sachim SA_DBG1(("mpiInitialize: FatalErrorDumpOffset0 0x%x\n", value)); 2857285242Sachim value = ossaHwRegReadExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_FATAL_ERROR_RDUMP0_LENGTH)); 2858285242Sachim saRoot->mainConfigTable.FatalErrorDumpLength0 = value; 2859285242Sachim SA_DBG1(("mpiInitialize: FatalErrorDumpLength0 0x%x\n", value)); 2860285242Sachim value = ossaHwRegReadExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_FATAL_ERROR_RDUMP1_OFFSET)); 2861285242Sachim saRoot->mainConfigTable.FatalErrorDumpOffset1 = value; 2862285242Sachim SA_DBG1(("mpiInitialize: FatalErrorDumpOffset1 0x%x\n", value)); 2863285242Sachim value = ossaHwRegReadExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_FATAL_ERROR_RDUMP1_LENGTH)); 2864285242Sachim saRoot->mainConfigTable.FatalErrorDumpLength1 = value; 2865285242Sachim SA_DBG1(("mpiInitialize: FatalErrorDumpLength1 0x%x\n", value)); 2866285242Sachim 2867285242Sachim value = ossaHwRegReadExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_PRECTD_PRESETD)); 2868285242Sachim saRoot->mainConfigTable.PortRecoveryTimerPortResetTimer = value; 2869285242Sachim 2870285242Sachim SA_DBG1(("mpiInitialize: PortRecoveryTimerPortResetTimer 0x%x\n", value)); 2871285242Sachim value = ossaHwRegReadExt(agRoot, pcibar, (bit32)(MSGUCfgTblDWIdx + MAIN_IRAD_RESERVED)); 2872285242Sachim saRoot->mainConfigTable.InterruptReassertionDelay = value; 2873285242Sachim 2874285242Sachim SA_DBG1(("mpiInitialize: InterruptReassertionDelay 0x%x\n", value)); 2875285242Sachim 2876285242Sachim 2877285242Sachim if(smIS_SPCV(agRoot)) 2878285242Sachim { 2879285242Sachim bit32 sp1; 2880285242Sachim sp1= ossaHwRegRead(agRoot,V_Scratchpad_1_Register ); 2881285242Sachim if(SCRATCH_PAD1_V_ERROR_STATE(sp1)) 2882285242Sachim { 2883285242Sachim SA_DBG1(("mpiInitialize: SCRATCH_PAD1_V_ERROR_STAT 0x%x\n",sp1 )); 2884285242Sachim ret = AGSA_RC_FAILURE; 2885285242Sachim } 2886285242Sachim 2887285242Sachim } 2888285242Sachim 2889285242Sachim smTraceFuncExit(hpDBG_VERY_LOUD, 'j', "m3"); 2890285242Sachim return ret; 2891285242Sachim} 2892285242Sachim 2893285242Sachim/*******************************************************************************/ 2894285242Sachim/** \fn mpiWaitForConfigTable(agsaRoot_t *agRoot, spc_configMainDescriptor_t *config) 2895285242Sachim * \brief Reading and Writing the Configuration Table 2896285242Sachim * \param agsaRoot Pointer to a data structure containing LL layer context handles 2897285242Sachim * \param config Pointer to Configuration Table 2898285242Sachim * 2899285242Sachim * Return: 2900285242Sachim * AGSA_RC_SUCCESS if read the configuration table from SPC sucessful 2901285242Sachim * AGSA_RC_FAILURE if read the configuration table from SPC failed 2902285242Sachim */ 2903285242Sachim/*******************************************************************************/ 2904285242SachimGLOBAL bit32 mpiWaitForConfigTable(agsaRoot_t *agRoot, 2905285242Sachim spc_configMainDescriptor_t *config) 2906285242Sachim{ 2907285242Sachim agsaLLRoot_t *saRoot = (agsaLLRoot_t *)(agRoot->sdkData); 2908285242Sachim bit32 MSGUCfgTblBase, ret = AGSA_RC_SUCCESS; 2909285242Sachim bit32 CfgTblDWIdx; 2910285242Sachim bit32 value, value1; 2911285242Sachim bit32 max_wait_time; 2912285242Sachim bit32 max_wait_count; 2913285242Sachim bit32 Signature, ExpSignature; 2914285242Sachim bit8 pcibar; 2915285242Sachim 2916285242Sachim SA_DBG2(("mpiWaitForConfigTable: Entering\n")); 2917285242Sachim SA_ASSERT(NULL != agRoot, "agRoot argument cannot be null"); 2918285242Sachim 2919285242Sachim smTraceFuncEnter(hpDBG_VERY_LOUD,"m4"); 2920285242Sachim 2921285242Sachim 2922285242Sachim /* check error state */ 2923285242Sachim value = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_1,MSGU_SCRATCH_PAD_1); 2924285242Sachim value1 = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_2,MSGU_SCRATCH_PAD_2); 2925285242Sachim 2926285242Sachim if( smIS_SPC(agRoot) ) 2927285242Sachim { 2928285242Sachim SA_DBG1(("mpiWaitForConfigTable: Waiting for SPC FW becoming ready.P1 0x%X P2 0x%X\n",value,value1)); 2929285242Sachim 2930285242Sachim /* check AAP error */ 2931285242Sachim if (SCRATCH_PAD1_ERR == (value & SCRATCH_PAD_STATE_MASK)) 2932285242Sachim { 2933285242Sachim /* error state */ 2934285242Sachim SA_DBG1(("mpiWaitForConfigTable: AAP error state and code 0x%x, ScratchPad2=0x%x\n", value, value1)); 2935285242Sachim#if defined(SALLSDK_DEBUG) 2936285242Sachim SA_DBG1(("mpiWaitForConfigTable: SCRATCH_PAD0 value = 0x%x\n", siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_0,MSGU_SCRATCH_PAD_0))); 2937285242Sachim SA_DBG1(("mpiWaitForConfigTable: SCRATCH_PAD3 value = 0x%x\n", siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_3,MSGU_SCRATCH_PAD_3))); 2938285242Sachim#endif 2939285242Sachim smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "m4"); 2940285242Sachim return AGSA_RC_FAILURE; 2941285242Sachim } 2942285242Sachim 2943285242Sachim /* check IOP error */ 2944285242Sachim if (SCRATCH_PAD2_ERR == (value1 & SCRATCH_PAD_STATE_MASK)) 2945285242Sachim { 2946285242Sachim /* error state */ 2947285242Sachim SA_DBG1(("mpiWaitForConfigTable: IOP error state and code 0x%x, ScratchPad1=0x%x\n", value1, value)); 2948285242Sachim#if defined(SALLSDK_DEBUG) 2949285242Sachim SA_DBG1(("mpiWaitForConfigTable: SCRATCH_PAD0 value = 0x%x\n", siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_0,MSGU_SCRATCH_PAD_0))); 2950285242Sachim SA_DBG1(("mpiWaitForConfigTable: SCRATCH_PAD3 value = 0x%x\n", siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_3,MSGU_SCRATCH_PAD_3))); 2951285242Sachim#endif 2952285242Sachim smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "m4"); 2953285242Sachim return AGSA_RC_FAILURE; 2954285242Sachim } 2955285242Sachim 2956285242Sachim /* bit 4-31 of scratch pad1 should be zeros if it is not in error state */ 2957285242Sachim#ifdef DONT_DO /* */ 2958285242Sachim if (value & SCRATCH_PAD1_STATE_MASK) 2959285242Sachim { 2960285242Sachim /* error case */ 2961285242Sachim SA_DBG1(("mpiWaitForConfigTable: wrong state failure, scratchPad1 0x%x\n", value)); 2962285242Sachim SA_DBG1(("mpiWaitForConfigTable: ScratchPad0 AAP error code 0x%x\n", siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_0,MSGU_SCRATCH_PAD_0))); 2963285242Sachim#if defined(SALLSDK_DEBUG) 2964285242Sachim SA_DBG1(("mpiWaitForConfigTable: SCRATCH_PAD2 value = 0x%x\n", siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_2,MSGU_SCRATCH_PAD_0))); 2965285242Sachim SA_DBG1(("mpiWaitForConfigTable: SCRATCH_PAD3 value = 0x%x\n", siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_3,MSGU_SCRATCH_PAD_3))); 2966285242Sachim#endif 2967285242Sachim smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "m4"); 2968285242Sachim return AGSA_RC_FAILURE; 2969285242Sachim } 2970285242Sachim 2971285242Sachim /* bit 4-31 of scratch pad2 should be zeros if it is not in error state */ 2972285242Sachim if (value1 & SCRATCH_PAD2_STATE_MASK) 2973285242Sachim { 2974285242Sachim /* error case */ 2975285242Sachim SA_DBG1(("mpiWaitForConfigTable: wrong state failure, scratchPad2 0x%x\n", value1)); 2976285242Sachim SA_DBG1(("mpiWaitForConfigTable: ScratchPad3 IOP error code 0x%x\n",siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_3,MSGU_SCRATCH_PAD_3) )); 2977285242Sachim#if defined(SALLSDK_DEBUG) 2978285242Sachim SA_DBG1(("mpiWaitForConfigTable: SCRATCH_PAD0 value = 0x%x\n", siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_0,MSGU_SCRATCH_PAD_0))); 2979285242Sachim SA_DBG1(("mpiWaitForConfigTable: SCRATCH_PAD1 value = 0x%x\n", siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_1,MSGU_SCRATCH_PAD_1))); 2980285242Sachim#endif 2981285242Sachim smTraceFuncExit(hpDBG_VERY_LOUD, 'd', "m4"); 2982285242Sachim 2983285242Sachim return AGSA_RC_FAILURE; 2984285242Sachim } 2985285242Sachim#endif /* DONT_DO */ 2986285242Sachim 2987285242Sachim /* checking the fw and IOP in ready state */ 2988285242Sachim max_wait_time = WAIT_SECONDS(gWait_2); /* 2 sec timeout */ 2989285242Sachim max_wait_count = MAKE_MODULO(max_wait_time,WAIT_INCREMENT); 2990285242Sachim /* wait until scratch pad 1 and 2 registers in ready state */ 2991285242Sachim do 2992285242Sachim { 2993285242Sachim ossaStallThread(agRoot, WAIT_INCREMENT); 2994285242Sachim value =siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_1,MSGU_SCRATCH_PAD_1) & SCRATCH_PAD1_RDY; 2995285242Sachim value1 =siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_2,MSGU_SCRATCH_PAD_2) & SCRATCH_PAD2_RDY; 2996285242Sachim if(smIS_SPCV(agRoot)) 2997285242Sachim { 2998285242Sachim SA_DBG1(("mpiWaitForConfigTable:VEN_DEV_SPCV force SCRATCH_PAD2 RDY 1 %08X 2 %08X\n" ,value,value1)); 2999285242Sachim value1 =3; 3000285242Sachim } 3001285242Sachim 3002285242Sachim if ((max_wait_count -= WAIT_INCREMENT) == 0) 3003285242Sachim { 3004285242Sachim SA_DBG1(("mpiWaitForConfigTable: Timeout!! SCRATCH_PAD1/2 value = 0x%x 0x%x\n", value, value1)); 3005285242Sachim break; 3006285242Sachim } 3007285242Sachim } while ((value != SCRATCH_PAD1_RDY) || (value1 != SCRATCH_PAD2_RDY)); 3008285242Sachim 3009285242Sachim if (!max_wait_count) 3010285242Sachim { 3011285242Sachim SA_DBG1(("mpiWaitForConfigTable: timeout failure\n")); 3012285242Sachim#if defined(SALLSDK_DEBUG) 3013285242Sachim SA_DBG1(("mpiWaitForConfigTable: SCRATCH_PAD0 value = 0x%x\n", siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_0,MSGU_SCRATCH_PAD_0))); 3014285242Sachim SA_DBG1(("mpiWaitForConfigTable: SCRATCH_PAD3 value = 0x%x\n", siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_3,MSGU_SCRATCH_PAD_3))); 3015285242Sachim#endif 3016285242Sachim smTraceFuncExit(hpDBG_VERY_LOUD, 'e', "m4"); 3017285242Sachim return AGSA_RC_FAILURE; 3018285242Sachim } 3019285242Sachim 3020285242Sachim }else 3021285242Sachim { 3022285242Sachim 3023285242Sachim if(((value & SCRATCH_PAD1_V_BOOTSTATE_HDA_SEEPROM ) == SCRATCH_PAD1_V_BOOTSTATE_HDA_SEEPROM)) 3024285242Sachim { 3025285242Sachim SA_DBG1(("mpiWaitForConfigTable: HDA mode set in SEEPROM SP1 0x%X\n",value)); 3026285242Sachim } 3027285242Sachim if(((value & SCRATCH_PAD1_V_READY) != SCRATCH_PAD1_V_READY) || 3028285242Sachim (value == 0xffffffff)) 3029285242Sachim { 3030285242Sachim SA_DBG1(("mpiWaitForConfigTable: Waiting for _V_ FW becoming ready.P1 0x%X P2 0x%X\n",value,value1)); 3031285242Sachim 3032285242Sachim /* checking the fw and IOP in ready state */ 3033285242Sachim max_wait_time = WAIT_SECONDS(gWait_2); /* 2 sec timeout */ 3034285242Sachim max_wait_count = MAKE_MODULO(max_wait_time,WAIT_INCREMENT); 3035285242Sachim /* wait until scratch pad 1 and 2 registers in ready state */ 3036285242Sachim do 3037285242Sachim { 3038285242Sachim ossaStallThread(agRoot, WAIT_INCREMENT); 3039285242Sachim value = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_1,MSGU_SCRATCH_PAD_1); 3040285242Sachim value1 = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_2,MSGU_SCRATCH_PAD_2); 3041285242Sachim 3042285242Sachim if ((max_wait_count -= WAIT_INCREMENT) == 0) 3043285242Sachim { 3044285242Sachim SA_DBG1(("mpiWaitForConfigTable: Timeout!! SCRATCH_PAD1/2 value = 0x%x 0x%x\n", value, value1)); 3045285242Sachim return AGSA_RC_FAILURE; 3046285242Sachim } 3047285242Sachim } while (((value & SCRATCH_PAD1_V_READY) != SCRATCH_PAD1_V_READY) || 3048285242Sachim (value == 0xffffffff)); 3049285242Sachim } 3050285242Sachim } 3051285242Sachim 3052285242Sachim 3053285242Sachim SA_DBG1(("mpiWaitForConfigTable: FW Ready, SCRATCH_PAD1/2 value = 0x%x 0x%x\n", value, value1)); 3054285242Sachim 3055285242Sachim /* read scratch pad0 to get PCI BAR and offset of configuration table */ 3056285242Sachim MSGUCfgTblBase = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_0,MSGU_SCRATCH_PAD_0); 3057285242Sachim /* get offset */ 3058285242Sachim CfgTblDWIdx = MSGUCfgTblBase & SCRATCH_PAD0_OFFSET_MASK; 3059285242Sachim /* get PCI BAR */ 3060285242Sachim MSGUCfgTblBase = (MSGUCfgTblBase & SCRATCH_PAD0_BAR_MASK) >> SHIFT26; 3061285242Sachim 3062285242Sachim if(smIS_SPC(agRoot)) 3063285242Sachim { 3064285242Sachim if( smIS_spc8081(agRoot)) 3065285242Sachim { 3066285242Sachim if (BAR4 != MSGUCfgTblBase) 3067285242Sachim { 3068285242Sachim SA_DBG1(("mpiWaitForConfigTable: smIS_spc8081 PCI BAR is not BAR4, bar=0x%x - failure\n", MSGUCfgTblBase)); 3069285242Sachim smTraceFuncExit(hpDBG_VERY_LOUD, 'f', "m4"); 3070285242Sachim return AGSA_RC_FAILURE; 3071285242Sachim } 3072285242Sachim } 3073285242Sachim else 3074285242Sachim { 3075285242Sachim if (BAR5 != MSGUCfgTblBase) 3076285242Sachim { 3077285242Sachim SA_DBG1(("mpiWaitForConfigTable: PCI BAR is not BAR5, bar=0x%x - failure\n", MSGUCfgTblBase)); 3078285242Sachim smTraceFuncExit(hpDBG_VERY_LOUD, 'g', "m4"); 3079285242Sachim return AGSA_RC_FAILURE; 3080285242Sachim } 3081285242Sachim } 3082285242Sachim } 3083285242Sachim 3084285242Sachim /* convert the PCI BAR to logical bar number */ 3085285242Sachim pcibar = (bit8)mpiGetPCIBarIndex(agRoot, MSGUCfgTblBase); 3086285242Sachim 3087285242Sachim /* read signature from the configuration table */ 3088285242Sachim Signature = ossaHwRegReadExt(agRoot, pcibar, (bit32)CfgTblDWIdx); 3089285242Sachim 3090285242Sachim /* Error return if the signature is not "PMCS" */ 3091285242Sachim ExpSignature = ('P') | ('M' << SHIFT8) | ('C' << SHIFT16) | ('S' << SHIFT24); 3092285242Sachim 3093285242Sachim if (Signature != ExpSignature) 3094285242Sachim { 3095285242Sachim SA_DBG1(("mpiWaitForConfigTable: Signature value = 0x%x\n", Signature)); 3096285242Sachim smTraceFuncExit(hpDBG_VERY_LOUD, 'h', "m4"); 3097285242Sachim return AGSA_RC_FAILURE; 3098285242Sachim } 3099285242Sachim 3100285242Sachim /* save Signature */ 3101285242Sachim si_memcpy(&config->Signature, &Signature, sizeof(Signature)); 3102285242Sachim 3103285242Sachim /* read Interface Revsion from the configuration table */ 3104285242Sachim config->InterfaceRev = ossaHwRegReadExt(agRoot, pcibar, (bit32)CfgTblDWIdx + MAIN_INTERFACE_REVISION); 3105285242Sachim 3106285242Sachim /* read FW Revsion from the configuration table */ 3107285242Sachim config->FWRevision = ossaHwRegReadExt(agRoot, pcibar, (bit32)CfgTblDWIdx + MAIN_FW_REVISION); 3108285242Sachim 3109285242Sachim /* read Max Outstanding IO from the configuration table */ 3110285242Sachim config->MaxOutstandingIO = ossaHwRegReadExt(agRoot, pcibar, (bit32)CfgTblDWIdx + MAIN_MAX_OUTSTANDING_IO_OFFSET); 3111285242Sachim 3112285242Sachim /* read Max SGL and Max Devices from the configuration table */ 3113285242Sachim config->MDevMaxSGL = ossaHwRegReadExt(agRoot, pcibar, (bit32)CfgTblDWIdx + MAIN_MAX_SGL_OFFSET); 3114285242Sachim 3115285242Sachim /* read Controller Cap Flags from the configuration table */ 3116285242Sachim config->ContrlCapFlag = ossaHwRegReadExt(agRoot, pcibar, (bit32)CfgTblDWIdx + MAIN_CNTRL_CAP_OFFSET); 3117285242Sachim 3118285242Sachim /* read GST Table Offset from the configuration table */ 3119285242Sachim config->GSTOffset = ossaHwRegReadExt(agRoot, pcibar, (bit32)CfgTblDWIdx + MAIN_GST_OFFSET); 3120285242Sachim 3121285242Sachim /* read Inbound Queue Offset from the configuration table */ 3122285242Sachim config->inboundQueueOffset = ossaHwRegReadExt(agRoot, pcibar, (bit32)CfgTblDWIdx + MAIN_IBQ_OFFSET); 3123285242Sachim 3124285242Sachim /* read Outbound Queue Offset from the configuration table */ 3125285242Sachim config->outboundQueueOffset = ossaHwRegReadExt(agRoot, pcibar, (bit32)CfgTblDWIdx + MAIN_OBQ_OFFSET); 3126285242Sachim 3127285242Sachim 3128285242Sachim if(smIS_SPCV(agRoot)) 3129285242Sachim { 3130285242Sachim ;/* SPCV - reserved field */ 3131285242Sachim } 3132285242Sachim else 3133285242Sachim { 3134285242Sachim /* read HDA Flags from the configuration table */ 3135285242Sachim config->HDAModeFlags = ossaHwRegReadExt(agRoot, pcibar, (bit32)CfgTblDWIdx + MAIN_HDA_FLAGS_OFFSET); 3136285242Sachim } 3137285242Sachim 3138285242Sachim /* read analog Setting offset from the configuration table */ 3139285242Sachim config->analogSetupTblOffset = ossaHwRegReadExt(agRoot, pcibar, (bit32)CfgTblDWIdx + MAIN_ANALOG_SETUP_OFFSET); 3140285242Sachim 3141285242Sachim if(smIS_SPCV(agRoot)) 3142285242Sachim { 3143285242Sachim ;/* SPCV - reserved field */ 3144285242Sachim /* read interrupt vector table offset */ 3145285242Sachim config->InterruptVecTblOffset = ossaHwRegReadExt(agRoot, pcibar, (bit32)CfgTblDWIdx + MAIN_INT_VEC_TABLE_OFFSET); 3146285242Sachim /* read phy attribute table offset */ 3147285242Sachim config->phyAttributeTblOffset = ossaHwRegReadExt(agRoot, pcibar, (bit32)CfgTblDWIdx + MAIN_PHY_ATTRIBUTE_OFFSET); 3148285242Sachim SA_DBG1(("mpiWaitForConfigTable: INT Vector Tble Offset = 0x%x\n", config->InterruptVecTblOffset)); 3149285242Sachim SA_DBG1(("mpiWaitForConfigTable: Phy Attribute Tble Offset = 0x%x\n", config->phyAttributeTblOffset)); 3150285242Sachim } 3151285242Sachim else 3152285242Sachim { 3153285242Sachim ;/* SPC - Not used */ 3154285242Sachim } 3155285242Sachim 3156285242Sachim /* read Error Dump Offset and Length */ 3157285242Sachim config->FatalErrorDumpOffset0 = ossaHwRegReadExt(agRoot, pcibar, (bit32)CfgTblDWIdx + MAIN_FATAL_ERROR_RDUMP0_OFFSET); 3158285242Sachim config->FatalErrorDumpLength0 = ossaHwRegReadExt(agRoot, pcibar, (bit32)CfgTblDWIdx + MAIN_FATAL_ERROR_RDUMP0_LENGTH); 3159285242Sachim config->FatalErrorDumpOffset1 = ossaHwRegReadExt(agRoot, pcibar, (bit32)CfgTblDWIdx + MAIN_FATAL_ERROR_RDUMP1_OFFSET); 3160285242Sachim config->FatalErrorDumpLength1 = ossaHwRegReadExt(agRoot, pcibar, (bit32)CfgTblDWIdx + MAIN_FATAL_ERROR_RDUMP1_LENGTH); 3161285242Sachim 3162285242Sachim SA_DBG1(("mpiWaitForConfigTable: Interface Revision value = 0x%08x\n", config->InterfaceRev)); 3163285242Sachim SA_DBG1(("mpiWaitForConfigTable: FW Revision value = 0x%08x\n", config->FWRevision)); 3164285242Sachim 3165285242Sachim if(smIS_SPC(agRoot)) 3166285242Sachim { 3167285242Sachim SA_DBG1(("mpiWaitForConfigTable: sTSDK ver. 0x%08x\n", STSDK_LL_SPC_VERSION)); 3168285242Sachim } 3169285242Sachim if(smIS_SPC6V(agRoot)) 3170285242Sachim { 3171285242Sachim SA_DBG1(("mpiWaitForConfigTable: sTSDK ver. 0x%08x\n",STSDK_LL_VERSION )); 3172285242Sachim } 3173285242Sachim if(smIS_SPC12V(agRoot)) 3174285242Sachim { 3175285242Sachim SA_DBG1(("mpiWaitForConfigTable: sTSDK ver. 0x%08x\n",STSDK_LL_12G_VERSION )); 3176285242Sachim } 3177285242Sachim 3178285242Sachim SA_DBG1(("mpiWaitForConfigTable: MaxOutstandingIO value = 0x%08x\n", config->MaxOutstandingIO)); 3179285242Sachim SA_DBG1(("mpiWaitForConfigTable: MDevMaxSGL value = 0x%08x\n", config->MDevMaxSGL)); 3180285242Sachim SA_DBG1(("mpiWaitForConfigTable: ContrlCapFlag value = 0x%08x\n", config->ContrlCapFlag)); 3181285242Sachim SA_DBG1(("mpiWaitForConfigTable: GSTOffset value = 0x%08x\n", config->GSTOffset)); 3182285242Sachim SA_DBG1(("mpiWaitForConfigTable: inboundQueueOffset value = 0x%08x\n", config->inboundQueueOffset)); 3183285242Sachim SA_DBG1(("mpiWaitForConfigTable: outboundQueueOffset value = 0x%08x\n", config->outboundQueueOffset)); 3184285242Sachim SA_DBG1(("mpiWaitForConfigTable: FatalErrorDumpOffset0 value = 0x%08x\n", config->FatalErrorDumpOffset0)); 3185285242Sachim SA_DBG1(("mpiWaitForConfigTable: FatalErrorDumpLength0 value = 0x%08x\n", config->FatalErrorDumpLength0)); 3186285242Sachim SA_DBG1(("mpiWaitForConfigTable: FatalErrorDumpOffset1 value = 0x%08x\n", config->FatalErrorDumpOffset1)); 3187285242Sachim SA_DBG1(("mpiWaitForConfigTable: FatalErrorDumpLength1 value = 0x%08x\n", config->FatalErrorDumpLength1)); 3188285242Sachim 3189285242Sachim 3190285242Sachim SA_DBG1(("mpiWaitForConfigTable: HDAModeFlags value = 0x%08x\n", config->HDAModeFlags)); 3191285242Sachim SA_DBG1(("mpiWaitForConfigTable: analogSetupTblOffset value = 0x%08x\n", config->analogSetupTblOffset)); 3192285242Sachim 3193285242Sachim /* check interface version */ 3194285242Sachim 3195285242Sachim if(smIS_SPC6V(agRoot)) 3196285242Sachim { 3197285242Sachim if (config->InterfaceRev != STSDK_LL_INTERFACE_VERSION) 3198285242Sachim { 3199285242Sachim SA_DBG1(("mpiWaitForConfigTable: V sTSDK interface ver. 0x%x does not match InterfaceRev 0x%x warning!\n", STSDK_LL_INTERFACE_VERSION, config->InterfaceRev)); 3200285242Sachim ret = AGSA_RC_VERSION_UNTESTED; 3201285242Sachim if ((config->InterfaceRev & STSDK_LL_INTERFACE_VERSION_IGNORE_MASK) != (STSDK_LL_INTERFACE_VERSION & STSDK_LL_INTERFACE_VERSION_IGNORE_MASK)) 3202285242Sachim { 3203285242Sachim SA_DBG1(("mpiWaitForConfigTable: V sTSDK interface ver. 0x%x incompatible with InterfaceRev 0x%x warning!\n", STSDK_LL_INTERFACE_VERSION, config->InterfaceRev)); 3204285242Sachim ret = AGSA_RC_VERSION_INCOMPATIBLE; 3205285242Sachim smTraceFuncExit(hpDBG_VERY_LOUD, 'i', "m4"); 3206285242Sachim return ret; 3207285242Sachim } 3208285242Sachim } 3209285242Sachim } 3210285242Sachim else if(smIS_SPC12V(agRoot)) 3211285242Sachim { 3212285242Sachim if (config->InterfaceRev != STSDK_LL_12G_INTERFACE_VERSION) 3213285242Sachim { 3214285242Sachim 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)); 3215285242Sachim ret = AGSA_RC_VERSION_UNTESTED; 3216285242Sachim if ((config->InterfaceRev & STSDK_LL_INTERFACE_VERSION_IGNORE_MASK) != (STSDK_LL_12G_INTERFACE_VERSION & STSDK_LL_INTERFACE_VERSION_IGNORE_MASK)) 3217285242Sachim { 3218285242Sachim SA_DBG1(("mpiWaitForConfigTable: V sTSDK interface ver. 0x%x incompatible with InterfaceRev 0x%x warning!\n", STSDK_LL_12G_INTERFACE_VERSION, config->InterfaceRev)); 3219285242Sachim ret = AGSA_RC_VERSION_INCOMPATIBLE; 3220285242Sachim ret = AGSA_RC_VERSION_UNTESTED; 3221285242Sachim smTraceFuncExit(hpDBG_VERY_LOUD, 'j', "m4"); 3222285242Sachim return ret; 3223285242Sachim } 3224285242Sachim } 3225285242Sachim } 3226285242Sachim else 3227285242Sachim { 3228285242Sachim if (config->InterfaceRev != STSDK_LL_OLD_INTERFACE_VERSION) 3229285242Sachim { 3230285242Sachim SA_DBG1(("mpiWaitForConfigTable: SPC sTSDK interface ver. 0x%08x not compatible with InterfaceRev 0x%x warning!\n", STSDK_LL_INTERFACE_VERSION, config->InterfaceRev)); 3231285242Sachim ret = AGSA_RC_VERSION_INCOMPATIBLE; 3232285242Sachim smTraceFuncExit(hpDBG_VERY_LOUD, 'k', "m4"); 3233285242Sachim return ret; 3234285242Sachim } 3235285242Sachim 3236285242Sachim } 3237285242Sachim 3238285242Sachim 3239285242Sachim /* Check FW versions */ 3240285242Sachim if(smIS_SPC6V(agRoot)) 3241285242Sachim { 3242285242Sachim SA_DBG1(("mpiWaitForConfigTable:6 sTSDK ver. sa.h 0x%08x config 0x%08x\n", STSDK_LL_VERSION, config->FWRevision)); 3243285242Sachim /* check FW and LL sTSDK version */ 3244285242Sachim if (config->FWRevision != MATCHING_V_FW_VERSION ) 3245285242Sachim { 3246285242Sachim if (config->FWRevision > MATCHING_V_FW_VERSION) 3247285242Sachim { 3248285242Sachim SA_DBG1(("mpiWaitForConfigTable: sTSDK ver. 0x%x hadn't tested with FW ver. 0x%08x warning!\n", STSDK_LL_VERSION, config->FWRevision)); 3249285242Sachim ret = AGSA_RC_VERSION_UNTESTED; 3250285242Sachim } 3251285242Sachim 3252285242Sachim else if (config->FWRevision < MIN_FW_SPCVE_VERSION_SUPPORTED) 3253285242Sachim { 3254285242Sachim SA_DBG1(("mpiWaitForConfigTable: sTSDK ver. 0x%x not compatible with FW ver. 0x%08x warning!\n", STSDK_LL_VERSION, config->FWRevision)); 3255285242Sachim ret = AGSA_RC_VERSION_INCOMPATIBLE; 3256285242Sachim smTraceFuncExit(hpDBG_VERY_LOUD, 'l', "m4"); 3257285242Sachim return ret; 3258285242Sachim } 3259285242Sachim else 3260285242Sachim { 3261285242Sachim SA_DBG1(("mpiWaitForConfigTable: sTSDK ver. 0x%x mismatch with FW ver. 0x%08x warning!\n",STSDK_LL_VERSION , config->FWRevision)); 3262285242Sachim ret = AGSA_RC_VERSION_UNTESTED; 3263285242Sachim } 3264285242Sachim } 3265285242Sachim }else if(smIS_SPC12V(agRoot)) 3266285242Sachim { 3267285242Sachim SA_DBG1(("mpiWaitForConfigTable:12 sTSDK ver. sa.h 0x%08x config 0x%08x\n", STSDK_LL_12G_VERSION, config->FWRevision)); 3268285242Sachim /* check FW and LL sTSDK version */ 3269285242Sachim if (config->FWRevision != MATCHING_12G_V_FW_VERSION ) 3270285242Sachim { 3271285242Sachim if (config->FWRevision > MATCHING_12G_V_FW_VERSION) 3272285242Sachim { 3273285242Sachim SA_DBG1(("mpiWaitForConfigTable: sTSDK ver. 0x%x hadn't tested with FW ver. 0x%08x warning!\n", STSDK_LL_12G_VERSION, config->FWRevision)); 3274285242Sachim ret = AGSA_RC_VERSION_UNTESTED; 3275285242Sachim } 3276285242Sachim 3277285242Sachim else if (config->FWRevision < MIN_FW_12G_SPCVE_VERSION_SUPPORTED) 3278285242Sachim { 3279285242Sachim SA_DBG1(("mpiWaitForConfigTable: sTSDK ver. 0x%x not compatible with FW ver. 0x%08x warning!\n", STSDK_LL_12G_VERSION, config->FWRevision)); 3280285242Sachim ret = AGSA_RC_VERSION_INCOMPATIBLE; 3281285242Sachim smTraceFuncExit(hpDBG_VERY_LOUD, 'm', "m4"); 3282285242Sachim return ret; 3283285242Sachim } 3284285242Sachim else 3285285242Sachim { 3286285242Sachim SA_DBG1(("mpiWaitForConfigTable: sTSDK ver. 0x%x mismatch with FW ver. 0x%08x warning!\n",STSDK_LL_12G_VERSION , config->FWRevision)); 3287285242Sachim ret = AGSA_RC_VERSION_UNTESTED; 3288285242Sachim } 3289285242Sachim } 3290285242Sachim } 3291285242Sachim else 3292285242Sachim { 3293285242Sachim if (config->FWRevision != MATCHING_SPC_FW_VERSION ) 3294285242Sachim { 3295285242Sachim if (config->FWRevision > MATCHING_SPC_FW_VERSION) 3296285242Sachim { 3297285242Sachim SA_DBG1(("mpiWaitForConfigTable: sTSDK ver. 0x%x hadn't tested with FW ver. 0x%08x warning!\n", STSDK_LL_SPC_VERSION, config->FWRevision)); 3298285242Sachim ret = AGSA_RC_VERSION_UNTESTED; 3299285242Sachim } 3300285242Sachim else if (config->FWRevision < MIN_FW_SPC_VERSION_SUPPORTED) 3301285242Sachim { 3302285242Sachim SA_DBG1(("mpiWaitForConfigTable: sTSDK ver. 0x%x not compatible with FW ver. 0x%08x warning!\n", STSDK_LL_SPC_VERSION, config->FWRevision)); 3303285242Sachim ret = AGSA_RC_VERSION_INCOMPATIBLE; 3304285242Sachim smTraceFuncExit(hpDBG_VERY_LOUD, 'n', "m4"); 3305285242Sachim return ret; 3306285242Sachim } 3307285242Sachim else 3308285242Sachim { 3309285242Sachim SA_DBG1(("mpiWaitForConfigTable: sTSDK ver. 0x%x mismatch with FW ver. 0x%08x warning!\n",STSDK_LL_SPC_VERSION , config->FWRevision)); 3310285242Sachim ret = AGSA_RC_VERSION_UNTESTED; 3311285242Sachim } 3312285242Sachim } 3313285242Sachim } 3314285242Sachim SA_DBG1(("mpiWaitForConfigTable: ILA version 0x%08X\n", ossaHwRegReadExt(agRoot, pcibar, (bit32)CfgTblDWIdx + MAIN_ILAT_ILAV_ILASMRN_ILAMRN_ILAMJN) )); 3315285242Sachim 3316285242Sachim 3317285242Sachim if(smIS_SPC12V(agRoot)) 3318285242Sachim { 3319285242Sachim if (config->InterfaceRev > 0x301 ) 3320285242Sachim { 3321285242Sachim SA_DBG1(("mpiWaitForConfigTable: MAIN_INACTIVE_ILA_REVSION 0x%08X\n", ossaHwRegReadExt(agRoot, pcibar, (bit32)CfgTblDWIdx + MAIN_INACTIVE_ILA_REVSION) )); 3322285242Sachim SA_DBG1(("mpiWaitForConfigTable: MAIN_SEEPROM_REVSION 0x%08X\n", ossaHwRegReadExt(agRoot, pcibar, (bit32)CfgTblDWIdx + MAIN_SEEPROM_REVSION) )); 3323285242Sachim } 3324285242Sachim } 3325285242Sachim 3326285242Sachim if(smIS_SPC12V(agRoot)) 3327285242Sachim { 3328285242Sachim if (config->InterfaceRev > 0x301 ) 3329285242Sachim { 3330285242Sachim SA_DBG1(("mpiWaitForConfigTable: MAIN_AWT_MIDRANGE 0x%08X\n", ossaHwRegReadExt(agRoot, pcibar, (bit32)CfgTblDWIdx + MAIN_AWT_MIDRANGE) )); 3331285242Sachim } 3332285242Sachim } 3333285242Sachim 3334285242Sachim 3335285242Sachim if(smIS_SFC(agRoot)) 3336285242Sachim { 3337285242Sachim /* always success for SFC*/ 3338285242Sachim ret = AGSA_RC_SUCCESS; 3339285242Sachim } 3340285242Sachim 3341285242Sachim if (agNULL != saRoot) 3342285242Sachim { 3343285242Sachim /* save the information */ 3344285242Sachim saRoot->ControllerInfo.signature = Signature; 3345285242Sachim saRoot->ControllerInfo.fwInterfaceRev = config->InterfaceRev; 3346285242Sachim 3347285242Sachim if(smIS_SPCV(agRoot)) 3348285242Sachim { 3349285242Sachim saRoot->ControllerInfo.hwRevision = (ossaHwRegReadConfig32(agRoot,8) & 0xFF); 3350285242Sachim SA_DBG1(("mpiWaitForConfigTable: hwRevision 0x%x\n",saRoot->ControllerInfo.hwRevision )); 3351285242Sachim } 3352285242Sachim else 3353285242Sachim { 3354285242Sachim saRoot->ControllerInfo.hwRevision = SPC_READ_DEV_REV; 3355285242Sachim } 3356285242Sachim 3357285242Sachim saRoot->ControllerInfo.fwRevision = config->FWRevision; 3358285242Sachim saRoot->ControllerInfo.ilaRevision = config->ilaRevision; 3359285242Sachim saRoot->ControllerInfo.maxPendingIO = config->MaxOutstandingIO; 3360285242Sachim saRoot->ControllerInfo.maxSgElements = config->MDevMaxSGL & 0xFFFF; 3361285242Sachim saRoot->ControllerInfo.maxDevices = (config->MDevMaxSGL & MAX_DEV_BITS) >> SHIFT16; 3362285242Sachim saRoot->ControllerInfo.queueSupport = config->ContrlCapFlag & Q_SUPPORT_BITS; 3363285242Sachim saRoot->ControllerInfo.phyCount = (bit8)((config->ContrlCapFlag & PHY_COUNT_BITS) >> SHIFT19); 3364285242Sachim saRoot->ControllerInfo.sasSpecsSupport = (config->ContrlCapFlag & SAS_SPEC_BITS) >> SHIFT25; 3365285242Sachim SA_DBG1(("mpiWaitForConfigTable: MaxOutstandingIO 0x%x swConfig->maxActiveIOs 0x%x\n", config->MaxOutstandingIO,saRoot->swConfig.maxActiveIOs )); 3366285242Sachim 3367285242Sachim if(smIS_SPCV(agRoot)) 3368285242Sachim { 3369285242Sachim ;/* SPCV - reserved field */ 3370285242Sachim } 3371285242Sachim else 3372285242Sachim { 3373285242Sachim saRoot->ControllerInfo.controllerSetting = (bit8)config->HDAModeFlags; 3374285242Sachim } 3375285242Sachim 3376285242Sachim saRoot->ControllerInfo.sdkInterfaceRev = STSDK_LL_INTERFACE_VERSION; 3377285242Sachim saRoot->ControllerInfo.sdkRevision = STSDK_LL_VERSION; 3378285242Sachim saRoot->mainConfigTable.regDumpPCIBAR = pcibar; 3379285242Sachim saRoot->mainConfigTable.FatalErrorDumpOffset0 = config->FatalErrorDumpOffset0; 3380285242Sachim saRoot->mainConfigTable.FatalErrorDumpLength0 = config->FatalErrorDumpLength0; 3381285242Sachim saRoot->mainConfigTable.FatalErrorDumpOffset1 = config->FatalErrorDumpOffset1; 3382285242Sachim saRoot->mainConfigTable.FatalErrorDumpLength1 = config->FatalErrorDumpLength1; 3383285242Sachim 3384285242Sachim if(smIS_SPCV(agRoot)) 3385285242Sachim { 3386285242Sachim ;/* SPCV - reserved field */ 3387285242Sachim } 3388285242Sachim else 3389285242Sachim { 3390285242Sachim saRoot->mainConfigTable.HDAModeFlags = config->HDAModeFlags; 3391285242Sachim } 3392285242Sachim 3393285242Sachim saRoot->mainConfigTable.analogSetupTblOffset = config->analogSetupTblOffset; 3394285242Sachim 3395285242Sachim if(smIS_SPCV(agRoot)) 3396285242Sachim { 3397285242Sachim saRoot->mainConfigTable.InterruptVecTblOffset = config->InterruptVecTblOffset; 3398285242Sachim saRoot->mainConfigTable.phyAttributeTblOffset = config->phyAttributeTblOffset; 3399285242Sachim saRoot->mainConfigTable.PortRecoveryTimerPortResetTimer = config->portRecoveryResetTimer; 3400285242Sachim } 3401285242Sachim 3402285242Sachim SA_DBG1(("mpiWaitForConfigTable: Signature = 0x%x\n", Signature)); 3403285242Sachim SA_DBG1(("mpiWaitForConfigTable: hwRevision = 0x%x\n", saRoot->ControllerInfo.hwRevision)); 3404285242Sachim SA_DBG1(("mpiWaitForConfigTable: FW Revision = 0x%x\n", config->FWRevision)); 3405285242Sachim SA_DBG1(("mpiWaitForConfigTable: Max Sgl = 0x%x\n", saRoot->ControllerInfo.maxSgElements)); 3406285242Sachim SA_DBG1(("mpiWaitForConfigTable: Max Device = 0x%x\n", saRoot->ControllerInfo.maxDevices)); 3407285242Sachim SA_DBG1(("mpiWaitForConfigTable: Queue Support = 0x%x\n", saRoot->ControllerInfo.queueSupport)); 3408285242Sachim SA_DBG1(("mpiWaitForConfigTable: Phy Count = 0x%x\n", saRoot->ControllerInfo.phyCount)); 3409285242Sachim SA_DBG1(("mpiWaitForConfigTable: sas Specs Support = 0x%x\n", saRoot->ControllerInfo.sasSpecsSupport)); 3410285242Sachim 3411285242Sachim } 3412285242Sachim 3413285242Sachim 3414285242Sachim if(ret != AGSA_RC_SUCCESS ) 3415285242Sachim { 3416285242Sachim SA_DBG1(("mpiWaitForConfigTable: return 0x%x not AGSA_RC_SUCCESS warning!\n", ret)); 3417285242Sachim } 3418285242Sachim 3419285242Sachim 3420285242Sachim smTraceFuncExit(hpDBG_VERY_LOUD, 'o', "m4"); 3421285242Sachim return ret; 3422285242Sachim} 3423285242Sachim 3424285242Sachim/*******************************************************************************/ 3425285242Sachim/** \fn mpiUnInitConfigTable(agsaRoot_t *agRoot, spc_configMainDescriptor_t *config) 3426285242Sachim * \brief UnInitialization Configuration Table 3427285242Sachim * \param agsaRoot Pointer to a data structure containing LL layer context handles 3428285242Sachim * 3429285242Sachim * Return: 3430285242Sachim * AGSA_RC_SUCCESS if Un-initialize the configuration table sucessful 3431285242Sachim * AGSA_RC_FAILURE if Un-initialize the configuration table failed 3432285242Sachim */ 3433285242Sachim/*******************************************************************************/ 3434285242SachimGLOBAL bit32 mpiUnInitConfigTable(agsaRoot_t *agRoot) 3435285242Sachim{ 3436285242Sachim bit32 MSGUCfgTblBase; 3437285242Sachim bit32 CfgTblDWIdx, GSTOffset, GSTLenMPIS; 3438285242Sachim bit32 value, togglevalue; 3439285242Sachim bit32 max_wait_time; 3440285242Sachim bit32 max_wait_count; 3441285242Sachim bit8 pcibar; 3442285242Sachim 3443285242Sachim smTraceFuncEnter(hpDBG_VERY_LOUD,"m7"); 3444285242Sachim SA_DBG1(("mpiUnInitConfigTable: agRoot %p\n",agRoot)); 3445285242Sachim SA_ASSERT(NULL != agRoot, "agRoot argument cannot be null"); 3446285242Sachim 3447285242Sachim togglevalue = 0; 3448285242Sachim 3449285242Sachim /* read scratch pad0 to get PCI BAR and offset of configuration table */ 3450285242Sachim MSGUCfgTblBase =siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_0,MSGU_SCRATCH_PAD_0); 3451285242Sachim 3452285242Sachim if(MSGUCfgTblBase == 0xFFFFFFFF) 3453285242Sachim { 3454285242Sachim SA_DBG1(("mpiUnInitConfigTable: MSGUCfgTblBase = 0x%x AGSA_RC_FAILURE\n",MSGUCfgTblBase)); 3455285242Sachim return AGSA_RC_FAILURE; 3456285242Sachim } 3457285242Sachim 3458285242Sachim /* get offset */ 3459285242Sachim CfgTblDWIdx = MSGUCfgTblBase & SCRATCH_PAD0_OFFSET_MASK; 3460285242Sachim /* get PCI BAR */ 3461285242Sachim MSGUCfgTblBase = (MSGUCfgTblBase & SCRATCH_PAD0_BAR_MASK) >> SHIFT26; 3462285242Sachim 3463285242Sachim /* convert the PCI BAR to logical bar number */ 3464285242Sachim pcibar = (bit8)mpiGetPCIBarIndex(agRoot, MSGUCfgTblBase); 3465285242Sachim 3466285242Sachim /* Write bit 1 to Inbound DoorBell Register */ 3467285242Sachim siHalRegWriteExt(agRoot, GEN_MSGU_IBDB_SET, MSGU_IBDB_SET, SPC_MSGU_CFG_TABLE_RESET); 3468285242Sachim 3469285242Sachim /* wait until Inbound DoorBell Clear Register toggled */ 3470285242Sachim max_wait_time = WAIT_SECONDS(gWait_2); /* 2 sec */ 3471285242Sachim max_wait_count = MAKE_MODULO(max_wait_time,WAIT_INCREMENT); 3472285242Sachim do 3473285242Sachim { 3474285242Sachim ossaStallThread(agRoot, WAIT_INCREMENT); 3475285242Sachim value = MSGU_READ_IDR; 3476285242Sachim value &= SPC_MSGU_CFG_TABLE_RESET; 3477285242Sachim } while ((value != togglevalue) && (max_wait_count -= WAIT_INCREMENT)); 3478285242Sachim 3479285242Sachim if (!max_wait_count) 3480285242Sachim { 3481285242Sachim SA_DBG1(("mpiUnInitConfigTable: TIMEOUT:IBDB value/toggle = 0x%x 0x%x\n", value, togglevalue)); 3482285242Sachim smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "m7"); 3483285242Sachim 3484285242Sachim if(smIS_SPC(agRoot) ) 3485285242Sachim { 3486285242Sachim return AGSA_RC_FAILURE; 3487285242Sachim } 3488285242Sachim 3489285242Sachim } 3490285242Sachim 3491285242Sachim /* check the MPI-State for termination in progress */ 3492285242Sachim /* wait until Inbound DoorBell Clear Register toggled */ 3493285242Sachim max_wait_time = WAIT_SECONDS(gWait_2); /* 2 sec */ 3494285242Sachim max_wait_count = MAKE_MODULO(max_wait_time,WAIT_INCREMENT); 3495285242Sachim GSTOffset = ossaHwRegReadExt(agRoot, pcibar, (bit32)CfgTblDWIdx + MAIN_GST_OFFSET); 3496285242Sachim do 3497285242Sachim { 3498285242Sachim ossaStallThread(agRoot, WAIT_INCREMENT); 3499285242Sachim 3500285242Sachim if(GSTOffset == 0xFFFFFFFF) 3501285242Sachim { 3502285242Sachim SA_DBG1(("mpiUnInitConfigTable:AGSA_RC_FAILURE GSTOffset = 0x%x\n",GSTOffset)); 3503285242Sachim return AGSA_RC_FAILURE; 3504285242Sachim } 3505285242Sachim 3506285242Sachim GSTLenMPIS = ossaHwRegReadExt(agRoot, pcibar, (bit32)CfgTblDWIdx + (bit32)(GSTOffset + GST_GSTLEN_MPIS_OFFSET)); 3507285242Sachim if (GST_MPI_STATE_UNINIT == (GSTLenMPIS & GST_MPI_STATE_MASK)) 3508285242Sachim { 3509285242Sachim break; 3510285242Sachim } 3511285242Sachim } while (max_wait_count -= WAIT_INCREMENT); 3512285242Sachim 3513285242Sachim if (!max_wait_count) 3514285242Sachim { 3515285242Sachim SA_DBG1(("mpiUnInitConfigTable: TIMEOUT, MPI State = 0x%x\n", GSTLenMPIS & GST_MPI_STATE_MASK)); 3516285242Sachim#if defined(SALLSDK_DEBUG) 3517285242Sachim 3518285242Sachim SA_DBG1(("mpiUnInitConfigTable: SCRATCH_PAD0 value = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_0))); 3519285242Sachim SA_DBG1(("mpiUnInitConfigTable: SCRATCH_PAD1 value = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_1))); 3520285242Sachim SA_DBG1(("mpiUnInitConfigTable: SCRATCH_PAD2 value = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_2))); 3521285242Sachim SA_DBG1(("mpiUnInitConfigTable: SCRATCH_PAD3 value = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_3))); 3522285242Sachim#endif 3523285242Sachim 3524285242Sachim smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "m7"); 3525285242Sachim return AGSA_RC_FAILURE; 3526285242Sachim } 3527285242Sachim 3528285242Sachim smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "m7"); 3529285242Sachim return AGSA_RC_SUCCESS; 3530285242Sachim} 3531285242Sachim 3532285242Sachim/*******************************************************************************/ 3533285242Sachim/** \fn void mpiUpdateIBQueueCfgTable(agsaRoot_t *agRoot, spc_inboundQueueDescriptor_t *outQueueCfg, 3534285242Sachim * bit32 QueueTableOffset,bit8 pcibar) 3535285242Sachim * \brief Writing to the inbound queue of the Configuration Table 3536285242Sachim * \param agsaRoot Pointer to a data structure containing both application and LL layer context handles 3537285242Sachim * \param outQueueCfg Pointer to inbuond configuration area 3538285242Sachim * \param QueueTableOffset Queue configuration table offset 3539285242Sachim * \param pcibar PCI BAR 3540285242Sachim * 3541285242Sachim * Return: 3542285242Sachim * None 3543285242Sachim */ 3544285242Sachim/*******************************************************************************/ 3545285242SachimGLOBAL void mpiUpdateIBQueueCfgTable(agsaRoot_t *agRoot, 3546285242Sachim spc_inboundQueueDescriptor_t *inQueueCfg, 3547285242Sachim bit32 QueueTableOffset, 3548285242Sachim bit8 pcibar) 3549285242Sachim{ 3550285242Sachim smTraceFuncEnter(hpDBG_VERY_LOUD,"m5"); 3551285242Sachim 3552285242Sachim smTrace(hpDBG_VERY_LOUD,"Ba",QueueTableOffset); 3553285242Sachim /* TP:Ba QueueTableOffset */ 3554285242Sachim smTrace(hpDBG_VERY_LOUD,"Bb",pcibar); 3555285242Sachim /* TP:Bb pcibar */ 3556285242Sachim 3557285242Sachim ossaHwRegWriteExt(agRoot, pcibar, (bit32)(QueueTableOffset + IB_PROPERITY_OFFSET), inQueueCfg->elementPriSizeCount); 3558285242Sachim ossaHwRegWriteExt(agRoot, pcibar, (bit32)(QueueTableOffset + IB_BASE_ADDR_HI_OFFSET), inQueueCfg->upperBaseAddress); 3559285242Sachim ossaHwRegWriteExt(agRoot, pcibar, (bit32)(QueueTableOffset + IB_BASE_ADDR_LO_OFFSET), inQueueCfg->lowerBaseAddress); 3560285242Sachim ossaHwRegWriteExt(agRoot, pcibar, (bit32)(QueueTableOffset + IB_CI_BASE_ADDR_HI_OFFSET), inQueueCfg->ciUpperBaseAddress); 3561285242Sachim ossaHwRegWriteExt(agRoot, pcibar, (bit32)(QueueTableOffset + IB_CI_BASE_ADDR_LO_OFFSET), inQueueCfg->ciLowerBaseAddress); 3562285242Sachim 3563285242Sachim 3564285242Sachim SA_DBG3(("mpiUpdateIBQueueCfgTable: Offset 0x%08x elementPriSizeCount 0x%x\n",(bit32)(QueueTableOffset + IB_PROPERITY_OFFSET), inQueueCfg->elementPriSizeCount)); 3565285242Sachim SA_DBG3(("mpiUpdateIBQueueCfgTable: Offset 0x%08x upperBaseAddress 0x%x\n",(bit32)(QueueTableOffset + IB_BASE_ADDR_HI_OFFSET), inQueueCfg->upperBaseAddress)); 3566285242Sachim SA_DBG3(("mpiUpdateIBQueueCfgTable: Offset 0x%08x lowerBaseAddress 0x%x\n",(bit32)(QueueTableOffset + IB_BASE_ADDR_LO_OFFSET), inQueueCfg->lowerBaseAddress)); 3567285242Sachim SA_DBG3(("mpiUpdateIBQueueCfgTable: Offset 0x%08x ciUpperBaseAddress 0x%x\n",(bit32)(QueueTableOffset + IB_CI_BASE_ADDR_HI_OFFSET), inQueueCfg->ciUpperBaseAddress)); 3568285242Sachim SA_DBG3(("mpiUpdateIBQueueCfgTable: Offset 0x%08x ciLowerBaseAddress 0x%x\n",(bit32)(QueueTableOffset + IB_CI_BASE_ADDR_LO_OFFSET), inQueueCfg->ciLowerBaseAddress)); 3569285242Sachim 3570285242Sachim smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "m5"); 3571285242Sachim} 3572285242Sachim 3573285242Sachim/*******************************************************************************/ 3574285242Sachim/** \fn void mpiUpdateOBQueueCfgTable(agsaRoot_t *agRoot, spc_outboundQueueDescriptor_t *outQueueCfg, 3575285242Sachim * bit32 QueueTableOffset,bit8 pcibar) 3576285242Sachim * \brief Writing to the inbound queue of the Configuration Table 3577285242Sachim * \param agsaRoot Pointer to a data structure containing both application 3578285242Sachim * and LL layer context handles 3579285242Sachim * \param outQueueCfg Pointer to outbuond configuration area 3580285242Sachim * \param QueueTableOffset Queue configuration table offset 3581285242Sachim * \param pcibar PCI BAR 3582285242Sachim * 3583285242Sachim * Return: 3584285242Sachim * None 3585285242Sachim */ 3586285242Sachim/*******************************************************************************/ 3587285242SachimGLOBAL void mpiUpdateOBQueueCfgTable(agsaRoot_t *agRoot, 3588285242Sachim spc_outboundQueueDescriptor_t *outQueueCfg, 3589285242Sachim bit32 QueueTableOffset, 3590285242Sachim bit8 pcibar) 3591285242Sachim{ 3592285242Sachim 3593285242Sachim smTraceFuncEnter(hpDBG_VERY_LOUD,"m8"); 3594285242Sachim 3595285242Sachim ossaHwRegWriteExt(agRoot, pcibar, (bit32)(QueueTableOffset + OB_PROPERITY_OFFSET), outQueueCfg->elementSizeCount); 3596285242Sachim ossaHwRegWriteExt(agRoot, pcibar, (bit32)(QueueTableOffset + OB_BASE_ADDR_HI_OFFSET), outQueueCfg->upperBaseAddress); 3597285242Sachim ossaHwRegWriteExt(agRoot, pcibar, (bit32)(QueueTableOffset + OB_BASE_ADDR_LO_OFFSET), outQueueCfg->lowerBaseAddress); 3598285242Sachim ossaHwRegWriteExt(agRoot, pcibar, (bit32)(QueueTableOffset + OB_PI_BASE_ADDR_HI_OFFSET), outQueueCfg->piUpperBaseAddress); 3599285242Sachim ossaHwRegWriteExt(agRoot, pcibar, (bit32)(QueueTableOffset + OB_PI_BASE_ADDR_LO_OFFSET), outQueueCfg->piLowerBaseAddress); 3600285242Sachim ossaHwRegWriteExt(agRoot, pcibar, (bit32)(QueueTableOffset + OB_INTERRUPT_COALES_OFFSET), outQueueCfg->interruptVecCntDelay); 3601285242Sachim 3602285242Sachim SA_DBG3(("mpiUpdateOBQueueCfgTable: Offset 0x%08x elementSizeCount 0x%x\n",(bit32)(QueueTableOffset + OB_PROPERITY_OFFSET), outQueueCfg->elementSizeCount)); 3603285242Sachim SA_DBG3(("mpiUpdateOBQueueCfgTable: Offset 0x%08x upperBaseAddress 0x%x\n",(bit32)(QueueTableOffset + OB_BASE_ADDR_HI_OFFSET), outQueueCfg->upperBaseAddress)); 3604285242Sachim SA_DBG3(("mpiUpdateOBQueueCfgTable: Offset 0x%08x lowerBaseAddress 0x%x\n",(bit32)(QueueTableOffset + OB_BASE_ADDR_LO_OFFSET), outQueueCfg->lowerBaseAddress)); 3605285242Sachim SA_DBG3(("mpiUpdateOBQueueCfgTable: Offset 0x%08x piUpperBaseAddress 0x%x\n",(bit32)(QueueTableOffset + OB_PI_BASE_ADDR_HI_OFFSET), outQueueCfg->piUpperBaseAddress)); 3606285242Sachim SA_DBG3(("mpiUpdateOBQueueCfgTable: Offset 0x%08x piLowerBaseAddress 0x%x\n",(bit32)(QueueTableOffset + OB_PI_BASE_ADDR_LO_OFFSET), outQueueCfg->piLowerBaseAddress)); 3607285242Sachim SA_DBG3(("mpiUpdateOBQueueCfgTable: Offset 0x%08x interruptVecCntDelay 0x%x\n",(bit32)(QueueTableOffset + OB_INTERRUPT_COALES_OFFSET), outQueueCfg->interruptVecCntDelay)); 3608285242Sachim smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "m8"); 3609285242Sachim} 3610285242Sachim 3611285242Sachim 3612285242Sachim 3613285242Sachim/*******************************************************************************/ 3614285242Sachim/** \fn void mpiUpdateOBQueueCfgTable(agsaRoot_t *agRoot, spc_outboundQueueDescriptor_t *outQueueCfg, 3615285242Sachim * bit32 QueueTableOffset,bit8 pcibar) 3616285242Sachim * \brief Writing to the inbound queue of the Configuration Table 3617285242Sachim * \param agsaRoot Pointer to a data structure containing both application 3618285242Sachim * and LL layer context handles 3619285242Sachim * \param outQueueCfg Pointer to outbuond configuration area 3620285242Sachim * \param QueueTableOffset Queue configuration table offset 3621285242Sachim * \param pcibar PCI BAR 3622285242Sachim * 3623285242Sachim * Return: 3624285242Sachim * None 3625285242Sachim */ 3626285242Sachim/*******************************************************************************/ 3627285242SachimGLOBAL void mpiUpdateFatalErrorTable(agsaRoot_t *agRoot, 3628285242Sachim bit32 FerrTableOffset, 3629285242Sachim bit32 lowerBaseAddress, 3630285242Sachim bit32 upperBaseAddress, 3631285242Sachim bit32 length, 3632285242Sachim bit8 pcibar) 3633285242Sachim{ 3634285242Sachim 3635285242Sachim smTraceFuncEnter(hpDBG_VERY_LOUD,"2U"); 3636285242Sachim 3637285242Sachim ossaHwRegWriteExt(agRoot, pcibar, (bit32)(FerrTableOffset + MPI_FATAL_EDUMP_TABLE_LO_OFFSET), lowerBaseAddress); 3638285242Sachim ossaHwRegWriteExt(agRoot, pcibar, (bit32)(FerrTableOffset + MPI_FATAL_EDUMP_TABLE_HI_OFFSET), upperBaseAddress); 3639285242Sachim ossaHwRegWriteExt(agRoot, pcibar, (bit32)(FerrTableOffset + MPI_FATAL_EDUMP_TABLE_LENGTH), length); 3640285242Sachim ossaHwRegWriteExt(agRoot, pcibar, (bit32)(FerrTableOffset + MPI_FATAL_EDUMP_TABLE_HANDSHAKE), 0); 3641285242Sachim ossaHwRegWriteExt(agRoot, pcibar, (bit32)(FerrTableOffset + MPI_FATAL_EDUMP_TABLE_STATUS), 0); 3642285242Sachim 3643285242Sachim 3644285242Sachim SA_DBG3(("mpiUpdateFatalErrorTable: Offset 0x%08x MPI_FATAL_EDUMP_TABLE_LO_OFFSET 0x%x\n",FerrTableOffset + MPI_FATAL_EDUMP_TABLE_LO_OFFSET, lowerBaseAddress)); 3645285242Sachim SA_DBG3(("mpiUpdateFatalErrorTable: Offset 0x%08x MPI_FATAL_EDUMP_TABLE_HI_OFFSET 0x%x\n",FerrTableOffset + MPI_FATAL_EDUMP_TABLE_HI_OFFSET,upperBaseAddress )); 3646285242Sachim SA_DBG3(("mpiUpdateFatalErrorTable: Offset 0x%08x MPI_FATAL_EDUMP_TABLE_LENGTH 0x%x\n",FerrTableOffset + MPI_FATAL_EDUMP_TABLE_LENGTH, length)); 3647285242Sachim SA_DBG3(("mpiUpdateFatalErrorTable: Offset 0x%08x MPI_FATAL_EDUMP_TABLE_HANDSHAKE 0x%x\n",FerrTableOffset + MPI_FATAL_EDUMP_TABLE_HANDSHAKE,0 )); 3648285242Sachim SA_DBG3(("mpiUpdateFatalErrorTable: Offset 0x%08x MPI_FATAL_EDUMP_TABLE_STATUS 0x%x\n",FerrTableOffset + MPI_FATAL_EDUMP_TABLE_STATUS,0 )); 3649285242Sachim smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2U"); 3650285242Sachim} 3651285242Sachim 3652285242Sachim 3653285242Sachim/*******************************************************************************/ 3654285242Sachim/** \fn bit32 mpiGetPCIBarIndex(agsaRoot_t *agRoot, pciBar) 3655285242Sachim * \brief Get PCI BAR Index from PCI BAR 3656285242Sachim * \param agsaRoot Pointer to a data structure containing both application and LL layer context handles 3657285242Sachim * \param pciBar - PCI BAR 3658285242Sachim * 3659285242Sachim * Return: 3660285242Sachim * PCI BAR Index 3661285242Sachim */ 3662285242Sachim/*******************************************************************************/ 3663285242SachimGLOBAL bit32 mpiGetPCIBarIndex(agsaRoot_t *agRoot, bit32 pciBar) 3664285242Sachim{ 3665285242Sachim switch(pciBar) 3666285242Sachim { 3667285242Sachim case BAR0: 3668285242Sachim case BAR1: 3669285242Sachim pciBar = PCIBAR0; 3670285242Sachim break; 3671285242Sachim case BAR2: 3672285242Sachim case BAR3: 3673285242Sachim pciBar = PCIBAR1; 3674285242Sachim break; 3675285242Sachim case BAR4: 3676285242Sachim pciBar = PCIBAR2; 3677285242Sachim break; 3678285242Sachim case BAR5: 3679285242Sachim pciBar = PCIBAR3; 3680285242Sachim break; 3681285242Sachim default: 3682285242Sachim pciBar = PCIBAR0; 3683285242Sachim break; 3684285242Sachim } 3685285242Sachim 3686285242Sachim return pciBar; 3687285242Sachim} 3688285242Sachim 3689285242Sachim/*******************************************************************************/ 3690285242Sachim/** \fn void mpiReadGSTTable(agsaRoot_t *agRoot, spc_GSTableDescriptor_t *mpiGSTable) 3691285242Sachim * \brief Reading the General Status Table 3692285242Sachim * 3693285242Sachim * \param agsaRoot Handles for this instance of SAS/SATA LLL 3694285242Sachim * \param mpiGSTable Pointer of General Status Table 3695285242Sachim * 3696285242Sachim * Return: 3697285242Sachim * None 3698285242Sachim */ 3699285242Sachim/*******************************************************************************/ 3700285242SachimGLOBAL void mpiReadGSTable(agsaRoot_t *agRoot, 3701285242Sachim spc_GSTableDescriptor_t *mpiGSTable) 3702285242Sachim{ 3703285242Sachim bit32 CFGTableOffset, TableOffset; 3704285242Sachim bit32 GSTableOffset; 3705285242Sachim bit8 i, pcibar; 3706285242Sachim 3707285242Sachim smTraceFuncEnter(hpDBG_VERY_LOUD,"m9"); 3708285242Sachim 3709285242Sachim /* get offset of the configuration table */ 3710285242Sachim TableOffset = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_0,MSGU_SCRATCH_PAD_0); 3711285242Sachim 3712285242Sachim if(0xFFFFFFFF == TableOffset) 3713285242Sachim { 3714285242Sachim SA_ASSERT(0xFFFFFFFF == TableOffset, "Chip PCI dead"); 3715285242Sachim 3716285242Sachim SA_DBG1(("mpiReadGSTable: Chip PCI dead TableOffset 0x%x\n", TableOffset)); 3717285242Sachim return; 3718285242Sachim } 3719285242Sachim 3720285242Sachim// SA_DBG1(("mpiReadGSTable: TableOffset 0x%x\n", TableOffset)); 3721285242Sachim CFGTableOffset = TableOffset & SCRATCH_PAD0_OFFSET_MASK; 3722285242Sachim 3723285242Sachim /* get PCI BAR */ 3724285242Sachim TableOffset = (TableOffset & SCRATCH_PAD0_BAR_MASK) >> SHIFT26; 3725285242Sachim /* convert the PCI BAR to logical bar number */ 3726285242Sachim pcibar = (bit8)mpiGetPCIBarIndex(agRoot, TableOffset); 3727285242Sachim 3728285242Sachim /* read GST Table Offset from the configuration table */ 3729285242Sachim GSTableOffset = ossaHwRegReadExt(agRoot, pcibar, (bit32)CFGTableOffset + MAIN_GST_OFFSET); 3730285242Sachim// SA_DBG1(("mpiReadGSTable: GSTableOffset 0x%x\n",GSTableOffset )); 3731285242Sachim 3732285242Sachim GSTableOffset = CFGTableOffset + GSTableOffset; 3733285242Sachim 3734285242Sachim mpiGSTable->GSTLenMPIS = ossaHwRegReadExt(agRoot, pcibar, (bit32)(GSTableOffset + GST_GSTLEN_MPIS_OFFSET)); 3735285242Sachim mpiGSTable->IQFreezeState0 = ossaHwRegReadExt(agRoot, pcibar, (bit32)(GSTableOffset + GST_IQ_FREEZE_STATE0_OFFSET)); 3736285242Sachim mpiGSTable->IQFreezeState1 = ossaHwRegReadExt(agRoot, pcibar, (bit32)(GSTableOffset + GST_IQ_FREEZE_STATE1_OFFSET)); 3737285242Sachim mpiGSTable->MsguTcnt = ossaHwRegReadExt(agRoot, pcibar, (bit32)(GSTableOffset + GST_MSGUTCNT_OFFSET)); 3738285242Sachim mpiGSTable->IopTcnt = ossaHwRegReadExt(agRoot, pcibar, (bit32)(GSTableOffset + GST_IOPTCNT_OFFSET)); 3739285242Sachim mpiGSTable->Iop1Tcnt = ossaHwRegReadExt(agRoot, pcibar, (bit32)(GSTableOffset + GST_IOP1TCNT_OFFSET)); 3740285242Sachim 3741285242Sachim SA_DBG4(("mpiReadGSTable: GSTLenMPIS 0x%x\n", mpiGSTable->GSTLenMPIS)); 3742285242Sachim SA_DBG4(("mpiReadGSTable: GSTLen 0x%x\n", (mpiGSTable->GSTLenMPIS & 0xfff8) >> SHIFT3)); 3743285242Sachim SA_DBG4(("mpiReadGSTable: IQFreezeState0 0x%x\n", mpiGSTable->IQFreezeState0)); 3744285242Sachim SA_DBG4(("mpiReadGSTable: IQFreezeState1 0x%x\n", mpiGSTable->IQFreezeState1)); 3745285242Sachim SA_DBG4(("mpiReadGSTable: MsguTcnt 0x%x\n", mpiGSTable->MsguTcnt)); 3746285242Sachim SA_DBG4(("mpiReadGSTable: IopTcnt 0x%x\n", mpiGSTable->IopTcnt)); 3747285242Sachim SA_DBG4(("mpiReadGSTable: Iop1Tcnt 0x%x\n", mpiGSTable->Iop1Tcnt)); 3748285242Sachim 3749285242Sachim 3750285242Sachim if(smIS_SPCV(agRoot)) 3751285242Sachim { 3752285242Sachim /***** read Phy State from SAS Phy Attribute Table */ 3753285242Sachim TableOffset = ossaHwRegReadExt(agRoot, pcibar, (bit32)CFGTableOffset + MAIN_PHY_ATTRIBUTE_OFFSET); 3754285242Sachim TableOffset &= 0x00FFFFFF; 3755285242Sachim TableOffset = TableOffset + CFGTableOffset; 3756285242Sachim for (i = 0; i < 8; i++) 3757285242Sachim { 3758285242Sachim mpiGSTable->PhyState[i] = ossaHwRegReadExt(agRoot, pcibar, (bit32)(TableOffset + i * sizeof(phyAttrb_t))); 3759285242Sachim SA_DBG4(("mpiReadGSTable: PhyState[0x%x] 0x%x\n", i, mpiGSTable->PhyState[i])); 3760285242Sachim } 3761285242Sachim } 3762285242Sachim else 3763285242Sachim { 3764285242Sachim for (i = 0; i < 8; i++) 3765285242Sachim { 3766285242Sachim mpiGSTable->PhyState[i] = ossaHwRegReadExt(agRoot, pcibar, (bit32)(GSTableOffset + GST_PHYSTATE_OFFSET + i * 4)); 3767285242Sachim SA_DBG4(("mpiReadGSTable: PhyState[0x%x] 0x%x\n", i, mpiGSTable->PhyState[i])); 3768285242Sachim } 3769285242Sachim } 3770285242Sachim 3771285242Sachim mpiGSTable->GPIOpins = ossaHwRegReadExt(agRoot, pcibar, (bit32)(GSTableOffset + GST_GPIO_PINS_OFFSET)); 3772285242Sachim SA_DBG4(("mpiReadGSTable: GPIOpins 0x%x\n", mpiGSTable->GPIOpins)); 3773285242Sachim 3774285242Sachim for (i = 0; i < 8; i++) 3775285242Sachim { 3776285242Sachim mpiGSTable->recoverErrInfo[i] = ossaHwRegReadExt(agRoot, pcibar, (bit32)(GSTableOffset + GST_RERRINFO_OFFSET)); 3777285242Sachim SA_DBG4(("mpiReadGSTable: recoverErrInfo[0x%x] 0x%x\n", i, mpiGSTable->recoverErrInfo[i])); 3778285242Sachim } 3779285242Sachim 3780285242Sachim smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "m9"); 3781285242Sachim 3782285242Sachim} 3783285242Sachim 3784285242Sachim/*******************************************************************************/ 3785285242Sachim/** \fn void siInitResources(agsaRoot_t *agRoot) 3786285242Sachim * Initialization of LL resources 3787285242Sachim * 3788285242Sachim * \param agsaRoot Handles for this instance of SAS/SATA LLL 3789285242Sachim * \param memoryAllocated Point to the data structure that holds the different 3790285242Sachim * chunks of memory that are required 3791285242Sachim * 3792285242Sachim * Return: 3793285242Sachim * None 3794285242Sachim */ 3795285242Sachim/*******************************************************************************/ 3796285242SachimGLOBAL void siInitResources(agsaRoot_t *agRoot, 3797285242Sachim agsaMemoryRequirement_t *memoryAllocated, 3798285242Sachim agsaHwConfig_t *hwConfig, 3799285242Sachim agsaSwConfig_t *swConfig, 3800285242Sachim bit32 usecsPerTick) 3801285242Sachim{ 3802285242Sachim agsaLLRoot_t *saRoot; 3803285242Sachim agsaDeviceDesc_t *pDeviceDesc; 3804285242Sachim agsaIORequestDesc_t *pRequestDesc; 3805285242Sachim agsaTimerDesc_t *pTimerDesc; 3806285242Sachim agsaPort_t *pPort; 3807285242Sachim agsaPortMap_t *pPortMap; 3808285242Sachim agsaDeviceMap_t *pDeviceMap; 3809285242Sachim agsaIOMap_t *pIOMap; 3810285242Sachim bit32 maxNumIODevices; 3811285242Sachim bit32 i, j; 3812285242Sachim mpiICQueue_t *circularIQ; 3813285242Sachim mpiOCQueue_t *circularOQ; 3814285242Sachim 3815285242Sachim if (agNULL == agRoot) 3816285242Sachim { 3817285242Sachim return; 3818285242Sachim } 3819285242Sachim 3820285242Sachim /* Get the saRoot memory address */ 3821285242Sachim saRoot = (agsaLLRoot_t *) (memoryAllocated->agMemory[LLROOT_MEM_INDEX].virtPtr); 3822285242Sachim agRoot->sdkData = (void *) saRoot; 3823285242Sachim 3824285242Sachim /* Setup Device link */ 3825285242Sachim /* Save the information of allocated device Link memory */ 3826285242Sachim saRoot->deviceLinkMem = memoryAllocated->agMemory[DEVICELINK_MEM_INDEX]; 3827285242Sachim si_memset(saRoot->deviceLinkMem.virtPtr, 0, saRoot->deviceLinkMem.totalLength); 3828285242Sachim SA_DBG2(("siInitResources: [%d] saRoot->deviceLinkMem VirtPtr=%p PhysicalLo=%x Count=%x Total=%x type %x\n" , 3829285242Sachim DEVICELINK_MEM_INDEX, 3830285242Sachim saRoot->deviceLinkMem.virtPtr, 3831285242Sachim saRoot->deviceLinkMem.phyAddrLower, 3832285242Sachim saRoot->deviceLinkMem.numElements, 3833285242Sachim saRoot->deviceLinkMem.totalLength, 3834285242Sachim saRoot->deviceLinkMem.type)); 3835285242Sachim 3836285242Sachim maxNumIODevices = swConfig->numDevHandles; 3837285242Sachim SA_DBG2(("siInitResources: maxNumIODevices=%d, swConfig->numDevHandles=%d \n", 3838285242Sachim maxNumIODevices, 3839285242Sachim swConfig->numDevHandles)); 3840285242Sachim 3841285242Sachim /* Setup free IO Devices link list */ 3842285242Sachim saLlistInitialize(&(saRoot->freeDevicesList)); 3843285242Sachim for ( i = 0; i < (bit32) maxNumIODevices; i ++ ) 3844285242Sachim { 3845285242Sachim /* get the pointer to the device descriptor */ 3846285242Sachim pDeviceDesc = (agsaDeviceDesc_t *) AGSAMEM_ELEMENT_READ(&(saRoot->deviceLinkMem), i); 3847285242Sachim /* Initialize device descriptor */ 3848285242Sachim saLlinkInitialize(&(pDeviceDesc->linkNode)); 3849285242Sachim 3850285242Sachim pDeviceDesc->initiatorDevHandle.osData = agNULL; 3851285242Sachim pDeviceDesc->initiatorDevHandle.sdkData = agNULL; 3852285242Sachim pDeviceDesc->targetDevHandle.osData = agNULL; 3853285242Sachim pDeviceDesc->targetDevHandle.sdkData = agNULL; 3854285242Sachim pDeviceDesc->deviceType = SAS_SATA_UNKNOWN_DEVICE; 3855285242Sachim pDeviceDesc->pPort = agNULL; 3856285242Sachim pDeviceDesc->DeviceMapIndex = 0; 3857285242Sachim 3858285242Sachim saLlistInitialize(&(pDeviceDesc->pendingIORequests)); 3859285242Sachim 3860285242Sachim /* Add the device descriptor to the free IO device link list */ 3861285242Sachim saLlistAdd(&(saRoot->freeDevicesList), &(pDeviceDesc->linkNode)); 3862285242Sachim } 3863285242Sachim 3864285242Sachim /* Setup IO Request link */ 3865285242Sachim /* Save the information of allocated IO Request Link memory */ 3866285242Sachim saRoot->IORequestMem = memoryAllocated->agMemory[IOREQLINK_MEM_INDEX]; 3867285242Sachim si_memset(saRoot->IORequestMem.virtPtr, 0, saRoot->IORequestMem.totalLength); 3868285242Sachim 3869285242Sachim SA_DBG2(("siInitResources: [%d] saRoot->IORequestMem VirtPtr=%p PhysicalLo=%x Count=%x Total=%x type %x\n", 3870285242Sachim IOREQLINK_MEM_INDEX, 3871285242Sachim saRoot->IORequestMem.virtPtr, 3872285242Sachim saRoot->IORequestMem.phyAddrLower, 3873285242Sachim saRoot->IORequestMem.numElements, 3874285242Sachim saRoot->IORequestMem.totalLength, 3875285242Sachim saRoot->IORequestMem.type)); 3876285242Sachim 3877285242Sachim /* Setup free IO Request link list */ 3878285242Sachim saLlistIOInitialize(&(saRoot->freeIORequests)); 3879285242Sachim saLlistIOInitialize(&(saRoot->freeReservedRequests)); 3880285242Sachim for ( i = 0; i < swConfig->maxActiveIOs; i ++ ) 3881285242Sachim { 3882285242Sachim /* get the pointer to the request descriptor */ 3883285242Sachim pRequestDesc = (agsaIORequestDesc_t *) AGSAMEM_ELEMENT_READ(&(saRoot->IORequestMem), i); 3884285242Sachim /* Initialize request descriptor */ 3885285242Sachim saLlinkIOInitialize(&(pRequestDesc->linkNode)); 3886285242Sachim 3887285242Sachim pRequestDesc->valid = agFALSE; 3888285242Sachim pRequestDesc->requestType = AGSA_REQ_TYPE_UNKNOWN; 3889285242Sachim pRequestDesc->pIORequestContext = agNULL; 3890285242Sachim pRequestDesc->HTag = i; 3891285242Sachim pRequestDesc->pDevice = agNULL; 3892285242Sachim pRequestDesc->pPort = agNULL; 3893285242Sachim 3894285242Sachim /* Add the request descriptor to the free IO Request link list */ 3895285242Sachim /* Add the request descriptor to the free Reserved Request link list */ 3896285242Sachim /* SMP request must get service so reserve one request when first SMP completes */ 3897285242Sachim if(saLlistIOGetCount(&(saRoot->freeReservedRequests)) < SA_RESERVED_REQUEST_COUNT) 3898285242Sachim { 3899285242Sachim saLlistIOAdd(&(saRoot->freeReservedRequests), &(pRequestDesc->linkNode)); 3900285242Sachim } 3901285242Sachim else 3902285242Sachim { 3903285242Sachim saLlistIOAdd(&(saRoot->freeIORequests), &(pRequestDesc->linkNode)); 3904285242Sachim } 3905285242Sachim } 3906285242Sachim 3907285242Sachim 3908285242Sachim /* Setup timer link */ 3909285242Sachim /* Save the information of allocated timer Link memory */ 3910285242Sachim saRoot->timerLinkMem = memoryAllocated->agMemory[TIMERLINK_MEM_INDEX]; 3911285242Sachim si_memset(saRoot->timerLinkMem.virtPtr, 0, saRoot->timerLinkMem.totalLength); 3912285242Sachim SA_DBG2(("siInitResources: [%d] saRoot->timerLinkMem VirtPtr=%p PhysicalLo=%x Count=%x Total=%x type %x\n", 3913285242Sachim TIMERLINK_MEM_INDEX, 3914285242Sachim saRoot->timerLinkMem.virtPtr, 3915285242Sachim saRoot->timerLinkMem.phyAddrLower, 3916285242Sachim saRoot->timerLinkMem.numElements, 3917285242Sachim saRoot->timerLinkMem.totalLength, 3918285242Sachim saRoot->timerLinkMem.type)); 3919285242Sachim 3920285242Sachim /* Setup free timer link list */ 3921285242Sachim saLlistInitialize(&(saRoot->freeTimers)); 3922285242Sachim for ( i = 0; i < NUM_TIMERS; i ++ ) 3923285242Sachim { 3924285242Sachim /* get the pointer to the timer descriptor */ 3925285242Sachim pTimerDesc = (agsaTimerDesc_t *) AGSAMEM_ELEMENT_READ(&(saRoot->timerLinkMem), i); 3926285242Sachim /* Initialize timer descriptor */ 3927285242Sachim saLlinkInitialize(&(pTimerDesc->linkNode)); 3928285242Sachim 3929285242Sachim pTimerDesc->valid = agFALSE; 3930285242Sachim pTimerDesc->timeoutTick = 0; 3931285242Sachim pTimerDesc->pfnTimeout = agNULL; 3932285242Sachim pTimerDesc->Event = 0; 3933285242Sachim pTimerDesc->pParm = agNULL; 3934285242Sachim 3935285242Sachim /* Add the timer descriptor to the free timer link list */ 3936285242Sachim saLlistAdd(&(saRoot->freeTimers), &(pTimerDesc->linkNode)); 3937285242Sachim } 3938285242Sachim /* Setup valid timer link list */ 3939285242Sachim saLlistInitialize(&(saRoot->validTimers)); 3940285242Sachim 3941285242Sachim /* Setup Phys */ 3942285242Sachim /* Setup PhyCount */ 3943285242Sachim saRoot->phyCount = (bit8) hwConfig->phyCount; 3944285242Sachim /* Init Phy data structure */ 3945285242Sachim for ( i = 0; i < saRoot->phyCount; i ++ ) 3946285242Sachim { 3947285242Sachim saRoot->phys[i].pPort = agNULL; 3948285242Sachim saRoot->phys[i].phyId = (bit8) i; 3949285242Sachim 3950285242Sachim /* setup phy status is PHY_STOPPED */ 3951285242Sachim PHY_STATUS_SET(&(saRoot->phys[i]), PHY_STOPPED); 3952285242Sachim } 3953285242Sachim 3954285242Sachim /* Setup Ports */ 3955285242Sachim /* Setup PortCount */ 3956285242Sachim saRoot->portCount = saRoot->phyCount; 3957285242Sachim /* Setup free port link list */ 3958285242Sachim saLlistInitialize(&(saRoot->freePorts)); 3959285242Sachim for ( i = 0; i < saRoot->portCount; i ++ ) 3960285242Sachim { 3961285242Sachim /* get the pointer to the port */ 3962285242Sachim pPort = &(saRoot->ports[i]); 3963285242Sachim /* Initialize port */ 3964285242Sachim saLlinkInitialize(&(pPort->linkNode)); 3965285242Sachim 3966285242Sachim pPort->portContext.osData = agNULL; 3967285242Sachim pPort->portContext.sdkData = pPort; 3968285242Sachim pPort->portId = 0; 3969285242Sachim pPort->portIdx = (bit8) i; 3970285242Sachim pPort->status = PORT_NORMAL; 3971285242Sachim 3972285242Sachim for ( j = 0; j < saRoot->phyCount; j ++ ) 3973285242Sachim { 3974285242Sachim pPort->phyMap[j] = agFALSE; 3975285242Sachim } 3976285242Sachim 3977285242Sachim saLlistInitialize(&(pPort->listSASATADevices)); 3978285242Sachim 3979285242Sachim /* Add the port to the free port link list */ 3980285242Sachim saLlistAdd(&(saRoot->freePorts), &(pPort->linkNode)); 3981285242Sachim } 3982285242Sachim /* Setup valid port link list */ 3983285242Sachim saLlistInitialize(&(saRoot->validPorts)); 3984285242Sachim 3985285242Sachim /* Init sysIntsActive */ 3986285242Sachim saRoot->sysIntsActive = agFALSE; 3987285242Sachim 3988285242Sachim /* setup timer tick granunarity */ 3989285242Sachim saRoot->usecsPerTick = usecsPerTick; 3990285242Sachim 3991285242Sachim /* initialize LL timer tick */ 3992285242Sachim saRoot->timeTick = 0; 3993285242Sachim 3994285242Sachim /* initialize device (de)registration callback fns */ 3995285242Sachim saRoot->DeviceRegistrationCB = agNULL; 3996285242Sachim saRoot->DeviceDeregistrationCB = agNULL; 3997285242Sachim 3998285242Sachim /* Initialize the PortMap for port context */ 3999285242Sachim for ( i = 0; i < saRoot->portCount; i ++ ) 4000285242Sachim { 4001285242Sachim pPortMap = &(saRoot->PortMap[i]); 4002285242Sachim 4003285242Sachim pPortMap->PortContext = agNULL; 4004285242Sachim pPortMap->PortID = PORT_MARK_OFF; 4005285242Sachim pPortMap->PortStatus = PORT_NORMAL; 4006285242Sachim saRoot->autoDeregDeviceflag[i] = 0; 4007285242Sachim } 4008285242Sachim 4009285242Sachim /* Initialize the DeviceMap for device handle */ 4010285242Sachim for ( i = 0; i < MAX_IO_DEVICE_ENTRIES; i ++ ) 4011285242Sachim { 4012285242Sachim pDeviceMap = &(saRoot->DeviceMap[i]); 4013285242Sachim 4014285242Sachim pDeviceMap->DeviceHandle = agNULL; 4015285242Sachim pDeviceMap->DeviceIdFromFW = i; 4016285242Sachim } 4017285242Sachim 4018285242Sachim /* Initialize the IOMap for IOrequest */ 4019285242Sachim for ( i = 0; i < MAX_ACTIVE_IO_REQUESTS; i ++ ) 4020285242Sachim { 4021285242Sachim pIOMap = &(saRoot->IOMap[i]); 4022285242Sachim 4023285242Sachim pIOMap->IORequest = agNULL; 4024285242Sachim pIOMap->Tag = MARK_OFF; 4025285242Sachim } 4026285242Sachim 4027285242Sachim /* clean the inbound queues */ 4028285242Sachim for (i = 0; i < saRoot->QueueConfig.numInboundQueues; i ++) 4029285242Sachim { 4030285242Sachim if(0 != saRoot->inboundQueue[i].numElements) 4031285242Sachim { 4032285242Sachim circularIQ = &saRoot->inboundQueue[i]; 4033285242Sachim si_memset(circularIQ->memoryRegion.virtPtr, 0, circularIQ->memoryRegion.totalLength); 4034285242Sachim si_memset(saRoot->inboundQueue[i].ciPointer, 0, sizeof(bit32)); 4035285242Sachim } 4036285242Sachim } 4037285242Sachim /* clean the outbound queues */ 4038285242Sachim for (i = 0; i < saRoot->QueueConfig.numOutboundQueues; i ++) 4039285242Sachim { 4040285242Sachim if(0 != saRoot->outboundQueue[i].numElements) 4041285242Sachim { 4042285242Sachim circularOQ = &saRoot->outboundQueue[i]; 4043285242Sachim si_memset(circularOQ->memoryRegion.virtPtr, 0, circularOQ->memoryRegion.totalLength); 4044285242Sachim si_memset(saRoot->outboundQueue[i].piPointer, 0, sizeof(bit32)); 4045285242Sachim circularOQ->producerIdx = 0; 4046285242Sachim circularOQ->consumerIdx = 0; 4047285242Sachim SA_DBG3(("siInitResource: Q %d Clean PI 0x%03x CI 0x%03x\n", i,circularOQ->producerIdx, circularOQ->consumerIdx)); 4048285242Sachim } 4049285242Sachim } 4050285242Sachim 4051285242Sachim return; 4052285242Sachim} 4053285242Sachim 4054285242Sachim/*******************************************************************************/ 4055285242Sachim/** \fn void mpiReadCALTable(agsaRoot_t *agRoot, 4056285242Sachim * spc_SPASTable_t *mpiCALTable, bit32 index) 4057285242Sachim * \brief Reading the Phy Analog Setup Register Table 4058285242Sachim * \param agsaRoot Handles for this instance of SAS/SATA LLL 4059285242Sachim * \param mpiCALTable Pointer of Phy Calibration Table 4060285242Sachim * 4061285242Sachim * Return: 4062285242Sachim * None 4063285242Sachim */ 4064285242Sachim/*******************************************************************************/ 4065285242SachimGLOBAL void mpiReadCALTable(agsaRoot_t *agRoot, 4066285242Sachim spc_SPASTable_t *mpiCALTable, 4067285242Sachim bit32 index) 4068285242Sachim{ 4069285242Sachim bit32 CFGTableOffset, TableOffset; 4070285242Sachim bit32 CALTableOffset; 4071285242Sachim bit8 pcibar; 4072285242Sachim 4073285242Sachim /* get offset of the configuration table */ 4074285242Sachim TableOffset = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_0,MSGU_SCRATCH_PAD_0); 4075285242Sachim 4076285242Sachim CFGTableOffset = TableOffset & SCRATCH_PAD0_OFFSET_MASK; 4077285242Sachim 4078285242Sachim /* get PCI BAR */ 4079285242Sachim TableOffset = (TableOffset & SCRATCH_PAD0_BAR_MASK) >> SHIFT26; 4080285242Sachim /* convert the PCI BAR to logical bar number */ 4081285242Sachim pcibar = (bit8)mpiGetPCIBarIndex(agRoot, TableOffset); 4082285242Sachim 4083285242Sachim /* read Calibration Table Offset from the configuration table */ 4084285242Sachim CALTableOffset = ossaHwRegReadExt(agRoot, pcibar, (bit32)CFGTableOffset + MAIN_ANALOG_SETUP_OFFSET); 4085285242Sachim if(smIS_SPCV(agRoot)) 4086285242Sachim { 4087285242Sachim CALTableOffset &= 0x00FFFFFF; 4088285242Sachim } 4089285242Sachim CALTableOffset = CFGTableOffset + CALTableOffset + (index * ANALOG_SETUP_ENTRY_SIZE * 4); 4090285242Sachim 4091285242Sachim mpiCALTable->spaReg0 = ossaHwRegReadExt(agRoot, pcibar, (bit32)(CALTableOffset + TX_PORT_CFG1_OFFSET)); 4092285242Sachim mpiCALTable->spaReg1 = ossaHwRegReadExt(agRoot, pcibar, (bit32)(CALTableOffset + TX_PORT_CFG2_OFFSET)); 4093285242Sachim mpiCALTable->spaReg2 = ossaHwRegReadExt(agRoot, pcibar, (bit32)(CALTableOffset + TX_PORT_CFG3_OFFSET)); 4094285242Sachim mpiCALTable->spaReg3 = ossaHwRegReadExt(agRoot, pcibar, (bit32)(CALTableOffset + TX_CFG_OFFSET)); 4095285242Sachim mpiCALTable->spaReg4 = ossaHwRegReadExt(agRoot, pcibar, (bit32)(CALTableOffset + RV_PORT_CFG1_OFFSET)); 4096285242Sachim mpiCALTable->spaReg5 = ossaHwRegReadExt(agRoot, pcibar, (bit32)(CALTableOffset + RV_PORT_CFG2_OFFSET)); 4097285242Sachim mpiCALTable->spaReg6 = ossaHwRegReadExt(agRoot, pcibar, (bit32)(CALTableOffset + RV_CFG1_OFFSET)); 4098285242Sachim mpiCALTable->spaReg7 = ossaHwRegReadExt(agRoot, pcibar, (bit32)(CALTableOffset + RV_CFG2_OFFSET)); 4099285242Sachim 4100285242Sachim SA_DBG3(("mpiReadCALTable: spaReg0 0x%x\n", mpiCALTable->spaReg0)); 4101285242Sachim SA_DBG3(("mpiReadCALTable: spaReg1 0x%x\n", mpiCALTable->spaReg1)); 4102285242Sachim SA_DBG3(("mpiReadCALTable: spaReg2 0x%x\n", mpiCALTable->spaReg2)); 4103285242Sachim SA_DBG3(("mpiReadCALTable: spaReg3 0x%x\n", mpiCALTable->spaReg3)); 4104285242Sachim SA_DBG3(("mpiReadCALTable: spaReg4 0x%x\n", mpiCALTable->spaReg4)); 4105285242Sachim SA_DBG3(("mpiReadCALTable: spaReg5 0x%x\n", mpiCALTable->spaReg5)); 4106285242Sachim SA_DBG3(("mpiReadCALTable: spaReg6 0x%x\n", mpiCALTable->spaReg6)); 4107285242Sachim SA_DBG3(("mpiReadCALTable: spaReg7 0x%x\n", mpiCALTable->spaReg7)); 4108285242Sachim} 4109285242Sachim 4110285242Sachim/*******************************************************************************/ 4111285242Sachim/** \fn void mpiWriteCALTable(agsaRoot_t *agRoot, 4112285242Sachim * spc_SPASTable_t *mpiCALTable, index) 4113285242Sachim * \brief Writing the Phy Analog Setup Register Table 4114285242Sachim * \param agsaRoot Handles for this instance of SAS/SATA LLL 4115285242Sachim * \param mpiCALTable Pointer of Phy Calibration Table 4116285242Sachim * 4117285242Sachim * Return: 4118285242Sachim * None 4119285242Sachim */ 4120285242Sachim/*******************************************************************************/ 4121285242SachimGLOBAL void mpiWriteCALTable(agsaRoot_t *agRoot, 4122285242Sachim spc_SPASTable_t *mpiCALTable, 4123285242Sachim bit32 index) 4124285242Sachim{ 4125285242Sachim bit32 CFGTableOffset, TableOffset; 4126285242Sachim bit32 CALTableOffset; 4127285242Sachim bit8 pcibar; 4128285242Sachim 4129285242Sachim smTraceFuncEnter(hpDBG_VERY_LOUD,"m6"); 4130285242Sachim 4131285242Sachim /* get offset of the configuration table */ 4132285242Sachim TableOffset = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_0,MSGU_SCRATCH_PAD_0); 4133285242Sachim 4134285242Sachim CFGTableOffset = TableOffset & SCRATCH_PAD0_OFFSET_MASK; 4135285242Sachim 4136285242Sachim /* get PCI BAR */ 4137285242Sachim TableOffset = (TableOffset & SCRATCH_PAD0_BAR_MASK) >> SHIFT26; 4138285242Sachim /* convert the PCI BAR to logical bar number */ 4139285242Sachim pcibar = (bit8)mpiGetPCIBarIndex(agRoot, TableOffset); 4140285242Sachim 4141285242Sachim /* read Calibration Table Offset from the configuration table */ 4142285242Sachim CALTableOffset = ossaHwRegReadExt(agRoot, pcibar, (bit32)CFGTableOffset + MAIN_ANALOG_SETUP_OFFSET); 4143285242Sachim if(smIS_SPCV(agRoot)) 4144285242Sachim { 4145285242Sachim CALTableOffset &= 0x00FFFFFF; 4146285242Sachim } 4147285242Sachim CALTableOffset = CFGTableOffset + CALTableOffset + (index * ANALOG_SETUP_ENTRY_SIZE * 4); 4148285242Sachim 4149285242Sachim ossaHwRegWriteExt(agRoot, pcibar, (bit32)(CALTableOffset + TX_PORT_CFG1_OFFSET), mpiCALTable->spaReg0); 4150285242Sachim ossaHwRegWriteExt(agRoot, pcibar, (bit32)(CALTableOffset + TX_PORT_CFG2_OFFSET), mpiCALTable->spaReg1); 4151285242Sachim ossaHwRegWriteExt(agRoot, pcibar, (bit32)(CALTableOffset + TX_PORT_CFG3_OFFSET), mpiCALTable->spaReg2); 4152285242Sachim ossaHwRegWriteExt(agRoot, pcibar, (bit32)(CALTableOffset + TX_CFG_OFFSET), mpiCALTable->spaReg3); 4153285242Sachim ossaHwRegWriteExt(agRoot, pcibar, (bit32)(CALTableOffset + RV_PORT_CFG1_OFFSET), mpiCALTable->spaReg4); 4154285242Sachim ossaHwRegWriteExt(agRoot, pcibar, (bit32)(CALTableOffset + RV_PORT_CFG2_OFFSET), mpiCALTable->spaReg5); 4155285242Sachim ossaHwRegWriteExt(agRoot, pcibar, (bit32)(CALTableOffset + RV_CFG1_OFFSET), mpiCALTable->spaReg6); 4156285242Sachim ossaHwRegWriteExt(agRoot, pcibar, (bit32)(CALTableOffset + RV_CFG2_OFFSET), mpiCALTable->spaReg7); 4157285242Sachim 4158285242Sachim 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)); 4159285242Sachim 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)); 4160285242Sachim 4161285242Sachim smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "m6"); 4162285242Sachim} 4163285242Sachim 4164285242Sachim/*******************************************************************************/ 4165285242Sachim/** \fn void mpiWriteCALAll(agsaRoot_t *agRoot, 4166285242Sachim * agsaPhyAnalogSetupTable_t *mpiCALTable) 4167285242Sachim * \brief Writing the Phy Analog Setup Register Table 4168285242Sachim * \param agsaRoot Handles for this instance of SAS/SATA LLL 4169285242Sachim * \param mpiCALTable Pointer of Phy Calibration Table 4170285242Sachim * 4171285242Sachim * Return: 4172285242Sachim * None 4173285242Sachim */ 4174285242Sachim/*******************************************************************************/ 4175285242SachimGLOBAL void mpiWriteCALAll(agsaRoot_t *agRoot, 4176285242Sachim agsaPhyAnalogSetupTable_t *mpiCALTable) 4177285242Sachim{ 4178285242Sachim bit8 i; 4179285242Sachim smTraceFuncEnter(hpDBG_VERY_LOUD,"mz"); 4180285242Sachim 4181285242Sachim if(smIS_SPCV(agRoot)) 4182285242Sachim { 4183285242Sachim smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "mz"); 4184285242Sachim return; 4185285242Sachim } 4186285242Sachim 4187285242Sachim for (i = 0; i < MAX_INDEX; i++) 4188285242Sachim { 4189285242Sachim mpiWriteCALTable(agRoot, (spc_SPASTable_t *)&mpiCALTable->phyAnalogSetupRegisters[i], i); 4190285242Sachim } 4191285242Sachim smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "mz"); 4192285242Sachim} 4193285242Sachim 4194285242SachimGLOBAL void mpiWrAnalogSetupTable(agsaRoot_t *agRoot, 4195285242Sachim mpiConfig_t *config 4196285242Sachim ) 4197285242Sachim{ 4198285242Sachim 4199285242Sachim bit32 AnalogTableBase,CFGTableOffset, value,phy; 4200285242Sachim bit32 AnalogtableSize; 4201285242Sachim bit8 pcibar; 4202285242Sachim value = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_0,MSGU_SCRATCH_PAD_0); 4203285242Sachim pcibar = (bit8)mpiGetPCIBarIndex(agRoot, value); 4204285242Sachim 4205285242Sachim CFGTableOffset = value & SCRATCH_PAD0_OFFSET_MASK; 4206285242Sachim AnalogtableSize = AnalogTableBase = ossaHwRegReadExt(agRoot,pcibar , (bit32)CFGTableOffset + MAIN_ANALOG_SETUP_OFFSET); 4207285242Sachim AnalogtableSize &= 0xFF000000; 4208285242Sachim AnalogtableSize >>= SHIFT24; 4209285242Sachim AnalogTableBase &= 0x00FFFFFF; 4210285242Sachim 4211285242Sachim AnalogTableBase = CFGTableOffset + AnalogTableBase; 4212285242Sachim 4213285242Sachim// config->phyAnalogConfig.phyAnalogSetupRegisters[0].spaRegister0 = 0; 4214285242Sachim SA_DBG1(("mpiWrAnalogSetupTable:Analogtable Base Offset %08X pcibar %d\n",AnalogTableBase, pcibar )); 4215285242Sachim 4216285242Sachim SA_DBG1(("mpiWrAnalogSetupTable:%d %d\n",(int)sizeof(agsaPhyAnalogSetupRegisters_t), AnalogtableSize)); 4217285242Sachim 4218285242Sachim for(phy = 0; phy < 10; phy++) /* upto 10 phys See PM*/ 4219285242Sachim { 4220285242Sachim ossaHwRegWriteExt(agRoot, pcibar,(AnalogTableBase + ( AnalogtableSize * phy)+ 0 ),config->phyAnalogConfig.phyAnalogSetupRegisters[phy].spaRegister0 ); 4221285242Sachim ossaHwRegWriteExt(agRoot, pcibar,(AnalogTableBase + ( AnalogtableSize * phy)+ 4 ),config->phyAnalogConfig.phyAnalogSetupRegisters[phy].spaRegister1 ); 4222285242Sachim ossaHwRegWriteExt(agRoot, pcibar,(AnalogTableBase + ( AnalogtableSize * phy)+ 8 ),config->phyAnalogConfig.phyAnalogSetupRegisters[phy].spaRegister2 ); 4223285242Sachim ossaHwRegWriteExt(agRoot, pcibar,(AnalogTableBase + ( AnalogtableSize * phy)+ 12),config->phyAnalogConfig.phyAnalogSetupRegisters[phy].spaRegister3 ); 4224285242Sachim ossaHwRegWriteExt(agRoot, pcibar,(AnalogTableBase + ( AnalogtableSize * phy)+ 16),config->phyAnalogConfig.phyAnalogSetupRegisters[phy].spaRegister4 ); 4225285242Sachim ossaHwRegWriteExt(agRoot, pcibar,(AnalogTableBase + ( AnalogtableSize * phy)+ 20),config->phyAnalogConfig.phyAnalogSetupRegisters[phy].spaRegister5 ); 4226285242Sachim ossaHwRegWriteExt(agRoot, pcibar,(AnalogTableBase + ( AnalogtableSize * phy)+ 24),config->phyAnalogConfig.phyAnalogSetupRegisters[phy].spaRegister6 ); 4227285242Sachim ossaHwRegWriteExt(agRoot, pcibar,(AnalogTableBase + ( AnalogtableSize * phy)+ 28),config->phyAnalogConfig.phyAnalogSetupRegisters[phy].spaRegister7 ); 4228285242Sachim ossaHwRegWriteExt(agRoot, pcibar,(AnalogTableBase + ( AnalogtableSize * phy)+ 32),config->phyAnalogConfig.phyAnalogSetupRegisters[phy].spaRegister8 ); 4229285242Sachim ossaHwRegWriteExt(agRoot, pcibar,(AnalogTableBase + ( AnalogtableSize * phy)+ 36),config->phyAnalogConfig.phyAnalogSetupRegisters[phy].spaRegister9 ); 4230285242Sachim 4231285242Sachim 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 ))); 4232285242Sachim 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 ))); 4233285242Sachim SA_DBG4(("mpiWrAnalogSetupTable:phy %d Offset 0x%08x spaRegister2 0x%x\n",phy, (bit32) AnalogTableBase+ (AnalogtableSize * phy) + 8,config->phyAnalogConfig.phyAnalogSetupRegisters[phy].spaRegister2 )); 4234285242Sachim SA_DBG4(("mpiWrAnalogSetupTable:phy %d Offset 0x%08x spaRegister3 0x%x\n",phy, (bit32) AnalogTableBase+ (AnalogtableSize * phy) +12,config->phyAnalogConfig.phyAnalogSetupRegisters[phy].spaRegister3 )); 4235285242Sachim SA_DBG4(("mpiWrAnalogSetupTable:phy %d Offset 0x%08x spaRegister4 0x%x\n",phy, (bit32) AnalogTableBase+ (AnalogtableSize * phy) +16,config->phyAnalogConfig.phyAnalogSetupRegisters[phy].spaRegister4 )); 4236285242Sachim SA_DBG4(("mpiWrAnalogSetupTable:phy %d Offset 0x%08x spaRegister5 0x%x\n",phy, (bit32) AnalogTableBase+ (AnalogtableSize * phy) +20,config->phyAnalogConfig.phyAnalogSetupRegisters[phy].spaRegister5 )); 4237285242Sachim SA_DBG4(("mpiWrAnalogSetupTable:phy %d Offset 0x%08x spaRegister6 0x%x\n",phy, (bit32) AnalogTableBase+ (AnalogtableSize * phy) +24,config->phyAnalogConfig.phyAnalogSetupRegisters[phy].spaRegister6 )); 4238285242Sachim SA_DBG4(("mpiWrAnalogSetupTable:phy %d Offset 0x%08x spaRegister7 0x%x\n",phy, (bit32) AnalogTableBase+ (AnalogtableSize * phy) +28,config->phyAnalogConfig.phyAnalogSetupRegisters[phy].spaRegister7 )); 4239285242Sachim SA_DBG4(("mpiWrAnalogSetupTable:phy %d Offset 0x%08x spaRegister8 0x%x\n",phy, (bit32) AnalogTableBase+ (AnalogtableSize * phy) +32,config->phyAnalogConfig.phyAnalogSetupRegisters[phy].spaRegister8 )); 4240285242Sachim SA_DBG4(("mpiWrAnalogSetupTable:phy %d Offset 0x%08x spaRegister9 0x%x\n",phy, (bit32) AnalogTableBase+ (AnalogtableSize * phy) +36,config->phyAnalogConfig.phyAnalogSetupRegisters[phy].spaRegister9 )); 4241285242Sachim } 4242285242Sachim 4243285242Sachim} 4244285242Sachim 4245285242Sachim 4246285242SachimGLOBAL void mpiWrIntVecTable(agsaRoot_t *agRoot, 4247285242Sachim mpiConfig_t* config 4248285242Sachim ) 4249285242Sachim{ 4250285242Sachim bit32 CFGTableOffset, value; 4251285242Sachim bit32 INTVTableOffset; 4252285242Sachim bit32 ValuetoWrite; 4253285242Sachim bit8 pcibar, i,obq; 4254285242Sachim 4255285242Sachim /* get offset of the configuration table */ 4256285242Sachim value = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_0,MSGU_SCRATCH_PAD_0); 4257285242Sachim 4258285242Sachim CFGTableOffset = value & SCRATCH_PAD0_OFFSET_MASK; 4259285242Sachim 4260285242Sachim /* get PCI BAR */ 4261285242Sachim value = (value & SCRATCH_PAD0_BAR_MASK) >> SHIFT26; 4262285242Sachim /* convert the PCI BAR to logical bar number */ 4263285242Sachim pcibar = (bit8)mpiGetPCIBarIndex(agRoot, value); 4264285242Sachim 4265285242Sachim /* read Interrupt Table Offset from the main configuration table */ 4266285242Sachim INTVTableOffset = ossaHwRegReadExt(agRoot, pcibar, (bit32)CFGTableOffset + MAIN_INT_VEC_TABLE_OFFSET); 4267285242Sachim INTVTableOffset &= 0x00FFFFFF; 4268285242Sachim INTVTableOffset = CFGTableOffset + INTVTableOffset; 4269285242Sachim SA_DBG1(("mpiWrIntVecTable: Base Offset %08X\n",(bit32)(INTVTableOffset + INT_VT_Coal_CNT_TO ) )); 4270285242Sachim 4271285242Sachim for (i = 0; i < MAX_NUM_VECTOR; i ++) 4272285242Sachim { 4273285242Sachim bit32 found=0; 4274285242Sachim for (obq = 0; obq < MAX_NUM_VECTOR; obq++) 4275285242Sachim { /* find OBQ for vector i */ 4276285242Sachim if( config->outboundQueues[obq].interruptVector == i ) 4277285242Sachim { 4278285242Sachim found=1; 4279285242Sachim break; 4280285242Sachim } 4281285242Sachim } 4282285242Sachim 4283285242Sachim if(!found ) 4284285242Sachim { 4285285242Sachim continue; 4286285242Sachim } 4287285242Sachim 4288285242Sachim ValuetoWrite = (( config->outboundQueues[obq].interruptDelay << SHIFT15) | config->outboundQueues[obq].interruptThreshold ); 4289285242Sachim 4290285242Sachim ossaHwRegWriteExt(agRoot, pcibar, (bit32)(INTVTableOffset + INT_VT_Coal_CNT_TO + i * sizeof(InterruptVT_t)), ValuetoWrite ); 4291285242Sachim 4292285242Sachim SA_DBG3(("mpiWrIntVecTable: Q %d interruptDelay 0x%X interruptThreshold 0x%X \n",i, 4293285242Sachim config->outboundQueues[i].interruptDelay, config->outboundQueues[i].interruptThreshold )); 4294285242Sachim 4295285242Sachim SA_DBG3(("mpiWrIntVecTable: %d INT_VT_Coal_CNT_TO Bar %d Offset %3X Writing 0x%08x\n",i, 4296285242Sachim pcibar, 4297285242Sachim (bit32)(INTVTableOffset + INT_VT_Coal_CNT_TO + i * sizeof(InterruptVT_t)), 4298285242Sachim ValuetoWrite)); 4299285242Sachim 4300285242Sachim } 4301285242Sachim 4302285242Sachim for (i = 0; i < MAX_NUM_VECTOR; i++) 4303285242Sachim { 4304285242Sachim /* read interrupt colescing control and timer */ 4305285242Sachim value = ossaHwRegReadExt(agRoot, pcibar, (bit32)(INTVTableOffset + INT_VT_Coal_CNT_TO + i * sizeof(InterruptVT_t))); 4306285242Sachim 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)); 4307285242Sachim } 4308285242Sachim} 4309285242Sachim 4310285242SachimGLOBAL void mpiWrPhyAttrbTable(agsaRoot_t *agRoot, sasPhyAttribute_t *phyAttrib) 4311285242Sachim{ 4312285242Sachim bit32 CFGTableOffset, value; 4313285242Sachim bit32 PHYTableOffset; 4314285242Sachim bit8 pcibar, i; 4315285242Sachim 4316285242Sachim /* get offset of the configuration table */ 4317285242Sachim value = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_0,MSGU_SCRATCH_PAD_0); 4318285242Sachim 4319285242Sachim CFGTableOffset = value & SCRATCH_PAD0_OFFSET_MASK; 4320285242Sachim 4321285242Sachim /* get PCI BAR */ 4322285242Sachim value = (value & SCRATCH_PAD0_BAR_MASK) >> SHIFT26; 4323285242Sachim /* convert the PCI BAR to logical bar number */ 4324285242Sachim pcibar = (bit8)mpiGetPCIBarIndex(agRoot, value); 4325285242Sachim 4326285242Sachim /* read Phy Attribute Table Offset from the configuration table */ 4327285242Sachim PHYTableOffset = ossaHwRegReadExt(agRoot, pcibar, (bit32)CFGTableOffset + MAIN_PHY_ATTRIBUTE_OFFSET); 4328285242Sachim 4329285242Sachim PHYTableOffset &=0x00FFFFFF; 4330285242Sachim 4331285242Sachim PHYTableOffset = CFGTableOffset + PHYTableOffset + PHY_EVENT_OQ; 4332285242Sachim 4333285242Sachim SA_DBG1(("mpiWrPhyAttrbTable: PHYTableOffset 0x%08x\n", PHYTableOffset)); 4334285242Sachim 4335285242Sachim /* write OQ event per phy */ 4336285242Sachim for (i = 0; i < MAX_VALID_PHYS; i ++) 4337285242Sachim { 4338285242Sachim ossaHwRegWriteExt(agRoot, pcibar, (bit32)(PHYTableOffset + i * sizeof(phyAttrb_t)), phyAttrib->phyAttribute[i].phyEventOQ); 4339285242Sachim 4340285242Sachim SA_DBG3(("mpiWrPhyAttrbTable:%d Offset 0x%08x phyAttribute 0x%x\n",i,(bit32)(PHYTableOffset + i * sizeof(phyAttrb_t)), phyAttrib->phyAttribute[i].phyEventOQ )); 4341285242Sachim 4342285242Sachim 4343285242Sachim } 4344285242Sachim 4345285242Sachim for (i = 0; i < MAX_VALID_PHYS; i ++) 4346285242Sachim { 4347285242Sachim value = ossaHwRegReadExt(agRoot, pcibar, (bit32)(PHYTableOffset + i * sizeof(phyAttrb_t))); 4348285242Sachim SA_DBG1(("mpiWrPhyAttrbTable: OQ Event per phy[%x] 0x%x\n", i, value)); 4349285242Sachim } 4350285242Sachim} 4351285242Sachim 4352285242Sachim 4353285242Sachim#ifdef TEST /******************************************************************/ 4354285242Sachim/*******************************************************************************/ 4355285242Sachim/** \fn mpiFreezeInboundQueue(agsaRoot_t *agRoot) 4356285242Sachim * \brief Freeze the inbound queue 4357285242Sachim * 4358285242Sachim * \param agRoot Handles for this instance of SAS/SATA hardware 4359285242Sachim * \param bitMapQueueNum0 bit map for inbound queue number 0 - 31 to freeze 4360285242Sachim * \param bitMapQueueNum1 bit map for inbound queue number 32 - 63 to freeze 4361285242Sachim * 4362285242Sachim * Return: 4363285242Sachim * AGSA_RC_SUCCESS if Un-initialize the configuration table sucessful 4364285242Sachim * AGSA_RC_FAILURE if Un-initialize the configuration table failed 4365285242Sachim */ 4366285242Sachim/*******************************************************************************/ 4367285242SachimGLOBAL bit32 mpiFreezeInboundQueue(agsaRoot_t *agRoot, bit32 bitMapQueueNum0, bit32 bitMapQueueNum1) 4368285242Sachim{ 4369285242Sachim bit32 value, togglevalue; 4370285242Sachim bit32 max_wait_time; 4371285242Sachim bit32 max_wait_count; 4372285242Sachim 4373285242Sachim SA_DBG2(("Entering function:mpiFreezeInboundQueue\n")); 4374285242Sachim SA_ASSERT(NULL != agRoot, "agRoot argument cannot be null"); 4375285242Sachim 4376285242Sachim togglevalue = 0; 4377285242Sachim 4378285242Sachim if (bitMapQueueNum0) 4379285242Sachim { 4380285242Sachim /* update the inbound queue number to HOST_SCRATCH_PAD1 register for queue 0 to 31 */ 4381285242Sachim SA_DBG1(("mpiFreezeInboundQueue: SCRATCH_PAD0 value = 0x%x\n", siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_0,MSGU_SCRATCH_PAD_0))); 4382285242Sachim SA_DBG1(("mpiFreezeInboundQueue: SCRATCH_PAD3 value = 0x%x\n", siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_3,MSGU_SCRATCH_PAD_3))); 4383285242Sachim 4384285242Sachim value = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_0,MSGU_SCRATCH_PAD_1); 4385285242Sachim value |= bitMapQueueNum0; 4386285242Sachim siHalRegWriteExt(agRoot, GEN_MSGU_HOST_SCRATCH_PAD_1, MSGU_HOST_SCRATCH_PAD_1, value); 4387285242Sachim } 4388285242Sachim 4389285242Sachim if (bitMapQueueNum1) 4390285242Sachim { 4391285242Sachim /* update the inbound queue number to HOST_SCRATCH_PAD2 register for queue 32 to 63 */ 4392285242Sachim value = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_2,MSGU_SCRATCH_PAD_2); 4393285242Sachim value |= bitMapQueueNum1; 4394285242Sachim siHalRegWriteExt(agRoot, GEN_MSGU_HOST_SCRATCH_PAD_2, MSGU_HOST_SCRATCH_PAD_2, value); 4395285242Sachim } 4396285242Sachim 4397285242Sachim /* Write bit 2 to Inbound DoorBell Register */ 4398285242Sachim siHalRegWriteExt(agRoot, GEN_MSGU_IBDB_SET, MSGU_IBDB_SET, IBDB_IBQ_FREEZE); 4399285242Sachim 4400285242Sachim /* wait until Inbound DoorBell Clear Register toggled */ 4401285242Sachim max_wait_time = WAIT_SECONDS(gWait_2); /* 2 sec */ 4402285242Sachim max_wait_count = MAKE_MODULO(max_wait_time,WAIT_INCREMENT); 4403285242Sachim do 4404285242Sachim { 4405285242Sachim ossaStallThread(agRoot, WAIT_INCREMENT); 4406285242Sachim /* Read Inbound DoorBell Register - for RevB */ 4407285242Sachim// value = ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_IBDB_SET); 4408285242Sachim value = MSGU_READ_IDR; 4409285242Sachim value &= IBDB_IBQ_FREEZE; 4410285242Sachim } while ((value != togglevalue) && (max_wait_count -= WAIT_INCREMENT)); 4411285242Sachim 4412285242Sachim if (!max_wait_count) 4413285242Sachim { 4414285242Sachim SA_DBG1(("mpiFreezeInboundQueue: IBDB value/toggle = 0x%x 0x%x\n", value, togglevalue)); 4415285242Sachim return AGSA_RC_FAILURE; 4416285242Sachim } 4417285242Sachim 4418285242Sachim return AGSA_RC_SUCCESS; 4419285242Sachim} 4420285242Sachim 4421285242Sachim/******************************************************************************/ 4422285242Sachim/** \fn mpiUnFreezeInboundQueue(agsaRoot_t *agRoot) 4423285242Sachim * \brief Freeze the inbound queue 4424285242Sachim * 4425285242Sachim * \param agRoot Handles for this instance of SAS/SATA hardware 4426285242Sachim * \param bitMapQueueNum0 bit map for inbound queue number 0 - 31 to freeze 4427285242Sachim * \param bitMapQueueNum1 bit map for inbound queue number 32 - 63 to freeze 4428285242Sachim * 4429285242Sachim * Return: 4430285242Sachim * AGSA_RC_SUCCESS if Un-initialize the configuration table sucessful 4431285242Sachim * AGSA_RC_FAILURE if Un-initialize the configuration table failed 4432285242Sachim */ 4433285242Sachim/******************************************************************************/ 4434285242SachimGLOBAL bit32 mpiUnFreezeInboundQueue(agsaRoot_t *agRoot, bit32 bitMapQueueNum0, bit32 bitMapQueueNum1) 4435285242Sachim{ 4436285242Sachim bit32 value, togglevalue; 4437285242Sachim bit32 max_wait_time; 4438285242Sachim bit32 max_wait_count; 4439285242Sachim 4440285242Sachim SA_DBG2(("Entering function:mpiUnFreezeInboundQueue\n")); 4441285242Sachim SA_ASSERT(NULL != agRoot, "agRoot argument cannot be null"); 4442285242Sachim 4443285242Sachim togglevalue = 0; 4444285242Sachim 4445285242Sachim if (bitMapQueueNum0) 4446285242Sachim { 4447285242Sachim /* update the inbound queue number to HOST_SCRATCH_PAD1 register - for queue 0 to 31 */ 4448285242Sachim value = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_1,MSGU_SCRATCH_PAD_1); 4449285242Sachim value |= bitMapQueueNum0; 4450285242Sachim siHalRegWriteExt(agRoot, GEN_MSGU_HOST_SCRATCH_PAD_1, MSGU_HOST_SCRATCH_PAD_1, value); 4451285242Sachim } 4452285242Sachim 4453285242Sachim if (bitMapQueueNum1) 4454285242Sachim { 4455285242Sachim /* update the inbound queue number to HOST_SCRATCH_PAD2 register - for queue 32 to 63 */ 4456285242Sachim value = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_2,MSGU_SCRATCH_PAD_2); 4457285242Sachim value |= bitMapQueueNum1; 4458285242Sachim siHalRegWriteExt(agRoot, GEN_MSGU_HOST_SCRATCH_PAD_2, MSGU_HOST_SCRATCH_PAD_2, value); 4459285242Sachim } 4460285242Sachim 4461285242Sachim /* Write bit 2 to Inbound DoorBell Register */ 4462285242Sachim siHalRegWriteExt(agRoot, GEN_MSGU_IBDB_SET, MSGU_IBDB_SET, IBDB_IBQ_UNFREEZE); 4463285242Sachim 4464285242Sachim /* wait until Inbound DoorBell Clear Register toggled */ 4465285242Sachim max_wait_time = WAIT_SECONDS(gWait_2); /* 2 sec */ 4466285242Sachim max_wait_count = MAKE_MODULO(max_wait_time,WAIT_INCREMENT); 4467285242Sachim do 4468285242Sachim { 4469285242Sachim ossaStallThread(agRoot, WAIT_INCREMENT); 4470285242Sachim /* Read Inbound DoorBell Register - for RevB */ 4471285242Sachim value = MSGU_READ_IDR; 4472285242Sachim value &= IBDB_IBQ_UNFREEZE; 4473285242Sachim } while ((value != togglevalue) && (max_wait_count -= WAIT_INCREMENT)); 4474285242Sachim 4475285242Sachim if (!max_wait_count) 4476285242Sachim { 4477285242Sachim SA_DBG1(("mpiUnFreezeInboundQueue: IBDB value/toggle = 0x%x 0x%x\n", value, togglevalue)); 4478285242Sachim return AGSA_RC_FAILURE; 4479285242Sachim } 4480285242Sachim 4481285242Sachim return AGSA_RC_SUCCESS; 4482285242Sachim} 4483285242Sachim 4484285242Sachim#endif /* TEST ****************************************************************/ 4485285242Sachim 4486285242SachimGLOBAL bit32 si_check_V_HDA(agsaRoot_t *agRoot) 4487285242Sachim{ 4488285242Sachim bit32 ret = AGSA_RC_SUCCESS; 4489285242Sachim bit32 hda_status = 0; 4490285242Sachim 4491285242Sachim hda_status = (ossaHwRegReadExt(agRoot, PCIBAR0, SPC_V_HDA_RESPONSE_OFFSET+28)); 4492285242Sachim 4493285242Sachim SA_DBG1(("si_check_V_HDA: hda_status 0x%08X\n",hda_status )); 4494285242Sachim 4495285242Sachim if((hda_status & SPC_V_HDAR_RSPCODE_MASK) == SPC_V_HDAR_IDLE) 4496285242Sachim { 4497285242Sachim /* HDA mode */ 4498285242Sachim SA_DBG1(("si_check_V_HDA: HDA mode, value = 0x%x\n", hda_status)); 4499285242Sachim ret = AGSA_RC_HDA_NO_FW_RUNNING; 4500285242Sachim } 4501285242Sachim 4502285242Sachim 4503285242Sachim return(ret); 4504285242Sachim} 4505285242SachimGLOBAL bit32 si_check_V_Ready(agsaRoot_t *agRoot) 4506285242Sachim{ 4507285242Sachim bit32 ret = AGSA_RC_SUCCESS; 4508285242Sachim bit32 SCRATCH_PAD1; 4509285242Sachim bit32 max_wait_time; 4510285242Sachim bit32 max_wait_count; 4511285242Sachim/* ILA */ 4512285242Sachim max_wait_time = (200 * 1000); /* wait 200 milliseconds */ 4513285242Sachim max_wait_count = MAKE_MODULO(max_wait_time,WAIT_INCREMENT); 4514285242Sachim do 4515285242Sachim { 4516285242Sachim ossaStallThread(agRoot, WAIT_INCREMENT); 4517285242Sachim SCRATCH_PAD1 = ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_1); 4518285242Sachim } while (((SCRATCH_PAD1 & SCRATCH_PAD1_V_ILA_MASK) != SCRATCH_PAD1_V_ILA_MASK) && (max_wait_count -= WAIT_INCREMENT)); 4519285242Sachim 4520285242Sachim if (!max_wait_count) 4521285242Sachim { 4522285242Sachim 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)); 4523285242Sachim return( AGSA_RC_FAILURE); 4524285242Sachim } 4525285242Sachim /* RAAE */ 4526285242Sachim max_wait_time = (200 * 1000); /* wait 200 milliseconds */ 4527285242Sachim max_wait_count = MAKE_MODULO(max_wait_time,WAIT_INCREMENT); 4528285242Sachim do 4529285242Sachim { 4530285242Sachim ossaStallThread(agRoot, WAIT_INCREMENT); 4531285242Sachim SCRATCH_PAD1 = ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_1); 4532285242Sachim } while (((SCRATCH_PAD1 & SCRATCH_PAD1_V_RAAE_MASK) != SCRATCH_PAD1_V_RAAE_MASK) && (max_wait_count -= WAIT_INCREMENT)); 4533285242Sachim 4534285242Sachim if (!max_wait_count) 4535285242Sachim { 4536285242Sachim 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)); 4537285242Sachim return( AGSA_RC_FAILURE); 4538285242Sachim 4539285242Sachim } 4540285242Sachim /* IOP0 */ 4541285242Sachim max_wait_time = (200 * 1000); /* wait 200 milliseconds */ 4542285242Sachim max_wait_count = MAKE_MODULO(max_wait_time,WAIT_INCREMENT); 4543285242Sachim do 4544285242Sachim { 4545285242Sachim ossaStallThread(agRoot, WAIT_INCREMENT); 4546285242Sachim SCRATCH_PAD1 = ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_1); 4547285242Sachim } while (((SCRATCH_PAD1 & SCRATCH_PAD1_V_IOP0_MASK) != SCRATCH_PAD1_V_IOP0_MASK) && (max_wait_count -= WAIT_INCREMENT)); 4548285242Sachim 4549285242Sachim if (!max_wait_count) 4550285242Sachim { 4551285242Sachim 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)); 4552285242Sachim return( AGSA_RC_FAILURE); 4553285242Sachim 4554285242Sachim } 4555285242Sachim 4556285242Sachim /* IOP1 */ 4557285242Sachim max_wait_time = (200 * 1000); /* wait 200 milliseconds */ 4558285242Sachim max_wait_count = MAKE_MODULO(max_wait_time,WAIT_INCREMENT); 4559285242Sachim do 4560285242Sachim { 4561285242Sachim ossaStallThread(agRoot, WAIT_INCREMENT); 4562285242Sachim SCRATCH_PAD1 = ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_1); 4563285242Sachim } while (((SCRATCH_PAD1 & SCRATCH_PAD1_V_IOP1_MASK) != SCRATCH_PAD1_V_IOP1_MASK) && (max_wait_count -= WAIT_INCREMENT)); 4564285242Sachim 4565285242Sachim if (!max_wait_count) 4566285242Sachim { 4567285242Sachim 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)); 4568285242Sachim // return( AGSA_RC_FAILURE); 4569285242Sachim } 4570285242Sachim 4571285242Sachim return(ret); 4572285242Sachim} 4573285242Sachim 4574285242SachimGLOBAL bit32 siScratchDump(agsaRoot_t *agRoot) 4575285242Sachim{ 4576285242Sachim bit32 SCRATCH_PAD1; 4577285242Sachim bit32 ret =0; 4578285242Sachim#ifdef SALLSDK_DEBUG 4579285242Sachim bit32 SCRATCH_PAD2; 4580285242Sachim bit32 SCRATCH_PAD3; 4581285242Sachim bit32 SCRATCH_PAD0; 4582285242Sachim 4583285242Sachim SCRATCH_PAD0 = ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_0); 4584285242Sachim SCRATCH_PAD2 = ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_2); 4585285242Sachim SCRATCH_PAD3 = ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_3); 4586285242Sachim#endif /* SALLSDK_DEBUG */ 4587285242Sachim SCRATCH_PAD1 = ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_1); 4588285242Sachim 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 )); 4589285242Sachim 4590285242Sachim if((SCRATCH_PAD1 & SCRATCH_PAD1_V_RESERVED) == SCRATCH_PAD1_V_RESERVED ) 4591285242Sachim { 4592285242Sachim SA_DBG1(("siScratchDump: SCRATCH_PAD1 SCRATCH_PAD1_V_RESERVED 0x%08x\n", SCRATCH_PAD1_V_RESERVED)); 4593285242Sachim } 4594285242Sachim else 4595285242Sachim { 4596285242Sachim if((SCRATCH_PAD1 & SCRATCH_PAD1_V_RAAE_MASK) == SCRATCH_PAD1_V_RAAE_MASK ) 4597285242Sachim { 4598285242Sachim SA_DBG1(("siScratchDump: SCRATCH_PAD1 valid 0x%08x\n",SCRATCH_PAD0 )); 4599285242Sachim SA_DBG1(("siScratchDump: RAAE ready 0x%08x\n",SCRATCH_PAD1 & SCRATCH_PAD1_V_RAAE_MASK)); 4600285242Sachim } 4601285242Sachim if((SCRATCH_PAD1 & SCRATCH_PAD1_V_ILA_MASK) == SCRATCH_PAD1_V_ILA_MASK) 4602285242Sachim { 4603285242Sachim SA_DBG1(("siScratchDump: ILA ready 0x%08x\n", SCRATCH_PAD1 & SCRATCH_PAD1_V_ILA_MASK)); 4604285242Sachim } 4605285242Sachim 4606285242Sachim if(SCRATCH_PAD1 & SCRATCH_PAD1_V_BOOTSTATE_MASK) 4607285242Sachim { 4608285242Sachim SA_DBG1(("siScratchDump: BOOTSTATE not success 0x%08x\n",SCRATCH_PAD1 & SCRATCH_PAD1_V_BOOTSTATE_MASK)); 4609285242Sachim } 4610285242Sachim 4611285242Sachim if((SCRATCH_PAD1 & SCRATCH_PAD1_V_IOP0_MASK) == SCRATCH_PAD1_V_IOP0_MASK) 4612285242Sachim { 4613285242Sachim SA_DBG1(("siScratchDump: IOP0 ready 0x%08x\n",SCRATCH_PAD1 & SCRATCH_PAD1_V_IOP0_MASK)); 4614285242Sachim } 4615285242Sachim if((SCRATCH_PAD1 & SCRATCH_PAD1_V_IOP1_MASK) == SCRATCH_PAD1_V_IOP1_MASK) 4616285242Sachim { 4617285242Sachim SA_DBG1(("siScratchDump: IOP1 ready 0x%08x\n",SCRATCH_PAD1 & SCRATCH_PAD1_V_IOP1_MASK )); 4618285242Sachim } 4619285242Sachim if((SCRATCH_PAD1 & SCRATCH_PAD1_V_READY) == SCRATCH_PAD1_V_READY) 4620285242Sachim { 4621285242Sachim SA_DBG1(("siScratchDump: SCRATCH_PAD1_V_READY 0x%08x\n",SCRATCH_PAD1 & SCRATCH_PAD1_V_READY )); 4622285242Sachim } 4623285242Sachim if((SCRATCH_PAD1 & SCRATCH_PAD1_V_BOOTSTATE_MASK) == SCRATCH_PAD1_V_BOOTSTATE_MASK) 4624285242Sachim { 4625285242Sachim SA_DBG1(("siScratchDump: SCRATCH_PAD1_V_BOOTSTATE_MASK 0x%08x\n",SCRATCH_PAD1 & SCRATCH_PAD1_V_BOOTSTATE_MASK )); 4626285242Sachim } 4627285242Sachim } 4628285242Sachim return(ret); 4629285242Sachim 4630285242Sachim} 4631285242Sachim 4632285242Sachim 4633285242Sachimvoid si_macro_check(agsaRoot_t *agRoot) 4634285242Sachim{ 4635285242Sachim 4636285242Sachim SA_DBG1(("si_macro_check:smIS_SPC %d\n",smIS_SPC(agRoot) )); 4637285242Sachim SA_DBG1(("si_macro_check:smIS_HIL %d\n",smIS_HIL(agRoot) )); 4638285242Sachim SA_DBG1(("si_macro_check:smIS_SFC %d\n",smIS_SFC(agRoot) )); 4639285242Sachim 4640285242Sachim SA_DBG1(("si_macro_check:smIS_spc8001 %d\n",smIS_spc8001(agRoot) )); 4641285242Sachim SA_DBG1(("si_macro_check:smIS_spc8081 %d\n",smIS_spc8081(agRoot) )); 4642285242Sachim 4643285242Sachim SA_DBG1(("si_macro_check:smIS_SPCV8008 %d\n",smIS_SPCV8008(agRoot) )); 4644285242Sachim SA_DBG1(("si_macro_check:smIS_SPCV8009 %d\n",smIS_SPCV8009(agRoot) )); 4645285242Sachim SA_DBG1(("si_macro_check:smIS_SPCV8018 %d\n",smIS_SPCV8018(agRoot) )); 4646285242Sachim SA_DBG1(("si_macro_check:smIS_SPCV8019 %d\n",smIS_SPCV8019(agRoot) )); 4647285242Sachim SA_DBG1(("si_macro_check:smIS_ADAP8088 %d\n",smIS_ADAP8088(agRoot) )); 4648285242Sachim SA_DBG1(("si_macro_check:smIS_ADAP8089 %d\n",smIS_ADAP8089(agRoot) )); 4649285242Sachim SA_DBG1(("si_macro_check:smIS_SPCV8070 %d\n",smIS_SPCV8070(agRoot) )); 4650285242Sachim SA_DBG1(("si_macro_check:smIS_SPCV8071 %d\n",smIS_SPCV8071(agRoot) )); 4651285242Sachim SA_DBG1(("si_macro_check:smIS_SPCV8072 %d\n",smIS_SPCV8072(agRoot) )); 4652285242Sachim SA_DBG1(("si_macro_check:smIS_SPCV8073 %d\n",smIS_SPCV8073(agRoot) )); 4653285242Sachim SA_DBG1(("si_macro_check:smIS_SPCV8074 %d\n",smIS_SPCV8074(agRoot) )); 4654285242Sachim SA_DBG1(("si_macro_check:smIS_SPCV8075 %d\n",smIS_SPCV8075(agRoot) )); 4655285242Sachim SA_DBG1(("si_macro_check:smIS_SPCV8076 %d\n",smIS_SPCV8076(agRoot) )); 4656285242Sachim SA_DBG1(("si_macro_check:smIS_SPCV8077 %d\n",smIS_SPCV8077(agRoot) )); 4657285242Sachim SA_DBG1(("si_macro_check:smIS_SPCV9015 %d\n",smIS_SPCV9015(agRoot) )); 4658285242Sachim SA_DBG1(("si_macro_check:smIS_SPCV9060 %d\n",smIS_SPCV9060(agRoot) )); 4659285242Sachim SA_DBG1(("si_macro_check:smIS_SPCV %d\n",smIS_SPCV(agRoot) )); 4660285242Sachim 4661285242Sachim SA_DBG1(("si_macro_check:smIS64bInt %d\n", smIS64bInt(agRoot) )); 4662285242Sachim 4663285242Sachim} 4664285242Sachim 4665