/** @file
  Module to clarify the element info of the smbios structure.

  Copyright (c) 2005 - 2015, Intel Corporation. All rights reserved.<BR>
  (C) Copyright 2017 - 2019 Hewlett Packard Enterprise Development LP<BR>
  SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#ifndef _SMBIOS_PRINT_INFO_H_
#define _SMBIOS_PRINT_INFO_H_

#include <IndustryStandard/SmBios.h>

extern UINT8  SmbiosMajorVersion;
extern UINT8  SmbiosMinorVersion;

#define SHOW_NONE     0x00
#define SHOW_OUTLINE  0x01
#define SHOW_NORMAL   0x02
#define SHOW_DETAIL   0x03
//
// SHOW_ALL: WaitEnter() not wait input.
//
#define SHOW_ALL         0x04
#define SHOW_STATISTICS  0x05

#define AS_UINT16(pData)  (*((UINT16 *) pData))
#define AS_UINT32(pData)  (*((UINT32 *) pData))
#define AS_UINT64(pData)  (*((UINT64 *) pData))

/**
  Print the info of EPS(Entry Point Structure).

  @param[in] SmbiosTable    Pointer to the SMBIOS table entry point.
  @param[in] Option         Display option.
**/
VOID
SmbiosPrintEPSInfo (
  IN  SMBIOS_TABLE_ENTRY_POINT  *SmbiosTable,
  IN  UINT8                     Option
  );

/**
  Print the info of 64-bit EPS(Entry Point Structure).

  @param[in] SmbiosTable    Pointer to the SMBIOS table entry point.
  @param[in] Option         Display option.
**/
VOID
Smbios64BitPrintEPSInfo (
  IN  SMBIOS_TABLE_3_0_ENTRY_POINT  *SmbiosTable,
  IN  UINT8                         Option
  );

/**
  This function print the content of the structure pointed by Struct.

  @param[in] Struct       Point to the structure to be printed.
  @param[in] Option       Print option of information detail.

  @retval EFI_SUCCESS               Successfully Printing this function.
  @retval EFI_INVALID_PARAMETER     Invalid Structure.
  @retval EFI_UNSUPPORTED           Unsupported.
**/
EFI_STATUS
SmbiosPrintStructure (
  IN  SMBIOS_STRUCTURE_POINTER  *Struct,
  IN  UINT8                     Option
  );

/**
  Display BIOS Information (Type 0) information.

  @param[in] Chara    The information bits.
  @param[in] Option   The optional information.
**/
VOID
DisplayBiosCharacteristics (
  IN UINT64  Chara,
  IN UINT8   Option
  );

/**
  Display Bios Characteristice extensions1 information.

  @param[in] Byte1    The information.
  @param[in] Option   The optional information.
**/
VOID
DisplayBiosCharacteristicsExt1 (
  IN UINT8  Byte1,
  IN UINT8  Option
  );

/**
  Display Bios Characteristice extensions2 information.

  @param[in] Byte2    The information.
  @param[in] Option   The optional information.
**/
VOID
DisplayBiosCharacteristicsExt2 (
  IN UINT8  Byte2,
  IN UINT8  Option
  );

/**
  Display Processor Information (Type 4) information.

  @param[in] Family       The family value.
  @param[in] Option       The option value.
**/
VOID
DisplayProcessorFamily (
  UINT8  Family,
  UINT8  Option
  );

/**
  Display processor family information.

  @param[in] Family2      The family value.
  @param[in] Option       The option value.
**/
VOID
DisplayProcessorFamily2 (
  IN UINT16  Family2,
  IN UINT8   Option
  );

