123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163 |
- /*****************************************************************
- *****************************************************************
- *** **
- *** (C)Copyright 2005-2006, American Megatrends Inc. **
- *** **
- *** All Rights Reserved. **
- *** **
- *** 6145-F, Northbelt Parkway, Norcross, **
- *** **
- *** Georgia - 30071, USA. Phone-(770)-246-8600. **
- *** **
- *****************************************************************
- *****************************************************************
- ******************************************************************
- *
- * fru.c
- * fru functions.
- *
- * Author: Rama Bisa <ramab@ami.com>
- *
- ******************************************************************/
- #define ENABLE_DEBUG_MACROS 0
- #include "Types.h"
- #include "FRU.h"
- #include "IPMI_FRU.h"
- #include "MsgHndlr.h"
- #include "SharedMem.h"
- #include "Support.h"
- #include "IPMIDefs.h"
- #include "Debug.h"
- #include "NVRData.h"
- #include "IPMDevice.h"
- #include "NVRAccess.h"
- #include "IPMI_IPM.h"
- //#include "IPMI_SDRRecord.h"
- #include "SDRFunc.h"
- #include "Util.h"
- #include "PDKAccess.h"
- #include "IPMIConf.h"
- #if FRU_DEVICE == 1
- //extern _FAR_ INT8U g_SelfTestByte;
- //extern _FAR_ INT8U g_FRUInfo[MAX_PDK_FRU_SUPPORTED];
- /*-----------------------------------------------------
- * GetFRUAreaInfo
- *----------------------------------------------------*/
- int
- GetFRUAreaInfo (_NEAR_ INT8U* pReq, INT8U ReqLen, _NEAR_ INT8U* pRes,_NEAR_ int BMCInst)
- {
- int Ret=0;
- BMCInfo_t *pBMCInfo = &g_BMCInfo[BMCInst];
- OS_THREAD_MUTEX_ACQUIRE(&pBMCInfo->FRUConfig.FRUMutex,WAIT_INFINITE);
- if(g_PDKHandle[PDK_GETFRUAREAINFO] != NULL)
- {
- Ret = ((int(*)(INT8U*,INT8U,INT8U*,int))g_PDKHandle[PDK_GETFRUAREAINFO]) (pReq, ReqLen, pRes,BMCInst);
- }
- OS_THREAD_MUTEX_RELEASE(&pBMCInfo->FRUConfig.FRUMutex);
- return Ret;
- }
- /*-----------------------------------------------------
- * Read FRU Data
- *----------------------------------------------------*/
- int
- ReadFRUData (_NEAR_ INT8U* pReq, INT8U ReqLen, _NEAR_ INT8U* pRes,_NEAR_ int BMCInst)
- {
- int Ret=0;
- BMCInfo_t *pBMCInfo = &g_BMCInfo[BMCInst];
- OS_THREAD_MUTEX_ACQUIRE(&pBMCInfo->FRUConfig.FRUMutex,WAIT_INFINITE);
- if(g_PDKHandle[PDK_READFRUDATA] != NULL)
- {
- Ret = ((int(*)(INT8U*,INT8U,INT8U*,int))g_PDKHandle[PDK_READFRUDATA]) (pReq, ReqLen, pRes,BMCInst);
- }
- OS_THREAD_MUTEX_RELEASE(&pBMCInfo->FRUConfig.FRUMutex);
- return Ret;
- }
- /*-----------------------------------------------------
- * Write FRU Data
- *----------------------------------------------------*/
- int
- WriteFRUData (_NEAR_ INT8U* pReq, INT8U ReqLen, _NEAR_ INT8U* pRes,_NEAR_ int BMCInst)
- {
- int Ret=0;
- BMCInfo_t *pBMCInfo = &g_BMCInfo[BMCInst];
- OS_THREAD_MUTEX_ACQUIRE(&pBMCInfo->FRUConfig.FRUMutex,WAIT_INFINITE);
- if(g_PDKHandle[PDK_WRITEFRUDATA] != NULL)
- {
- Ret = ((int(*)(INT8U*,INT8U,INT8U*,int))g_PDKHandle[PDK_WRITEFRUDATA]) (pReq, ReqLen, pRes,BMCInst);
- }
- OS_THREAD_MUTEX_RELEASE(&pBMCInfo->FRUConfig.FRUMutex);
- return Ret;
- }
- /*-----------------------------------------------------
- * InitFRU
- *-----------------------------------------------------*/
- int
- InitFRU (int BMCInst)
- {
- FRUReadReq_T FRUReadReq;
- INT8U Frudata[64];
- INT8U Checksum=0;
- int ret=0,i,j;
- _FAR_ BMCInfo_t* pBMCInfo = &g_BMCInfo[BMCInst];
- //pBMCInfo->FRUConfig.total_frus = 1;
- for(i=0;pBMCInfo->FRUConfig.FRUInfo[i]!=0xff;i++)
- {
- FRUReadReq.FRUDeviceID=pBMCInfo->FRUConfig.FRUInfo[i];
- FRUReadReq.Offset=0x0;
- FRUReadReq.CountToRead=sizeof(FRUCommonHeader_T);
- ret=ReadFRUData(( INT8U *)&FRUReadReq,4,Frudata,BMCInst);
- switch(Frudata[0])
- {
- case FRU_DEVICE_NOT_FOUND :
- continue;
- case FRU_NOT_ACCESSIBLE:
- g_BMCInfo[BMCInst].Msghndlr.SelfTestByte |= GST_CANNOT_ACCESS_FRU;
- break;
- case FRU_ACCESSIBLE:
- for(j=2;j<10;j++)
- {
- Checksum+=Frudata[j];
- }
- if(0 !=Checksum )
- {
- g_BMCInfo[BMCInst].Msghndlr.SelfTestByte |= GST_FRU_CORRUPTED;
- break;
- }
- }
- }
- if(g_PDKHandle[PDK_INITFRU] != NULL)
- {
- ret = ((int(*)(int))g_PDKHandle[PDK_INITFRU]) (BMCInst);
- }
- return ret;
- }
- #endif /* FRU_DEVICE */
|