text: /** @file
    IPMI 2.0 definitions from the IPMI Specification Version 2.0, Revision 1.1.
  
    This file contains all NetFn Chassis commands, including:
      Chassis Commands (Chapter 28)
  
    See IPMI specification, Appendix G, Command Assignments
    and Appendix H, Sub-function Assignments.
  
    Copyright (c) 1999 - 2018, Intel Corporation. All rights reserved.<BR>
    SPDX-License-Identifier: BSD-2-Clause-Patent
  **/
  
  #ifndef _IPMI_NET_FN_CHASSIS_H_
  #define _IPMI_NET_FN_CHASSIS_H_
  
  #pragma pack (1)
  //
  // Net function definition for Chassis command
  //
  #define IPMI_NETFN_CHASSIS  0x00
  
  //
  //  Below is Definitions for Chassis commands (Chapter 28)
  //
  
  //
  //  Definitions for Get Chassis Capabilities command
  //
  #define IPMI_CHASSIS_GET_CAPABILITIES  0x00
  
  //
  //  Constants and Structure definitions for "Get Chassis Capabilities" command to follow here
  //
  typedef struct {
    UINT8   CompletionCode;
    UINT8   CapabilitiesFlags;
    UINT8   ChassisFruInfoDeviceAddress;
    UINT8   ChassisSDRDeviceAddress;
    UINT8   ChassisSELDeviceAddress;
    UINT8   ChassisSystemManagementDeviceAddress;
    UINT8   ChassisBridgeDeviceAddress;
  } IPMI_GET_CHASSIS_CAPABILITIES_RESPONSE;
  
  //
  //  Definitions for Get Chassis Status command
  //
  #define IPMI_CHASSIS_GET_STATUS  0x01
  
  //
  //  Constants and Structure definitions for "Get Chassis Status" command to follow here
  //
  typedef struct {
    UINT8   CompletionCode;
    UINT8   CurrentPowerState;
    UINT8   LastPowerEvent;
    UINT8   MiscChassisState;
    UINT8   FrontPanelButtonCapabilities;
  } IPMI_GET_CHASSIS_STATUS_RESPONSE;
  
  //
  //  Definitions for Chassis Control command
  //
  #define IPMI_CHASSIS_CONTROL 0x02
  
  //
  //  Constants and Structure definitions for "Chassis Control" command to follow here
  //
  typedef union {
    struct {
      UINT8  ChassisControl:4;
      UINT8  Reserved:4;
    } Bits;
    UINT8  Uint8;
  } IPMI_CHASSIS_CONTROL_CHASSIS_CONTROL;
  
  typedef struct {
    IPMI_CHASSIS_CONTROL_CHASSIS_CONTROL  ChassisControl;
  } IPMI_CHASSIS_CONTROL_REQUEST;
  
  //
  //  Definitions for Chassis Reset command
  //
  #define IPMI_CHASSIS_RESET 0x03
  
  //
  //  Constants and Structure definitions for "Chassis Reset" command to follow here
  //
  
  //
  //  Definitions for Chassis Identify command
  //
  #define IPMI_CHASSIS_IDENTIFY  0x04
  
  //
  //  Constants and Structure definitions for "Chassis Identify" command to follow here
  //
  
  //
  //  Definitions for Set Chassis Capabilities command
  //
  #define IPMI_CHASSIS_SET_CAPABILITIES  0x05
  
  //
  //  Constants and Structure definitions for "Set Chassis Capabilities" command to follow here
  //
  
  //
  //  Definitions for Set Power Restore Policy command
  //
  #define IPMI_CHASSIS_SET_POWER_RESTORE_POLICY  0x06
  
  //
  //  Constants and Structure definitions for "Set Power Restore Policy" command to follow here
  //
  typedef union {
    struct {
      UINT8  PowerRestorePolicy : 3;
      UINT8  Reserved : 5;
    } Bits;
    UINT8  Uint8;
  } IPMI_POWER_RESTORE_POLICY;
  
  typedef struct {
    IPMI_POWER_RESTORE_POLICY  PowerRestorePolicy;
  } IPMI_SET_POWER_RESTORE_POLICY_REQUEST;
  
  typedef struct {
    UINT8   CompletionCode;
    UINT8   PowerRestorePolicySupport;
  } IPMI_SET_POWER_RESTORE_POLICY_RESPONSE;
  
  //
  //  Definitions for Get System Restart Cause command
  //
  #define IPMI_CHASSIS_GET_SYSTEM_RESTART_CAUSE  0x07
  
  //
  //  Constants and Structure definitions for "Get System Restart Cause" command to follow here
  //
  #define IPMI_SYSTEM_RESTART_CAUSE_UNKNOWN                    0x0
  #define IPMI_SYSTEM_RESTART_CAUSE_CHASSIS_CONTROL_COMMAND    0x1
  #define IPMI_SYSTEM_RESTART_CAUSE_PUSHBUTTON_RESET           0x2
  #define IPMI_SYSTEM_RESTART_CAUSE_PUSHBUTTON_POWERUP         0x3
  #define IPMI_SYSTEM_RESTART_CAUSE_WATCHDOG_EXPIRE            0x4
  #define IPMI_SYSTEM_RESTART_CAUSE_OEM                        0x5
  #define IPMI_SYSTEM_RESTART_CAUSE_AUTO_POWER_ALWAYS_RESTORE  0x6
  #define IPMI_SYSTEM_RESTART_CAUSE_AUTO_POWER_RESTORE_PREV    0x7
  #define IPMI_SYSTEM_RESTART_CAUSE_PEF_RESET                  0x8
  #define IPMI_SYSTEM_RESTART_CAUSE_PEF_POWERCYCLE             0x9
  #define IPMI_SYSTEM_RESTART_CAUSE_SOFT_RESET                 0xA
  #define IPMI_SYSTEM_RESTART_CAUSE_RTC_POWERUP                0xB
  
  typedef union {
    struct {
      UINT8  Cause:4;
      UINT8  Reserved:4;
    } Bits;
    UINT8  Uint8;
  } IPMI_SYSTEM_RESTART_CAUSE;
  
  typedef struct {
    UINT8                      CompletionCode;
    IPMI_SYSTEM_RESTART_CAUSE  RestartCause;
    UINT8                      ChannelNumber;
  } IPMI_GET_SYSTEM_RESTART_CAUSE_RESPONSE;
  
  //
  //  Definitions for Set System BOOT options command
  //
  #define IPMI_CHASSIS_SET_SYSTEM_BOOT_OPTIONS 0x08
  
  //
  //  Constants and Structure definitions for "Set System boot options" command to follow here
  //
  typedef union {
    struct {
      UINT8  ParameterSelector:7;
      UINT8  MarkParameterInvalid:1;
    } Bits;
    UINT8  Uint8;
  } IPMI_SET_BOOT_OPTIONS_PARAMETER_VALID;
  
  typedef struct {
    IPMI_SET_BOOT_OPTIONS_PARAMETER_VALID  ParameterValid;
    UINT8                                  ParameterData[0];
  } IPMI_SET_BOOT_OPTIONS_REQUEST;
  
  typedef struct {
    UINT8   CompletionCode:8;
  } IPMI_SET_BOOT_OPTIONS_RESPONSE;
  
  //
  //  Definitions for Get System Boot options command
  //
  #define IPMI_CHASSIS_GET_SYSTEM_BOOT_OPTIONS 0x09
  
  //
  //  Constants and Structure definitions for "Get System boot options" command to follow here
  //
  typedef union {
    struct {
      UINT8  ParameterSelector:7;
      UINT8  Reserved:1;
    } Bits;
    UINT8  Uint8;
  } IPMI_GET_BOOT_OPTIONS_PARAMETER_SELECTOR;
  
  typedef struct {
    IPMI_GET_BOOT_OPTIONS_PARAMETER_SELECTOR  ParameterSelector;
    UINT8                                     SetSelector;
    UINT8                                     BlockSelector;
  } IPMI_GET_BOOT_OPTIONS_REQUEST;
  
  typedef struct {
    UINT8 Parameter;
    UINT8 Valid;
    UINT8 Data1;
    UINT8 Data2;
    UINT8 Data3;
    UINT8 Data4;
    UINT8 Data5;
  } IPMI_GET_THE_SYSTEM_BOOT_OPTIONS;
  
  typedef struct {
    UINT8   ParameterVersion;
    UINT8   ParameterValid;
    UINT8   ChannelNumber;
    UINT32  SessionId;
    UINT32  TimeStamp;
    UINT8   Reserved[3];
  } IPMI_BOOT_INITIATOR;
  
  //
  // Definitions for boot option parameter selector
  //
  #define IPMI_BOOT_OPTIONS_PARAMETER_SELECTOR_SET_IN_PROGRESS             0x0
  #define IPMI_BOOT_OPTIONS_PARAMETER_SELECTOR_SERVICE_PARTITION_SELECTOR  0x1
  #define IPMI_BOOT_OPTIONS_PARAMETER_SELECTOR_SERVICE_PARTITION_SCAN      0x2
  #define IPMI_BOOT_OPTIONS_PARAMETER_SELECTOR_BMC_BOOT_FLAG               0x3
  #define IPMI_BOOT_OPTIONS_PARAMETER_BOOT_INFO_ACK                        0x4
  #define IPMI_BOOT_OPTIONS_PARAMETER_BOOT_FLAGS                           0x5
  #define IPMI_BOOT_OPTIONS_PARAMETER_BOOT_INITIATOR_INFO                  0x6
  #define IPMI_BOOT_OPTIONS_PARAMETER_BOOT_INITIATOR_MAILBOX               0x7
  #define IPMI_BOOT_OPTIONS_PARAMETER_OEM_BEGIN                            0x60
  #define IPMI_BOOT_OPTIONS_PARAMETER_OEM_END                              0x7F
  
  //
  // Response Parameters for IPMI Get Boot Options
  //
  typedef union {
    struct {
      UINT8  SetInProgress : 2;
      UINT8  Reserved : 6;
    } Bits;
    UINT8  Uint8;
  } IPMI_BOOT_OPTIONS_RESPONSE_PARAMETER_0;
  
  typedef struct {
    UINT8   ServicePartitionSelector;
  } IPMI_BOOT_OPTIONS_RESPONSE_PARAMETER_1;
  
  typedef union {
    struct {
      UINT8  ServicePartitionDiscovered : 1;
      UINT8  ServicePartitionScanRequest : 1;
      UINT8  Reserved: 6;
    } Bits;
    UINT8  Uint8;
  } IPMI_BOOT_OPTIONS_RESPONSE_PARAMETER_2;
  
  typedef union {
    struct {
      UINT8  BmcBootFlagValid : 5;
      UINT8  Reserved : 3;
    } Bits;
    UINT8  Uint8;
  } IPMI_BOOT_OPTIONS_RESPONSE_PARAMETER_3;
  
  typedef struct {
    UINT8   WriteMask;
    UINT8   BootInitiatorAcknowledgeData;
  } IPMI_BOOT_OPTIONS_RESPONSE_PARAMETER_4;
  
  //
  //  Definitions for the 'Boot device selector' field of Boot Option Parameters #5
  //
  #define IPMI_BOOT_DEVICE_SELECTOR_NO_OVERRIDE           0x0
  #define IPMI_BOOT_DEVICE_SELECTOR_PXE                   0x1
  #define IPMI_BOOT_DEVICE_SELECTOR_HARDDRIVE             0x2
  #define IPMI_BOOT_DEVICE_SELECTOR_HARDDRIVE_SAFE_MODE   0x3
  #define IPMI_BOOT_DEVICE_SELECTOR_DIAGNOSTIC_PARTITION  0x4
  #define IPMI_BOOT_DEVICE_SELECTOR_CD_DVD                0x5
  #define IPMI_BOOT_DEVICE_SELECTOR_BIOS_SETUP            0x6
  #define IPMI_BOOT_DEVICE_SELECTOR_REMOTE_FLOPPY         0x7
  #define IPMI_BOOT_DEVICE_SELECTOR_REMOTE_CD_DVD         0x8
  #define IPMI_BOOT_DEVICE_SELECTOR_PRIMARY_REMOTE_MEDIA  0x9
  #define IPMI_BOOT_DEVICE_SELECTOR_REMOTE_HARDDRIVE      0xB
  #define IPMI_BOOT_DEVICE_SELECTOR_FLOPPY                0xF
  
  #define BOOT_OPTION_HANDLED_BY_BIOS 0x01
  
  //
  //  Constant definitions for the 'BIOS Mux Control Override' field of Boot Option Parameters #5
  //
  #define BIOS_MUX_CONTROL_OVERRIDE_RECOMMEND_SETTING    0x00
  #define BIOS_MUX_CONTROL_OVERRIDE_FORCE_TO_BMC         0x01
  #define BIOS_MUX_CONTROL_OVERRIDE_FORCE_TO_SYSTEM      0x02
  
  typedef union {
    struct {
      UINT8  Reserved:5;
      UINT8  BiosBootType:1;
      UINT8  PersistentOptions:1;
      UINT8  BootFlagValid:1;
    } Bits;
    UINT8  Uint8;
  } IPMI_BOOT_OPTIONS_RESPONSE_PARAMETER_5_DATA_1;
  
  typedef union {
    struct {
      UINT8  LockReset:1;
      UINT8  ScreenBlank:1;
      UINT8  BootDeviceSelector:4;
      UINT8  LockKeyboard:1;
      UINT8  CmosClear:1;
    } Bits;
    UINT8  Uint8;
  } IPMI_BOOT_OPTIONS_RESPONSE_PARAMETER_5_DATA_2;
  
  typedef union {
    struct {
      UINT8  ConsoleRedirection:2;
      UINT8  LockSleep:1;
      UINT8  UserPasswordBypass:1;
      UINT8  ForceProgressEventTrap:1;
      UINT8  BiosVerbosity:2;
      UINT8  LockPower:1;
    } Bits;
    UINT8  Uint8;
  } IPMI_BOOT_OPTIONS_RESPONSE_PARAMETER_5_DATA_3;
  
  typedef union {
    struct {
      UINT8  BiosMuxControlOverride:3;
      UINT8  BiosSharedModeOverride:1;
      UINT8  Reserved:4;
    } Bits;
    UINT8  Uint8;
  } IPMI_BOOT_OPTIONS_RESPONSE_PARAMETER_5_DATA_4;
  
  typedef union {
    struct {
      UINT8  DeviceInstanceSelector:5;
      UINT8  Reserved:3;
    } Bits;
    UINT8  Uint8;
  } IPMI_BOOT_OPTIONS_RESPONSE_PARAMETER_5_DATA_5;
  
  typedef struct {
    IPMI_BOOT_OPTIONS_RESPONSE_PARAMETER_5_DATA_1  Data1;
    IPMI_BOOT_OPTIONS_RESPONSE_PARAMETER_5_DATA_2  Data2;
    IPMI_BOOT_OPTIONS_RESPONSE_PARAMETER_5_DATA_3  Data3;
    IPMI_BOOT_OPTIONS_RESPONSE_PARAMETER_5_DATA_4  Data4;
    IPMI_BOOT_OPTIONS_RESPONSE_PARAMETER_5_DATA_5  Data5;
  } IPMI_BOOT_OPTIONS_RESPONSE_PARAMETER_5;
  
  typedef union {
    struct {
      UINT8  ChannelNumber:4;
      UINT8  Reserved:4;
    } Bits;
    UINT8  Uint8;
  } IPMI_BOOT_OPTIONS_CHANNEL_NUMBER;
  
  typedef struct {
    IPMI_BOOT_OPTIONS_CHANNEL_NUMBER  ChannelNumber;
    UINT8                             SessionId[4];
    UINT8                             BootInfoTimeStamp[4];
  } IPMI_BOOT_OPTIONS_RESPONSE_PARAMETER_6;
  
  typedef struct {
    UINT8   SetSelector;
    UINT8   BlockData[16];
  } IPMI_BOOT_OPTIONS_RESPONSE_PARAMETER_7;
  
  typedef union {
    IPMI_BOOT_OPTIONS_RESPONSE_PARAMETER_0   Parm0;
    IPMI_BOOT_OPTIONS_RESPONSE_PARAMETER_1   Parm1;
    IPMI_BOOT_OPTIONS_RESPONSE_PARAMETER_2   Parm2;
    IPMI_BOOT_OPTIONS_RESPONSE_PARAMETER_3   Parm3;
    IPMI_BOOT_OPTIONS_RESPONSE_PARAMETER_4   Parm4;
    IPMI_BOOT_OPTIONS_RESPONSE_PARAMETER_5   Parm5;
    IPMI_BOOT_OPTIONS_RESPONSE_PARAMETER_6   Parm6;
    IPMI_BOOT_OPTIONS_RESPONSE_PARAMETER_7   Parm7;
  } IPMI_BOOT_OPTIONS_PARAMETERS;
  
  typedef union {
    struct {
      UINT8  ParameterVersion:4;
      UINT8  Reserved:4;
    } Bits;
    UINT8  Uint8;
  } IPMI_GET_BOOT_OPTIONS_PARAMETER_VERSION;
  
  typedef union {
    struct {
      UINT8  ParameterSelector:7;
      UINT8  ParameterValid:1;
    } Bits;
    UINT8  Uint8;
  } IPMI_GET_BOOT_OPTIONS_PARAMETER_VALID;
  
  typedef struct {
    UINT8                                    CompletionCode;
    IPMI_GET_BOOT_OPTIONS_PARAMETER_VERSION  ParameterVersion;
    IPMI_GET_BOOT_OPTIONS_PARAMETER_VALID    ParameterValid;
    UINT8                                    ParameterData[0];
  } IPMI_GET_BOOT_OPTIONS_RESPONSE;
  
  //
  //  Definitions for Set front panel button enables command
  //
  #define IPMI_CHASSIS_SET_FRONT_PANEL_BUTTON_ENABLES 0x0A
  
  //
  //  Constants and Structure definitions for "Set front panel button enables" command to follow here
  //
  typedef union {
    struct {
      UINT8  DisablePoweroffButton:1;
      UINT8  DisableResetButton:1;
      UINT8  DisableDiagnosticInterruptButton:1;
      UINT8  DisableStandbyButton:1;
      UINT8  Reserved:4;
    } Bits;
    UINT8  Uint8;
  } IPMI_FRONT_PANEL_BUTTON_ENABLES;
  
  typedef struct {
    IPMI_FRONT_PANEL_BUTTON_ENABLES  FrontPanelButtonEnables;
  } IPMI_CHASSIS_SET_FRONT_PANEL_BUTTON_ENABLES_REQUEST;
  
  //
  //  Definitions for Set Power Cycle Interval command
  //
  #define IPMI_CHASSIS_SET_POWER_CYCLE_INTERVALS 0x0B
  
  //
  //  Constants and Structure definitions for "Set Power Cycle Interval" command to follow here
  //
  
  //
  //  Definitions for Get POH Counter command
  //
  #define IPMI_CHASSIS_GET_POH_COUNTER 0x0F
  
  //
  //  Constants and Structure definitions for "Get POH Counter" command to follow here
  //
  #pragma pack()
  #endif
  