IPMDevice.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400
  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. * IPMdevice.c
  16. * IPMDevice Commands Handler
  17. *
  18. * Author: Govind Kothandapani <govindk@ami.com>
  19. * : Rama Bisa <ramab@ami.com>
  20. * : Basavaraj Astekar <basavaraja@ami.com>
  21. * : Bakka Ravinder Reddy <bakkar@ami.com>
  22. *
  23. *****************************************************************/
  24. #define ENABLE_DEBUG_MACROS 0
  25. #include "Types.h"
  26. #include "IPMDevice.h"
  27. #include "MsgHndlr.h"
  28. #include "Support.h"
  29. #include "IPMIDefs.h"
  30. #include "IPMI_IPM.h"
  31. #include "Util.h"
  32. #include "SharedMem.h"
  33. //#include <flashlib.h>
  34. #include "WDT.h"
  35. //#include "PDKAccess.h"
  36. //#include "IPMIConf.h"
  37. #include "Sensor.h"
  38. //common source for versions
  39. //#include <version.h>
  40. #if IPM_DEVICE == 1
  41. /*** Local macro definitions ***/
  42. #define ACPI_SET_SYS_PWR_STATE 0x80
  43. #define ACPI_SET_DEV_PWR_STATE 0x80
  44. #define ACPI_SYS_PWR_STATE_MASK 0x7F
  45. #define ACPI_DEV_PWR_STATE_MASK 0x7F
  46. #define ACPI_MAX_SYS_PWR_STATE 16
  47. #define ACPI_MAX_DEV_PWR_STATE 7
  48. #define ACPI_FLAG_SET 1
  49. #define ACPI_FLAG_UNSET 0
  50. /*** Global Variables ***/
  51. extern _FAR_ WDTTmrMgr_T g_WDTTmrMgr;
  52. //To get the data across the processes added in Shared memory structure in SharedMem.h
  53. //_FAR_ INT8U g_ACPISysPwrState;
  54. //_FAR_ INT8U g_ACPIDevPwrState;
  55. /*** Module Variables ***/
  56. #define WORKING_STATE 0x0
  57. #define S1_SLEEPING_STATE 0x1
  58. //notice
  59. static INT8U MfgID[] = {0x12,0x34,0x56};// /**< Contains Manufacturer ID */
  60. static INT16U g_ProdID = 0xaabb;
  61. #define FW_INFO_FILE "/proc/ractrends/Helper/FwInfo"
  62. static void GetFirmwareVersion(unsigned int* Major,unsigned int* Minor,unsigned int* Rev)
  63. {
  64. // char aline[82];
  65. // int AuxVer;
  66. // int i = 0, count = 0;
  67. //
  68. // FILE* fp = fopen(FW_INFO_FILE,"rb");
  69. // if(fp == NULL)
  70. // {
  71. // IPMI_DBG_PRINT("Unable to find firmware version info!!!\n");
  72. // *Major = 0;
  73. // *Minor = 0;
  74. // *Rev = 0;
  75. // return;
  76. // }
  77. //
  78. // fgets(aline,79,fp);
  79. //
  80. // for(i = 0; i < 79; i++)
  81. // {
  82. // if (aline[i] == '\0')
  83. // break;
  84. // if (aline[i] == '.')
  85. // ++count;
  86. // }
  87. //
  88. // if(count == 3)
  89. // sscanf(aline,"FW_VERSION=%d.%d.%d.%d",Major,Minor,&AuxVer,Rev);
  90. // else
  91. // sscanf(aline,"FW_VERSION=%d.%d.%d",Major,Minor,Rev);
  92. //
  93. // fclose(fp);
  94. //
  95. // return;
  96. }
  97. /*---------------------------------------
  98. * GetDevID
  99. *---------------------------------------*/
  100. int
  101. GetDevID (_NEAR_ INT8U* pReq, INT8U ReqLen, _NEAR_ INT8U* pRes,_NEAR_ int BMCInst)
  102. {
  103. _NEAR_ GetDevIDRes_T* pGetDevIDRes = (_NEAR_ GetDevIDRes_T*) pRes;
  104. char MfgID[3]={0x12,0x34,0x56};
  105. pGetDevIDRes->CompletionCode = CC_NORMAL;
  106. pGetDevIDRes->DeviceID = DEVICE_ID;
  107. pGetDevIDRes->DevRevision = IPMI_DEV_REVISION;
  108. pGetDevIDRes->FirmwareRevision1 = 0x01;// Major | (inFlashMode << 7);
  109. pGetDevIDRes->FirmwareRevision2 = 0x08;//MinorBCD; //DO NOT CHANGE THIS ASSIGNMENT. INSTEAD SET THE VALUE OF THE VARIABLE Minor IN THE FIRSTTIME LOOP
  110. pGetDevIDRes->IPMIVersion = IPMI_VERSION;
  111. pGetDevIDRes->DevSupport = 0xbf;//DEV_SUPPORT;
  112. pGetDevIDRes->ProdID = 0xaabb;//htoipmi_u16 (g_ProdID);
  113. pGetDevIDRes->AuxFirmwareRevision = 0x00000001;
  114. _fmemcpy (pGetDevIDRes->MfgID, MfgID, sizeof (MfgID));
  115. SessionSequenceNumberCount=SessionSequenceNumberCount+1;
  116. return sizeof (GetDevIDRes_T);
  117. }
  118. /*---------------------------------------
  119. * ColdReset
  120. *---------------------------------------*/
  121. int
  122. ColdReset (_NEAR_ INT8U* pReq, INT8U ReqLen, _NEAR_ INT8U* pRes,_NEAR_ int BMCInst)
  123. {
  124. // g_BMCInfo[BMCInst].Msghndlr.ColdReset = 1;
  125. // /* PDK Module Post Set Reboot Cause*/
  126. // if(g_PDKHandle[PDK_SETREBOOTCAUSE] != NULL)
  127. // {
  128. // ((INT8U(*)(INT8U,int)) g_PDKHandle[PDK_SETREBOOTCAUSE])(SETREBOOTCAUSE_COLD_WARM_RESET_CMD,BMCInst);
  129. // }
  130. //
  131. // *pRes = CC_NORMAL;
  132. return sizeof (*pRes);
  133. }
  134. /*---------------------------------------
  135. * WarmReset
  136. *---------------------------------------*/
  137. int
  138. WarmReset (_NEAR_ INT8U* pReq, INT8U ReqLen, _NEAR_ INT8U* pRes,_NEAR_ int BMCInst)
  139. {
  140. // int i=0;
  141. // FILE *sensorfp;
  142. // _FAR_ SensorSharedMem_T* pSenSharedMem;
  143. // _FAR_ BMCInfo_t* pBMCInfo = &g_BMCInfo[BMCInst];
  144. // pSenSharedMem = (_FAR_ SensorSharedMem_T*)&pBMCInfo->SensorSharedMem;
  145. // SensorThresholds BySensor;
  146. // INT8U TotalNumSensors;
  147. // char SensorFileName[MAX_SEN_NAME_SIZE];
  148. //
  149. // memset(SensorFileName,0,MAX_SEN_NAME_SIZE);
  150. //
  151. // SENSORTHRESH_FILE(BMCInst, SensorFileName);
  152. //
  153. // sensorfp = fopen(SensorFileName,"wb");
  154. // if(sensorfp == NULL)
  155. // {
  156. // TCRIT("Cannot open file for writing\n");
  157. // *pRes = CC_UNSPECIFIED_ERR;
  158. // return sizeof (*pRes);
  159. // }
  160. //
  161. // OS_THREAD_MUTEX_ACQUIRE(&g_BMCInfo[BMCInst].SensorSharedMemMutex, WAIT_INFINITE);
  162. //
  163. // TotalNumSensors = g_BMCInfo[BMCInst].SenConfig.NumThreshSensors+g_BMCInfo[BMCInst].SenConfig.NumNonThreshSensors;
  164. //
  165. // for(i=1;i<=TotalNumSensors;i++)
  166. // {
  167. // if(pSenSharedMem->SensorInfo[i].EventTypeCode == THRESHOLD_SENSOR_CLASS)
  168. // {
  169. //
  170. // memset(&BySensor,0,sizeof(SensorThresholds));
  171. //
  172. // BySensor.SensorNum = pSenSharedMem->SensorInfo[i].SensorNumber;
  173. // BySensor.SensorTypeCode = pSenSharedMem->SensorInfo[i].SensorTypeCode;
  174. // BySensor.LowerCritical = pSenSharedMem->SensorInfo [i].LowerCritical;
  175. // BySensor.LowerNonCritical = pSenSharedMem->SensorInfo[i].LowerNonCritical;
  176. // BySensor.LowerNonRecoverable = pSenSharedMem->SensorInfo[i].LowerNonRecoverable;
  177. // BySensor.UpperCritical = pSenSharedMem->SensorInfo [i].UpperCritical;
  178. // BySensor.UpperNonCritical = pSenSharedMem->SensorInfo[i].UpperNonCritical;
  179. // BySensor.UpperNonRecoverable = pSenSharedMem->SensorInfo[i].UpperNonRecoverable;
  180. //
  181. // if(sizeof(SensorThresholds) != fwrite((char *)&BySensor,sizeof(char),sizeof(SensorThresholds),sensorfp))
  182. // {
  183. // TCRIT("Cannot Write SensorThresholds\n");
  184. // fclose(sensorfp);
  185. // OS_THREAD_MUTEX_RELEASE(&g_BMCInfo[BMCInst].SensorSharedMemMutex);
  186. // unlink(SensorFileName);
  187. // *pRes = CC_UNSPECIFIED_ERR;
  188. // return sizeof (*pRes);
  189. // }
  190. //
  191. // }
  192. //
  193. // }
  194. //
  195. // fclose(sensorfp);
  196. // OS_THREAD_MUTEX_RELEASE(&g_BMCInfo[BMCInst].SensorSharedMemMutex);
  197. //
  198. // g_BMCInfo[BMCInst].Msghndlr.WarmReset = 1;
  199. //
  200. // /* PDK Module Post Set Reboot Cause*/
  201. // if(g_PDKHandle[PDK_SETREBOOTCAUSE] != NULL)
  202. // {
  203. // ((INT8U(*)(INT8U,int)) g_PDKHandle[PDK_SETREBOOTCAUSE])(SETREBOOTCAUSE_COLD_WARM_RESET_CMD,BMCInst);
  204. // }
  205. // *pRes = CC_NORMAL;
  206. // return sizeof (*pRes);
  207. }
  208. /*---------------------------------------
  209. * GetSelfTestResults
  210. *---------------------------------------*/
  211. int
  212. GetSelfTestResults (_NEAR_ INT8U* pReq, INT8U ReqLen, _NEAR_ INT8U* pRes,_NEAR_ int BMCInst)
  213. {
  214. // _NEAR_ GetSelfTestRes_T* pGetSelfTest = (_NEAR_ GetSelfTestRes_T*) pRes;
  215. //
  216. // pGetSelfTest->CompletionCode = CC_NORMAL;
  217. // pGetSelfTest->TestResultByte1 = ( 0 == g_BMCInfo[BMCInst].Msghndlr.SelfTestByte ) ?
  218. // GST_NO_ERROR: GST_CORRUPTED_DEVICES;
  219. // pGetSelfTest->TestResultByte2 = g_BMCInfo[BMCInst].Msghndlr.SelfTestByte;
  220. //
  221. // if(g_PDKHandle[PDK_GETSELFTESTRESULTS] != NULL)
  222. // {
  223. // ((void(*)(INT8U *,int))g_PDKHandle[PDK_GETSELFTESTRESULTS]) ((_FAR_ INT8U*)pGetSelfTest,BMCInst);
  224. // }
  225. //
  226. // return sizeof (GetSelfTestRes_T);
  227. }
  228. /*---------------------------------------
  229. * MfgTestOn
  230. *---------------------------------------*/
  231. int
  232. MfgTestOn (_NEAR_ INT8U* pReq, INT8U ReqLen, _NEAR_ INT8U* pRes,_NEAR_ int BMCInst)
  233. {
  234. //
  235. // g_BMCInfo[BMCInst].Msghndlr.ManufacturingTestOnMode = TRUE;
  236. //
  237. // *pRes = CC_NORMAL;
  238. // return sizeof (*pRes);
  239. }
  240. /*---------------------------------------
  241. * SetACPIPwrState
  242. *---------------------------------------*/
  243. int
  244. SetACPIPwrState (_NEAR_ INT8U* pReq, INT8U ReqLen, _NEAR_ INT8U* pRes,_NEAR_ int BMCInst)
  245. {
  246. // _NEAR_ SetACPIPwrStateReq_T* pSetACPIReq = (_NEAR_ SetACPIPwrStateReq_T*) pReq;
  247. // const INT8U SysPowerState[ACPI_MAX_SYS_PWR_STATE]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x20,0x21,0x2A,0x7F};
  248. // const INT8U DevPowerState[ACPI_MAX_DEV_PWR_STATE]={0x00,0x01,0x02,0x03,0x2A,0x7F};
  249. // INT8U TempState = 0,State=0,Ret = 0,StateFlag=0;
  250. //
  251. // TempState = (pSetACPIReq->ACPISysPwrState & ACPI_SYS_PWR_STATE_MASK);
  252. // for(State = 0;State<(ACPI_MAX_SYS_PWR_STATE-1);State++)
  253. // {
  254. // if(TempState != SysPowerState[State])
  255. // {
  256. // continue;
  257. // }
  258. // else
  259. // {
  260. // StateFlag = ACPI_FLAG_SET;
  261. // break;
  262. // }
  263. // }
  264. // if(StateFlag !=ACPI_FLAG_SET)
  265. // {
  266. // *pRes = CC_INV_DATA_FIELD;
  267. // return sizeof (*pRes);
  268. // }
  269. // StateFlag = ACPI_FLAG_UNSET;
  270. // TempState = (pSetACPIReq->ACPIDevPwrState & ACPI_DEV_PWR_STATE_MASK);
  271. // for(State = 0;State<(ACPI_MAX_DEV_PWR_STATE-1);State++)
  272. // {
  273. // if(TempState != DevPowerState[State])
  274. // {
  275. // continue;
  276. // }
  277. // else
  278. // {
  279. // StateFlag = ACPI_FLAG_SET;
  280. // break;
  281. // }
  282. // }
  283. // if(StateFlag !=ACPI_FLAG_SET)
  284. // {
  285. // *pRes = CC_INV_DATA_FIELD;
  286. // return sizeof (*pRes);
  287. // }
  288. //
  289. // /*Perform OEM action*/
  290. // if(g_PDKHandle[PDK_CHECKACPIPOWERSTATE] != NULL) //empty
  291. // {
  292. // Ret = ((int(*)(INT8U,INT8U))g_PDKHandle[PDK_CHECKACPIPOWERSTATE]) (pSetACPIReq->ACPISysPwrState,pSetACPIReq->ACPIDevPwrState);
  293. // if(Ret == 1)
  294. // {
  295. // *pRes = CC_INV_DATA_FIELD;
  296. // return sizeof (*pRes);
  297. // }
  298. // }
  299. //
  300. // /* Perform OEM action */
  301. // if(g_PDKHandle[PDK_ONACPISTATECHANGE] != NULL) //empty
  302. // {
  303. // ((void(*)(int,int))g_PDKHandle[PDK_ONACPISTATECHANGE]) (pSetACPIReq->ACPISysPwrState & ACPI_SYS_PWR_STATE_MASK,BMCInst);
  304. // }
  305. //
  306. // //To get the data across the processes added in Shared memory structure in SharedMem.h
  307. //
  308. // LOCK_BMC_SHARED_MEM(BMCInst);
  309. // /* if set System power state bit is set */
  310. // if (0 != (pSetACPIReq->ACPISysPwrState & ACPI_SET_SYS_PWR_STATE))
  311. // {
  312. // if((BMC_GET_SHARED_MEM (BMCInst)->m_ACPISysPwrState == WORKING_STATE ) &&
  313. // ((pSetACPIReq->ACPISysPwrState & ACPI_SYS_PWR_STATE_MASK) == S1_SLEEPING_STATE))
  314. //
  315. // {
  316. // //We are disable the Watch dog timer when State change from Working state to Sleep state s1
  317. // BMC_GET_SHARED_MEM(BMCInst)->IsWDTPresent =FALSE;
  318. // BMC_GET_SHARED_MEM (BMCInst)->IsWDTRunning=FALSE;
  319. // }
  320. //
  321. // BMC_GET_SHARED_MEM (BMCInst)->m_ACPISysPwrState = pSetACPIReq->ACPISysPwrState & ACPI_SYS_PWR_STATE_MASK;
  322. // }
  323. //
  324. // /* if set Devicepower state bit is set */
  325. // if (0 != (pSetACPIReq->ACPIDevPwrState & ACPI_SET_DEV_PWR_STATE))
  326. // {
  327. // BMC_GET_SHARED_MEM (BMCInst)->m_ACPIDevPwrState = pSetACPIReq->ACPIDevPwrState & ACPI_DEV_PWR_STATE_MASK;
  328. // }
  329. //
  330. // UNLOCK_BMC_SHARED_MEM (BMCInst);
  331. //
  332. // *pRes = CC_NORMAL;
  333. // return sizeof (*pRes);
  334. }
  335. /*---------------------------------------
  336. * GetACPIPwrState
  337. *---------------------------------------*/
  338. int
  339. GetACPIPwrState (_NEAR_ INT8U* pReq, INT8U ReqLen, _NEAR_ INT8U* pRes,_NEAR_ int BMCInst)
  340. {
  341. // _NEAR_ GetACPIPwrStateRes_T* pGetACPIRes = (_NEAR_ GetACPIPwrStateRes_T*) pRes;
  342. //
  343. // pGetACPIRes->CompletionCode = CC_NORMAL;
  344. //
  345. // LOCK_BMC_SHARED_MEM(BMCInst);
  346. // pGetACPIRes->ACPISysPwrState = BMC_GET_SHARED_MEM (BMCInst)-> m_ACPISysPwrState;
  347. // pGetACPIRes->ACPIDevPwrState = BMC_GET_SHARED_MEM (BMCInst)->m_ACPIDevPwrState;
  348. // UNLOCK_BMC_SHARED_MEM (BMCInst);
  349. //
  350. // return sizeof (GetACPIPwrStateRes_T);
  351. }
  352. /*---------------------------------------
  353. * GetDevGUID
  354. *---------------------------------------*/
  355. int
  356. GetDevGUID (_NEAR_ INT8U* pReq, INT8U ReqLen, _NEAR_ INT8U* pRes,_NEAR_ int BMCInst)
  357. {
  358. // _NEAR_ GetDevGUIDRes_T* pGetDevGUIDRes = (_NEAR_ GetDevGUIDRes_T*) pRes;
  359. //
  360. // pGetDevGUIDRes->CompletionCode = CC_NORMAL;
  361. // LOCK_BMC_SHARED_MEM (BMCInst);
  362. // _fmemcpy (pGetDevGUIDRes->Node, BMC_GET_SHARED_MEM (BMCInst)->DeviceGUID, 16);
  363. // UNLOCK_BMC_SHARED_MEM (BMCInst);
  364. //
  365. // return sizeof (GetDevGUIDRes_T);
  366. }
  367. #endif /* IPM_DEVICE */