PEFTmr.c 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. /****************************************************************
  2. ****************************************************************
  3. ** **
  4. ** (C)Copyright 2005-2006, American Megatrends Inc. **
  5. ** **
  6. ** All Rights Reserved. **
  7. ** **
  8. ** 6145-F, Northbelt Parkway, Norcross, **
  9. ** **
  10. ** Georgia - 30071, USA. Phone-(770)-246-8600. **
  11. ** **
  12. ****************************************************************
  13. ****************************************************************/
  14. /*****************************************************************
  15. *
  16. * PEFPTmr.c
  17. * PEF Postpone Timer
  18. *
  19. * Author: Govind Kothandapani <govindk@ami.com>
  20. * : Rama Bisa <ramab@ami.com>
  21. * : Basavaraj Astekar <basavaraja@ami.com>
  22. * : Bakka Ravinder Reddy <bakkar@ami.com>
  23. *
  24. *****************************************************************/
  25. #define ENABLE_DEBUG_MACROS 0
  26. #include "Types.h"
  27. #include "IPMI_Main.h"
  28. #include "SharedMem.h"
  29. #include "Debug.h"
  30. #include "PEFTmr.h"
  31. #include "NVRAccess.h"
  32. #include "PEF.h"
  33. #include "Ethaddr.h"
  34. #include "IPMIConf.h"
  35. #include "SEL.h"
  36. #define ACPI_SYS_PWR_STATE_MASK 0x7F
  37. #define ARM_PEF_TEMP_DISABLE 0xFE
  38. /*** Global Variable ***/
  39. //_FAR_ PEFTmrMgr_T g_PEFTmrMgr;
  40. /**
  41. * PEFTimerTask
  42. **/
  43. void
  44. PEFTimerTask (int BMCInst)
  45. {
  46. _FAR_ PEFRecordDetailsConfig_T* pNVRPEFRecordDetailsConfig;
  47. INT8U sysPwrState;
  48. _FAR_ BMCInfo_t* pBMCInfo = &g_BMCInfo[BMCInst];
  49. pNVRPEFRecordDetailsConfig = &pBMCInfo->PEFRecordDetailsConfig;
  50. LOCK_BMC_SHARED_MEM(BMCInst);
  51. sysPwrState = BMC_GET_SHARED_MEM(BMCInst)->m_ACPISysPwrState & ACPI_SYS_PWR_STATE_MASK;
  52. UNLOCK_BMC_SHARED_MEM(BMCInst);
  53. /* Disable and reset PEF timer whenever System enters a sleep state / is powered down / is reset*/
  54. if ((sysPwrState == IPMI_ACPI_S1) || (sysPwrState == IPMI_ACPI_S2) || (sysPwrState == IPMI_ACPI_S3) ||
  55. (sysPwrState == IPMI_ACPI_S4) || (sysPwrState == IPMI_ACPI_S5) || (sysPwrState == IPMI_ACPI_S4_S5) ||
  56. (sysPwrState == IPMI_ACPI_SLEEPING_S1_S3) || (sysPwrState == IPMI_ACPI_G1_SLEPPING_S1_S4) ||
  57. (sysPwrState == IPMI_ACPI_G3))
  58. {
  59. pBMCInfo->PefConfig.PEFTmrMgr.TmrArmed = FALSE;
  60. pBMCInfo->PefConfig.PEFTmrMgr.StartTmr = FALSE;
  61. pBMCInfo->PefConfig.PEFTmrMgr.InitCountDown = 0;
  62. pBMCInfo->PefConfig.PEFTmrMgr.TmrInterval = 0;
  63. pBMCInfo->PefConfig.PEFTmrMgr.TakePEFAction = TRUE;
  64. return;
  65. }
  66. /* won't go further if PEF is temporary disabled */
  67. if (g_BMCInfo[BMCInst].PefConfig.PEFTmrMgr.TmrInterval == ARM_PEF_TEMP_DISABLE)
  68. return;
  69. if ((pNVRPEFRecordDetailsConfig->LastSELRecordID != pNVRPEFRecordDetailsConfig->LastSWProcessedEventID) &&
  70. (TRUE == pBMCInfo->PefConfig.PEFTmrMgr.TmrArmed))
  71. {
  72. pBMCInfo->PefConfig.PEFTmrMgr.StartTmr = TRUE;
  73. pBMCInfo->PefConfig.PEFTmrMgr.TakePEFAction = FALSE;
  74. IPMI_DBG_PRINT_1 ("PEFTmr Value = %X\n", g_BMCInfo[BMCInst].PefConfig.PEFTmrMgr.TmrInterval);
  75. /* check for timeout and Decrement pre timeout interval */
  76. if (0 != pBMCInfo->PefConfig.PEFTmrMgr.TmrInterval)
  77. {
  78. pBMCInfo->PefConfig.PEFTmrMgr.TmrInterval--;
  79. return;
  80. }
  81. else
  82. { /* Timeout Action */
  83. pBMCInfo->PefConfig.PEFTmrMgr.TmrArmed = FALSE;
  84. pBMCInfo->PefConfig.PEFTmrMgr.StartTmr = FALSE;
  85. pBMCInfo->PefConfig.PEFTmrMgr.TakePEFAction = TRUE;
  86. CheckLastSELRecordID (BMCInst);
  87. }
  88. }
  89. else if (pNVRPEFRecordDetailsConfig->LastSELRecordID == pNVRPEFRecordDetailsConfig->LastSWProcessedEventID)
  90. {
  91. pBMCInfo->PefConfig.PEFTmrMgr.StartTmr = FALSE; //stop timer
  92. pBMCInfo->PefConfig.PEFTmrMgr.TmrInterval = pBMCInfo->PefConfig.PEFTmrMgr.InitCountDown; //rearm timer to initial value
  93. pBMCInfo->PefConfig.PEFTmrMgr.TmrArmed = TRUE;
  94. pBMCInfo->PefConfig.PEFTmrMgr.StartTmr = TRUE; //restart timer
  95. pBMCInfo->PefConfig.PEFTmrMgr.TakePEFAction = FALSE;
  96. return ;
  97. }
  98. if (FALSE == pBMCInfo->PefConfig.PEFTmrMgr.TmrArmed)
  99. {
  100. pBMCInfo->PefConfig.PEFTmrMgr.StartTmr = FALSE;
  101. pBMCInfo->PefConfig.PEFTmrMgr.TakePEFAction = TRUE;
  102. return;
  103. }
  104. }
  105. /**
  106. * PETAckTimerTask
  107. **/
  108. void
  109. PETAckTimerTask (int BMCInst)
  110. {
  111. INT8U EthIndex;
  112. MsgPkt_T MsgPkt;
  113. PETAckTimeOutMgr_T* pPETAckMgr;
  114. INT16U i;
  115. /* lock PETAck Manager */
  116. LOCK_BMC_SHARED_MEM(BMCInst);
  117. pPETAckMgr = BMC_GET_SHARED_MEM(BMCInst) ->PETAckMgr;
  118. for (i=0; i<MAX_PET_ACK; i++)
  119. {
  120. /* Check Tmr present or not */
  121. if (FALSE == pPETAckMgr[i].Present)
  122. continue;
  123. /* Check timeout value */
  124. if (0 != pPETAckMgr[i].AckTimeOut)
  125. {
  126. pPETAckMgr[i].AckTimeOut--;
  127. continue;
  128. }
  129. /* Check retries */
  130. if (0 != pPETAckMgr[i].Retries)
  131. {
  132. MsgPkt.Param = PARAM_RETRY_ALERT;
  133. MsgPkt.Size = sizeof (SELEventRecord_T);
  134. pPETAckMgr[i].Retries--;
  135. /* We have to reinitalise the PEF tmr Ack timeout*/
  136. pPETAckMgr[i].AckTimeOut=pPETAckMgr[i].RetryInterval;
  137. }
  138. else
  139. {
  140. /* Take timeout action */
  141. pPETAckMgr[i].Present = FALSE;
  142. EthIndex= GetEthIndex(pPETAckMgr[i].Channel, BMCInst);
  143. /* Update the LanAlert Status */
  144. BMC_GET_SHARED_MEM(BMCInst)->LANAlertStatus[EthIndex] = ALERT_IMM_TIMEOUT_FAILURE;
  145. MsgPkt.Param = PARAM_PET_NO_ACK;
  146. MsgPkt.Size = sizeof (SELEventRecord_T) + sizeof(INT16U);
  147. /* Copy the sequence number to locate the deferred alert from table */
  148. *(INT16U *)(MsgPkt.Data + sizeof(SELEventRecord_T)) = pPETAckMgr[i].SequenceNum;
  149. }
  150. MsgPkt.Channel= pPETAckMgr[i].Channel ;
  151. MsgPkt.Channel |=( (pPETAckMgr[i].DestSel & 0x0F) << 4);
  152. _fmemcpy (MsgPkt.Data,(_FAR_ INT8U*)&pPETAckMgr[i].EvtRecord,sizeof (SELEventRecord_T));
  153. PostMsgNonBlock (&MsgPkt, PEF_TASK_Q,BMCInst);
  154. }
  155. UNLOCK_BMC_SHARED_MEM(BMCInst);
  156. }
  157. /**
  158. * PEFStartDlyTimerTask
  159. **/
  160. void
  161. PEFStartDlyTimerTask(int BMCInst)
  162. {
  163. INT8U sysPwrState = 0;
  164. static INT8U PresysPwrState = 0;
  165. static INT8U EnableCountStartupDly = FALSE;
  166. static INT8U EnableCountAlertStartupDly = FALSE;
  167. _FAR_ PEFConfig_T* pPEFConfig;
  168. _FAR_ BMCInfo_t* pBMCInfo = &g_BMCInfo[BMCInst];
  169. pPEFConfig = &pBMCInfo->PEFConfig;
  170. LOCK_BMC_SHARED_MEM(BMCInst);
  171. sysPwrState = BMC_GET_SHARED_MEM(BMCInst)->m_ACPISysPwrState & ACPI_SYS_PWR_STATE_MASK;
  172. UNLOCK_BMC_SHARED_MEM(BMCInst);
  173. if(((sysPwrState == IPMI_ACPI_S0) && ((PresysPwrState == IPMI_ACPI_S4)||(PresysPwrState == IPMI_ACPI_S5)))||(pBMCInfo->PefConfig.PEFTmrMgr.ResetFlag == 1))
  174. {
  175. EnableCountStartupDly = TRUE;
  176. EnableCountAlertStartupDly = TRUE;
  177. pBMCInfo->PefConfig.PEFTmrMgr.StartDlyTmr = pPEFConfig->PEFStartupDly;
  178. pBMCInfo->PefConfig.PEFTmrMgr.AlertStartDlyTmr = pPEFConfig->PEFAlertStartupDly;
  179. pBMCInfo->PefConfig.PEFTmrMgr.ResetFlag = 0;
  180. }
  181. if(EnableCountStartupDly == TRUE && pBMCInfo->PefConfig.PEFTmrMgr.StartDlyTmr > 0)
  182. {
  183. pBMCInfo->PefConfig.PEFTmrMgr.StartDlyTmr--;
  184. }
  185. if(EnableCountAlertStartupDly == TRUE && pBMCInfo->PefConfig.PEFTmrMgr.AlertStartDlyTmr > 0)
  186. {
  187. pBMCInfo->PefConfig.PEFTmrMgr.AlertStartDlyTmr--;
  188. }
  189. if( pBMCInfo->PefConfig.PEFTmrMgr.StartDlyTmr == 0 )
  190. EnableCountStartupDly = FALSE;
  191. if(pBMCInfo->PefConfig.PEFTmrMgr.AlertStartDlyTmr == 0)
  192. EnableCountAlertStartupDly = FALSE;
  193. PresysPwrState = sysPwrState;
  194. }