FRU.c 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  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. * fru.c
  17. * fru functions.
  18. *
  19. * Author: Rama Bisa <ramab@ami.com>
  20. *
  21. ******************************************************************/
  22. #define ENABLE_DEBUG_MACROS 0
  23. #include "Types.h"
  24. #include "FRU.h"
  25. #include "IPMI_FRU.h"
  26. #include "MsgHndlr.h"
  27. #include "SharedMem.h"
  28. #include "Support.h"
  29. #include "IPMIDefs.h"
  30. #include "Debug.h"
  31. #include "NVRData.h"
  32. #include "IPMDevice.h"
  33. #include "NVRAccess.h"
  34. #include "IPMI_IPM.h"
  35. //#include "IPMI_SDRRecord.h"
  36. #include "SDRFunc.h"
  37. #include "Util.h"
  38. #include "PDKAccess.h"
  39. #include "IPMIConf.h"
  40. #if FRU_DEVICE == 1
  41. //extern _FAR_ INT8U g_SelfTestByte;
  42. //extern _FAR_ INT8U g_FRUInfo[MAX_PDK_FRU_SUPPORTED];
  43. /*-----------------------------------------------------
  44. * GetFRUAreaInfo
  45. *----------------------------------------------------*/
  46. int
  47. GetFRUAreaInfo (_NEAR_ INT8U* pReq, INT8U ReqLen, _NEAR_ INT8U* pRes,_NEAR_ int BMCInst)
  48. {
  49. int Ret=0;
  50. BMCInfo_t *pBMCInfo = &g_BMCInfo[BMCInst];
  51. OS_THREAD_MUTEX_ACQUIRE(&pBMCInfo->FRUConfig.FRUMutex,WAIT_INFINITE);
  52. if(g_PDKHandle[PDK_GETFRUAREAINFO] != NULL)
  53. {
  54. Ret = ((int(*)(INT8U*,INT8U,INT8U*,int))g_PDKHandle[PDK_GETFRUAREAINFO]) (pReq, ReqLen, pRes,BMCInst);
  55. }
  56. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->FRUConfig.FRUMutex);
  57. return Ret;
  58. }
  59. /*-----------------------------------------------------
  60. * Read FRU Data
  61. *----------------------------------------------------*/
  62. int
  63. ReadFRUData (_NEAR_ INT8U* pReq, INT8U ReqLen, _NEAR_ INT8U* pRes,_NEAR_ int BMCInst)
  64. {
  65. int Ret=0;
  66. BMCInfo_t *pBMCInfo = &g_BMCInfo[BMCInst];
  67. OS_THREAD_MUTEX_ACQUIRE(&pBMCInfo->FRUConfig.FRUMutex,WAIT_INFINITE);
  68. if(g_PDKHandle[PDK_READFRUDATA] != NULL)
  69. {
  70. Ret = ((int(*)(INT8U*,INT8U,INT8U*,int))g_PDKHandle[PDK_READFRUDATA]) (pReq, ReqLen, pRes,BMCInst);
  71. }
  72. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->FRUConfig.FRUMutex);
  73. return Ret;
  74. }
  75. /*-----------------------------------------------------
  76. * Write FRU Data
  77. *----------------------------------------------------*/
  78. int
  79. WriteFRUData (_NEAR_ INT8U* pReq, INT8U ReqLen, _NEAR_ INT8U* pRes,_NEAR_ int BMCInst)
  80. {
  81. int Ret=0;
  82. BMCInfo_t *pBMCInfo = &g_BMCInfo[BMCInst];
  83. OS_THREAD_MUTEX_ACQUIRE(&pBMCInfo->FRUConfig.FRUMutex,WAIT_INFINITE);
  84. if(g_PDKHandle[PDK_WRITEFRUDATA] != NULL)
  85. {
  86. Ret = ((int(*)(INT8U*,INT8U,INT8U*,int))g_PDKHandle[PDK_WRITEFRUDATA]) (pReq, ReqLen, pRes,BMCInst);
  87. }
  88. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->FRUConfig.FRUMutex);
  89. return Ret;
  90. }
  91. /*-----------------------------------------------------
  92. * InitFRU
  93. *-----------------------------------------------------*/
  94. int
  95. InitFRU (int BMCInst)
  96. {
  97. FRUReadReq_T FRUReadReq;
  98. INT8U Frudata[64];
  99. INT8U Checksum=0;
  100. int ret=0,i,j;
  101. _FAR_ BMCInfo_t* pBMCInfo = &g_BMCInfo[BMCInst];
  102. //pBMCInfo->FRUConfig.total_frus = 1;
  103. for(i=0;pBMCInfo->FRUConfig.FRUInfo[i]!=0xff;i++)
  104. {
  105. FRUReadReq.FRUDeviceID=pBMCInfo->FRUConfig.FRUInfo[i];
  106. FRUReadReq.Offset=0x0;
  107. FRUReadReq.CountToRead=sizeof(FRUCommonHeader_T);
  108. ret=ReadFRUData(( INT8U *)&FRUReadReq,4,Frudata,BMCInst);
  109. switch(Frudata[0])
  110. {
  111. case FRU_DEVICE_NOT_FOUND :
  112. continue;
  113. case FRU_NOT_ACCESSIBLE:
  114. g_BMCInfo[BMCInst].Msghndlr.SelfTestByte |= GST_CANNOT_ACCESS_FRU;
  115. break;
  116. case FRU_ACCESSIBLE:
  117. for(j=2;j<10;j++)
  118. {
  119. Checksum+=Frudata[j];
  120. }
  121. if(0 !=Checksum )
  122. {
  123. g_BMCInfo[BMCInst].Msghndlr.SelfTestByte |= GST_FRU_CORRUPTED;
  124. break;
  125. }
  126. }
  127. }
  128. if(g_PDKHandle[PDK_INITFRU] != NULL)
  129. {
  130. ret = ((int(*)(int))g_PDKHandle[PDK_INITFRU]) (BMCInst);
  131. }
  132. return ret;
  133. }
  134. #endif /* FRU_DEVICE */