/**
  Display processor voltage information.

  @param[in] Voltage      The Voltage.
                      Bit 7 Set to 0, indicating 'legacy' mode for processor voltage
                      Bits 6:4  Reserved, must be zero
                      Bits 3:0  Voltage Capability.
                                A Set bit indicates that the voltage is supported.
                        Bit 0 - 5V
                        Bit 1 - 3.3V
                        Bit 2 - 2.9V
                        Bit 3 - Reserved, must be zero.

                      Note:
                        Setting of multiple bits indicates the socket is configurable
                        If bit 7 is set to 1, the remaining seven bits of the field are set to
                        contain the processor's current voltage times 10.
                        For example, the field value for a processor voltage of 1.8 volts would be
                        92h = 80h + (1.8 * 10) = 80h + 18 = 80h +12h.

  @param[in] Option       The option.
**/
VOID
DisplayProcessorVoltage (
  IN UINT8  Voltage,
  IN UINT8  Option
  );

/**
  Display processor information.

  @param[in] Status   The status.
Bit 7 Reserved, must be 0
Bit 6 CPU Socket Populated
  1 - CPU Socket Populated
  0 - CPU Socket Unpopulated
Bits 5:3 Reserved, must be zero
Bits 2:0 CPU Status
  0h - Unknown
  1h - CPU Enabled
  2h - CPU Disabled by User via BIOS Setup
  3h - CPU Disabled By BIOS (POST Error)
  4h - CPU is Idle, waiting to be enabled.
  5-6h - Reserved
  7h - Other

  @param[in] Option   The option
**/
VOID
DisplayProcessorStatus (
  IN UINT8  Status,
  IN UINT8  Option
  );

/**
  Display information about Memory Controller Information (Type 5).

  @param[in] Size     Memory size.
  @param[in] SlotNum  Which slot is this about.
  @param[in] Option   Option for the level of detail output required.
**/
VOID
DisplayMaxMemoryModuleSize (
  IN UINT8  Size,
  IN UINT8  SlotNum,
  IN UINT8  Option
  );

/**
  Display information about memory configuration handles.

  @param[in] Handles  The buffer of handles to output info on.
  @param[in] SlotNum  The number of handles in the above buffer.
  @param[in] Option   Option for the level of detail output required.
**/
VOID
DisplayMemoryModuleConfigHandles (
  IN UINT16  *Handles,
  IN UINT8   SlotNum,
  IN UINT8   Option
  );

/**
  Display Memory Module Information (Type 6).

  @param[in] BankConnections
  @param[in] Option
**/
VOID
DisplayMmBankConnections (
  IN UINT8  BankConnections,
  IN UINT8  Option
  );

/**
  Display memory informcation.

  Bits 0:6  Size (n),
      where 2**n is the size in MB with three special-case values:
      7Dh Not determinable (Installed Size only)
      7Eh Module is installed, but no memory has been enabled
      7Fh Not installed
  Bit  7  Defines whether the memory module has a single- (0)
          or double-bank (1) connection.

  @param[in] Size   - The size
  @param[in] Option - The option
**/
VOID
DisplayMmMemorySize (
  IN UINT8  Size,
  IN UINT8  Option
  );

/**
  Display Cache Configuration.

  @param[in] CacheConfiguration   Cache Configuration.
Bits 15:10 Reserved, must be 0
Bits 9:8 Operational Mode
  0h - Write Through
  1h - Write Back
  2h - Varies with Memory Address
  3h - Unknown
Bit 7 Enabled/Disabled
  1 - Enabled
  0 - Disabled
Bits 6:5 Location
  0h - Internal
  1h - External
  2h - Reserved
  3h - Unknown
Bit 4 Reserved, must be zero
Bit 3 Cache Socketed
  1 - Socketed
  0 - Unsocketed
Bits 2:0 Cache Level
  1 through 8 (For example, an L1 cache would
  use value 000b and an L3 cache would use 010b.)

  @param[in] Option   The option
**/
VOID
DisplayCacheConfiguration (
  IN UINT16  CacheConfiguration,
  IN UINT8   Option
  );

/**
  The Slot ID field of the System Slot structure provides a mechanism to
  correlate the physical attributes of the slot to its logical access method
  (which varies based on the Slot Type field).

  @param[in] SlotId   - The slot ID
  @param[in] SlotType - The slot type
  @param[in] Option   - The Option
**/
VOID
DisplaySystemSlotId (
  IN UINT16  SlotId,
  IN UINT8   SlotType,
  IN UINT8   Option
  );

