/** @file
  Module to clarify system event log of smbios structure.

  Copyright (c) 2005-2011, Intel Corporation. All rights reserved. <BR>
  SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#pragma once

#define END_OF_LOG  0xFF

#pragma pack(1)

typedef struct {
  UINT8    Type;
  UINT8    Length;
  UINT8    Year;
  UINT8    Month;
  UINT8    Day;
  UINT8    Hour;
  UINT8    Minute;
  UINT8    Second;
  UINT8    LogVariableData[1];
} LOG_RECORD_FORMAT;

typedef struct {
  UINT8    OEMReserved[5];
  UINT8    Metw;           // Multiple Event Time Window
  UINT8    Meci;           // Multiple Event Count Increment
  UINT8    CMOSAddress;    // Pre-boot Event Log Reset - CMOS Address
  UINT8    CMOSBitIndex;   // Pre-boot Event Log Reset - CMOS Bit Index
  UINT8    StartingOffset; // CMOS Checksum - Starting Offset
  UINT8    ByteCount;      // CMOS Checksum - Byte Count
  UINT8    ChecksumOffset; // CMOS Checksum - Checksum Offset
  UINT8    Reserved[3];
  UINT8    HeaderRevision;
} LOG_HEADER_TYPE1_FORMAT;

#pragma pack()
//
// System Event Log (Type 15)
//

/**
  Function to display system event log access information.

  @param[in] Key    Additional information to print.
  @param[in] Option Whether to print the additional information.
**/
VOID
DisplaySELAccessMethod (
  IN CONST UINT8  Key,
  IN CONST UINT8  Option
  );

/**
  Function to display system event log status information.

  @param[in] Key    Additional information to print.
  @param[in] Option Whether to print the additional information.
**/
VOID
DisplaySELLogStatus (
  UINT8  Key,
  UINT8  Option
  );

/**
  Function to display system event log header format information.

  @param[in] Key    Additional information to print.
  @param[in] Option Whether to print the additional information.
**/
VOID
DisplaySysEventLogHeaderFormat (
  UINT8  Key,
  UINT8  Option
  );

/**
  Function to display system event log header information.

  @param[in] LogHeaderFormat  Format identifier.
  @param[in] LogHeader        Format informcation.
**/
VOID
DisplaySysEventLogHeader (
  UINT8  LogHeaderFormat,
  UINT8  *LogHeader
  );

/**
  Function to display system event log data.

  @param[in] LogData        The data information.
  @param[in] LogAreaLength  Length of the data.
**/
VOID
DisplaySysEventLogData (
  UINT8   *LogData,
  UINT16  LogAreaLength
  );
