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