SEL.c 102 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753
  1. /****************************************************************
  2. ****************************************************************
  3. ** **
  4. ** (C)Copyright 2005-2006, American Megatrends . **
  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. * Sel.c
  16. * Sel Command Handler
  17. *
  18. * Author: Bakka Ravinder Reddy <bakkar@ami.com>
  19. *
  20. *****************************************************************/
  21. #define ENABLE_DEBUG_MACROS 0
  22. #include <dlfcn.h>
  23. #include "Types.h"
  24. #include "Message.h"
  25. #include "MsgHndlr.h"
  26. #include "SharedMem.h"
  27. #include "PMConfig.h"
  28. #include "Debug.h"
  29. #include "Support.h"
  30. #include "IPMIDefs.h"
  31. #include "IPMI_SEL.h"
  32. #include "SELRecord.h"
  33. #include "NVRAccess.h"
  34. #include "SEL.h"
  35. #include "PEF.h"
  36. #include "Util.h"
  37. #include "IPMI_KCS.h"
  38. #include "IPMIConf.h"
  39. #include "PDKAccess.h"
  40. #include "PDKDefs.h"
  41. #include "IPMI_IPM.h"
  42. #include "IPMDevice.h"
  43. #include "IPMI_Storage.h"
  44. #include "PDKCmdsAccess.h"
  45. #include "IPMI_Sensor.h"
  46. #include "featuredef.h"
  47. #include <dirent.h>
  48. #include "video_misc.h"
  49. #include "SSIAccess.h"
  50. #include "aes.h"
  51. #include "safesystem.h"
  52. /* Reserved bit macro definitions */
  53. #define RESERVED_BITS_PARTIALADDSELENTRY 0xF0 //(BIT7 | BIT6 | BIT5 | BIT4)
  54. #if SEL_DEVICE == 1
  55. /*** Local Definitions ***/
  56. #define SEL_RECORD_SIZE 16
  57. #define CLR_SEL_PASSWORD_STR_LEN 3
  58. #define CLEAR_SEL_GET_STATUS 0x00
  59. #define CLEAR_SEL_ACTION 0xaa
  60. #define SEL_ERASE_IN_PROGRESS 0x00
  61. #define SEL_ERASE_COMPLETED 0x01
  62. #define SEL_ALLOC_UNIT_SIZE 0x10
  63. #define SEL_MAX_RECORD_SIZE 0x10
  64. #define INVALID_RECORD_ID 0x00
  65. #define OVERFLOW_FLAG 0x80
  66. #define DELETE_SEL_SUPPORT 0x08
  67. #define PARTIAL_ADD_SEL_SUPPORT 0x04
  68. #define RESERVE_SEL_SUPPORT 0x02
  69. #define GET_SEL_ALLOC_SUPPORT 0x01
  70. #define NO_SUPPORT 0x00
  71. #define STATUS_DELETE_SEL 0xA5
  72. #define SEL_ALMOST_FULL_PERCENTAGE 75
  73. #define SEL_PARTIAL_ADD_REQUEST_MISC_BYTES 6
  74. #define SEL_PARTIAL_ADD_CMD_MAX_LEN 22
  75. #define SEL_INITIALIZED 0x01
  76. #define SEL_UNINITIALIZED 0x00
  77. #if SET_SEL_TIME != UNIMPLEMENTED || SET_SEL_TIME_UTC_OFFSET != UNIMPLEMENTED
  78. #define CMD_LEN 128
  79. #define LINK_CMD "ln -sf"
  80. #define ZONEINFO_DIR "/usr/share/zoneinfo/Etc"
  81. #define LOCALTIME "/conf/localtime"
  82. #define UTC_MAX_RANGE 720
  83. #define UTC_MIN_RANGE -720
  84. #endif // SET_SEL_TIME_UTC_OFFSET
  85. #define PRE_CLK_SET 0x00
  86. #define POST_CLK_SET 0x80
  87. //Capture BSOD
  88. #define CRASH_SCREEN_DIRECTORY "/var/bsod"
  89. #define CRASH_SCREEN_FILE "/var/bsod/crashscreen.cap"
  90. #define CRASH_SCREEN_FILE_JPEG "/var/bsod/crashscreen.jpeg"
  91. #define VIDEO_LIB "/usr/local/lib/libvideo.so"
  92. #define CAP_CRASHSCREEN_FUNC "Capture_CrashScreen"
  93. #define BSOD_CAPTURE 0x2
  94. #define CMD_COMM_PIPE "/var/cmdpipe"
  95. /*** Prototype Declaration ***/
  96. static _FAR_ SELRec_T* GetNextSELEntry (_FAR_ SELRec_T* rec, int BMCInst);
  97. static _FAR_ SELRec_T* GetSELRec(INT16U RecID,int BMCInst);
  98. static _FAR_ void FindRecOrder(int BMCInst);
  99. static INT8U SELTimeClockSync(INT8U Action, int BMCInst);
  100. /*** Global variables ***/
  101. /*** Module variables ***/
  102. _FAR_ SELRepository_T* _FAR_ m_sel;
  103. //Added for Partial Adding
  104. //SELEventRecord_T SelPartialAddRecord;
  105. #define SENSOR_TYPE_EVT_LOGGING 0x10
  106. /* Clear and Full Event Log Message */
  107. static INT8U m_SELEventMsg [] = {
  108. 0x00, 0x00, //Record ID
  109. 0x02, //Record Type is System
  110. 0x00, 0x00, 0x00, 0x00, //TimeStamp
  111. 0x20, 0x00, //Generator ID is BMC
  112. IPMI_EVM_REVISION,
  113. SENSOR_TYPE_EVT_LOGGING,
  114. 0xFF,
  115. 0xFF,
  116. 0xFF,
  117. 0xFF,
  118. 0xFF
  119. };
  120. /* System Event Message */
  121. static INT8U m_SysEventMsg [] = {
  122. 0x00, 0x00, //Record ID
  123. 0x02, //Record Type is System
  124. 0x00, 0x00, 0x00, 0x00, //TimeStamp
  125. 0x20, 0x00, //Generator ID is BMC
  126. IPMI_EVM_REVISION,
  127. SENSOR_TYPE_SYSTEM_EVENT,
  128. 0x6F,
  129. 0xFF,
  130. 0xFF,
  131. 0xFF,
  132. 0xFF
  133. };
  134. //for BSOD
  135. typedef struct
  136. {
  137. unsigned short cmd;
  138. unsigned short datalen;
  139. } __attribute__((packed)) cmd_info_t;
  140. /*---------------------------------------
  141. * LogClearSELEvent
  142. *---------------------------------------*/
  143. void
  144. LogClearSELEvent (int BMCInst)
  145. {
  146. AddSELRes_T AddSelRes;
  147. SensorInfo_T* pSensorInfo;
  148. _FAR_ BMCInfo_t* pBMCInfo = &g_BMCInfo[BMCInst];
  149. pSensorInfo = (SensorInfo_T*)GetSensorInfoFromSensorType(SENSOR_TYPE_EVT_LOGGING, BMCInst);
  150. if (pSensorInfo != NULL)
  151. {
  152. // make sure the assertion event log is enabled
  153. if ((pSensorInfo->AssertionEventEnablesByte1 & (1 << EVENT_LOG_AREA_RESET)))
  154. {
  155. pBMCInfo->SELConfig.SELEventMsg [11] = pSensorInfo->SensorNumber;
  156. pBMCInfo->SELConfig.SELEventMsg [12] = 0x6F; // Sensor Specific Event Type;
  157. pBMCInfo->SELConfig.SELEventMsg [13] = EVENT_LOG_AREA_RESET;
  158. pBMCInfo->SELConfig.SELEventMsg [15] = pBMCInfo->SELConfig.SELEventMsg [14] = 0xFF;
  159. /* Add clear SEL Event */
  160. AddSELEntry (&pBMCInfo->SELConfig.SELEventMsg[0], sizeof (pBMCInfo->SELConfig.SELEventMsg), (INT8U*)&AddSelRes,BMCInst);
  161. }
  162. }
  163. }
  164. /*---------------------------------------
  165. * LogSELFullEvent
  166. *---------------------------------------*/
  167. void
  168. LogSELFullEvent (int BMCInst)
  169. {
  170. AddSELRes_T AddSelRes;
  171. SensorInfo_T* pSensorInfo;
  172. INT8U *curchannel;
  173. pSensorInfo = (SensorInfo_T*)GetSensorInfoFromSensorType(SENSOR_TYPE_EVT_LOGGING, BMCInst);
  174. _FAR_ BMCInfo_t* pBMCInfo = &g_BMCInfo[BMCInst];
  175. if (pSensorInfo != NULL)
  176. {
  177. // make sure the assertion event log is enabled
  178. if ((pSensorInfo->AssertionEventEnablesByte1 & (1 << EVENT_SEL_IS_FULL)))
  179. {
  180. pBMCInfo->SELConfig.SELEventMsg [11] = pSensorInfo->SensorNumber;
  181. pBMCInfo->SELConfig.SELEventMsg [12] = 0x6F; // Sensor Specific Event Type;
  182. pBMCInfo->SELConfig.SELEventMsg [13] = EVENT_SEL_IS_FULL;
  183. pBMCInfo->SELConfig.SELEventMsg [15] = pBMCInfo->SELConfig.SELEventMsg [14] = 0xFF;
  184. OS_THREAD_TLS_GET(g_tls.CurChannel,curchannel);
  185. /* Add SEL Full Event */
  186. LockedAddSELEntry (&pBMCInfo->SELConfig.SELEventMsg[0], sizeof (pBMCInfo->SELConfig.SELEventMsg), (INT8U*)&AddSelRes,
  187. FALSE,POST_SEL_AND_PEF,BMCInst);
  188. }
  189. }
  190. }
  191. /*---------------------------------------
  192. * PostSELToPEF
  193. *---------------------------------------*/
  194. int
  195. PostSELToPEF (SELEventRecord_T *pSELRec, int BMCInst)
  196. {
  197. MsgPkt_T MsgToPEF;
  198. /* PEF Action related Event messages are discarded */
  199. if((pSELRec->SensorType == SENSOR_TYPE_SYSTEM_EVENT) &&
  200. (pSELRec->EvtData1 == PEF_ACTION_SEN_SPECIFIC_OFFSET) &&
  201. ((pSELRec->EvtDirType & 0x7F) == SENSOR_SPECIFIC_READ_TYPE))
  202. {
  203. return 0;
  204. }
  205. MsgToPEF.Param = PARAM_SENSOR_EVT_MSG;
  206. MsgToPEF.Size = sizeof (SELEventRecord_T);
  207. _fmemcpy ((_FAR_ INT8U*)MsgToPEF.Data, (_FAR_ INT8U*)pSELRec,
  208. sizeof(SELEventRecord_T));
  209. IPMI_DBG_PRINT ("Posting Message to PEF\n");
  210. PostMsgNonBlock (&MsgToPEF, PEF_TASK_Q,BMCInst);
  211. return 0;
  212. }
  213. /*-----------------------------------------------------------------
  214. * @fn CheckLastSELRecordID
  215. *
  216. * @brief This function is called after PEF Postpone timer expires.
  217. * When LastSELRecordID and LastSWProcessedEventID are mismatch,
  218. * BMC will automatically perform PEF against any existing,
  219. * unprocessed events in SEL. Please refer IPMI spec 17.4.1 for details.
  220. *
  221. * @param BMCInst
  222. *-----------------------------------------------------------------*/
  223. void
  224. CheckLastSELRecordID (int BMCInst)
  225. {
  226. _FAR_ BMCInfo_t* pBMCInfo = &g_BMCInfo[BMCInst];
  227. _FAR_ PEFRecordDetailsConfig_T* pPEFRecordDetailsConfig;
  228. INT16U i;
  229. _FAR_ SELRepository_T* _FAR_ m_sel = NULL;
  230. INT32U MaxAllowRec = 0;
  231. int Recpos,BMCRecpos=0,SWRecpos=0;
  232. struct SELEventNode *LastProcessedNode = NULL;
  233. if(g_corefeatures.del_sel_reclaim_support != ENABLED)
  234. {
  235. m_sel = (_FAR_ SELRepository_T*) GetSDRSELNVRAddr((pBMCInfo->IpmiConfig.SDRAllocationSize * 1024), BMCInst);
  236. m_sel->SELRecord = (SELRec_T *)GetSDRSELNVRAddr ((pBMCInfo->IpmiConfig.SDRAllocationSize * 1024) + sizeof(SELRepository_T), BMCInst);
  237. pBMCInfo->SELConfig.LastEvtTS = (m_sel->AddTimeStamp > m_sel->EraseTimeStamp) ? m_sel->AddTimeStamp : m_sel->EraseTimeStamp;
  238. }
  239. else
  240. {
  241. pBMCInfo->SELConfig.LastEvtTS = (pBMCInfo->SELReclaimRepos.pSELReclaimInfo->AddTimeStamp > pBMCInfo->SELReclaimRepos.pSELReclaimInfo->EraseTimeStamp) ?
  242. pBMCInfo->SELReclaimRepos.pSELReclaimInfo->AddTimeStamp : pBMCInfo->SELReclaimRepos.pSELReclaimInfo->EraseTimeStamp;
  243. }
  244. pPEFRecordDetailsConfig = &pBMCInfo->PEFRecordDetailsConfig;
  245. /* Check if there any records in SEL */
  246. if (0xFFFF != pPEFRecordDetailsConfig->LastSELRecordID)
  247. {
  248. INT16U LastProcessedID = 0;
  249. if(g_corefeatures.del_sel_reclaim_support != ENABLED)
  250. {
  251. if((pPEFRecordDetailsConfig->LastSELRecordID > pPEFRecordDetailsConfig->LastBMCProcessedEventID)
  252. && (0 != pPEFRecordDetailsConfig->LastBMCProcessedEventID)
  253. && (pPEFRecordDetailsConfig->LastSELRecordID > pPEFRecordDetailsConfig->LastSWProcessedEventID))
  254. {
  255. /* Process all events that were not either processed by BMC or SW */
  256. LastProcessedID = (pPEFRecordDetailsConfig->LastBMCProcessedEventID > pPEFRecordDetailsConfig->LastSWProcessedEventID) ?
  257. pPEFRecordDetailsConfig->LastBMCProcessedEventID : pPEFRecordDetailsConfig->LastSWProcessedEventID;
  258. }
  259. else if (0xFFFF == pPEFRecordDetailsConfig->LastBMCProcessedEventID)
  260. {
  261. if (0xFFFF == pPEFRecordDetailsConfig->LastSWProcessedEventID)
  262. {
  263. /* Neither BMC nor SW processed any event in the SEL; So process all now */
  264. LastProcessedID = 0xFFFF;
  265. }
  266. else
  267. {
  268. /* If BMC didn't process any event, but SW did, then process the remaining events */
  269. LastProcessedID = pPEFRecordDetailsConfig->LastSWProcessedEventID;
  270. }
  271. }
  272. else if (0xFFFF == pPEFRecordDetailsConfig->LastSWProcessedEventID)
  273. {
  274. /* If SW didn't process any event, but BMC did, then process the remaining events */
  275. LastProcessedID = pPEFRecordDetailsConfig->LastBMCProcessedEventID;
  276. }
  277. /* If there any event to be processed, notify PEF */
  278. if (LastProcessedID)
  279. {
  280. _FAR_ SELRec_T* pSelRec;
  281. if (0xFFFF == LastProcessedID)
  282. LastProcessedID = 1;
  283. else
  284. LastProcessedID++;
  285. for (i = LastProcessedID; i <= (pPEFRecordDetailsConfig->LastSELRecordID); i++)
  286. {
  287. pSelRec = GetSELRec(i,BMCInst);
  288. if (pSelRec != 0)
  289. {
  290. PostSELToPEF (&(pSelRec->EvtRecord), BMCInst);
  291. }
  292. }
  293. }
  294. }
  295. else
  296. {
  297. if(pPEFRecordDetailsConfig->LastBMCProcessedEventID==0)
  298. {
  299. return ;
  300. }
  301. MaxAllowRec = ((pBMCInfo->IpmiConfig.SELAllocationSize) * 1024)/sizeof(SELRec_T);
  302. /* Checking the Record id for processing */
  303. if(((pPEFRecordDetailsConfig->LastSELRecordID != 0xFFFF) && (pPEFRecordDetailsConfig->LastSELRecordID > MaxAllowRec))||
  304. ((pPEFRecordDetailsConfig->LastBMCProcessedEventID != 0xFFFF) && (pPEFRecordDetailsConfig->LastBMCProcessedEventID > MaxAllowRec))
  305. ||((pPEFRecordDetailsConfig->LastSWProcessedEventID != 0xFFFF) && (pPEFRecordDetailsConfig->LastSWProcessedEventID > MaxAllowRec)))
  306. {
  307. pBMCInfo->PEFRecordDetailsConfig.LastSELRecordID = 0xffff;
  308. pBMCInfo->PEFRecordDetailsConfig.LastSWProcessedEventID = 0xffff;
  309. pBMCInfo->PEFRecordDetailsConfig.LastBMCProcessedEventID = 0xffff;
  310. /* Flush the values to NVRAM */
  311. FlushIPMI((INT8U*)&pBMCInfo->PEFRecordDetailsConfig,(INT8U*)&pBMCInfo->PEFRecordDetailsConfig.LastSELRecordID,
  312. pBMCInfo->IPMIConfLoc.PEFRecordDetailsConfigAddr,sizeof(INT16U),BMCInst);
  313. FlushIPMI((INT8U*)&pBMCInfo->PEFRecordDetailsConfig,(INT8U*)&pBMCInfo->PEFRecordDetailsConfig.LastSWProcessedEventID,
  314. pBMCInfo->IPMIConfLoc.PEFRecordDetailsConfigAddr,sizeof(INT16U),BMCInst);
  315. FlushIPMI((INT8U*)&pBMCInfo->PEFRecordDetailsConfig,(INT8U*)&pBMCInfo->PEFRecordDetailsConfig.LastBMCProcessedEventID,
  316. pBMCInfo->IPMIConfLoc.PEFRecordDetailsConfigAddr,sizeof(INT16U),BMCInst);
  317. return;
  318. }
  319. if(SEL_RECORD_ADDR(BMCInst,pPEFRecordDetailsConfig->LastSELRecordID).RecAddr != NULL)
  320. {
  321. Recpos = SEL_RECORD_ADDR(BMCInst,pPEFRecordDetailsConfig->LastSELRecordID).RecPos;
  322. }
  323. else
  324. {
  325. pBMCInfo->PEFRecordDetailsConfig.LastSELRecordID = 0xffff;
  326. pBMCInfo->PEFRecordDetailsConfig.LastSWProcessedEventID = 0xffff;
  327. pBMCInfo->PEFRecordDetailsConfig.LastBMCProcessedEventID = 0xffff;
  328. /* Flush the values to NVRAM */
  329. FlushIPMI((INT8U*)&pBMCInfo->PEFRecordDetailsConfig,(INT8U*)&pBMCInfo->PEFRecordDetailsConfig.LastSELRecordID,
  330. pBMCInfo->IPMIConfLoc.PEFRecordDetailsConfigAddr,sizeof(INT16U),BMCInst);
  331. FlushIPMI((INT8U*)&pBMCInfo->PEFRecordDetailsConfig,(INT8U*)&pBMCInfo->PEFRecordDetailsConfig.LastSWProcessedEventID,
  332. pBMCInfo->IPMIConfLoc.PEFRecordDetailsConfigAddr,sizeof(INT16U),BMCInst);
  333. FlushIPMI((INT8U*)&pBMCInfo->PEFRecordDetailsConfig,(INT8U*)&pBMCInfo->PEFRecordDetailsConfig.LastBMCProcessedEventID,
  334. pBMCInfo->IPMIConfLoc.PEFRecordDetailsConfigAddr,sizeof(INT16U),BMCInst);
  335. return;
  336. }
  337. if((pPEFRecordDetailsConfig->LastBMCProcessedEventID)!=0xFFFF)
  338. {
  339. if(SEL_RECORD_ADDR(BMCInst, pPEFRecordDetailsConfig->LastBMCProcessedEventID).RecAddr!= NULL)
  340. {
  341. BMCRecpos=SEL_RECORD_ADDR(BMCInst, pPEFRecordDetailsConfig->LastBMCProcessedEventID).RecPos;
  342. }
  343. else
  344. {
  345. pBMCInfo->PEFRecordDetailsConfig.LastSELRecordID = 0xffff;
  346. pBMCInfo->PEFRecordDetailsConfig.LastSWProcessedEventID = 0xffff;
  347. pBMCInfo->PEFRecordDetailsConfig.LastBMCProcessedEventID = 0xffff;
  348. /* Flush the values to NVRAM */
  349. FlushIPMI((INT8U*)&pBMCInfo->PEFRecordDetailsConfig,(INT8U*)&pBMCInfo->PEFRecordDetailsConfig.LastSELRecordID,
  350. pBMCInfo->IPMIConfLoc.PEFRecordDetailsConfigAddr,sizeof(INT16U),BMCInst);
  351. FlushIPMI((INT8U*)&pBMCInfo->PEFRecordDetailsConfig,(INT8U*)&pBMCInfo->PEFRecordDetailsConfig.LastSWProcessedEventID,
  352. pBMCInfo->IPMIConfLoc.PEFRecordDetailsConfigAddr,sizeof(INT16U),BMCInst);
  353. FlushIPMI((INT8U*)&pBMCInfo->PEFRecordDetailsConfig,(INT8U*)&pBMCInfo->PEFRecordDetailsConfig.LastBMCProcessedEventID,
  354. pBMCInfo->IPMIConfLoc.PEFRecordDetailsConfigAddr,sizeof(INT16U),BMCInst);
  355. return;
  356. }
  357. }
  358. if((pPEFRecordDetailsConfig->LastSWProcessedEventID)!=0xFFFF)
  359. {
  360. if(SEL_RECORD_ADDR(BMCInst, pPEFRecordDetailsConfig->LastSWProcessedEventID).RecAddr != NULL)
  361. {
  362. SWRecpos=SEL_RECORD_ADDR(BMCInst, pPEFRecordDetailsConfig->LastSWProcessedEventID).RecPos;
  363. }
  364. else
  365. {
  366. pBMCInfo->PEFRecordDetailsConfig.LastSELRecordID = 0xffff;
  367. pBMCInfo->PEFRecordDetailsConfig.LastSWProcessedEventID = 0xffff;
  368. pBMCInfo->PEFRecordDetailsConfig.LastBMCProcessedEventID = 0xffff;
  369. /* Flush the values to NVRAM */
  370. FlushIPMI((INT8U*)&pBMCInfo->PEFRecordDetailsConfig,(INT8U*)&pBMCInfo->PEFRecordDetailsConfig.LastSELRecordID,
  371. pBMCInfo->IPMIConfLoc.PEFRecordDetailsConfigAddr,sizeof(INT16U),BMCInst);
  372. FlushIPMI((INT8U*)&pBMCInfo->PEFRecordDetailsConfig,(INT8U*)&pBMCInfo->PEFRecordDetailsConfig.LastSWProcessedEventID,
  373. pBMCInfo->IPMIConfLoc.PEFRecordDetailsConfigAddr,sizeof(INT16U),BMCInst);
  374. FlushIPMI((INT8U*)&pBMCInfo->PEFRecordDetailsConfig,(INT8U*)&pBMCInfo->PEFRecordDetailsConfig.LastBMCProcessedEventID,
  375. pBMCInfo->IPMIConfLoc.PEFRecordDetailsConfigAddr,sizeof(INT16U),BMCInst);
  376. return;
  377. }
  378. }
  379. if (0xFFFF == pPEFRecordDetailsConfig->LastBMCProcessedEventID)
  380. {
  381. if (0xFFFF == pPEFRecordDetailsConfig->LastSWProcessedEventID)
  382. {
  383. /* Neither BMC nor SW processed any event in the SEL; So process all now */
  384. if(SEL_RECLAIM_HEAD_NODE(BMCInst) != NULL)
  385. {
  386. LastProcessedNode = SEL_RECLAIM_HEAD_NODE(BMCInst);
  387. }
  388. else
  389. {
  390. pBMCInfo->PEFRecordDetailsConfig.LastSELRecordID = 0xffff;
  391. pBMCInfo->PEFRecordDetailsConfig.LastSWProcessedEventID = 0xffff;
  392. pBMCInfo->PEFRecordDetailsConfig.LastBMCProcessedEventID = 0xffff;
  393. /* Flush the values to NVRAM */
  394. FlushIPMI((INT8U*)&pBMCInfo->PEFRecordDetailsConfig,(INT8U*)&pBMCInfo->PEFRecordDetailsConfig.LastSELRecordID,
  395. pBMCInfo->IPMIConfLoc.PEFRecordDetailsConfigAddr,sizeof(INT16U),BMCInst);
  396. FlushIPMI((INT8U*)&pBMCInfo->PEFRecordDetailsConfig,(INT8U*)&pBMCInfo->PEFRecordDetailsConfig.LastSWProcessedEventID,
  397. pBMCInfo->IPMIConfLoc.PEFRecordDetailsConfigAddr,sizeof(INT16U),BMCInst);
  398. FlushIPMI((INT8U*)&pBMCInfo->PEFRecordDetailsConfig,(INT8U*)&pBMCInfo->PEFRecordDetailsConfig.LastBMCProcessedEventID,
  399. pBMCInfo->IPMIConfLoc.PEFRecordDetailsConfigAddr,sizeof(INT16U),BMCInst);
  400. return;
  401. }
  402. }
  403. else
  404. {
  405. /* If BMC didn't process any event, but SW did, then process the remaining events */
  406. if(SEL_RECORD_ADDR(BMCInst,pPEFRecordDetailsConfig->LastSWProcessedEventID).RecAddr != NULL)
  407. {
  408. LastProcessedNode = SEL_RECORD_ADDR(BMCInst,pPEFRecordDetailsConfig->LastSWProcessedEventID).RecAddr->NextRec;
  409. }
  410. else
  411. {
  412. pBMCInfo->PEFRecordDetailsConfig.LastSELRecordID = 0xffff;
  413. pBMCInfo->PEFRecordDetailsConfig.LastSWProcessedEventID = 0xffff;
  414. pBMCInfo->PEFRecordDetailsConfig.LastBMCProcessedEventID = 0xffff;
  415. /* Flush the values to NVRAM */
  416. FlushIPMI((INT8U*)&pBMCInfo->PEFRecordDetailsConfig,(INT8U*)&pBMCInfo->PEFRecordDetailsConfig.LastSELRecordID,
  417. pBMCInfo->IPMIConfLoc.PEFRecordDetailsConfigAddr,sizeof(INT16U),BMCInst);
  418. FlushIPMI((INT8U*)&pBMCInfo->PEFRecordDetailsConfig,(INT8U*)&pBMCInfo->PEFRecordDetailsConfig.LastSWProcessedEventID,
  419. pBMCInfo->IPMIConfLoc.PEFRecordDetailsConfigAddr,sizeof(INT16U),BMCInst);
  420. FlushIPMI((INT8U*)&pBMCInfo->PEFRecordDetailsConfig,(INT8U*)&pBMCInfo->PEFRecordDetailsConfig.LastBMCProcessedEventID,
  421. pBMCInfo->IPMIConfLoc.PEFRecordDetailsConfigAddr,sizeof(INT16U),BMCInst);
  422. return;
  423. }
  424. }
  425. }
  426. else if (0xFFFF == pPEFRecordDetailsConfig->LastSWProcessedEventID)
  427. {
  428. /* If SW didn't process any event, but BMC did, then process the remaining events */
  429. if(SEL_RECORD_ADDR(BMCInst,pPEFRecordDetailsConfig->LastBMCProcessedEventID).RecAddr != NULL)
  430. {
  431. LastProcessedNode = SEL_RECORD_ADDR(BMCInst,pPEFRecordDetailsConfig->LastBMCProcessedEventID).RecAddr->NextRec;
  432. }
  433. else
  434. {
  435. pBMCInfo->PEFRecordDetailsConfig.LastSELRecordID = 0xffff;
  436. pBMCInfo->PEFRecordDetailsConfig.LastSWProcessedEventID = 0xffff;
  437. pBMCInfo->PEFRecordDetailsConfig.LastBMCProcessedEventID = 0xffff;
  438. /* Flush the values to NVRAM */
  439. FlushIPMI((INT8U*)&pBMCInfo->PEFRecordDetailsConfig,(INT8U*)&pBMCInfo->PEFRecordDetailsConfig.LastSELRecordID,
  440. pBMCInfo->IPMIConfLoc.PEFRecordDetailsConfigAddr,sizeof(INT16U),BMCInst);
  441. FlushIPMI((INT8U*)&pBMCInfo->PEFRecordDetailsConfig,(INT8U*)&pBMCInfo->PEFRecordDetailsConfig.LastSWProcessedEventID,
  442. pBMCInfo->IPMIConfLoc.PEFRecordDetailsConfigAddr,sizeof(INT16U),BMCInst);
  443. FlushIPMI((INT8U*)&pBMCInfo->PEFRecordDetailsConfig,(INT8U*)&pBMCInfo->PEFRecordDetailsConfig.LastBMCProcessedEventID,
  444. pBMCInfo->IPMIConfLoc.PEFRecordDetailsConfigAddr,sizeof(INT16U),BMCInst);
  445. return;
  446. }
  447. }
  448. else if(( Recpos > BMCRecpos )&& (0 != pPEFRecordDetailsConfig->LastBMCProcessedEventID)&& (Recpos > SWRecpos))
  449. {
  450. /* Process all events that were not either processed by BMC or SW */
  451. LastProcessedID= (BMCRecpos > SWRecpos) ? pPEFRecordDetailsConfig->LastBMCProcessedEventID : pPEFRecordDetailsConfig->LastSWProcessedEventID;
  452. if(SEL_RECORD_ADDR(BMCInst,LastProcessedID).RecAddr != NULL)
  453. {
  454. LastProcessedNode = SEL_RECORD_ADDR(BMCInst,LastProcessedID).RecAddr->NextRec;
  455. }
  456. else
  457. {
  458. pBMCInfo->PEFRecordDetailsConfig.LastSELRecordID = 0xffff;
  459. pBMCInfo->PEFRecordDetailsConfig.LastSWProcessedEventID = 0xffff;
  460. pBMCInfo->PEFRecordDetailsConfig.LastBMCProcessedEventID = 0xffff;
  461. /* Flush the values to NVRAM */
  462. FlushIPMI((INT8U*)&pBMCInfo->PEFRecordDetailsConfig,(INT8U*)&pBMCInfo->PEFRecordDetailsConfig.LastSELRecordID,
  463. pBMCInfo->IPMIConfLoc.PEFRecordDetailsConfigAddr,sizeof(INT16U),BMCInst);
  464. FlushIPMI((INT8U*)&pBMCInfo->PEFRecordDetailsConfig,(INT8U*)&pBMCInfo->PEFRecordDetailsConfig.LastSWProcessedEventID,
  465. pBMCInfo->IPMIConfLoc.PEFRecordDetailsConfigAddr,sizeof(INT16U),BMCInst);
  466. FlushIPMI((INT8U*)&pBMCInfo->PEFRecordDetailsConfig,(INT8U*)&pBMCInfo->PEFRecordDetailsConfig.LastBMCProcessedEventID,
  467. pBMCInfo->IPMIConfLoc.PEFRecordDetailsConfigAddr,sizeof(INT16U),BMCInst);
  468. return;
  469. }
  470. }
  471. IPMI_DBG_PRINT_2("in Init SEL %d %d\n",LastProcessedID,pPEFRecordDetailsConfig->LastSELRecordID);
  472. /* If there any event to be processed, notify PEF */
  473. _FAR_ SELRec_T* pSelRec;
  474. while (LastProcessedNode)
  475. {
  476. pSelRec = &(LastProcessedNode->SELRecord);
  477. if (pSelRec != 0)
  478. {
  479. PostSELToPEF (&(pSelRec->EvtRecord), BMCInst);
  480. }
  481. LastProcessedNode=LastProcessedNode->NextRec;
  482. }
  483. }
  484. }
  485. }
  486. /*---------------------------------------
  487. * InitSEL
  488. *---------------------------------------*/
  489. int
  490. InitSEL (int BMCInst)
  491. {
  492. _FAR_ SELRec_T* pSELRecord;
  493. _FAR_ BMCInfo_t* pBMCInfo = &g_BMCInfo[BMCInst];
  494. _FAR_ SELRepository_T* _FAR_ m_sel = NULL;
  495. int ReclaimSELSpace = 0;
  496. if(g_corefeatures.del_sel_reclaim_support == ENABLED)
  497. {
  498. ReclaimSELSpace = ENABLED;
  499. }
  500. OS_THREAD_MUTEX_ACQUIRE(&pBMCInfo->SELConfig.SELMutex, WAIT_INFINITE);
  501. memcpy(&pBMCInfo->SELConfig.SELEventMsg[0],m_SELEventMsg, sizeof(pBMCInfo->SELConfig.SELEventMsg));
  502. if(!ReclaimSELSpace)
  503. {
  504. m_sel = (_FAR_ SELRepository_T*) GetSDRSELNVRAddr((pBMCInfo->IpmiConfig.SDRAllocationSize * 1024), BMCInst);
  505. m_sel->SELRecord = (SELRec_T *)GetSDRSELNVRAddr ((pBMCInfo->IpmiConfig.SDRAllocationSize * 1024) + sizeof(SELRepository_T), BMCInst);
  506. pBMCInfo->SELConfig.LastEvtTS = (m_sel->AddTimeStamp > m_sel->EraseTimeStamp) ?
  507. m_sel->AddTimeStamp : m_sel->EraseTimeStamp;
  508. pBMCInfo->SELConfig.MaxSELRecord = (((pBMCInfo->IpmiConfig.SELAllocationSize *1024) -1) - sizeof(SELRepository_T)) / sizeof(SELRec_T);
  509. }
  510. else
  511. {
  512. pBMCInfo->SELConfig.LastEvtTS = (pBMCInfo->SELReclaimRepos.pSELReclaimInfo->AddTimeStamp > pBMCInfo->SELReclaimRepos.pSELReclaimInfo->EraseTimeStamp) ?
  513. pBMCInfo->SELReclaimRepos.pSELReclaimInfo->AddTimeStamp : pBMCInfo->SELReclaimRepos.pSELReclaimInfo->EraseTimeStamp;
  514. pBMCInfo->SELConfig.MaxSELRecord = ((pBMCInfo->IpmiConfig.SELAllocationSize * 1024)-1)/sizeof(SELRec_T);
  515. }
  516. pBMCInfo->SELConfig.RsrvIDCancelled = TRUE;
  517. pBMCInfo->SELConfig.SELOverFlow = FALSE;
  518. if(BMC_GET_SHARED_MEM (BMCInst)->InitSELDone == SEL_UNINITIALIZED)
  519. {
  520. //To get the data across the processes added in Shared memory structure in SharedMem.h
  521. BMC_GET_SHARED_MEM (BMCInst)->m_LastRecID = 0;
  522. BMC_GET_SHARED_MEM (BMCInst)->m_FirstRecID = 0;
  523. BMC_GET_SHARED_MEM (BMCInst)->m_SELIndex = 0;
  524. BMC_GET_SHARED_MEM (BMCInst)->InitSELDone = SEL_INITIALIZED;
  525. //To get the data across the processes added in Shared memory structure in SharedMem.
  526. if(!ReclaimSELSpace)
  527. {
  528. m_sel->NumRecords = 0;
  529. pSELRecord = m_sel->SELRecord;
  530. while (1)
  531. {
  532. if (VALID_RECORD == pSELRecord->Valid)
  533. {
  534. m_sel->NumRecords++;
  535. BMC_GET_SHARED_MEM (BMCInst)->m_LastRecID = pSELRecord->EvtRecord.hdr.ID;
  536. BMC_GET_SHARED_MEM (BMCInst)->m_SELIndex +=1;
  537. if(BMC_GET_SHARED_MEM (BMCInst)->m_FirstRecID == 0)
  538. {
  539. BMC_GET_SHARED_MEM (BMCInst)->m_FirstRecID = pSELRecord->EvtRecord.hdr.ID;
  540. }
  541. pSELRecord++;
  542. }
  543. else if (STATUS_DELETE_SEL == pSELRecord->Valid)
  544. {
  545. pSELRecord++;
  546. m_sel->NumRecords++;
  547. BMC_GET_SHARED_MEM (BMCInst)->m_SELIndex += 1;
  548. }
  549. else
  550. {
  551. break;
  552. }
  553. }
  554. /*Update the First and Last Record ID for CircularSEL*/
  555. if(m_sel->NumRecords == pBMCInfo->SELConfig.MaxSELRecord)
  556. {
  557. FindRecOrder(BMCInst);
  558. }
  559. IPMI_DBG_PRINT_1("Num SEL Records = %x\n", m_sel->NumRecords);
  560. }
  561. else
  562. {
  563. if(SEL_RECLAIM_HEAD_NODE(BMCInst) != NULL)
  564. {
  565. BMC_GET_SHARED_MEM (BMCInst)->m_FirstRecID= SEL_RECLAIM_HEAD_NODE(BMCInst)->SELRecord.EvtRecord.hdr.ID;
  566. BMC_GET_SHARED_MEM (BMCInst)->m_LastRecID = SEL_RECLAIM_HEAD_NODE(BMCInst)->SELRecord.EvtRecord.hdr.ID;
  567. }
  568. if(SEL_RECLAIM_TAIL_NODE(BMCInst) != NULL)
  569. {
  570. BMC_GET_SHARED_MEM (BMCInst)->m_LastRecID = SEL_RECLAIM_TAIL_NODE(BMCInst)->SELRecord.EvtRecord.hdr.ID;
  571. }
  572. }
  573. if(g_PDKHandle[PDK_GETSELLIMIT] != NULL)
  574. {
  575. pBMCInfo->SELConfig.SELLimit =((INT8U(*)(int)) g_PDKHandle[PDK_GETSELLIMIT])(BMCInst);
  576. }
  577. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->SELConfig.SELMutex);
  578. }
  579. else
  580. {
  581. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->SELConfig.SELMutex);
  582. }
  583. if(g_BMCInfo[BMCInst].PefConfig.PEFTmrMgr.TmrArmed==FALSE)
  584. {
  585. pBMCInfo->PefConfig.PEFTmrMgr.TakePEFAction = TRUE;
  586. }
  587. CheckLastSELRecordID (BMCInst);
  588. return 0;
  589. }
  590. /*---------------------------------------
  591. * GetSELInfo
  592. *---------------------------------------*/
  593. int
  594. GetSELInfo (_NEAR_ INT8U* pReq, INT8U ReqLen, _NEAR_ INT8U* pRes,_NEAR_ int BMCInst)
  595. {
  596. _NEAR_ SELInfo_T* pSelInfo = (_NEAR_ SELInfo_T*) pRes;
  597. _FAR_ BMCInfo_t* pBMCInfo = &g_BMCInfo[BMCInst];
  598. _FAR_ SELRepository_T* _FAR_ m_sel;
  599. OS_THREAD_MUTEX_ACQUIRE(&pBMCInfo->SELConfig.SELMutex, WAIT_INFINITE);
  600. if(g_corefeatures.del_sel_reclaim_support != ENABLED)
  601. {
  602. m_sel = (_FAR_ SELRepository_T*) GetSDRSELNVRAddr ((pBMCInfo->IpmiConfig.SDRAllocationSize * 1024), BMCInst);
  603. pSelInfo->RecCt = htoipmi_u16 (m_sel->NumRecords);
  604. pSelInfo->FreeSpace = htoipmi_u16 ((g_BMCInfo[BMCInst].SELConfig.MaxSELRecord - m_sel->NumRecords) * sizeof(SELRec_T));
  605. pSelInfo->AddTimeStamp = htoipmi_u16(m_sel->AddTimeStamp);
  606. pSelInfo->EraseTimeStamp =htoipmi_u16( m_sel->EraseTimeStamp);
  607. }
  608. else
  609. {
  610. pSelInfo->RecCt = htoipmi_u16 (pBMCInfo->SELReclaimRepos.pSELReclaimInfo->NumRecords);
  611. pSelInfo->FreeSpace = htoipmi_u16 ((g_BMCInfo[BMCInst].SELConfig.MaxSELRecord - pBMCInfo->SELReclaimRepos.pSELReclaimInfo->NumRecords) * sizeof(SELRec_T));
  612. pSelInfo->AddTimeStamp = htoipmi_u16(pBMCInfo->SELReclaimRepos.pSELReclaimInfo->AddTimeStamp);
  613. pSelInfo->EraseTimeStamp =htoipmi_u16( pBMCInfo->SELReclaimRepos.pSELReclaimInfo->EraseTimeStamp);
  614. }
  615. pSelInfo->CompletionCode = CC_NORMAL;
  616. pSelInfo->Version = SEL_VERSION;
  617. pSelInfo->OpSupport=NO_SUPPORT;
  618. if(g_BMCInfo[BMCInst].SELConfig.SELOverFlow == TRUE)
  619. {
  620. pSelInfo->OpSupport |= OVERFLOW_FLAG;
  621. }
  622. if(g_PDKCmdsHandle[PDKCMDS_PDKISCOMMANDENABLED]!= NULL)
  623. {
  624. if(((int(*)(INT8U,INT8U*,INT8U,int))g_PDKCmdsHandle[PDKCMDS_PDKISCOMMANDENABLED])(NETFN_STORAGE,NULL,CMD_RESERVE_SEL,BMCInst) == 0)
  625. {
  626. pSelInfo->OpSupport|= RESERVE_SEL_SUPPORT;
  627. }
  628. if(((int(*)(INT8U,INT8U*,INT8U,int))g_PDKCmdsHandle[PDKCMDS_PDKISCOMMANDENABLED])(NETFN_STORAGE,NULL,CMD_GET_SEL_ALLOCATION_INFO,BMCInst) == 0)
  629. {
  630. pSelInfo->OpSupport|= GET_SEL_ALLOC_SUPPORT;
  631. }
  632. if(((int(*)(INT8U,INT8U*,INT8U,int))g_PDKCmdsHandle[PDKCMDS_PDKISCOMMANDENABLED])(NETFN_STORAGE,NULL,CMD_PARTIAL_ADD_SEL_ENTRY ,BMCInst) == 0)
  633. {
  634. pSelInfo->OpSupport|=PARTIAL_ADD_SEL_SUPPORT;
  635. }
  636. if(((int(*)(INT8U,INT8U*,INT8U,int))g_PDKCmdsHandle[PDKCMDS_PDKISCOMMANDENABLED])(NETFN_STORAGE,NULL,CMD_DELETE_SEL_ENTRY,BMCInst) == 0)
  637. {
  638. pSelInfo->OpSupport|= DELETE_SEL_SUPPORT;
  639. }
  640. }
  641. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->SELConfig.SELMutex);
  642. return sizeof (SELInfo_T);
  643. }
  644. /*---------------------------------------
  645. * GetSELAllocationInfo
  646. *---------------------------------------*/
  647. int
  648. GetSELAllocationInfo(_NEAR_ INT8U* pReq, INT8U ReqLen, _NEAR_ INT8U* pRes,_NEAR_ int BMCInst)
  649. {
  650. _NEAR_ SELAllocInfo_T* pAllocInfo = (_NEAR_ SELAllocInfo_T*) pRes;
  651. _FAR_ SELRepository_T* _FAR_ m_sel;
  652. _FAR_ BMCInfo_t* pBMCInfo = &g_BMCInfo[BMCInst];
  653. OS_THREAD_MUTEX_ACQUIRE(&pBMCInfo->SELConfig.SELMutex, WAIT_INFINITE);
  654. pAllocInfo->CompletionCode = CC_NORMAL;
  655. pAllocInfo->NumAllocUnits = htoipmi_u16 (g_BMCInfo[BMCInst].SELConfig.MaxSELRecord);
  656. pAllocInfo->AllocUnitSize = htoipmi_u16 (sizeof (SELRec_T));
  657. if(g_corefeatures.del_sel_reclaim_support != ENABLED)
  658. {
  659. m_sel = (_FAR_ SELRepository_T*) GetSDRSELNVRAddr ((pBMCInfo->IpmiConfig.SDRAllocationSize * 1024), BMCInst);
  660. pAllocInfo->NumFreeAllocUnits = htoipmi_u16 ((g_BMCInfo[BMCInst].SELConfig.MaxSELRecord - m_sel->NumRecords));
  661. pAllocInfo->LargestFreeBlock = htoipmi_u16 ((g_BMCInfo[BMCInst].SELConfig.MaxSELRecord - m_sel->NumRecords));
  662. }
  663. else
  664. {
  665. pAllocInfo->NumFreeAllocUnits = htoipmi_u16 ((g_BMCInfo[BMCInst].SELConfig.MaxSELRecord -pBMCInfo->SELReclaimRepos.pSELReclaimInfo->NumRecords));
  666. pAllocInfo->LargestFreeBlock = htoipmi_u16 ((g_BMCInfo[BMCInst].SELConfig.MaxSELRecord - pBMCInfo->SELReclaimRepos.pSELReclaimInfo->NumRecords));
  667. }
  668. pAllocInfo->MaxRecSize = sizeof (SELRec_T)/pAllocInfo->AllocUnitSize;
  669. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->SELConfig.SELMutex);
  670. return sizeof (SELAllocInfo_T);
  671. }
  672. /*---------------------------------------
  673. * ReserveSEL
  674. *---------------------------------------*/
  675. int
  676. ReserveSEL (_NEAR_ INT8U* pReq, INT8U ReqLen, _NEAR_ INT8U* pRes,_NEAR_ int BMCInst)
  677. {
  678. _NEAR_ ReserveSELRes_T* pRsvSelRes = (_NEAR_ ReserveSELRes_T*) pRes;
  679. BMCInfo_t *pBMCInfo = &g_BMCInfo[BMCInst];
  680. OS_THREAD_MUTEX_ACQUIRE(&pBMCInfo->SELConfig.SELMutex, WAIT_INFINITE);
  681. g_BMCInfo[BMCInst].SELConfig.SelReservationID++;
  682. if (0 == g_BMCInfo[BMCInst].SELConfig.SelReservationID) { g_BMCInfo[BMCInst].SELConfig.SelReservationID = 1; }
  683. pRsvSelRes->CompletionCode = CC_NORMAL;
  684. pRsvSelRes->ReservationID = g_BMCInfo[BMCInst].SELConfig.SelReservationID;
  685. g_BMCInfo[BMCInst].SELConfig.RsrvIDCancelled = FALSE;
  686. g_BMCInfo[BMCInst].SELConfig.PartialAdd=0 ;//Addded for DR#30287
  687. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->SELConfig.SELMutex);
  688. return sizeof (ReserveSELRes_T);
  689. }
  690. /*---------------------------------------
  691. * GetSELEntry
  692. *---------------------------------------*/
  693. int
  694. GetSELEntry (_NEAR_ INT8U* pReq, INT8U ReqLen, _NEAR_ INT8U* pRes,_NEAR_ int BMCInst)
  695. {
  696. _FAR_ SELRec_T* pSelRec;
  697. _FAR_ SELRec_T* pNextSelRec;
  698. _NEAR_ GetSELReq_T* pGetSelReq = (_NEAR_ GetSELReq_T*) pReq;
  699. _NEAR_ GetSELRes_T* pGetSelRes = (_NEAR_ GetSELRes_T*) pRes;
  700. INT16U LastRecID = 0,FirstRecID = 0;
  701. _FAR_ SELRepository_T* _FAR_ m_sel = NULL;
  702. _FAR_ BMCInfo_t* pBMCInfo = &g_BMCInfo[BMCInst];
  703. INT16U NumRecords = 0;
  704. BOOL SELReclaim,CircularSEL = FALSE;
  705. OS_THREAD_MUTEX_ACQUIRE(&pBMCInfo->SELConfig.SELMutex, WAIT_INFINITE);
  706. if(g_corefeatures.circular_sel == ENABLED)
  707. {
  708. CircularSEL = pBMCInfo->AMIConfig.CircularSEL;
  709. }
  710. SELReclaim = g_corefeatures.del_sel_reclaim_support;
  711. if(!SELReclaim)
  712. {
  713. m_sel = (_FAR_ SELRepository_T*) GetSDRSELNVRAddr ((pBMCInfo->IpmiConfig.SDRAllocationSize * 1024), BMCInst);
  714. NumRecords = m_sel->NumRecords;
  715. }
  716. else
  717. {
  718. NumRecords = pBMCInfo->SELReclaimRepos.pSELReclaimInfo->NumRecords;
  719. }
  720. pGetSelRes->CompletionCode = CC_NORMAL;
  721. if (pGetSelReq->ReservationID && g_BMCInfo[BMCInst].SELConfig.RsrvIDCancelled)
  722. {
  723. pGetSelRes->CompletionCode = CC_INV_RESERVATION_ID;
  724. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->SELConfig.SELMutex);
  725. return sizeof (INT8U);
  726. }
  727. /* Check if the reservation IDs match */
  728. if ((g_BMCInfo[BMCInst].SELConfig.SelReservationID != pGetSelReq->ReservationID) &&
  729. ((0 != pGetSelReq->Offset) || (pGetSelReq->ReservationID != 0)) )
  730. {
  731. pGetSelRes->CompletionCode = CC_INV_RESERVATION_ID;
  732. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->SELConfig.SELMutex);
  733. return sizeof (INT8U);
  734. }
  735. if ((!SELReclaim) && (0 == m_sel->NumRecords))
  736. {
  737. pGetSelRes->CompletionCode = CC_SEL_REC_NOT_PRESENT;
  738. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->SELConfig.SELMutex);
  739. return sizeof (INT8U);
  740. }
  741. else if((SELReclaim) && (0 == pBMCInfo->SELReclaimRepos.pSELReclaimInfo->NumRecords))
  742. {
  743. pGetSelRes->CompletionCode = CC_SEL_REC_NOT_PRESENT;
  744. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->SELConfig.SELMutex);
  745. return sizeof (INT8U);
  746. }
  747. FirstRecID = BMC_GET_SHARED_MEM (BMCInst)->m_FirstRecID;
  748. LastRecID = BMC_GET_SHARED_MEM (BMCInst)->m_LastRecID;
  749. /* If ID == 0x0000 return first record */
  750. if (0 == pGetSelReq->RecID)
  751. {
  752. pSelRec = GetSELRec(FirstRecID, BMCInst);
  753. if (0 == pSelRec)
  754. {
  755. pGetSelRes->CompletionCode = CC_SEL_REC_NOT_PRESENT;
  756. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->SELConfig.SELMutex);
  757. return sizeof(INT8U);
  758. }
  759. else
  760. {
  761. pNextSelRec = GetNextSELEntry (pSelRec, BMCInst);
  762. }
  763. if (0 == pNextSelRec)
  764. {
  765. pGetSelRes->NextRecID = 0xFFFF;
  766. }
  767. else
  768. {
  769. pGetSelRes->NextRecID = pNextSelRec->EvtRecord.hdr.ID;
  770. }
  771. }
  772. else if (0xFFFF == pGetSelReq->RecID)
  773. {
  774. pSelRec = GetSELRec(LastRecID, BMCInst);
  775. if(0== pSelRec)
  776. {
  777. pGetSelRes->CompletionCode = CC_SEL_REC_NOT_PRESENT;
  778. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->SELConfig.SELMutex);
  779. return sizeof(INT8U);
  780. }
  781. pGetSelRes->NextRecID = 0xFFFF;
  782. }
  783. /* else if (!CircularSEL && pGetSelReq->RecID > LastRecID)
  784. {*/
  785. /* When Circular SEL is enabled and SEL buffer is full,
  786. LastRecID will reset from zero, the RecID may greater than LastRecID.
  787. Thus don't check this in Circular SEL mode. */
  788. /* pGetSelRes->CompletionCode = CC_SEL_REC_NOT_PRESENT;
  789. return sizeof(INT8U);
  790. }*/
  791. else
  792. {
  793. pSelRec = GetSELRec(pGetSelReq->RecID,BMCInst);
  794. if (pSelRec == 0)
  795. {
  796. pGetSelRes->CompletionCode = CC_SEL_REC_NOT_PRESENT;
  797. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->SELConfig.SELMutex);
  798. return sizeof (INT8U);
  799. }
  800. if(LastRecID == pGetSelReq->RecID)
  801. {
  802. pGetSelRes->NextRecID = 0xFFFF;
  803. }
  804. else
  805. {
  806. pNextSelRec = GetNextSELEntry (pSelRec,BMCInst);
  807. if (0 == pNextSelRec)
  808. {
  809. /*If the given SEL ID is the maximum SEL record ,then the next SEL ID will be the First SEL ID
  810. in case of Circular SEL Implementation */
  811. if( CircularSEL && (pBMCInfo->SELConfig.MaxSELRecord == NumRecords))
  812. {
  813. if(!SELReclaim)
  814. {
  815. pGetSelRes->NextRecID = pSelRec->EvtRecord.hdr.ID+1;
  816. }
  817. else
  818. {
  819. pGetSelRes->NextRecID = GetNextReclaimRecordID(BMCInst);
  820. }
  821. }
  822. else
  823. {
  824. pGetSelRes->NextRecID = 0xFFFF;
  825. IPMI_DBG_PRINT ("SEL: Last Record returned 0xFFFF\n");
  826. }
  827. }
  828. else
  829. {
  830. pGetSelRes->NextRecID = pNextSelRec->EvtRecord.hdr.ID;
  831. }
  832. }
  833. }
  834. if ((0xff == pGetSelReq->Size) && (sizeof (SELEventRecord_T) >= pGetSelReq->Offset))
  835. {
  836. pGetSelReq->Size = sizeof (SELEventRecord_T) - pGetSelReq->Offset;
  837. }
  838. // Check for the request bytes and offset not to exceed the actual size of the record
  839. else if ((pGetSelReq->Size > (sizeof(SELEventRecord_T))) ||
  840. (pGetSelReq->Offset > (sizeof(SELEventRecord_T))) ||
  841. (pGetSelReq->Size > ((sizeof(SELEventRecord_T))- pGetSelReq->Offset)))
  842. {
  843. pGetSelRes->CompletionCode = CC_PARAM_OUT_OF_RANGE;
  844. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->SELConfig.SELMutex);
  845. return sizeof (INT8U);
  846. }
  847. _fmemcpy(pGetSelRes + 1, ((_FAR_ INT8U*)&pSelRec->EvtRecord) +
  848. pGetSelReq->Offset, pGetSelReq->Size);
  849. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->SELConfig.SELMutex);
  850. return sizeof(GetSELRes_T) + pGetSelReq->Size;
  851. }
  852. /*---------------------------------------
  853. * BSODCaptureScreen
  854. *---------------------------------------*/
  855. void BSODCaptureScreen(_NEAR_ SELEventRecord_T* EvtRecord)
  856. {
  857. void *phandle;
  858. int (*capturecrashscreen) (char *);
  859. char command[256] = {0};
  860. capturecrashscreen = NULL;
  861. cmd_info_t comm_info;
  862. /*No need to check complete byte, only LSB is enough to check that the sel event is of OS Runtime error or not*/
  863. /* Sensor Specific Offsets and their Events for Sensor Type 20h(OS Stop/Shutdown)
  864. 00h - Critical Stop during OS load/initialization
  865. 01h - Runtime Critical Stop / BSOD / Core Dump
  866. 02h - OS Graceful Stop
  867. 03h - OS Graceful Shutdown
  868. 04h - Soft shutdown initiated by PEF
  869. */
  870. if((EvtRecord->SensorType == SENSOR_TYPE_OS_CRITICAL_STOP) && ((EvtRecord->EvtData1 & SENSOR_SPECIFIC_OFFSET_MASK) == OS_RUNTIME_CRITICAL_STOP))
  871. {
  872. phandle = NULL;
  873. if(g_corefeatures.capture_bsod_raw == ENABLED)
  874. {
  875. phandle = dlopen((char *)VIDEO_LIB,RTLD_LAZY);
  876. if(!phandle)
  877. {
  878. TCRIT("Error in loading video library %s\n",dlerror());
  879. return;
  880. }
  881. capturecrashscreen = dlsym(phandle,CAP_CRASHSCREEN_FUNC);
  882. if(capturecrashscreen == NULL)
  883. {
  884. TCRIT("Error in Calling %s function\n","Capture_CrashScreen");
  885. dlclose(phandle);
  886. return;
  887. }
  888. }
  889. sprintf(command, "mkdir %s 2&>/dev/null", CRASH_SCREEN_DIRECTORY);
  890. safe_system(command);
  891. if( g_corefeatures.capture_bsod_jpeg == ENABLED)
  892. {
  893. sprintf(command, "rm %s 2&>/dev/null",CRASH_SCREEN_FILE_JPEG);
  894. }
  895. else if(g_corefeatures.capture_bsod_raw == ENABLED)
  896. {
  897. sprintf(command, "rm %s 2&>/dev/null",CRASH_SCREEN_FILE);
  898. }
  899. safe_system(command);
  900. if( g_corefeatures.capture_bsod_jpeg == ENABLED)
  901. {
  902. int pipeHndler = -1;
  903. pipeHndler = open(CMD_COMM_PIPE, O_RDWR|O_NONBLOCK);
  904. if(pipeHndler > 0)
  905. {
  906. comm_info.cmd = BSOD_CAPTURE;
  907. comm_info.datalen = sizeof(cmd_info_t);
  908. write(pipeHndler,&comm_info,sizeof(cmd_info_t));
  909. close(pipeHndler);
  910. }
  911. else
  912. {
  913. TINFO("Unable to open the command pipe::%s\n",CMD_COMM_PIPE);
  914. return ;
  915. }
  916. }
  917. else if(g_corefeatures.capture_bsod_raw== ENABLED)
  918. {
  919. if(capturecrashscreen(CRASH_SCREEN_FILE) < 0)
  920. TCRIT("Capture Failed\n");
  921. if(phandle != NULL)
  922. dlclose(phandle);
  923. }
  924. }
  925. return;
  926. }
  927. /*---------------------------------------
  928. * LockedAddSELEntry with SEL locked
  929. *---------------------------------------*/
  930. int
  931. LockedAddSELEntry (_NEAR_ INT8U* pReq, INT8U ReqLen, _NEAR_ INT8U* pRes, INT8U SysIfcFlag, INT8U SelectTbl, int BMCInst)
  932. {
  933. _NEAR_ AddSELRes_T* pAddSelRes = (_NEAR_ AddSELRes_T*) pRes;
  934. _NEAR_ SELRecHdr_T* pSelRec = (_NEAR_ SELRecHdr_T*) pReq;
  935. _FAR_ PEFRecordDetailsConfig_T* nvrPefRecordDetails;
  936. _FAR_ AMIConfig_T* pAMIcfg;
  937. _FAR_ BMCInfo_t* pBMCInfo = &g_BMCInfo[BMCInst];
  938. _FAR_ INT8U SelExceededAction=0;
  939. static _FAR_ INT8U NumSelAccum=0;
  940. INT16U LastRecID = 0;
  941. int nRet=0;
  942. SELRec_T NodeSELRecord;
  943. _FAR_ SELRepository_T* _FAR_ m_sel = NULL;
  944. INT16U NumRecords=0;
  945. BOOL CircularSEL = FALSE;
  946. BOOL SELReclaim = FALSE;
  947. if(g_corefeatures.circular_sel == ENABLED)
  948. {
  949. CircularSEL = pBMCInfo->AMIConfig.CircularSEL;
  950. }
  951. SELReclaim = g_corefeatures.del_sel_reclaim_support;
  952. // Send event to Automation engine
  953. AES_SendEvent((SELEventRecord_T *)pReq);
  954. nvrPefRecordDetails = &pBMCInfo->PEFRecordDetailsConfig;
  955. pAMIcfg = &pBMCInfo->AMIConfig;
  956. if((g_corefeatures.ssi_event_forward == ENABLED) && (g_corefeatures.ssi_support == ENABLED))
  957. {
  958. if (g_SSIHandle[SSICB_EVENTFWD] != NULL)
  959. {
  960. ((void(*)(SELEventRecord_T *, int))g_SSIHandle[SSICB_EVENTFWD]) ((SELEventRecord_T*)pSelRec, BMCInst);
  961. }
  962. }
  963. /* PDK Module Pre Add SEL Control function*/
  964. if(g_PDKHandle[PDK_PREADDSEL] != NULL)
  965. {
  966. SelectTbl = ((INT8U(*)(INT8U *, INT8U, int)) g_PDKHandle[PDK_PREADDSEL])((_FAR_ INT8U*)pSelRec, SelectTbl, BMCInst);
  967. }
  968. if(g_corefeatures.capture_bsod == ENABLED)
  969. {
  970. BSODCaptureScreen((SELEventRecord_T*)pSelRec);
  971. }
  972. if(!SysIfcFlag) // Event logging via the System Interface is always enabled
  973. {
  974. // If SEL logging is disabled, Post the event to PEF and return Invalid ID
  975. if(0 == (BMC_GET_SHARED_MEM(BMCInst)->GlobalEnables & SYS_EVENT_LOGGING_MASK))
  976. {
  977. IPMI_DBG_PRINT_1("BMC SEL Logging is disabled; BMC Global Enable Byte is %x", BMC_GET_SHARED_MEM()->GlobalEnables);
  978. pSelRec->ID = 0xFFFF;
  979. if(SelectTbl & ENABLE_PEF_MASK)
  980. {
  981. PostSELToPEF((SELEventRecord_T*)pSelRec,BMCInst);
  982. nvrPefRecordDetails->LastBMCProcessedEventID = 0;
  983. }
  984. else
  985. {
  986. nvrPefRecordDetails->LastBMCProcessedEventID = ((SELEventRecord_T*)pSelRec)->hdr.ID;
  987. }
  988. if(g_corefeatures.sel_write_background == ENABLED)
  989. {
  990. PostSELToFlush(FLUSH_BMC_PROC_EVT_ID,NULL,BMCInst);
  991. }
  992. else
  993. {
  994. FlushIPMI((INT8U*)&pBMCInfo->PEFRecordDetailsConfig,(INT8U*)&pBMCInfo->PEFRecordDetailsConfig.LastBMCProcessedEventID,
  995. pBMCInfo->IPMIConfLoc.PEFRecordDetailsConfigAddr,sizeof(pBMCInfo->PEFRecordDetailsConfig.LastBMCProcessedEventID),BMCInst);
  996. }
  997. pAddSelRes->CompletionCode = CC_PARAM_NOT_SUP_IN_CUR_STATE;
  998. return sizeof(INT8U);
  999. }
  1000. }
  1001. if(!SELReclaim)
  1002. {
  1003. m_sel = (_FAR_ SELRepository_T*) GetSDRSELNVRAddr ((pBMCInfo->IpmiConfig.SDRAllocationSize * 1024), BMCInst);
  1004. NumRecords = m_sel->NumRecords;
  1005. }
  1006. else
  1007. {
  1008. NumRecords = pBMCInfo->SELReclaimRepos.pSELReclaimInfo->NumRecords;
  1009. }
  1010. /* If we dont have enough space return invalid ID */
  1011. if (NumRecords >= pBMCInfo->SELConfig.MaxSELRecord)
  1012. {
  1013. /* If record buffer is full, reset the m_LastRecID index starting from 0 */
  1014. if (CircularSEL)
  1015. {
  1016. if ((BMC_GET_SHARED_MEM (BMCInst)->m_SELIndex == pBMCInfo->SELConfig.MaxSELRecord))
  1017. {
  1018. if(!SELReclaim)
  1019. {
  1020. BMC_GET_SHARED_MEM(BMCInst)->m_SELIndex = 0;
  1021. }
  1022. }
  1023. /*Reset the SEL OverFlow Flag in Circular SEL mode*/
  1024. pBMCInfo->SELConfig.SELOverFlow = FALSE;
  1025. }
  1026. else
  1027. {
  1028. /*Even though SEL is full, PEF action has to be taken.
  1029. So Posting SEL to PEF Task */
  1030. pSelRec->ID = 0xFFFF;
  1031. if(SelectTbl & ENABLE_PEF_MASK)
  1032. {
  1033. PostSELToPEF ((SELEventRecord_T*)pSelRec,BMCInst);
  1034. nvrPefRecordDetails->LastBMCProcessedEventID = 0;
  1035. }
  1036. else
  1037. {
  1038. nvrPefRecordDetails->LastBMCProcessedEventID = ((SELEventRecord_T*)pSelRec)->hdr.ID;
  1039. }
  1040. pBMCInfo->SELConfig.SELOverFlow = TRUE;
  1041. if(g_corefeatures.sel_write_background == ENABLED)
  1042. {
  1043. PostSELToFlush(FLUSH_BMC_PROC_EVT_ID,NULL,BMCInst);
  1044. }
  1045. else
  1046. {
  1047. FlushIPMI((INT8U*)&pBMCInfo->PEFRecordDetailsConfig,(INT8U*)&pBMCInfo->PEFRecordDetailsConfig.LastBMCProcessedEventID,
  1048. pBMCInfo->IPMIConfLoc.PEFRecordDetailsConfigAddr,sizeof(pBMCInfo->PEFRecordDetailsConfig.LastBMCProcessedEventID),BMCInst);
  1049. }
  1050. pAddSelRes->CompletionCode = CC_OUT_OF_SPACE;
  1051. return sizeof (INT8U);
  1052. }
  1053. }
  1054. if(!SELReclaim)
  1055. {
  1056. if( BMC_GET_SHARED_MEM (BMCInst)->m_LastRecID == 0xFFFE)
  1057. {
  1058. BMC_GET_SHARED_MEM (BMCInst)->m_LastRecID = 0;
  1059. /*Enable Circular overflow Flag*/
  1060. pAMIcfg->CircularSELFlag = 1;
  1061. if(g_corefeatures.sel_write_background == ENABLED)
  1062. {
  1063. PostSELToFlush(FLUSH_CIRCULAR_SEL_FLAG,NULL,BMCInst);
  1064. }
  1065. else
  1066. {
  1067. FlushIPMI((INT8U*)&pBMCInfo->AMIConfig,(INT8U*)&pBMCInfo->AMIConfig.CircularSELFlag,pBMCInfo->IPMIConfLoc.AMIConfigAddr,sizeof(INT8U),BMCInst);
  1068. }
  1069. }
  1070. if( BMC_GET_SHARED_MEM (BMCInst)->m_FirstRecID == 0xFFFE)
  1071. {
  1072. BMC_GET_SHARED_MEM (BMCInst)->m_FirstRecID = 0;
  1073. /*Disable Circular overflow Flag*/
  1074. pAMIcfg->CircularSELFlag = 0;
  1075. if(g_corefeatures.sel_write_background == ENABLED)
  1076. {
  1077. PostSELToFlush(FLUSH_CIRCULAR_SEL_FLAG,NULL,BMCInst);
  1078. }
  1079. else
  1080. {
  1081. FlushIPMI((INT8U*)&pBMCInfo->AMIConfig,(INT8U*)&pBMCInfo->AMIConfig.CircularSELFlag,pBMCInfo->IPMIConfLoc.AMIConfigAddr,sizeof(INT8U),BMCInst);
  1082. }
  1083. }
  1084. if(CircularSEL && NumRecords == pBMCInfo->SELConfig.MaxSELRecord)
  1085. {
  1086. BMC_GET_SHARED_MEM (BMCInst)->m_FirstRecID +=1;
  1087. }
  1088. }
  1089. if(SelectTbl & ENABLE_SEL_MASK)
  1090. {
  1091. /* time stamp for record type less than 0xE0*/
  1092. if (pSelRec->Type < 0xE0)
  1093. {
  1094. if((NULL == g_PDKHandle[PDK_SELTIMESTAMP]) || (-1 == ((int(*)(SELEventRecord_T*))(g_PDKHandle[PDK_SELTIMESTAMP]))((SELEventRecord_T*)pSelRec)))
  1095. {
  1096. // The timestamp gets set if the hook is not present or if the hook returns -1
  1097. pSelRec->TimeStamp = GetSelTimeStamp (BMCInst);
  1098. }
  1099. }
  1100. if(!SELReclaim)
  1101. {
  1102. pSelRec->ID = BMC_GET_SHARED_MEM (BMCInst)->m_LastRecID +1;
  1103. LastRecID = BMC_GET_SHARED_MEM (BMCInst)->m_SELIndex ;
  1104. _fmemcpy (&m_sel->SELRecord [LastRecID].EvtRecord , pSelRec,
  1105. sizeof (SELEventRecord_T));
  1106. m_sel->SELRecord [LastRecID].Valid = VALID_RECORD;
  1107. m_sel->SELRecord [LastRecID].Len = sizeof (SELEventRecord_T) + 2;
  1108. }
  1109. else
  1110. {
  1111. pSelRec->ID = GetNextReclaimRecordID(BMCInst);
  1112. NodeSELRecord.Valid = VALID_RECORD;
  1113. NodeSELRecord.Len = sizeof(SELEventRecord_T)+2;
  1114. memcpy(&NodeSELRecord.EvtRecord,pSelRec,sizeof(SELEventRecord_T));
  1115. }
  1116. if ((0 == pBMCInfo->SELConfig.SenMonSELFlag) || (NumSelAccum > 2)
  1117. || (g_corefeatures.sel_write_background == ENABLED))
  1118. {
  1119. if(!SELReclaim)
  1120. {
  1121. if(g_corefeatures.sel_write_background == ENABLED)
  1122. {
  1123. PostSELToFlush(FLUSH_SEL_REC,&LastRecID,BMCInst);
  1124. }
  1125. else
  1126. {
  1127. FlushSEL (&m_sel->SELRecord [LastRecID - NumSelAccum],
  1128. sizeof(SELRec_T) * (NumSelAccum + 1), nRet,BMCInst);
  1129. }
  1130. }
  1131. else
  1132. {
  1133. nRet = FlushAddReclaimSEL(&NodeSELRecord,BMCInst);
  1134. }
  1135. if(g_corefeatures.sel_write_background != ENABLED)
  1136. {
  1137. #if IPM_DEVICE == 1
  1138. if (-1 == nRet)
  1139. {
  1140. g_BMCInfo[BMCInst].Msghndlr.SelfTestByte |= GST_CANNOT_ACCESS_SEL;
  1141. }
  1142. else
  1143. {
  1144. g_BMCInfo[BMCInst].Msghndlr.SelfTestByte &= ~GST_CANNOT_ACCESS_SEL;
  1145. }
  1146. #endif
  1147. }
  1148. NumSelAccum = 0;
  1149. }
  1150. else
  1151. {
  1152. if(g_corefeatures.sel_write_background != ENABLED)
  1153. {
  1154. NumSelAccum += 1;
  1155. }
  1156. }
  1157. if (!CircularSEL || (CircularSEL && NumRecords < pBMCInfo->SELConfig.MaxSELRecord))
  1158. {
  1159. /* Update the fields in SEL Repository */
  1160. if(!SELReclaim)
  1161. {
  1162. NumRecords = ++m_sel->NumRecords;
  1163. }
  1164. else
  1165. {
  1166. NumRecords = ++pBMCInfo->SELReclaimRepos.pSELReclaimInfo->NumRecords;
  1167. }
  1168. }
  1169. /*Update the First SEL entry after clear SEL command*/
  1170. if(!SELReclaim)
  1171. {
  1172. if( BMC_GET_SHARED_MEM (BMCInst)->m_FirstRecID == 0)
  1173. {
  1174. BMC_GET_SHARED_MEM (BMCInst)->m_FirstRecID = pSelRec->ID;
  1175. }
  1176. BMC_GET_SHARED_MEM (BMCInst)->m_LastRecID += 1;
  1177. BMC_GET_SHARED_MEM (BMCInst)->m_SELIndex += 1;
  1178. pBMCInfo->SELConfig.LastEvtTS = m_sel->AddTimeStamp = GetSelTimeStamp (BMCInst);
  1179. if(g_corefeatures.sel_write_background == ENABLED)
  1180. {
  1181. PostSELToFlush(FLUSH_SEL_TIMESTAMP,NULL,BMCInst);
  1182. }
  1183. else
  1184. {
  1185. FlushSEL (&m_sel->AddTimeStamp, sizeof(INT32U), nRet,BMCInst);
  1186. }
  1187. if(g_corefeatures.sel_write_background != ENABLED)
  1188. {
  1189. #if IPM_DEVICE == 1
  1190. if (-1 == nRet)
  1191. {
  1192. g_BMCInfo[BMCInst].Msghndlr.SelfTestByte |= GST_CANNOT_ACCESS_SEL;
  1193. }
  1194. else
  1195. {
  1196. g_BMCInfo[BMCInst].Msghndlr.SelfTestByte &= ~GST_CANNOT_ACCESS_SEL;
  1197. }
  1198. #endif
  1199. }
  1200. }
  1201. else
  1202. {
  1203. pBMCInfo->SELConfig.LastEvtTS = pBMCInfo->SELReclaimRepos.pSELReclaimInfo->AddTimeStamp = GetSelTimeStamp(BMCInst);
  1204. nRet = SaveSELReclaimInfo(pBMCInfo->SELReclaimRepos.pSELReclaimInfo,BMCInst);
  1205. #if IPM_DEVICE == 1
  1206. if (-1 == nRet)
  1207. {
  1208. g_BMCInfo[BMCInst].Msghndlr.SelfTestByte |= GST_CANNOT_ACCESS_SEL;
  1209. }
  1210. else
  1211. {
  1212. g_BMCInfo[BMCInst].Msghndlr.SelfTestByte &= ~GST_CANNOT_ACCESS_SEL;
  1213. }
  1214. #endif
  1215. }
  1216. nvrPefRecordDetails->LastSELRecordID = pSelRec->ID;
  1217. if(g_corefeatures.sel_write_background == ENABLED)
  1218. {
  1219. PostSELToFlush(FLUSH_LAST_RECID,NULL,BMCInst);
  1220. }
  1221. else
  1222. {
  1223. FlushIPMI((INT8U*)&pBMCInfo->PEFRecordDetailsConfig,(INT8U*)&pBMCInfo->PEFRecordDetailsConfig.LastSELRecordID,
  1224. pBMCInfo->IPMIConfLoc.PEFRecordDetailsConfigAddr,sizeof(pBMCInfo->PEFRecordDetailsConfig.LastSELRecordID),BMCInst);
  1225. }
  1226. /* Ivalidate Reservation ID if any */
  1227. pBMCInfo->SELConfig.RsrvIDCancelled = TRUE;
  1228. /* check for SEL limit as specfied by OEM */
  1229. if (0 != pBMCInfo->SELConfig.SELLimit)
  1230. {
  1231. if (NumRecords > (pBMCInfo->SELConfig.MaxSELRecord * pBMCInfo->SELConfig.SELLimit / 100))
  1232. {
  1233. if(g_PDKHandle[PDK_SELLIMITEXCEEDED] != NULL)
  1234. {
  1235. SelExceededAction =((INT8U(*)(int)) g_PDKHandle[PDK_SELLIMITEXCEEDED])(BMCInst);
  1236. }
  1237. switch (SelExceededAction)
  1238. {
  1239. case SET_MSG_FLAG_OEM_0 : /* set OEM 0 bit */
  1240. case SET_MSG_FLAG_OEM_1 : /* set OEM 1 bit */
  1241. case SET_MSG_FLAG_OEM_2 : /* set OEM 2 bit */
  1242. BMC_GET_SHARED_MEM (BMCInst)->MsgFlags |= SelExceededAction;
  1243. /* set SYS_ATT bit */
  1244. //SET_SMS_ATN ();
  1245. if (pBMCInfo->IpmiConfig.KCS1IfcSupport == 1)
  1246. {
  1247. SET_SMS_ATN (0, BMCInst);
  1248. }
  1249. if (pBMCInfo->IpmiConfig.KCS2IfcSupport == 1)
  1250. {
  1251. SET_SMS_ATN (1, BMCInst);
  1252. }
  1253. if (pBMCInfo->IpmiConfig.KCS3IfcSuppport == 1)
  1254. {
  1255. SET_SMS_ATN (2, BMCInst);
  1256. }
  1257. break;
  1258. default :
  1259. break;
  1260. }
  1261. }
  1262. }
  1263. /* PDK Module Post Add SEL Control function*/
  1264. if(g_PDKHandle[PDK_POSTADDSEL] != NULL)
  1265. {
  1266. ((INT8U(*)(INT8U *,int)) g_PDKHandle[PDK_POSTADDSEL])((_FAR_ INT8U*)pSelRec,BMCInst);
  1267. }
  1268. pAddSelRes->CompletionCode = CC_NORMAL;
  1269. pAddSelRes->RecID = pSelRec->ID;
  1270. /* Posting SEL to PEF Task */
  1271. if(SelectTbl & ENABLE_PEF_MASK)
  1272. {
  1273. PostSELToPEF ((SELEventRecord_T*)pSelRec,BMCInst);
  1274. }
  1275. else
  1276. {
  1277. pBMCInfo->PEFRecordDetailsConfig.LastBMCProcessedEventID = ((SELEventRecord_T*)pSelRec)->hdr.ID;
  1278. if(g_corefeatures.sel_write_background == ENABLED)
  1279. {
  1280. PostSELToFlush(FLUSH_BMC_PROC_EVT_ID,NULL,BMCInst);
  1281. }
  1282. else
  1283. {
  1284. FlushIPMI((INT8U*)&pBMCInfo->PEFRecordDetailsConfig, (INT8U*)&pBMCInfo->PEFRecordDetailsConfig.LastBMCProcessedEventID,
  1285. pBMCInfo->IPMIConfLoc.PEFRecordDetailsConfigAddr, sizeof(pBMCInfo->PEFRecordDetailsConfig.LastBMCProcessedEventID), BMCInst);
  1286. }
  1287. }
  1288. /* Check if SEL Full Pecentage is more than 75% */
  1289. if(g_corefeatures.internal_sensor == ENABLED )
  1290. {
  1291. if ((GetSELFullPercentage(BMCInst) >= SEL_ALMOST_FULL_PERCENTAGE) && (g_BMCInfo[BMCInst].SELConfig.selalmostfull != 1))
  1292. {
  1293. /* Set SEL reading to be almost full */
  1294. SetSELSensorReading (EVENT_SEL_ALMOST_FULL,BMCInst);
  1295. g_BMCInfo[BMCInst].SELConfig.selalmostfull = 1;
  1296. }
  1297. /* Check if SEL is full or not */
  1298. if (!CircularSEL && NumRecords == (pBMCInfo->SELConfig.MaxSELRecord - 1))
  1299. {
  1300. SetSELSensorReading ( EVENT_SEL_IS_FULL,BMCInst);
  1301. LogSELFullEvent(BMCInst);
  1302. }
  1303. }
  1304. return sizeof (AddSELRes_T);
  1305. }
  1306. else
  1307. {
  1308. IPMI_DBG_PRINT("BMC SEL Logging and PEF action is disabled by PreAddSEL");
  1309. pSelRec->ID = 0xFFFF;
  1310. pAddSelRes->CompletionCode = CC_NORMAL;
  1311. pAddSelRes->RecID = 0x0000;
  1312. return sizeof(AddSELRes_T);
  1313. }
  1314. }
  1315. /*---------------------------------------
  1316. * AddSELEntry
  1317. *---------------------------------------*/
  1318. int
  1319. AddSELEntry (_NEAR_ INT8U* pReq, INT8U ReqLen, _NEAR_ INT8U* pRes,_NEAR_ int BMCInst)
  1320. {
  1321. int reslen = 0;
  1322. _FAR_ BMCInfo_t* pBMCInfo = &g_BMCInfo[BMCInst];
  1323. INT8U *curchannel;
  1324. OS_THREAD_TLS_GET(g_tls.CurChannel,curchannel);
  1325. OS_THREAD_MUTEX_ACQUIRE(&pBMCInfo->SELConfig.SELMutex, WAIT_INFINITE)
  1326. if(g_corefeatures.disable_pef_for_sel_entry == ENABLED)
  1327. reslen = LockedAddSELEntry(pReq, ReqLen, pRes, (SYS_IFC_CHANNEL == (*curchannel & 0xF) ? TRUE : FALSE),POST_ONLY_SEL,BMCInst);
  1328. else
  1329. reslen = LockedAddSELEntry(pReq, ReqLen, pRes, (SYS_IFC_CHANNEL == (*curchannel & 0xF) ? TRUE : FALSE),POST_SEL_AND_PEF,BMCInst);
  1330. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->SELConfig.SELMutex);
  1331. if(CC_NORMAL == pRes[0])
  1332. {
  1333. // To send notification to CIM
  1334. if(g_PDKCIMEventHandle[PDKCIMEVENT_NOTIFYSERVERUPDATETOCIM] != NULL)
  1335. {
  1336. uint8 CMD;
  1337. _NEAR_ AddSELRes_T* pAddSelRes = (_NEAR_ AddSELRes_T*) pRes;
  1338. // Set bits for SEL Event & Add operation
  1339. CMD = 0x21;
  1340. ((int(*)(uint8, uint16))g_PDKCIMEventHandle[PDKCIMEVENT_NOTIFYSERVERUPDATETOCIM])(CMD, pAddSelRes->RecID);
  1341. }
  1342. }
  1343. return reslen;
  1344. }
  1345. /*---------------------------------------
  1346. * PartialAddSELEntry
  1347. *---------------------------------------*/
  1348. int
  1349. PartialAddSELEntry (_NEAR_ INT8U* pReq, INT8U ReqLen, _NEAR_ INT8U* pRes,_NEAR_ int BMCInst)
  1350. {
  1351. _NEAR_ PartialAddSELReq_T* pParAddSelReq = (_NEAR_ PartialAddSELReq_T*) pReq;
  1352. _NEAR_ PartialAddSELRes_T* pParAddSelRes = (_NEAR_ PartialAddSELRes_T*) pRes;
  1353. SELInfo_T SelInfo;
  1354. BMCInfo_t *pBMCInfo = &g_BMCInfo[BMCInst];
  1355. INT16U RecordID=0, ReservationID=0;
  1356. INT8U RecordOffset=0,Len=0,*curchannel;
  1357. ReservationID = (UINT16)(pParAddSelReq->LSBReservationID |
  1358. ((UINT16)pParAddSelReq->MSBReservationID << 8));
  1359. RecordID = (UINT16)(((UINT16)pParAddSelReq->MSBRecordID << 8) |
  1360. pParAddSelReq->LSBRecordID);
  1361. RecordOffset = (UINT32)pParAddSelReq->Offset;
  1362. Len = ReqLen;
  1363. OS_THREAD_MUTEX_ACQUIRE(&pBMCInfo->SELConfig.SELMutex, WAIT_INFINITE)
  1364. /* Checks for the Valid Reservation ID */
  1365. while(g_BMCInfo[BMCInst].SELConfig.RsrvIDCancelled)
  1366. {
  1367. if((ReservationID == 0) && (pParAddSelReq->Progress == 1) && (ReqLen == SEL_PARTIAL_ADD_CMD_MAX_LEN))
  1368. break;
  1369. else
  1370. {
  1371. if(ReqLen < SEL_PARTIAL_ADD_REQUEST_MISC_BYTES)
  1372. {
  1373. pParAddSelRes->CompletionCode = CC_REQ_INV_LEN;
  1374. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->SELConfig.SELMutex);
  1375. return(sizeof(PartialAddSELRes_T));
  1376. }
  1377. else
  1378. {
  1379. pParAddSelRes->CompletionCode = CC_INV_RESERVATION_ID;
  1380. pParAddSelRes->RecID = 0;
  1381. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->SELConfig.SELMutex);
  1382. return(sizeof(PartialAddSELRes_T));
  1383. }
  1384. }
  1385. }
  1386. /* Check for the reserved bytes should b zero */
  1387. if ( 0 != (pParAddSelReq->Progress & RESERVED_BITS_PARTIALADDSELENTRY ) )
  1388. {
  1389. pParAddSelRes->CompletionCode = CC_INV_DATA_FIELD;
  1390. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->SELConfig.SELMutex);
  1391. return sizeof(INT8U);
  1392. }
  1393. if((pParAddSelReq->Progress>1)|| (pParAddSelReq->Offset>SEL_RECORD_SIZE))
  1394. {
  1395. pParAddSelRes->CompletionCode = CC_PARAM_OUT_OF_RANGE;
  1396. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->SELConfig.SELMutex);
  1397. return(sizeof(PartialAddSELRes_T));
  1398. }
  1399. else if(g_BMCInfo[BMCInst].SELConfig.PartialAdd==0)
  1400. {
  1401. if(((RecordOffset+(Len-SEL_PARTIAL_ADD_REQUEST_MISC_BYTES)==SEL_RECORD_SIZE)&&(pParAddSelReq->Progress!=1))||
  1402. (( RecordOffset+(Len-SEL_PARTIAL_ADD_REQUEST_MISC_BYTES)<SEL_RECORD_SIZE)&&(pParAddSelReq->Progress==1))||
  1403. (RecordOffset+(Len-SEL_PARTIAL_ADD_REQUEST_MISC_BYTES)>SEL_RECORD_SIZE))
  1404. {
  1405. pParAddSelRes->CompletionCode = CC_REQ_INV_LEN;
  1406. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->SELConfig.SELMutex);
  1407. return(sizeof(PartialAddSELRes_T));
  1408. }
  1409. }
  1410. else if((ReservationID==0)&&(Len==SEL_PARTIAL_ADD_CMD_MAX_LEN)&&(pParAddSelReq->Progress!=1))
  1411. {
  1412. pParAddSelRes->CompletionCode =CC_INV_DATA_FIELD;
  1413. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->SELConfig.SELMutex);
  1414. return(sizeof(PartialAddSELRes_T));
  1415. }
  1416. /*Checking for reservation ID <<Added few more condition checking */
  1417. if(((ReservationID == g_BMCInfo[BMCInst].SELConfig.SelReservationID)&&(g_BMCInfo[BMCInst].SELConfig.PartialAdd==0)) ||
  1418. ((ReservationID == g_BMCInfo[BMCInst].SELConfig.SelReservationID) && (ReqLen <= SEL_PARTIAL_ADD_CMD_MAX_LEN))
  1419. ||((ReservationID == 0) && (pParAddSelReq->Progress == 1) && (ReqLen == SEL_PARTIAL_ADD_CMD_MAX_LEN)))
  1420. {
  1421. if(g_BMCInfo[BMCInst].SELConfig.PartialAdd==0)
  1422. {
  1423. // Requirement says partial adds must start at 0, with no
  1424. // gaps or overlaps. First request must be to RecordID = 0.
  1425. if ((RecordID != 0) || (RecordOffset != 0))
  1426. {
  1427. pParAddSelRes->CompletionCode = CC_INV_DATA_FIELD;
  1428. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->SELConfig.SELMutex);
  1429. return(sizeof(PartialAddSELRes_T));// Modified from sizeof (INT8U);
  1430. }
  1431. _fmemset((void *)&g_BMCInfo[BMCInst].SELConfig.SelPartialAddRecord,
  1432. 0xFF,
  1433. sizeof(SELEventRecord_T));
  1434. // Fill in the record ID into the partial add record. The
  1435. // record ID is always the offset in memory of where the
  1436. // SEL record starts (which includes a delete time first).
  1437. RecordID = g_BMCInfo[BMCInst].SELConfig.SelPartialAddRecord.hdr.ID = BMC_GET_SHARED_MEM (BMCInst)->m_LastRecID +1;
  1438. g_BMCInfo[BMCInst].SELConfig.PartialAddRecordID=RecordID;
  1439. SelInfo.OpSupport |= PARTIAL_ADD_SEL_SUPPORT;
  1440. g_BMCInfo[BMCInst].SELConfig.PartialAddRecOffset = 0;
  1441. g_BMCInfo[BMCInst].SELConfig.PartialAdd=1;
  1442. }
  1443. else
  1444. {
  1445. if (RecordID != g_BMCInfo[BMCInst].SELConfig.PartialAddRecordID)
  1446. {
  1447. pParAddSelRes->CompletionCode = CC_INV_DATA_FIELD;
  1448. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->SELConfig.SELMutex);
  1449. return sizeof (PartialAddSELRes_T);
  1450. }
  1451. }
  1452. if (pParAddSelReq->Offset != g_BMCInfo[BMCInst].SELConfig.PartialAddRecOffset)
  1453. {
  1454. pParAddSelRes->CompletionCode = CC_INV_DATA_FIELD;
  1455. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->SELConfig.SELMutex);
  1456. return(sizeof(PartialAddSELRes_T));
  1457. }
  1458. // Checking for Exceeding data values //
  1459. if((g_BMCInfo[BMCInst].SELConfig.PartialAddRecOffset + Len - SEL_PARTIAL_ADD_REQUEST_MISC_BYTES) > SEL_MAX_RECORD_SIZE)
  1460. {
  1461. pParAddSelRes->CompletionCode = CC_REQ_INV_LEN;
  1462. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->SELConfig.SELMutex);
  1463. return(sizeof(PartialAddSELRes_T));
  1464. }
  1465. if((( g_BMCInfo[BMCInst].SELConfig.PartialAddRecOffset + Len - SEL_PARTIAL_ADD_REQUEST_MISC_BYTES) < SEL_MAX_RECORD_SIZE) &&
  1466. (pParAddSelReq->Progress == 1))
  1467. {
  1468. pParAddSelRes->CompletionCode = CC_REQ_INV_LEN;
  1469. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->SELConfig.SELMutex);
  1470. return(sizeof(PartialAddSELRes_T));
  1471. }
  1472. if(((g_BMCInfo[BMCInst].SELConfig.PartialAddRecOffset + Len - SEL_PARTIAL_ADD_REQUEST_MISC_BYTES) == SEL_MAX_RECORD_SIZE) &&
  1473. (pParAddSelReq->Progress != 1))
  1474. {
  1475. pParAddSelRes->CompletionCode = CC_REQ_INV_LEN;
  1476. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->SELConfig.SELMutex);
  1477. return(sizeof(PartialAddSELRes_T));
  1478. }
  1479. _fmemcpy((void *)((UINT8 *)&g_BMCInfo[BMCInst].SELConfig.SelPartialAddRecord + RecordOffset),
  1480. (void *)pParAddSelReq->RecordData,
  1481. ((UINT8)(Len - SEL_PARTIAL_ADD_REQUEST_MISC_BYTES)));
  1482. g_BMCInfo[BMCInst].SELConfig.PartialAddRecordID=RecordID;
  1483. pParAddSelRes->RecID = RecordID;
  1484. g_BMCInfo[BMCInst].SELConfig.PartialAddRecOffset += (Len - SEL_PARTIAL_ADD_REQUEST_MISC_BYTES);
  1485. g_BMCInfo[BMCInst].SELConfig.PartialAdd=1;
  1486. pParAddSelRes->CompletionCode = CC_NORMAL;
  1487. //if the progress bit is 1 indicates that this is the last data of the record so put the entire record in sel repository
  1488. if(pParAddSelReq->Progress==1)
  1489. {
  1490. // Checking for complete filling of gap
  1491. if((pParAddSelReq->Offset + Len) == SEL_PARTIAL_ADD_CMD_MAX_LEN)
  1492. {
  1493. g_BMCInfo[BMCInst].SELConfig.PartialAdd=0;
  1494. OS_THREAD_TLS_GET(g_tls.CurChannel,curchannel);
  1495. if(g_corefeatures.disable_pef_for_sel_entry == ENABLED)
  1496. LockedAddSELEntry ( (INT8U*)&g_BMCInfo[BMCInst].SELConfig.SelPartialAddRecord, sizeof(SELEventRecord_T), pRes,(SYS_IFC_CHANNEL == (*curchannel & 0xF) ? TRUE : FALSE),POST_ONLY_SEL,BMCInst);
  1497. else
  1498. LockedAddSELEntry ( (INT8U*)&g_BMCInfo[BMCInst].SELConfig.SelPartialAddRecord, sizeof(SELEventRecord_T), pRes,(SYS_IFC_CHANNEL == (*curchannel & 0xF) ? TRUE : FALSE),POST_SEL_AND_PEF,BMCInst);
  1499. }
  1500. else
  1501. {
  1502. pParAddSelRes->CompletionCode = CC_REQ_INV_LEN;
  1503. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->SELConfig.SELMutex);
  1504. return(sizeof(PartialAddSELRes_T));
  1505. }
  1506. }
  1507. }
  1508. else
  1509. {
  1510. if(ReservationID != g_BMCInfo[BMCInst].SELConfig.SelReservationID)
  1511. {
  1512. pParAddSelRes->CompletionCode = CC_INV_RESERVATION_ID;
  1513. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->SELConfig.SELMutex);
  1514. return(sizeof(PartialAddSELRes_T));
  1515. }
  1516. else
  1517. {
  1518. pParAddSelRes->CompletionCode = CC_INV_DATA_FIELD;
  1519. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->SELConfig.SELMutex);
  1520. return(sizeof(PartialAddSELRes_T));
  1521. }
  1522. }
  1523. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->SELConfig.SELMutex);
  1524. return sizeof (PartialAddSELRes_T);
  1525. }
  1526. /*---------------------------------------
  1527. * DeleteSELEntry
  1528. *---------------------------------------*/
  1529. int
  1530. DeleteSELEntry (_NEAR_ INT8U* pReq, INT8U ReqLen, _NEAR_ INT8U* pRes,_NEAR_ int BMCInst)
  1531. {
  1532. _NEAR_ DeleteSELReq_T* pDelSelReq = (_NEAR_ DeleteSELReq_T*) pReq;
  1533. _NEAR_ DeleteSELRes_T* pDelSelRes = (_NEAR_ DeleteSELRes_T*) pRes;
  1534. // _FAR_ SELRec_T* pPrevSel;
  1535. INT16U LastRecID = 0,FirstRecID = 0;
  1536. _FAR_ SELRepository_T* _FAR_ m_sel = NULL;
  1537. _FAR_ SELRec_T* pRec = NULL;
  1538. _FAR_ AMIConfig_T* pAMIcfg;
  1539. int nRet =0;
  1540. int SelReclaim = 0;
  1541. int ReservCmdStat=0;
  1542. _FAR_ BMCInfo_t* pBMCInfo = &g_BMCInfo[BMCInst];
  1543. OS_THREAD_MUTEX_ACQUIRE(&pBMCInfo->SELConfig.SELMutex, WAIT_INFINITE);
  1544. SelReclaim = g_corefeatures.del_sel_reclaim_support;
  1545. if(!SelReclaim)
  1546. {
  1547. m_sel = (_FAR_ SELRepository_T*) GetSDRSELNVRAddr ((pBMCInfo->IpmiConfig.SDRAllocationSize * 1024), BMCInst);
  1548. }
  1549. if(g_PDKCmdsHandle[PDKCMDS_PDKISCOMMANDENABLED]!= NULL)
  1550. {
  1551. if(((int(*)(INT8U,INT8U*,INT8U,int))g_PDKCmdsHandle[PDKCMDS_PDKISCOMMANDENABLED])(NETFN_STORAGE,NULL,CMD_RESERVE_SEL,BMCInst) == 0)
  1552. {
  1553. ReservCmdStat=ENABLED;
  1554. }
  1555. }
  1556. if (TRUE == g_BMCInfo[BMCInst].SELConfig.RsrvIDCancelled)
  1557. {
  1558. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->SELConfig.SELMutex);
  1559. pDelSelRes->CompletionCode = CC_INV_RESERVATION_ID;
  1560. return sizeof (INT8U);
  1561. }
  1562. /* Check if the reservation IDs match */
  1563. if (((g_BMCInfo[BMCInst].SELConfig.SelReservationID != pDelSelReq->ReservationID) &&
  1564. (pDelSelReq->ReservationID != 0)) || ((pDelSelReq->ReservationID == 0) && ReservCmdStat == ENABLED ))
  1565. {
  1566. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->SELConfig.SELMutex);
  1567. pDelSelRes->CompletionCode = CC_INV_RESERVATION_ID;
  1568. return sizeof (INT8U);
  1569. }
  1570. LastRecID = BMC_GET_SHARED_MEM (BMCInst)->m_LastRecID;
  1571. FirstRecID = BMC_GET_SHARED_MEM (BMCInst)->m_FirstRecID;
  1572. if ( pDelSelReq->RecID == 0x0000 )
  1573. {
  1574. pDelSelReq->RecID = FirstRecID ;
  1575. }
  1576. else if ( pDelSelReq->RecID == 0xFFFF )
  1577. {
  1578. pDelSelReq->RecID = LastRecID;
  1579. }
  1580. pRec= GetSELRec(pDelSelReq->RecID, BMCInst);
  1581. if ( pRec == 0 ||(pRec->Valid != VALID_RECORD) )
  1582. {
  1583. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->SELConfig.SELMutex);
  1584. pDelSelRes->CompletionCode = CC_SDR_REC_NOT_PRESENT;
  1585. return sizeof (INT8U);
  1586. }
  1587. g_BMCInfo[BMCInst].SELConfig.RsrvIDCancelled = TRUE;
  1588. if(!SelReclaim)
  1589. {
  1590. // m_sel->NumRecords--; Do not decrease the sel count, as sel space can't be reclaimed in linear sel
  1591. pRec->Valid = STATUS_DELETE_SEL;
  1592. FlushSEL(pRec, sizeof(SELRec_T), nRet,BMCInst);
  1593. #if IPM_DEVICE == 1
  1594. if (-1 == nRet)
  1595. {
  1596. g_BMCInfo[BMCInst].Msghndlr.SelfTestByte |= GST_CANNOT_ACCESS_SEL;
  1597. }
  1598. else
  1599. {
  1600. g_BMCInfo[BMCInst].Msghndlr.SelfTestByte &= ~GST_CANNOT_ACCESS_SEL;
  1601. }
  1602. #endif
  1603. /*Update the Last Deleted SEL time*/
  1604. m_sel->EraseTimeStamp = GetSelTimeStamp (BMCInst);
  1605. FlushSEL (&m_sel->EraseTimeStamp, sizeof(INT32U), nRet,BMCInst);
  1606. #if IPM_DEVICE == 1
  1607. if (-1 == nRet)
  1608. {
  1609. g_BMCInfo[BMCInst].Msghndlr.SelfTestByte |= GST_CANNOT_ACCESS_SEL;
  1610. }
  1611. else
  1612. {
  1613. g_BMCInfo[BMCInst].Msghndlr.SelfTestByte &= ~GST_CANNOT_ACCESS_SEL;
  1614. }
  1615. #endif
  1616. }
  1617. else
  1618. {
  1619. pBMCInfo->SELReclaimRepos.pSELReclaimInfo->NumRecords--;
  1620. /* When there is no record in repository, reset the record postion */
  1621. if(pBMCInfo->SELReclaimRepos.pSELReclaimInfo->NumRecords == 0)
  1622. {
  1623. pBMCInfo->SELReclaimRepos.pSELReclaimInfo->MaxRecPos = 0;
  1624. }
  1625. nRet = ReFlushDeleteReclaimSEL( pDelSelReq->RecID, BMCInst);
  1626. if( 0 == nRet )
  1627. {
  1628. AddSELRecordIDNode(&(SEL_RECLAIM_RECORD_HEAD_NODE(BMCInst)),
  1629. &(SEL_RECLAIM_RECORD_TAIL_NODE(BMCInst)),pDelSelReq->RecID,BMCInst);
  1630. pBMCInfo->SELReclaimRepos.pSELReclaimInfo->EraseTimeStamp = GetSelTimeStamp(BMCInst);
  1631. nRet = SaveSELReclaimInfo(pBMCInfo->SELReclaimRepos.pSELReclaimInfo,BMCInst);
  1632. #if IPM_DEVICE == 1
  1633. if (-1 == nRet)
  1634. {
  1635. g_BMCInfo[BMCInst].Msghndlr.SelfTestByte |= GST_CANNOT_ACCESS_SEL;
  1636. }
  1637. else
  1638. {
  1639. g_BMCInfo[BMCInst].Msghndlr.SelfTestByte &= ~GST_CANNOT_ACCESS_SEL;
  1640. }
  1641. #endif
  1642. }
  1643. else
  1644. {
  1645. #if IPM_DEVICE == 1
  1646. if (-1 == nRet)
  1647. {
  1648. g_BMCInfo[BMCInst].Msghndlr.SelfTestByte |= GST_CANNOT_ACCESS_SEL;
  1649. }
  1650. else
  1651. {
  1652. g_BMCInfo[BMCInst].Msghndlr.SelfTestByte &= ~GST_CANNOT_ACCESS_SEL;
  1653. }
  1654. #endif
  1655. }
  1656. }
  1657. /*Disable the Overflow Flag if the Last deleted record id is 1*/
  1658. if((LastRecID==1) &&(pDelSelReq->RecID == LastRecID)&& (pBMCInfo->AMIConfig.CircularSELFlag) && (!SelReclaim))
  1659. {
  1660. pAMIcfg = &pBMCInfo->AMIConfig;
  1661. pAMIcfg->CircularSELFlag = 0;
  1662. FlushIPMI((INT8U*)&pBMCInfo->AMIConfig,(INT8U*)&pBMCInfo->AMIConfig.CircularSELFlag,
  1663. pBMCInfo->IPMIConfLoc.AMIConfigAddr,sizeof(INT8U),BMCInst);
  1664. }
  1665. /*Update the First and last Record ID if the requested RecID is either First or Last*/
  1666. if(!SelReclaim)
  1667. {
  1668. FindRecOrder(BMCInst);
  1669. }
  1670. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->SELConfig.SELMutex);
  1671. pDelSelRes->CompletionCode = CC_NORMAL;
  1672. pDelSelRes->RecID = pDelSelReq->RecID;
  1673. if(g_PDKHandle[PDK_POSTDELETESEL] != NULL)
  1674. {
  1675. ((INT8U(*)(INT16U, int)) g_PDKHandle[PDK_POSTDELETESEL])(pDelSelReq->RecID, BMCInst);
  1676. }
  1677. // To send notification to CIM
  1678. if(g_PDKCIMEventHandle[PDKCIMEVENT_NOTIFYSERVERUPDATETOCIM] != NULL)
  1679. {
  1680. uint8 CMD;
  1681. // Set bits for SEL Event & Delete operation
  1682. CMD = 0x23;
  1683. ((int(*)(uint8, uint16))g_PDKCIMEventHandle[PDKCIMEVENT_NOTIFYSERVERUPDATETOCIM])(CMD, pDelSelReq->RecID);
  1684. }
  1685. return sizeof (DeleteSELRes_T);
  1686. }
  1687. /*---------------------------------------
  1688. * ClearSEL
  1689. *---------------------------------------*/
  1690. int
  1691. ClearSEL (_NEAR_ INT8U* pReq, INT8U ReqLen, _NEAR_ INT8U* pRes,_NEAR_ int BMCInst)
  1692. {
  1693. _NEAR_ ClearSELReq_T* pClrSelReq = (_NEAR_ ClearSELReq_T*) pReq;
  1694. _NEAR_ ClearSELRes_T* pClrSelRes = (_NEAR_ ClearSELRes_T*) pRes;
  1695. _FAR_ PEFRecordDetailsConfig_T* nvrPefRecordDetails;
  1696. _FAR_ AMIConfig_T* pAMIcfg;
  1697. _FAR_ BMCInfo_t* pBMCInfo = &g_BMCInfo[BMCInst];
  1698. _FAR_ SELRepository_T* _FAR_ m_sel = NULL;
  1699. char RemDirName[MAXFILESIZE],DirName[MAXFILESIZE]={0};
  1700. int ReclaimSEL,nRet = 0;
  1701. ReclaimSEL = g_corefeatures.del_sel_reclaim_support;
  1702. OS_THREAD_MUTEX_ACQUIRE(&pBMCInfo->SELConfig.SELMutex, WAIT_INFINITE);
  1703. if(!ReclaimSEL)
  1704. {
  1705. m_sel = (_FAR_ SELRepository_T*) GetSDRSELNVRAddr ((pBMCInfo->IpmiConfig.SDRAllocationSize * 1024), BMCInst);
  1706. }
  1707. if (_fmemcmp(pClrSelReq->CLR, "CLR", CLR_SEL_PASSWORD_STR_LEN))
  1708. {
  1709. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->SELConfig.SELMutex);
  1710. pClrSelRes->CompletionCode = CC_INV_DATA_FIELD;
  1711. return sizeof (INT8U);
  1712. }
  1713. if (pClrSelReq->InitOrStatus == CLEAR_SEL_GET_STATUS)
  1714. {
  1715. pClrSelRes->CompletionCode = CC_NORMAL;
  1716. pClrSelRes->EraseProgress = SEL_ERASE_COMPLETED;
  1717. pBMCInfo->SELConfig.RsrvIDCancelled = TRUE;
  1718. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->SELConfig.SELMutex);
  1719. return sizeof (ClearSELRes_T);
  1720. }
  1721. if ( (TRUE == pBMCInfo->SELConfig.RsrvIDCancelled) || (pBMCInfo->SELConfig.SelReservationID != pClrSelReq->ReservationID) )
  1722. {
  1723. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->SELConfig.SELMutex);
  1724. pClrSelRes->CompletionCode = CC_INV_RESERVATION_ID;
  1725. return sizeof (INT8U);
  1726. }
  1727. if (pClrSelReq->InitOrStatus != CLEAR_SEL_ACTION)
  1728. {
  1729. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->SELConfig.SELMutex);
  1730. pClrSelRes->CompletionCode = CC_INV_DATA_FIELD;
  1731. return sizeof (INT8U);
  1732. }
  1733. /* Check if the reservation IDs match */
  1734. /* if (m_SelReservationID != pClrSelReq->ReservationID)
  1735. {
  1736. pClrSelRes->CompletionCode = CC_INV_RESERVATION_ID;
  1737. return sizeof (INT8U);
  1738. }*/
  1739. /* PDK Module Pre Clear SEL Controle function*/
  1740. if(g_PDKHandle[PDK_PRECLEARSEL] != NULL)
  1741. {
  1742. ((INT8U(*)(int)) g_PDKHandle[PDK_PRECLEARSEL])(BMCInst);
  1743. }
  1744. if(!ReclaimSEL)
  1745. {
  1746. /* Clear the fields of the SEL */
  1747. BMC_GET_SHARED_MEM (BMCInst)->m_LastRecID = 0;
  1748. BMC_GET_SHARED_MEM (BMCInst)->m_FirstRecID = 0;
  1749. BMC_GET_SHARED_MEM (BMCInst)->m_SELIndex = 0;
  1750. m_sel->NumRecords = 0;
  1751. _fmemset (&m_sel->SELRecord [0], 0xFF, pBMCInfo->SELConfig.MaxSELRecord * sizeof (SELRec_T));
  1752. if(g_corefeatures.sel_write_background == ENABLED)
  1753. {
  1754. PostSELToFlush(FLUSH_CLEAR_SEL,NULL,BMCInst);
  1755. }
  1756. else
  1757. {
  1758. FlushSEL (&m_sel->SELRecord [0], pBMCInfo->SELConfig.MaxSELRecord * sizeof (SELRec_T), nRet,BMCInst);
  1759. }
  1760. #if IPM_DEVICE == 1
  1761. if (-1 == nRet)
  1762. {
  1763. g_BMCInfo[BMCInst].Msghndlr.SelfTestByte |= GST_CANNOT_ACCESS_SEL;
  1764. }
  1765. else
  1766. {
  1767. g_BMCInfo[BMCInst].Msghndlr.SelfTestByte &= ~GST_CANNOT_ACCESS_SEL;
  1768. }
  1769. #endif
  1770. /*Update the Last Deleted SEL time*/
  1771. pBMCInfo->SELConfig.LastEvtTS = m_sel->EraseTimeStamp = GetSelTimeStamp (BMCInst);
  1772. if(g_corefeatures.sel_write_background == ENABLED)
  1773. {
  1774. PostSELToFlush(FLUSH_ERASE_TIMESTAMP,NULL,BMCInst);
  1775. }
  1776. else
  1777. {
  1778. FlushSEL (&m_sel->EraseTimeStamp, sizeof(INT32U), nRet,BMCInst);
  1779. }
  1780. #if IPM_DEVICE == 1
  1781. if (-1 == nRet)
  1782. {
  1783. g_BMCInfo[BMCInst].Msghndlr.SelfTestByte |= GST_CANNOT_ACCESS_SEL;
  1784. }
  1785. else
  1786. {
  1787. g_BMCInfo[BMCInst].Msghndlr.SelfTestByte &= ~GST_CANNOT_ACCESS_SEL;
  1788. }
  1789. #endif
  1790. }
  1791. else
  1792. {
  1793. BMC_GET_SHARED_MEM(BMCInst)->m_LastRecID = 0;
  1794. BMC_GET_SHARED_MEM(BMCInst)->m_FirstRecID = 0;
  1795. pBMCInfo->SELConfig.LastEvtTS = pBMCInfo->SELReclaimRepos.pSELReclaimInfo->EraseTimeStamp = GetSelTimeStamp (BMCInst);
  1796. pBMCInfo->SELReclaimRepos.pSELReclaimInfo->NumRecords = 0;
  1797. pBMCInfo->SELReclaimRepos.pSELReclaimInfo->LastFileIndex = 0;
  1798. pBMCInfo->SELReclaimRepos.pSELReclaimInfo->MaxRecPos = 0;
  1799. DeleteReclaimAllSELNode(&(SEL_RECLAIM_HEAD_NODE(BMCInst)),&(SEL_RECLAIM_TAIL_NODE(BMCInst)),BMCInst);
  1800. SEL_RECLAIM_DIR(BMCInst,DirName);
  1801. sprintf(RemDirName,"rm -rf %s/*",DirName);
  1802. safe_system(RemDirName);
  1803. nRet = SaveSELReclaimInfo(pBMCInfo->SELReclaimRepos.pSELReclaimInfo,BMCInst);
  1804. #if IPM_DEVICE == 1
  1805. if (-1 == nRet)
  1806. {
  1807. g_BMCInfo[BMCInst].Msghndlr.SelfTestByte |= GST_CANNOT_ACCESS_SEL;
  1808. }
  1809. else
  1810. {
  1811. g_BMCInfo[BMCInst].Msghndlr.SelfTestByte &= ~GST_CANNOT_ACCESS_SEL;
  1812. }
  1813. #endif
  1814. }
  1815. nvrPefRecordDetails = &pBMCInfo->PEFRecordDetailsConfig;
  1816. pAMIcfg = &pBMCInfo->AMIConfig;
  1817. pAMIcfg->CircularSELFlag = 0;
  1818. nvrPefRecordDetails->LastSELRecordID = 0xffff;
  1819. nvrPefRecordDetails->LastSWProcessedEventID = 0xffff;
  1820. nvrPefRecordDetails->LastBMCProcessedEventID = 0xffff;
  1821. /* Flush the values to NVRAM */
  1822. if(g_corefeatures.sel_write_background == ENABLED)
  1823. {
  1824. PostSELToFlush(FLUSH_LAST_RECID,NULL,BMCInst);
  1825. PostSELToFlush(FLUSH_SW_PROC_EVT_ID,NULL,BMCInst);
  1826. PostSELToFlush(FLUSH_BMC_PROC_EVT_ID,NULL,BMCInst);
  1827. if(!ReclaimSEL)
  1828. {
  1829. PostSELToFlush(FLUSH_CIRCULAR_SEL_FLAG,NULL,BMCInst);
  1830. }
  1831. }
  1832. else
  1833. {
  1834. FlushIPMI((INT8U*)&pBMCInfo->PEFRecordDetailsConfig,(INT8U*)&pBMCInfo->PEFRecordDetailsConfig.LastSELRecordID,
  1835. pBMCInfo->IPMIConfLoc.PEFRecordDetailsConfigAddr,sizeof(INT16U),BMCInst);
  1836. FlushIPMI((INT8U*)&pBMCInfo->PEFRecordDetailsConfig,(INT8U*)&pBMCInfo->PEFRecordDetailsConfig.LastSWProcessedEventID,
  1837. pBMCInfo->IPMIConfLoc.PEFRecordDetailsConfigAddr,sizeof(INT16U),BMCInst);
  1838. FlushIPMI((INT8U*)&pBMCInfo->PEFRecordDetailsConfig,(INT8U*)&pBMCInfo->PEFRecordDetailsConfig.LastBMCProcessedEventID,
  1839. pBMCInfo->IPMIConfLoc.PEFRecordDetailsConfigAddr,sizeof(INT16U),BMCInst);
  1840. if(!ReclaimSEL)
  1841. {
  1842. FlushIPMI((INT8U*)&pBMCInfo->AMIConfig,(INT8U*)&pBMCInfo->AMIConfig.CircularSELFlag,
  1843. pBMCInfo->IPMIConfLoc.AMIConfigAddr,sizeof(INT8U),BMCInst);
  1844. }
  1845. }
  1846. pClrSelRes->CompletionCode = CC_NORMAL;
  1847. pClrSelRes->EraseProgress = SEL_ERASE_COMPLETED;
  1848. pBMCInfo->SELConfig.SELOverFlow = FALSE;
  1849. pBMCInfo->SELConfig.RsrvIDCancelled = TRUE;
  1850. pBMCInfo->SELConfig.selalmostfull = 0;
  1851. /* Add an Clear SEL Log if needed */
  1852. if(g_corefeatures.internal_sensor == ENABLED)
  1853. {
  1854. SetSELSensorReading ( EVENT_LOG_AREA_RESET,BMCInst);
  1855. LogClearSELEvent(BMCInst);
  1856. }
  1857. if(g_PDKHandle[PDK_POSTCLEARSEL] != NULL)
  1858. {
  1859. ((INT8U(*)(int)) g_PDKHandle[PDK_POSTCLEARSEL])(BMCInst);
  1860. }
  1861. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->SELConfig.SELMutex);
  1862. // To send notification to CIM
  1863. if(g_PDKCIMEventHandle[PDKCIMEVENT_NOTIFYSERVERUPDATETOCIM] != NULL)
  1864. {
  1865. uint8 CMD;
  1866. // set bits for SEL Event & Clear operation
  1867. CMD = 0x24;
  1868. ((int(*)(uint8, uint16))g_PDKCIMEventHandle[PDKCIMEVENT_NOTIFYSERVERUPDATETOCIM])(CMD, 0);
  1869. }
  1870. return sizeof (ClearSELRes_T);
  1871. }
  1872. /*---------------------------------------
  1873. * GetSELTime
  1874. *---------------------------------------*/
  1875. int
  1876. GetSELTime (_NEAR_ INT8U* pReq, INT8U ReqLen, _NEAR_ INT8U* pRes,_NEAR_ int BMCInst)
  1877. {
  1878. _NEAR_ GetSELTimeRes_T* pGetSelTimeRes = (_NEAR_ GetSELTimeRes_T*) pRes;
  1879. BMCInfo_t *pBMCInfo = &g_BMCInfo[BMCInst];
  1880. OS_THREAD_MUTEX_ACQUIRE(&pBMCInfo->SELConfig.SELMutex, WAIT_INFINITE);
  1881. pGetSelTimeRes->CompletionCode = CC_NORMAL;
  1882. pGetSelTimeRes->Time = htoipmi_u32(GET_SYSTEM_TIME_STAMP ());
  1883. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->SELConfig.SELMutex);
  1884. return sizeof (GetSELTimeRes_T);
  1885. }
  1886. /**
  1887. * @fn setUTC_Offset
  1888. * @brief Set the UTC offset in the linux kernel.
  1889. * @param[in] UTCOffset - Offset value in minutes.
  1890. * @retval 0, on success.
  1891. * 1, on failure.
  1892. */
  1893. static int setUTC_Offset (INT16 UTCOffset)
  1894. {
  1895. int mins = 0, hrs = 0;
  1896. char cmd[CMD_LEN], file[32];
  1897. if ((SEL_UTC_MIN_RANGE > UTCOffset) || (SEL_UTC_MAX_RANGE < UTCOffset) || (0 != (UTCOffset % 15)))
  1898. {
  1899. return 1;
  1900. }
  1901. hrs = UTCOffset / 60;
  1902. mins = UTCOffset % 60;
  1903. TDBG ("hrs : %d, mins : %d\n", hrs, mins);
  1904. if (0 > UTCOffset)
  1905. {
  1906. sprintf(file, "GMT+%d", (-1 * hrs));
  1907. mins *= -1;
  1908. }
  1909. else
  1910. {
  1911. sprintf(file, "GMT-%d", hrs);
  1912. }
  1913. if (0 != mins)
  1914. {
  1915. sprintf(file, "%s:%d", file, mins);
  1916. }
  1917. snprintf (cmd, CMD_LEN, "%s %s/%s %s", LINK_CMD, ZONEINFO_DIR, file, LOCALTIME);
  1918. TDBG ("Command : %s\n", cmd);
  1919. return (safe_system (cmd));
  1920. }
  1921. /*---------------------------------------
  1922. * Updates the BMC TimeZone variable
  1923. *---------------------------------------*/
  1924. int UpdateTimeZone (INT8U *TimeZone)
  1925. {
  1926. struct tm *loctm = NULL;
  1927. time_t Curtime = 0;
  1928. time(&Curtime);
  1929. loctm = localtime(&Curtime);
  1930. if (loctm->tm_gmtoff == 0)
  1931. {
  1932. snprintf ((char*)TimeZone, TIME_ZONE_LEN, "%s/%s", MANUAL_OFFSETS, loctm->tm_zone);
  1933. }
  1934. else if (loctm->tm_gmtoff < 0)
  1935. {
  1936. snprintf ((char*)TimeZone, TIME_ZONE_LEN, "%s%s", TIMEZONE_OFFSET_NVE, (loctm->tm_zone+4));
  1937. }
  1938. else
  1939. {
  1940. snprintf ((char*)TimeZone, TIME_ZONE_LEN, "%s%s", TIMEZONE_OFFSET_PVE, (loctm->tm_zone+4));
  1941. }
  1942. return 0;
  1943. }
  1944. /*---------------------------------------
  1945. * SetSELTime
  1946. *---------------------------------------*/
  1947. int
  1948. SetSELTime (_NEAR_ INT8U* pReq, INT8U ReqLen, _NEAR_ INT8U* pRes,_NEAR_ int BMCInst)
  1949. {
  1950. INT32U localTime = 0;
  1951. _NEAR_ SetSELTimeReq_T* pSetSelTimeReq = (_NEAR_ SetSELTimeReq_T*) pReq;
  1952. BMCInfo_t *pBMCInfo = &g_BMCInfo[BMCInst];
  1953. localTime = ipmitoh_u32 (pSetSelTimeReq->Time);
  1954. OS_THREAD_MUTEX_ACQUIRE(&pBMCInfo->SELConfig.SELMutex, WAIT_INFINITE);
  1955. if(g_corefeatures.sel_clock_sync == ENABLED)
  1956. SELTimeClockSync(PRE_CLK_SET, BMCInst);
  1957. SET_SYSTEM_TIME_STAMP (&localTime);
  1958. if(g_corefeatures.sel_clock_sync == ENABLED)
  1959. SELTimeClockSync(POST_CLK_SET, BMCInst);
  1960. /* Resetting the SELTimeUTCOffset to default value */
  1961. if (0 != setUTC_Offset (0))
  1962. {
  1963. pRes [0] = CC_INV_DATA_FIELD;
  1964. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->SELConfig.SELMutex);
  1965. return sizeof (*pRes);
  1966. }
  1967. if(g_corefeatures.time_zone_support == ENABLED)
  1968. {
  1969. UpdateTimeZone (pBMCInfo->GenConfig.TimeZone);
  1970. }
  1971. pBMCInfo->GenConfig.SELTimeUTCOffset = UNSPECIFIED_UTC_OFFSET;
  1972. /*Write to NVRAM*/
  1973. FlushIPMI((INT8U*)&pBMCInfo->GenConfig,(INT8U*)&pBMCInfo->GenConfig,pBMCInfo->IPMIConfLoc.GenConfigAddr,
  1974. sizeof(GENConfig_T),BMCInst);
  1975. pRes [0] = CC_NORMAL;
  1976. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->SELConfig.SELMutex);
  1977. return sizeof (*pRes);
  1978. }
  1979. /*---------------------------------------
  1980. * GetSELTimeUTC_Offset
  1981. *---------------------------------------*/
  1982. int
  1983. GetSELTimeUTC_Offset (_NEAR_ INT8U* pReq, INT8U ReqLen, _NEAR_ INT8U* pRes,_NEAR_ int BMCInst)
  1984. {
  1985. _NEAR_ GetSELTimeUTCOffsetRes_T* pGetSelTimeUTCOffsetRes = (_NEAR_ GetSELTimeUTCOffsetRes_T*) pRes;
  1986. BMCInfo_t *pBMCInfo = &g_BMCInfo[BMCInst];
  1987. OS_THREAD_MUTEX_ACQUIRE(&pBMCInfo->SELConfig.SELMutex, WAIT_INFINITE);
  1988. pGetSelTimeUTCOffsetRes->CompletionCode = CC_NORMAL;
  1989. pGetSelTimeUTCOffsetRes->UTCOffset = htoipmi_u16(pBMCInfo->GenConfig.SELTimeUTCOffset);
  1990. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->SELConfig.SELMutex);
  1991. return sizeof (GetSELTimeUTCOffsetRes_T);
  1992. }
  1993. /*---------------------------------------
  1994. * SetSELTimeUTC_Offset
  1995. *---------------------------------------*/
  1996. int
  1997. SetSELTimeUTC_Offset (_NEAR_ INT8U* pReq, INT8U ReqLen, _NEAR_ INT8U* pRes,_NEAR_ int BMCInst)
  1998. {
  1999. _NEAR_ SetSELTimeUTCOffsetReq_T* pSetSELTimeUTCOffsetReq = (_NEAR_ SetSELTimeUTCOffsetReq_T*) pReq;
  2000. _NEAR_ SetSELTimeUTCOffsetRes_T* pSetSELTimeUTCOffsetRes = (_NEAR_ SetSELTimeUTCOffsetRes_T*) pRes;
  2001. BMCInfo_t *pBMCInfo = &g_BMCInfo[BMCInst];
  2002. INT16 UTCOffset;
  2003. UTCOffset = (INT16) ipmitoh_u16(pSetSELTimeUTCOffsetReq->UTCOffset);
  2004. OS_THREAD_MUTEX_ACQUIRE(&pBMCInfo->SELConfig.SELMutex, WAIT_INFINITE);
  2005. if (((UTCOffset <= SEL_UTC_MAX_RANGE) && (UTCOffset >= SEL_UTC_MIN_RANGE)) || (UTCOffset == UNSPECIFIED_UTC_OFFSET))
  2006. {
  2007. if (0 != setUTC_Offset ((UTCOffset == UNSPECIFIED_UTC_OFFSET) ? 0 : UTCOffset))
  2008. {
  2009. pSetSELTimeUTCOffsetRes->CompletionCode = CC_INV_DATA_FIELD;
  2010. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->SELConfig.SELMutex);
  2011. return sizeof (*pRes);
  2012. }
  2013. if(g_corefeatures.time_zone_support == ENABLED)
  2014. {
  2015. UpdateTimeZone (pBMCInfo->GenConfig.TimeZone);
  2016. }
  2017. pBMCInfo->GenConfig.SELTimeUTCOffset = UTCOffset;
  2018. /*Write to NVRAM*/
  2019. FlushIPMI((INT8U*)&pBMCInfo->GenConfig,(INT8U*)&pBMCInfo->GenConfig,pBMCInfo->IPMIConfLoc.GenConfigAddr,
  2020. sizeof(GENConfig_T),BMCInst);
  2021. pSetSELTimeUTCOffsetRes->CompletionCode = CC_NORMAL;
  2022. }
  2023. else
  2024. {
  2025. pSetSELTimeUTCOffsetRes->CompletionCode = CC_PARAM_OUT_OF_RANGE;
  2026. }
  2027. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->SELConfig.SELMutex);
  2028. return sizeof (*pRes);
  2029. }
  2030. /*---------------------------------------
  2031. * GetAuxiliaryLogStatus
  2032. *---------------------------------------*/
  2033. int
  2034. GetAuxiliaryLogStatus(_NEAR_ INT8U* pReq, INT8U ReqLen, _NEAR_ INT8U* pRes,_NEAR_ int BMCInst)
  2035. {
  2036. return 0;
  2037. }
  2038. /*---------------------------------------
  2039. * SetAuxiliaryLogStatus
  2040. *---------------------------------------*/
  2041. int
  2042. SetAuxiliaryLogStatus(_NEAR_ INT8U* pReq, INT8U ReqLen, _NEAR_ INT8U* pRes,_NEAR_ int BMCInst)
  2043. {
  2044. return 0;
  2045. }
  2046. /*---------------------------------------
  2047. * GetNextSELEntry
  2048. *---------------------------------------*/
  2049. static _FAR_ SELRec_T*
  2050. GetNextSELEntry (_FAR_ SELRec_T* rec, int BMCInst)
  2051. {
  2052. SELEventNode *SELNode = NULL;
  2053. //INT16U LastRecID = 0;
  2054. //LOCK_BMC_SHARED_MEM(BMCInst);
  2055. //LastRecID = BMC_GET_SHARED_MEM (BMCInst)->m_LastRecID;
  2056. //UNLOCK_BMC_SHARED_MEM(BMCInst) ;
  2057. /* As SEL Record ID is incremental upto 0xFFFE,can't validate the Current Rec ID
  2058. with Last Rec ID, because rec ID will be greater than last RecID if the Circular SEL is used. */
  2059. /* if (!CircularSEL && rec->EvtRecord.hdr.ID >= LastRecID)
  2060. {
  2061. return 0;
  2062. }
  2063. else
  2064. {*/
  2065. if(g_corefeatures.del_sel_reclaim_support != ENABLED)
  2066. {
  2067. rec++;
  2068. while (1)
  2069. {
  2070. if (rec->Valid == VALID_RECORD)
  2071. {
  2072. return rec;
  2073. }
  2074. else if (rec->Valid == STATUS_DELETE_SEL)
  2075. {
  2076. rec++;
  2077. }
  2078. else
  2079. {
  2080. break;
  2081. }
  2082. }
  2083. }
  2084. else
  2085. {
  2086. SELNode = SEL_RECORD_ADDR(BMCInst,rec->EvtRecord.hdr.ID).RecAddr;
  2087. if((SELNode != NULL) && (SELNode->NextRec != NULL))
  2088. {
  2089. return (&(SELNode->NextRec)->SELRecord);
  2090. }
  2091. else
  2092. {
  2093. return NULL;
  2094. }
  2095. }
  2096. return 0;
  2097. }
  2098. /*
  2099. @ fn GetSELRec
  2100. @ brief This function is used to get the SEL Record based Record ID
  2101. @ params RecID[in] Record ID BMCInst[in]
  2102. @ returns SELRecord pointer on success and 0 on failures
  2103. */
  2104. static _FAR_ SELRec_T* GetSELRec(INT16U RecID,int BMCInst)
  2105. {
  2106. BMCInfo_t* pBMCInfo = &g_BMCInfo[BMCInst];
  2107. int i=0;
  2108. _FAR_ SELRepository_T* _FAR_ m_sel;
  2109. struct SELEventNode *SELNode= NULL;
  2110. if(g_corefeatures.del_sel_reclaim_support != ENABLED)
  2111. {
  2112. m_sel = (_FAR_ SELRepository_T*) GetSDRSELNVRAddr ((pBMCInfo->IpmiConfig.SDRAllocationSize * 1024), BMCInst);
  2113. for(i=0;i<pBMCInfo->SELConfig.MaxSELRecord;i++)
  2114. {
  2115. if((m_sel->SELRecord[i].EvtRecord.hdr.ID == RecID) && (m_sel->SELRecord[i].Valid== VALID_RECORD))
  2116. {
  2117. return &m_sel->SELRecord[i];
  2118. }
  2119. }
  2120. }
  2121. else if (RecID <= pBMCInfo->SELConfig.MaxSELRecord)
  2122. {
  2123. SELNode =SEL_RECORD_ADDR(BMCInst, RecID).RecAddr;
  2124. if(NULL != SELNode)
  2125. {
  2126. return &SELNode->SELRecord;
  2127. }
  2128. }
  2129. return 0;
  2130. }
  2131. /*
  2132. @ fn FindRecOrder
  2133. @ brief This function is used to Update the First and Last SEL Record ID for Circular SEL
  2134. @ params BMCInst[in] - BMC Instance
  2135. */
  2136. static _FAR_ void FindRecOrder(int BMCInst)
  2137. {
  2138. BMCInfo_t *pBMCInfo = &g_BMCInfo[BMCInst];
  2139. _FAR_ SELRepository_T* _FAR_ m_sel;
  2140. int i=0,index=0,FirstIndex = 0,j=0;
  2141. INT16U LastRecID = 0,FirstRecID = 0,TempRecID = 0;
  2142. m_sel = (_FAR_ SELRepository_T*) GetSDRSELNVRAddr ((pBMCInfo->IpmiConfig.SDRAllocationSize * 1024), BMCInst);
  2143. /*Find the largetest and lowest Rec ID to find out First and last Rec ID*/
  2144. while(i < pBMCInfo->SELConfig.MaxSELRecord)
  2145. {
  2146. if(m_sel->SELRecord[i].Valid == VALID_RECORD)
  2147. {
  2148. LastRecID = m_sel->SELRecord[i].EvtRecord.hdr.ID;
  2149. FirstRecID = m_sel->SELRecord[i].EvtRecord.hdr.ID;
  2150. i++;
  2151. break;
  2152. }
  2153. else
  2154. {
  2155. i++;
  2156. }
  2157. }
  2158. for(;i<pBMCInfo->SELConfig.MaxSELRecord;i++)
  2159. {
  2160. if(m_sel->SELRecord[i].Valid != VALID_RECORD)
  2161. {
  2162. continue;
  2163. }
  2164. if(m_sel->SELRecord[i].EvtRecord.hdr.ID > LastRecID)
  2165. {
  2166. LastRecID = m_sel->SELRecord[i].EvtRecord.hdr.ID;
  2167. index = i;
  2168. }
  2169. if(m_sel->SELRecord[i].EvtRecord.hdr.ID < FirstRecID)
  2170. {
  2171. FirstRecID = m_sel->SELRecord[i].EvtRecord.hdr.ID;
  2172. FirstIndex = i;
  2173. }
  2174. }
  2175. if(pBMCInfo->AMIConfig.CircularSELFlag == TRUE)
  2176. {
  2177. /*Find the direction of LastRecord ID*/
  2178. if(index == (pBMCInfo->SELConfig.MaxSELRecord-1))
  2179. {
  2180. if((m_sel->SELRecord[index].EvtRecord.hdr.ID - m_sel->SELRecord[0].EvtRecord.hdr.ID) == 1)
  2181. {
  2182. i = 0;
  2183. }
  2184. else
  2185. {
  2186. i = index -1;
  2187. }
  2188. }
  2189. if((m_sel->SELRecord[index].EvtRecord.hdr.ID - m_sel->SELRecord[index +1].EvtRecord.hdr.ID) == 1)
  2190. {
  2191. i = index +1;
  2192. }
  2193. else
  2194. {
  2195. if(index == 0)
  2196. i = pBMCInfo->SELConfig.MaxSELRecord -1;
  2197. else
  2198. i = index -1;
  2199. }
  2200. /*Find the direction of FirstRecord ID*/
  2201. if(FirstIndex == (pBMCInfo->SELConfig.MaxSELRecord-1))
  2202. {
  2203. if((m_sel->SELRecord[FirstIndex].EvtRecord.hdr.ID - m_sel->SELRecord[0].EvtRecord.hdr.ID) == -1)
  2204. {
  2205. j = 0;
  2206. }
  2207. else
  2208. {
  2209. j = FirstIndex -1;
  2210. }
  2211. }
  2212. if((m_sel->SELRecord[FirstIndex].EvtRecord.hdr.ID - m_sel->SELRecord[FirstIndex +1].EvtRecord.hdr.ID) == -1)
  2213. {
  2214. j = FirstIndex +1;
  2215. }
  2216. else
  2217. {
  2218. if(FirstIndex == 0)
  2219. j = pBMCInfo->SELConfig.MaxSELRecord -1;
  2220. else
  2221. j = FirstIndex -1;
  2222. }
  2223. TempRecID = LastRecID;
  2224. /*Find the FirstRecord ID */
  2225. if((i > index && index != 0) || i == 0)
  2226. {
  2227. while( i != index)
  2228. {
  2229. if(m_sel->SELRecord[i].EvtRecord.hdr.ID == (TempRecID-1) || m_sel->SELRecord[i].EvtRecord.hdr.ID == TempRecID)
  2230. {
  2231. TempRecID = m_sel->SELRecord[i].EvtRecord.hdr.ID;
  2232. if(m_sel->SELRecord[i].Valid == VALID_RECORD)
  2233. {
  2234. /*Update the Record ID only if it is valid*/
  2235. LastRecID = m_sel->SELRecord[i].EvtRecord.hdr.ID;
  2236. }
  2237. }
  2238. else
  2239. {
  2240. break;
  2241. }
  2242. if(i == pBMCInfo->SELConfig.MaxSELRecord -1)
  2243. i =0;
  2244. else
  2245. i++;
  2246. }
  2247. }
  2248. else
  2249. {
  2250. while(i != index)
  2251. {
  2252. if(m_sel->SELRecord[i].EvtRecord.hdr.ID + 1== TempRecID || m_sel->SELRecord[i].EvtRecord.hdr.ID == TempRecID)
  2253. {
  2254. TempRecID = m_sel->SELRecord[i].EvtRecord.hdr.ID;
  2255. if(m_sel->SELRecord[i].Valid == VALID_RECORD)
  2256. {
  2257. /*Update the Record ID only if it is valid*/
  2258. LastRecID = m_sel->SELRecord[i].EvtRecord.hdr.ID;
  2259. }
  2260. }
  2261. else
  2262. {
  2263. break;
  2264. }
  2265. if(i == 0)
  2266. i = pBMCInfo->SELConfig.MaxSELRecord -1;
  2267. else
  2268. i--;
  2269. }
  2270. }
  2271. index = FirstIndex;
  2272. TempRecID = FirstRecID;
  2273. /*Find the LastRecord ID */
  2274. if((j > FirstIndex && FirstIndex != 0) || j == 0)
  2275. {
  2276. while( j != FirstIndex)
  2277. {
  2278. if(m_sel->SELRecord[j].EvtRecord.hdr.ID == (TempRecID+1) || m_sel->SELRecord[j].EvtRecord.hdr.ID == TempRecID)
  2279. {
  2280. TempRecID = m_sel->SELRecord[j].EvtRecord.hdr.ID;
  2281. if(m_sel->SELRecord[j].Valid == VALID_RECORD)
  2282. {
  2283. /*Update the Record ID only if it is valid*/
  2284. FirstRecID = m_sel->SELRecord[j].EvtRecord.hdr.ID;
  2285. }
  2286. index = j;
  2287. }
  2288. else
  2289. {
  2290. break;
  2291. }
  2292. if(j == pBMCInfo->SELConfig.MaxSELRecord -1)
  2293. j =0;
  2294. else
  2295. j++;
  2296. }
  2297. }
  2298. else
  2299. {
  2300. while(j != FirstIndex)
  2301. {
  2302. if(m_sel->SELRecord[j].EvtRecord.hdr.ID - 1== TempRecID || m_sel->SELRecord[j].EvtRecord.hdr.ID == TempRecID)
  2303. {
  2304. TempRecID = m_sel->SELRecord[j].EvtRecord.hdr.ID;
  2305. if(m_sel->SELRecord[j].Valid == VALID_RECORD)
  2306. {
  2307. /*Update the Record ID only if it is valid*/
  2308. FirstRecID = m_sel->SELRecord[j].EvtRecord.hdr.ID;
  2309. }
  2310. index = j;
  2311. }
  2312. else
  2313. {
  2314. break;
  2315. }
  2316. if(j == 0)
  2317. j = pBMCInfo->SELConfig.MaxSELRecord -1;
  2318. else
  2319. j--;
  2320. }
  2321. }
  2322. }
  2323. if(pBMCInfo->AMIConfig.CircularSELFlag == TRUE)
  2324. {
  2325. LOCK_BMC_SHARED_MEM(BMCInst);
  2326. BMC_GET_SHARED_MEM (BMCInst)->m_FirstRecID = LastRecID;
  2327. BMC_GET_SHARED_MEM (BMCInst)->m_LastRecID = FirstRecID;
  2328. BMC_GET_SHARED_MEM (BMCInst)->m_SELIndex = index +1;
  2329. UNLOCK_BMC_SHARED_MEM (BMCInst);
  2330. }
  2331. else
  2332. {
  2333. LOCK_BMC_SHARED_MEM(BMCInst);
  2334. BMC_GET_SHARED_MEM (BMCInst)->m_FirstRecID = FirstRecID;
  2335. BMC_GET_SHARED_MEM (BMCInst)->m_LastRecID = LastRecID;
  2336. BMC_GET_SHARED_MEM (BMCInst)->m_SELIndex = index +1;
  2337. UNLOCK_BMC_SHARED_MEM (BMCInst);
  2338. }
  2339. }
  2340. /*---------------------------------------
  2341. * GetSelTimeStamp
  2342. *---------------------------------------*/
  2343. INT32U
  2344. GetSelTimeStamp(int BMCInst)
  2345. {
  2346. INT16 UTCOffset;
  2347. BMCInfo_t *pBMCInfo = &g_BMCInfo[BMCInst];
  2348. UTCOffset = (INT16) ipmitoh_u16(pBMCInfo->GenConfig.SELTimeUTCOffset);
  2349. if (UNSPECIFIED_UTC_OFFSET == UTCOffset)
  2350. {
  2351. UTCOffset = 0;
  2352. }
  2353. return ((htoipmi_u32 (GET_SYSTEM_TIME_STAMP())) + (UTCOffset * 60));
  2354. }
  2355. #endif /* SEL_DEVICE */
  2356. /*---------------------------------------------------------------------------
  2357. * @fn SELTimeClockSync
  2358. *
  2359. * @brief This function is invoked when set SEL time, generate a pair of
  2360. * events(pre and post clock setting) correlating the timestamps
  2361. * for events occurring before and after the new clock value.
  2362. *
  2363. * @param Action - Specify pre-event or post-event.
  2364. * @param BMCInst - Index of BMC instance.
  2365. *
  2366. * @return 0 - if success.
  2367. * -1 - if error.
  2368. *---------------------------------------------------------------------------*/
  2369. static INT8U SELTimeClockSync(INT8U Action, int BMCInst)
  2370. {
  2371. SELEventRecord_T *EventRec = (SELEventRecord_T*)m_SysEventMsg;
  2372. _FAR_ BMCInfo_t* pBMCInfo = &g_BMCInfo[BMCInst];
  2373. INT8U pRes[sizeof(AddSELRes_T)];
  2374. EventRec->SensorNum = BMC_GET_SHARED_MEM(BMCInst)->SysEvent_SensorNo;
  2375. EventRec->EvtDirType = 0x6F; // Sensor Specific
  2376. EventRec->EvtData1 = 0x05; // Offset 05h - Timestamp Clock Sync
  2377. EventRec->EvtData2 = Action;
  2378. EventRec->EvtData3 = 0xFF;
  2379. OS_THREAD_MUTEX_ACQUIRE(&pBMCInfo->SELConfig.SELMutex, WAIT_INFINITE);
  2380. LockedAddSELEntry((INT8U*)EventRec, sizeof(SELEventRecord_T), pRes, FALSE,POST_SEL_AND_PEF, BMCInst);
  2381. OS_THREAD_MUTEX_RELEASE(&pBMCInfo->SELConfig.SELMutex);
  2382. return 0;
  2383. }
  2384. /*---------------------------------------------------------------------------
  2385. * @fn SetSELPolicy
  2386. *
  2387. * @brief This function is invoked when switch SEL policy, make appropriate
  2388. * adjustment for environment variables that related to SEL buffer.
  2389. *
  2390. * @param Policy - Specify Linear SEL policy or Circular SEL policy.
  2391. * @param BMCInst - Index of BMC instance.
  2392. *---------------------------------------------------------------------------*/
  2393. void
  2394. SetSELPolicy(INT8U Policy, int BMCInst)
  2395. {
  2396. SELRepository_T* m_sel = NULL;
  2397. BMCInfo_t *pBMCInfo = &g_BMCInfo[BMCInst];
  2398. if(!g_corefeatures.del_sel_reclaim_support)
  2399. {
  2400. m_sel = (SELRepository_T*)GetSDRSELNVRAddr((pBMCInfo->IpmiConfig.SDRAllocationSize * 1024), BMCInst);
  2401. }
  2402. switch (Policy)
  2403. {
  2404. case LINEAR_SEL:
  2405. /* Reset LastRecID because GetNextSELEntry func will stop finding the next record if RecID >= LastRecRD,
  2406. but RecID may greater than LastRecID in Circular SEL mode. */
  2407. /* LOCK_BMC_SHARED_MEM(BMCInst);
  2408. BMC_GET_SHARED_MEM (BMCInst)->m_LastRecID = m_sel->SELRecord[pBMCInfo->SELConfig.MaxSELRecord].EvtRecord.hdr.ID;
  2409. BMC_GET_SHARED_MEM (BMCInst)->m_SELIndex = m_sel->NumRecords;
  2410. BMC_GET_SHARED_MEM (BMCInst)->m_FirstRecID = m_sel->SELRecord[0].EvtRecord.hdr.ID;
  2411. UNLOCK_BMC_SHARED_MEM(BMCInst);*/
  2412. break;
  2413. case CIRCULAR_SEL:
  2414. /*Update the Last and First Record ID when switch back to Circular-linear-Circular cycle */
  2415. if((!g_corefeatures.del_sel_reclaim_support) && (m_sel->NumRecords == pBMCInfo->SELConfig.MaxSELRecord))
  2416. {
  2417. FindRecOrder( BMCInst);
  2418. }
  2419. break;
  2420. }
  2421. pBMCInfo->AMIConfig.CircularSEL = Policy;
  2422. FlushIPMI((INT8U*)&pBMCInfo->AMIConfig, (INT8U*)&pBMCInfo->AMIConfig.CircularSEL, pBMCInfo->IPMIConfLoc.AMIConfigAddr, sizeof(INT8U), BMCInst);
  2423. }