/**
  Display Portable Battery (Type 22) information.

  The date the cell pack was manufactured, in packed format:
   Bits 15:9  Year, biased by 1980, in the range 0 to 127.
   Bits 8:5 Month, in the range 1 to 12.
   Bits 4:0 Date, in the range 1 to 31.
  For example, 01 February 2000 would be identified as
  0010 1000 0100 0001b (0x2841).

  @param[in] Date     The date
  @param[in] Option   The option
**/
VOID
DisplaySBDSManufactureDate (
  IN UINT16  Date,
  IN UINT8   Option
  );

/**
  Display System Reset  (Type 23) information.

  Routine Description:
  Identifies the system-reset capabilities for the system.
   Bits 7:6 Reserved for future assignment via this specification, set to 00b.
   Bit 5  System contains a watchdog timer, either True (1) or False (0).
   Bits 4:3 Boot Option on Limit.
    Identifies the system action to be taken when the Reset Limit is reached, one of:
    00b Reserved, do not use.
    01b Operating system
    10b System utilities
    11b Do not rebootBits
   2:1  Boot Option.  Indicates the action to be taken following a watchdog reset, one of:
    00b Reserved, do not use.
    01b Operating system
    10b System utilities
    11b Do not reboot
   Bit 0  Status.
    1b The system reset is enabled by the user
    0b The system reset is not enabled by the user

  @param[in] Reset   Reset
  @param[in] Option  The option
**/
VOID
DisplaySystemResetCapabilities (
  IN UINT8  Reset,
  IN UINT8  Option
  );

/**
  Display Hardware Security (Type 24) information.

    Routine Description:
    Identifies the password and reset status for the system:

    Bits 7:6    Power-on Password Status, one of:
      00b Disabled
      01b Enabled
      10b Not Implemented
      11b Unknown
    Bits 5:4    Keyboard Password Status, one of:
      00b Disabled
      01b Enabled
      10b Not Implemented
      11b Unknown
    Bits 3:2    Administrator Password Status, one  of:
      00b Disabled
      01b Enabled
      10b Not Implemented
      11b Unknown
    Bits 1:0    Front Panel Reset Status, one of:
      00b Disabled
      01b Enabled
      10b Not Implemented
      11b Unknown

  @param[in] Settings The device settings.
  @param[in] Option   The device options.
**/
VOID
DisplayHardwareSecuritySettings (
  IN UINT8  Settings,
  IN UINT8  Option
  );

/**
  Display Out-of-Band Remote Access (Type 30) information.

  @param[in] Connections        The device characteristics.
  @param[in] Option             The device options.
**/
VOID
DisplayOBRAConnections (
  IN UINT8  Connections,
  IN UINT8  Option
  );

/**
  Display System Boot Information (Type 32) information.

  @param[in] Parameter      The parameter.
  @param[in] Option         The options.
**/
VOID
DisplaySystemBootStatus (
  IN UINT8  Parameter,
  IN UINT8  Option
  );

/**
  Display System Power Supply (Type 39) information.

  @param[in] Characteristics    The device characteristics.
  @param[in] Option             The device options.
**/
VOID
DisplaySPSCharacteristics (
  IN UINT16  Characteristics,
  IN UINT8   Option
  );

/**
  Display TPM Device (Type 43) Characteristics.

  @param[in] Chara    The information bits.
  @param[in] Option   The optional information.
**/
VOID
DisplayTpmDeviceCharacteristics (
  IN UINT64  Chara,
  IN UINT8   Option
  );

/**
  Display Processor Architecture Type (Type 44).

  @param[in] Key            The key of the structure.
  @param[in] Option         The optional information.
**/
VOID
DisplayProcessorArchitectureType (
  IN UINT8  Key,
  IN UINT8  Option
  );

#endif
