/** @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>
  Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
  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
  );

/**
  Display Firmware Characteristics (Type 45) details.

  @param[in] Chara    The information bits.
  @param[in] Option   The optional information.
**/
VOID
DisplayFirmwareCharacteristics (
  IN UINT16  Chara,
  IN UINT8   Option
  );

/**
  Display Firmware state (Type 45) details.

  @param[in] Key            The key of the structure.
  @param[in] Option         The optional information.
**/
VOID
DisplayFirmwareState (
  IN UINT8  Key,
  IN UINT8  Option
  );

#endif
