FRU.c 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  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. #include "com_BmcType.h"
  23. #include "com_IPMI_FRU.h"
  24. #include <string.h>
  25. #include "Support.h"
  26. #include "main.h"
  27. #include <stdio.h>
  28. #if FRU_DEVICE == 1
  29. #define IPMI_FRU_FORMAT_VERSION 0x01
  30. #define CC_FRU_DATA_UNAVAILABLE 0x81
  31. #define DEV_ACCESS_MODE_IN_BYTES 0
  32. #define FRU_TYPE_OWNER_FLASH 1 //GD32 internal flash
  33. #define FRU_TYPE_EEPROM 2
  34. FRUInfo_T FRUInfo = {
  35. FRU_TYPE_OWNER_FLASH, /* FRU type NVR/EEPROM/.... */
  36. FRU_TOTAL_SIZE, /* FRU Device size */
  37. DEV_ACCESS_MODE_IN_BYTES, /* FRU device access type BYTE/WORD */
  38. 0, /* Bus number if FRU is EEPROM */
  39. 0, /* FRU device slave address if FRU is EEPROM */
  40. 0 /* FRU device type if FRU is EEPROM */
  41. };
  42. static int ReadFRUDevice (FRUInfo_T* pFRUInfo, uint16_t Offset, uint8_t Len, uint8_t* pData)
  43. {
  44. switch (pFRUInfo->Type)
  45. {
  46. case FRU_TYPE_OWNER_FLASH:
  47. memcpy(pData, (((uint8_t*)&g_BMCInfo.FRU) + Offset), Len);
  48. return Len;
  49. case FRU_TYPE_EEPROM:
  50. //return READ_EEPROM (pFRUInfo->DeviceType, pFRUInfo->BusNumber, pFRUInfo->SlaveAddr, pData,
  51. // pFRUInfo->Offset + Offset, Len);
  52. printf("Read FRU from EEPROM not implement\r\n");
  53. return 0;
  54. default:
  55. printf ("PDKFRU.c : FRU Type not supported\n");
  56. return 0;
  57. }
  58. }
  59. static int WriteFRUDevice (FRUInfo_T* pFRUInfo, uint16_t Offset, uint8_t Len, uint8_t* pData)
  60. {
  61. switch (pFRUInfo->Type)
  62. {
  63. case FRU_TYPE_OWNER_FLASH:
  64. //return API_WriteNVR (pFRUInfo->NVRFile, Offset, Len, pData);
  65. memcpy((((uint8_t*)&g_BMCInfo.FRU) + Offset), pData, Len);
  66. FlushFRUToFlash();
  67. return Len;
  68. case FRU_TYPE_EEPROM:
  69. //return WRITE_EEPROM (pFRUInfo->DeviceType, pFRUInfo->BusNumber, pFRUInfo->SlaveAddr, pData,
  70. // pFRUInfo->Offset + Offset, Len);
  71. printf("Write FRU to EEPROM not implement\r\n");
  72. return 0;
  73. default:
  74. printf ("PDKFRU.c : FRU Type not supported\n");
  75. return 0;
  76. }
  77. }
  78. /*-----------------------------------------------------
  79. * GetFRUAreaInfo
  80. *----------------------------------------------------*/
  81. int
  82. GetFRUAreaInfo ( uint8_t* pReq, uint8_t ReqLen, uint8_t* pRes)
  83. {
  84. FRUInventoryAreaInfoRes_T* pFRUAreaInfoRes = (FRUInventoryAreaInfoRes_T*) pRes;
  85. pFRUAreaInfoRes->CompletionCode = CC_NORMAL;
  86. pFRUAreaInfoRes->Size = FRUInfo.Size;
  87. pFRUAreaInfoRes->DeviceAccessMode = FRUInfo.AccessType;
  88. return sizeof(FRUInventoryAreaInfoRes_T);
  89. }
  90. /*-----------------------------------------------------
  91. * Read FRU Data
  92. *----------------------------------------------------*/
  93. int
  94. ReadFRUData ( uint8_t* pReq, uint8_t ReqLen, uint8_t* pRes)
  95. {
  96. uint16_t Offset;
  97. FRUReadReq_T* pFRUReadReq = (FRUReadReq_T*) pReq;
  98. FRUReadRes_T* pFRUReadRes = (FRUReadRes_T*) pRes;
  99. int retval = 0;
  100. Offset = pFRUReadReq->Offset;
  101. /* check if the offset is valid offset */
  102. if (Offset >= FRUInfo.Size)
  103. {
  104. pFRUReadRes->CompletionCode = CC_INV_DATA_FIELD;
  105. return sizeof(uint8_t);
  106. }
  107. /* Is CountToRead too big? */
  108. if (pFRUReadReq->CountToRead > (FRUInfo.Size - Offset))
  109. {
  110. pFRUReadRes->CompletionCode = CC_PARAM_OUT_OF_RANGE;
  111. return sizeof(uint8_t);
  112. }
  113. pFRUReadRes->CompletionCode = CC_NORMAL;
  114. /* Read the FRU date from the FRU device */
  115. retval = ReadFRUDevice (&FRUInfo, Offset,
  116. pFRUReadReq->CountToRead,
  117. (uint8_t*)(pFRUReadRes + 1));
  118. if (retval != -1)
  119. {
  120. pFRUReadRes->CountReturned = (uint8_t) retval;
  121. }
  122. else
  123. {
  124. pFRUReadRes->CompletionCode = CC_FRU_DATA_UNAVAILABLE;
  125. return sizeof(uint8_t);
  126. }
  127. // printf ("FRU Count returned %x\r\n", pFRUReadRes->CountReturned);
  128. /*Updating Response Length.*/
  129. return (pFRUReadRes->CountReturned + sizeof(FRUReadRes_T));
  130. }
  131. /*-----------------------------------------------------
  132. * Write FRU Data
  133. *----------------------------------------------------*/
  134. int
  135. WriteFRUData ( uint8_t* pReq, uint8_t ReqLen, uint8_t* pRes)
  136. {
  137. uint16_t Offset,Length;
  138. FRUWriteReq_T *pFRUWriteReq = (FRUWriteReq_T*) pReq;
  139. FRUWriteRes_T *pFRUWriteRes = (FRUWriteRes_T*) pRes;
  140. int retval = 0;
  141. /* Get the offset to write & number of bytes to write */
  142. Offset = (pFRUWriteReq->Offset);
  143. Length = ReqLen - sizeof (FRUWriteReq_T);
  144. /* check if the offset is valid offset */
  145. if (Offset >= FRUInfo.Size)
  146. {
  147. pFRUWriteRes->CompletionCode = CC_INV_DATA_FIELD;
  148. return sizeof(uint8_t);
  149. }
  150. /* Is Length too big? */
  151. if (Length > (FRUInfo.Size - Offset))
  152. {
  153. pFRUWriteRes->CompletionCode = CC_PARAM_OUT_OF_RANGE;
  154. return sizeof(uint8_t);
  155. }
  156. pFRUWriteRes->CompletionCode = CC_NORMAL;
  157. /* Wrtie the date to FRU device */
  158. retval = WriteFRUDevice (&FRUInfo, Offset, Length,
  159. (uint8_t*)(pFRUWriteReq + 1));
  160. if (retval != -1)
  161. {
  162. pFRUWriteRes->CountWritten = (uint8_t) retval;
  163. }
  164. else
  165. {
  166. pFRUWriteRes->CompletionCode = CC_FRU_DATA_UNAVAILABLE;
  167. return sizeof(uint8_t);
  168. }
  169. return sizeof(FRUWriteRes_T);
  170. }
  171. #endif /* FRU_DEVICE */