SDR.c 66 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873
  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. * SDR.c
  16. * SDR functions.
  17. *
  18. * Author: Govind Kothandapani <govindk@ami.com>
  19. *
  20. ******************************************************************/
  21. #define ENABLE_DEBUG_MACROS 0
  22. #include <dlfcn.h>
  23. #include "Types.h"
  24. #include "Debug.h"
  25. #include "MsgHndlr.h"
  26. #include "Support.h"
  27. #include "IPMI_SDR.h"
  28. #include "SDR.h"
  29. #include "SDRFunc.h"
  30. #include "SEL.h"
  31. #include "IPMIDefs.h"
  32. #include "IPMDevice.h"
  33. #include "IPMI_Events.h"
  34. #include "Events.h"
  35. #include "Sensor.h"
  36. #include "NVRAccess.h"
  37. #include "IPMI_IPM.h"
  38. #include "Util.h"
  39. #include "IPMI_SensorEvent.h"
  40. #include "IPMBIfc.h"
  41. #include "IPMIConf.h"
  42. #include "PDKAccess.h"
  43. #include "SharedMem.h"
  44. #include "IPMI_Storage.h"
  45. #include "PDKCmdsAccess.h"
  46. #include "featuredef.h"
  47. /* Reserved bit macro definitions */
  48. #define RESERVED_BITS_PARTIALADDSDR 0xF0 //(BIT7 | BIT6 | BIT5 | BIT4)
  49. #if SDR_DEVICE == 1
  50. #define SUPPORT_MULTI_CONTROLLER 1
  51. /*** Local Definitions ***/
  52. #define SDR_FIRST_FREE_BYTE(BMCInst) (((_FAR_ INT8U*)g_BMCInfo[BMCInst].SDRConfig.SDRRAM) + g_BMCInfo[BMCInst].SDRConfig.SDRRAM->Size)
  53. #define MAX_SDR_LEN 25
  54. #define MAX_RES_LEN 128
  55. #define SDR_VERSION 0x51
  56. #define CMD_RUN_INITIALIZATION_AGENT 0x2C
  57. #define MANAGEMENT_DEV_LOC_REC 0x12
  58. #define PARTIAL_ADD_SDR_SUPPORT 0x04
  59. #define RESERVE_SDR_SUPPORT 0x02
  60. #define GET_SDR_REPOSITORY_ALLOC_SUPPORT 0x01
  61. #define NON_MODAL_SUPPORT 0x20
  62. #define NO_SUPPORT 0x00
  63. #define DELETE_SDR_SUPPORT 0x08
  64. #define MAX_OEM_REC_LEN 64
  65. #define SDR_ALLOC_UNIT_SIZE 0x10
  66. #define SDR_MAX_RECORD_SIZE 0x80
  67. #define SDR_ERASE_COMPLETED 0x01
  68. #define SDR_INIT_COMPLETED 0x01
  69. #define ENABLE_SELECTED_EVENT_MSG 0x10
  70. #define DISABLE_SELECTED_EVENT_MSG 0x20
  71. #define OEM_SDR_NM_REC 0x0D
  72. /**
  73. * @brief Size of SDR Record
  74. **/
  75. #define SDR_SIZE(SDRRecHdr) (sizeof (SDRRecHdr_T) + (SDRRecHdr)->Len)
  76. /**
  77. * @brief Size the SDR Record occupies in the memory
  78. **/
  79. #define SDR_SIZE_IN_MEM(SDRRecHdr) \
  80. (((SDR_SIZE(SDRRecHdr) & 0x0f) == 0) ? SDR_SIZE(SDRRecHdr) : \
  81. (SDR_SIZE(SDRRecHdr) & 0xf0) + 0x10)
  82. /*** Prototype Declarations ***/
  83. static BOOL PreCheckSDRUpdateModeCmd (_NEAR_ INT8U* pRes,int BMCInst);
  84. static INT16U SDR_ReserveSDRRepository (int BMCInst);
  85. static _FAR_ SDRRecHdr_T* GetLastSDRRec (int BMCInst);
  86. static void UpdateRepositoryInfo (int BMCInst);
  87. static _FAR_ SDRRecHdr_T* SDR_GetSDRRec (INT16U RecID, INT16U ReservationID,int BMCInst);
  88. static void SDRInitAgent (int BMCInst);
  89. static INT8U ValidateSDRSize (INT8U SDRType, INT8U Size);
  90. const INT8U SDRSize [][2] = {
  91. // { SDR Type, Maximum Length },
  92. { FULL_SDR_REC, 64 },
  93. { COMPACT_SDR_REC, 48 },
  94. { EVENT_ONLY_SDR_REC, 33 },
  95. { ENTITY_ASSOCIATION_SDR_REC, 16 },
  96. { DEV_REL_ENTITY_ASSOCIATION_SDR_REC, 32 },
  97. { GENERIC_DEVICE_LOCATOR_SDR_REC, 32 },
  98. { FRU_DEVICE_LOCATOR_SDR_REC, 32 },
  99. { MGMT_CTRL_DEV_LOCATOR_SDR_REC, 32 },
  100. { MGMT_CTRL_CONFIRMATION_SDR_REC, 32 },
  101. { BMC_MSG_CHANNEL_INFO_REC, 16 },
  102. };
  103. static INT16U SDR_AddSDRRec (_NEAR_ SDRRecHdr_T* pSDRRecHdr,int BMCInst);
  104. static INT16U SDR_PartialAddSDR (_NEAR_ INT8U* SDRData, INT8U Offset, INT8U Size,INT8U IsLast, INT16U ReservationID,int BMCInst);
  105. #define CLEAR_SDR_INITIATE_ERASE 0xAA
  106. #define CLEAR_SDR_GET_STATUS 0x00
  107. static int SDR_ClearSDRRepository (INT16U ReservationID, INT8U InitOrStatus,int BMCInst);
  108. static INT16U SDR_DeleteSDR (INT16U ReservationID, INT16U RecID,int BMCInst);
  109. /*---------------------------------------
  110. * GetSDRRepositoryInfo
  111. *---------------------------------------*/
  112. int
  113. GetSDRRepositoryInfo (_NEAR_ INT8U* pReq, INT8U ReqLen, _NEAR_ INT8U* pRes,_NEAR_ int BMCInst)
  114. {
  115. BMCInfo_t *pBMCInfo = &g_BMCInfo[BMCInst];
  116. _NEAR_ SDRRepositoryInfo_T* pSDRRepInfoRes =
  117. (_NEAR_ SDRRepositoryInfo_T*) pRes;
  118. OS_THREAD_MUTEX_ACQUIRE(&pBMCInfo->SDRConfig.SDRMutex, WAIT_INFINITE);
  119. _fmemcpy (pSDRRepInfoRes, &g_BMCInfo[BMCInst].SDRConfig.RepositoryInfo, sizeof (SDRRepositoryInfo_T));
  120. pSDRRepInfoRes->CompletionCode = CC_NORMAL;
  121. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->SDRConfig.SDRMutex);
  122. return sizeof (SDRRepositoryInfo_T);
  123. }
  124. /*---------------------------------------
  125. * GetSDRRepositoryAllocInfo
  126. *---------------------------------------*/
  127. int
  128. GetSDRRepositoryAllocInfo (_NEAR_ INT8U* pReq, INT8U ReqLen, _NEAR_ INT8U* pRes,_NEAR_ int BMCInst)
  129. {
  130. BMCInfo_t *pBMCInfo = &g_BMCInfo[BMCInst];
  131. _NEAR_ SDRRepositoryAllocInfo_T* pSDRRepAllocInfoRes =
  132. (_NEAR_ SDRRepositoryAllocInfo_T*) pRes;
  133. OS_THREAD_MUTEX_ACQUIRE(&pBMCInfo->SDRConfig.SDRMutex, WAIT_INFINITE);
  134. _fmemcpy (pSDRRepAllocInfoRes, &g_BMCInfo[BMCInst].SDRConfig.RepositoryAllocInfo,
  135. sizeof (SDRRepositoryAllocInfo_T));
  136. pSDRRepAllocInfoRes->CompletionCode = CC_NORMAL;
  137. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->SDRConfig.SDRMutex);
  138. return sizeof (SDRRepositoryAllocInfo_T);
  139. }
  140. /*---------------------------------------
  141. * ReserveSDRRepository
  142. *---------------------------------------*/
  143. int
  144. ReserveSDRRepository (_NEAR_ INT8U* pReq, INT8U ReqLen, _NEAR_ INT8U* pRes,_NEAR_ int BMCInst)
  145. {
  146. BMCInfo_t *pBMCInfo = &g_BMCInfo[BMCInst];
  147. _NEAR_ ReserveSDRRepositoryRes_T* pResSDRRepRes =
  148. (_NEAR_ ReserveSDRRepositoryRes_T*) pRes;
  149. OS_THREAD_MUTEX_ACQUIRE(&pBMCInfo->SDRConfig.SDRMutex, WAIT_INFINITE);
  150. /* Shouldnt allow to reserve when the SDR is in update mode */
  151. if( TRUE == g_BMCInfo[BMCInst].SDRConfig.UpdatingSDR )
  152. {
  153. pResSDRRepRes->CompletionCode = CC_SDR_REP_IN_UPDATE_MODE;
  154. return sizeof (pResSDRRepRes->CompletionCode);
  155. }
  156. pResSDRRepRes->ReservationID = SDR_ReserveSDRRepository (BMCInst);
  157. g_BMCInfo[BMCInst].SDRConfig.PartAddbytes = 0;
  158. pResSDRRepRes->CompletionCode = CC_NORMAL;
  159. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->SDRConfig.SDRMutex);
  160. return sizeof (ReserveSDRRepositoryRes_T);
  161. }
  162. /*---------------------------------------
  163. * GetSDR
  164. *---------------------------------------*/
  165. int
  166. GetSDR (_NEAR_ INT8U* pReq, INT8U ReqLen, _NEAR_ INT8U* pRes,_NEAR_ int BMCInst)
  167. {
  168. _FAR_ SDRRecHdr_T* pSDRRec;
  169. _NEAR_ GetSDRReq_T* pGetSDRReq = (_NEAR_ GetSDRReq_T*) pReq;
  170. _NEAR_ GetSDRRes_T* pGetSDRRes = (_NEAR_ GetSDRRes_T*) pRes;
  171. _FAR_ BMCInfo_t* pBMCInfo = &g_BMCInfo[BMCInst];
  172. INT8U SDRLen = 0,*curchannel;
  173. OS_THREAD_MUTEX_ACQUIRE(&pBMCInfo->SDRConfig.SDRMutex, WAIT_INFINITE);
  174. if (TRUE != PreCheckSDRUpdateModeCmd (pRes,BMCInst))
  175. {
  176. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->SDRConfig.SDRMutex);
  177. return sizeof (INT8U); /* error code set in func */
  178. }
  179. /* If the Offset is Not zero then its A partial get.. / if SDR is in update mode
  180. then check for the reservation id */
  181. if ((pGetSDRReq->Offset == 0) && (FALSE == g_BMCInfo[BMCInst].SDRConfig.UpdatingSDR ))
  182. {
  183. pSDRRec = GetSDRRec (pGetSDRReq->RecID,BMCInst);
  184. }
  185. else
  186. {
  187. pSDRRec = SDR_GetSDRRec ( pGetSDRReq->RecID, pGetSDRReq->ReservationID,BMCInst );
  188. }
  189. if (0 == pSDRRec)
  190. {
  191. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->SDRConfig.SDRMutex);
  192. pGetSDRRes->CompletionCode = g_BMCInfo[BMCInst].SDRConfig.SDRError;
  193. return sizeof (INT8U);
  194. }
  195. SDRLen = pSDRRec->Len+sizeof(SDRRecHdr_T);
  196. if((0xFF == pGetSDRReq->Size) && (SDRLen >= pGetSDRReq->Offset))
  197. {
  198. pGetSDRReq->Size = SDRLen - pGetSDRReq->Offset;
  199. }
  200. OS_THREAD_TLS_GET(g_tls.CurChannel,curchannel);
  201. /* Check for Max Request Bytes */
  202. if (((pGetSDRReq->Size > MAX_SDR_LEN) &&
  203. (( pBMCInfo->IpmiConfig.PrimaryIPMBSupport == 0x01 && PRIMARY_IPMB_CHANNEL == (*curchannel & 0xF))
  204. || (pBMCInfo->IpmiConfig.SecondaryIPMBSupport == 0x01 && pBMCInfo->SecondaryIPMBCh == (*curchannel & 0xF))))
  205. || (pGetSDRReq->Size > SDRLen) || (pGetSDRReq->Offset > SDRLen)
  206. || (pGetSDRReq->Size > (SDRLen-pGetSDRReq->Offset)))
  207. {
  208. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->SDRConfig.SDRMutex);
  209. pGetSDRRes->CompletionCode = CC_CANNOT_RETURN_REQ_BYTES;
  210. return sizeof (INT8U);
  211. }
  212. /* Copy the response */
  213. pGetSDRRes->CompletionCode = CC_NORMAL;
  214. pGetSDRRes->NextRecID = SDR_GetNextSDRId (pSDRRec->ID,BMCInst);
  215. _fmemcpy (pGetSDRRes + 1,
  216. ((_FAR_ INT8U*) pSDRRec) + pGetSDRReq->Offset,
  217. pGetSDRReq->Size);
  218. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->SDRConfig.SDRMutex);
  219. return sizeof (GetSDRRes_T) + pGetSDRReq->Size;
  220. }
  221. /*---------------------------------------
  222. * AddSDR
  223. *---------------------------------------*/
  224. int
  225. AddSDR (_NEAR_ INT8U* pReq, INT8U ReqLen, _NEAR_ INT8U* pRes,_NEAR_ int BMCInst)
  226. {
  227. INT16U RecID;
  228. _NEAR_ SDRRecHdr_T* pSDRRec = (_NEAR_ SDRRecHdr_T*) pReq;
  229. _NEAR_ AddSDRRes_T* pAddSDRRes = (_NEAR_ AddSDRRes_T*) pRes;
  230. _FAR_ BMCInfo_t* pBMCInfo = &g_BMCInfo[BMCInst];
  231. /*Check the Minimum length of the SDR record*/
  232. if(ReqLen < sizeof(SDRRecHdr_T))
  233. {
  234. *pRes = CC_REQ_INV_LEN;
  235. return sizeof(INT8U);
  236. }
  237. /*Check the SDR length*/
  238. if((ReqLen - sizeof(SDRRecHdr_T)) != pSDRRec->Len)
  239. {
  240. *pRes = CC_REQ_INV_LEN;
  241. return sizeof(INT8U);
  242. }
  243. OS_THREAD_MUTEX_ACQUIRE(&pBMCInfo->SDRConfig.SDRMutex, WAIT_INFINITE);
  244. if (TRUE != PreCheckSDRUpdateModeCmd (pRes,BMCInst))
  245. {
  246. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->SDRConfig.SDRMutex);
  247. return sizeof (INT8U); /* error code set in func */
  248. }
  249. RecID = SDR_AddSDRRec (pSDRRec,BMCInst);
  250. if (INVALID_RECORD_ID == RecID)
  251. {
  252. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->SDRConfig.SDRMutex);
  253. pAddSDRRes->CompletionCode = g_BMCInfo[BMCInst].SDRConfig.SDRError;
  254. return sizeof (pAddSDRRes->CompletionCode);
  255. }
  256. pAddSDRRes->CompletionCode = CC_NORMAL;
  257. pAddSDRRes->RecID = RecID;
  258. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->SDRConfig.SDRMutex);
  259. // To send notification to CIM
  260. if(g_PDKCIMEventHandle[PDKCIMEVENT_NOTIFYSERVERUPDATETOCIM] != NULL)
  261. {
  262. uint8 CMD;
  263. // Set bits for SDR Event & Add operation
  264. CMD = 0x11;
  265. ((int(*)(uint8, uint16))g_PDKCIMEventHandle[PDKCIMEVENT_NOTIFYSERVERUPDATETOCIM])(CMD, RecID);
  266. }
  267. return sizeof (AddSDRRes_T);
  268. }
  269. /*---------------------------------------
  270. * PartialAddSDR
  271. *---------------------------------------*/
  272. int
  273. PartialAddSDR (_NEAR_ INT8U* pReq, INT8U ReqLen, _NEAR_ INT8U* pRes,_NEAR_ int BMCInst)
  274. {
  275. INT8U Size;
  276. INT16U RecID;
  277. _NEAR_ PartialAddSDRReq_T* pPartialAddReq = (_NEAR_ PartialAddSDRReq_T*) pReq;
  278. _NEAR_ PartialAddSDRRes_T* pPartialAddRes = (_NEAR_ PartialAddSDRRes_T*) pRes;
  279. _FAR_ BMCInfo_t* pBMCInfo = &g_BMCInfo[BMCInst];
  280. if( ReqLen < sizeof(PartialAddSDRReq_T))
  281. {
  282. pPartialAddRes->CompletionCode = CC_REQ_INV_LEN;
  283. return sizeof (pPartialAddRes->CompletionCode);
  284. }
  285. /* Check for the reserved bytes should b zero */
  286. if ( 0 != (pPartialAddReq->Progress & RESERVED_BITS_PARTIALADDSDR ) )
  287. {
  288. pPartialAddRes->CompletionCode = CC_INV_DATA_FIELD;
  289. return sizeof(INT8U);
  290. }
  291. OS_THREAD_MUTEX_ACQUIRE(&pBMCInfo->SDRConfig.SDRMutex, WAIT_INFINITE);
  292. if (TRUE != PreCheckSDRUpdateModeCmd (pRes,BMCInst))
  293. {
  294. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->SDRConfig.SDRMutex);
  295. return sizeof (INT8U); /* error code set in func */
  296. }
  297. Size = ReqLen - sizeof (PartialAddSDRReq_T);
  298. if(0 == pPartialAddReq->Offset )
  299. {
  300. g_BMCInfo[BMCInst].SDRConfig.TrackPOffset =0;
  301. g_BMCInfo[BMCInst].SDRConfig.TrackRecID =pPartialAddReq->RecID;
  302. }
  303. else if((g_BMCInfo[BMCInst].SDRConfig.TrackPOffset) != pPartialAddReq->Offset || g_BMCInfo[BMCInst].SDRConfig.TrackRecID != pPartialAddReq->RecID)
  304. {
  305. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->SDRConfig.SDRMutex);
  306. pPartialAddRes->CompletionCode = CC_INV_DATA_FIELD;
  307. return sizeof (pPartialAddRes->CompletionCode);
  308. }
  309. RecID = SDR_PartialAddSDR ((_NEAR_ INT8U*)(pPartialAddReq + 1),
  310. pPartialAddReq->Offset,
  311. Size,
  312. pPartialAddReq->Progress & 0xf,
  313. pPartialAddReq->ReservationID,BMCInst);
  314. if (RecID == INVALID_RECORD_ID)
  315. {
  316. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->SDRConfig.SDRMutex);
  317. pPartialAddRes->CompletionCode = g_BMCInfo[BMCInst].SDRConfig.SDRError;
  318. return sizeof (pPartialAddRes->CompletionCode);
  319. }
  320. pPartialAddRes->CompletionCode = CC_NORMAL;
  321. pPartialAddRes->RecID = RecID;
  322. g_BMCInfo[BMCInst].SDRConfig.TrackPOffset +=Size;
  323. g_BMCInfo[BMCInst].SDRConfig.TrackRecID =RecID; //We are updating the available or alloted Record ID
  324. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->SDRConfig.SDRMutex);
  325. return sizeof (PartialAddSDRRes_T);
  326. }
  327. /*---------------------------------------
  328. * DeleteSDR
  329. *---------------------------------------*/
  330. int
  331. DeleteSDR (_NEAR_ INT8U* pReq, INT8U ReqLen, _NEAR_ INT8U* pRes,_NEAR_ int BMCInst)
  332. {
  333. _FAR_ BMCInfo_t* pBMCInfo = &g_BMCInfo[BMCInst];
  334. _NEAR_ DeleteSDRReq_T* pDeleteSDRReq = (_NEAR_ DeleteSDRReq_T*)pReq;
  335. _NEAR_ DeleteSDRRes_T* pDeleteSDRRes = (_NEAR_ DeleteSDRRes_T*)pRes;
  336. INT16U RecID;
  337. OS_THREAD_MUTEX_ACQUIRE(&pBMCInfo->SDRConfig.SDRMutex, WAIT_INFINITE);
  338. if (TRUE != PreCheckSDRUpdateModeCmd (pRes,BMCInst))
  339. {
  340. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->SDRConfig.SDRMutex);
  341. return sizeof (INT8U); /* error code set in func */
  342. }
  343. RecID=SDR_DeleteSDR ( pDeleteSDRReq->ReservationID, pDeleteSDRReq->RecID,BMCInst);
  344. if(RecID == INVALID_RECORD_ID )
  345. {
  346. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->SDRConfig.SDRMutex);
  347. pDeleteSDRRes->CompletionCode = g_BMCInfo[BMCInst].SDRConfig.SDRError;
  348. return sizeof (pDeleteSDRRes->CompletionCode);
  349. }
  350. pDeleteSDRRes->CompletionCode = CC_NORMAL;
  351. pDeleteSDRRes->RecID = RecID;
  352. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->SDRConfig.SDRMutex);
  353. // To send notification to CIM
  354. if(g_PDKCIMEventHandle[PDKCIMEVENT_NOTIFYSERVERUPDATETOCIM] != NULL)
  355. {
  356. uint8 CMD;
  357. // Set bits for SDR Event & Delete operation
  358. CMD = 0x13;
  359. ((int(*)(uint8, uint16))g_PDKCIMEventHandle[PDKCIMEVENT_NOTIFYSERVERUPDATETOCIM])(CMD, RecID);
  360. }
  361. return sizeof (DeleteSDRRes_T);
  362. }
  363. /*---------------------------------------
  364. * ClearSDRRepository
  365. *---------------------------------------*/
  366. int
  367. ClearSDRRepository (_NEAR_ INT8U* pReq, INT8U ReqLen, _NEAR_ INT8U* pRes,_NEAR_ int BMCInst)
  368. {
  369. int status;
  370. _NEAR_ ClearSDRReq_T* pClrSDRReq = (_NEAR_ ClearSDRReq_T*) pReq;
  371. _NEAR_ ClearSDRRes_T* pClrSDRRes = (_NEAR_ ClearSDRRes_T*) pRes;
  372. _FAR_ BMCInfo_t* pBMCInfo = &g_BMCInfo[BMCInst];
  373. OS_THREAD_MUTEX_ACQUIRE(&pBMCInfo->SDRConfig.SDRMutex, WAIT_INFINITE);
  374. if (TRUE != PreCheckSDRUpdateModeCmd (pRes,BMCInst))
  375. {
  376. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->SDRConfig.SDRMutex);
  377. return sizeof (INT8U); /* error code set in func */
  378. }
  379. if(pClrSDRReq->CLR[0] != 'C' || pClrSDRReq->CLR[1] != 'L' || pClrSDRReq->CLR[2] != 'R' )
  380. {
  381. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->SDRConfig.SDRMutex);
  382. pClrSDRRes->CompletionCode= CC_PASSWORD_TEST_FAILED;
  383. return sizeof(INT8U);
  384. }
  385. status = SDR_ClearSDRRepository (pClrSDRReq->ReservationID,pClrSDRReq->InitOrStatus,BMCInst);
  386. if (0 != status)
  387. {
  388. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->SDRConfig.SDRMutex);
  389. pClrSDRRes->CompletionCode = g_BMCInfo[BMCInst].SDRConfig.SDRError;
  390. return sizeof (pClrSDRRes->CompletionCode);
  391. }
  392. pClrSDRRes->CompletionCode = CC_NORMAL;
  393. pClrSDRRes->EraseProgress = SDR_ERASE_COMPLETED;
  394. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->SDRConfig.SDRMutex);
  395. return sizeof (ClearSDRRes_T);
  396. }
  397. /*---------------------------------------
  398. * GetSDRRepositoryTime
  399. *---------------------------------------*/
  400. int
  401. GetSDRRepositoryTime (_NEAR_ INT8U* pReq, INT8U ReqLen, _NEAR_ INT8U* pRes,_NEAR_ int BMCInst)
  402. {
  403. INT32U SDRTime;
  404. _NEAR_ GetSDRRepositoryTimeRes_T* pGetSDRTimeRes =
  405. (_NEAR_ GetSDRRepositoryTimeRes_T*) pRes;
  406. BMCInfo_t *pBMCInfo = &g_BMCInfo[BMCInst];
  407. OS_THREAD_MUTEX_ACQUIRE(&pBMCInfo->SDRConfig.SDRMutex, WAIT_INFINITE);
  408. /* Get the time */
  409. SDRTime = GetSelTimeStamp (BMCInst);
  410. pGetSDRTimeRes->CompletionCode = CC_NORMAL;
  411. pGetSDRTimeRes->Time = SDRTime;
  412. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->SDRConfig.SDRMutex);
  413. return sizeof (GetSDRRepositoryTimeRes_T);
  414. }
  415. /*--------------------------------------
  416. * * SetSDRRepositoryTime
  417. * * -------------------------------------*/
  418. int
  419. SetSDRRepositoryTime (_NEAR_ INT8U* pReq, INT8U ReqLen, _NEAR_ INT8U* pRes,_NEAR_ int BMCInst)
  420. {
  421. _NEAR_ SetSDRRepositoryTimeReq_T* pSetSDRTimeReq = (_NEAR_ SetSDRRepositoryTimeReq_T*) pReq;
  422. BMCInfo_t *pBMCInfo = &g_BMCInfo[BMCInst];
  423. pSetSDRTimeReq->Time = ipmitoh_u32 (pSetSDRTimeReq->Time);
  424. OS_THREAD_MUTEX_ACQUIRE(&pBMCInfo->SDRConfig.SDRMutex, WAIT_INFINITE);
  425. SET_SYSTEM_TIME_STAMP (&pSetSDRTimeReq->Time);
  426. /* Resetting the SELTimeUTCOffset to default value */
  427. pBMCInfo->GenConfig.SELTimeUTCOffset = UNSPECIFIED_UTC_OFFSET;
  428. /*Write to NVRAM*/
  429. FlushIPMI((INT8U*)&pBMCInfo->GenConfig,(INT8U*)&pBMCInfo->GenConfig,pBMCInfo->IPMIConfLoc.GenConfigAddr,
  430. sizeof(GENConfig_T),BMCInst);
  431. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->SDRConfig.SDRMutex);
  432. pRes [0] = CC_NORMAL;
  433. return sizeof (*pRes);
  434. }
  435. /*---------------------------------------
  436. * EnterSDRUpdateMode
  437. *---------------------------------------*/
  438. int
  439. EnterSDRUpdateMode (_NEAR_ INT8U* pReq, INT8U ReqLen, _NEAR_ INT8U* pRes,_NEAR_ int BMCInst)
  440. {
  441. _NEAR_ EnterSDRUpdateModeRes_T* pEnterSDRUpdateModeRes =
  442. (_NEAR_ EnterSDRUpdateModeRes_T*) pRes;
  443. _FAR_ BMCInfo_t* pBMCInfo = &g_BMCInfo[BMCInst];
  444. INT8U *curchannel;
  445. OS_THREAD_TLS_GET(g_tls.CurChannel,curchannel);
  446. OS_THREAD_MUTEX_ACQUIRE(&pBMCInfo->SDRConfig.SDRMutex, WAIT_INFINITE);
  447. g_BMCInfo[BMCInst].SDRConfig.UpdatingSDR = TRUE;
  448. g_BMCInfo[BMCInst].SDRConfig.UpdatingChannel = *curchannel & 0xF;
  449. pEnterSDRUpdateModeRes->CompletionCode = CC_NORMAL;
  450. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->SDRConfig.SDRMutex);
  451. return sizeof (EnterSDRUpdateModeRes_T);
  452. }
  453. /*------------------------------------------
  454. * ExitSDRUpdateMode
  455. *------------------------------------------*/
  456. int
  457. ExitSDRUpdateMode (_NEAR_ INT8U* pReq, INT8U ReqLen, _NEAR_ INT8U* pRes,_NEAR_ int BMCInst)
  458. {
  459. _NEAR_ ExitSDRUpdateModeRes_T* pExitSDRUpdateModeRes =
  460. (_NEAR_ ExitSDRUpdateModeRes_T*) pRes;
  461. _FAR_ BMCInfo_t* pBMCInfo = &g_BMCInfo[BMCInst];
  462. OS_THREAD_MUTEX_ACQUIRE(&pBMCInfo->SDRConfig.SDRMutex, WAIT_INFINITE);
  463. if (TRUE != PreCheckSDRUpdateModeCmd (pRes,BMCInst))
  464. {
  465. return sizeof (INT8U); /* error code set in func */
  466. }
  467. g_BMCInfo[BMCInst].SDRConfig.UpdatingSDR = FALSE;
  468. pExitSDRUpdateModeRes->CompletionCode = CC_NORMAL;
  469. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->SDRConfig.SDRMutex);
  470. return sizeof (ExitSDRUpdateModeRes_T);
  471. }
  472. /*-------------------------------------------------
  473. * RunInitializationAgent
  474. *--------------------------------------------------*/
  475. int
  476. RunInitializationAgent (_NEAR_ INT8U* pReq, INT8U ReqLen, _NEAR_ INT8U* pRes,_NEAR_ int BMCInst)
  477. {
  478. _NEAR_ RunInitAgentRes_T* pRunInitAgentRes =
  479. (_NEAR_ RunInitAgentRes_T*) pRes;
  480. _FAR_ BMCInfo_t *pBMCInfo = &g_BMCInfo[BMCInst];
  481. /* Reserved bit Checking */
  482. if((pReq[0] & 0xFE) != 0x00)
  483. {
  484. pRes [0] = CC_INV_DATA_FIELD;
  485. return sizeof (*pRes);
  486. }
  487. OS_THREAD_MUTEX_ACQUIRE(&pBMCInfo->SDRConfig.SDRMutex, WAIT_INFINITE);
  488. if (0 != pReq[0])
  489. {
  490. InitSDR (BMCInst);
  491. SDRInitAgent (BMCInst);
  492. // The sensor monitor loop has been made 0 for
  493. // initializing the sensor scanning bit.
  494. pBMCInfo->SenConfig.SensorMonitorLoopCount = 0;
  495. }
  496. pRunInitAgentRes->CompletionCode = CC_NORMAL;
  497. pRunInitAgentRes->Status = SDR_INIT_COMPLETED;
  498. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->SDRConfig.SDRMutex);
  499. return sizeof (RunInitAgentRes_T);
  500. }
  501. /*-----------------------------------------
  502. * GetSDRRec
  503. *-----------------------------------------*/
  504. _FAR_ SDRRecHdr_T*
  505. GetSDRRec (INT16U RecID,int BMCInst)
  506. {
  507. _FAR_ SDRRecHdr_T* pSDRRec;
  508. /* If ID == 0x0000 return first record */
  509. if (0 == RecID)
  510. {
  511. pSDRRec = SDR_GetFirstSDRRec (BMCInst);
  512. if (0== pSDRRec) /* is SDR empty? */
  513. {
  514. g_BMCInfo[BMCInst].SDRConfig.SDRError = CC_SDR_REC_NOT_PRESENT;
  515. return 0;
  516. }
  517. return pSDRRec;
  518. }
  519. /* If ID == 0xFFFF return the last record */
  520. if (0xFFFF == RecID)
  521. {
  522. return GetLastSDRRec (BMCInst);
  523. }
  524. pSDRRec = SDR_GetFirstSDRRec (BMCInst);
  525. while (TRUE)
  526. {
  527. if (0== pSDRRec)
  528. {
  529. g_BMCInfo[BMCInst].SDRConfig.SDRError = CC_SDR_REC_NOT_PRESENT;
  530. return 0;
  531. }
  532. if (pSDRRec->ID == RecID)
  533. {
  534. return pSDRRec;
  535. }
  536. pSDRRec = SDR_GetNextSDRRec (pSDRRec,BMCInst);
  537. }
  538. }
  539. /*-----------------------------------------------------
  540. * InitSDR
  541. *-----------------------------------------------------*/
  542. int
  543. InitSDR (int BMCInst)
  544. {
  545. _FAR_ INT8U* pSDRRec;
  546. _FAR_ SDRRecHdr_T* pSDRRecord;
  547. int i; /* Multi-LUN support index will have more than 256 sensors*/
  548. _FAR_ INT8U OEM_Recdata[MAX_OEM_REC_LEN];
  549. _FAR_ BMCInfo_t* pBMCInfo = &g_BMCInfo[BMCInst];
  550. pBMCInfo->SDRConfig.SDRRAM = (_FAR_ SDRRepository_T*) GetSDRSELNVRAddr(NVRH_SDR, BMCInst);
  551. pSDRRec = GetSDRSELNVRAddr (NVRH_SDR + sizeof(SDRRepository_T), BMCInst);
  552. pBMCInfo->SDRConfig.SDRRAM->NumRecords = 0;
  553. pBMCInfo->SDRConfig.LatestRecordID =0;
  554. pBMCInfo->SDRConfig.SDRRAM->Size = 16; /* SDR Repository Header */
  555. #if (0x01 == MARK_FOR_DELETION_SUPPORT)
  556. pBMCInfo->SDRConfig.NumMarkedRecords= 0;
  557. #endif
  558. if (pBMCInfo->SDRConfig.RepositoryInfo.OpSupport & OVERFLOW_FLAG)
  559. {
  560. pBMCInfo->SDRConfig.RepositoryInfo.OpSupport &= ~OVERFLOW_FLAG;
  561. }
  562. IPMI_DBG_PRINT ("Init SDR\n");
  563. while (TRUE)
  564. {
  565. #if (0x01 == MARK_FOR_DELETION_SUPPORT)
  566. if ((0x5A == ((_FAR_ E2ROMHdr_T*)pSDRRec)->Valid)
  567. || (0x01 == ((_FAR_ E2ROMHdr_T*)pSDRRec)->Valid) )
  568. {
  569. //count the records marked for deletion.
  570. if (0x01 == ((_FAR_ E2ROMHdr_T*)pSDRRec)->Valid)
  571. {
  572. pBMCInfo->SDRConfig.NumMarkedRecords++;
  573. }
  574. else
  575. {
  576. pBMCInfo->SDRConfig.SDRRAM->NumRecords ++;
  577. }
  578. #else
  579. if (0x5A == ((_FAR_ E2ROMHdr_T*)pSDRRec)->Valid)
  580. {
  581. pBMCInfo->SDRConfig.SDRRAM->NumRecords ++;
  582. #endif
  583. pBMCInfo->SDRConfig.LatestRecordID = ((SDRRecHdr_T *)(((_FAR_ E2ROMHdr_T*)pSDRRec)+1))->ID;
  584. pBMCInfo->SDRConfig.SDRRAM->Size += ((_FAR_ E2ROMHdr_T*)pSDRRec)->Len;
  585. pSDRRec += ((_FAR_ E2ROMHdr_T*)pSDRRec)->Len;
  586. }
  587. /* if No more Records */
  588. else
  589. {
  590. break;
  591. }
  592. }
  593. /* Check if SDR (valid record count) Empty */
  594. if (0 == pBMCInfo->SDRConfig.SDRRAM->NumRecords)
  595. {
  596. #if IPM_DEVICE == 1
  597. pBMCInfo->Msghndlr.SelfTestByte |= GST_SDR_EMPTY;
  598. #endif
  599. IPMI_DBG_PRINT ("SDR EMPTY \n");
  600. }
  601. /* Update the SDR Erase Time Stamp */
  602. pBMCInfo->SDRConfig.RepositoryInfo.EraseTimeStamp = pBMCInfo->GenConfig.SDREraseTime ;
  603. /* Update the repository information */
  604. UpdateRepositoryInfo (BMCInst);
  605. pSDRRecord = SDR_GetFirstSDRRec (BMCInst);
  606. for (i=0; i < pBMCInfo->SDRConfig.SDRRAM->NumRecords && pSDRRecord != NULL; i++)
  607. {
  608. if ((OEM_SDRFRU_REC == pSDRRecord->Type)||(OEM_SDRNM_REC == pSDRRecord->Type))
  609. {
  610. INT8U Rec_len;
  611. Rec_len=pSDRRecord->Len ;
  612. memcpy(OEM_Recdata , pSDRRecord ,sizeof(SDRRecHdr_T)+Rec_len);
  613. if(g_PDKHandle[PDK_PROCESSOEMRECORD] != NULL)
  614. {
  615. ((void(*)(INT8U *,int))g_PDKHandle[PDK_PROCESSOEMRECORD]) ((INT8U*)&OEM_Recdata,BMCInst);
  616. }
  617. }
  618. if(g_corefeatures.node_manager == ENABLED)
  619. {
  620. if(OEM_SDRNM_REC == pSDRRecord->Type)
  621. {
  622. OEM_NMRec_T* sonm;
  623. sonm =(OEM_NMRec_T*) ( (UINT8*)pSDRRecord );
  624. if(sonm->RecordSubType == OEM_SDR_NM_REC)
  625. pBMCInfo->NMConfig.NMDevSlaveAddress = sonm->NMDevSlaveAddress;
  626. }
  627. }
  628. if(g_PDKHandle[PDK_PROCESSSENSORDATARECORD] != NULL)
  629. {
  630. ((void(*)(INT8U *,int))g_PDKHandle[PDK_PROCESSSENSORDATARECORD]) ((INT8U*)pSDRRecord,BMCInst);
  631. }
  632. pSDRRecord = SDR_GetNextSDRRec (pSDRRecord,BMCInst);
  633. }
  634. if(g_PDKHandle[PDK_AFTERSDRINIT] != NULL)
  635. {
  636. ((void(*)(INT8U))g_PDKHandle[PDK_AFTERSDRINIT]) (BMCInst);
  637. }
  638. return 0;
  639. }
  640. /*----------------------------------------------------------*
  641. * SDR_GetNextSDRId
  642. *----------------------------------------------------------*/
  643. INT16U
  644. SDR_GetNextSDRId (INT16U RecID,int BMCInst)
  645. {
  646. _FAR_ SDRRecHdr_T* pSDRRec;
  647. pSDRRec = GetSDRRec(RecID,BMCInst);
  648. if (0 == pSDRRec)
  649. {
  650. return INVALID_RECORD_ID;
  651. }
  652. pSDRRec = SDR_GetNextSDRRec (pSDRRec,BMCInst);
  653. if (0 == pSDRRec)
  654. {
  655. /* return last record ID (0xFFFF) */
  656. IPMI_DBG_PRINT (" No Records\n");
  657. return 0xFFFF;
  658. }
  659. else
  660. {
  661. return pSDRRec->ID;
  662. }
  663. }
  664. /*--------------------------------------------------
  665. * SDR_GetFirstSDRRec
  666. *--------------------------------------------------*/
  667. _FAR_ SDRRecHdr_T*
  668. SDR_GetFirstSDRRec (int BMCInst)
  669. {
  670. return ReadSDRRepository (NULL, BMCInst);
  671. }
  672. /*--------------------------------------------------
  673. * SDR_GetNextSDRRec
  674. *-------------------------------------------------*/
  675. _FAR_ SDRRecHdr_T*
  676. SDR_GetNextSDRRec (_FAR_ SDRRecHdr_T* pSDRRec,int BMCInst)
  677. {
  678. return ReadSDRRepository (pSDRRec,BMCInst);
  679. }
  680. /*--------------------------------------------------
  681. * ReadSDRRepository
  682. *-------------------------------------------------*/
  683. _FAR_ SDRRecHdr_T*
  684. ReadSDRRepository (_FAR_ SDRRecHdr_T* pSDRRec,int BMCInst)
  685. {
  686. _FAR_ E2ROMHdr_T* InternalHdr;
  687. INT8U SDRSize=0;
  688. if (pSDRRec == 0)
  689. {
  690. InternalHdr = (_FAR_ E2ROMHdr_T*) GetSDRSELNVRAddr(NVRH_SDR + sizeof(SDRRepository_T), BMCInst);
  691. }
  692. else
  693. {
  694. SDRSize = (SDR_ALLOC_UNIT_SIZE -((SDR_SIZE (pSDRRec) + sizeof(E2ROMHdr_T))%SDR_ALLOC_UNIT_SIZE));
  695. if(SDRSize == SDR_ALLOC_UNIT_SIZE)
  696. {
  697. InternalHdr = (_FAR_ E2ROMHdr_T*)((_FAR_ INT8U*)pSDRRec + SDR_SIZE (pSDRRec));
  698. }
  699. else
  700. {
  701. InternalHdr = (_FAR_ E2ROMHdr_T*)((_FAR_ INT8U*)pSDRRec + SDR_SIZE (pSDRRec)+SDRSize );
  702. }
  703. /* is address >= First free byte ? */
  704. if ((_FAR_ INT8U*) InternalHdr >= (_FAR_ INT8U*)SDR_FIRST_FREE_BYTE(BMCInst) )
  705. {
  706. /* No more records to read */
  707. IPMI_DBG_PRINT("No more records to read\n");
  708. return 0;
  709. }
  710. IPMI_DBG_PRINT_1("Reading the next record of %x \n", pSDRRec->ID);
  711. }
  712. /* is SDR Empty ?*/
  713. if (g_BMCInfo[BMCInst].SDRConfig.SDRRAM->NumRecords == 0)
  714. {
  715. return 0;
  716. }
  717. #if (0x01 == MARK_FOR_DELETION_SUPPORT)
  718. /* Fetch a Valid SDR */
  719. while (TRUE)
  720. {
  721. if( InternalHdr->Valid == 0x5a )
  722. {
  723. IPMI_DBG_PRINT_1("Returning Valid record ID %x \n", ((_FAR_ SDRRecHdr_T*)(InternalHdr+1))->ID );
  724. return ((_FAR_ SDRRecHdr_T*)(InternalHdr+1));
  725. }
  726. InternalHdr = (_FAR_ E2ROMHdr_T*) (((INT8U*)InternalHdr) + InternalHdr->Len);
  727. /* is address >= First free byte ? */
  728. if ((_FAR_ INT8U*) InternalHdr >= (_FAR_ INT8U*)SDR_FIRST_FREE_BYTE(BMCInst) )
  729. {
  730. IPMI_DBG_PRINT("No more valid records found \n");
  731. return 0;
  732. }
  733. }
  734. #else
  735. return ((_FAR_ SDRRecHdr_T*)(InternalHdr+1));
  736. #endif
  737. }
  738. /*--------------------------------------------------
  739. * WriteSDRRepository
  740. *-------------------------------------------------*/
  741. void
  742. WriteSDRRepository (_FAR_ SDRRecHdr_T* pSDRRec, INT8U Offset, INT8U Size,INT8U SdrSize,int BMCInst)
  743. {
  744. _FAR_ E2ROMHdr_T* InternalHdr = (_FAR_ E2ROMHdr_T *)SDR_FIRST_FREE_BYTE(BMCInst);
  745. _FAR_ INT8U* WriteAddr;
  746. /* Update Validity and Length */
  747. if ( Offset < sizeof(SDRRecHdr_T ) && ((Offset + Size) >= sizeof(SDRRecHdr_T)) )
  748. {
  749. InternalHdr->Valid = 0x5A;
  750. InternalHdr->Len = SdrSize;
  751. }
  752. WriteAddr = (_FAR_ INT8U*)(InternalHdr+1);
  753. memset((WriteAddr + Offset),0,SdrSize);
  754. _fmemcpy ((WriteAddr + Offset), pSDRRec, Size);
  755. return ;
  756. }
  757. /**
  758. * @brief Cehck the SDR update mode.
  759. * @param pRes - Response.
  760. * @return TRUE/FALSE
  761. **/
  762. static BOOL
  763. PreCheckSDRUpdateModeCmd (_NEAR_ INT8U* pRes,int BMCInst)
  764. {
  765. _FAR_ BMCInfo_t* pBMCInfo = &g_BMCInfo[BMCInst];
  766. INT8U *curchannel;
  767. OS_THREAD_TLS_GET(g_tls.CurChannel,curchannel);
  768. if (TRUE == g_BMCInfo[BMCInst].SDRConfig.UpdatingSDR)
  769. {
  770. if (pBMCInfo->IpmiConfig.SYSIfcSupport == 0x01 && SYS_IFC_CHANNEL == (*curchannel & 0xF))
  771. {
  772. if (SYS_IFC_CHANNEL != g_BMCInfo[BMCInst].SDRConfig.UpdatingChannel)
  773. {
  774. *pRes = CC_NODE_BUSY;
  775. return FALSE;
  776. }
  777. }
  778. else
  779. {
  780. return TRUE;
  781. }
  782. }
  783. return TRUE;
  784. }
  785. /**
  786. * @brief Reserve the SDR Repository.
  787. * @return Reservation ID.
  788. **/
  789. static INT16U
  790. SDR_ReserveSDRRepository (int BMCInst)
  791. {
  792. if (0xffff == g_BMCInfo[BMCInst].SDRConfig.ReservationID)
  793. {
  794. g_BMCInfo[BMCInst].SDRConfig.ReservationID = 1;
  795. }else
  796. {
  797. g_BMCInfo[BMCInst].SDRConfig.ReservationID++;
  798. }
  799. g_BMCInfo[BMCInst].SDRConfig.TrackPOffset =0;
  800. return g_BMCInfo[BMCInst].SDRConfig.ReservationID;
  801. }
  802. /**
  803. * @brief Get an SDR record.
  804. * @param RecID - SDR record ID.
  805. * @param ReservationID - SDR Reservation ID.
  806. * @return SDR record.
  807. **/
  808. static _FAR_ SDRRecHdr_T*
  809. SDR_GetSDRRec (INT16U RecID, INT16U ReservationID,int BMCInst)
  810. {
  811. /* Bail out with error, if both the conditions are False (Reservation not valid)
  812. 1. Reservation ID matches, not equal to 0x00 & SDR is not in Update mode /
  813. 2. SDR is in Update mode & Reservation ID equals to 0x00
  814. */
  815. if ( !(((g_BMCInfo[BMCInst].SDRConfig.ReservationID == ReservationID) && (0x00 != ReservationID) && (FALSE == g_BMCInfo[BMCInst].SDRConfig.UpdatingSDR)) ||
  816. ((TRUE == g_BMCInfo[BMCInst].SDRConfig.UpdatingSDR) && (0x00 == ReservationID))))
  817. {
  818. if( TRUE == g_BMCInfo[BMCInst].SDRConfig.UpdatingSDR )
  819. {
  820. g_BMCInfo[BMCInst].SDRConfig.SDRError = CC_SDR_REP_IN_UPDATE_MODE;
  821. }else /* Reservation ID doesn't match, return invalid reservation ID */
  822. {
  823. g_BMCInfo[BMCInst].SDRConfig.SDRError = CC_INV_RESERVATION_ID;
  824. }
  825. return 0;
  826. }
  827. return GetSDRRec (RecID,BMCInst);
  828. }
  829. static INT8U
  830. ValidateSDRSize (INT8U SDRType, INT8U Size)
  831. {
  832. int i;
  833. IPMI_DBG_PRINT_2("ValidateSDR Type : 0x%X, Size : 0x%X\n", SDRType, Size);
  834. if ((SDRType == OEM_SDRFRU_REC)||(SDRType == OEM_SDRNM_REC))
  835. return TRUE;
  836. for (i = 0; i < sizeof (SDRSize)/ 2; i++)
  837. {
  838. if ((SDRSize[i][0] == SDRType) && (SDRSize[i][1] >= Size))
  839. {
  840. return TRUE;
  841. }
  842. }
  843. return FALSE;
  844. }
  845. /**
  846. * @brief Add an SDR record.
  847. * @param pSDRRec - SDR record.
  848. * @return Record ID.
  849. **/
  850. static INT16U
  851. SDR_AddSDRRec (_NEAR_ SDRRecHdr_T* pSDRRec,int BMCInst)
  852. {
  853. INT16U SDRSize;
  854. INT8U AllocSize;
  855. int nRet;
  856. if (FALSE == ValidateSDRSize(pSDRRec->Type, pSDRRec->Len + sizeof (SDRRecHdr_T)))
  857. {
  858. g_BMCInfo[BMCInst].SDRConfig.SDRError = CC_REQ_INV_LEN;
  859. return INVALID_RECORD_ID;
  860. }
  861. AllocSize = SDR_SIZE (pSDRRec) + sizeof(E2ROMHdr_T);
  862. if(0 != (AllocSize % SDR_ALLOC_UNIT_SIZE))
  863. {
  864. SDRSize = AllocSize + (SDR_ALLOC_UNIT_SIZE -(AllocSize % SDR_ALLOC_UNIT_SIZE));
  865. }
  866. else
  867. {
  868. SDRSize = AllocSize;
  869. }
  870. if (SDRSize > htoipmi_u16 (g_BMCInfo[BMCInst].SDRConfig.RepositoryInfo.FreeSpace))
  871. {
  872. g_BMCInfo[BMCInst].SDRConfig.RepositoryInfo.OpSupport |= OVERFLOW_FLAG;
  873. g_BMCInfo[BMCInst].SDRConfig.SDRError = CC_OUT_OF_SPACE;
  874. return INVALID_RECORD_ID;
  875. }
  876. /* Update the record ID */
  877. pSDRRec->ID = g_BMCInfo[BMCInst].SDRConfig.LatestRecordID + 1;
  878. /* Add this record to the end of the repository */
  879. WriteSDRRepository (pSDRRec, 0, SDR_SIZE (pSDRRec),SDRSize,BMCInst);
  880. /* Flush the sdr */
  881. FlushSDR (SDR_FIRST_FREE_BYTE(BMCInst), SDRSize, nRet,BMCInst);
  882. #if IPM_DEVICE == 1
  883. if (-1 == nRet)
  884. {
  885. g_BMCInfo[BMCInst].Msghndlr.SelfTestByte |= GST_CANNOT_ACCESS_SDR;
  886. }
  887. else
  888. {
  889. g_BMCInfo[BMCInst].Msghndlr.SelfTestByte &= ~GST_CANNOT_ACCESS_SDR;
  890. }
  891. #endif
  892. /* Update the fields in SDR Repository */
  893. g_BMCInfo[BMCInst].SDRConfig.SDRRAM->NumRecords++;
  894. g_BMCInfo[BMCInst].SDRConfig.LatestRecordID++;
  895. #if IPM_DEVICE == 1
  896. if (g_BMCInfo[BMCInst].Msghndlr.SelfTestByte & GST_SDR_EMPTY)
  897. {
  898. g_BMCInfo[BMCInst].Msghndlr.SelfTestByte &= ~GST_SDR_EMPTY;
  899. }
  900. #endif
  901. g_BMCInfo[BMCInst].SDRConfig.SDRRAM->Size += SDRSize;
  902. g_BMCInfo[BMCInst].SDRConfig.SDRRAM->AddTimeStamp = GetSelTimeStamp(BMCInst);
  903. g_BMCInfo[BMCInst].SDRConfig.RepositoryInfo.AddTimeStamp = GetSelTimeStamp(BMCInst);
  904. /* Update the repository info */
  905. UpdateRepositoryInfo (BMCInst);
  906. /* Invalidate Reservation ID if any */
  907. SDR_ReserveSDRRepository (BMCInst);
  908. return pSDRRec->ID;
  909. }
  910. /**
  911. * @brief Add partial SDR record.
  912. * @param SDRData - SDR Data.
  913. * @param Offset - SDR offset.
  914. * @param Size - Size of the data.
  915. * @param IsLast - Is this a last record?
  916. * @param ReservationID - SDR reservation id.
  917. * @return the record id.
  918. **/
  919. static INT16U
  920. SDR_PartialAddSDR (_NEAR_ INT8U* SDRData, INT8U Offset, INT8U Size,
  921. INT8U IsLast, INT16U ReservationID,int BMCInst)
  922. {
  923. INT16U RecID;
  924. _FAR_ SDRRecHdr_T* pSDRRecInNVR;
  925. INT8U SdrSize=0;
  926. int nRet;
  927. /* Bail out with error, if both the conditions are False (Reservation not valid)
  928. 1. Reservation ID matches, not equal to 0x00 & SDR is not in Update mode /
  929. 2. SDR is in Update mode & Reservation ID equals to 0x00
  930. */
  931. if ( !(((g_BMCInfo[BMCInst].SDRConfig.ReservationID == ReservationID) && (0x00 != ReservationID) && (FALSE == g_BMCInfo[BMCInst].SDRConfig.UpdatingSDR)) ||
  932. ((TRUE == g_BMCInfo[BMCInst].SDRConfig.UpdatingSDR) && (0x00 == ReservationID))))
  933. {
  934. if( TRUE == g_BMCInfo[BMCInst].SDRConfig.UpdatingSDR )
  935. {
  936. g_BMCInfo[BMCInst].SDRConfig.SDRError = CC_SDR_REP_IN_UPDATE_MODE;
  937. }else //Reservation ID doesn't match, return invalid reservation ID.
  938. {
  939. g_BMCInfo[BMCInst].SDRConfig.SDRError = CC_INV_RESERVATION_ID;
  940. }
  941. g_BMCInfo[BMCInst].SDRConfig.PartAddbytes=0;
  942. return INVALID_RECORD_ID;
  943. }
  944. pSDRRecInNVR = (_FAR_ SDRRecHdr_T*) (SDR_FIRST_FREE_BYTE(BMCInst) +
  945. sizeof (E2ROMHdr_T));
  946. RecID = g_BMCInfo[BMCInst].SDRConfig.LatestRecordID + 1;
  947. /* If the header is received completely, validate the size */
  948. if ((Offset + Size) >= sizeof(SDRRecHdr_T))
  949. {
  950. if ( Offset < sizeof(SDRRecHdr_T ))
  951. {
  952. _NEAR_ SDRRecHdr_T SDRHdr;
  953. memcpy((INT8U*)&SDRHdr, (INT8U*)pSDRRecInNVR, Offset );
  954. memcpy(((INT8U*)&SDRHdr) + Offset, SDRData, sizeof(SDRRecHdr_T) - Offset);
  955. ((_NEAR_ SDRRecHdr_T*) pSDRRecInNVR)->ID = SDRHdr.ID = RecID;
  956. memcpy( SDRData, ((INT8U*)&SDRHdr) + Offset, sizeof(SDRRecHdr_T) - Offset );
  957. if (FALSE == ValidateSDRSize(SDRHdr.Type, SDRHdr.Len + sizeof (SDRRecHdr_T)))
  958. {
  959. g_BMCInfo[BMCInst].SDRConfig.SDRError = CC_REQ_INV_LEN;
  960. return INVALID_RECORD_ID;
  961. }
  962. SdrSize = SDRHdr.Len + sizeof (SDRRecHdr_T) + sizeof (E2ROMHdr_T);
  963. if(0 != (SdrSize % SDR_ALLOC_UNIT_SIZE))
  964. {
  965. SdrSize += (SDR_ALLOC_UNIT_SIZE - (SdrSize % SDR_ALLOC_UNIT_SIZE));
  966. }
  967. if (SdrSize > ipmitoh_u16 (g_BMCInfo[BMCInst].SDRConfig.RepositoryInfo.FreeSpace))
  968. {
  969. g_BMCInfo[BMCInst].SDRConfig.RepositoryInfo.OpSupport |= OVERFLOW_FLAG;
  970. g_BMCInfo[BMCInst].SDRConfig.SDRError = CC_OUT_OF_SPACE;
  971. return INVALID_RECORD_ID;
  972. }
  973. g_BMCInfo[BMCInst].SDRConfig.PartAddbytes = SdrSize;
  974. if ((Offset + Size) > (SDRHdr.Len + sizeof (SDRRecHdr_T)))
  975. {
  976. g_BMCInfo[BMCInst].SDRConfig.SDRError = CC_INV_DATA_FIELD;
  977. return INVALID_RECORD_ID;
  978. }
  979. }
  980. else if ((Offset + Size) > (pSDRRecInNVR->Len + sizeof (SDRRecHdr_T)))
  981. {
  982. g_BMCInfo[BMCInst].SDRConfig.SDRError = CC_INV_DATA_FIELD;
  983. return INVALID_RECORD_ID;
  984. }
  985. }
  986. if ((IsLast == 1) && ((Offset + Size) != (pSDRRecInNVR->Len + sizeof (SDRRecHdr_T))))
  987. {
  988. g_BMCInfo[BMCInst].SDRConfig.SDRError = CC_INCOMPLETE_WRITTEN_BYTES;
  989. return INVALID_RECORD_ID;
  990. }
  991. WriteSDRRepository ((_FAR_ SDRRecHdr_T*)SDRData, Offset, Size,SdrSize,BMCInst);
  992. /* If this is the last data update the data fields and flush. */
  993. if (IsLast == 1)
  994. {
  995. /* Flush the sdr */
  996. FlushSDR (SDR_FIRST_FREE_BYTE(BMCInst), g_BMCInfo[BMCInst].SDRConfig.PartAddbytes, nRet,BMCInst);
  997. #if IPM_DEVICE == 1
  998. if (-1 == nRet)
  999. {
  1000. g_BMCInfo[BMCInst].Msghndlr.SelfTestByte |= GST_CANNOT_ACCESS_SDR;
  1001. }
  1002. else
  1003. {
  1004. g_BMCInfo[BMCInst].Msghndlr.SelfTestByte &= ~GST_CANNOT_ACCESS_SDR;
  1005. }
  1006. #endif
  1007. /* Update the fields in SDR Repository */
  1008. g_BMCInfo[BMCInst].SDRConfig.SDRRAM->NumRecords ++;
  1009. g_BMCInfo[BMCInst].SDRConfig.LatestRecordID++;
  1010. g_BMCInfo[BMCInst].SDRConfig.TrackPOffset=0;
  1011. #if IPM_DEVICE == 1
  1012. if (g_BMCInfo[BMCInst].Msghndlr.SelfTestByte & GST_SDR_EMPTY)
  1013. {
  1014. g_BMCInfo[BMCInst].Msghndlr.SelfTestByte &= ~GST_SDR_EMPTY;
  1015. }
  1016. #endif
  1017. g_BMCInfo[BMCInst].SDRConfig.SDRRAM->Size += g_BMCInfo[BMCInst].SDRConfig.PartAddbytes;
  1018. g_BMCInfo[BMCInst].SDRConfig.SDRRAM->AddTimeStamp = GetSelTimeStamp(BMCInst);
  1019. g_BMCInfo[BMCInst].SDRConfig.RepositoryInfo.AddTimeStamp = GetSelTimeStamp(BMCInst);
  1020. /* Update the repository info */
  1021. UpdateRepositoryInfo (BMCInst);
  1022. g_BMCInfo[BMCInst].SDRConfig.PartAddbytes =0;
  1023. /* Invalidate Reservation ID if any */
  1024. SDR_ReserveSDRRepository (BMCInst);
  1025. // To send notification to CIM
  1026. if(g_PDKCIMEventHandle[PDKCIMEVENT_NOTIFYSERVERUPDATETOCIM] != NULL)
  1027. {
  1028. uint8 CMD;
  1029. // Set bits for SDR Event & Add operation
  1030. CMD = 0x11;
  1031. ((int(*)(uint8, uint16))g_PDKCIMEventHandle[PDKCIMEVENT_NOTIFYSERVERUPDATETOCIM])(CMD, RecID);
  1032. }
  1033. }
  1034. return RecID;
  1035. }
  1036. /**
  1037. * @brief Delete the SDR.
  1038. * @param ReservationID - SDR reservation id.
  1039. * @param RecordID - SDR Record ID, which needs to be deleted
  1040. * @return 0 if success, -1 if error.
  1041. **/
  1042. static INT16U
  1043. SDR_DeleteSDR (INT16U ReservationID, INT16U RecID,int BMCInst)
  1044. {
  1045. //#define MARK_FOR_DELETION
  1046. _FAR_ SDRRecHdr_T* pSDRRec = NULL;
  1047. int nRet;
  1048. BMCInfo_t *pBMCInfo = &g_BMCInfo[BMCInst];
  1049. #if (0x01 == MARK_FOR_DELETION_SUPPORT)
  1050. _FAR_ E2ROMHdr_T* pRec = NULL;
  1051. #else
  1052. _FAR_ INT8U* pDestLocation = NULL;
  1053. _FAR_ INT8U* pSrcData = NULL;
  1054. _FAR_ INT8U* pFreeBytes= NULL;
  1055. _NEAR_ INT8U deleteSDR_Size;
  1056. _NEAR_ INT16U size;
  1057. #endif
  1058. /* Bail out with error, if both the conditions are False (Reservation not valid)
  1059. 1. Reservation ID matches, not equal to 0x00 & SDR is not in Update mode /
  1060. 2. SDR is in Update mode & Reservation ID equals to 0x00
  1061. */
  1062. if ( !(((g_BMCInfo[BMCInst].SDRConfig.ReservationID == ReservationID) && (0x00 != ReservationID) && (FALSE == g_BMCInfo[BMCInst].SDRConfig.UpdatingSDR)) ||
  1063. ((TRUE == g_BMCInfo[BMCInst].SDRConfig.UpdatingSDR) && (0x00 == ReservationID))))
  1064. {
  1065. if( TRUE == g_BMCInfo[BMCInst].SDRConfig.UpdatingSDR )
  1066. {
  1067. g_BMCInfo[BMCInst].SDRConfig.SDRError = CC_SDR_REP_IN_UPDATE_MODE;
  1068. }else /* Reservation ID doesn't match, return invalid reservation ID */
  1069. {
  1070. g_BMCInfo[BMCInst].SDRConfig.SDRError = CC_INV_RESERVATION_ID;
  1071. }
  1072. return INVALID_RECORD_ID;
  1073. }
  1074. while(TRUE)
  1075. {
  1076. pSDRRec = ReadSDRRepository(pSDRRec,BMCInst);
  1077. if (pSDRRec == 0)
  1078. {
  1079. g_BMCInfo[BMCInst].SDRConfig.SDRError = CC_SDR_REC_NOT_PRESENT;
  1080. return INVALID_RECORD_ID;
  1081. }
  1082. if (pSDRRec->ID == RecID)
  1083. {
  1084. #if (0x01 == MARK_FOR_DELETION_SUPPORT)
  1085. pRec = ((E2ROMHdr_T *) pSDRRec) -1;
  1086. pRec->Valid = 0x01; /* Mark this record for deletion */
  1087. FlushSDR((INT8U *)pRec, sizeof(pRec->Valid), nRet,BMCInst);
  1088. #if IPM_DEVICE == 1
  1089. if (-1 == nRet)
  1090. {
  1091. g_BMCInfo[BMCInst].Msghndlr.SelfTestByte |= GST_CANNOT_ACCESS_SDR;
  1092. }
  1093. else
  1094. {
  1095. g_BMCInfo[BMCInst].Msghndlr.SelfTestByte &= ~GST_CANNOT_ACCESS_SDR;
  1096. }
  1097. #endif
  1098. g_BMCInfo[BMCInst].SDRConfig.SDRRAM->NumRecords--;
  1099. g_BMCInfo[BMCInst].SDRConfig.NumMarkedRecords++;
  1100. #else
  1101. /* Delete SDR - delete the current SDR, and rearrange the subsequent SDR's */
  1102. pDestLocation = (INT8U*)(((E2ROMHdr_T *) pSDRRec) -1);
  1103. deleteSDR_Size = (((E2ROMHdr_T *) pSDRRec) -1)->Len;
  1104. pSrcData = pDestLocation + deleteSDR_Size;
  1105. pFreeBytes = (INT8U*)SDR_FIRST_FREE_BYTE(BMCInst);
  1106. size = (_FAR_ INT8U*) pFreeBytes - (_FAR_ INT8U*)pDestLocation;
  1107. _fmemcpy (pDestLocation, pSrcData, size-deleteSDR_Size);
  1108. _fmemset ((pFreeBytes - deleteSDR_Size), '\0', deleteSDR_Size );
  1109. g_BMCInfo[BMCInst].SDRConfig.SDRRAM->Size -= deleteSDR_Size;
  1110. FlushSDR(pDestLocation, size, nRet,BMCInst);
  1111. #if IPM_DEVICE == 1
  1112. if (-1 == nRet)
  1113. {
  1114. g_BMCInfo[BMCInst].Msghndlr.SelfTestByte |= GST_CANNOT_ACCESS_SDR;
  1115. }
  1116. else
  1117. {
  1118. g_BMCInfo[BMCInst].Msghndlr.SelfTestByte &= ~GST_CANNOT_ACCESS_SDR;
  1119. }
  1120. #endif
  1121. g_BMCInfo[BMCInst].SDRConfig.SDRRAM->NumRecords--;
  1122. #endif
  1123. /* Update the SDR Erase Timestamp */
  1124. g_BMCInfo[BMCInst].SDRConfig.SDRRAM->EraseTimeStamp = GetSelTimeStamp (BMCInst);
  1125. g_BMCInfo[BMCInst].SDRConfig.RepositoryInfo.EraseTimeStamp = GetSelTimeStamp(BMCInst);
  1126. /* Store the SDR Ease Time Stamp in NVR */
  1127. pBMCInfo->GenConfig.SDREraseTime = g_BMCInfo[BMCInst].SDRConfig.RepositoryInfo.EraseTimeStamp;
  1128. FlushIPMI((INT8U*)&pBMCInfo->GenConfig,(INT8U*)&pBMCInfo->GenConfig,pBMCInfo->IPMIConfLoc.GenConfigAddr,
  1129. sizeof(GENConfig_T),BMCInst);
  1130. /* Update the repository info */
  1131. UpdateRepositoryInfo (BMCInst);
  1132. /* Invalidate Reservation ID if any */
  1133. SDR_ReserveSDRRepository (BMCInst);
  1134. return RecID;
  1135. }
  1136. }
  1137. }
  1138. /**
  1139. * @brief Clear the SDR repository.
  1140. * @param ReservationID - SDR reservation id.
  1141. * @param InitOrStatus - Initiate erase or get status flag
  1142. * @return 0 if success, -1 if error.
  1143. **/
  1144. static int
  1145. SDR_ClearSDRRepository (INT16U ReservationID, INT8U InitOrStatus,int BMCInst)
  1146. {
  1147. int nRet;
  1148. _FAR_ BMCInfo_t* pBMCInfo = &g_BMCInfo[BMCInst];
  1149. /* Bail out with error, if both the conditions are False (Reservation not valid)
  1150. 1. Reservation ID matches, not equal to 0x00 & SDR is not in Update mode /
  1151. 2. SDR is in Update mode & Reservation ID equals to 0x00
  1152. */
  1153. if ( !(((g_BMCInfo[BMCInst].SDRConfig.ReservationID == ReservationID) && (0x00 != ReservationID) && (FALSE == g_BMCInfo[BMCInst].SDRConfig.UpdatingSDR)) ||
  1154. ((TRUE == g_BMCInfo[BMCInst].SDRConfig.UpdatingSDR) && (0x00 == ReservationID))))
  1155. {
  1156. if( TRUE == g_BMCInfo[BMCInst].SDRConfig.UpdatingSDR )
  1157. {
  1158. g_BMCInfo[BMCInst].SDRConfig.SDRError = CC_SDR_REP_IN_UPDATE_MODE;
  1159. }else //Reservation ID doesn't match, return invalid reservation ID.
  1160. {
  1161. g_BMCInfo[BMCInst].SDRConfig.SDRError = CC_INV_RESERVATION_ID;
  1162. }
  1163. return -1;
  1164. }
  1165. // AAh = initiate erase, 00h = get erasure status.
  1166. if (InitOrStatus != CLEAR_SDR_INITIATE_ERASE &&
  1167. InitOrStatus != CLEAR_SDR_GET_STATUS)
  1168. {
  1169. g_BMCInfo[BMCInst].SDRConfig.SDRError = CC_INV_DATA_FIELD;
  1170. return -1;
  1171. }
  1172. else if (InitOrStatus == CLEAR_SDR_GET_STATUS)
  1173. {
  1174. return 0;
  1175. }
  1176. _fmemset (((_FAR_ INT8U*)g_BMCInfo[BMCInst].SDRConfig.SDRRAM + 16), 0xFF,(pBMCInfo->IpmiConfig.SDRAllocationSize * 1024) - 16 );
  1177. /* Flush the NVRAM */
  1178. FlushSDR (g_BMCInfo[BMCInst].SDRConfig.SDRRAM, (pBMCInfo->IpmiConfig.SDRAllocationSize * 1024), nRet,BMCInst);
  1179. #if IPM_DEVICE == 1
  1180. if (-1 == nRet)
  1181. {
  1182. g_BMCInfo[BMCInst].Msghndlr.SelfTestByte |= GST_CANNOT_ACCESS_SDR;
  1183. }
  1184. else
  1185. {
  1186. g_BMCInfo[BMCInst].Msghndlr.SelfTestByte &= ~GST_CANNOT_ACCESS_SDR;
  1187. }
  1188. #endif
  1189. /* Clear the fields of the SDR */
  1190. g_BMCInfo[BMCInst].SDRConfig.SDRRAM->NumRecords = 0;
  1191. g_BMCInfo[BMCInst].SDRConfig.LatestRecordID =0;
  1192. #if (0x01 == MARK_FOR_DELETION_SUPPORT)
  1193. g_BMCInfo[BMCInst].SDRConfig.NumMarkedRecords=0;
  1194. #endif
  1195. if (g_BMCInfo[BMCInst].SDRConfig.RepositoryInfo.OpSupport & OVERFLOW_FLAG)
  1196. {
  1197. g_BMCInfo[BMCInst].SDRConfig.RepositoryInfo.OpSupport &= ~OVERFLOW_FLAG;
  1198. }
  1199. #if IPM_DEVICE == 1
  1200. g_BMCInfo[BMCInst].Msghndlr.SelfTestByte |= GST_SDR_EMPTY;
  1201. #endif
  1202. g_BMCInfo[BMCInst].SDRConfig.SDRRAM->Size = 16;
  1203. g_BMCInfo[BMCInst].SDRConfig.SDRRAM->EraseTimeStamp = GetSelTimeStamp (BMCInst);
  1204. g_BMCInfo[BMCInst].SDRConfig.RepositoryInfo.EraseTimeStamp = GetSelTimeStamp(BMCInst);
  1205. /* Store the SDR Ease Time Stamp in NVR */
  1206. pBMCInfo->GenConfig.SDREraseTime = g_BMCInfo[BMCInst].SDRConfig.RepositoryInfo.EraseTimeStamp;
  1207. FlushIPMI((INT8U*)&pBMCInfo->GenConfig,(INT8U*)&pBMCInfo->GenConfig,pBMCInfo->IPMIConfLoc.GenConfigAddr,
  1208. sizeof(GENConfig_T),BMCInst);
  1209. /* Update the Repository Info */
  1210. UpdateRepositoryInfo (BMCInst);
  1211. /* Invalidate Reservation ID if any */
  1212. SDR_ReserveSDRRepository (BMCInst);
  1213. return 0;
  1214. }
  1215. /**
  1216. * @brief Get the last SDR record.
  1217. * @return the last SDR record.
  1218. **/
  1219. static _FAR_ SDRRecHdr_T*
  1220. GetLastSDRRec (int BMCInst)
  1221. {
  1222. _FAR_ SDRRecHdr_T* pSDRRec;
  1223. pSDRRec = SDR_GetFirstSDRRec (BMCInst);
  1224. while (TRUE)
  1225. {
  1226. _FAR_ SDRRecHdr_T* pCurSDRRec;
  1227. /* Save this record and get the next record */
  1228. pCurSDRRec = pSDRRec;
  1229. pSDRRec = SDR_GetNextSDRRec (pSDRRec,BMCInst);
  1230. /* If we have reached past the last return the last record */
  1231. if (0 == pSDRRec)
  1232. {
  1233. return pCurSDRRec;
  1234. }
  1235. }
  1236. }
  1237. /**
  1238. * @brief Update SDR repository information.
  1239. **/
  1240. static void
  1241. UpdateRepositoryInfo (int BMCInst)
  1242. {_FAR_ BMCInfo_t* pBMCInfo = &g_BMCInfo[BMCInst];
  1243. /* Update the version */
  1244. g_BMCInfo[BMCInst].SDRConfig.RepositoryInfo.Version = SDR_VERSION;
  1245. /* Update the record count */
  1246. g_BMCInfo[BMCInst].SDRConfig.RepositoryInfo.RecCt = htoipmi_u16 (g_BMCInfo[BMCInst].SDRConfig.SDRRAM->NumRecords);
  1247. /* Update the free space available */
  1248. g_BMCInfo[BMCInst].SDRConfig.RepositoryInfo.FreeSpace = htoipmi_u16 (((pBMCInfo->IpmiConfig.SDRAllocationSize * 1024) - g_BMCInfo[BMCInst].SDRConfig.SDRRAM->Size));
  1249. /* Update the the operation support */
  1250. g_BMCInfo[BMCInst].SDRConfig.RepositoryInfo.OpSupport=NO_SUPPORT;
  1251. if(g_PDKCmdsHandle[PDKCMDS_PDKISCOMMANDENABLED]!= NULL)
  1252. {
  1253. if(((int(*)(INT8U,INT8U*,INT8U,int))g_PDKCmdsHandle[PDKCMDS_PDKISCOMMANDENABLED])(NETFN_STORAGE,NULL,CMD_RESERVE_SDR_REPOSITORY,BMCInst) == 0)
  1254. {
  1255. g_BMCInfo[BMCInst].SDRConfig.RepositoryInfo.OpSupport|=RESERVE_SDR_SUPPORT;
  1256. }
  1257. if(((int(*)(INT8U,INT8U*,INT8U,int))g_PDKCmdsHandle[PDKCMDS_PDKISCOMMANDENABLED])(NETFN_STORAGE,NULL,CMD_GET_SDR_REPOSITORY_ALLOCATION_INFO,BMCInst) == 0)
  1258. {
  1259. g_BMCInfo[BMCInst].SDRConfig.RepositoryInfo.OpSupport|=NON_MODAL_SUPPORT+GET_SDR_REPOSITORY_ALLOC_SUPPORT;
  1260. }
  1261. if(((int(*)(INT8U,INT8U*,INT8U,int))g_PDKCmdsHandle[PDKCMDS_PDKISCOMMANDENABLED])(NETFN_STORAGE,NULL,CMD_PARTIAL_ADD_SDR,BMCInst) == 0)
  1262. {
  1263. g_BMCInfo[BMCInst].SDRConfig.RepositoryInfo.OpSupport|=PARTIAL_ADD_SDR_SUPPORT;
  1264. }
  1265. if(((int(*)(INT8U,INT8U*,INT8U,int))g_PDKCmdsHandle[PDKCMDS_PDKISCOMMANDENABLED])(NETFN_STORAGE,NULL,CMD_DELETE_SDR,BMCInst) == 0)
  1266. {
  1267. g_BMCInfo[BMCInst].SDRConfig.RepositoryInfo.OpSupport|=DELETE_SDR_SUPPORT;
  1268. }
  1269. }
  1270. /* Update the repository allocation information */
  1271. g_BMCInfo[BMCInst].SDRConfig.RepositoryAllocInfo.NumAllocUnits = htoipmi_u16 (((pBMCInfo->IpmiConfig.SDRAllocationSize * 1024) - 16) / SDR_ALLOC_UNIT_SIZE); /* Because 16 bytes are reserved for header info */
  1272. g_BMCInfo[BMCInst].SDRConfig.RepositoryAllocInfo.AllocUnitSize = htoipmi_u16 (SDR_ALLOC_UNIT_SIZE);
  1273. g_BMCInfo[BMCInst].SDRConfig.RepositoryAllocInfo.NumFreeAllocUnits = htoipmi_u16 (ipmitoh_u16 (g_BMCInfo[BMCInst].SDRConfig.RepositoryInfo.FreeSpace) /
  1274. SDR_ALLOC_UNIT_SIZE);
  1275. g_BMCInfo[BMCInst].SDRConfig.RepositoryAllocInfo.LargestFreeBlock = htoipmi_u16 (ipmitoh_u16 (g_BMCInfo[BMCInst].SDRConfig.RepositoryInfo.FreeSpace) /
  1276. SDR_ALLOC_UNIT_SIZE);
  1277. g_BMCInfo[BMCInst].SDRConfig.RepositoryAllocInfo.MaxRecSize = SDR_MAX_RECORD_SIZE / SDR_ALLOC_UNIT_SIZE;
  1278. }
  1279. /**
  1280. * @brief SDR initialization agent.
  1281. **/
  1282. static void
  1283. SDRInitAgent (int BMCInst)
  1284. {
  1285. INT8U i,Count =0;
  1286. INT8U CmdRes [MAX_RES_LEN];
  1287. _FAR_ SDRRecHdr_T* pSDRRec;
  1288. HQueue_T IfcQ;
  1289. _FAR_ BMCInfo_t* pBMCInfo = &g_BMCInfo[BMCInst];
  1290. if(g_PDKHandle[PDK_BEFOREINITAGENT] != NULL)
  1291. {
  1292. if(-1 == ((int(*)(int))g_PDKHandle[PDK_BEFOREINITAGENT]) (BMCInst))
  1293. {
  1294. return;
  1295. }
  1296. }
  1297. #if SET_EVENT_RECEIVER == 1
  1298. /* Turn off Event Generation */
  1299. {
  1300. SetEvtRcvReq_T SetEvtRcvReq = { 0xFF, 0 };
  1301. SetEventReceiver ((_NEAR_ INT8U*)&SetEvtRcvReq,
  1302. sizeof (SetEvtRcvReq_T), CmdRes,BMCInst);
  1303. }
  1304. #endif
  1305. /* Get the MMC Controller addresses*/
  1306. pSDRRec = SDR_GetFirstSDRRec (BMCInst);
  1307. if(0 != GetQueueHandle(LAN_IFC_Q,&IfcQ,BMCInst))
  1308. {
  1309. IPMI_WARNING("Error in getting LanIfcQ Handle \n");
  1310. }
  1311. for (i=0; i < pBMCInfo->SDRConfig.SDRRAM->NumRecords && pSDRRec != NULL; i++)
  1312. {
  1313. if(MANAGEMENT_DEV_LOC_REC == pSDRRec->Type)
  1314. {
  1315. _FAR_ MgmtCtrlrDevLocator_T* pMgmtDevLocRec = (_FAR_ MgmtCtrlrDevLocator_T*)pSDRRec;
  1316. if(pBMCInfo->IpmiConfig.BMCSlaveAddr != pMgmtDevLocRec->DevSlaveAddr )
  1317. {
  1318. pBMCInfo->MgmtTbl[Count].OWNERID=pMgmtDevLocRec->DevSlaveAddr;
  1319. pBMCInfo->MgmtTbl[Count++].PowerNotification=pMgmtDevLocRec->PowerStateNotification;
  1320. }
  1321. }
  1322. pSDRRec = SDR_GetNextSDRRec (pSDRRec,BMCInst);
  1323. }
  1324. pBMCInfo->MgmtTbl[Count].OWNERID= 0xff;
  1325. #if SUPPORT_MULTI_CONTROLLER == 1
  1326. /* Sending the Set Event Reciver Disable Command to all MMC in IPMB BUS */
  1327. if(pBMCInfo->IpmiConfig.PrimaryIPMBSupport == 0x01)
  1328. {
  1329. for(i=0; i<Count; i++)
  1330. {
  1331. MsgPkt_T Req;
  1332. memset(&Req,0,sizeof(MsgPkt_T));
  1333. IPMIMsgHdr_T* pIPMIMsgHdr = (IPMIMsgHdr_T*)Req.Data;
  1334. _NEAR_ SetEvtRcvReq_T* SetEvtRcvReq = (_NEAR_ SetEvtRcvReq_T*) &Req.Data[sizeof(IPMIMsgHdr_T)];
  1335. pIPMIMsgHdr->ResAddr =pBMCInfo->MgmtTbl[i].OWNERID;
  1336. pIPMIMsgHdr->NetFnLUN = (NETFN_SENSOR<< 2) | BMC_LUN_00;
  1337. pIPMIMsgHdr->ChkSum = ~(pIPMIMsgHdr->ResAddr + pIPMIMsgHdr->NetFnLUN) + 1;
  1338. pIPMIMsgHdr->ReqAddr = pBMCInfo->IpmiConfig.BMCSlaveAddr;
  1339. pBMCInfo->SDRConfig.IPMB_Seqnum++;
  1340. if (pBMCInfo->SDRConfig.IPMB_Seqnum >= 0x3F) { pBMCInfo->SDRConfig.IPMB_Seqnum = 0xFF; }
  1341. pIPMIMsgHdr->RqSeqLUN = pBMCInfo->SDRConfig.IPMB_Seqnum<< 2; /* Request Seq Num */
  1342. pIPMIMsgHdr->RqSeqLUN |= BMC_LUN_00; /* LUN =00 */
  1343. pIPMIMsgHdr->Cmd = CMD_SET_EVENT_RECEIVER;
  1344. SetEvtRcvReq->RcvSlaveAddr =0xFF ;
  1345. SetEvtRcvReq->RcvLUN =BMC_LUN_00;
  1346. Req.Param=BRIDGING_REQUEST;
  1347. Req.Channel=PRIMARY_IPMB_CHANNEL;
  1348. Req.Data [sizeof (IPMIMsgHdr_T) + sizeof(SetEvtRcvReq_T)] =
  1349. CalculateCheckSum2 (Req.Data, sizeof (IPMIMsgHdr_T) + sizeof(SetEvtRcvReq_T));
  1350. Req.Size = sizeof(IPMIMsgHdr_T) + sizeof(SetEvtRcvReq_T) +1 ; //Plus 1 for Check sum
  1351. /* Post Msg to IPMB task to send the set event receiver */
  1352. if ( -1 != IfcQ )
  1353. {
  1354. if(0 != PostMsg(&Req, IPMB_PRIMARY_IFC_Q,BMCInst))
  1355. {
  1356. IPMI_WARNING ("SDR.c : Error posting message to IPMBIfc_Q\n");
  1357. }
  1358. pBMCInfo->MgmtTbl[i].Status =TRUE;
  1359. }
  1360. }
  1361. }
  1362. #endif
  1363. #if SUPPORT_MULTI_CONTROLLER == 1
  1364. /* Sending the Run Initalization Command to all MMC in IPMB BUS */
  1365. if(pBMCInfo->IpmiConfig.PrimaryIPMBSupport == 0x01)
  1366. {
  1367. for(i=0; i<Count; i++)
  1368. {
  1369. MsgPkt_T Req;
  1370. memset(&Req,0,sizeof(MsgPkt_T));
  1371. IPMIMsgHdr_T* pIPMIMsgHdr = (IPMIMsgHdr_T*)Req.Data;
  1372. pIPMIMsgHdr->ResAddr =pBMCInfo->MgmtTbl[i].OWNERID;
  1373. pIPMIMsgHdr->NetFnLUN = (NETFN_STORAGE<< 2) | BMC_LUN_00;
  1374. /* Get Device ID */
  1375. // pIPMIMsgHdr->NetFnLUN = (NETFN_APP<< 2) | BMC_LUN_00;
  1376. pIPMIMsgHdr->ChkSum = ~(pIPMIMsgHdr->ResAddr + pIPMIMsgHdr->NetFnLUN) + 1;
  1377. pIPMIMsgHdr->ReqAddr = pBMCInfo->IpmiConfig.BMCSlaveAddr;
  1378. Req.Channel=PRIMARY_IPMB_CHANNEL;
  1379. g_BMCInfo[BMCInst].SDRConfig.IPMB_Seqnum++;
  1380. if (g_BMCInfo[BMCInst].SDRConfig.IPMB_Seqnum >= 0x3F) { g_BMCInfo[BMCInst].SDRConfig.IPMB_Seqnum = 0xFF; }
  1381. pIPMIMsgHdr->RqSeqLUN = g_BMCInfo[BMCInst].SDRConfig.IPMB_Seqnum<< 2; /* Request Seq Num */
  1382. pIPMIMsgHdr->RqSeqLUN |= BMC_LUN_00; /* LUN =00 */
  1383. Req.Param=BRIDGING_REQUEST;
  1384. pIPMIMsgHdr->Cmd = CMD_RUN_INITIALIZATION_AGENT;
  1385. Req.Data[sizeof(IPMIMsgHdr_T)]=0x1;
  1386. Req.Data [sizeof (IPMIMsgHdr_T) + 1] =
  1387. CalculateCheckSum2 (Req.Data, sizeof (IPMIMsgHdr_T) +1);
  1388. Req.Size = sizeof(IPMIMsgHdr_T) + 2; //Plus 2 for req data's
  1389. if ( -1 !=IfcQ )
  1390. {
  1391. if(0 != PostMsg(&Req, IPMB_PRIMARY_IFC_Q,BMCInst))
  1392. {
  1393. IPMI_WARNING ("SDR.c : Error posting message to IPMBIfc_Q\n");
  1394. }
  1395. pBMCInfo->MgmtTbl[i].Status =TRUE;
  1396. }
  1397. }
  1398. }
  1399. #endif
  1400. pSDRRec = SDR_GetFirstSDRRec (BMCInst);
  1401. for (i=0; i < pBMCInfo->SDRConfig.SDRRAM->NumRecords && pSDRRec != NULL; i++)
  1402. {
  1403. if (FULL_SDR_REC == pSDRRec->Type)
  1404. {
  1405. /* For all records of type 01h */
  1406. _FAR_ FullSensorRec_T* pFullRec = (_FAR_ FullSensorRec_T*)pSDRRec;
  1407. INT16U ValidMask = htoipmi_u16(0x0FFF);
  1408. // If not a threshold sensor, then 15 event bits are used.
  1409. if (pFullRec->EventTypeCode != 0x01)
  1410. {
  1411. ValidMask = htoipmi_u16(0x7FFF);
  1412. }
  1413. /* Disable Event & Scanning messages, if Disable is supported */
  1414. if (0x03 != (pFullRec->SensorCaps & 0x03))
  1415. {
  1416. SetSensorEventEnableReq_T SetSEReq;
  1417. // disable all events for sensor
  1418. SetSEReq.SensorNum = pFullRec->SensorNum;
  1419. SetSEReq.Flags = DISABLE_SELECTED_EVENT_MSG; // Event Disabled
  1420. SetSEReq.AssertionMask = ValidMask;
  1421. SetSEReq.DeAssertionMask = ValidMask;
  1422. SetSensorEventEnable ((_NEAR_ INT8U*)&SetSEReq,
  1423. sizeof (SetSensorEventEnableReq_T), CmdRes,BMCInst);
  1424. }
  1425. /* Set Sensor Type */
  1426. #if SET_SENSOR_TYPE != UNIMPLEMENTED
  1427. if (pFullRec->SensorInit & BIT2)
  1428. {
  1429. /* Set Sensor Type */
  1430. SetSensorTypeReq_T SetSensorTypeReq;
  1431. SetSensorTypeReq.SensorNum = pFullRec->SensorNum;
  1432. SetSensorTypeReq.SensorType = pFullRec->SensorType;
  1433. SetSensorTypeReq.EventTypeCode = pFullRec->EventTypeCode;
  1434. SetSensorType ((_NEAR_ INT8U*)&SetSensorTypeReq, sizeof(SetSensorTypeReq), CmdRes,BMCInst);
  1435. }
  1436. #endif
  1437. /* Set Sensor Thresholds */
  1438. {
  1439. SetSensorThresholdReq_T SetThresholdReq;
  1440. SetThresholdReq.SensorNum = pFullRec->SensorNum;
  1441. SetThresholdReq.SetFlags = ((pFullRec->DiscreteReadingMask >> 8) & 0x3F);
  1442. if (pFullRec->SensorInit & BIT4)
  1443. {
  1444. SetThresholdReq.LowerNonCritical = pFullRec->LowerNonCritical;
  1445. SetThresholdReq.LowerCritical = pFullRec->LowerCritical;
  1446. SetThresholdReq.LowerNonRecoverable = pFullRec->LowerNonRecoverable;
  1447. SetThresholdReq.UpperNonCritical = pFullRec->UpperNonCritical;
  1448. SetThresholdReq.UpperCritical = pFullRec->UpperCritical;
  1449. SetThresholdReq.UpperNonRecoverable = pFullRec->UpperNonRecoverable;
  1450. SetSensorThresholds ((_NEAR_ INT8U*)&SetThresholdReq,
  1451. sizeof (SetSensorThresholdReq_T), CmdRes,BMCInst);
  1452. }
  1453. }
  1454. /* Set Sensor Hysteresis */
  1455. {
  1456. SetSensorHysterisisReq_T SetHysteresisReq;
  1457. SetHysteresisReq.SensorNum = pFullRec->SensorNum;
  1458. SetHysteresisReq.Reserved = 0;
  1459. if (pFullRec->SensorInit & BIT3) //Added for DR#31091
  1460. {
  1461. SetHysteresisReq.PositiveHysterisis = pFullRec->PositiveHysterisis;
  1462. SetHysteresisReq.NegativeHysterisis = pFullRec->NegativeHysterisis;
  1463. SetSensorHysterisis ((_NEAR_ INT8U*)&SetHysteresisReq,
  1464. sizeof (SetSensorHysterisisReq_T), CmdRes,BMCInst);
  1465. }
  1466. }
  1467. /* Enable Event & Scanning messages, if Disabled */
  1468. if (0x03 != (pFullRec->SensorCaps & 0x03))
  1469. {
  1470. SetSensorEventEnableReq_T SetSEReq;
  1471. SetSEReq.SensorNum = pFullRec->SensorNum;
  1472. SetSEReq.Flags = (pFullRec->SensorInit & BIT6) | ((pFullRec->SensorInit & BIT5) << 2) | ENABLE_SELECTED_EVENT_MSG; // Event Enabled
  1473. SetSEReq.AssertionMask = (pFullRec->AssertionEventMask & ValidMask);
  1474. SetSEReq.DeAssertionMask = (pFullRec->DeAssertionEventMask & ValidMask);
  1475. SetSensorEventEnable ((_NEAR_ INT8U*)&SetSEReq,
  1476. sizeof (SetSensorEventEnableReq_T), CmdRes,BMCInst);
  1477. }
  1478. }
  1479. if (pSDRRec->Type == COMPACT_SDR_REC)
  1480. {
  1481. _FAR_ CompactSensorRec_T* pCompactRec = (_FAR_ CompactSensorRec_T*)pSDRRec;
  1482. INT16U ValidMask = htoipmi_u16(0x0FFF);
  1483. // If not a threshold sensor, then 15 event bits are used.
  1484. if (pCompactRec->EventTypeCode != 0x01)
  1485. {
  1486. ValidMask = htoipmi_u16(0x7FFF);
  1487. }
  1488. /* Disable Event & Scanning messages, if Disable is supported */
  1489. if (0x03 != (pCompactRec->SensorCaps & 0x03))
  1490. {
  1491. SetSensorEventEnableReq_T SetSEReq;
  1492. SetSEReq.SensorNum = pCompactRec->SensorNum;
  1493. SetSEReq.Flags = DISABLE_SELECTED_EVENT_MSG; // Event Disabled
  1494. SetSEReq.AssertionMask = ValidMask;
  1495. SetSEReq.DeAssertionMask = ValidMask;
  1496. SetSensorEventEnable ((_NEAR_ INT8U*)&SetSEReq,
  1497. sizeof (SetSensorEventEnableReq_T), CmdRes,BMCInst);
  1498. }
  1499. /* Set Sensor Type */
  1500. #if SET_SENSOR_TYPE != UNIMPLEMENTED
  1501. if (pCompactRec->SensorInit & BIT2)
  1502. {
  1503. /* Set Sensor Type */
  1504. SetSensorTypeReq_T SetSensorTypeReq;
  1505. SetSensorTypeReq.SensorNum = pCompactRec->SensorNum;
  1506. SetSensorTypeReq.SensorType = pCompactRec->SensorType;
  1507. SetSensorTypeReq.EventTypeCode = pCompactRec->EventTypeCode;
  1508. SetSensorType ((_NEAR_ INT8U*)&SetSensorTypeReq, sizeof(SetSensorTypeReq), CmdRes,BMCInst);
  1509. }
  1510. #endif
  1511. /* Set Sensor Hysteresis */
  1512. {
  1513. SetSensorHysterisisReq_T SetHysteresisReq;
  1514. SetHysteresisReq.SensorNum = pCompactRec->SensorNum;
  1515. SetHysteresisReq.Reserved = 0;
  1516. SetHysteresisReq.PositiveHysterisis = pCompactRec->PositiveHysteris;
  1517. SetHysteresisReq.NegativeHysterisis = pCompactRec->NegativeHysterisis;
  1518. SetSensorHysterisis ((_NEAR_ INT8U*)&SetHysteresisReq,
  1519. sizeof (SetSensorHysterisisReq_T), CmdRes,BMCInst);
  1520. }
  1521. /* Enable Event & Scanning messages, if Disabled */
  1522. if (0x03 != (pCompactRec->SensorCaps & 0x03))
  1523. {
  1524. SetSensorEventEnableReq_T SetSEReq;
  1525. SetSEReq.SensorNum = pCompactRec->SensorNum;
  1526. SetSEReq.Flags = (pCompactRec->SensorInit & BIT6) | ((pCompactRec->SensorInit & BIT5) << 2) |ENABLE_SELECTED_EVENT_MSG ; // Event Enabled
  1527. SetSEReq.AssertionMask = (pCompactRec->AssertionEventMask & ValidMask);
  1528. SetSEReq.DeAssertionMask = (pCompactRec->DeAssertionEventMask & ValidMask);
  1529. SetSensorEventEnable ((_NEAR_ INT8U*)&SetSEReq,
  1530. sizeof (SetSensorEventEnableReq_T), CmdRes,BMCInst);
  1531. }
  1532. }
  1533. pSDRRec = SDR_GetNextSDRRec (pSDRRec,BMCInst);
  1534. }
  1535. #if SET_EVENT_RECEIVER == 0
  1536. /* Enable Event Generation */
  1537. {
  1538. SetEvtRcvReq_T SetEvtRcvReq = { 0x20, 0 };
  1539. SetEventReceiver ((_NEAR_ INT8U*)&SetEvtRcvReq,
  1540. sizeof (SetEvtRcvReq_T), CmdRes,BMCInst);
  1541. }
  1542. #endif
  1543. #if SUPPORT_MULTI_CONTROLLER == 1
  1544. /* Sending the Set Event Reciver enable Command to all MMC in IPMB BUS */
  1545. for(i=0;i<Count;i++)
  1546. {
  1547. MsgPkt_T Req;
  1548. IPMIMsgHdr_T* pIPMIMsgHdr = (IPMIMsgHdr_T*)Req.Data;
  1549. _NEAR_ SetEvtRcvReq_T* SetEvtRcvReq = (_NEAR_ SetEvtRcvReq_T*) &Req.Data[sizeof(IPMIMsgHdr_T)];
  1550. pIPMIMsgHdr->ResAddr =pBMCInfo->MgmtTbl[i].OWNERID;
  1551. pIPMIMsgHdr->NetFnLUN = (NETFN_SENSOR<< 2) | BMC_LUN_00;
  1552. pIPMIMsgHdr->ChkSum = ~(pIPMIMsgHdr->ResAddr + pIPMIMsgHdr->NetFnLUN) + 1;
  1553. pIPMIMsgHdr->ReqAddr = pBMCInfo->IpmiConfig.BMCSlaveAddr;
  1554. Req.Channel=PRIMARY_IPMB_CHANNEL;
  1555. g_BMCInfo[BMCInst].SDRConfig.IPMB_Seqnum++;
  1556. if (g_BMCInfo[BMCInst].SDRConfig.IPMB_Seqnum >= 0x3F) { g_BMCInfo[BMCInst].SDRConfig.IPMB_Seqnum = 0xFF; }
  1557. pIPMIMsgHdr->RqSeqLUN = g_BMCInfo[BMCInst].SDRConfig.IPMB_Seqnum<< 2; /* Request Seq Num */
  1558. pIPMIMsgHdr->RqSeqLUN |= BMC_LUN_00; /* LUN =00 */
  1559. pIPMIMsgHdr->Cmd = CMD_SET_EVENT_RECEIVER;
  1560. SetEvtRcvReq->RcvSlaveAddr = pBMCInfo->IpmiConfig.BMCSlaveAddr;
  1561. SetEvtRcvReq->RcvLUN =BMC_LUN_00;
  1562. Req.Param=BRIDGING_REQUEST;
  1563. Req.Data [sizeof (IPMIMsgHdr_T) + sizeof(SetEvtRcvReq_T)] =
  1564. CalculateCheckSum2 (Req.Data, sizeof (IPMIMsgHdr_T) + sizeof(SetEvtRcvReq_T));
  1565. Req.Size = sizeof(IPMIMsgHdr_T) + sizeof(SetEvtRcvReq_T)+1; // plus 1 for checksum
  1566. /* Post Msg to IPMB task to send the set event receiver */
  1567. if ( -1 != IfcQ )
  1568. {
  1569. if(0 != PostMsg(&Req, IPMB_PRIMARY_IFC_Q,BMCInst))
  1570. {
  1571. IPMI_WARNING ("SDR.c : Error posting message to IPMBIfc_Q\n");
  1572. }
  1573. pBMCInfo->MgmtTbl[i].Status =TRUE;
  1574. }
  1575. //PDK_SMCDelay(pBMCInfo->MgmtTbl[i].OWNERID);
  1576. //PDK_SMCDelay(0x40);
  1577. //sleep(3);
  1578. }
  1579. #endif
  1580. if(g_PDKHandle[PDK_AFTERINITAGENT] != NULL)
  1581. {
  1582. ((int(*)(INT8U,int))g_PDKHandle[PDK_AFTERINITAGENT]) (CmdRes[0],BMCInst);
  1583. }
  1584. return;
  1585. }
  1586. #endif /* SDR_DEVICE */