sahw.c revision 285809
1/*******************************************************************************
2*Copyright (c) 2014 PMC-Sierra, Inc.  All rights reserved.
3*
4*Redistribution and use in source and binary forms, with or without modification, are permitted provided
5*that the following conditions are met:
6*1. Redistributions of source code must retain the above copyright notice, this list of conditions and the
7*following disclaimer.
8*2. Redistributions in binary form must reproduce the above copyright notice,
9*this list of conditions and the following disclaimer in the documentation and/or other materials provided
10*with the distribution.
11*
12*THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED
13*WARRANTIES,INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
14*FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
15*FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
16*NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
17*BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
18*LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
19*SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
20
21********************************************************************************/
22/*******************************************************************************/
23/*! \file sahw.c
24 *  \brief The file implements the functions for reset and shutdown
25 */
26/******************************************************************************/
27#include <sys/cdefs.h>
28__FBSDID("$FreeBSD$");
29#include <dev/pms/config.h>
30
31#include <dev/pms/RefTisa/sallsdk/spc/saglobal.h>
32#ifdef SA_ENABLE_HDA_FUNCTIONS
33#ifndef SA_EXCLUDE_FW_IMG
34/*
35#include "istrimg.h"
36#include "ilaimg.h"
37#include "aap1img.h"
38#include "iopimg.h"
39*/
40#endif
41#endif
42#if defined(SALLSDK_DEBUG)
43extern bit32 gLLSoftResetCounter;
44#endif
45
46#ifdef SA_ENABLE_TRACE_FUNCTIONS
47#ifdef siTraceFileID
48#undef siTraceFileID
49#endif
50#define siTraceFileID 'E'
51#endif
52
53
54bit32 gWait_3 = 3;
55bit32 gWait_2 = 2;
56
57bit32 gWaitmSec = 0;
58
59
60
61LOCAL bit32 si_V_SoftReset(agsaRoot_t  *agRoot, bit32       signature);
62
63
64LOCAL bit32 siSpcSoftResetRDYChk(agsaRoot_t *agRoot);
65
66#ifdef SA_ENABLE_HDA_FUNCTIONS
67LOCAL void siPciMemCpy(agsaRoot_t *agRoot, bit32 dstoffset, void *src,
68                       bit32 DWcount, bit32 busBaseNumber);
69
70LOCAL bit32 siBar4Cpy(agsaRoot_t  *agRoot, bit32 offset, bit8 *parray, bit32 array_size);
71#endif
72
73/******************************************************************************/
74/*! \brief Function to reset the Hardware
75 *
76 *  The saHwReset() function is called to reset the SAS/SATA HW controller
77 *  All outstanding I/Os are explicitly aborted.
78 *  This API need to access before saInitialize() so checking saRoot is needed
79 *
80 *  \param agRoot       Handles for this instance of SAS/SATA hardware
81 *  \param resetType    The reset type
82 *  \param resetParm    The paramter passed for reset operation
83 *
84 *  \return -void-
85 */
86/*******************************************************************************/
87GLOBAL void saHwReset(
88                     agsaRoot_t  *agRoot,
89                     bit32       resetType,
90                     bit32       resetParm
91                     )
92{
93  agsaLLRoot_t *saRoot = agNULL;
94  bit32        ret = AGSA_RC_SUCCESS;
95  bit32        value;
96  bit32        sysIntsActive = agFALSE;
97#if defined(SALLSDK_DEBUG)
98  bit32        value1;
99  agsaControllerStatus_t controllerStatus;
100  agsaFatalErrorInfo_t fatal_error;
101#endif
102
103#ifdef SOFT_RESET_TEST
104  DbgPrint("Reset Start\n");
105#endif
106
107  smTraceFuncEnter(hpDBG_VERY_LOUD, "5a");
108
109  /* sanity check */
110  SA_ASSERT( (agNULL != agRoot), "");
111  if (agNULL != agRoot)
112  {
113    if (agNULL != agRoot->sdkData)
114    {
115      saRoot = (agsaLLRoot_t*) agRoot->sdkData;
116      sysIntsActive =  saRoot->sysIntsActive;
117      if(sysIntsActive)
118      {
119        saSystemInterruptsActive(agRoot,agFALSE);
120      }
121    }
122  }
123  else
124  {
125    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "5a");
126    return;
127  }
128
129
130#if defined(SALLSDK_DEBUG)
131  {
132    if (agNULL != agRoot->sdkData)
133    {
134      /* check fatal errors */
135      value = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_1, MSGU_SCRATCH_PAD_1);
136      value1 = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_2, MSGU_SCRATCH_PAD_2);
137      /* check AAP error */
138      if( smIS_SPC(agRoot) )
139      {
140        value &= SCRATCH_PAD_STATE_MASK;
141        value1 &= SCRATCH_PAD_STATE_MASK;
142
143        if ((SCRATCH_PAD1_ERR == value) || (SCRATCH_PAD2_ERR == value1))
144        {
145
146          si_memset(&fatal_error, 0, sizeof(agsaFatalErrorInfo_t));
147          /* read detail fatal errors */
148          value = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_0, MSGU_SCRATCH_PAD_0);
149          fatal_error.errorInfo0 = value;
150          SA_DBG1(("saHwReset: ScratchPad0 AAP error code 0x%x\n", value));
151          value = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_1, MSGU_SCRATCH_PAD_1);
152          fatal_error.errorInfo1 = value;
153          /* AAP error state */
154          SA_DBG1(("saHwReset: AAP error state and error code 0x%x\n", value));
155          value = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_2, MSGU_SCRATCH_PAD_2);
156          fatal_error.errorInfo2 = value;
157          /* IOP error state */
158          SA_DBG1(("saHwReset: IOP error state and error code 0x%x\n", value));
159          value = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_3, MSGU_SCRATCH_PAD_3);
160          SA_DBG1(("saHwReset: ScratchPad3 IOP error code 0x%x\n", value));
161          fatal_error.errorInfo3 = value;
162          if (agNULL != saRoot)
163          {
164            fatal_error.regDumpBusBaseNum0 = saRoot->mainConfigTable.regDumpPCIBAR;
165            fatal_error.regDumpBusBaseNum1 = saRoot->mainConfigTable.regDumpPCIBAR;
166            fatal_error.regDumpLen0 = saRoot->mainConfigTable.FatalErrorDumpLength0;
167            fatal_error.regDumpLen1 = saRoot->mainConfigTable.FatalErrorDumpLength1;
168            fatal_error.regDumpOffset0 = saRoot->mainConfigTable.FatalErrorDumpOffset0;
169            fatal_error.regDumpOffset1 = saRoot->mainConfigTable.FatalErrorDumpOffset1;
170          }
171
172          /* Call Back with error */
173          SA_DBG1(("saHwReset: OSSA_HW_EVENT_MALFUNCTION SPC SP1 0x%x\n", value1));
174          ossaHwCB(agRoot, agNULL, OSSA_HW_EVENT_MALFUNCTION, 0, (void *)&fatal_error, agNULL);
175        }
176      }
177      else
178      {
179        if( ( (value & SCRATCH_PAD1_V_BOOTLDR_ERROR) == SCRATCH_PAD1_V_BOOTLDR_ERROR))
180        {
181          SA_DBG1(("saHwReset: ScratchPad1 SCRATCH_PAD1_V_BOOTLDR_ERROR 0x%x\n", value));
182        }
183        if(SCRATCH_PAD1_V_ERROR_STATE(value))
184        {
185          SA_DBG1(("saHwReset: ScratchPad1 SCRATCH_PAD1_V_ERROR_STATE  0x%x\n",SCRATCH_PAD1_V_ERROR_STATE(value) ));
186        }
187        if( (value & SCRATCH_PAD1_V_READY) == SCRATCH_PAD1_V_READY )
188        {
189          SA_DBG1(("saHwReset: ScratchPad1 SCRATCH_PAD1_V_READY  0x%x\n", value));
190        }
191      }
192      saGetControllerStatus(agRoot, &controllerStatus);
193      if (agNULL != saRoot)
194      {
195        /* display all pending Ios */
196        siDumpActiveIORequests(agRoot, saRoot->swConfig.maxActiveIOs);
197      }
198    }
199  }
200#endif /* SALLSDK_DEBUG */
201
202  /* Check the resetType */
203  switch (resetType)
204  {
205    /* Reset the whole chip */
206    case AGSA_CHIP_RESET:
207    {
208      /* callback with RESET_START */
209      ossaHwCB(agRoot, agNULL, OSSA_HW_EVENT_RESET_START, OSSA_SUCCESS << SHIFT8, agNULL, agNULL);
210
211      if (agNULL != agRoot->sdkData && agNULL != saRoot)
212      {
213        /* Set chip status */
214        saRoot->chipStatus |= CHIP_RESETTING;
215
216        /* Disable all interrupt */
217        saSystemInterruptsActive(agRoot,agFALSE);
218      }
219
220      /* do chip reset */
221      siChipReset(agRoot);
222
223      if (agNULL != saRoot)
224      {
225        /* clear up the internal resource */
226        siInitResources(agRoot,
227                        &saRoot->memoryAllocated,
228                        &saRoot->hwConfig,
229                        &saRoot->swConfig,
230                        saRoot->usecsPerTick);
231      }
232
233      /* callback with CHIP_RESET_COMPLETE with OSSA_SUCCESS */
234      ossaHwCB(agRoot, agNULL, OSSA_HW_EVENT_RESET_COMPLETE, OSSA_SUCCESS << SHIFT8, agNULL, agNULL);
235
236      if (agNULL != saRoot)
237      {
238          /* mask off reset FW status */
239          saRoot->chipStatus &= ~CHIP_RESETTING;
240      }
241      break;
242    }
243    case AGSA_SOFT_RESET:
244    {
245
246      if( smIS_SPCV(agRoot) )
247      {
248        SA_DBG1(("saHwReset: AGSA_SOFT_RESET chip type V %d\n",smIS_SPCV(agRoot) ));
249        ossaHwCB(agRoot, agNULL, OSSA_HW_EVENT_RESET_START, OSSA_SUCCESS << SHIFT8, agNULL, agNULL);
250        if (agNULL != saRoot)
251        {
252          saRoot->ResetStartTick = saRoot->timeTick;
253          saCountActiveIORequests( agRoot);
254	} //delray end
255
256        ret = siChipResetV( agRoot, SPC_SOFT_RESET_SIGNATURE );
257
258	if(agNULL !=saRoot)
259	{
260           /* clear up the internal resource */
261          siInitResources(agRoot,
262                          &saRoot->memoryAllocated,
263                          &saRoot->hwConfig,
264                          &saRoot->swConfig,
265                          saRoot->usecsPerTick);
266        }
267
268        if (AGSA_RC_SUCCESS == ret)
269        {
270           /* callback with CHIP_RESET_COMPLETE with OSSA_SUCCESS */
271          SA_DBG1(("saHwReset: siChipResetV AGSA_RC_SUCCESS\n" ));
272          ossaHwCB(agRoot, agNULL, OSSA_HW_EVENT_RESET_COMPLETE, OSSA_SUCCESS << SHIFT8, agNULL, agNULL);
273        }
274        else
275        {
276          /* callback with CHIP_RESET_COMPLETE with OSSA_FAILURE */
277          SA_DBG1(("saHwReset: siChipResetV not AGSA_RC_SUCCESS (0x%x)\n" ,ret));
278          ossaHwCB(agRoot, agNULL, OSSA_HW_EVENT_RESET_COMPLETE, OSSA_FAILURE << SHIFT8, agNULL, agNULL);
279          if (agNULL != saRoot)
280          {
281            saRoot->ResetFailed = agTRUE;
282            SA_DBG1(("saHwReset: siChipResetV saRoot->ResetFailed  ret (0x%x)\n" ,ret));
283          }
284
285        }
286        break;
287      }
288      else
289      {
290        if (agNULL != saRoot)
291        {
292          /* get register dump from GSM and save it to LL local memory */
293          siGetRegisterDumpGSM(agRoot, (void *)&saRoot->registerDump0[0],
294               REG_DUMP_NUM0, 0, saRoot->mainConfigTable.FatalErrorDumpLength0);
295          siGetRegisterDumpGSM(agRoot, (void *)&saRoot->registerDump1[0],
296               REG_DUMP_NUM1, 0, saRoot->mainConfigTable.FatalErrorDumpLength1);
297        }
298
299        /* callback with RESET_START */
300        ossaHwCB(agRoot, agNULL, OSSA_HW_EVENT_RESET_START, OSSA_SUCCESS << SHIFT8, agNULL, agNULL);
301
302        if (agNULL != agRoot->sdkData && agNULL != saRoot)
303        {
304          /* Set chip status */
305          saRoot->chipStatus |= CHIP_RESET_FW;
306
307          /* Disable all interrupt */
308          saSystemInterruptsActive(agRoot,agFALSE);
309          saCountActiveIORequests( agRoot); //delray start
310
311        }
312
313        /* check HDA mode */
314        value = ossaHwRegReadExt(agRoot, PCIBAR3, HDA_RSP_OFFSET1MB+HDA_CMD_CODE_OFFSET) & HDA_STATUS_BITS;
315
316        if (value == BOOTTLOADERHDA_IDLE)
317        {
318          /* HDA mode */
319          SA_DBG1(("saHwReset: HDA mode, value = 0x%x\n", value));
320          ret = AGSA_RC_HDA_NO_FW_RUNNING;
321        }
322        else
323        {
324          /* do Soft Reset */
325          ret = siSpcSoftReset(agRoot, SPC_SOFT_RESET_SIGNATURE);
326        }
327	if(agNULL !=saRoot)
328	{
329          /* clear up the internal resource */
330          siInitResources(agRoot,
331                          &saRoot->memoryAllocated,
332                          &saRoot->hwConfig,
333                          &saRoot->swConfig,
334                          saRoot->usecsPerTick);
335	}
336        if (AGSA_RC_SUCCESS == ret)
337        {
338          /* callback with CHIP_RESET_COMPLETE with OSSA_SUCCESS */
339          ossaHwCB(agRoot, agNULL, OSSA_HW_EVENT_RESET_COMPLETE, OSSA_SUCCESS << SHIFT8, agNULL, agNULL);
340        }
341        else if (AGSA_RC_HDA_NO_FW_RUNNING == ret)
342        {
343          /* callback with CHIP_RESET_COMPLETE with OSSA_CHIP_FAILED */
344          ossaHwCB(agRoot, agNULL, OSSA_HW_EVENT_RESET_COMPLETE, OSSA_SUCCESS << SHIFT8, agNULL, agNULL);
345        }
346        else
347        {
348          /* callback with CHIP_RESET_COMPLETE with OSSA_FAILURE */
349          ossaHwCB(agRoot, agNULL, OSSA_HW_EVENT_RESET_COMPLETE, (OSSA_FAILURE << SHIFT8), agNULL, agNULL);
350        }
351
352        if (agNULL != saRoot)
353        {
354          /* mask off reset FW status */
355          saRoot->chipStatus &= ~CHIP_RESET_FW;
356        }
357        break;
358      }
359    }
360    /* Unsupported type */
361    default:
362    {
363      SA_DBG1(("saHwReset: Unsupported reset type %X\n",resetType));
364      break;
365    }
366  }
367
368  if (agNULL != saRoot)
369  {
370    if(sysIntsActive &&  ret == AGSA_RC_SUCCESS)
371    {
372      saSystemInterruptsActive(agRoot,agTRUE);
373    }
374
375    saCountActiveIORequests( agRoot);
376    smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "5a");
377  }
378
379  return;
380}
381
382/******************************************************************************/
383/*! \brief Function to shutdown the Hardware
384 *
385 *  The saHwShutdown() function is called to discontinue the use of the SAS/SATA
386 *  hardware. Upon return, the SASA/SAT hardware instance does not generate any
387 *  interrupts or any other bus accesses. All LL Layer hardware host resources
388 * (i.e. both cached and noncached memory) are no longer owned by the LL Layer.
389 *
390 *  \param agRoot handles for this instance of SAS/SATA hardware
391 *
392 *  \return -void-
393 */
394/*******************************************************************************/
395GLOBAL void saHwShutdown(
396                        agsaRoot_t  *agRoot
397                        )
398{
399  agsaLLRoot_t      *saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
400  bit32 spad0 = 0;
401  smTraceFuncEnter(hpDBG_VERY_LOUD,"5b");
402
403  /* sanity check */
404  SA_ASSERT( (agNULL != agRoot), "");
405  SA_DBG1(("saHwShutdown: Shutting down .....\n"));
406
407  if (agRoot->sdkData)
408  {
409
410    spad0 = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_0,MSGU_SCRATCH_PAD_0);
411
412    if(0xFFFFFFFF ==  spad0)
413    {
414      SA_ASSERT(0xFFFFFFFF ==  spad0, "saHwShutdown Chip PCI dead");
415
416      SA_DBG1(("saHwShutdown: Chip PCI dead  SCRATCH_PAD0 0x%x\n", spad0));
417      smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "5b");
418      return;
419    }
420
421
422#if defined(SALLSDK_DEBUG)
423    SA_DBG1(("saHwShutdown: SCRATCH_PAD0 value = 0x%x\n", siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_0, MSGU_SCRATCH_PAD_0)));
424    SA_DBG1(("saHwShutdown: SCRATCH_PAD1 value = 0x%x\n", siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_1, MSGU_SCRATCH_PAD_1)));
425    SA_DBG1(("saHwShutdown: SCRATCH_PAD2 value = 0x%x\n", siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_2, MSGU_SCRATCH_PAD_2)));
426    SA_DBG1(("saHwShutdown: SCRATCH_PAD3 value = 0x%x\n", siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_3, MSGU_SCRATCH_PAD_3)));
427
428    if(1)
429    {
430      mpiOCQueue_t         *circularQ;
431      int i;
432      SA_DBG4(("saHwShutdown:\n"));
433      for ( i = 0; i < saRoot->QueueConfig.numOutboundQueues; i++ )
434      {
435        circularQ = &saRoot->outboundQueue[i];
436        OSSA_READ_LE_32(circularQ->agRoot, &circularQ->producerIdx, circularQ->piPointer, 0);
437        if(circularQ->producerIdx != circularQ->consumerIdx)
438        {
439          SA_DBG1(("saHwShutdown: PI 0x%03x CI 0x%03x\n",circularQ->producerIdx, circularQ->consumerIdx ));
440        }
441      }
442    }
443#endif /* SALLSDK_DBG */
444
445    if(smIS_SPCV(agRoot))
446    {
447
448      siScratchDump(agRoot);
449
450      SA_DBG1(("saHwShutdown: SPC_V\n" ));
451    }
452    /* Set chip status */
453    saRoot->chipStatus |= CHIP_SHUTDOWN;
454
455    /* Un-Initialization Configuration Table */
456    mpiUnInitConfigTable(agRoot);
457    if (saRoot->swConfig.hostDirectAccessSupport && !saRoot->swConfig.hostDirectAccessMode)
458    {
459      /* HDA mode -  do HDAsoftReset */
460      if(smIS_SPC(agRoot))
461      {
462        /* HDA soft reset */
463        siSpcSoftReset(agRoot, SPC_HDASOFT_RESET_SIGNATURE);
464      }
465      if(smIS_SPCV(agRoot))
466      {
467        siChipResetV(agRoot, SPC_HDASOFT_RESET_SIGNATURE);
468        SA_DBG1(("saHwShutdown: HDA saRoot->ChipId == VEN_DEV_SPCV\n"));
469      }
470    }
471    else
472    {
473      /*  do Normal softReset */
474      if(smIS_SPC(agRoot))
475      {
476        /* Soft Reset the SPC */
477        siSpcSoftReset(agRoot, SPC_SOFT_RESET_SIGNATURE);
478      }
479      if(smIS_SPCV(agRoot))
480      {
481        SA_DBG1(("saHwShutdown: saRoot->ChipId == VEN_DEV_SPCV\n"));
482        siChipResetV(agRoot, SPC_SOFT_RESET_SIGNATURE);
483      }
484
485    }
486
487    /* clean the LL resources */
488    siInitResources(agRoot,
489                    &saRoot->memoryAllocated,
490                    &saRoot->hwConfig,
491                    &saRoot->swConfig,
492                    saRoot->usecsPerTick);
493    SA_DBG1(("saHwShutdown: Shutting down Complete\n"));
494  }
495  else
496  {
497    SA_DBG1(("saHwShutdown: No saRoot\n"));
498    if( smIS_SPCV(agRoot) )
499    {
500      siChipResetV(agRoot, SPC_SOFT_RESET_SIGNATURE);
501    }
502    else
503    {
504       siSpcSoftReset(agRoot, SPC_SOFT_RESET_SIGNATURE);
505    }
506  }
507  /* agroot/saroot null do not access -trace OK */
508
509  SA_ASSERT( (agNULL != agRoot), "10");
510  /* return */
511  smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "5b");
512  return;
513}
514
515
516/******************************************************************************/
517/*! \brief Generic Reset
518 *
519 *  The siChipReset() function is called to reset the SPC chip. Upon return,
520 *  the SPC chip got reset. The PCIe bus got reset.
521 *
522 *  \param agRoot handles for this instance of SAS/SATA hardware
523 *
524 *  \return -void-
525 */
526/*******************************************************************************/
527
528GLOBAL void siChipReset(
529                      agsaRoot_t  *agRoot
530                )
531{
532  agsaLLRoot_t      *saRoot;
533
534  /* sanity check */
535  SA_ASSERT( (agNULL != agRoot), "");
536
537  saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
538  if(agNULL != saRoot)
539  {
540    smTraceFuncEnter(hpDBG_VERY_LOUD,"2C");
541
542    SA_DBG1(("siChipReset: saRoot->ChipId == VEN_DEV_SPCV\n"));
543    if(smIS_SPC(agRoot) )
544    {
545      /* Soft Reset the SPC */
546      siChipResetSpc(   agRoot);
547    }else /* saRoot->ChipId == VEN_DEV_SPCV */
548    {
549      siChipResetV( agRoot, SPC_SOFT_RESET_SIGNATURE);
550    }
551    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2C");
552  }
553
554}
555
556
557/******************************************************************************/
558/*! \brief Function to Reset the SPC V Hardware
559 *
560 *  The siChipResetV() function is called to reset the SPC chip. Upon return,
561 *  the SPC chip got reset. The PCIe bus got reset.
562 *
563 *  \param agRoot handles for this instance of SAS/SATA hardware
564 *
565 *  \return -void-
566 */
567/*******************************************************************************/
568
569GLOBAL bit32 siChipResetV(
570                       agsaRoot_t  *agRoot,
571                       bit32       signature
572                       )
573{
574  bit32 regVal;
575  bit32 returnVal = AGSA_RC_SUCCESS;
576
577  smTraceFuncEnter(hpDBG_VERY_LOUD,"3A");
578  smTrace(hpDBG_LOUD,"Lr",ossaTimeStamp64(agRoot));
579  regVal = ossaHwRegReadExt(agRoot,PCIBAR0 ,V_SoftResetRegister );
580
581  SA_DBG1(("siChipResetV: signature %X V_SoftResetRegister %X\n",signature,regVal));
582
583  if (signature == SPC_SOFT_RESET_SIGNATURE)
584  {
585    SA_DBG1(("siChipResetV: SPC_SOFT_RESET_SIGNATURE 0x%X\n",regVal));
586    regVal = SPCv_Reset_Write_NormalReset;
587  }
588  else if (signature == SPC_HDASOFT_RESET_SIGNATURE)
589  {
590    SA_DBG1(("siChipResetV: SPCv load HDA 0x%X\n",regVal));
591    regVal = SPCv_Reset_Write_SoftResetHDA;
592  }
593  else
594  {
595    SA_DBG1(("siChipResetV: Invalid SIGNATURE 0x%X  regVal 0x%X  a\n",signature ,regVal));
596    regVal = 1;
597  }
598
599  smTrace(hpDBG_LOUD,"Ls",ossaTimeStamp64(agRoot));
600  ossaHwRegWriteExt(agRoot, PCIBAR0, V_SoftResetRegister, regVal); /* siChipResetV */
601  smTrace(hpDBG_LOUD,"Lt",ossaTimeStamp64(agRoot));
602  ossaStallThread(agRoot, (500 * 1000)); /* wait 500 milliseconds or PCIe will hang */
603  /* Soft reset sequence (Normal mode) */
604  smTrace(hpDBG_LOUD,"Lv",ossaTimeStamp64(agRoot));
605
606  if (signature == SPC_HDASOFT_RESET_SIGNATURE)
607  {
608    bit32 hda_status;
609
610    hda_status = (ossaHwRegReadExt(agRoot, PCIBAR0, SPC_V_HDA_RESPONSE_OFFSET+28));
611
612    SA_DBG1(("siChipResetV: hda_status 0x%x\n",hda_status));
613
614    if((hda_status  & SPC_V_HDAR_RSPCODE_MASK)  != SPC_V_HDAR_IDLE)
615    {
616      SA_DBG1(("siChipResetV:SPC_HDASOFT_RESET_SIGNATURE SCRATCH_PAD1 = 0x%x \n",ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_1)));
617    }
618
619    SA_DBG1(("siChipResetV: SPC_HDASOFT_RESET_SIGNATURE %X\n",regVal));
620
621    regVal =   ossaHwRegReadExt(agRoot, PCIBAR0, V_SoftResetRegister ); /* siChipResetV */
622    SA_DBG1(("siChipResetV: SPC_HDASOFT_RESET_SIGNATURE  %X\n",regVal));
623
624    if((regVal & SPCv_Reset_Read_Mask) == SPCv_Reset_Read_NoReset)
625    {
626      SA_DBG1(("siChipResetV: SPC_HDASOFT_RESET_SIGNATURE AGSA_RC_FAILURE %X\n",regVal));
627      returnVal = AGSA_RC_FAILURE;
628    }
629    if((regVal & SPCv_Reset_Read_Mask) == SPCv_Reset_Read_NormalResetOccurred  )
630    {
631      SA_DBG1(("siChipResetV: SPC_HDASOFT_RESET_SIGNATURE AGSA_RC_FAILURE %X\n",regVal));
632      returnVal = AGSA_RC_FAILURE;
633    }
634    if((regVal & SPCv_Reset_Read_Mask) == SPCv_Reset_Read_SoftResetHDAOccurred)
635    {
636      SA_DBG1(("siChipResetV: SPC_HDASOFT_RESET_SIGNATURE AGSA_RC_SUCCESS %X\n",regVal));
637      returnVal = AGSA_RC_SUCCESS;
638    }
639    if((regVal & SPCv_Reset_Read_Mask) == SPCv_Reset_Read_ChipResetOccurred)
640    {
641      SA_DBG1(("siChipResetV: SPC_HDASOFT_RESET_SIGNATURE AGSA_RC_FAILURE %X\n",regVal));
642      returnVal = AGSA_RC_FAILURE;
643    }
644    if(regVal  == 0xFFFFFFFF)
645    {
646      SA_DBG1(("siChipResetV: SPC_HDASOFT_RESET_SIGNATURE AGSA_RC_FAILURE %X\n",regVal));
647      returnVal = AGSA_RC_FAILURE;
648    }
649
650    SA_DBG1(("siChipResetV:SCRATCH_PAD1 = 0x%x a\n",ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_1)));
651
652    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "3A");
653    return returnVal;
654  }
655  else if (signature == SPC_SOFT_RESET_SIGNATURE)
656  {
657    bit32 SCRATCH_PAD1;
658    bit32 max_wait_time;
659    bit32 max_wait_count;
660    smTrace(hpDBG_LOUD,"Lw",ossaTimeStamp64(agRoot));
661    regVal =   ossaHwRegReadExt(agRoot, PCIBAR0, V_SoftResetRegister ); /* siChipResetV */
662    SA_DBG1(("siChipResetV: SPC_SOFT_RESET_SIGNATURE  0x%X\n",regVal));
663
664    if(regVal  == 0xFFFFFFFF)
665    {
666      SA_DBG1(("siChipResetV: SPC_SOFT_RESET_SIGNATURE AGSA_RC_FAILURE %X\n",regVal));
667      returnVal = AGSA_RC_FAILURE;
668    }
669    else if((regVal & SPCv_Reset_Read_Mask) == SPCv_Reset_Read_NoReset)
670    {
671      SA_DBG1(("siChipResetV:SPC_SOFT_RESET_SIGNATURE  AGSA_RC_FAILURE %X\n",regVal));
672      returnVal = AGSA_RC_FAILURE;
673    }
674    else if((regVal & SPCv_Reset_Read_Mask) == SPCv_Reset_Read_SoftResetHDAOccurred)
675    {
676      SA_DBG1(("siChipResetV: SPC_SOFT_RESET_SIGNATURE AGSA_RC_FAILURE 0x%X\n",regVal));
677      returnVal = AGSA_RC_FAILURE;
678    }
679    else if((regVal & SPCv_Reset_Read_Mask) == SPCv_Reset_Read_ChipResetOccurred)
680    {
681      SA_DBG1(("siChipResetV: SPC_SOFT_RESET_SIGNATURE AGSA_RC_FAILURE 0x%X\n",regVal));
682      returnVal = AGSA_RC_FAILURE;
683    }
684    else if((regVal & SPCv_Reset_Read_Mask) == SPCv_Reset_Read_NormalResetOccurred  )
685    {
686      SA_DBG1(("siChipResetV: SPC_SOFT_RESET_SIGNATURE AGSA_RC_SUCCESS 0x%X\n",regVal));
687      returnVal = AGSA_RC_SUCCESS;
688    }
689    SA_DBG1(("siChipResetV:SCRATCH_PAD1 = 0x%x b\n",ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_1)));
690
691    if( returnVal != AGSA_RC_SUCCESS)
692    {
693      SCRATCH_PAD1 = ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_1)  & SCRATCH_PAD1_V_BOOTSTATE_MASK;
694      if(SCRATCH_PAD1 == SCRATCH_PAD1_V_BOOTSTATE_HDA_SEEPROM )
695      {
696        SA_DBG1(("siChipResetV: Reset done FW did not start BOOTSTATE_HDA_SEEPROM\n"));
697        return (returnVal);
698      }
699      else if(SCRATCH_PAD1 ==  SCRATCH_PAD1_V_BOOTSTATE_HDA_BOOTSTRAP)
700      {
701        SA_DBG1(("siChipResetV: Reset done FW did not start BOOTSTATE_HDA_BOOTSTRAP\n"));
702        return (returnVal);
703      }
704      else if(SCRATCH_PAD1 == SCRATCH_PAD1_V_BOOTSTATE_HDA_SOFTRESET )
705      {
706        SA_DBG1(("siChipResetV: Reset done FW did not start BOOTSTATE_HDA_SOFTRESET\n"));
707        return (returnVal);
708      }
709      else if(SCRATCH_PAD1 == SCRATCH_PAD1_V_BOOTSTATE_CRIT_ERROR )
710      {
711        SA_DBG1(("siChipResetV: Reset done FW did not start BOOTSTATE_CRIT_ERROR\n"));
712        smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "3A");
713        return (returnVal);
714      }
715    }
716
717     /* RESET */
718    smTrace(hpDBG_LOUD,"Lx",ossaTimeStamp64(agRoot));
719    max_wait_time = (100 * 1000); /* wait 100 milliseconds */
720    max_wait_count = MAKE_MODULO(max_wait_time,WAIT_INCREMENT) - WAIT_INCREMENT;
721    do
722    {
723      ossaStallThread(agRoot, WAIT_INCREMENT);
724      SCRATCH_PAD1 = ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_1);
725    } while ((SCRATCH_PAD1  == 0xFFFFFFFF  ) && (max_wait_count -= WAIT_INCREMENT));
726
727    smTrace(hpDBG_LOUD,"Ly",ossaTimeStamp64(agRoot));
728    SA_DBG1(("siChipResetV:SCRATCH_PAD1 = 0x%x (0x%x) PCIe ready took %d\n", SCRATCH_PAD1,ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_1),(max_wait_time -  max_wait_count)));
729    /* ILA */
730    max_wait_time = (1000 * 1000); /* wait 1000 milliseconds */
731    max_wait_count = MAKE_MODULO(max_wait_time,WAIT_INCREMENT) - WAIT_INCREMENT;
732    do
733    {
734      ossaStallThread(agRoot, WAIT_INCREMENT);
735      SCRATCH_PAD1 = ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_1);
736    } while (((SCRATCH_PAD1 & SCRATCH_PAD1_V_ILA_MASK) != SCRATCH_PAD1_V_ILA_MASK) && (max_wait_count -= WAIT_INCREMENT));
737    SA_DBG1(("siChipResetV:SCRATCH_PAD1 = 0x%x SCRATCH_PAD1_V_ILA_MASK (0x%x)(0x%x) took %d\n", SCRATCH_PAD1,SCRATCH_PAD1_V_ILA_MASK,ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_1),(max_wait_time -  max_wait_count)));
738
739    if (!max_wait_count)
740    {
741      returnVal = AGSA_RC_FAILURE;
742      SA_DBG1(("siChipResetV:Timeout SCRATCH_PAD1_V_ILA_MASK (0x%x)  not set SCRATCH_PAD1 = 0x%x\n",SCRATCH_PAD1_V_ILA_MASK, SCRATCH_PAD1));
743    }
744    /* RAAE */
745    smTrace(hpDBG_LOUD,"Lz",ossaTimeStamp64(agRoot));
746    max_wait_time = (1800 * 1000); /* wait 1800 milliseconds */
747    max_wait_count = MAKE_MODULO(max_wait_time,WAIT_INCREMENT) - WAIT_INCREMENT;
748    do
749    {
750      ossaStallThread(agRoot, WAIT_INCREMENT);
751      SCRATCH_PAD1 = ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_1);
752    } while (((SCRATCH_PAD1 & SCRATCH_PAD1_V_RAAE_MASK) != SCRATCH_PAD1_V_RAAE_MASK) && (max_wait_count -= WAIT_INCREMENT));
753
754    SA_DBG1(("siChipResetV:SCRATCH_PAD1 = 0x%x SCRATCH_PAD1_V_RAAE_MASK (0x%x)(0x%x) took %d\n", SCRATCH_PAD1,SCRATCH_PAD1_V_RAAE_MASK,ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_1),(max_wait_time -  max_wait_count)));
755
756    if (!max_wait_count)
757    {
758      returnVal = AGSA_RC_FAILURE;
759      SA_DBG1(("siChipResetV:Timeout SCRATCH_PAD1_V_RAAE_MASK (0x%x) not set SCRATCH_PAD1 = 0x%x\n",SCRATCH_PAD1_V_RAAE_MASK, SCRATCH_PAD1));
760    }
761    /* IOP0 */
762    smTrace(hpDBG_LOUD,"La",ossaTimeStamp64(agRoot));
763    max_wait_time = (600 * 1000); /* wait 600 milliseconds */
764    max_wait_count = MAKE_MODULO(max_wait_time,WAIT_INCREMENT) - WAIT_INCREMENT;
765    do
766    {
767      ossaStallThread(agRoot, WAIT_INCREMENT);
768      SCRATCH_PAD1 = ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_1);
769    } while (((SCRATCH_PAD1 & SCRATCH_PAD1_V_IOP0_MASK) != SCRATCH_PAD1_V_IOP0_MASK) && (max_wait_count -= WAIT_INCREMENT));
770    SA_DBG1(("siChipResetV:SCRATCH_PAD1 = 0x%x  SCRATCH_PAD1_V_IOP0_MASK(0x%x)(0x%x) took %d\n", SCRATCH_PAD1,SCRATCH_PAD1_V_IOP0_MASK,ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_1),(max_wait_time -  max_wait_count)));
771
772    if (!max_wait_count)
773    {
774      returnVal = AGSA_RC_FAILURE;
775      SA_DBG1(("siChipResetV:Timeout SCRATCH_PAD1_V_IOP0_MASK (0x%x) not set SCRATCH_PAD1 = 0x%x\n",SCRATCH_PAD1_V_IOP0_MASK ,SCRATCH_PAD1));
776    }
777
778    if(smIS_SPCV_2_IOP(agRoot))
779    {
780      /* IOP1 */
781      smTrace(hpDBG_LOUD,"Lb",ossaTimeStamp64(agRoot));
782      max_wait_time = (200 * 1000); /* wait 200 milliseconds */
783      max_wait_count = MAKE_MODULO(max_wait_time,WAIT_INCREMENT) - WAIT_INCREMENT;
784      do
785      {
786        ossaStallThread(agRoot, WAIT_INCREMENT);
787        SCRATCH_PAD1 = ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_1);
788      } while (((SCRATCH_PAD1 & SCRATCH_PAD1_V_IOP1_MASK) != SCRATCH_PAD1_V_IOP1_MASK) && (max_wait_count -= WAIT_INCREMENT));
789      SA_DBG1(("siChipResetV:SCRATCH_PAD1 = 0x%x SCRATCH_PAD1_V_IOP1_MASK (0x%x) (0x%x)(0x%x)\n", SCRATCH_PAD1,SCRATCH_PAD1_V_IOP1_MASK,ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_1),(max_wait_time -  max_wait_count)));
790
791      if (!max_wait_count)
792      {
793        returnVal = AGSA_RC_FAILURE;
794        SA_DBG1(("siChipResetV: SCRATCH_PAD1_V_IOP1_MASK (0x%x) not set SCRATCH_PAD1 = 0x%x\n",SCRATCH_PAD1_V_IOP1_MASK, SCRATCH_PAD1));
795      }
796    }
797    smTrace(hpDBG_LOUD,"Lc",ossaTimeStamp64(agRoot));
798    regVal = ossaHwRegReadExt(agRoot,PCIBAR0 ,V_SoftResetRegister );
799    SA_DBG1(("siChipResetV: Reset done 0x%X ERROR_STATE 0x%X\n",regVal,
800    SCRATCH_PAD1_V_ERROR_STATE( ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_1) ) ));
801    if(SCRATCH_PAD1_V_ERROR_STATE( ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_1)) )
802    {
803      smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "3A");
804      return AGSA_RC_FAILURE;
805    }
806
807  }
808  else  /* signature = unknown */
809  {
810    smTraceFuncExit(hpDBG_VERY_LOUD, 'd', "3A");
811    return AGSA_RC_FAILURE;
812  }
813
814  smTrace(hpDBG_LOUD,"Ld",ossaTimeStamp64(agRoot));
815
816  SA_DBG1(("siChipResetV: out V_SoftResetRegister  %08X\n",  ossaHwRegReadExt(agRoot, PCIBAR0, V_SoftResetRegister) ));
817#ifdef SOFT_RESET_TEST
818  DbgPrint("SCRATCH_PAD1 = 0x%x \n",ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_1));
819#endif
820  smTraceFuncExit(hpDBG_VERY_LOUD, 'e', "3A");
821  return returnVal;
822
823}
824/******************************************************************************/
825/*! \brief Function to Reset the SPC Hardware
826 *
827 *  The siChipResetSpc() function is called to reset the SPC chip. Upon return,
828 *  the SPC chip got reset. The PCIe bus got reset.
829 *
830 *  \param agRoot handles for this instance of SAS/SATA hardware
831 *
832 *  \return -void-
833 */
834/*******************************************************************************/
835GLOBAL void siChipResetSpc(
836                      agsaRoot_t  *agRoot
837                      )
838{
839    bit32        regVal;
840
841    smTraceFuncEnter(hpDBG_VERY_LOUD,"5c");
842
843    SA_DBG1(("siChipResetSpc: Chip Reset start\n"));
844
845    /* Reset the chip */
846    regVal = ossaHwRegReadExt(agRoot, PCIBAR2, SPC_REG_RESET);
847    regVal &= ~(SPC_REG_RESET_DEVICE);
848    ossaHwRegWriteExt(agRoot, PCIBAR2, SPC_REG_RESET, regVal); /* siChipResetSpc */
849
850    /* delay 10 usec */
851    ossaStallThread(agRoot, WAIT_INCREMENT);
852
853    /* bring chip reset out of reset */
854    regVal = ossaHwRegReadExt(agRoot, PCIBAR2, SPC_REG_RESET);
855    regVal |= SPC_REG_RESET_DEVICE;
856    ossaHwRegWriteExt(agRoot, PCIBAR2, SPC_REG_RESET, regVal); /* siChipResetSpc */
857
858    /* delay 10 usec */
859    ossaStallThread(agRoot, WAIT_INCREMENT);
860
861    /* wait for 20 msec until the firmware gets reloaded */
862    ossaStallThread(agRoot, (20 * 1000));
863
864    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "5c");
865
866    SA_DBG1(("siChipResetSpc: Chip Reset Complete\n"));
867
868    return;
869}
870
871
872GLOBAL bit32 siSoftReset(
873                       agsaRoot_t  *agRoot,
874                       bit32       signature
875                       )
876{
877  bit32 ret = AGSA_RC_SUCCESS;
878
879  if(smIS_SPCV(agRoot))
880  {
881    ret = si_V_SoftReset(agRoot, signature  );
882  }
883  else
884  {
885    ret = siSpcSoftReset(agRoot, signature  );
886  }
887
888  return(ret);
889}
890
891LOCAL bit32 si_V_SoftReset(
892                       agsaRoot_t  *agRoot,
893                       bit32       signature
894                       )
895{
896
897  bit32 ret = AGSA_RC_SUCCESS;
898
899  ret = siChipResetV(agRoot, signature);
900
901  if (signature == SPC_SOFT_RESET_SIGNATURE)
902  {
903    SA_DBG1(("si_V_SoftReset:SPC_SOFT_RESET_SIGNATURE\n"));
904  }
905  else if (signature == SPC_HDASOFT_RESET_SIGNATURE)
906  {
907    SA_DBG1(("si_V_SoftReset: SPC_HDASOFT_RESET_SIGNATURE\n"));
908  }
909
910  SA_DBG1(("si_V_SoftReset: Reset Complete status 0x%X\n",ret));
911  return ret;
912}
913
914/******************************************************************************/
915/*! \brief Function to soft/FW reset the SPC
916 *
917 *  The siSpcSoftReset() function is called to soft reset SPC. Upon return,
918 *  the SPC FW got reset. The PCIe bus is not touched.
919 *
920 *  \param agRoot    handles for this instance of SAS/SATA hardware
921 *  \param signature soft reset normal signature or HDA soft reset signature
922 *
923 *  \return -void-
924 */
925/*******************************************************************************/
926GLOBAL bit32 siSpcSoftReset(
927                       agsaRoot_t  *agRoot,
928                       bit32       signature
929                       )
930{
931    spc_configMainDescriptor_t mainCfg;
932    bit32                      regVal, toggleVal;
933    bit32                      max_wait_time;
934    bit32                      max_wait_count;
935    bit32                      regVal1, regVal2, regVal3;
936
937
938    /* sanity check */
939    SA_ASSERT( (agNULL != agRoot), "agNULL != agRoot");
940    if(agNULL != agRoot->sdkData)
941    {
942      smTraceFuncEnter(hpDBG_VERY_LOUD,"5t");
943    }
944
945    SA_DBG1(("siSpcSoftReset: start\n"));
946
947
948#if defined(SALLSDK_DEBUG)
949    /* count SoftReset */
950    gLLSoftResetCounter++;
951    SA_DBG1(("siSpcSoftReset: ResetCount = 0x%x\n", gLLSoftResetCounter));
952#endif
953
954    /* step1: Check FW is ready for soft reset */
955
956    smTrace(hpDBG_VERY_LOUD,"Q1", 1);
957    /* TP:Q1 siSpcSoftReset */
958
959    if(AGSA_RC_FAILURE == siSpcSoftResetRDYChk(agRoot))
960    {
961      SA_DBG1(("siSoftReset:siSoftResetRDYChk failed\n"));
962      if(agNULL != agRoot->sdkData)
963      {
964        smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "5t");
965      }
966      return AGSA_RC_FAILURE;
967    }
968
969     /* step 2: clear NMI status register on AAP1 and IOP, write the same value to clear */
970    /* map 0x60000 to BAR4(0x20), BAR2(win) */
971    smTrace(hpDBG_VERY_LOUD,"Q2", 2);
972    /* TP:Q2 siSpcSoftReset */
973    if (AGSA_RC_FAILURE == siBar4Shift(agRoot, MBIC_AAP1_ADDR_BASE))
974    {
975      SA_DBG1(("siSpcSoftReset:Shift Bar4 to 0x%x failed\n", MBIC_AAP1_ADDR_BASE));
976      if(agNULL != agRoot->sdkData)
977      {
978        smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "5t");
979      }
980
981      SA_DBG1(("siSpcSoftReset: Soft Reset AGSA_RC_FAILURE %d\n",1));
982      return AGSA_RC_FAILURE;
983    }
984    regVal = ossaHwRegReadExt(agRoot, PCIBAR2, MBIC_NMI_ENABLE_VPE0_IOP);
985    SA_DBG1(("MBIC(A) - NMI Enable VPE0 (IOP): = 0x%x\n", regVal));
986    ossaHwRegWriteExt(agRoot, PCIBAR2, MBIC_NMI_ENABLE_VPE0_IOP, 0x0);   /* siSpcSoftReset */
987
988    /* map 0x70000 to BAR4(0x20), BAR2(win) */
989    if (AGSA_RC_FAILURE == siBar4Shift(agRoot, MBIC_IOP_ADDR_BASE))
990    {
991      SA_DBG1(("siSpcSoftReset:Shift Bar4 to 0x%x failed\n", MBIC_IOP_ADDR_BASE));
992      if(agNULL != agRoot->sdkData)
993      {
994        smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "5t");
995      }
996      SA_DBG1(("siSpcSoftReset: Soft Reset AGSA_RC_FAILURE %d\n",2));
997      return AGSA_RC_FAILURE;
998    }
999    regVal = ossaHwRegReadExt(agRoot, PCIBAR2, MBIC_NMI_ENABLE_VPE0_AAP1);
1000    SA_DBG1(("MBIC(A) - NMI Enable VPE0 (AAP1): = 0x%x\n", regVal));
1001    ossaHwRegWriteExt(agRoot, PCIBAR2, MBIC_NMI_ENABLE_VPE0_AAP1, 0x0); /* siSpcSoftReset */
1002
1003    regVal = ossaHwRegReadExt(agRoot, PCIBAR1, PCIE_EVENT_INTERRUPT_ENABLE);
1004    SA_DBG1(("PCIE - Event Interrupt Enable Register: = 0x%x\n", regVal));
1005    ossaHwRegWriteExt(agRoot, PCIBAR1, PCIE_EVENT_INTERRUPT_ENABLE, 0x0); /* siSpcSoftReset */
1006
1007    regVal = ossaHwRegReadExt(agRoot, PCIBAR1, PCIE_EVENT_INTERRUPT);
1008    SA_DBG1(("PCIE - Event Interrupt Register: = 0x%x\n", regVal));
1009    ossaHwRegWriteExt(agRoot, PCIBAR1, PCIE_EVENT_INTERRUPT, regVal);  /* siSpcSoftReset */
1010
1011    regVal = ossaHwRegReadExt(agRoot, PCIBAR1, PCIE_ERROR_INTERRUPT_ENABLE);
1012    SA_DBG1(("PCIE - Error Interrupt Enable Register: = 0x%x\n", regVal));
1013    ossaHwRegWriteExt(agRoot, PCIBAR1, PCIE_ERROR_INTERRUPT_ENABLE, 0x0); /* siSpcSoftReset */
1014
1015    regVal = ossaHwRegReadExt(agRoot, PCIBAR1, PCIE_ERROR_INTERRUPT);
1016    SA_DBG1(("PCIE - Error Interrupt Register: = 0x%x\n", regVal));
1017    ossaHwRegWriteExt(agRoot, PCIBAR1, PCIE_ERROR_INTERRUPT, regVal); /* siSpcSoftReset */
1018
1019    /* read the scratch pad 1 register bit 2 */
1020    regVal = ossaHwRegRead(agRoot, MSGU_SCRATCH_PAD_1) & SCRATCH_PAD1_RST;
1021    toggleVal = regVal ^ SCRATCH_PAD1_RST;
1022
1023    /* set signature in host scratch pad0 register to tell SPC that the host performs the soft reset */
1024    ossaHwRegWrite(agRoot, MSGU_HOST_SCRATCH_PAD_0, signature);
1025
1026    /* read required registers for confirmming */
1027    /* map 0x0700000 to BAR4(0x20), BAR2(win) */
1028    if (AGSA_RC_FAILURE == siBar4Shift(agRoot, GSM_ADDR_BASE))
1029    {
1030      SA_DBG1(("siSpcSoftReset:Shift Bar4 to 0x%x failed\n", GSM_ADDR_BASE));
1031      if(agNULL != agRoot->sdkData)
1032      {
1033        smTraceFuncExit(hpDBG_VERY_LOUD, 'd', "5t");
1034      }
1035      SA_DBG1(("siSpcSoftReset: Soft Reset AGSA_RC_FAILURE %d\n",3));
1036      return AGSA_RC_FAILURE;
1037    }
1038
1039    SA_DBG1(("GSM 0x0 (0x00007b88) - GSM Configuration and Reset = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR2, GSM_CONFIG_RESET)));
1040
1041    smTrace(hpDBG_VERY_LOUD,"Q3", 3);
1042    /* TP:Q3 siSpcSoftReset */
1043
1044    /* step 3: host read GSM Configuration and Reset register */
1045    regVal = ossaHwRegReadExt(agRoot, PCIBAR2, GSM_CONFIG_RESET);
1046    /* Put those bits to low */
1047    /* GSM XCBI offset = 0x70 0000
1048      0x00 Bit 13 COM_SLV_SW_RSTB 1
1049      0x00 Bit 12 QSSP_SW_RSTB 1
1050      0x00 Bit 11 RAAE_SW_RSTB 1
1051      0x00 Bit 9   RB_1_SW_RSTB 1
1052      0x00 Bit 8   SM_SW_RSTB 1
1053      */
1054    regVal &= ~(0x00003b00);
1055    /* host write GSM Configuration and Reset register */
1056    ossaHwRegWriteExt(agRoot, PCIBAR2, GSM_CONFIG_RESET, regVal); /* siSpcSoftReset */
1057    SA_DBG1(("GSM 0x0 (0x00007b88 ==> 0x00004088) - GSM Configuration and Reset is set to = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR2, GSM_CONFIG_RESET)));
1058
1059#if defined(SALLSDK_DEBUG)
1060    /* debugging messge */
1061    SA_DBG1(("GSM 0x700018 - RAM ECC Double Bit Error Indication = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR2, RAM_ECC_DB_ERR)));
1062
1063    SA_DBG1(("GSM 0x700058 - Read Address Parity Error Indication = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR2, GSM_READ_ADDR_PARITY_INDIC)));
1064    SA_DBG1(("GSM 0x700060 - Write Address Parity Error Indication = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR2, GSM_WRITE_ADDR_PARITY_INDIC)));
1065    SA_DBG1(("GSM 0x700068 - Write Data Parity Error Indication = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR2, GSM_WRITE_DATA_PARITY_INDIC)));
1066#endif
1067
1068    /* step 4: */
1069    /* disable GSM - Read Address Parity Check */
1070    smTrace(hpDBG_VERY_LOUD,"Q4", 4);
1071    /* TP:Q4 siSpcSoftReset */
1072    regVal1 = ossaHwRegReadExt(agRoot, PCIBAR2, GSM_READ_ADDR_PARITY_CHECK);
1073    SA_DBG1(("GSM 0x700038 - Read Address Parity Check Enable = 0x%x\n", regVal1));
1074    ossaHwRegWriteExt(agRoot, PCIBAR2, GSM_READ_ADDR_PARITY_CHECK, 0x0); /* siSpcSoftReset */
1075    SA_DBG1(("GSM 0x700038 - Read Address Parity Check Enable is set to = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR2, GSM_READ_ADDR_PARITY_CHECK)));
1076
1077    /* disable GSM - Write Address Parity Check */
1078    regVal2 = ossaHwRegReadExt(agRoot, PCIBAR2, GSM_WRITE_ADDR_PARITY_CHECK);
1079    SA_DBG1(("GSM 0x700040 - Write Address Parity Check Enable = 0x%x\n", regVal2));
1080    ossaHwRegWriteExt(agRoot, PCIBAR2, GSM_WRITE_ADDR_PARITY_CHECK, 0x0); /* siSpcSoftReset */
1081    SA_DBG1(("GSM 0x700040 - Write Address Parity Check Enable is set to = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR2, GSM_WRITE_ADDR_PARITY_CHECK)));
1082
1083    /* disable GSM - Write Data Parity Check */
1084    regVal3 = ossaHwRegReadExt(agRoot, PCIBAR2, GSM_WRITE_DATA_PARITY_CHECK);
1085    SA_DBG1(("GSM 0x300048 - Write Data Parity Check Enable = 0x%x\n", regVal3));
1086    ossaHwRegWriteExt(agRoot, PCIBAR2, GSM_WRITE_DATA_PARITY_CHECK, 0x0); /* siSpcSoftReset */
1087    SA_DBG1(("GSM 0x700048 - Write Data Parity Check Enable is set to = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR2, GSM_WRITE_DATA_PARITY_CHECK)));
1088    /* step 5-a: delay 10 usec */
1089    smTrace(hpDBG_VERY_LOUD,"Q5", 5);
1090    /* TP:Q5 siSpcSoftReset */
1091    ossaStallThread(agRoot, 10);
1092
1093    /* step 5-b: set GPIO-0 output control to tristate anyway */
1094    if (AGSA_RC_FAILURE == siBar4Shift(agRoot, GPIO_ADDR_BASE))
1095    {
1096      SA_DBG1(("siSpcSoftReset:Shift Bar4 to 0x%x failed\n", GPIO_ADDR_BASE));
1097      if(agNULL != agRoot->sdkData)
1098      {
1099        smTraceFuncExit(hpDBG_VERY_LOUD, 'e', "5t");
1100      }
1101      SA_DBG1(("siSpcSoftReset: Soft Reset AGSA_RC_FAILURE %d\n",4));
1102      return AGSA_RC_FAILURE;
1103    }
1104    regVal = ossaHwRegReadExt(agRoot, PCIBAR2, GPIO_GPIO_0_0UTPUT_CTL_OFFSET);
1105    SA_DBG1(("GPIO Output Control Register: = 0x%x\n", regVal));
1106    /* set GPIO-0 output control to tri-state */
1107    regVal &= 0xFFFFFFFC;
1108    ossaHwRegWriteExt(agRoot, PCIBAR2, GPIO_GPIO_0_0UTPUT_CTL_OFFSET, regVal); /* siSpcSoftReset */
1109
1110    /* Step 6: Reset the IOP and AAP1 */
1111    /* map 0x00000 to BAR4(0x20), BAR2(win) */
1112    smTrace(hpDBG_VERY_LOUD,"Q6", 6);
1113    /* TP:Q6 siSpcSoftReset */
1114    if (AGSA_RC_FAILURE == siBar4Shift(agRoot, SPC_TOP_LEVEL_ADDR_BASE))
1115    {
1116      SA_DBG1(("siSpcSoftReset:Shift Bar4 to 0x%x failed\n", SPC_TOP_LEVEL_ADDR_BASE));
1117      if(agNULL != agRoot->sdkData)
1118      {
1119        smTraceFuncExit(hpDBG_VERY_LOUD, 'f', "5t");
1120      }
1121      SA_DBG1(("siSpcSoftReset: Soft Reset AGSA_RC_FAILURE %d\n",5));
1122      return AGSA_RC_FAILURE;
1123    }
1124    regVal = ossaHwRegReadExt(agRoot, PCIBAR2, SPC_REG_RESET);
1125    SA_DBG1(("Top Register before resetting IOP/AAP1: = 0x%x\n", regVal));
1126    regVal &= ~(SPC_REG_RESET_PCS_IOP_SS | SPC_REG_RESET_PCS_AAP1_SS);
1127    ossaHwRegWriteExt(agRoot, PCIBAR2, SPC_REG_RESET, regVal); /* siSpcSoftReset */
1128
1129    /* step 7: Reset the BDMA/OSSP */
1130    smTrace(hpDBG_VERY_LOUD,"Q7", 7);
1131    /* TP:Q7 siSpcSoftReset */
1132    regVal = ossaHwRegReadExt(agRoot, PCIBAR2, SPC_REG_RESET);
1133    SA_DBG1(("Top Register before resetting BDMA/OSSP: = 0x%x\n", regVal));
1134    regVal &= ~(SPC_REG_RESET_BDMA_CORE | SPC_REG_RESET_OSSP);
1135    ossaHwRegWriteExt(agRoot, PCIBAR2, SPC_REG_RESET, regVal); /* siSpcSoftReset */
1136
1137    /* step 8: delay 10 usec */
1138    smTrace(hpDBG_VERY_LOUD,"Q8", 8);
1139    /* TP:Q8 siSpcSoftReset */
1140
1141    ossaStallThread(agRoot, WAIT_INCREMENT);
1142
1143    /* step 9: bring the BDMA and OSSP out of reset */
1144    smTrace(hpDBG_VERY_LOUD,"Q9", 9);
1145    /* TP:Q9 siSpcSoftReset */
1146    regVal = ossaHwRegReadExt(agRoot, PCIBAR2, SPC_REG_RESET);
1147    SA_DBG1(("Top Register before bringing up BDMA/OSSP: = 0x%x\n", regVal));
1148    regVal |= (SPC_REG_RESET_BDMA_CORE | SPC_REG_RESET_OSSP);
1149    ossaHwRegWriteExt(agRoot, PCIBAR2, SPC_REG_RESET, regVal); /* siSpcSoftReset */
1150
1151    /* step 10: delay 10 usec */
1152    smTrace(hpDBG_VERY_LOUD,"QA", 10);
1153    /* TP:QA siSpcSoftReset */
1154    ossaStallThread(agRoot, WAIT_INCREMENT);
1155
1156    /* step 11: reads and sets the GSM Configuration and Reset Register */
1157    /* map 0x0700000 to BAR4(0x20), BAR2(win) */
1158    smTrace(hpDBG_VERY_LOUD,"QB", 11);
1159    /* TP:QB siSpcSoftReset */
1160    if (AGSA_RC_FAILURE == siBar4Shift(agRoot, GSM_ADDR_BASE))
1161    {
1162      SA_DBG1(("siSpcSoftReset:Shift Bar4 to 0x%x failed\n", GSM_ADDR_BASE));
1163      if(agNULL != agRoot->sdkData)
1164      {
1165        smTraceFuncExit(hpDBG_VERY_LOUD, 'g', "5t");
1166      }
1167      SA_DBG1(("siSpcSoftReset: Soft Reset AGSA_RC_FAILURE %d\n",5));
1168      return AGSA_RC_FAILURE;
1169    }
1170    SA_DBG1(("GSM 0x0 (0x00007b88) - GSM Configuration and Reset = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR2, GSM_CONFIG_RESET)));
1171    regVal = ossaHwRegReadExt(agRoot, PCIBAR2, GSM_CONFIG_RESET);
1172    /* Put those bits to high */
1173    /* GSM XCBI offset = 0x70 0000
1174      0x00 Bit 13 COM_SLV_SW_RSTB 1
1175      0x00 Bit 12 QSSP_SW_RSTB 1
1176      0x00 Bit 11 RAAE_SW_RSTB 1
1177      0x00 Bit 9   RB_1_SW_RSTB 1
1178      0x00 Bit 8   SM_SW_RSTB 1
1179      */
1180    regVal |= (GSM_CONFIG_RESET_VALUE);
1181    ossaHwRegWriteExt(agRoot, PCIBAR2, GSM_CONFIG_RESET, regVal); /* siSpcSoftReset */
1182    SA_DBG1(("GSM 0x0 (0x00004088 ==> 0x00007b88) - GSM Configuration and Reset is set to = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR2, GSM_CONFIG_RESET)));
1183
1184#if defined(SALLSDK_DEBUG)
1185    /* debugging messge */
1186    SA_DBG1(("GSM 0x700018 - RAM ECC Double Bit Error Indication = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR2, RAM_ECC_DB_ERR)));
1187    SA_DBG1(("GSM 0x700058 - Read Address Parity Error Indication = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR2, GSM_READ_ADDR_PARITY_INDIC)));
1188    SA_DBG1(("GSM 0x700060 - Write Address Parity Error Indication = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR2, GSM_WRITE_ADDR_PARITY_INDIC)));
1189    SA_DBG1(("GSM 0x700068 - Write Data Parity Error Indication = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR2, GSM_WRITE_DATA_PARITY_INDIC)));
1190#endif
1191
1192    /* step 12: Restore GSM - Read Address Parity Check */
1193    smTrace(hpDBG_VERY_LOUD,"QC", 12);
1194    /* TP:QC siSpcSoftReset */
1195    regVal = ossaHwRegReadExt(agRoot, PCIBAR2, GSM_READ_ADDR_PARITY_CHECK); /* just for debugging */
1196    SA_DBG1(("GSM 0x700038 - Read Address Parity Check Enable = 0x%x\n", regVal));
1197    ossaHwRegWriteExt(agRoot, PCIBAR2, GSM_READ_ADDR_PARITY_CHECK, regVal1); /* siSpcSoftReset */
1198    SA_DBG1(("GSM 0x700038 - Read Address Parity Check Enable is set to = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR2, GSM_READ_ADDR_PARITY_CHECK)));
1199
1200    /* Restore GSM - Write Address Parity Check */
1201    regVal = ossaHwRegReadExt(agRoot, PCIBAR2, GSM_WRITE_ADDR_PARITY_CHECK); /* just for debugging */
1202    SA_DBG1(("GSM 0x700040 - Write Address Parity Check Enable = 0x%x\n", regVal));
1203    ossaHwRegWriteExt(agRoot, PCIBAR2, GSM_WRITE_ADDR_PARITY_CHECK, regVal2); /* siSpcSoftReset */
1204    SA_DBG1(("GSM 0x700040 - Write Address Parity Check Enable is set to = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR2, GSM_WRITE_ADDR_PARITY_CHECK)));
1205
1206    /* Restore GSM - Write Data Parity Check */
1207    regVal = ossaHwRegReadExt(agRoot, PCIBAR2, GSM_WRITE_DATA_PARITY_CHECK); /* just for debugging */
1208    SA_DBG1(("GSM 0x700048 - Write Data Parity Check Enable = 0x%x\n", regVal));
1209    ossaHwRegWriteExt(agRoot, PCIBAR2, GSM_WRITE_DATA_PARITY_CHECK, regVal3); /* siSpcSoftReset */
1210    SA_DBG1(("GSM 0x700048 - Write Data Parity Check Enable is set to = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR2, GSM_WRITE_DATA_PARITY_CHECK)));
1211
1212    /* step 13: bring the IOP and AAP1 out of reset */
1213    /* map 0x00000 to BAR4(0x20), BAR2(win) */
1214    smTrace(hpDBG_VERY_LOUD,"QD", 13);
1215    /* TP:QD siSpcSoftReset */
1216    if (AGSA_RC_FAILURE == siBar4Shift(agRoot, SPC_TOP_LEVEL_ADDR_BASE))
1217    {
1218      SA_DBG1(("siSpcSoftReset:Shift Bar4 to 0x%x failed\n", SPC_TOP_LEVEL_ADDR_BASE));
1219      if(agNULL != agRoot->sdkData)
1220      {
1221        smTraceFuncExit(hpDBG_VERY_LOUD, 'h', "5t");
1222      }
1223      SA_DBG1(("siSpcSoftReset: Soft Reset AGSA_RC_FAILURE %d\n",7));
1224      return AGSA_RC_FAILURE;
1225    }
1226    regVal = ossaHwRegReadExt(agRoot, PCIBAR2, SPC_REG_RESET);
1227    SA_DBG1(("Top Register before bringing up IOP/AAP1: = 0x%x\n", regVal));
1228    regVal |= (SPC_REG_RESET_PCS_IOP_SS | SPC_REG_RESET_PCS_AAP1_SS);
1229    ossaHwRegWriteExt(agRoot, PCIBAR2, SPC_REG_RESET, regVal); /* siSpcSoftReset */
1230
1231    if (signature == SPC_SOFT_RESET_SIGNATURE)
1232    {
1233      /* step 14: delay 20 milli - Normal Mode */
1234      ossaStallThread(agRoot, WAIT_INCREMENT);
1235    }else if (signature == SPC_HDASOFT_RESET_SIGNATURE)
1236    {
1237      /* step 14: delay 200 milli - HDA Mode */
1238      ossaStallThread(agRoot, 200 * 1000);
1239    }
1240
1241    /* check Soft Reset Normal mode or Soft Reset HDA mode */
1242    if (signature == SPC_SOFT_RESET_SIGNATURE)
1243    {
1244        /* step 15 (Normal Mode): wait until scratch pad1 register bit 2 toggled */
1245        max_wait_time = WAIT_SECONDS(2);  /* 2 sec */
1246        max_wait_count = MAKE_MODULO(max_wait_time,WAIT_INCREMENT) - WAIT_INCREMENT;
1247        do
1248        {
1249            ossaStallThread(agRoot, WAIT_INCREMENT);
1250            regVal = ossaHwRegRead(agRoot, MSGU_SCRATCH_PAD_1) & SCRATCH_PAD1_RST;
1251        } while ((regVal != toggleVal) && (max_wait_count -=WAIT_INCREMENT));
1252
1253        if ( !max_wait_count)
1254        {
1255            regVal = ossaHwRegRead(agRoot, MSGU_SCRATCH_PAD_1);
1256            SA_DBG1(("siSpcSoftReset: TIMEOUT:ToggleVal 0x%x, MSGU_SCRATCH_PAD1 = 0x%x\n", toggleVal, regVal));
1257            if(agNULL != agRoot->sdkData)
1258            {
1259              smTraceFuncExit(hpDBG_VERY_LOUD, 'i', "5t");
1260            }
1261#if defined(SALLSDK_DEBUG)
1262            SA_DBG1(("siSpcSoftReset: SCRATCH_PAD0 value = 0x%x\n", ossaHwRegRead(agRoot, MSGU_SCRATCH_PAD_0)));
1263            SA_DBG1(("siSpcSoftReset: SCRATCH_PAD2 value = 0x%x\n", ossaHwRegRead(agRoot, MSGU_SCRATCH_PAD_2)));
1264            SA_DBG1(("siSpcSoftReset: SCRATCH_PAD3 value = 0x%x\n", ossaHwRegRead(agRoot, MSGU_SCRATCH_PAD_3)));
1265#endif
1266            SA_DBG1(("siSpcSoftReset: Soft Reset AGSA_RC_FAILURE %d\n",8));
1267            return AGSA_RC_FAILURE;
1268        }
1269
1270    /* step 16 (Normal)step 15 (HDA) - Clear ODMR and ODCR */
1271        smTrace(hpDBG_VERY_LOUD,"QG", 16);
1272        /* TP:QG siSpcSoftReset */
1273
1274        ossaHwRegWrite(agRoot, MSGU_ODCR, ODCR_CLEAR_ALL);
1275        ossaHwRegWrite(agRoot, MSGU_ODMR, ODMR_CLEAR_ALL);
1276    }
1277    else if (signature == SPC_HDASOFT_RESET_SIGNATURE)
1278    {
1279      if(agNULL != agRoot->sdkData)
1280      {
1281        SA_DBG1(("siSpcSoftReset: HDA Soft Reset Complete\n"));
1282        smTraceFuncExit(hpDBG_VERY_LOUD, 'j', "5t");
1283      }
1284      return AGSA_RC_SUCCESS;
1285    }
1286
1287
1288    /* step 17 (Normal Mode): wait for the FW and IOP to get ready - 1 sec timeout */
1289    /* Wait for the SPC Configuration Table to be ready */
1290    if (mpiWaitForConfigTable(agRoot, &mainCfg) == AGSA_RC_FAILURE)
1291    {
1292       regVal = ossaHwRegRead(agRoot, MSGU_SCRATCH_PAD_1);
1293       /* return error if MPI Configuration Table not ready */
1294       SA_DBG1(("siSpcSoftReset: SPC FW not ready SCRATCH_PAD1 = 0x%x\n", regVal));
1295       regVal = ossaHwRegRead(agRoot, MSGU_SCRATCH_PAD_2);
1296       /* return error if MPI Configuration Table not ready */
1297       SA_DBG1(("siSpcSoftReset: SPC FW not ready SCRATCH_PAD2 = 0x%x\n", regVal));
1298       if(agNULL != agRoot->sdkData)
1299       {
1300          smTraceFuncExit(hpDBG_VERY_LOUD, 'k', "5t");
1301       }
1302#if defined(SALLSDK_DEBUG)
1303       SA_DBG1(("siSpcSoftReset: SCRATCH_PAD0 value = 0x%x\n", ossaHwRegRead(agRoot, MSGU_SCRATCH_PAD_0)));
1304       SA_DBG1(("siSpcSoftReset: SCRATCH_PAD3 value = 0x%x\n", ossaHwRegRead(agRoot, MSGU_SCRATCH_PAD_3)));
1305#endif
1306       SA_DBG1(("siSpcSoftReset: Soft Reset AGSA_RC_FAILURE %d\n",9));
1307            return AGSA_RC_FAILURE;
1308    }
1309    smTrace(hpDBG_VERY_LOUD,"QI", 18);
1310    /* TP:QI siSpcSoftReset */
1311
1312    if(agNULL != agRoot->sdkData)
1313    {
1314      smTraceFuncExit(hpDBG_VERY_LOUD, 'l', "5t");
1315    }
1316
1317    SA_DBG1(("siSpcSoftReset: Soft Reset Complete\n"));
1318
1319    return AGSA_RC_SUCCESS;
1320}
1321
1322/******************************************************************************/
1323/*! \brief Function to do BAR shifting
1324 *
1325 *  The siBarShift() function is called to shift BAR base address
1326 *
1327 *  \param agRoot handles for this instance of SAS/SATA hardware
1328 *  \param shiftValue shifting value
1329 *
1330 *  \return success or fail
1331 */
1332/*******************************************************************************/
1333GLOBAL bit32 siBar4Shift(
1334                      agsaRoot_t  *agRoot,
1335                      bit32       shiftValue
1336                      )
1337{
1338    bit32 regVal;
1339    bit32 max_wait_time;
1340    bit32 max_wait_count;
1341
1342    smTraceFuncEnter(hpDBG_VERY_LOUD,"5e");
1343    smTrace(hpDBG_VERY_LOUD,"GA",shiftValue);
1344    /* TP:GA shiftValue */
1345
1346    SA_DBG2(("siBar4Shift: shiftValue 0x%x\n",shiftValue));
1347
1348    if(smIS_SPCV(agRoot) )
1349    {
1350      ossaHwRegWriteExt(agRoot, PCIBAR0, V_MEMBASE_II_ShiftRegister, shiftValue);
1351      /* confirm the setting is written */
1352      max_wait_time = WAIT_SECONDS(1);  /* 1 sec */
1353      max_wait_count = MAKE_MODULO(max_wait_time,WAIT_INCREMENT) - WAIT_INCREMENT;
1354      do
1355      {
1356        ossaStallThread(agRoot, WAIT_INCREMENT);
1357        regVal = ossaHwRegReadExt(agRoot, PCIBAR0, V_MEMBASE_II_ShiftRegister);
1358      } while ((regVal != shiftValue) && (max_wait_count -= WAIT_INCREMENT));
1359
1360      if (!max_wait_count)
1361      {
1362        SA_DBG1(("siBar4Shift: TIMEOUT: SPC_IBW_AXI_TRANSLATION_LOW = 0x%x\n", regVal));
1363        smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "5e");
1364        return AGSA_RC_FAILURE;
1365      }
1366    }
1367    else if(smIS_SPC(agRoot))
1368    {
1369      /* program the inbound AXI translation Lower Address */
1370      ossaHwRegWriteExt(agRoot, PCIBAR1, SPC_IBW_AXI_TRANSLATION_LOW, shiftValue);
1371
1372      /* confirm the setting is written */
1373      max_wait_time = WAIT_SECONDS(1);  /* 1 sec */
1374      max_wait_count = MAKE_MODULO(max_wait_time,WAIT_INCREMENT) - WAIT_INCREMENT;
1375      do
1376      {
1377        ossaStallThread(agRoot, WAIT_INCREMENT);
1378        regVal = ossaHwRegReadExt(agRoot, PCIBAR1, SPC_IBW_AXI_TRANSLATION_LOW);
1379      } while ((regVal != shiftValue) && (max_wait_count -= WAIT_INCREMENT));
1380
1381      if (!max_wait_count)
1382      {
1383        SA_DBG1(("siBar4Shift: TIMEOUT: SPC_IBW_AXI_TRANSLATION_LOW = 0x%x\n", regVal));
1384        smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "5e");
1385        return AGSA_RC_FAILURE;
1386      }
1387    }
1388    else
1389    {
1390        SA_DBG1(("siBar4Shift: hba type is not support\n"));
1391        return AGSA_RC_FAILURE;
1392    }
1393    smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "5e");
1394
1395    return AGSA_RC_SUCCESS;
1396}
1397
1398#ifdef SA_ENABLE_HDA_FUNCTIONS
1399/******************************************************************************/
1400/*! \brief Function to force HDA mode the SPC
1401 *
1402 *  The siHDAMode() function is called to force to HDA mode. Upon return,
1403 *  the SPC FW loaded. The PCIe bus is not touched.
1404 *
1405 *  \param agRoot handles for this instance of SAS/SATA hardware
1406 *  \param HDAMode 0 - HDA soft reset mode, 1 - HDA mode
1407 *  \param fwImg points to structure containing fw images
1408 *
1409 *  \return -void-
1410 */
1411/*******************************************************************************/
1412GLOBAL bit32 siHDAMode(
1413                      agsaRoot_t  *agRoot,
1414                      bit32       HDAMode,
1415                      agsaFwImg_t *userFwImg
1416                      )
1417{
1418    spc_configMainDescriptor_t mainCfg;
1419    bit32                      regVal;
1420    bit32                      max_wait_time;
1421    bit32                      max_wait_count;
1422    agsaFwImg_t                flashImg;
1423    bit32                      startTime, endTime; // TestBase
1424    bit32                      stepTime[12]; // TestBase
1425
1426    bit32 HDA_Been_Reset = agFALSE;
1427
1428    smTraceFuncEnter(hpDBG_VERY_LOUD,"5d");
1429
1430    /* sanity check */
1431    SA_ASSERT( (agNULL != agRoot), "");
1432
1433    SA_DBG1(("siHDAMode: start\n"));
1434
1435    si_memset(&flashImg, 0, sizeof(flashImg));
1436#ifndef SA_EXCLUDE_FW_IMG
1437
1438    /* Set up built-in (default) FW image pointers */
1439/*
1440    flashImg.aap1Img = (bit8*)(&aap1array);
1441    flashImg.aap1Len = sizeof(aap1array);
1442    flashImg.ilaImg  = (bit8*)(&ilaarray);
1443    flashImg.ilaLen  = sizeof(ilaarray);
1444    flashImg.iopImg  = (bit8*)(&ioparray);
1445    flashImg.iopLen  = sizeof(ioparray);
1446*/
1447#endif
1448    TryAfterReset:
1449
1450    /* Set up user FW image pointers (if passed in) */
1451    if (userFwImg)
1452    {
1453      SA_DBG1(("siHDAMode: User fw structure @ %p\n",userFwImg));
1454      if (userFwImg->aap1Img && userFwImg->aap1Len)
1455      {
1456        flashImg.aap1Img = userFwImg->aap1Img;
1457        flashImg.aap1Len = userFwImg->aap1Len;
1458        SA_DBG1(("siHDAMode: User fw aap1 @ %p (%d)\n", flashImg.aap1Img, flashImg.aap1Len));
1459      }
1460      if (userFwImg->ilaImg && userFwImg->ilaLen)
1461      {
1462        flashImg.ilaImg = userFwImg->ilaImg;
1463        flashImg.ilaLen = userFwImg->ilaLen;
1464        SA_DBG1(("siHDAMode: User fw ila @ %p (%d)\n",  flashImg.ilaImg, flashImg.ilaLen));
1465      }
1466      if (userFwImg->iopImg && userFwImg->iopLen)
1467      {
1468        flashImg.iopImg = userFwImg->iopImg;
1469        flashImg.iopLen = userFwImg->iopLen;
1470        SA_DBG1(("siHDAMode: User fw iop @ %p (%d)\n", flashImg.iopImg, flashImg.iopLen));
1471      }
1472      if (userFwImg->istrImg && userFwImg->istrLen)
1473      {
1474        flashImg.istrImg = userFwImg->istrImg;
1475        flashImg.istrLen = userFwImg->istrLen;
1476        SA_DBG1(("siHDAMode: User fw istr @ %p (%d)\n", flashImg.istrImg, flashImg.istrLen));
1477      }
1478    }
1479    else
1480    {
1481      SA_DBG1(("siHDAMode: user supplied FW is not found\n"));
1482      smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "5d");
1483      return AGSA_RC_FAILURE;
1484    }
1485
1486#ifdef SA_EXCLUDE_FW_IMG
1487    /* Check that fw images are setup properly */
1488    if (!(flashImg.aap1Img && flashImg.aap1Len &&
1489          flashImg.ilaImg  && flashImg.ilaLen  &&
1490          flashImg.iopImg  && flashImg.iopLen  &&
1491          flashImg.istrImg && flashImg.istrLen))
1492    {
1493      SA_DBG1(("siHDAMode: Built-in FW img excluded and not user defined.\n"));
1494      smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "5d");
1495      return AGSA_RC_FAILURE;
1496    }
1497#endif
1498
1499    /* Check HDA mode with Soft Reset */
1500    if (!HDAMode)
1501    {
1502      /* Try soft reset until it goes into HDA mode */
1503      siSpcSoftReset(agRoot, SPC_HDASOFT_RESET_SIGNATURE);
1504
1505      /* read response state */
1506      regVal = ossaHwRegReadExt(agRoot, PCIBAR3, HDA_RSP_OFFSET1MB+HDA_CMD_CODE_OFFSET) & HDA_STATUS_BITS;
1507      if (regVal != BOOTTLOADERHDA_IDLE)
1508      {
1509        /* Can not go into HDA mode with 200 ms wait - HDA Soft Reset failed */
1510        SA_DBG1(("siHDAMode: HDA_RSP_OFFSET1MB+HDA_CMD_CODE_OFFSET = 0x%x\n", regVal));
1511        smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "5d");
1512        return AGSA_RC_FAILURE;
1513      }
1514
1515      /* HDA Mode - Clear ODMR and ODCR */
1516      ossaHwRegWrite(agRoot, MSGU_ODCR, ODCR_CLEAR_ALL);
1517      ossaHwRegWrite(agRoot, MSGU_ODMR, ODMR_CLEAR_ALL);
1518    }
1519
1520    /* Step 1: Poll BOOTTLOADERHDA_IDLE - HDA mode */
1521    SA_DBG1(("siHDAMode: Step1:Poll for HDAR_IDLE\n"));
1522    max_wait_time = WAIT_SECONDS(gWait_2);  /* 2 sec */
1523    max_wait_count = MAKE_MODULO(max_wait_time,WAIT_INCREMENT) - WAIT_INCREMENT;
1524    do
1525    {
1526      ossaStallThread(agRoot, WAIT_INCREMENT);
1527      regVal = ossaHwRegReadExt(agRoot, PCIBAR3, HDA_RSP_OFFSET1MB+HDA_CMD_CODE_OFFSET) & HDA_STATUS_BITS;
1528    } while ((regVal != BOOTTLOADERHDA_IDLE) && (max_wait_count -= WAIT_INCREMENT));
1529
1530    if (!max_wait_count)
1531    {
1532
1533      if( !HDA_Been_Reset )
1534      {
1535
1536        SA_DBG1(("siHDAMode: Reset: Step1:regVal =0x%x expect 0x%x\n",  regVal,ILAHDA_AAP1_IMG_GET ));
1537        siSpcSoftReset(agRoot, SPC_HDASOFT_RESET_SIGNATURE);
1538        HDA_Been_Reset  = agTRUE;
1539        goto TryAfterReset;
1540
1541      }
1542
1543      SA_DBG1(("siHDAMode: Step1:TIMEOUT: HDA_RSP_OFFSET1MB+HDA_CMD_CODE_OFFSET = 0x%x\n", regVal));
1544      smTraceFuncExit(hpDBG_VERY_LOUD, 'd', "5d");
1545      return AGSA_RC_FAILURE;
1546    }
1547
1548    /* Step 2: Push the init string to 0x0047E000 & data compare */
1549    SA_DBG1(("siHDAMode: Step2:Push the init string to 0x0047E000!\n"));
1550
1551    if (AGSA_RC_FAILURE == siBar4Cpy(agRoot, ILA_ISTR_ADDROFFSETHDA, flashImg.istrImg, flashImg.istrLen))
1552    {
1553      SA_DBG1(("siHDAMode: Step2:Copy ISTR array to 0x%x failed\n", ILA_ISTR_ADDROFFSETHDA));
1554      smTraceFuncExit(hpDBG_VERY_LOUD, 'e', "5d");
1555      return AGSA_RC_FAILURE;
1556    }
1557
1558    /* Tell FW ISTR is ready */
1559    regVal = (HDA_ISTR_DONE | (bit32)flashImg.istrLen);
1560    ossaHwRegWrite(agRoot, MSGU_HOST_SCRATCH_PAD_3, regVal);
1561    SA_DBG1(("siHDAMode: Step2:Host Scratchpad 3 (AAP1-ISTR): 0x%x\n", regVal));
1562
1563    stepTime[2] = ossaTimeStamp(agRoot);  // TestBase
1564    SA_DBG1(("siHDAMode: End Step2: (step_time[2] = %d)\n", stepTime[2]));  // TestBase
1565
1566    /* Step 3: Write the HDA mode SoftReset signature */
1567    SA_DBG1(("siHDAMode: Step3:Set Signature!\n"));
1568    /* set signature in host scratch pad0 register to tell SPC that the host performs the HDA mode */
1569    ossaHwRegWrite(agRoot, MSGU_HOST_SCRATCH_PAD_0, SPC_HDASOFT_RESET_SIGNATURE);
1570
1571    stepTime[3] = ossaTimeStamp(agRoot);  // TestBase
1572    SA_DBG1(("siHDAMode: End Step3: (step_time[3] =  %d)\n", stepTime[3]));  // TestBase
1573
1574    // Priya (Apps) requested that the FW load time measurement be started here
1575    startTime = ossaTimeStamp(agRoot);
1576    SA_DBG1(("siHDAMode: Step4: Ready to push ILA to 0x00400000! (start_time =  %d)\n", startTime));  // TestBase
1577
1578    /* Step 4: Push the ILA image to 0x00400000 */
1579    SA_DBG1(("siHDAMode: Step4:Push the ILA to 0x00400000!\n"));
1580
1581    if (AGSA_RC_FAILURE == siBar4Cpy(agRoot, 0x0, flashImg.ilaImg, flashImg.ilaLen))
1582    {
1583      SA_DBG1(("siHDAMode:Step4:Copy ILA array to 0x%x failed\n", 0x0));
1584      smTraceFuncExit(hpDBG_VERY_LOUD, 'f', "5d");
1585      return AGSA_RC_FAILURE;
1586    }
1587
1588    stepTime[4] = ossaTimeStamp(agRoot);
1589    SA_DBG1(("siHDAMode: End Step4: (step_time[4] = %d, %d ms)\n", stepTime[4], (stepTime[4] - startTime)));  // TestBase
1590
1591    /* Step 5: Tell boot ROM to authenticate ILA and execute it */
1592    ossaHwRegWriteExt(agRoot, PCIBAR3, HDA_CMD_OFFSET1MB, 0);
1593    ossaHwRegWriteExt(agRoot, PCIBAR3, HDA_CMD_OFFSET1MB+HDA_PAR_LEN_OFFSET, flashImg.ilaLen);
1594    regVal = (ossaHwRegReadExt(agRoot, PCIBAR3, HDA_RSP_OFFSET1MB+HDA_CMD_CODE_OFFSET) & HDA_SEQ_ID_BITS ) >> SHIFT16;
1595    regVal ++;
1596    regVal = (HDA_C_PA << SHIFT24) | (regVal << SHIFT16) | HDAC_EXEC_CMD;
1597    SA_DBG1(("siHDAMode: Step5:Execute ILA CMD: 0x%x\n", regVal));
1598    ossaHwRegWriteExt(agRoot, PCIBAR3, HDA_CMD_OFFSET1MB+HDA_CMD_CODE_OFFSET, regVal); /* Execute Command */
1599
1600    stepTime[5] = ossaTimeStamp(agRoot);
1601    SA_DBG1(("siHDAMode: End Step5: (step_time[5] = %d, %d ms)\n", stepTime[5], (stepTime[5] - startTime)));  // TestBase
1602
1603
1604    /* Step 6: Checking response status from boot ROM, HDAR_EXEC (good), HDAR_BAD_CMD and HDAR_BAD_IMG */
1605    SA_DBG1(("siHDAMode: Step6:Checking boot ROM reponse status!\n"));
1606    max_wait_time = WAIT_SECONDS(gWait_2);  /* 2 sec */
1607    max_wait_count = MAKE_MODULO(max_wait_time,WAIT_INCREMENT) - WAIT_INCREMENT;
1608    do
1609    {
1610      ossaStallThread(agRoot, WAIT_INCREMENT);
1611      regVal = ossaHwRegReadExt(agRoot, PCIBAR3, HDA_RSP_OFFSET1MB+HDA_CMD_CODE_OFFSET) & HDA_STATUS_BITS;
1612      if ((HDAR_EXEC == regVal) || (HDAR_BAD_IMG == regVal) || (HDAR_BAD_CMD == regVal))
1613        break;
1614    } while (max_wait_count-=WAIT_INCREMENT);
1615
1616    if (HDAR_BAD_IMG == regVal)
1617    {
1618      SA_DBG1(("siHDAMode: Step6:BAD IMG: HDA_RSP_OFFSET1MB+HDA_CMD_CODE_OFFSET = 0x%x\n", regVal));
1619      smTraceFuncExit(hpDBG_VERY_LOUD, 'g', "5d");
1620      return AGSA_RC_FAILURE;
1621    }
1622    if (HDAR_BAD_CMD == regVal)
1623    {
1624      SA_DBG1(("siHDAMode: Step6:BAD IMG: HDA_RSP_OFFSET1MB+HDA_CMD_CODE_OFFSET = 0x%x\n", regVal));
1625      smTraceFuncExit(hpDBG_VERY_LOUD, 'h', "5d");
1626      return AGSA_RC_FAILURE;
1627    }
1628    if (!max_wait_count)
1629    {
1630      SA_DBG1(("siHDAMode: Step6:TIMEOUT: HDA_RSP_OFFSET1MB+HDA_CMD_CODE_OFFSET = 0x%x\n", regVal));
1631      smTraceFuncExit(hpDBG_VERY_LOUD, 'i', "5d");
1632      return AGSA_RC_FAILURE;
1633    }
1634
1635    stepTime[6] = ossaTimeStamp(agRoot);
1636    SA_DBG1(("siHDAMode: End Step6: (step_time[6] = %d, %d ms)\n", stepTime[6], (stepTime[6] - startTime)));  // TestBase
1637
1638    /* Step 7: Poll ILAHDA_AAP1IMGGET/Offset in MSGU Scratchpad 0 */
1639    /* Check MSGU Scratchpad 1 [1,0] == 00 */
1640    SA_DBG1(("siHDAMode: Step7:Poll ILAHDA_AAP1_IMG_GET!\n"));
1641    regVal = ossaHwRegRead(agRoot, MSGU_SCRATCH_PAD_1) & SCRATCH_PAD1_RST;
1642    SA_DBG1(("siHDAMode: Step7:MSG Scratchpad 1: 0x%x\n", regVal));
1643    max_wait_time = WAIT_SECONDS(gWait_3);  /* 3 sec */
1644    max_wait_count = MAKE_MODULO(max_wait_time,WAIT_INCREMENT) - WAIT_INCREMENT;
1645    do
1646    {
1647      ossaStallThread(agRoot, WAIT_INCREMENT);
1648      regVal = ossaHwRegRead(agRoot, MSGU_SCRATCH_PAD_0) >> SHIFT24;
1649    } while ((regVal != ILAHDA_AAP1_IMG_GET) && (max_wait_count -= WAIT_INCREMENT));
1650
1651    if (!max_wait_count)
1652    {
1653
1654      if( !HDA_Been_Reset )
1655      {
1656
1657        SA_DBG1(("siHDAMode: Reset: Step7:regVal =0x%x expect 0x%x\n",  regVal,ILAHDA_AAP1_IMG_GET ));
1658        siSpcSoftReset(agRoot, SPC_HDASOFT_RESET_SIGNATURE);
1659        HDA_Been_Reset  = agTRUE;
1660        goto TryAfterReset;
1661
1662      }
1663
1664      SA_DBG1(("siHDAMode: TIMEOUT: Step7:regVal =0x%x expect 0x%x\n",  regVal,ILAHDA_AAP1_IMG_GET ));
1665#if defined(SALLSDK_DEBUG)
1666      SA_DBG1(("siHDAMode: SCRATCH_PAD0 value = 0x%x\n", ossaHwRegRead(agRoot, MSGU_SCRATCH_PAD_0)));
1667      SA_DBG1(("siHDAMode: SCRATCH_PAD1 value = 0x%x\n", ossaHwRegRead(agRoot, MSGU_SCRATCH_PAD_1)));
1668      SA_DBG1(("siHDAMode: SCRATCH_PAD2 value = 0x%x\n", ossaHwRegRead(agRoot, MSGU_SCRATCH_PAD_2)));
1669      SA_DBG1(("siHDAMode: SCRATCH_PAD3 value = 0x%x\n", ossaHwRegRead(agRoot, MSGU_SCRATCH_PAD_3)));
1670#endif
1671      smTraceFuncExit(hpDBG_VERY_LOUD, 'j', "5d");
1672      return AGSA_RC_FAILURE;
1673    }
1674    regVal = ossaHwRegRead(agRoot, MSGU_SCRATCH_PAD_0);
1675    SA_DBG1(("siHDAMode: Step7:MSG Scratchpad 0: 0x%x\n", regVal));
1676    regVal = ossaHwRegRead(agRoot, MSGU_SCRATCH_PAD_0) & 0x00FFFFFF;
1677
1678    stepTime[7] = ossaTimeStamp(agRoot);
1679    SA_DBG1(("siHDAMode: End Step7: (step_time[7] = %d, %d ms)\n", stepTime[7], (stepTime[7] - startTime)));  // TestBase
1680
1681    /* Step 8: Copy AAP1 image, update the Host Scratchpad 3 */
1682    SA_DBG1(("siHDAMode: Step8:Push the AAP1 to 0x00400000 plus 0x%x\n", regVal));
1683
1684    if (AGSA_RC_FAILURE == siBar4Cpy(agRoot, regVal, flashImg.aap1Img, flashImg.aap1Len))
1685    {
1686      SA_DBG1(("siHDAMode: Step8:Copy AAP1 array to 0x%x failed\n", regVal));
1687#if defined(SALLSDK_DEBUG)
1688      SA_DBG1(("siHDAMode: SCRATCH_PAD0 value = 0x%x\n", ossaHwRegRead(agRoot, MSGU_SCRATCH_PAD_0)));
1689      SA_DBG1(("siHDAMode: SCRATCH_PAD1 value = 0x%x\n", ossaHwRegRead(agRoot, MSGU_SCRATCH_PAD_1)));
1690      SA_DBG1(("siHDAMode: SCRATCH_PAD2 value = 0x%x\n", ossaHwRegRead(agRoot, MSGU_SCRATCH_PAD_2)));
1691      SA_DBG1(("siHDAMode: SCRATCH_PAD3 value = 0x%x\n", ossaHwRegRead(agRoot, MSGU_SCRATCH_PAD_3)));
1692#endif
1693      smTraceFuncExit(hpDBG_VERY_LOUD, 'k', "5d");
1694      return AGSA_RC_FAILURE;
1695    }
1696
1697    regVal = (HDA_AAP1_DONE | (bit32)flashImg.aap1Len);
1698    ossaHwRegWrite(agRoot, MSGU_HOST_SCRATCH_PAD_3, regVal);
1699    SA_DBG1(("siHDAMode: Step8:Host Scratchpad 3 (AAP1): 0x%x\n", regVal));
1700
1701    stepTime[8] = ossaTimeStamp(agRoot);
1702    SA_DBG1(("siHDAMode: End Step8: (step_time[8] = %d, %d ms)\n", stepTime[8], (stepTime[8] - startTime)));  // TestBase
1703
1704    /* Step 9: Poll ILAHDA_IOPIMGGET/Offset in MSGU Scratchpad 0 */
1705    SA_DBG1(("siHDAMode: Step9:Poll ILAHDA_IOP_IMG_GET!\n"));
1706    max_wait_time = WAIT_SECONDS(gWait_2);  /* 2 sec */
1707    max_wait_count = MAKE_MODULO(max_wait_time,WAIT_INCREMENT) - WAIT_INCREMENT;
1708    do
1709    {
1710      ossaStallThread(agRoot, WAIT_INCREMENT);
1711      regVal = ossaHwRegRead(agRoot, MSGU_SCRATCH_PAD_0) >> SHIFT24;
1712    } while ((regVal != ILAHDA_IOP_IMG_GET) && (max_wait_count -= WAIT_INCREMENT));
1713
1714    if (!max_wait_count)
1715    {
1716      SA_DBG1(("siHDAMode: Step9:TIMEOUT:MSGU_SCRATCH_PAD_0 = 0x%x\n", regVal));
1717#if defined(SALLSDK_DEBUG)
1718      SA_DBG1(("siHDAMode: SCRATCH_PAD1 value = 0x%x\n", ossaHwRegRead(agRoot, MSGU_SCRATCH_PAD_1)));
1719      SA_DBG1(("siHDAMode: SCRATCH_PAD2 value = 0x%x\n", ossaHwRegRead(agRoot, MSGU_SCRATCH_PAD_2)));
1720      SA_DBG1(("siHDAMode: SCRATCH_PAD3 value = 0x%x\n", ossaHwRegRead(agRoot, MSGU_SCRATCH_PAD_3)));
1721#endif
1722      smTraceFuncExit(hpDBG_VERY_LOUD, 'l', "5d");
1723      return AGSA_RC_FAILURE;
1724    }
1725    regVal = ossaHwRegRead(agRoot, MSGU_SCRATCH_PAD_0);
1726    SA_DBG1(("siHDAMode: Step9:MSG Scratchpad 0: 0x%x\n", regVal));
1727    regVal = ossaHwRegRead(agRoot, MSGU_SCRATCH_PAD_0) & HDA_GSM_OFFSET_BITS;
1728
1729    stepTime[9] = ossaTimeStamp(agRoot);
1730    SA_DBG1(("siHDAMode: End Step9: (step_time[9] = %d, %d ms)\n", stepTime[9], (stepTime[9] - startTime)));  // TestBase
1731
1732    // saHdaLoadForceHalt(agRoot);  // TestBase
1733
1734    /* Step 10: Copy IOP image, update the Host Scratchpad 3 */
1735    SA_DBG1(("siHDAMode: Step10:Push the IOP to 0x00400000 plus 0x%x!\n", regVal));
1736
1737    if (AGSA_RC_FAILURE == siBar4Cpy(agRoot, regVal, flashImg.iopImg, flashImg.iopLen))
1738    {
1739      SA_DBG1(("siHDAMode: Step10:Copy IOP array to 0x%x failed\n", regVal));
1740#if defined(SALLSDK_DEBUG)
1741      SA_DBG1(("siHDAMode: SCRATCH_PAD1 value = 0x%x\n", ossaHwRegRead(agRoot, MSGU_SCRATCH_PAD_1)));
1742      SA_DBG1(("siHDAMode: SCRATCH_PAD2 value = 0x%x\n", ossaHwRegRead(agRoot, MSGU_SCRATCH_PAD_2)));
1743      SA_DBG1(("siHDAMode: SCRATCH_PAD3 value = 0x%x\n", ossaHwRegRead(agRoot, MSGU_SCRATCH_PAD_3)));
1744#endif
1745      smTraceFuncExit(hpDBG_VERY_LOUD, 'm', "5d");
1746      return AGSA_RC_FAILURE;
1747    }
1748
1749    regVal = (HDA_IOP_DONE | (bit32)flashImg.iopLen);
1750    ossaHwRegWrite(agRoot, MSGU_HOST_SCRATCH_PAD_3, regVal);
1751    SA_DBG1(("siHDAMode: Step10:Host Scratchpad 3 (IOP): 0x%x\n", regVal));
1752
1753    stepTime[10] = ossaTimeStamp(agRoot);
1754    SA_DBG1(("siHDAMode: End Step10: (step_time[10] = %d, %d ms)\n", stepTime[10], (stepTime[10] - startTime)));  // TestBase
1755
1756    /* Clear the signature */
1757    ossaHwRegWrite(agRoot, MSGU_HOST_SCRATCH_PAD_0, 0);
1758
1759    /* step 11: wait for the FW and IOP to get ready - 1 sec timeout */
1760    /* Wait for the SPC Configuration Table to be ready */
1761    stepTime[11] = ossaTimeStamp(agRoot);
1762    SA_DBG1(("siHDAMode: Start Step11: Wait for FW ready. (step_time[11.1] =  %d, %d ms)\n", stepTime[11], (stepTime[11] - startTime))); // TestBase
1763
1764    endTime = ossaTimeStamp(agRoot);
1765    SA_DBG1(("siHDAMode: End Step11: FW ready! (end_time= %d, fw_load_time = %d ms)\n", endTime, endTime - startTime)); // TestBase
1766
1767    SA_DBG1(("siHDAMode: Step11:Poll for FW ready!\n"));
1768    if (mpiWaitForConfigTable(agRoot, &mainCfg) == AGSA_RC_FAILURE)
1769    {
1770      regVal = ossaHwRegRead(agRoot, MSGU_SCRATCH_PAD_1);
1771      /* return error if MPI Configuration Table not ready */
1772      SA_DBG1(("siHDAMode: Step11:SPC FW not ready SCRATCH_PAD1 = 0x%x\n", regVal));
1773      regVal = ossaHwRegRead(agRoot, MSGU_SCRATCH_PAD_2);
1774      /* return error if MPI Configuration Table not ready */
1775      SA_DBG1(("siHDAMode: Step11:SPC FW not ready SCRATCH_PAD2 = 0x%x\n", regVal));
1776      /* read detail fatal errors */
1777      regVal = ossaHwRegRead(agRoot, MSGU_SCRATCH_PAD_0);
1778      SA_DBG1(("siHDAMode: Step11:ScratchPad0 AAP error code 0x%x\n", regVal));
1779      regVal = ossaHwRegRead(agRoot, MSGU_SCRATCH_PAD_3);
1780      SA_DBG1(("siHDAMode: Step11:ScratchPad3 IOP error code 0x%x\n", regVal));
1781      smTraceFuncExit(hpDBG_VERY_LOUD, 'n', "5d");
1782      return AGSA_RC_FAILURE;
1783    }
1784
1785    smTraceFuncExit(hpDBG_VERY_LOUD, 'o', "5d");
1786
1787    SA_DBG1(("siHDAMode: HDA Mode Complete\n"));
1788
1789    return AGSA_RC_SUCCESS;
1790}
1791
1792/******************************************************************************/
1793/*! \brief memcopy cross PCI from host memory to card memory
1794 *
1795 *  \param agRoot        handles for this instance of SAS/SATA hardware
1796 *  \param dstoffset     distination offset
1797 *  \param src           source pointer
1798 *  \param DWcount       DWord count
1799 *  \param busBaseNumber PCI Bus Base number
1800 *
1801 *  \return -void-
1802 *
1803 */
1804/*******************************************************************************/
1805LOCAL void siPciMemCpy(agsaRoot_t *agRoot,
1806                       bit32 dstoffset,
1807                       void *src,
1808                       bit32 DWcount,
1809                       bit32 busBaseNumber
1810                       )
1811{
1812    bit32 i, val;
1813    bit32 *src1;
1814
1815    src1 = (bit32 *)src;
1816
1817    for (i= 0; i < DWcount; i++)
1818    {
1819        val = BIT32_TO_LEBIT32(src1[i]);
1820        ossaHwRegWriteExt(agRoot, busBaseNumber, (dstoffset + i * 4), val);
1821    }
1822
1823    return;
1824}
1825
1826/******************************************************************************/
1827/*! \brief Function to copy FW array
1828 *
1829 *  The siBar4Cpy() function is called to copy FW array via BAR4
1830 *  (PCIe spec: BAR4, MEMBASE-III in PM, PCIBAR2 in host driver)
1831 *  in 64-KB MEMBASE MODE.
1832 *
1833 *  \param agRoot     handles for this instance of SAS/SATA hardware
1834 *  \param offset     destination offset
1835 *  \param parray     pointer of array
1836 *  \param array_size size of array
1837 *
1838 *  \return AGSA_RC_SUCCESS or AGSA_RC_FAILURE
1839 */
1840/*******************************************************************************/
1841LOCAL bit32 siBar4Cpy(
1842                      agsaRoot_t  *agRoot,
1843                      bit32       offset,
1844                      bit8        * parray,
1845                      bit32       array_size
1846                      )
1847{
1848    bit32       dest_shift_addr, dest_offset, cpy_size;
1849
1850    smTraceFuncEnter(hpDBG_VERY_LOUD,"5f");
1851
1852    /* first time to shift */
1853    dest_shift_addr = (GSMSM_AXI_LOWERADDR+offset) & SHIFT_MASK;
1854    dest_offset = offset & OFFSET_MASK;
1855    do
1856    {
1857        if (AGSA_RC_FAILURE == siBar4Shift(agRoot, dest_shift_addr))
1858        {
1859            SA_DBG1(("siHDAMode:Shift Bar4 to 0x%x failed\n", dest_shift_addr));
1860            smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "5f");
1861            return AGSA_RC_FAILURE;
1862        }
1863
1864        if ((dest_offset+array_size) > SIZE_64KB)
1865        {
1866            cpy_size = SIZE_64KB - dest_offset;
1867        }
1868        else
1869            cpy_size = array_size;
1870
1871        siPciMemCpy(agRoot, dest_offset, parray, (bit32)(CEILING(cpy_size,4)), PCIBAR2);
1872
1873        array_size -= cpy_size;
1874        dest_shift_addr += SIZE_64KB;
1875        dest_offset = 0;
1876        parray = parray + cpy_size;
1877    } while (array_size !=0 );
1878
1879    /* Shift back to BAR4 original address */
1880    if (AGSA_RC_FAILURE == siBar4Shift(agRoot, 0x0))
1881    {
1882        SA_DBG1(("siHDAMode:Shift Bar4 to 0x%x failed\n", 0x0));
1883        smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "5f");
1884        return AGSA_RC_FAILURE;
1885    }
1886
1887    smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "5f");
1888
1889    return AGSA_RC_SUCCESS;
1890}
1891
1892GLOBAL
1893bit32 siHDAMode_V(
1894                      agsaRoot_t  *agRoot,
1895                      bit32       HDAMode,
1896                      agsaFwImg_t *userFwImg
1897                      )
1898{
1899  bit32 returnVal = AGSA_RC_FAILURE;
1900  bit32 save,i,biggest;
1901  bit32 hda_status;
1902  bit32 hda_command_complete = 0;
1903  bit32 max_wait_time;
1904  bit32 max_wait_count;
1905  bit32 seq_id = 0;
1906  bit32 base_Hi = 0;
1907  bit32 base_Lo = 0;
1908  bit8 * pbase;
1909
1910  spcv_hda_cmd_t hdacmd;
1911  spcv_hda_rsp_t hdarsp;
1912
1913  agsaLLRoot_t      *saRoot;
1914
1915  /* sanity check */
1916  SA_ASSERT( (agNULL != agRoot), "");
1917
1918  saRoot = (agsaLLRoot_t *)(agRoot->sdkData);
1919
1920  /* sanity check */
1921  SA_ASSERT( (agNULL != saRoot), "saRoot is NULL");
1922
1923  smTraceFuncEnter(hpDBG_VERY_LOUD,"2W");
1924
1925  SA_DBG1(("siHDAMode_V: HDAMode %X\n",HDAMode));
1926
1927  siScratchDump(agRoot);
1928  if( agNULL == userFwImg)
1929  {
1930    SA_DBG1(("siHDAMode_V: No image agNULL == userFwImg\n" ));
1931    smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "2W");
1932    return returnVal;
1933  }
1934
1935  hda_status = (ossaHwRegReadExt(agRoot, PCIBAR0, SPC_V_HDA_RESPONSE_OFFSET+28));
1936
1937  SA_DBG1(("siHDAMode_V: hda_status 0x%08X\n",hda_status ));
1938  SA_DBG1(("siHDAMode_V:                                                                   STEP 1\n"));
1939
1940  smTrace(hpDBG_VERY_LOUD,"2X",1 );
1941  /* TP:2X STEP 1 */
1942
1943  /* Find largest Physical chunk memory */
1944  for(i=0,biggest = 0,save = 0; i < saRoot->memoryAllocated.count; i++)
1945  {
1946    if( saRoot->memoryAllocated.agMemory[i].totalLength > biggest)
1947    {
1948
1949      if(biggest < saRoot->memoryAllocated.agMemory[i].totalLength)
1950      {
1951        save = i;
1952        biggest = saRoot->memoryAllocated.agMemory[i].totalLength;
1953      }
1954
1955    }
1956  }
1957/*
1958Step 1 The host reads the HDA response field RSP_CODE at byte offset 28:29 of the response block
1959for HDAR_IDLE (0x8002) via MEMBASE-I. A value other than HDAR_IDLE (0x8002) indicates that the
1960SPCv controller is not in HDA mode. Follow the steps described in Section 4.21.1 to bring the
1961SPCv controller into HDA mode. When the host reads the correct RSP_CODE, it indicates that the
1962SPCv controller boot ROM is ready to proceed to the next step of HDA initialization
1963*/
1964
1965  base_Hi = saRoot->memoryAllocated.agMemory[save].phyAddrUpper;
1966  base_Lo = saRoot->memoryAllocated.agMemory[save].phyAddrLower;
1967  pbase = saRoot->memoryAllocated.agMemory[save].virtPtr;
1968  SA_DBG1(("siHDAMode_V:Use DMA memory at [%d] size 0x%x (%d) DMA Loc U 0x%08x L 0x%08x @%p\n",save,
1969                                biggest,
1970                                biggest,
1971                                base_Hi,
1972                                base_Lo,
1973                                pbase
1974                               ));
1975
1976
1977  SA_DBG1(("siHDAMode_V: HDA aap1Img %p len %8d 0x%x\n", userFwImg->aap1Img, userFwImg->aap1Len , userFwImg->aap1Len ));
1978  SA_DBG1(("siHDAMode_V: HDA ilaImg  %p len %8d 0x%x\n", userFwImg->ilaImg,  userFwImg->ilaLen ,  userFwImg->ilaLen ));
1979  SA_DBG1(("siHDAMode_V: HDA iopImg  %p len %8d 0x%x\n", userFwImg->iopImg,  userFwImg->iopLen  , userFwImg->iopLen ));
1980  if(userFwImg->aap1Len > biggest)
1981  {
1982    SA_DBG1(("siHDAMode_V: HDA DMA area too small %d < %d aap1Len\n", biggest ,userFwImg->aap1Len));
1983    SA_ASSERT( (agNULL != agRoot), "aap1Len > biggest");
1984    smTraceFuncExit(hpDBG_VERY_LOUD, 'b', "2W");
1985    return returnVal;
1986  }
1987  if(userFwImg->ilaLen > biggest)
1988  {
1989    SA_DBG1(("siHDAMode_V: HDA DMA area too small %d < %d ilaLen\n", biggest ,userFwImg->ilaLen));
1990    SA_ASSERT( (agNULL != agRoot), "ilaLen > biggest");
1991    smTraceFuncExit(hpDBG_VERY_LOUD, 'c', "2W");
1992    return returnVal;
1993  }
1994  if(userFwImg->iopLen > biggest)
1995  {
1996    SA_DBG1(("siHDAMode_V: HDA DMA area too small %d < %d iopLen\n", biggest ,userFwImg->iopLen));
1997    SA_ASSERT( (agNULL != agRoot), "iopLen > biggest");
1998    smTraceFuncExit(hpDBG_VERY_LOUD, 'd', "2W");
1999    return returnVal;
2000  }
2001
2002
2003  if(HDA_STEP_2)
2004  { /* ILA */
2005    si_memset(pbase, 0, biggest);
2006
2007    if( userFwImg->ilaLen < biggest)
2008    {
2009      si_memcpy(pbase,userFwImg->ilaImg, userFwImg->ilaLen );
2010    }
2011    else
2012    {
2013      SA_DBG1(("siHDAMode_V:  userFwImg->ilaLen 0x%x < biggest 0x%x\n",userFwImg->ilaLen,biggest));
2014    }
2015
2016    si_memset(&hdacmd,0,sizeof(spcv_hda_cmd_t));
2017    si_memset(&hdarsp,0,sizeof(spcv_hda_rsp_t));
2018
2019    hda_status = ossaHwRegReadExt(agRoot, PCIBAR0, SPC_V_HDA_RESPONSE_OFFSET+28);
2020    if((hda_status  & SPC_V_HDAR_RSPCODE_MASK)  == SPC_V_HDAR_IDLE)
2021    {
2022
2023      hdacmd.cmdparm_0 = base_Lo; /* source DmaBase_l*/
2024      hdacmd.cmdparm_1 = base_Hi; /* source DmaBase_u*/
2025      hdacmd.cmdparm_2 = 0x1e200000; /* destin */
2026      hdacmd.cmdparm_3 = 0; /* destin */
2027      hdacmd.cmdparm_4 = userFwImg->ilaLen ; /* length */
2028      hdacmd.cmdparm_5 = 0;/* not used */
2029      hdacmd.cmdparm_6 = 0;/* not used */
2030      seq_id++;
2031      hdacmd.C_PA_SEQ_ID_CMD_CODE = ( SPC_V_HDAC_PA << SHIFT24 ) | ( seq_id << SHIFT16 )| SPC_V_HDAC_DMA;
2032
2033      SA_DBG1(("siHDAMode_V:          Write SPC_V_HDAC_DMA                                     STEP 2\n"));
2034      /*
2035      Step 2
2036      The host writes the HDAC_DMA (0x000 24) in the command field CMD_CODE via MEMBASE-I
2037      for issuing the DMA command to ask the boot ROM to pull the ILA image via DMA into
2038      GSM with the following parameters set up first:
2039      Parameter 1:0: Host physical address for holding the HDA-ILA image.
2040      Parameter 3:2: GSM physical address 0x1E20_0000.
2041      Parameter 4: the length of the HDAILA  image.
2042      */
2043
2044      SA_DBG2(("siHDAMode_V: Write ILA to offset %X\n",hdacmd.cmdparm_2));
2045
2046      ossaHwRegWriteExt(agRoot, PCIBAR0, SPC_V_HDA_COMMAND_OFFSET+0,hdacmd.cmdparm_0);
2047      ossaHwRegWriteExt(agRoot, PCIBAR0, SPC_V_HDA_COMMAND_OFFSET+4,hdacmd.cmdparm_1);
2048      ossaHwRegWriteExt(agRoot, PCIBAR0, SPC_V_HDA_COMMAND_OFFSET+8,hdacmd.cmdparm_2);
2049      ossaHwRegWriteExt(agRoot, PCIBAR0, SPC_V_HDA_COMMAND_OFFSET+12,hdacmd.cmdparm_3);
2050      ossaHwRegWriteExt(agRoot, PCIBAR0, SPC_V_HDA_COMMAND_OFFSET+16,hdacmd.cmdparm_4);
2051      ossaHwRegWriteExt(agRoot, PCIBAR0, SPC_V_HDA_COMMAND_OFFSET+20,hdacmd.cmdparm_5);
2052      ossaHwRegWriteExt(agRoot, PCIBAR0, SPC_V_HDA_COMMAND_OFFSET+24,hdacmd.cmdparm_6);
2053      ossaHwRegWriteExt(agRoot, PCIBAR0, SPC_V_HDA_COMMAND_OFFSET+28,hdacmd.C_PA_SEQ_ID_CMD_CODE);
2054
2055      SA_DBG2(("siHDAMode_V:  Command 0 0x%08X 0x%08X 0x%08X 0x%08X 0x%08X 0x%08X 0x%08X 0x%08X\n",
2056                          ossaHwRegReadExt(agRoot, PCIBAR0, SPC_V_HDA_COMMAND_OFFSET+0),
2057                          ossaHwRegReadExt(agRoot, PCIBAR0, SPC_V_HDA_COMMAND_OFFSET+4),
2058                          ossaHwRegReadExt(agRoot, PCIBAR0, SPC_V_HDA_COMMAND_OFFSET+8),
2059                          ossaHwRegReadExt(agRoot, PCIBAR0, SPC_V_HDA_COMMAND_OFFSET+12),
2060                          ossaHwRegReadExt(agRoot, PCIBAR0, SPC_V_HDA_COMMAND_OFFSET+16),
2061                          ossaHwRegReadExt(agRoot, PCIBAR0, SPC_V_HDA_COMMAND_OFFSET+20),
2062                          ossaHwRegReadExt(agRoot, PCIBAR0, SPC_V_HDA_COMMAND_OFFSET+24),
2063                          ossaHwRegReadExt(agRoot, PCIBAR0, SPC_V_HDA_COMMAND_OFFSET+28) ));
2064
2065      SA_DBG2(("siHDAMode_V: command %X\n",hdacmd.C_PA_SEQ_ID_CMD_CODE ));
2066
2067      max_wait_time = (2000 * 1000); /* wait 2 seconds */
2068      max_wait_count = MAKE_MODULO(max_wait_time,WAIT_INCREMENT) - WAIT_INCREMENT;
2069      hda_command_complete = 0;
2070      do
2071      {
2072        ossaStallThread(agRoot, WAIT_INCREMENT);
2073        hda_command_complete = ((ossaHwRegReadExt(agRoot, PCIBAR0, SPC_V_HDA_RESPONSE_OFFSET+28) & SPC_V_HDAR_SEQID_MASK ) >> SHIFT16) == seq_id;
2074      } while (!hda_command_complete && (max_wait_count -= WAIT_INCREMENT));
2075      SA_DBG1(("siHDAMode_V:SCRATCH_PAD1 = 0x%x STEP 2 took %d\n", ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_1),(max_wait_time -  max_wait_count)));
2076
2077      smTrace(hpDBG_VERY_LOUD,"2Y",(max_wait_time -  max_wait_count) );
2078      /* TP:2Y STEP 2 took */
2079
2080
2081      if(! hda_command_complete)
2082      {
2083        SA_DBG1(("siHDAMode_V:2SCRATCH_PAD0 value = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR0, V_Scratchpad_0_Register)));
2084        SA_DBG1(("siHDAMode_V: SCRATCH_PAD1 value = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR0, V_Scratchpad_1_Register)));
2085        SA_DBG1(("siHDAMode_V: SCRATCH_PAD2 value = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR0, V_Scratchpad_2_Register)));
2086        SA_DBG1(("siHDAMode_V: SCRATCH_PAD3 value = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR0, V_Scratchpad_3_Register)));
2087        SA_DBG1(("siHDAMode_V:hda_command_complete failed Step 2\n" ));
2088        smTraceFuncExit(hpDBG_VERY_LOUD, 'e', "2W");
2089        return returnVal;
2090      }
2091
2092
2093      SA_DBG2(("siHDAMode_V:2SCRATCH_PAD0 value = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR0, V_Scratchpad_0_Register)));
2094      SA_DBG2(("siHDAMode_V: SCRATCH_PAD1 value = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR0, V_Scratchpad_1_Register)));
2095      SA_DBG2(("siHDAMode_V: SCRATCH_PAD2 value = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR0, V_Scratchpad_2_Register)));
2096      SA_DBG2(("siHDAMode_V: SCRATCH_PAD3 value = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR0, V_Scratchpad_3_Register)));
2097
2098    }
2099
2100    SA_DBG1(("siHDAMode_V: ILA DMA done\n" ));
2101  } /* end ila   */
2102
2103  if(HDA_STEP_3)
2104  {
2105
2106    SA_DBG1(("siHDAMode_V:                                                                   STEP 3\n"));
2107    /*
2108      Step 3
2109      The host polls the HDA response field RSP_CODE for HDAR_IDLE (0x8002) via MEMBASE-I. The polling timeout
2110      should be no more than 1 second. The response status, HDAR_IDLE with its status equal to 0x10,
2111      indicates a DMA success response from the boot ROM. Response states that indicate a failure are:
2112      HDAR_BAD_CMD HDAR_BAD_IMG HDAR_IDLE with its status equal to 0x11
2113
2114    */
2115
2116    max_wait_time = (2000 * 1000); /* wait 2 seconds */
2117    max_wait_count = MAKE_MODULO(max_wait_time,WAIT_INCREMENT) - WAIT_INCREMENT;
2118    hda_command_complete = 0;
2119    do
2120    {
2121      ossaStallThread(agRoot, WAIT_INCREMENT);
2122      hda_command_complete = ((ossaHwRegReadExt(agRoot, PCIBAR0, SPC_V_HDA_RESPONSE_OFFSET+28) & SPC_V_HDAR_SEQID_MASK ) >> SHIFT16) == seq_id;
2123    } while (!hda_command_complete && (max_wait_count -= WAIT_INCREMENT));
2124
2125    SA_DBG1(("siHDAMode_V:SCRATCH_PAD1 = 0x%x STEP 3 took %d\n", ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_1),(max_wait_time -  max_wait_count)));
2126    smTrace(hpDBG_VERY_LOUD,"2Z",(max_wait_time -  max_wait_count) );
2127    /* TP:2Z STEP 3 took */
2128
2129    if(! hda_command_complete)
2130    {
2131
2132      SA_DBG1(("siHDAMode_V: Response 0 0x%08X 0x%08X 0x%08X 0x%08X 0x%08X 0x%08X 0x%08X 0x%08X\n",
2133                          ossaHwRegReadExt(agRoot, PCIBAR0, SPC_V_HDA_RESPONSE_OFFSET+0),
2134                          ossaHwRegReadExt(agRoot, PCIBAR0, SPC_V_HDA_RESPONSE_OFFSET+4),
2135                          ossaHwRegReadExt(agRoot, PCIBAR0, SPC_V_HDA_RESPONSE_OFFSET+8),
2136                          ossaHwRegReadExt(agRoot, PCIBAR0, SPC_V_HDA_RESPONSE_OFFSET+12),
2137                          ossaHwRegReadExt(agRoot, PCIBAR0, SPC_V_HDA_RESPONSE_OFFSET+16),
2138                          ossaHwRegReadExt(agRoot, PCIBAR0, SPC_V_HDA_RESPONSE_OFFSET+20),
2139                          ossaHwRegReadExt(agRoot, PCIBAR0, SPC_V_HDA_RESPONSE_OFFSET+24),
2140                          ossaHwRegReadExt(agRoot, PCIBAR0, SPC_V_HDA_RESPONSE_OFFSET+28) ));
2141
2142
2143      SA_DBG1(("siHDAMode_V:3SCRATCH_PAD0 value = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR0, V_Scratchpad_0_Register)));
2144      SA_DBG1(("siHDAMode_V: SCRATCH_PAD1 value = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR0, V_Scratchpad_1_Register)));
2145      SA_DBG1(("siHDAMode_V: SCRATCH_PAD2 value = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR0, V_Scratchpad_2_Register)));
2146      SA_DBG1(("siHDAMode_V: SCRATCH_PAD3 value = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR0, V_Scratchpad_3_Register)));
2147      SA_DBG1(("siHDAMode_V:hda_command_complete failed Step 3\n" ));
2148      smTraceFuncExit(hpDBG_VERY_LOUD, 'f', "2W");
2149      return returnVal;
2150    }
2151
2152
2153    hda_command_complete = ((ossaHwRegReadExt(agRoot, PCIBAR0, SPC_V_HDA_RESPONSE_OFFSET+28) & SPC_V_HDAR_SEQID_MASK ) >> SHIFT16) == seq_id;
2154    hda_status = (ossaHwRegReadExt(agRoot, PCIBAR0, SPC_V_HDA_RESPONSE_OFFSET+28) & SPC_V_HDAR_RSPCODE_MASK );
2155
2156    SA_DBG2(("siHDAMode_V:ILA is ready hda_status %X hda_command_complete %d\n",hda_status ,hda_command_complete));
2157
2158    /* Tell FW ILA is ready */
2159    SA_DBG2(("siHDAMode_V: Response 0 0x%08X 0x%08X 0x%08X 0x%08X 0x%08X 0x%08X 0x%08X 0x%08X\n",
2160                        ossaHwRegReadExt(agRoot, PCIBAR0, SPC_V_HDA_RESPONSE_OFFSET+0),
2161                        ossaHwRegReadExt(agRoot, PCIBAR0, SPC_V_HDA_RESPONSE_OFFSET+4),
2162                        ossaHwRegReadExt(agRoot, PCIBAR0, SPC_V_HDA_RESPONSE_OFFSET+8),
2163                        ossaHwRegReadExt(agRoot, PCIBAR0, SPC_V_HDA_RESPONSE_OFFSET+12),
2164                        ossaHwRegReadExt(agRoot, PCIBAR0, SPC_V_HDA_RESPONSE_OFFSET+16),
2165                        ossaHwRegReadExt(agRoot, PCIBAR0, SPC_V_HDA_RESPONSE_OFFSET+20),
2166                        ossaHwRegReadExt(agRoot, PCIBAR0, SPC_V_HDA_RESPONSE_OFFSET+24),
2167                        ossaHwRegReadExt(agRoot, PCIBAR0, SPC_V_HDA_RESPONSE_OFFSET+28) ));
2168
2169    SA_DBG2(("siHDAMode_V:3SCRATCH_PAD0 value = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR0, V_Scratchpad_0_Register)));
2170    SA_DBG2(("siHDAMode_V: SCRATCH_PAD1 value = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR0, V_Scratchpad_1_Register)));
2171    SA_DBG2(("siHDAMode_V: SCRATCH_PAD2 value = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR0, V_Scratchpad_2_Register)));
2172    SA_DBG2(("siHDAMode_V: SCRATCH_PAD3 value = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR0, V_Scratchpad_3_Register)));
2173
2174    SA_DBG2(("siHDAMode_V: Step 3 MSGU_HOST_SCRATCH_PAD_3 write %X\n",HDA_ISTR_DONE));
2175    ossaHwRegWriteExt(agRoot, PCIBAR0,MSGU_HOST_SCRATCH_PAD_3 ,HDA_ISTR_DONE );
2176
2177    SA_DBG2(("siHDAMode_V:3SCRATCH_PAD0 value = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR0, V_Scratchpad_0_Register)));
2178    SA_DBG2(("siHDAMode_V: SCRATCH_PAD1 value = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR0, V_Scratchpad_1_Register)));
2179    SA_DBG2(("siHDAMode_V: SCRATCH_PAD2 value = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR0, V_Scratchpad_2_Register)));
2180    SA_DBG2(("siHDAMode_V: SCRATCH_PAD3 value = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR0, V_Scratchpad_3_Register)));
2181
2182  }
2183
2184  if(HDA_STEP_4)
2185  {
2186
2187    SA_DBG2(("siHDAMode_V: Exec ILA\n"));
2188    si_memset(&hdacmd,0,sizeof(spcv_hda_cmd_t));
2189    si_memset(&hdarsp,0,sizeof(spcv_hda_rsp_t));
2190
2191    hdacmd.cmdparm_0 = 0x200000; /* length  SPC_V_HDAC_EXEC*/;
2192    hdacmd.cmdparm_1 = userFwImg->ilaLen ; /* length  SPC_V_HDAC_EXEC*/;
2193    seq_id++;
2194
2195    hdacmd.C_PA_SEQ_ID_CMD_CODE = ( SPC_V_HDAC_PA << SHIFT24 ) | ( seq_id << SHIFT16 )| SPC_V_HDAC_EXEC;
2196
2197    SA_DBG1(("siHDAMode_V:                                                                   STEP 4\n"));
2198
2199    /*
2200    Step 4
2201    The host writes the HDAC_EXEC command (0x0002) via MEMBASE-I for the boot ROM to authenticate
2202    and execute the HDA-ILA image. The host sets parameter 0 and parameter 1 for the HDA-ILA image
2203    appropriately:
2204    Parameter 0: Entry offset this value must be 0x20_0000.
2205    Parameter 1: the HDA-ILA image length.
2206    */
2207
2208    ossaHwRegWriteExt(agRoot, PCIBAR0, SPC_V_HDA_COMMAND_OFFSET+0 ,hdacmd.cmdparm_0);
2209    ossaHwRegWriteExt(agRoot, PCIBAR0, SPC_V_HDA_COMMAND_OFFSET+4 ,hdacmd.cmdparm_1);
2210    ossaHwRegWriteExt(agRoot, PCIBAR0, SPC_V_HDA_COMMAND_OFFSET+8 ,hdacmd.cmdparm_2);
2211    ossaHwRegWriteExt(agRoot, PCIBAR0, SPC_V_HDA_COMMAND_OFFSET+12,hdacmd.cmdparm_3);
2212    ossaHwRegWriteExt(agRoot, PCIBAR0, SPC_V_HDA_COMMAND_OFFSET+16,hdacmd.cmdparm_4);
2213    ossaHwRegWriteExt(agRoot, PCIBAR0, SPC_V_HDA_COMMAND_OFFSET+20,hdacmd.cmdparm_5);
2214    ossaHwRegWriteExt(agRoot, PCIBAR0, SPC_V_HDA_COMMAND_OFFSET+24,hdacmd.cmdparm_6);
2215    ossaHwRegWriteExt(agRoot, PCIBAR0, SPC_V_HDA_COMMAND_OFFSET+28,hdacmd.C_PA_SEQ_ID_CMD_CODE);
2216
2217    SA_DBG1(("siHDAMode_V: Exec ILA\n" ));
2218
2219    SA_DBG2(("siHDAMode_V:  Command 0 0x%08X 0x%08X 0x%08X 0x%08X 0x%08X 0x%08X 0x%08X 0x%08X\n",
2220                        ossaHwRegReadExt(agRoot, PCIBAR0, SPC_V_HDA_COMMAND_OFFSET+0),
2221                        ossaHwRegReadExt(agRoot, PCIBAR0, SPC_V_HDA_COMMAND_OFFSET+4),
2222                        ossaHwRegReadExt(agRoot, PCIBAR0, SPC_V_HDA_COMMAND_OFFSET+8),
2223                        ossaHwRegReadExt(agRoot, PCIBAR0, SPC_V_HDA_COMMAND_OFFSET+12),
2224                        ossaHwRegReadExt(agRoot, PCIBAR0, SPC_V_HDA_COMMAND_OFFSET+16),
2225                        ossaHwRegReadExt(agRoot, PCIBAR0, SPC_V_HDA_COMMAND_OFFSET+20),
2226                        ossaHwRegReadExt(agRoot, PCIBAR0, SPC_V_HDA_COMMAND_OFFSET+24),
2227                        ossaHwRegReadExt(agRoot, PCIBAR0, SPC_V_HDA_COMMAND_OFFSET+28) ));
2228
2229    SA_DBG2(("siHDAMode_V: command %X\n",hdacmd.C_PA_SEQ_ID_CMD_CODE ));
2230
2231    SA_DBG2(("siHDAMode_V:4SCRATCH_PAD0 value = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR0, V_Scratchpad_0_Register)));
2232    SA_DBG2(("siHDAMode_V: SCRATCH_PAD1 value = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR0, V_Scratchpad_1_Register)));
2233    SA_DBG2(("siHDAMode_V: SCRATCH_PAD2 value = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR0, V_Scratchpad_2_Register)));
2234    SA_DBG2(("siHDAMode_V: SCRATCH_PAD3 value = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR0, V_Scratchpad_3_Register)));
2235  } // End Step 4
2236  if(HDA_STEP_5)
2237  {
2238    SA_DBG1(("siHDAMode_V:                                             start wait            STEP 5\n"));
2239
2240    /*
2241      Step 5
2242      The host continues polling for the HDA-ILA status via MEMBASE-I. The polling timeout should
2243      be no more than 1 second. The response status HDAR_EXEC indicates a good response from the
2244      boot ROM. Response states that indicate a failure are:
2245      HDAR_BAD_CMD
2246      HDAR_BAD_IMG
2247    */
2248
2249    max_wait_time = (2000 * 1000); /* wait 2 seconds */
2250    max_wait_count = MAKE_MODULO(max_wait_time,WAIT_INCREMENT) - WAIT_INCREMENT;
2251    hda_command_complete = 0;
2252    hda_status = (ossaHwRegReadExt(agRoot, PCIBAR0, SPC_V_HDA_RESPONSE_OFFSET+28) & SPC_V_HDAR_RSPCODE_MASK );
2253    SA_DBG1(("siHDAMode_V:SCRATCH_PAD1 = 0x%x hda_status 0x%x Begin STEP 5\n", ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_1),hda_status));
2254    hda_status = 0;
2255    do
2256    {
2257      ossaStallThread(agRoot, WAIT_INCREMENT);
2258      hda_status = (ossaHwRegReadExt(agRoot, PCIBAR0, SPC_V_HDA_RESPONSE_OFFSET+28) & SPC_V_HDAR_RSPCODE_MASK );
2259      hda_command_complete = ((ossaHwRegReadExt(agRoot, PCIBAR0, SPC_V_HDA_RESPONSE_OFFSET+28) & SPC_V_HDAR_SEQID_MASK ) >> SHIFT16) == seq_id;
2260    } while (hda_status != SPC_V_HDAR_EXEC && (max_wait_count -= WAIT_INCREMENT));
2261
2262    SA_DBG1(("siHDAMode_V:SCRATCH_PAD1 = 0x%x hda_status 0x%x hda_command_complete 0x%x STEP 5 wait for seq_id took %d\n",
2263               ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_1),
2264               hda_status,
2265               hda_command_complete,
2266               (max_wait_time -  max_wait_count)));
2267
2268    smTrace(hpDBG_VERY_LOUD,"2Z",(max_wait_time -  max_wait_count) );
2269    /* TP:2Z STEP 5 took */
2270
2271    if(! hda_command_complete)
2272    {
2273        SA_DBG1(("siHDAMode_V: Response 0 0x%08X 0x%08X 0x%08X 0x%08X 0x%08X 0x%08X 0x%08X 0x%08X\n",
2274                            ossaHwRegReadExt(agRoot, PCIBAR0, SPC_V_HDA_RESPONSE_OFFSET+0),
2275                            ossaHwRegReadExt(agRoot, PCIBAR0, SPC_V_HDA_RESPONSE_OFFSET+4),
2276                            ossaHwRegReadExt(agRoot, PCIBAR0, SPC_V_HDA_RESPONSE_OFFSET+8),
2277                            ossaHwRegReadExt(agRoot, PCIBAR0, SPC_V_HDA_RESPONSE_OFFSET+12),
2278                            ossaHwRegReadExt(agRoot, PCIBAR0, SPC_V_HDA_RESPONSE_OFFSET+16),
2279                            ossaHwRegReadExt(agRoot, PCIBAR0, SPC_V_HDA_RESPONSE_OFFSET+20),
2280                            ossaHwRegReadExt(agRoot, PCIBAR0, SPC_V_HDA_RESPONSE_OFFSET+24),
2281                            ossaHwRegReadExt(agRoot, PCIBAR0, SPC_V_HDA_RESPONSE_OFFSET+28) ));
2282
2283      SA_DBG1(("siHDAMode_V:5SCRATCH_PAD0 value = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR0, V_Scratchpad_0_Register)));
2284      SA_DBG1(("siHDAMode_V: SCRATCH_PAD1 value = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR0, V_Scratchpad_1_Register)));
2285      SA_DBG1(("siHDAMode_V: SCRATCH_PAD2 value = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR0, V_Scratchpad_2_Register)));
2286      SA_DBG1(("siHDAMode_V: SCRATCH_PAD3 value = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR0, V_Scratchpad_3_Register)));
2287      SA_DBG1(("siHDAMode_V:hda_command_complete failed Step 5\n" ));
2288      smTraceFuncExit(hpDBG_VERY_LOUD, 'g', "2W");
2289      return returnVal;
2290    }
2291
2292    if (hda_status != SPC_V_HDAR_EXEC)
2293    {
2294      SA_DBG1(("siHDAMode_V:ILA_EXEC_ERROR hda_status %X hda_command_complete %d\n",hda_status ,hda_command_complete));
2295      smTraceFuncExit(hpDBG_VERY_LOUD, 'h', "2W");
2296      goto bootrom_err;
2297    }
2298    SA_DBG1(("siHDAMode_V:           end    seq_id updated                                   STEP 5\n"));
2299  } // End Step 5
2300
2301  if(HDA_STEP_6)
2302  {
2303    SA_DBG1(("siHDAMode_V:  start                                                            STEP 6\n"));
2304
2305    /*
2306      Step 6
2307      The host polls the upper 8 bits [31:24] 5 of the Scratchpad 0 Register
2308      (page 609) for the ILAHDA_RAAE_IMG_GET (0x11) state. Polling timeout
2309      should be no more than 2 seconds. If a polling timeout occurs, the host
2310      should check for a fatal error as described in Section 12.2.
2311      If successful, the Host Scratchpad 4 Register (page 620) and Host
2312      Scratchpad 5 Register (page 621) are set as follows: Host Scratchpad 4
2313      Register (page 620) holds the lower 32-bit host address of
2314      the RAAE image. Host Scratchpad 5 Register (page 621)
2315      holds the upper 32-bit host address of the RAAE image.
2316      Then the host writes the command ILAHDAC_RAAE_IMG_DONE(0x81) to the upper
2317      8 bits [31:24] of the Host Scratchpad 3 Register (page 619) and writes the
2318      sizeof the RAAE image to the lower 24 bits [23:0].
2319    */
2320
2321    max_wait_time = (2000 * 1000); /* wait 2 seconds */
2322    max_wait_count = MAKE_MODULO(max_wait_time,WAIT_INCREMENT) - WAIT_INCREMENT;
2323    hda_command_complete = 0;
2324    do
2325    {
2326      ossaStallThread(agRoot, WAIT_INCREMENT);
2327      hda_command_complete = ((ossaHwRegReadExt(agRoot, PCIBAR0,V_Scratchpad_0_Register) & 0xff000000 ) >> SHIFT24 ) == ILAHDA_RAAE_IMG_GET;
2328    } while (!hda_command_complete && (max_wait_count -= WAIT_INCREMENT));
2329
2330    SA_DBG1(("siHDAMode_V:SCRATCH_PAD0 = 0x%x STEP 6 wait for ILAHDA_RAAE_IMG_GET took %d\n", ossaHwRegReadExt(agRoot, PCIBAR0, V_Scratchpad_0_Register),(max_wait_time -  max_wait_count)));
2331    smTrace(hpDBG_VERY_LOUD,"2b",(max_wait_time -  max_wait_count) );
2332    /* TP:2b STEP 6 took */
2333    if(! hda_command_complete)
2334    {
2335      SA_DBG1(("siHDAMode_V:hda_command_complete failed Step 6\n" ));
2336      smTraceFuncExit(hpDBG_VERY_LOUD, 'i', "2W");
2337      goto fw_err;
2338    }
2339
2340    si_memset(pbase, 0, biggest);
2341
2342    if( userFwImg->aap1Len < biggest)
2343    {
2344      si_memcpy(pbase,userFwImg->aap1Img, userFwImg->aap1Len );
2345    }
2346    else
2347    {
2348      SA_DBG1(("siHDAMode_V:  userFwImg->aap1Len 0x%x < biggest 0x%x\n",userFwImg->aap1Len,biggest));
2349    }
2350    /*
2351    */
2352    /* upper */
2353    ossaHwRegWrite(agRoot, MSGU_HOST_SCRATCH_PAD_5, base_Hi );
2354    SA_DBG3(("siHDAMode_V: MSGU_HOST_SCRATCH_PAD_5 0x%X\n", base_Hi));
2355    /* lower */
2356    ossaHwRegWrite(agRoot, MSGU_HOST_SCRATCH_PAD_4, base_Lo );
2357    SA_DBG3(("siHDAMode_V: MSGU_HOST_SCRATCH_PAD_4 0x%X\n",base_Lo));
2358    /* len */
2359    ossaHwRegWriteExt(agRoot, PCIBAR0,MSGU_HOST_SCRATCH_PAD_3 ,(ILAHDAC_RAAE_IMG_DONE << SHIFT24) | userFwImg->aap1Len );
2360    SA_DBG1(("siHDAMode_V: write ILAHDAC_RAAE_IMG_DONE to MSGU_HOST_SCRATCH_PAD_3 0x%X\n",(ILAHDAC_RAAE_IMG_DONE << SHIFT24) | userFwImg->aap1Len));
2361    //    ossaHwRegWriteExt(agRoot, PCIBAR0,MSGU_HOST_SCRATCH_PAD_4 , userFwImg->DmaBase_l);
2362
2363    ossaStallThread(agRoot, gWaitmSec * 1000);
2364    if(1) /* step in question */
2365    {
2366      max_wait_time = (2000 * 1000); /* wait 2 seconds */
2367      max_wait_count = MAKE_MODULO(max_wait_time,WAIT_INCREMENT) - WAIT_INCREMENT;
2368      hda_command_complete = 0;
2369      do
2370      {
2371        ossaStallThread(agRoot, WAIT_INCREMENT);
2372        hda_command_complete = ((ossaHwRegReadExt(agRoot, PCIBAR0,V_Scratchpad_0_Register) & 0xff000000 ) >> SHIFT24 ) == ILAHDA_IOP_IMG_GET;
2373      } while (!hda_command_complete && (max_wait_count -= WAIT_INCREMENT));
2374
2375      SA_DBG1(("siHDAMode_V:SCRATCH_PAD1 = 0x%x STEP 7 wait for ILAHDA_IOP_IMG_GET took %d\n", ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_1),(max_wait_time -  max_wait_count)));
2376      smTrace(hpDBG_VERY_LOUD,"2c",(max_wait_time -  max_wait_count) );
2377      /* TP:2c STEP 6a ILAHDA_IOP_IMG_GET took */
2378      smTrace(hpDBG_VERY_LOUD,"2y",hda_command_complete );
2379      /* TP:2y hda_command_complete */
2380
2381      if(! hda_command_complete)
2382      {
2383        SA_DBG1(("siHDAMode_V:hda_command_complete failed Step 7\n" ));
2384        smTraceFuncExit(hpDBG_VERY_LOUD, 'j', "2W");
2385        goto fw_err;
2386      }
2387    }
2388    SA_DBG1(("siHDAMode_V:  End                  V_Scratchpad_0_Register 0x%08X          STEP 6\n",ossaHwRegReadExt(agRoot, PCIBAR0,V_Scratchpad_0_Register)));
2389  }
2390
2391  if(HDA_STEP_7)
2392  {
2393    SA_DBG1(("siHDAMode_V:                                                                   STEP 7\n"));
2394    /*
2395      Step 7
2396      The host polls (reads) the upper 8 bits 7 [31:24] of the Scratchpad 0 Register (page 609)
2397      for ILAHDA_IOP_IMG_GET (0x10) state. The polling timeout should be no more than 2 seconds.
2398      If a polling timeout occurs, the host should check for a fatal error as described in
2399      Section 12.2. If successful, the Host Scratchpad 4 Register (page 620) and Host
2400      Scratchpad 5 Register (page 621) are set as follows:
2401      Host Scratchpad 4 Register (page 620) holds the lower host address of the IOP image.
2402      Host Scratchpad 5 Register (page 621) holds the upper host address of the IOP image.
2403      Then host writes the command ILAHDAC_IOP_IMG_DONE(0x80) to the upper 8 bits [31:24] of the
2404      Host Scratchpad 3 Register  (page 614)and writes the sizeof the IOP image to the lower 24
2405      bits [23:0].
2406
2407    */
2408
2409    si_memset(pbase, 0, biggest);
2410
2411    if( userFwImg->iopLen < biggest)
2412    {
2413      si_memcpy(pbase,userFwImg->iopImg, userFwImg->iopLen );
2414    }
2415    else
2416    {
2417      SA_DBG1(("siHDAMode_V:  userFwImg->iopImg 0x%x < biggest 0x%x\n",userFwImg->iopLen,biggest));
2418    }
2419
2420    /* upper */
2421    ossaHwRegWrite(agRoot, MSGU_HOST_SCRATCH_PAD_5, base_Hi );
2422    SA_DBG3(("siHDAMode_V: MSGU_HOST_SCRATCH_PAD_5 0x%X\n", base_Hi));
2423    /* lower */
2424    ossaHwRegWrite(agRoot, MSGU_HOST_SCRATCH_PAD_4, base_Lo );
2425    SA_DBG3(("siHDAMode_V: MSGU_HOST_SCRATCH_PAD_4 0x%X\n",base_Lo));
2426    SA_DBG2(("siHDAMode_V: MSGU_HOST_SCRATCH_PAD_4\n"));
2427    /* len */
2428    ossaHwRegWriteExt(agRoot, PCIBAR0,MSGU_HOST_SCRATCH_PAD_3 ,(ILAHDAC_IOP_IMG_DONE << SHIFT24) | userFwImg->iopLen );
2429    SA_DBG2(("siHDAMode_V: MSGU_HOST_SCRATCH_PAD_3 0x%X\n",(ILAHDAC_IOP_IMG_DONE << SHIFT24) | userFwImg->iopLen));
2430
2431
2432    if(saRoot->swConfig.hostDirectAccessMode & 2 )
2433    {
2434  /* Hda AES DIF offload */
2435    ossaHwRegWrite(agRoot, V_Scratchpad_Rsvd_0_Register, HDA_AES_DIF_FUNC);
2436    SA_DBG1(("siHDAMode_V: V_Scratchpad_Rsvd_0_Register, HDA_AES_DIF_FUNC 0x%X\n",HDA_AES_DIF_FUNC));
2437  /* Hda AES DIF offload */
2438    }
2439
2440    SA_DBG2(("siHDAMode_V: SCRATCH_PAD0 value = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR0, V_Scratchpad_0_Register)));
2441    SA_DBG2(("siHDAMode_V: SCRATCH_PAD1 value = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR0, V_Scratchpad_1_Register)));
2442
2443
2444    max_wait_time = (2000 * 1000); /* wait 2 seconds */
2445    max_wait_count = MAKE_MODULO(max_wait_time,WAIT_INCREMENT) - WAIT_INCREMENT;
2446    hda_command_complete = 0;
2447    do
2448    {
2449      ossaStallThread(agRoot, WAIT_INCREMENT);
2450      hda_command_complete = ((ossaHwRegReadExt(agRoot, PCIBAR0,V_Scratchpad_0_Register) & 0xff000000 ) >> SHIFT24 ) == ILAHDA_IOP_IMG_GET;
2451    } while (!hda_command_complete && (max_wait_count -= WAIT_INCREMENT));
2452
2453    smTrace(hpDBG_VERY_LOUD,"2d",(max_wait_time -  max_wait_count) );
2454    /* TP:2d STEP 7 ILAHDA_IOP_IMG_GET took */
2455    smTrace(hpDBG_VERY_LOUD,"2z",hda_command_complete );
2456    /* TP:2z hda_command_complete */
2457
2458    SA_DBG2(("siHDAMode_V:SCRATCH_PAD0 = 0x%x STEP 7 wait for ILAHDA_IOP_IMG_GET took %d\n", ossaHwRegReadExt(agRoot, PCIBAR0, V_Scratchpad_0_Register),(max_wait_time -  max_wait_count)));
2459
2460    if(! hda_command_complete)
2461    {
2462      SA_DBG1(("siHDAMode_V:7SCRATCH_PAD0 value = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR0, V_Scratchpad_0_Register)));
2463      SA_DBG1(("siHDAMode_V: SCRATCH_PAD1 value = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR0, V_Scratchpad_1_Register)));
2464      SA_DBG1(("siHDAMode_V: SCRATCH_PAD2 value = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR0, V_Scratchpad_2_Register)));
2465      SA_DBG1(("siHDAMode_V: SCRATCH_PAD3 value = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR0, V_Scratchpad_3_Register)));
2466      SA_DBG1(("siHDAMode_V:hda_command_complete failed Step 7\n" ));
2467      smTraceFuncExit(hpDBG_VERY_LOUD, 'k', "2W");
2468      return returnVal;
2469    }
2470
2471
2472    SA_DBG2(("siHDAMode_V:7SCRATCH_PAD0 value = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR0, V_Scratchpad_0_Register)));
2473    SA_DBG2(("siHDAMode_V: SCRATCH_PAD1 value = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR0, V_Scratchpad_1_Register)));
2474    SA_DBG2(("siHDAMode_V: SCRATCH_PAD2 value = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR0, V_Scratchpad_2_Register)));
2475    SA_DBG2(("siHDAMode_V: SCRATCH_PAD3 value = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR0, V_Scratchpad_3_Register)));
2476    SA_DBG1(("siHDAMode_V:  End                    STEP 7\n"));
2477  }
2478
2479
2480  if(HDA_STEP_8)
2481  {
2482    bit32  SCRATCH_PAD1;
2483
2484    SA_DBG1(("siHDAMode_V:     Check fw ready                                                Step 8\n"));
2485
2486    /*
2487    Step 8
2488    IOP0/1 start-up sequence. The host polls the Scratchpad 1 Register (page 610)
2489    bits [1:0] for RAAE_STATE, bits [13:12] for IOP1_STATE, and
2490    bits [11:10] for IOP0_STATE to go to 11b (Ready state).
2491    The polling timeout should be no more than 1 second. If a polling timeout occurs,
2492    the host should check for a fatal error in Section 12.2.
2493    */
2494
2495    returnVal = AGSA_RC_SUCCESS;
2496
2497    max_wait_time = (1000 * 1000); /* wait 1000 milliseconds */
2498    max_wait_count = MAKE_MODULO(max_wait_time,WAIT_INCREMENT) - WAIT_INCREMENT;
2499    do
2500    {
2501      ossaStallThread(agRoot, WAIT_INCREMENT);
2502      SCRATCH_PAD1 = ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_1);
2503    } while ((SCRATCH_PAD1  == 0xFFFFFFFF  ) && (max_wait_count -= WAIT_INCREMENT));
2504    smTrace(hpDBG_VERY_LOUD,"HZ",(max_wait_time -  max_wait_count) );
2505    /* TP:2f Step 8 PCI took */
2506
2507    SA_DBG1(("siHDAMode_V:SCRATCH_PAD1 = 0x%x (0x%x) Step 8 PCIe took %d\n", SCRATCH_PAD1,ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_1),(max_wait_time -  max_wait_count)));
2508    /* ILA */
2509    max_wait_time = (1000 * 1000); /* wait 1000 milliseconds */
2510    max_wait_count = MAKE_MODULO(max_wait_time,WAIT_INCREMENT) - WAIT_INCREMENT;
2511    do
2512    {
2513      ossaStallThread(agRoot, WAIT_INCREMENT);
2514      SCRATCH_PAD1 = ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_1);
2515    } while (((SCRATCH_PAD1 & SCRATCH_PAD1_V_ILA_MASK) != SCRATCH_PAD1_V_ILA_MASK) && (max_wait_count -= WAIT_INCREMENT));
2516
2517    smTrace(hpDBG_VERY_LOUD,"2g",(max_wait_time -  max_wait_count) );
2518    /* TP:2g Step 8 ILA took */
2519
2520    SA_DBG2(("siHDAMode_V:SCRATCH_PAD1 = 0x%x SCRATCH_PAD1_V_ILA_MASK (0x%x)(0x%x) took %d\n", SCRATCH_PAD1,SCRATCH_PAD1_V_ILA_MASK,ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_1),(max_wait_time -  max_wait_count)));
2521
2522    if (!max_wait_count)
2523    {
2524      // Ignore for now returnVal = AGSA_RC_FAILURE;
2525      SA_DBG1(("siHDAMode_V:Timeout SCRATCH_PAD1_V_ILA_MASK (0x%x)  not set SCRATCH_PAD1 = 0x%x\n",SCRATCH_PAD1_V_ILA_MASK, SCRATCH_PAD1));
2526    }
2527
2528    SA_DBG1(("siHDAMode_V:SCRATCH_PAD1 = 0x%x SCRATCH_PAD1_V_ILA_MASK (0x%x)(0x%x) took %d\n", SCRATCH_PAD1,SCRATCH_PAD1_V_ILA_MASK,ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_1),(max_wait_time -  max_wait_count)));
2529
2530    /* RAAE */
2531    max_wait_time = (1800 * 1000); /* wait 1800 milliseconds */
2532    max_wait_count = MAKE_MODULO(max_wait_time,WAIT_INCREMENT) - WAIT_INCREMENT;
2533    do
2534    {
2535      ossaStallThread(agRoot, WAIT_INCREMENT);
2536      SCRATCH_PAD1 = ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_1);
2537    } while (((SCRATCH_PAD1 & SCRATCH_PAD1_V_RAAE_MASK) != SCRATCH_PAD1_V_RAAE_MASK) && (max_wait_count -= WAIT_INCREMENT));
2538
2539    SA_DBG1(("siHDAMode_V:SCRATCH_PAD1 = 0x%x SCRATCH_PAD1_V_RAAE_MASK (0x%x)(0x%x) took %d\n", SCRATCH_PAD1,SCRATCH_PAD1_V_RAAE_MASK,ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_1),(max_wait_time -  max_wait_count)));
2540    smTrace(hpDBG_VERY_LOUD,"2h",(max_wait_time -  max_wait_count) );
2541    /* TP:2h Step 8 RAAE took */
2542
2543    if (!max_wait_count)
2544    {
2545      SA_DBG1(("siHDAMode_V:Timeout SCRATCH_PAD1_V_RAAE_MASK (0x%x) not set SCRATCH_PAD1 = 0x%x\n",SCRATCH_PAD1_V_RAAE_MASK, SCRATCH_PAD1));
2546
2547    }
2548    /* IOP0 */
2549    max_wait_time = (600 * 1000); /* wait 600 milliseconds */
2550    max_wait_count = MAKE_MODULO(max_wait_time,WAIT_INCREMENT) - WAIT_INCREMENT;
2551    do
2552    {
2553      ossaStallThread(agRoot, WAIT_INCREMENT);
2554      SCRATCH_PAD1 = ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_1);
2555    } while (((SCRATCH_PAD1 & SCRATCH_PAD1_V_IOP0_MASK) != SCRATCH_PAD1_V_IOP0_MASK) && (max_wait_count -= WAIT_INCREMENT));
2556
2557    SA_DBG1(("siHDAMode_V:SCRATCH_PAD1 = 0x%x  SCRATCH_PAD1_V_IOP0_MASK(0x%x)(0x%x) took %d\n", SCRATCH_PAD1,SCRATCH_PAD1_V_IOP0_MASK,ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_1),(max_wait_time -  max_wait_count)));
2558    smTrace(hpDBG_VERY_LOUD,"2i",(max_wait_time -  max_wait_count) );
2559    /* TP:2i Step 8 IOP took */
2560
2561    if (!max_wait_count)
2562    {
2563      returnVal = AGSA_RC_FAILURE;
2564      SA_DBG1(("siHDAMode_V:Timeout SCRATCH_PAD1_V_IOP0_MASK (0x%x) not set SCRATCH_PAD1 = 0x%x\n",SCRATCH_PAD1_V_IOP0_MASK ,SCRATCH_PAD1));
2565
2566    }
2567
2568
2569  SA_DBG1(("siHDAMode_V: Step 8 0x%X ERROR_STATE 0x%X\n",ossaHwRegReadExt(agRoot,PCIBAR0 ,V_SoftResetRegister ),
2570  SCRATCH_PAD1_V_ERROR_STATE( ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_1) ) ));
2571  if (SCRATCH_PAD1_V_ERROR_STATE( ossaHwRegReadExt(agRoot, PCIBAR0, MSGU_SCRATCH_PAD_1) ))
2572  {
2573      if(smIS_ENCRYPT(agRoot))
2574      {
2575        SA_DBG1(("siHDAMode_V: Encryption and HDA mode not supported - failed Step 8\n" ));
2576      }
2577      else
2578      {
2579         SA_DBG1(("siHDAMode_V: ERROR_STATE failed Step 8\n" ));
2580      }
2581      returnVal = AGSA_RC_FAILURE;
2582      smTraceFuncExit(hpDBG_VERY_LOUD, 'l', "2W");
2583      goto fw_err;
2584  }
2585
2586  }
2587  SA_DBG1(("siHDAMode_V:                      returnVal  0x%X                               Step 8\n",returnVal));
2588/*
2589Step 10
2590The host continues with the normal SPCv Configuration Table initialization sequence
2591as described in Section 6.2.8.1.
2592*/
2593  if(saRoot->swConfig.hostDirectAccessMode & 2 )
2594  {
2595    /* Hda AES DIF offload */
2596    SA_DBG1(("siHDAMode_V: AES/DIF 0x%08X offload enabled %s\n",ossaHwRegRead(agRoot, MSGU_SCRATCH_PAD_3 ),
2597                           ((ossaHwRegRead(agRoot, MSGU_SCRATCH_PAD_3 ) & (1 << SHIFT15)) ? "yes" :"no") ));
2598    /* Hda AES DIF offload */
2599    /* ossaHwRegWrite(agRoot, V_Scratchpad_Rsvd_0_Register, 0); */
2600    /* Hda AES DIF offload */
2601  }
2602
2603  smTraceFuncExit(hpDBG_VERY_LOUD, 'm', "2W");
2604  return returnVal;
2605
2606bootrom_err:
2607  SA_DBG2(("siHDAMode_V: Response 0 0x%08X 0x%08X 0x%08X 0x%08X 0x%08X 0x%08X 0x%08X 0x%08X\n",
2608      ossaHwRegReadExt(agRoot, PCIBAR0, SPC_V_HDA_RESPONSE_OFFSET+0),
2609      ossaHwRegReadExt(agRoot, PCIBAR0, SPC_V_HDA_RESPONSE_OFFSET+4),
2610      ossaHwRegReadExt(agRoot, PCIBAR0, SPC_V_HDA_RESPONSE_OFFSET+8),
2611      ossaHwRegReadExt(agRoot, PCIBAR0, SPC_V_HDA_RESPONSE_OFFSET+12),
2612      ossaHwRegReadExt(agRoot, PCIBAR0, SPC_V_HDA_RESPONSE_OFFSET+16),
2613      ossaHwRegReadExt(agRoot, PCIBAR0, SPC_V_HDA_RESPONSE_OFFSET+20),
2614      ossaHwRegReadExt(agRoot, PCIBAR0, SPC_V_HDA_RESPONSE_OFFSET+24),
2615      ossaHwRegReadExt(agRoot, PCIBAR0, SPC_V_HDA_RESPONSE_OFFSET+28) ));
2616
2617fw_err:
2618  SA_DBG2(("siHDAMode_V: SCRATCH_PAD0 value = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR0, V_Scratchpad_0_Register)));
2619  SA_DBG2(("siHDAMode_V: SCRATCH_PAD1 value = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR0, V_Scratchpad_1_Register)));
2620  SA_DBG2(("siHDAMode_V: SCRATCH_PAD2 value = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR0, V_Scratchpad_2_Register)));
2621  SA_DBG2(("siHDAMode_V: SCRATCH_PAD3 value = 0x%x\n", ossaHwRegReadExt(agRoot, PCIBAR0, V_Scratchpad_3_Register)));
2622  return returnVal;
2623}
2624
2625#endif /* SA_ENABLE_HDA_FUNCTIONS */
2626
2627
2628
2629
2630/******************************************************************************/
2631/*! \brief Function to check FW is ready for soft reset
2632 *
2633 *  The siSpcSoftResetRDYChk() function is called to check status of FW
2634 *
2635 *  \param agRoot handles for this instance of SAS/SATA hardware
2636 *
2637 *  \return success or fail
2638 */
2639/*******************************************************************************/
2640LOCAL bit32 siSpcSoftResetRDYChk(agsaRoot_t *agRoot)
2641{
2642  bit32 regVal;
2643  bit32 Scratchpad1;
2644  bit32 Scratchpad2;
2645  bit32 spad2notready = 0;
2646#if defined(SALLSDK_DEBUG)
2647  bit32 regVal1;
2648  bit32 regVal2;
2649#endif /* SALLSDK_DEBUG */
2650
2651  /* read the scratch pad 2 register bit 2 */
2652  regVal = ossaHwRegRead(agRoot, MSGU_SCRATCH_PAD_2) & SCRATCH_PAD2_FWRDY_RST;
2653  Scratchpad1 =  ossaHwRegRead(agRoot, MSGU_SCRATCH_PAD_1);
2654  if (regVal == SCRATCH_PAD2_FWRDY_RST)
2655  {
2656      /* FW assert happened, it is ready for soft reset */
2657      /* Do nothing */
2658  }
2659  else
2660  {
2661    /* read bootloader response state */
2662    regVal = ossaHwRegReadExt(agRoot, PCIBAR3, HDA_RSP_OFFSET1MB+HDA_CMD_CODE_OFFSET) & HDA_STATUS_BITS;
2663    if (regVal == BOOTTLOADERHDA_IDLE)
2664    {
2665     /* For customers wants to do soft reset even the chip is already in HDA mode */
2666     /* Do not need to trigger RB6 twice */
2667     ;
2668    }
2669    else
2670    {
2671      /* Trigger NMI twice via RB6 */
2672      if (AGSA_RC_FAILURE == siBar4Shift(agRoot, RB6_ACCESS_REG))
2673      {
2674        SA_DBG1(("siSpcSoftReset:Shift Bar4 to 0x%x failed\n", RB6_ACCESS_REG));
2675        return AGSA_RC_FAILURE;
2676      }
2677
2678      if(Scratchpad1  != (SCRATCH_PAD1_FW_INIT_ERR | SCRATCH_PAD1_AAP_ERROR_STATE))
2679      {
2680        ossaHwRegWriteExt(agRoot, PCIBAR2, SPC_RB6_OFFSET , RB6_MAGIC_NUMBER_RST);
2681
2682        ossaHwRegWriteExt(agRoot, PCIBAR2, SPC_RB6_OFFSET , RB6_MAGIC_NUMBER_RST);
2683      }
2684      else
2685      {
2686        SA_DBG1(("siSoftReset: ILA load fail SKIP RB6 access 0x%x\n",Scratchpad1 ));
2687      }
2688      SPAD2_NOT_READY:
2689      /* wait for 100 ms */
2690      ossaStallThread(agRoot, ONE_HUNDRED_MILLISECS  );
2691      Scratchpad2 = ossaHwRegRead(agRoot, MSGU_SCRATCH_PAD_2);
2692      regVal = Scratchpad2 & SCRATCH_PAD2_FWRDY_RST;
2693      if (regVal != SCRATCH_PAD2_FWRDY_RST)
2694      {
2695        if (spad2notready > WAIT_SECONDS(12) / ONE_HUNDRED_MILLISECS ) /**/
2696        {
2697#if defined(SALLSDK_DEBUG)
2698          regVal1 = ossaHwRegRead(agRoot, MSGU_SCRATCH_PAD_1);
2699          regVal2 = ossaHwRegRead(agRoot, MSGU_SCRATCH_PAD_2);
2700          SA_DBG1(("siSpcSoftResetRDYChk: TIMEOUT:MSGU_SCRATCH_PAD1=0x%x, MSGU_SCRATCH_PAD2=0x%x\n", regVal1, regVal2));
2701          SA_DBG1(("siSpcSoftResetRDYChk: SCRATCH_PAD0 value = 0x%x\n", ossaHwRegRead(agRoot, MSGU_SCRATCH_PAD_0)));
2702          SA_DBG1(("siSpcSoftResetRDYChk: SCRATCH_PAD3 value = 0x%x\n", ossaHwRegRead(agRoot, MSGU_SCRATCH_PAD_3)));
2703#endif /* SALLSDK_DEBUG */
2704          return AGSA_RC_SUCCESS; /* Timeout Ok reset anyway */
2705        }
2706
2707        spad2notready++;
2708        goto SPAD2_NOT_READY;
2709      }
2710    }
2711  }
2712
2713  return AGSA_RC_SUCCESS;
2714}
2715
2716
2717agsaBarOffset_t SPCTable[] =
2718{
2719
2720  { GEN_MSGU_IBDB_SET,                 PCIBAR0, MSGU_IBDB_SET,                   SIZE_DW }, /* 0x00  */
2721  { GEN_MSGU_ODR,                      PCIBAR0, MSGU_ODR,                        SIZE_DW }, /* 0x01  */
2722  { GEN_MSGU_ODCR,                     PCIBAR0, MSGU_ODCR,                       SIZE_DW }, /* 0x02  */
2723  { GEN_MSGU_SCRATCH_PAD_0,            PCIBAR0, MSGU_SCRATCH_PAD_0,              SIZE_DW }, /* 0x03  */
2724  { GEN_MSGU_SCRATCH_PAD_1,            PCIBAR0, MSGU_SCRATCH_PAD_1,              SIZE_DW }, /* 0x04  */
2725  { GEN_MSGU_SCRATCH_PAD_2,            PCIBAR0, MSGU_SCRATCH_PAD_2,              SIZE_DW }, /* 0x05  */
2726  { GEN_MSGU_SCRATCH_PAD_3,            PCIBAR0, MSGU_SCRATCH_PAD_3,              SIZE_DW }, /* 0x06  */
2727  { GEN_MSGU_HOST_SCRATCH_PAD_0,       PCIBAR0, MSGU_HOST_SCRATCH_PAD_0,         SIZE_DW }, /* 0x07  */
2728  { GEN_MSGU_HOST_SCRATCH_PAD_1,       PCIBAR0, MSGU_HOST_SCRATCH_PAD_1,         SIZE_DW }, /* 0x08  */
2729  { GEN_MSGU_HOST_SCRATCH_PAD_2,       PCIBAR0, MSGU_HOST_SCRATCH_PAD_2,         SIZE_DW }, /* 0x09  */
2730  { GEN_MSGU_HOST_SCRATCH_PAD_3,       PCIBAR0, MSGU_HOST_SCRATCH_PAD_3,         SIZE_DW }, /* 0x0a  */
2731  { GEN_MSGU_ODMR,                     PCIBAR0, MSGU_ODMR,                       SIZE_DW }, /* 0x0b  */
2732  { GEN_PCIE_TRIGGER,                  PCIBAR0, PCIE_TRIGGER_ON_REGISTER_READ,   SIZE_DW }, /* 0x0c  */
2733  { GEN_SPC_REG_RESET,                 PCIBAR2, SPC_REG_RESET,                   SIZE_DW }, /* 0x0d  */
2734};
2735
2736agsaBarOffset_t SPC_V_Table[] =
2737{
2738
2739  { GEN_MSGU_IBDB_SET,                 PCIBAR0, V_Inbound_Doorbell_Set_Register,       SIZE_DW }, /* 0x00  */
2740  { GEN_MSGU_ODR,                      PCIBAR0, V_Outbound_Doorbell_Set_Register,      SIZE_DW }, /* 0x01  */
2741  { GEN_MSGU_ODCR,                     PCIBAR0, V_Outbound_Doorbell_Clear_Register,    SIZE_DW }, /* 0x02  */
2742  { GEN_MSGU_SCRATCH_PAD_0,            PCIBAR0, V_Scratchpad_0_Register,               SIZE_DW }, /* 0x03  */
2743  { GEN_MSGU_SCRATCH_PAD_1,            PCIBAR0, V_Scratchpad_1_Register,               SIZE_DW }, /* 0x04  */
2744  { GEN_MSGU_SCRATCH_PAD_2,            PCIBAR0, V_Scratchpad_2_Register,               SIZE_DW }, /* 0x05  */
2745  { GEN_MSGU_SCRATCH_PAD_3,            PCIBAR0, V_Scratchpad_3_Register,               SIZE_DW }, /* 0x06  */
2746  { GEN_MSGU_HOST_SCRATCH_PAD_0,       PCIBAR0, V_Host_Scratchpad_0_Register,          SIZE_DW }, /* 0x07  */
2747  { GEN_MSGU_HOST_SCRATCH_PAD_1,       PCIBAR0, V_Host_Scratchpad_1_Register,          SIZE_DW }, /* 0x08  */
2748  { GEN_MSGU_HOST_SCRATCH_PAD_2,       PCIBAR0, V_Host_Scratchpad_2_Register,          SIZE_DW }, /* 0x09  */
2749  { GEN_MSGU_HOST_SCRATCH_PAD_3,       PCIBAR0, V_Host_Scratchpad_3_Register,          SIZE_DW }, /* 0x0a  */
2750  { GEN_MSGU_ODMR,                     PCIBAR0, V_Outbound_Doorbell_Mask_Set_Register, SIZE_DW }, /* 0x0b  */
2751  { GEN_PCIE_TRIGGER,                  PCIBAR0, PCIE_TRIGGER_ON_REGISTER_READ,         SIZE_DW }, /* 0x0c  */
2752  { GEN_SPC_REG_RESET,                 PCIBAR0, V_SoftResetRegister,                   SIZE_DW }, /* 0x0d  */
2753};
2754
2755
2756/*******************************************************************************/
2757/**
2758 *
2759 *  \brief
2760 *  \param agsaRoot         Pointer to a data structure containing both application
2761 *                          and LL layer context handles
2762 *  \param Spc_type         Device  Id of hardware
2763 *
2764 * Return:
2765 *         None
2766 */
2767/*******************************************************************************/
2768GLOBAL void siUpdateBarOffsetTable(agsaRoot_t     *agRoot,
2769                                   bit32         Spc_Type
2770 )
2771{
2772
2773  agsaLLRoot_t        *saRoot = (agsaLLRoot_t *) (agRoot->sdkData);
2774  bit32 x;
2775
2776  smTraceFuncEnter(hpDBG_VERY_LOUD,"mf");
2777
2778  smTrace(hpDBG_VERY_LOUD,"9A",Spc_Type);
2779  /* TP:9A Spc_Type */
2780
2781  if(Spc_Type == VEN_DEV_SPC)
2782  {
2783    si_memcpy(&saRoot->SpcBarOffset, SPCTable, sizeof(SPCTable));
2784    SA_DBG5(("siUpdateBarOffsetTable:sizeof(SPCTable) sizeof(agsaBarOffset_t)sizeof(SPCTable) / sizeof(agsaBarOffset_t) %X %X %X\n",
2785        (unsigned int)sizeof(SPCTable), (unsigned int)sizeof(agsaBarOffset_t),
2786        (unsigned int)(sizeof(SPCTable) / sizeof(agsaBarOffset_t))
2787      ));
2788  }
2789  else /* VEN_DEV_SPCV */
2790  {
2791    si_memcpy(&saRoot->SpcBarOffset, SPC_V_Table, sizeof(SPC_V_Table));
2792    SA_DBG5(("siUpdateBarOffsetTable:sizeof(SPC_V_Table) sizeof(agsaBarOffset_t)sizeof(SPC_V_Table) / sizeof(agsaBarOffset_t) %X %X %X\n",
2793        (unsigned int)sizeof(SPC_V_Table),
2794        (unsigned int)sizeof(agsaBarOffset_t),
2795        (unsigned int)(sizeof(SPC_V_Table) / sizeof(agsaBarOffset_t))
2796      ));
2797  }
2798
2799  for(x=0;x < sizeof(SPCTable) / sizeof(agsaBarOffset_t);x++)
2800  {
2801
2802    SA_DBG4(("%8X: %8X %8X %8X\n",saRoot->SpcBarOffset[x].Generic,
2803                                  saRoot->SpcBarOffset[x].Bar,
2804                                  saRoot->SpcBarOffset[x].Offset,
2805                                  saRoot->SpcBarOffset[x].Length
2806                                         ));
2807    if(saRoot->SpcBarOffset[x].Generic != x)
2808    {
2809      SA_DBG1(("siUpdateBarOffsetTable:  saRoot->SpcBarOffset[%x].Generic %X != %X\n",x, saRoot->SpcBarOffset[x].Generic, x));
2810    }
2811  }
2812
2813  smTraceFuncExit(hpDBG_VERY_LOUD, 'a', "mf");
2814}
2815
2816
2817
2818GLOBAL bit32 siHalRegReadExt( agsaRoot_t  *agRoot,
2819                             bit32       generic,
2820                             bit32       regOffset
2821                             )
2822{
2823
2824  agsaBarOffset_t * Table = agNULL;
2825  bit32 retVal;
2826
2827  /* sanity check */
2828  SA_ASSERT( (agNULL != agRoot), "agRoot");
2829  Table = WHATTABLE(agRoot);
2830  SA_ASSERT( (agNULL != Table), "Table");
2831
2832/*
2833  if(Table[generic].Offset != regOffset)
2834  {
2835
2836    SA_DBG1(("siHalRegReadExt: Table[%x].Offset %x != regOffset %x\n",generic,
2837                                        Table[generic].Offset,
2838                                        regOffset ));
2839  }
2840*/
2841
2842  if(Table[generic].Bar)
2843  {
2844    retVal  = ossaHwRegReadExt(agRoot,
2845                Table[generic].Bar,
2846                Table[generic].Offset);
2847  }
2848  else
2849  {
2850    retVal  = ossaHwRegRead(agRoot,
2851                Table[generic].Offset);
2852  }
2853
2854  return(retVal);
2855}
2856
2857
2858GLOBAL void siHalRegWriteExt(
2859                             agsaRoot_t  *agRoot,
2860                             bit32       generic,
2861                             bit32       regOffset,
2862                             bit32       regValue
2863                             )
2864{
2865  agsaBarOffset_t * Table = agNULL;
2866
2867  /* sanity check */
2868  SA_ASSERT( (agNULL != agRoot), "agRoot");
2869
2870  Table = WHATTABLE(agRoot);
2871  SA_ASSERT( (agNULL != Table), "Table");
2872
2873
2874/*
2875    if(Table[generic].Offset != regOffset)
2876    {
2877
2878      SA_DBG1(("siHalRegWriteExt: Table[%x].Offset %x != regOffset %x\n",generic,
2879                                          Table[generic].Offset,
2880                                          regOffset ));
2881    }
2882*/
2883
2884    SA_DBG6(("siHalRegWriteExt: Bar %x Offset %8X Wrote %8X\n",
2885                                        Table[generic].Bar,
2886                                        Table[generic].Offset,
2887                                        regValue ));
2888
2889
2890  if(Table[generic].Bar)
2891  {
2892    ossaHwRegWriteExt(agRoot,
2893              Table[generic].Bar,
2894              Table[generic].Offset,
2895              regValue  );
2896  }else
2897  {
2898    ossaHwRegWrite(agRoot,
2899            Table[generic].Offset,
2900            regValue  );
2901  }
2902}
2903
2904
2905
2906
2907GLOBAL void siPCITriger(agsaRoot_t *agRoot)
2908{
2909
2910  SA_DBG1(("siPCITriger: Read PCIe Bar zero plus 0x%x\n", PCIE_TRIGGER_ON_REGISTER_READ));
2911  ossaHwRegReadExt(agRoot,PCIBAR0 ,PCIE_TRIGGER_ON_REGISTER_READ );
2912}
2913
2914
2915GLOBAL bit32 siGetPciBar(
2916              agsaRoot_t *agRoot
2917              )
2918{
2919  bit32 MSGUCfgTblBase = 0;
2920  bit32 pcibar = 0;
2921  MSGUCfgTblBase = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_0,MSGU_SCRATCH_PAD_0);
2922  pcibar = (MSGUCfgTblBase & SCRATCH_PAD0_BAR_MASK) >> SHIFT26;
2923  /* get pci Bar index */
2924  pcibar = (bit8)mpiGetPCIBarIndex(agRoot, pcibar);
2925
2926  return(pcibar);
2927}
2928
2929GLOBAL bit32 siGetTableOffset(
2930              agsaRoot_t *agRoot,
2931              bit32  TableOffsetInTable
2932              )
2933{
2934  bit32 TableOffset;
2935  bit32 MSGUCfgTblBase;
2936  /* read scratch pad0 to get PCI BAR and offset of configuration table */
2937  MSGUCfgTblBase = siHalRegReadExt(agRoot, GEN_MSGU_SCRATCH_PAD_0,MSGU_SCRATCH_PAD_0);
2938
2939  MSGUCfgTblBase &= SCRATCH_PAD0_OFFSET_MASK;
2940
2941  TableOffset = ossaHwRegReadExt(agRoot,siGetPciBar(agRoot) ,MSGUCfgTblBase +TableOffsetInTable  );
2942  SA_DBG4(("GetTableOffset:TableOffset with size 0x%x\n", TableOffset));
2943
2944  /* Mask off size */
2945  TableOffset &= 0xFFFFFF;
2946  TableOffset +=MSGUCfgTblBase;
2947  return(TableOffset);
2948
2949}
2950
2951
2952GLOBAL void siCheckQs(
2953              agsaRoot_t *agRoot
2954              )
2955{
2956  agsaLLRoot_t        *saRoot = (agsaLLRoot_t *) (agRoot->sdkData);
2957
2958  mpiOCQueue_t         *circularOQ;
2959  mpiICQueue_t         *circularIQ;
2960  int i;
2961
2962  for ( i = 0; i < saRoot->QueueConfig.numInboundQueues; i++ )
2963  {
2964    circularIQ = &saRoot->inboundQueue[i];
2965
2966    OSSA_READ_LE_32(circularIQ->agRoot, &circularIQ->consumerIdx, circularIQ->ciPointer, 0);
2967    if(circularIQ->producerIdx != circularIQ->consumerIdx)
2968    {
2969      SA_DBG1(("siCheckQs: In  Q %d  PI 0x%03x CI 0x%03x (%d) \n",i,
2970      circularIQ->producerIdx,
2971      circularIQ->consumerIdx,
2972      (circularIQ->producerIdx > circularIQ->consumerIdx ? (circularIQ->producerIdx - circularIQ->consumerIdx) :   (circularIQ->numElements -  circularIQ->consumerIdx ) + circularIQ->producerIdx)));
2973    }
2974  }
2975
2976  for ( i = 0; i < saRoot->QueueConfig.numOutboundQueues; i++ )
2977  {
2978    circularOQ = &saRoot->outboundQueue[i];
2979    OSSA_READ_LE_32(circularOQ->agRoot, &circularOQ->producerIdx, circularOQ->piPointer, 0);
2980    if(circularOQ->producerIdx != circularOQ->consumerIdx)
2981    {
2982        SA_DBG1(("siCheckQs: Out Q %d  PI 0x%03x CI 0x%03x (%d) \n",i,
2983        circularOQ->producerIdx,
2984        circularOQ->consumerIdx,
2985        (circularOQ->producerIdx > circularOQ->consumerIdx ? (circularOQ->producerIdx - circularOQ->consumerIdx) :   (circularOQ->numElements -  circularOQ->consumerIdx ) + circularOQ->producerIdx)));
2986
2987    }
2988  }
2989
2990}
2991GLOBAL void siPciCpyMem(agsaRoot_t *agRoot,
2992                       bit32 soffset,
2993                       const void *dst,
2994                       bit32 DWcount,
2995                       bit32 busBaseNumber
2996                       )
2997{
2998  bit32 i, val,offset;
2999  bit32 *dst1;
3000
3001  dst1 = (bit32 *)dst;
3002
3003  SA_DBG1(("siPciCpyMem:copy DWcount %d from offset 0x%x to %p\n",DWcount,soffset,dst));
3004
3005  for (i= 0; i < DWcount; i+=4,dst1++)
3006  {
3007    offset = (soffset + i / 4);
3008    SA_ASSERT( (offset < (64 * 1024)), "siPciCpyMem offset too large");
3009    if(offset < (64 * 1024))
3010    {
3011      val = ossaHwRegReadExt(agRoot, busBaseNumber, offset);
3012      *dst1 =  BIT32_TO_LEBIT32(val);
3013    }
3014  }
3015
3016  return;
3017}
3018