public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: Hao Wu <hao.a.wu@intel.com>
To: edk2-devel@lists.01.org
Cc: Hao Wu <hao.a.wu@intel.com>,
	Michael Kinney <michael.d.kinney@intel.com>,
	Liming Gao <liming.gao@intel.com>,
	Jiewen Yao <jiewen.yao@intel.com>
Subject: [RFC PATCH v1 2/2] MdePkg/IndustryStandard/Ipmi: Use union for bitmap fields
Date: Tue,  5 Jun 2018 11:20:10 +0800	[thread overview]
Message-ID: <20180605032010.25104-3-hao.a.wu@intel.com> (raw)
In-Reply-To: <20180605032010.25104-1-hao.a.wu@intel.com>

This commit enhances the bitmap fields defined in the IPMI header files,
union types will be used to provide the users with both the individual
bitmap access and the whole byte/word access.

Cc: Michael Kinney <michael.d.kinney@intel.com>
Cc: Liming Gao <liming.gao@intel.com>
Cc: Jiewen Yao <jiewen.yao@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Hao Wu <hao.a.wu@intel.com>
---
 MdePkg/Include/IndustryStandard/IpmiFruInformationStorage.h |  60 ++-
 MdePkg/Include/IndustryStandard/IpmiNetFnApp.h              | 429 ++++++++++-----
 MdePkg/Include/IndustryStandard/IpmiNetFnChassis.h          | 271 ++++++----
 MdePkg/Include/IndustryStandard/IpmiNetFnStorage.h          | 309 ++++++-----
 MdePkg/Include/IndustryStandard/IpmiNetFnTransport.h        | 561 ++++++++++++++------
 5 files changed, 1094 insertions(+), 536 deletions(-)

diff --git a/MdePkg/Include/IndustryStandard/IpmiFruInformationStorage.h b/MdePkg/Include/IndustryStandard/IpmiFruInformationStorage.h
index 2b58cbf0b4..1aef4b14f2 100644
--- a/MdePkg/Include/IndustryStandard/IpmiFruInformationStorage.h
+++ b/MdePkg/Include/IndustryStandard/IpmiFruInformationStorage.h
@@ -26,31 +26,57 @@
 #pragma pack(1)
 
 //
-//  Structure definition for FRU Common Header
+//  Structure definitions for FRU Common Header
 //
+typedef union {
+  ///
+  /// Individual bit fields
+  ///
+  struct {
+    UINT8  FormatVersionNumber:4;
+    UINT8  Reserved:4;
+  } Bits;
+  ///
+  /// All bit fields as a 8-bit value
+  ///
+  UINT8  Uint8;
+} IPMI_FRU_COMMON_HEADER_FORMAT_VERSION;
+
 typedef struct {
-  UINT8    FormatVersionNumber:4;
-  UINT8    Reserved:4;
-  UINT8    InternalUseStartingOffset;
-  UINT8    ChassisInfoStartingOffset;
-  UINT8    BoardAreaStartingOffset;
-  UINT8    ProductInfoStartingOffset;
-  UINT8    MultiRecInfoStartingOffset;
-  UINT8    Pad;
-  UINT8    Checksum;
+  IPMI_FRU_COMMON_HEADER_FORMAT_VERSION  FormatVersion;
+  UINT8                                  InternalUseStartingOffset;
+  UINT8                                  ChassisInfoStartingOffset;
+  UINT8                                  BoardAreaStartingOffset;
+  UINT8                                  ProductInfoStartingOffset;
+  UINT8                                  MultiRecInfoStartingOffset;
+  UINT8                                  Pad;
+  UINT8                                  Checksum;
 } IPMI_FRU_COMMON_HEADER;
 
 //
 //  Structure definition for FRU MultiRecord Header
 //
+typedef union {
+  ///
+  /// Individual bit fields
+  ///
+  struct {
+    UINT8  RecordFormatVersion:4;
+    UINT8  Reserved:3;
+    UINT8  EndofList:1;
+  } Bits;
+  ///
+  /// All bit fields as a 8-bit value
+  ///
+  UINT8  Uint8;
+} IPMI_FRU_MULTI_RECORD_HEADER_FORMAT_VERSION;
+
 typedef struct {
-  UINT8    RecordTypeId;
-  UINT8    RecordFormatVersion:4;
-  UINT8    Reserved:3;
-  UINT8    EndofList:1;
-  UINT8    RecordLength;
-  UINT8    RecordChecksum;
-  UINT8    HeaderChecksum;
+  UINT8                                        RecordTypeId;
+  IPMI_FRU_MULTI_RECORD_HEADER_FORMAT_VERSION  FormatVersion;
+  UINT8                                        RecordLength;
+  UINT8                                        RecordChecksum;
+  UINT8                                        HeaderChecksum;
 } IPMI_FRU_MULTI_RECORD_HEADER;
 
 //
diff --git a/MdePkg/Include/IndustryStandard/IpmiNetFnApp.h b/MdePkg/Include/IndustryStandard/IpmiNetFnApp.h
index cdd3f07c65..7147a1623e 100644
--- a/MdePkg/Include/IndustryStandard/IpmiNetFnApp.h
+++ b/MdePkg/Include/IndustryStandard/IpmiNetFnApp.h
@@ -42,27 +42,66 @@
 //
 //  Constants and Structure definitions for "Get Device ID" command to follow here
 //
+typedef union {
+  ///
+  /// Individual bit fields
+  ///
+  struct {
+    UINT8  DeviceRevision : 4;
+    UINT8  Reserved : 3;
+    UINT8  DeviceSdr : 1;
+  } Bits;
+  ///
+  /// All bit fields as a 8-bit value
+  ///
+  UINT8  Uint8;
+} IPMI_GET_DEVICE_ID_DEVICE_REV;
+
+typedef union {
+  ///
+  /// Individual bit fields
+  ///
+  struct {
+    UINT8  MajorFirmwareRev : 7;
+    UINT8  UpdateMode : 1;
+  } Bits;
+  ///
+  /// All bit fields as a 8-bit value
+  ///
+  UINT8  Uint8;
+} IPMI_GET_DEVICE_ID_FIRMWARE_REV_1;
+
+typedef union {
+  ///
+  /// Individual bit fields
+  ///
+  struct {
+    UINT8  SensorDeviceSupport : 1;
+    UINT8  SdrRepositorySupport : 1;
+    UINT8  SelDeviceSupport : 1;
+    UINT8  FruInventorySupport : 1;
+    UINT8  IpmbMessageReceiver : 1;
+    UINT8  IpmbMessageGenerator : 1;
+    UINT8  BridgeSupport : 1;
+    UINT8  ChassisSupport : 1;
+  } Bits;
+  ///
+  /// All bit fields as a 8-bit value
+  ///
+  UINT8    Uint8;
+} IPMI_GET_DEVICE_ID_DEVICE_SUPPORT;
+
 typedef struct {
-  UINT8   CompletionCode;
-  UINT8   DeviceId;
-  UINT8   DeviceRevision : 4;
-  UINT8   Reserved : 3;
-  UINT8   DeviceSdr : 1;
-  UINT8   MajorFirmwareRev : 7;
-  UINT8   UpdateMode : 1;
-  UINT8   MinorFirmwareRev;
-  UINT8   SpecificationVersion;
-  UINT8   SensorDeviceSupport : 1;
-  UINT8   SdrRepositorySupport : 1;
-  UINT8   SelDeviceSupport : 1;
-  UINT8   FruInventorySupport : 1;
-  UINT8   IpmbMessageReceiver : 1;
-  UINT8   IpmbMessageGenerator : 1;
-  UINT8   BridgeSupport : 1;
-  UINT8   ChassisSupport : 1;
-  UINT8   ManufacturerId[3];
-  UINT16  ProductId;
-  UINT32  AuxFirmwareRevInfo;
+  UINT8                              CompletionCode;
+  UINT8                              DeviceId;
+  IPMI_GET_DEVICE_ID_DEVICE_REV      DeviceRevision;
+  IPMI_GET_DEVICE_ID_FIRMWARE_REV_1  FirmwareRev1;
+  UINT8                              MinorFirmwareRev;
+  UINT8                              SpecificationVersion;
+  IPMI_GET_DEVICE_ID_DEVICE_SUPPORT  DeviceSupport;
+  UINT8                              ManufacturerId[3];
+  UINT16                             ProductId;
+  UINT32                             AuxFirmwareRevInfo;
 } IPMI_GET_DEVICE_ID_RESPONSE;
 
 
@@ -165,11 +204,17 @@ typedef struct {
 #define IPMI_DEVICE_POWER_STATE_UNKNOWN      0x2A
 #define IPMI_DEVICE_POWER_STATE_NO_CHANGE    0x7F
 
+typedef union {
+  struct {
+    UINT8  PowerState  : 7;
+    UINT8  StateChange : 1;
+  } Bits;
+  UINT8  Uint8;
+} IPMI_ACPI_POWER_STATE;
+
 typedef struct {
-  UINT8  AcpiSystemPowerState  : 7;
-  UINT8  AcpiSystemStateChange : 1;
-  UINT8  AcpiDevicePowerState  : 7;
-  UINT8  AcpiDeviceStateChange : 1;
+  IPMI_ACPI_POWER_STATE  SystemPowerState;
+  IPMI_ACPI_POWER_STATE  DevicePowerState;
 } IPMI_SET_ACPI_POWER_STATE_REQUEST;
 
 //
@@ -227,11 +272,14 @@ typedef struct {
 //
 //  Structure definition for timer Use
 //
-typedef struct {
-  UINT8 TimerUse : 3;
-  UINT8 Reserved : 3;
-  UINT8 TimerRunning : 1;
-  UINT8 TimerUseExpirationFlagLog : 1;
+typedef union {
+  struct {
+    UINT8  TimerUse : 3;
+    UINT8  Reserved : 3;
+    UINT8  TimerRunning : 1;
+    UINT8  TimerUseExpirationFlagLog : 1;
+  } Bits;
+  UINT8  Uint8;
 } IPMI_WATCHDOG_TIMER_USE;
 
 //
@@ -253,11 +301,14 @@ typedef struct {
 //
 //  Structure definitions for Timer Actions
 //
-typedef struct {
-  UINT8  TimeoutAction : 3;
-  UINT8  Reserved1 : 1;
-  UINT8  PreTimeoutInterrupt : 3;
-  UINT8  Reserved2 : 1;
+typedef union {
+  struct {
+    UINT8  TimeoutAction : 3;
+    UINT8  Reserved1 : 1;
+    UINT8  PreTimeoutInterrupt : 3;
+    UINT8  Reserved2 : 1;
+  } Bits;
+  UINT8  Uint8;
 } IPMI_WATCHDOG_TIMER_ACTIONS;
 
 //
@@ -307,15 +358,22 @@ typedef struct {
 //
 //  Constants and Structure definitions for "Set BMC Global Enables " command to follow here
 //
+typedef union {
+  struct {
+    UINT8  ReceiveMessageQueueInterrupt : 1;
+    UINT8  EventMessageBufferFullInterrupt : 1;
+    UINT8  EventMessageBuffer : 1;
+    UINT8  SystemEventLogging : 1;
+    UINT8  Reserved : 1;
+    UINT8  Oem0Enable : 1;
+    UINT8  Oem1Enable : 1;
+    UINT8  Oem2Enable : 1;
+  } Bits;
+  UINT8  Uint8;
+} IPMI_BMC_GLOBAL_ENABLES;
+
 typedef struct {
-  UINT8  EnableReceiveMessageQueueInterrupt : 1;
-  UINT8  EnableEventMessageBufferFullInterrupt : 1;
-  UINT8  EnableEventMessageBuffer : 1;
-  UINT8  EnableSystemEventLogging : 1;
-  UINT8  Reserved : 1;
-  UINT8  Oem0Enable : 1;
-  UINT8  Oem1Enable : 1;
-  UINT8  Oem2Enable : 1;
+  IPMI_BMC_GLOBAL_ENABLES  SetEnables;
 } IPMI_SET_BMC_GLOBAL_ENABLES_REQUEST;
 
 //
@@ -327,15 +385,8 @@ typedef struct {
 //  Constants and Structure definitions for "Get BMC Global Enables " command to follow here
 //
 typedef struct {
-  UINT8  CompletionCode;
-  UINT8  ReceiveMessageQueueInterrupt : 1;
-  UINT8  EventMessageBufferFullInterrupt : 1;
-  UINT8  EventMessageBuffer : 1;
-  UINT8  SystemEventLogging : 1;
-  UINT8  Reserved : 1;
-  UINT8  Oem0Enable : 1;
-  UINT8  Oem1Enable : 1;
-  UINT8  Oem2Enable : 1;
+  UINT8                    CompletionCode;
+  IPMI_BMC_GLOBAL_ENABLES  GetEnables;
 } IPMI_GET_BMC_GLOBAL_ENABLES_RESPONSE;
 
 //
@@ -346,15 +397,22 @@ typedef struct {
 //
 //  Constants and Structure definitions for "Clear Message Flags" command to follow here
 //
+typedef union {
+  struct {
+    UINT8  ReceiveMessageQueue : 1;
+    UINT8  EventMessageBuffer : 1;
+    UINT8  Reserved1 : 1;
+    UINT8  WatchdogPerTimeoutInterrupt : 1;
+    UINT8  Reserved2 : 1;
+    UINT8  Oem0 : 1;
+    UINT8  Oem1 : 1;
+    UINT8  Oem2 : 1;
+  } Bits;
+  UINT8    Uint8;
+} IPMI_MESSAGE_FLAGS;
+
 typedef struct {
-  UINT8  ClearReceiveMessageQueue : 1;
-  UINT8  ClearEventMessageBuffer : 1;
-  UINT8  Reserved0 : 1;
-  UINT8  ClearWatchdogPerTimeoutInterruptFlag : 1;
-  UINT8  Reserved : 1;
-  UINT8  ClearOem0Enable : 1;
-  UINT8  ClearOem1Enable : 1;
-  UINT8  ClearOem2Enable : 1;
+  IPMI_MESSAGE_FLAGS  ClearFlags;
 } IPMI_CLEAR_MESSAGE_FLAGS_REQUEST;
 
 //
@@ -366,15 +424,8 @@ typedef struct {
 //  Constants and Structure definitions for "Get Message Flags" command to follow here
 //
 typedef struct {
-  UINT8  CompletionCode;
-  UINT8  ReceiveMessageAvailable : 1;
-  UINT8  EventMessageBufferFull : 1;
-  UINT8  Reserved0 : 1;
-  UINT8  WatchdogPerTimeoutInterruptOccurred : 1;
-  UINT8  Reserved : 1;
-  UINT8  Oem0DataAvailable : 1;
-  UINT8  Oem1DataAvailable : 1;
-  UINT8  Oem2DataAvailable : 1;
+  UINT8               CompletionCode;
+  IPMI_MESSAGE_FLAGS  GetFlags;
 } IPMI_GET_MESSAGE_FLAGS_RESPONSE;
 
 //
@@ -394,11 +445,18 @@ typedef struct {
 //
 //  Constants and Structure definitions for "Get Message" command to follow here
 //
+typedef union {
+  struct {
+    UINT8  ChannelNumber : 4;
+    UINT8  InferredPrivilegeLevel : 4;
+  } Bits;
+  UINT8  Uint8;
+} IPMI_GET_MESSAGE_CHANNEL_NUMBER;
+
 typedef struct {
-  UINT8  CompletionCode;
-  UINT8  ChannelNumber : 4;
-  UINT8  InferredPrivilegeLevel : 4;
-  UINT8  MessageData[0];
+  UINT8                            CompletionCode;
+  IPMI_GET_MESSAGE_CHANNEL_NUMBER  ChannelNumber;
+  UINT8                            MessageData[0];
 } IPMI_GET_MESSAGE_RESPONSE;
 
 //
@@ -409,13 +467,20 @@ typedef struct {
 //
 //  Constants and Structure definitions for "Send Message" command to follow here
 //
+typedef union {
+  struct {
+    UINT8  ChannelNumber : 4;
+    UINT8  Authentication : 1;
+    UINT8  Encryption : 1;
+    UINT8  Tracking : 2;
+  } Bits;
+  UINT8  Uint8;
+} IPMI_SEND_MESSAGE_CHANNEL_NUMBER;
+
 typedef struct {
-  UINT8  CompletionCode;
-  UINT8  ChannelNumber : 4;
-  UINT8  Authentication : 1;
-  UINT8  Encryption : 1;
-  UINT8  Tracking : 2;
-  UINT8  MessageData[0];
+  UINT8                             CompletionCode;
+  IPMI_SEND_MESSAGE_CHANNEL_NUMBER  ChannelNumber;
+  UINT8                             MessageData[0];
 } IPMI_SEND_MESSAGE_REQUEST;
 
 typedef struct {
@@ -545,22 +610,50 @@ typedef struct {
 #define IPMI_CHANNEL_ACCESS_MODES_ALWAYS_AVAILABLE  0x2
 #define IPMI_CHANNEL_ACCESS_MODES_SHARED            0x3
 
+typedef union {
+  struct {
+    UINT8  ChannelNo : 4;
+    UINT8  Reserved : 4;
+  } Bits;
+  UINT8  Uint8;
+} IPMI_GET_CHANNEL_ACCESS_CHANNEL_NUMBER;
+
+typedef union {
+  struct {
+    UINT8  Reserved : 6;
+    UINT8  MemoryType : 2;
+  } Bits;
+  UINT8  Uint8;
+} IPMI_GET_CHANNEL_ACCESS_TYPE;
+
 typedef struct {
-  UINT8  ChannelNo : 4;
-  UINT8  Reserve1 : 4;
-  UINT8  Reserve2 : 6;
-  UINT8  MemoryType : 2;
+  IPMI_GET_CHANNEL_ACCESS_CHANNEL_NUMBER  ChannelNumber;
+  IPMI_GET_CHANNEL_ACCESS_TYPE            AccessType;
 } IPMI_GET_CHANNEL_ACCESS_REQUEST;
 
+typedef union {
+  struct {
+    UINT8  AccessMode : 3;
+    UINT8  UserLevelAuthEnabled : 1;
+    UINT8  MessageAuthEnable : 1;
+    UINT8  Alert : 1;
+    UINT8  Reserved : 2;
+  } Bits;
+  UINT8  Uint8;
+} IPMI_GET_CHANNEL_ACCESS_CHANNEL_ACCESS;
+
+typedef union {
+  struct {
+    UINT8  ChannelPriviledgeLimit : 4;
+    UINT8  Reserved : 4;
+  } Bits;
+  UINT8  Uint8;
+} IPMI_GET_CHANNEL_ACCESS_PRIVILEGE_LIMIT;
+
 typedef struct {
-  UINT8  CompletionCode;
-  UINT8  AccessMode : 3;
-  UINT8  UserLevelAuthEnabled : 1;
-  UINT8  MessageAuthEnable : 1;
-  UINT8  Alert : 1;
-  UINT8  Reserve1 : 2;
-  UINT8  ChannelPriviledgeLimit : 4;
-  UINT8  Reserve2 : 4;
+  UINT8                                    CompletionCode;
+  IPMI_GET_CHANNEL_ACCESS_CHANNEL_ACCESS   ChannelAccess;
+  IPMI_GET_CHANNEL_ACCESS_PRIVILEGE_LIMIT  PrivilegeLimit;
 } IPMI_GET_CHANNEL_ACCESS_RESPONSE;
 
 //
@@ -603,18 +696,46 @@ typedef struct {
 #define IPMI_CHANNEL_MEDIA_TYPE_OEM_START         0x60
 #define IPMI_CHANNEL_MEDIA_TYPE_OEM_END           0x7F
 
+typedef union {
+  struct {
+    UINT8  ChannelNo : 4;
+    UINT8  Reserved : 4;
+  } Bits;
+  UINT8  Uint8;
+} IPMI_CHANNEL_INFO_CHANNEL_NUMBER;
+
+typedef union {
+  struct {
+    UINT8  ChannelMediumType : 7;
+    UINT8  Reserved : 1;
+  } Bits;
+  UINT8  Uint8;
+} IPMI_CHANNEL_INFO_MEDIUM_TYPE;
+
+typedef union {
+  struct {
+    UINT8  ChannelProtocolType : 5;
+    UINT8  Reserved : 3;
+  } Bits;
+  UINT8  Uint8;
+} IPMI_CHANNEL_INFO_PROTOCOL_TYPE;
+
+typedef union {
+  struct {
+    UINT8  ActiveSessionCount : 6;
+    UINT8  SessionSupport : 2;
+  } Bits;
+  UINT8  Uint8;
+} IPMI_CHANNEL_INFO_SESSION_SUPPORT;
+
 typedef struct {
   UINT8   CompletionCode;
-  UINT8   ChannelNo : 4;
-  UINT8   Reserve1 : 4;
-  UINT8   ChannelMediumType : 7;
-  UINT8   Reserve2 : 1;
-  UINT8   ChannelProtocolType : 5;
-  UINT8   Reserve3 : 3;
-  UINT8   ActiveSessionCount : 6;
-  UINT8   SessionSupport : 2;
-  UINT8   VendorId[3];
-  UINT16  AuxChannelInfo;
+  IPMI_CHANNEL_INFO_CHANNEL_NUMBER   ChannelNumber;
+  IPMI_CHANNEL_INFO_MEDIUM_TYPE      MediumType;
+  IPMI_CHANNEL_INFO_PROTOCOL_TYPE    ProtocolType;
+  IPMI_CHANNEL_INFO_SESSION_SUPPORT  SessionSupport;
+  UINT8                              VendorId[3];
+  UINT16                             AuxChannelInfo;
 } IPMI_GET_CHANNEL_INFO_RESPONSE;
 
 //
@@ -643,26 +764,68 @@ typedef struct {
 //
 //  Constants and Structure definitions for "Get User Access" command to follow here
 //
+typedef union {
+  struct {
+    UINT8  ChannelNo : 4;
+    UINT8  Reserved : 4;
+  } Bits;
+  UINT8  Uint8;
+} IPMI_GET_USER_ACCESS_CHANNEL_NUMBER;
+
+typedef union {
+  struct {
+    UINT8  UserId : 6;
+    UINT8  Reserved : 2;
+  } Bits;
+  UINT8  Uint8;
+} IPMI_USER_ID;
+
 typedef struct {
-  UINT8   ChannelNo : 4;
-  UINT8   Reserved1 : 4;
-  UINT8   UserId : 6;
-  UINT8   Reserved2 : 2;
+  IPMI_GET_USER_ACCESS_CHANNEL_NUMBER  ChannelNumber;
+  IPMI_USER_ID                         UserId;
 } IPMI_GET_USER_ACCESS_REQUEST;
 
+typedef union {
+  struct {
+    UINT8  MaxUserId : 6;
+    UINT8  Reserved : 2;
+  } Bits;
+  UINT8  Uint8;
+} IPMI_GET_USER_ACCESS_MAX_USER_ID;
+
+typedef union {
+  struct {
+    UINT8  CurrentUserId : 6;
+    UINT8  UserIdEnableStatus : 2;
+  } Bits;
+  UINT8  Uint8;
+} IPMI_GET_USER_ACCESS_CURRENT_USER;
+
+typedef union {
+  struct {
+    UINT8  FixedUserId : 6;
+    UINT8  Reserved : 2;
+  } Bits;
+  UINT8  Uint8;
+} IPMI_GET_USER_ACCESS_FIXED_NAME_USER;
+
+typedef union {
+  struct {
+    UINT8  UserPrivilegeLimit : 4;
+    UINT8  EnableIpmiMessaging : 1;
+    UINT8  EnableUserLinkAuthetication : 1;
+    UINT8  UserAccessAvailable : 1;
+    UINT8  Reserved : 1;
+  } Bits;
+  UINT8  Uint8;
+} IPMI_GET_USER_ACCESS_CHANNEL_ACCESS;
+
 typedef struct {
-  UINT8   CompletionCode;
-  UINT8   MaxUserId : 6;
-  UINT8   Reserved1 : 2;
-  UINT8   CurrentUserId : 6;
-  UINT8   UserIdEnableStatus : 2;
-  UINT8   FixedUserId : 6;
-  UINT8   Reserved2 : 2;
-  UINT8   UserPrivilegeLimit : 4;
-  UINT8   EnableIpmiMessaging : 1;
-  UINT8   EnableUserLinkAuthetication : 1;
-  UINT8   UserAccessAvailable : 1;
-  UINT8   Reserved3 : 1;
+  UINT8                                 CompletionCode;
+  IPMI_GET_USER_ACCESS_MAX_USER_ID      MaxUserId;
+  IPMI_GET_USER_ACCESS_CURRENT_USER     CurrentUser;
+  IPMI_GET_USER_ACCESS_FIXED_NAME_USER  FixedNameUser;
+  IPMI_GET_USER_ACCESS_CHANNEL_ACCESS   ChannelAccess;
 } IPMI_GET_USER_ACCESS_RESPONSE;
 
 //
@@ -674,9 +837,8 @@ typedef struct {
 //  Constants and Structure definitions for "Set User Name" command to follow here
 //
 typedef struct {
-  UINT8  UserId : 6;
-  UINT8  Reserved : 2;
-  UINT8  UserName[16];
+  IPMI_USER_ID  UserId;
+  UINT8         UserName[16];
 } IPMI_SET_USER_NAME_REQUEST;
 
 //
@@ -688,8 +850,7 @@ typedef struct {
 //  Constants and Structure definitions for "Get User Name" command to follow here
 //
 typedef struct {
-  UINT8  UserId : 6;
-  UINT8  Reserved : 2;
+  IPMI_USER_ID  UserId;
 } IPMI_GET_USER_NAME_REQUEST;
 
 typedef struct {
@@ -720,13 +881,27 @@ typedef struct {
 #define IPMI_SET_USER_PASSWORD_PASSWORD_SIZE_16  0x0
 #define IPMI_SET_USER_PASSWORD_PASSWORD_SIZE_20  0x1
 
+typedef union {
+  struct {
+    UINT8  UserId : 6;
+    UINT8  Reserved : 1;
+    UINT8  PasswordSize : 1;
+  } Bits;
+  UINT8  Uint8;
+} IPMI_SET_USER_PASSWORD_USER_ID;
+
+typedef union {
+  struct {
+    UINT8  Operation : 2;
+    UINT8  Reserved : 6;
+  } Bits;
+  UINT8  Uint8;
+} IPMI_SET_USER_PASSWORD_OPERATION;
+
 typedef struct {
-  UINT8   UserId : 6;
-  UINT8   Reserved1 : 1;
-  UINT8   PasswordSize : 1;
-  UINT8   Operation : 2;
-  UINT8   Reserved2 : 6;
-  UINT8   PasswordData[0];  // 16 or 20 bytes, depending on the 'PasswordSize' field
+  IPMI_SET_USER_PASSWORD_USER_ID    UserId;
+  IPMI_SET_USER_PASSWORD_OPERATION  Operation;
+  UINT8                             PasswordData[0];  // 16 or 20 bytes, depending on the 'PasswordSize' field
 } IPMI_SET_USER_PASSWORD_REQUEST;
 
 //
diff --git a/MdePkg/Include/IndustryStandard/IpmiNetFnChassis.h b/MdePkg/Include/IndustryStandard/IpmiNetFnChassis.h
index bbc5bf0db3..28d4823235 100644
--- a/MdePkg/Include/IndustryStandard/IpmiNetFnChassis.h
+++ b/MdePkg/Include/IndustryStandard/IpmiNetFnChassis.h
@@ -72,9 +72,16 @@ typedef struct {
 //
 //  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 {
-  UINT8   ChassisControl:4;
-  UINT8   Reserved:4;
+  IPMI_CHASSIS_CONTROL_CHASSIS_CONTROL  ChassisControl;
 } IPMI_CHASSIS_CONTROL_REQUEST;
 
 //
@@ -112,9 +119,16 @@ typedef struct {
 //
 //  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 {
-  UINT8   PowerRestorePolicy:3;
-  UINT8   Reserved:5;
+  IPMI_POWER_RESTORE_POLICY  PowerRestorePolicy;
 } IPMI_SET_POWER_RESTORE_POLICY_REQUEST;
 
 typedef struct {
@@ -130,26 +144,31 @@ typedef struct {
 //
 //  Constants and Structure definitions for "Get System Restart Cause" command to follow here
 //
-typedef enum {
-  Unknown,
-  ChassisControlCommand,
-  ResetViaPushButton,
-  PowerupViaPowerButton,
-  WatchdogExpiration,
-  Oem,
-  AutoPowerOnAlwaysRestore,
-  AutoPowerOnRestorePrevious,
-  ResetViaPef,
-  PowerCycleViaPef,
-  SoftReset,
-  PowerUpViaRtc
+#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;
-  UINT8  Cause:4;
-  UINT8  Reserved:4;
-  UINT8  ChannelNumber;
+  UINT8                      CompletionCode;
+  IPMI_SYSTEM_RESTART_CAUSE  RestartCause;
+  UINT8                      ChannelNumber;
 } IPMI_GET_SYSTEM_RESTART_CAUSE_RESPONSE;
 
 //
@@ -160,10 +179,17 @@ typedef struct {
 //
 //  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 {
-  UINT8    ParameterSelector:7;
-  UINT8    MarkParameterInvalid:1;
-  UINT8    ParameterData[1];
+  IPMI_SET_BOOT_OPTIONS_PARAMETER_VALID  ParameterValid;
+  UINT8                                  ParameterData[1];
 } IPMI_SET_BOOT_OPTIONS_REQUEST;
 
 //
@@ -174,11 +200,18 @@ typedef struct {
 //
 //  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 {
-  UINT8    ParameterSelector:7;
-  UINT8    Reserved:1;
-  UINT8    SetSelector;
-  UINT8    BlockSelector;
+  IPMI_GET_BOOT_OPTIONS_PARAMETER_SELECTOR  ParameterSelector;
+  UINT8                                     SetSelector;
+  UINT8                                     BlockSelector;
 } IPMI_GET_BOOT_OPTIONS_REQUEST;
 
 typedef struct {
@@ -217,24 +250,33 @@ typedef struct {
 //
 // Response Parameters for IPMI Get Boot Options
 //
-typedef struct {
-  UINT8   SetInProgress: 2;
-  UINT8   Reserved: 6;
+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 struct {
-  UINT8   ServicePartitionDiscovered:1;
-  UINT8   ServicePartitionScanRequest:1;
-  UINT8   Reserved: 5;
+typedef union {
+  struct {
+    UINT8  ServicePartitionDiscovered : 1;
+    UINT8  ServicePartitionScanRequest : 1;
+    UINT8  Reserved: 5;
+  } Bits;
+  UINT8  Uint8;
 } IPMI_BOOT_OPTIONS_RESPONSE_PARAMETER_2;
 
-typedef struct {
-  UINT8   BmcBootFlagValid: 5;
-  UINT8   Reserved: 3;
+typedef union {
+  struct {
+    UINT8  BmcBootFlagValid : 5;
+    UINT8  Reserved : 3;
+  } Bits;
+  UINT8  Uint8;
 } IPMI_BOOT_OPTIONS_RESPONSE_PARAMETER_3;
 
 typedef struct {
@@ -267,49 +309,76 @@ typedef struct {
 #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 {
-  //
-  // Data 1
-  //
-  UINT8   Reserved0:5;
-  UINT8   BiosBootType:1;
-  UINT8   PersistentOptions:1;
-  UINT8   BootFlagValid:1;
-  //
-  // Data 2
-  //
-  UINT8   LockReset:1;
-  UINT8   ScreenBlank:1;
-  UINT8   BootDeviceSelector:4;
-  UINT8   LockKeyboard:1;
-  UINT8   CmosClear:1;
-  //
-  // Data 3
-  //
-  UINT8   ConsoleRedirection:2;
-  UINT8   LockSleep:1;
-  UINT8   UserPasswordBypass:1;
-  UINT8   ForceProgressEventTrap:1;
-  UINT8   BiosVerbosity:2;
-  UINT8   LockPower:1;
-  //
-  // Data 4
-  //
-  UINT8   BiosMuxControlOverride:3;
-  UINT8   BiosSharedModeOverride:1;
-  UINT8   Reserved1:4;
-  //
-  // Data 5
-  //
-  UINT8   DeviceInstanceSelector:5;
-  UINT8   Reserved2:3;
+  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 {
-  UINT8   ChannelNumber:4;
-  UINT8   Reserved:4;
-  UINT8   SessionId[4];
-  UINT8   BootInfoTimeStamp[4];
+  IPMI_BOOT_OPTIONS_CHANNEL_NUMBER  ChannelNumber;
+  UINT8                             SessionId[4];
+  UINT8                             BootInfoTimeStamp[4];
 } IPMI_BOOT_OPTIONS_RESPONSE_PARAMETER_6;
 
 typedef struct {
@@ -328,13 +397,27 @@ typedef union {
   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;
-  UINT8    ParameterVersion:4;
-  UINT8    Reserved:4;
-  UINT8    ParameterSelector:7;
-  UINT8    ParameterValid:1;
-  UINT8    ParameterData[1];
+  UINT8                                    CompletionCode;
+  IPMI_GET_BOOT_OPTIONS_PARAMETER_VERSION  ParameterVersion;
+  IPMI_GET_BOOT_OPTIONS_PARAMETER_VALID    ParameterValid;
+  UINT8                                    ParameterData[1];
 } IPMI_GET_BOOT_OPTIONS_RESPONSE;
 
 //
@@ -342,17 +425,23 @@ typedef struct {
 //
 #define IPMI_CHASSIS_SET_FRONT_PANEL_BUTTON_ENABLES 0x0A
 
-typedef struct {
-  UINT8    DisablePoweroffButton:1;
-  UINT8    DisableResetButton:1;
-  UINT8    DisableDiagnosticInterruptButton:1;
-  UINT8    DisableStandbyButton:1;
-  UINT8    Reserved:4;
-} IPMI_CHASSIS_SET_FRONT_PANEL_BUTTON_ENABLES_REQUEST;
-
 //
 //  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
diff --git a/MdePkg/Include/IndustryStandard/IpmiNetFnStorage.h b/MdePkg/Include/IndustryStandard/IpmiNetFnStorage.h
index fe5ed38179..548339286f 100644
--- a/MdePkg/Include/IndustryStandard/IpmiNetFnStorage.h
+++ b/MdePkg/Include/IndustryStandard/IpmiNetFnStorage.h
@@ -121,20 +121,27 @@ typedef struct {
 //
 //  Constants and Structure definitions for "Get SDR Repository Info" command to follow here
 //
+typedef union {
+  struct {
+    UINT8  SdrRepAllocInfoCmd : 1;
+    UINT8  SdrRepReserveCmd : 1;
+    UINT8  PartialAddSdrCmd : 1;
+    UINT8  DeleteSdrRepCmd : 1;
+    UINT8  Reserved : 1;
+    UINT8  SdrRepUpdateOp : 2;
+    UINT8  Overflow : 1;
+  } Bits;
+  UINT8  Uint8;
+} IPMI_SDR_OPERATION_SUPPORT;
+
 typedef struct {
-  UINT8   CompletionCode;
-  UINT8   Version;
-  UINT16  RecordCount;
-  UINT16  FreeSpace;
-  UINT32  RecentAdditionTimeStamp;
-  UINT32  RecentEraseTimeStamp;
-  UINT8   SdrRepAllocInfoCmd : 1;
-  UINT8   SdrRepReserveCmd : 1;
-  UINT8   PartialAddSdrCmd : 1;
-  UINT8   DeleteSdrRepCmd : 1;
-  UINT8   Reserved : 1;
-  UINT8   SdrRepUpdateOp : 2;
-  UINT8   Overflow : 1;
+  UINT8                       CompletionCode;
+  UINT8                       Version;
+  UINT16                      RecordCount;
+  UINT16                      FreeSpace;
+  UINT32                      RecentAdditionTimeStamp;
+  UINT32                      RecentEraseTimeStamp;
+  IPMI_SDR_OPERATION_SUPPORT  OperationSupport;
 } IPMI_GET_SDR_REPOSITORY_INFO_RESPONSE;
 
 //
@@ -167,125 +174,179 @@ typedef struct {
 //
 //  Constants and Structure definitions for "Get SDR" command to follow here
 //
+typedef union {
+  struct {
+    UINT8  EventScanningEnabled : 1;
+    UINT8  EventScanningDisabled : 1;
+    UINT8  InitSensorType : 1;
+    UINT8  InitHysteresis : 1;
+    UINT8  InitThresholds : 1;
+    UINT8  InitEvent : 1;
+    UINT8  InitScanning : 1;
+    UINT8  SettableSensor : 1;
+  } Bits;
+  UINT8  Uint8;
+} IPMI_SDR_RECORD_SENSOR_INIT;
 
-typedef struct {
-  UINT16  RecordId;                     // 1
-  UINT8   Version;                      // 3
-  UINT8   RecordType;                   // 4
-  UINT8   RecordLength;                 // 5
-  UINT8   OwnerId;                      // 6
-  UINT8   OwnerLun;                     // 7
-  UINT8   SensorNumber;                 // 8
-  UINT8   EntityId;                     // 9
-  UINT8   EntityInstance;               // 10
-  UINT8   EventScanningEnabled : 1;     // 11
-  UINT8   EventScanningDisabled : 1;    // 11
-  UINT8   InitSensorType : 1;           // 11
-  UINT8   InitHysteresis : 1;           // 11
-  UINT8   InitThresholds : 1;           // 11
-  UINT8   InitEvent : 1;                // 11
-  UINT8   InitScanning : 1;             // 11
-  UINT8   Reserved : 1;                 // 11
-  UINT8   EventMessageControl : 2;      // 12
-  UINT8   ThresholdAccessSupport : 2;   // 12
-  UINT8   HysteresisSupport : 2;        // 12
-  UINT8   ReArmSupport : 1;             // 12
-  UINT8   IgnoreSensor : 1;             // 12
-  UINT8   SensorType;                   // 13
-  UINT8   EventType;                    // 14
-  UINT8   Reserved1[7];                 // 15
-  UINT8   UnitType;                     // 22
-  UINT8   Reserved2;                    // 23
-  UINT8   Linearization : 7;            // 24
-  UINT8   Reserved3 : 1;                // 24
-  UINT8   MLo;                          // 25
-  UINT8   Toleremce : 6;                // 26
-  UINT8   MHi : 2;                      // 26
-  UINT8   BLo;                          // 27
-  UINT8   AccuracyLow : 6;              // 28
-  UINT8   BHi : 2;                      // 28
-  UINT8   Reserved4 : 2;                // 29
-  UINT8   AccuracyExp : 2;              // 29
-  UINT8   AccuracyHi : 4;               // 29
-  UINT8   BExp : 4;                     // 30
-  UINT8   RExp : 4;                     // 30
-  UINT8   NominalReadingSpscified : 1;  // 31
-  UINT8   NominalMaxSpscified : 1;      // 31
-  UINT8   NominalMinSpscified : 1;      // 31
-  UINT8   Reserved5 : 5;                // 31
-  UINT8   NominalReading;               // 32
-  UINT8   Reserved6[4];                 // 33
-  UINT8   UpperNonRecoverThreshold;     // 37
-  UINT8   UpperCriticalThreshold;       // 38
-  UINT8   UpperNonCriticalThreshold;    // 39
-  UINT8   LowerNonRecoverThreshold;     // 40
-  UINT8   LowerCriticalThreshold;       // 41
-  UINT8   LowerNonCriticalThreshold;    // 42
-  UINT8   Reserved7[5];                 // 43
-  UINT8   IdStringLength;               // 48
-  UINT8   AsciiIdString[16];            // 49 - 64
+typedef union {
+  struct {
+    UINT8  EventMessageControl : 2;
+    UINT8  ThresholdAccessSupport : 2;
+    UINT8  HysteresisSupport : 2;
+    UINT8  ReArmSupport : 1;
+    UINT8  IgnoreSensor : 1;
+  } Bits;
+  UINT8  Uint8;
+} IPMI_SDR_RECORD_SENSOR_CAP;
+
+typedef union {
+  struct {
+    UINT8  Linearization : 7;
+    UINT8  Reserved : 1;
+  } Bits;
+  UINT8  Uint8;
+} IPMI_SDR_RECORD_LINEARIZATION;
+
+typedef union {
+  struct {
+    UINT8  Toleremce : 6;
+    UINT8  MHi : 2;
+  } Bits;
+  UINT8  Uint8;
+} IPMI_SDR_RECORD_M_TOLERANCE;
+
+typedef union {
+  struct {
+    UINT8  AccuracyLow : 6;
+    UINT8  BHi : 2;
+  } Bits;
+  UINT8  Uint8;
+} IPMI_SDR_RECORD_B_ACCURACY;
+
+typedef union {
+  struct {
+    UINT8  Reserved : 2;
+    UINT8  AccuracyExp : 2;
+    UINT8  AccuracyHi : 4;
+  } Bits;
+  UINT8  Uint8;
+} IPMI_SDR_RECORD_ACCURACY_SENSOR_DIR;
+
+typedef union {
+  struct {
+    UINT8  BExp : 4;
+    UINT8  RExp : 4;
+  } Bits;
+  UINT8  Uint8;
+} IPMI_SDR_RECORD_R_EXP_B_EXP;
+
+typedef union {
+  struct {
+    UINT8  NominalReadingSpscified : 1;
+    UINT8  NominalMaxSpscified : 1;
+    UINT8  NominalMinSpscified : 1;
+    UINT8  Reserved : 5;
+  } Bits;
+  UINT8  Uint8;
+} IPMI_SDR_RECORD_ANALOG_FLAGS;
+
+typedef struct {
+  UINT16                         RecordId;                   // 1
+  UINT8                          Version;                    // 3
+  UINT8                          RecordType;                 // 4
+  UINT8                          RecordLength;               // 5
+  UINT8                          OwnerId;                    // 6
+  UINT8                          OwnerLun;                   // 7
+  UINT8                          SensorNumber;               // 8
+  UINT8                          EntityId;                   // 9
+  UINT8                          EntityInstance;             // 10
+  IPMI_SDR_RECORD_SENSOR_INIT    SensorInitialization;       // 11
+  IPMI_SDR_RECORD_SENSOR_CAP     SensorCapabilities;         // 12
+  UINT8                          SensorType;                 // 13
+  UINT8                          EventType;                  // 14
+  UINT8                          Reserved1[7];               // 15
+  UINT8                          UnitType;                   // 22
+  UINT8                          Reserved2;                  // 23
+  IPMI_SDR_RECORD_LINEARIZATION  Linearization;              // 24
+  UINT8                          MLo;                        // 25
+  IPMI_SDR_RECORD_M_TOLERANCE    MHiTolerance;               // 26
+  UINT8                          BLo;                        // 27
+  IPMI_SDR_RECORD_B_ACCURACY     BHiAccuracyLo;              // 28
+  IPMI_SDR_RECORD_ACCURACY_SENSOR_DIR  AccuracySensorDirection;  // 29
+  IPMI_SDR_RECORD_R_EXP_B_EXP    RExpBExp;                   // 30
+  IPMI_SDR_RECORD_ANALOG_FLAGS   AnalogFlags;                // 31
+  UINT8                          NominalReading;             // 32
+  UINT8                          Reserved3[4];               // 33
+  UINT8                          UpperNonRecoverThreshold;   // 37
+  UINT8                          UpperCriticalThreshold;     // 38
+  UINT8                          UpperNonCriticalThreshold;  // 39
+  UINT8                          LowerNonRecoverThreshold;   // 40
+  UINT8                          LowerCriticalThreshold;     // 41
+  UINT8                          LowerNonCriticalThreshold;  // 42
+  UINT8                          Reserved4[5];               // 43
+  UINT8                          IdStringLength;             // 48
+  UINT8                          AsciiIdString[16];          // 49 - 64
 } IPMI_SDR_RECORD_STRUCT_1;
 
 typedef struct {
-  UINT16  RecordId;                     // 1
-  UINT8   Version;                      // 3
-  UINT8   RecordType;                   // 4
-  UINT8   RecordLength;                 // 5
-  UINT8   OwnerId;                      // 6
-  UINT8   OwnerLun;                     // 7
-  UINT8   SensorNumber;                 // 8
-  UINT8   EntityId;                     // 9
-  UINT8   EntityInstance;               // 10
-  UINT8   SensorScanning : 1;           // 11
-  UINT8   EventScanning : 1;            // 11
-  UINT8   InitSensorType : 1;           // 11
-  UINT8   InitHysteresis : 1;           // 11
-  UINT8   InitThresholds : 1;           // 11
-  UINT8   InitEvent : 1;                // 11
-  UINT8   InitScanning : 1;             // 11
-  UINT8   Reserved : 1;                 // 11
-  UINT8   EventMessageControl : 2;      // 12
-  UINT8   ThresholdAccessSupport : 2;   // 12
-  UINT8   HysteresisSupport : 2;        // 12
-  UINT8   ReArmSupport : 1;             // 12
-  UINT8   IgnoreSensor : 1;             // 12
-  UINT8   SensorType;                   // 13
-  UINT8   EventType;                    // 14
-  UINT8   Reserved1[7];                 // 15
-  UINT8   UnitType;                     // 22
-  UINT8   Reserved2[9];                 // 23
-  UINT8   IdStringLength;               // 32
-  UINT8   AsciiIdString[16];            // 33 - 48
+  UINT16                       RecordId;              // 1
+  UINT8                        Version;               // 3
+  UINT8                        RecordType;            // 4
+  UINT8                        RecordLength;          // 5
+  UINT8                        OwnerId;               // 6
+  UINT8                        OwnerLun;              // 7
+  UINT8                        SensorNumber;          // 8
+  UINT8                        EntityId;              // 9
+  UINT8                        EntityInstance;        // 10
+  IPMI_SDR_RECORD_SENSOR_INIT  SensorInitialization;  // 11
+  IPMI_SDR_RECORD_SENSOR_CAP   SensorCapabilities;    // 12
+  UINT8                        SensorType;            // 13
+  UINT8                        EventType;             // 14
+  UINT8                        Reserved1[7];          // 15
+  UINT8                        UnitType;              // 22
+  UINT8                        Reserved2[9];          // 23
+  UINT8                        IdStringLength;        // 32
+  UINT8                        AsciiIdString[16];     // 33 - 48
 } IPMI_SDR_RECORD_STRUCT_2;
 
-typedef struct {
-  UINT8 Reserved1 : 1;
-  UINT8 ControllerSlaveAddress : 7;
-  UINT8 FruDeviceId;
-  UINT8 BusId : 3;
-  UINT8 Lun : 2;
-  UINT8 Reserved : 2;
-  UINT8 LogicalFruDevice : 1;
-  UINT8 Reserved3 : 4;
-  UINT8 ChannelNumber : 4;
+typedef union {
+  struct {
+    UINT8  Reserved1 : 1;
+    UINT8  ControllerSlaveAddress : 7;
+    UINT8  FruDeviceId;
+    UINT8  BusId : 3;
+    UINT8  Lun : 2;
+    UINT8  Reserved2 : 2;
+    UINT8  LogicalFruDevice : 1;
+    UINT8  Reserved3 : 4;
+    UINT8  ChannelNumber : 4;
+  } Bits;
+  UINT32  Uint32;
 } IPMI_FRU_DATA_INFO;
 
-typedef struct {
-  UINT16            RecordId;           // 1
-  UINT8             Version;            // 3
-  UINT8             RecordType;         // 4
-  UINT8             RecordLength;       // 5
-  IPMI_FRU_DATA_INFO FruDeviceData;      // 6
-  UINT8             Reserved1;          // 10
-  UINT8             DeviceType;         // 11
-  UINT8             DeviceTypeModifier; // 12
-  UINT8             FruEntityId;        // 13
-  UINT8             FruEntityInstance;  // 14
-  UINT8             OemReserved;        // 15
-  UINT8             Length : 4;         // 16
-  UINT8             Reserved2 : 1;      // 16
-  UINT8             StringType : 3;     // 16
-  UINT8             String[16];         // 17
+typedef union {
+  struct {
+    UINT8  Length : 4;
+    UINT8  Reserved : 1;
+    UINT8  StringType : 3;
+  } Bits;
+  UINT8  Uint8;
+} IPMI_SDR_RECORD_DEV_ID_STR_TYPE_LENGTH;
+
+typedef struct {
+  UINT16                                  RecordId;            // 1
+  UINT8                                   Version;             // 3
+  UINT8                                   RecordType;          // 4
+  UINT8                                   RecordLength;        // 5
+  IPMI_FRU_DATA_INFO                      FruDeviceData;       // 6
+  UINT8                                   Reserved;            // 10
+  UINT8                                   DeviceType;          // 11
+  UINT8                                   DeviceTypeModifier;  // 12
+  UINT8                                   FruEntityId;         // 13
+  UINT8                                   FruEntityInstance;   // 14
+  UINT8                                   OemReserved;         // 15
+  IPMI_SDR_RECORD_DEV_ID_STR_TYPE_LENGTH  StringTypeLength;    // 16
+  UINT8                                   String[16];          // 17
 } IPMI_SDR_RECORD_STRUCT_11;
 
 typedef struct {
diff --git a/MdePkg/Include/IndustryStandard/IpmiNetFnTransport.h b/MdePkg/Include/IndustryStandard/IpmiNetFnTransport.h
index 28ede2f63a..9a5da6a12f 100644
--- a/MdePkg/Include/IndustryStandard/IpmiNetFnTransport.h
+++ b/MdePkg/Include/IndustryStandard/IpmiNetFnTransport.h
@@ -109,23 +109,29 @@ typedef enum {
   IpmiOem2
 } IPMI_LAN_DEST_TYPE_DEST_TYPE;
 
-typedef struct {
-  UINT8 NoAuth : 1;
-  UINT8 MD2Auth : 1;
-  UINT8 MD5Auth : 1;
-  UINT8 Reserved1 : 1;
-  UINT8 StraightPswd : 1;
-  UINT8 OemType : 1;
-  UINT8 Reserved2 : 2;
+typedef union {
+  struct {
+    UINT8  NoAuth : 1;
+    UINT8  MD2Auth : 1;
+    UINT8  MD5Auth : 1;
+    UINT8  Reserved1 : 1;
+    UINT8  StraightPswd : 1;
+    UINT8  OemType : 1;
+    UINT8  Reserved2 : 2;
+  } Bits;
+  UINT8  Uint8;
 } IPMI_LAN_AUTH_TYPE;
 
 typedef struct {
   UINT8 IpAddress[4];
 } IPMI_LAN_IP_ADDRESS;
 
-typedef struct {
-  UINT8 AddressSrc : 4;
-  UINT8 Reserved : 4;
+typedef union {
+  struct {
+    UINT8  AddressSrc : 4;
+    UINT8  Reserved : 4;
+  } Bits;
+  UINT8  Uint8;
 } IPMI_LAN_IP_ADDRESS_SRC;
 
 typedef struct {
@@ -136,13 +142,27 @@ typedef struct {
   UINT8 IpAddress[4];
 } IPMI_LAN_SUBNET_MASK;
 
-typedef struct {
-  UINT8 TimeToLive;
-  UINT8 IpFlag : 3;
-  UINT8 Reserved1 : 5;
-  UINT8 Precedence : 3;
-  UINT8 Reserved2 : 1;
-  UINT8 ServiceType : 4;
+typedef union {
+  struct {
+    UINT8  IpFlag : 3;
+    UINT8  Reserved : 5;
+  } Bits;
+  UINT8  Uint8;
+} IPMI_LAN_IPV4_HDR_PARAM_DATA_2;
+
+typedef union {
+  struct {
+    UINT8  Precedence : 3;
+    UINT8  Reserved : 1;
+    UINT8  ServiceType : 4;
+  } Bits;
+  UINT8  Uint8;
+} IPMI_LAN_IPV4_HDR_PARAM_DATA_3;
+
+typedef struct {
+  UINT8                           TimeToLive;
+  IPMI_LAN_IPV4_HDR_PARAM_DATA_2  Data2;
+  IPMI_LAN_IPV4_HDR_PARAM_DATA_3  Data3;
 } IPMI_LAN_IPV4_HDR_PARAM;
 
 typedef struct {
@@ -150,10 +170,13 @@ typedef struct {
   UINT8 RcmpPortLsb;
 } IPMI_LAN_RCMP_PORT;
 
-typedef struct {
-  UINT8 EnableBmcArpResponse : 1;
-  UINT8 EnableBmcGratuitousArp : 1;
-  UINT8 Reserved : 6;
+typedef union {
+  struct {
+    UINT8  EnableBmcArpResponse : 1;
+    UINT8  EnableBmcGratuitousArp : 1;
+    UINT8  Reserved : 6;
+  } Bits;
+  UINT8  Uint8;
 } IPMI_LAN_BMC_GENERATED_ARP_CONTROL;
 
 typedef struct {
@@ -164,23 +187,50 @@ typedef struct {
   UINT8 Data[18];
 } IPMI_LAN_COMMUNITY_STRING;
 
+typedef union {
+  struct {
+    UINT8  DestinationSelector : 4;
+    UINT8  Reserved : 4;
+  } Bits;
+  UINT8  Uint8;
+} IPMI_LAN_SET_SELECTOR;
+
+typedef union {
+  struct {
+    UINT8  DestinationType : 3;
+    UINT8  Reserved : 4;
+    UINT8  AlertAcknowledged : 1;
+  } Bits;
+  UINT8  Uint8;
+} IPMI_LAN_DEST_TYPE_DESTINATION_TYPE;
+
 typedef struct {
-  UINT8 DestinationSelector : 4;
-  UINT8 Reserved2 : 4;
-  UINT8 DestinationType : 3;
-  UINT8 Reserved1 : 4;
-  UINT8 AlertAcknowledged : 1;
+  IPMI_LAN_SET_SELECTOR                SetSelector;
+  IPMI_LAN_DEST_TYPE_DESTINATION_TYPE  DestinationType;
 } IPMI_LAN_DEST_TYPE;
 
-typedef struct {
-  UINT8               DestinationSelector : 4;
-  UINT8               Reserved1 : 4;
-  UINT8               AlertingIpAddressSelector : 4;
-  UINT8               AddressFormat : 4;
-  UINT8               UseDefaultGateway : 1;
-  UINT8               Reserved2 : 7;
-  IPMI_LAN_IP_ADDRESS  AlertingIpAddress;
-  IPMI_LAN_MAC_ADDRESS AlertingMacAddress;
+typedef union {
+  struct {
+    UINT8  AlertingIpAddressSelector : 4;
+    UINT8  AddressFormat : 4;
+  } Bits;
+  UINT8  Uint8;
+} IPMI_LAN_ADDRESS_FORMAT;
+
+typedef union {
+  struct {
+    UINT8  UseDefaultGateway : 1;
+    UINT8  Reserved2 : 7;
+  } Bits;
+  UINT8  Uint8;
+} IPMI_LAN_GATEWAY_SELECTOR;
+
+typedef struct {
+  IPMI_LAN_SET_SELECTOR      SetSelector;
+  IPMI_LAN_ADDRESS_FORMAT    AddressFormat;
+  IPMI_LAN_GATEWAY_SELECTOR  GatewaySelector;
+  IPMI_LAN_IP_ADDRESS        AlertingIpAddress;
+  IPMI_LAN_MAC_ADDRESS       AlertingMacAddress;
 } IPMI_LAN_DEST_ADDRESS;
 
 typedef union {
@@ -198,30 +248,46 @@ typedef union {
   IPMI_LAN_DEST_ADDRESS              IpmiLanDestAddress;
 } IPMI_LAN_OPTIONS;
 
-typedef struct {
-  UINT8  SetSelector;
-  UINT8  AddressSourceType : 4;
-  UINT8  Reserved : 3;
-  UINT8  EnableStatus : 1;
-  UINT8  Ipv6Address[16];
-  UINT8  AddressPrefixLen;
-  UINT8  AddressStatus;
+typedef union {
+  struct {
+    UINT8  AddressSourceType : 4;
+    UINT8  Reserved : 3;
+    UINT8  EnableStatus : 1;
+  } Bits;
+  UINT8  Uint8;
+} IPMI_LAN_IPV6_ADDRESS_SOURCE_TYPE;
+
+typedef struct {
+  UINT8                              SetSelector;
+  IPMI_LAN_IPV6_ADDRESS_SOURCE_TYPE  AddressSourceType;
+  UINT8                              Ipv6Address[16];
+  UINT8                              AddressPrefixLen;
+  UINT8                              AddressStatus;
 } IPMI_LAN_IPV6_STATIC_ADDRESS;
 
 //
 //  Set in progress parameter
 //
-typedef struct {
-  UINT8  SetInProgress:2;
-  UINT8  Reserved:6;
+typedef union {
+  struct {
+    UINT8  SetInProgress:2;
+    UINT8  Reserved:6;
+  } Bits;
+  UINT8  Uint8;
 } IPMI_LAN_SET_IN_PROGRESS;
 
+typedef union {
+  struct {
+    UINT8  ChannelNo : 4;
+    UINT8  Reserved : 4;
+  } Bits;
+  UINT8  Uint8;
+} IPMI_SET_LAN_CONFIG_CHANNEL_NUM;
 
 typedef struct {
-  UINT8  ChannelNo : 4;
-  UINT8  Reserved : 4;
-  UINT8  ParameterSelector;
-  UINT8  ParameterData[0];
+  IPMI_SET_LAN_CONFIG_CHANNEL_NUM  ChannelNumber;
+  UINT8                            ParameterSelector;
+  UINT8                            ParameterData[0];
 } IPMI_SET_LAN_CONFIGURATION_PARAMETERS_COMMAND_REQUEST;
 
 //
@@ -232,13 +298,20 @@ typedef struct {
 //
 //  Constants and Structure definitions for "Get Lan Configuration Parameters" command to follow here
 //
-typedef struct {
-  UINT8  ChannelNo : 4;
-  UINT8  Reserved : 3;
-  UINT8  GetParameter : 1;
-  UINT8  ParameterSelector;
-  UINT8  SetSelector;
-  UINT8  BlockSelector;
+typedef union {
+  struct {
+    UINT8  ChannelNo : 4;
+    UINT8  Reserved : 3;
+    UINT8  GetParameter : 1;
+  } Bits;
+  UINT8  Uint8;
+} IPMI_GET_LAN_CONFIG_CHANNEL_NUM;
+
+typedef struct {
+  IPMI_GET_LAN_CONFIG_CHANNEL_NUM  ChannelNumber;
+  UINT8                            ParameterSelector;
+  UINT8                            SetSelector;
+  UINT8                            BlockSelector;
 } IPMI_GET_LAN_CONFIGURATION_PARAMETERS_REQUEST;
 
 typedef struct {
@@ -281,67 +354,100 @@ typedef struct {
 //
 // EMP OPTION DATA
 //
-typedef struct {
-  UINT8 NoAuthentication : 1;
-  UINT8 MD2Authentication : 1;
-  UINT8 MD5Authentication : 1;
-  UINT8 Reserved1 : 1;
-  UINT8 StraightPassword : 1;
-  UINT8 OemProprietary : 1;
-  UINT8 Reservd2 : 2;
+typedef union {
+  struct {
+    UINT8  NoAuthentication : 1;
+    UINT8  MD2Authentication : 1;
+    UINT8  MD5Authentication : 1;
+    UINT8  Reserved1 : 1;
+    UINT8  StraightPassword : 1;
+    UINT8  OemProprietary : 1;
+    UINT8  Reservd2 : 2;
+  } Bits;
+  UINT8  Uint8;
 } IPMI_EMP_AUTH_TYPE;
 
-typedef struct {
-  UINT8 EnableBasicMode : 1;
-  UINT8 EnablePPPMode : 1;
-  UINT8 EnableTerminalMode : 1;
-  UINT8 Reserved1 : 2;
-  UINT8 SnoopOsPPPNegotiation : 1;
-  UINT8 Reserved2 : 1;
-  UINT8 DirectConnect : 1;
+typedef union {
+  struct {
+    UINT8  EnableBasicMode : 1;
+    UINT8  EnablePPPMode : 1;
+    UINT8  EnableTerminalMode : 1;
+    UINT8  Reserved1 : 2;
+    UINT8  SnoopOsPPPNegotiation : 1;
+    UINT8  Reserved2 : 1;
+    UINT8  DirectConnect : 1;
+  } Bits;
+  UINT8  Uint8;
 } IPMI_EMP_CONNECTION_TYPE;
 
-typedef struct {
-  UINT8 InactivityTimeout : 4;
-  UINT8 Reserved : 4;
+typedef union {
+  struct {
+    UINT8  InactivityTimeout : 4;
+    UINT8  Reserved : 4;
+  } Bits;
+  UINT8  Uint8;
 } IPMI_EMP_INACTIVITY_TIMEOUT;
 
-typedef struct {
-  UINT8 IpmiCallback : 1;
-  UINT8 CBCPCallback : 1;
-  UINT8 Reserved1 : 6;
-  UINT8 CbcpEnableNoCallback : 1;
-  UINT8 CbcpEnablePreSpecifiedNumber : 1;
-  UINT8 CbcpEnableUserSpecifiedNumber : 1;
-  UINT8 CbcpEnableCallbackFromList : 1;
-  UINT8 Reserved : 4;
-  UINT8 CallbackDestination1;
-  UINT8 CallbackDestination2;
-  UINT8 CallbackDestination3;
+typedef union {
+  struct {
+    UINT8  IpmiCallback : 1;
+    UINT8  CBCPCallback : 1;
+    UINT8  Reserved : 6;
+  } Bits;
+  UINT8  Uint8;
+} IPMI_CHANNEL_CALLBACK_CONTROL_ENABLE;
+
+typedef union {
+  struct {
+    UINT8  CbcpEnableNoCallback : 1;
+    UINT8  CbcpEnablePreSpecifiedNumber : 1;
+    UINT8  CbcpEnableUserSpecifiedNumber : 1;
+    UINT8  CbcpEnableCallbackFromList : 1;
+    UINT8  Reserved : 4;
+  } Bits;
+  UINT8  Uint8;
+} IPMI_CHANNEL_CALLBACK_CONTROL_CBCP;
+
+typedef struct {
+  IPMI_CHANNEL_CALLBACK_CONTROL_ENABLE  CallbackEnable;
+  IPMI_CHANNEL_CALLBACK_CONTROL_CBCP    CBCPNegotiation;
+  UINT8                                 CallbackDestination1;
+  UINT8                                 CallbackDestination2;
+  UINT8                                 CallbackDestination3;
 } IPMI_EMP_CHANNEL_CALLBACK_CONTROL;
 
-typedef struct {
-  UINT8 CloseSessionOnDCDLoss : 1;
-  UINT8 EnableSessionInactivityTimeout : 1;
-  UINT8 Reserved : 6;
+typedef union {
+  struct {
+    UINT8  CloseSessionOnDCDLoss : 1;
+    UINT8  EnableSessionInactivityTimeout : 1;
+    UINT8  Reserved : 6;
+  } Bits;
+  UINT8  Uint8;
 } IPMI_EMP_SESSION_TERMINATION;
 
-typedef struct {
-  UINT8 Reserved1 : 5;
-  UINT8 EnableDtrHangup : 1;
-  UINT8 FlowControl : 2;
-  UINT8 BitRate : 4;
-  UINT8 Reserved2 : 4;
-  UINT8 SaveSetting : 1;
-  UINT8 SetComPort : 1;
-  UINT8 Reserved3 : 6;
+typedef union {
+  struct {
+    UINT8  Reserved1 : 5;
+    UINT8  EnableDtrHangup : 1;
+    UINT8  FlowControl : 2;
+    UINT8  BitRate : 4;
+    UINT8  Reserved2 : 4;
+    UINT8  SaveSetting : 1;
+    UINT8  SetComPort : 1;
+    UINT8  Reserved3 : 6;
+  } Bits;
+  UINT8   Uint8;
+  UINT16  Uint16;
 } IPMI_EMP_MESSAGING_COM_SETTING;
 
-typedef struct {
-  UINT8 RingDurationInterval : 6;
-  UINT8 Reserved1 : 2;
-  UINT8 RingDeadTime : 4;
-  UINT8 Reserved : 4;
+typedef union {
+  struct {
+    UINT8  RingDurationInterval : 6;
+    UINT8  Reserved1 : 2;
+    UINT8  RingDeadTime : 4;
+    UINT8  Reserved2 : 4;
+  } Bits;
+  UINT8  Uint8;
 } IPMI_EMP_MODEM_RING_TIME;
 
 typedef struct {
@@ -369,14 +475,20 @@ typedef struct {
   UINT8 CommunityString[18];
 } IPMI_EMP_COMMUNITY_STRING;
 
-typedef struct {
-  UINT8 Reserved5 : 4;
-  UINT8 DialStringSelector : 4;
+typedef union {
+  struct {
+    UINT8  Reserved : 4;
+    UINT8  DialStringSelector : 4;
+  } Bits;
+  UINT8  Uint8;
 } IPMI_DIAL_PAGE_DESTINATION;
 
-typedef struct {
-  UINT8 TapAccountSelector : 4;
-  UINT8 Reserved : 4;
+typedef union {
+  struct {
+    UINT8  TapAccountSelector : 4;
+    UINT8  Reserved : 4;
+  } Bits;
+  UINT8  Uint8;
 } IPMI_TAP_PAGE_DESTINATION;
 
 typedef struct {
@@ -390,40 +502,78 @@ typedef union {
   IPMI_PPP_ALERT_DESTINATION    PppAlertDestination;
 } IPMI_DEST_TYPE_SPECIFIC;
 
-typedef struct {
-  UINT8 DestinationSelector : 4;
-  UINT8 Reserved1 : 4;
-  UINT8 DestinationType : 4;
-  UINT8 Reserved2 : 3;
-  UINT8 AlertAckRequired : 1;
-  UINT8 AlertAckTimeoutSeconds;
-  UINT8 NumRetriesCall : 3;
-  UINT8 Reserved3 : 1;
-  UINT8 NumRetryAlert : 3;
-  UINT8 Reserved4 : 1;
-  IPMI_DEST_TYPE_SPECIFIC DestinationTypeSpecific;
+typedef union {
+  struct {
+    UINT8 DestinationSelector : 4;
+    UINT8 Reserved : 4;
+  } Bits;
+  UINT8  Uint8;
+} IPMI_EMP_DESTINATION_SELECTOR;
+
+typedef union {
+  struct {
+    UINT8  DestinationType : 4;
+    UINT8  Reserved : 3;
+    UINT8  AlertAckRequired : 1;
+  } Bits;
+  UINT8  Uint8;
+} IPMI_EMP_DESTINATION_TYPE;
+
+typedef union {
+  struct {
+    UINT8  NumRetriesCall : 3;
+    UINT8  Reserved1 : 1;
+    UINT8  NumRetryAlert : 3;
+    UINT8  Reserved2 : 1;
+  } Bits;
+  UINT8  Uint8;
+} IPMI_EMP_RETRIES;
+
+typedef struct {
+  IPMI_EMP_DESTINATION_SELECTOR  DestinationSelector;
+  IPMI_EMP_DESTINATION_TYPE      DestinationType;
+  UINT8                          AlertAckTimeoutSeconds;
+  IPMI_EMP_RETRIES               Retries;
+  IPMI_DEST_TYPE_SPECIFIC        DestinationTypeSpecific;
 } IPMI_EMP_DESTINATION_INFO;
 
+typedef union {
+  struct {
+    UINT8  Parity : 3;
+    UINT8  CharacterSize : 1;
+    UINT8  StopBit : 1;
+    UINT8  DtrHangup : 1;
+    UINT8  FlowControl : 2;
+  } Bits;
+  UINT8  Uint8;
+} IPMI_EMP_DESTINATION_COM_SETTING_DATA_2;
+
+typedef union {
+  struct {
+    UINT8  BitRate : 4;
+    UINT8  Reserved2 : 4;
+  } Bits;
+  UINT8  Uint8;
+} IPMI_EMP_BIT_RATE;
+
 typedef struct {
-  UINT8 DestinationSelector : 4;
-  UINT8 Reserved1 : 4;
-  UINT8 Parity : 3;
-  UINT8 CharacterSize : 1;
-  UINT8 StopBit : 1;
-  UINT8 DtrHangup : 1;
-  UINT8 FlowControl : 2;
-  UINT8 BitRate : 4;
-  UINT8 Reserved2 : 4;
-  UINT8 SaveSetting : 1;
-  UINT8 SetComPort : 1;
-  UINT8 Reserved3 : 6;
+  IPMI_EMP_DESTINATION_SELECTOR            DestinationSelector;
+  IPMI_EMP_DESTINATION_COM_SETTING_DATA_2  Data2;
+  IPMI_EMP_BIT_RATE                        BitRate;
 } IPMI_EMP_DESTINATION_COM_SETTING;
 
+typedef union {
+  struct {
+    UINT8  DialStringSelector : 4;
+    UINT8  Reserved : 4;
+  } Bits;
+  UINT8  Uint8;
+} IPMI_DIAL_STRING_SELECTOR;
+
 typedef struct {
-  UINT8 DialStringSelector : 4;
-  UINT8 Reserved1 : 4;
-  UINT8 Reserved2;
-  UINT8 DialString[48];
+  IPMI_DIAL_STRING_SELECTOR  DestinationSelector;
+  UINT8                      Reserved;
+  UINT8                      DialString[48];
 } IPMI_DESTINATION_DIAL_STRING;
 
 typedef union {
@@ -431,16 +581,31 @@ typedef union {
   UINT8   IpAddress[4];
 } IPMI_PPP_IP_ADDRESS;
 
+typedef union {
+  struct {
+    UINT8  IpAddressSelector : 4;
+    UINT8  Reserved : 4;
+  } Bits;
+  UINT8  Uint8;
+} IPMI_DESTINATION_IP_ADDRESS_SELECTOR;
+
 typedef struct {
-  UINT8 IpAddressSelector : 4;
-  UINT8 Reserved1 : 4;
-  IPMI_PPP_IP_ADDRESS PppIpAddress;
+  IPMI_DESTINATION_IP_ADDRESS_SELECTOR  DestinationSelector;
+  IPMI_PPP_IP_ADDRESS                   PppIpAddress;
 } IPMI_DESTINATION_IP_ADDRESS;
 
+typedef union {
+  struct {
+    UINT8  TapServiceSelector : 4;
+    UINT8  TapDialStringSelector : 4;
+  } Bits;
+  UINT8  Uint8;
+} IPMI_TAP_DIAL_STRING_SERVICE_SELECTOR;
+
+
 typedef struct {
-  UINT8 TapSelector;
-  UINT8 TapServiceSelector : 4;
-  UINT8 TapDialStringSelector : 4;
+  UINT8                                  TapSelector;
+  IPMI_TAP_DIAL_STRING_SERVICE_SELECTOR  TapDialStringServiceSelector;
 } IPMI_DESTINATION_TAP_ACCOUNT;
 
 typedef struct {
@@ -509,22 +674,43 @@ typedef union {
 #define IPMI_MUX_SETTING_BLOCK_REQUEST_MUX_TO_BMC     0x7
 #define IPMI_MUX_SETTING_ALLOW_REQUEST_MUX_TO_BMC     0x8
 
+typedef union {
+  struct {
+    UINT8  ChannelNo : 4;
+    UINT8  Reserved : 4;
+  } Bits;
+  UINT8  Uint8;
+} IPMI_MUX_CHANNEL_NUM;
+
+typedef union {
+  struct {
+    UINT8  MuxSetting : 4;
+    UINT8  Reserved : 4;
+  } Bits;
+  UINT8  Uint8;
+} IPMI_MUX_SETTING_REQUEST;
+
 typedef struct {
-  UINT8 ChannelNo : 4;
-  UINT8 Reserved1 : 4;
-  UINT8 MuxSetting : 4;
-  UINT8 Reserved2 : 4;
+  IPMI_MUX_CHANNEL_NUM      ChannelNumber;
+  IPMI_MUX_SETTING_REQUEST  MuxSetting;
 } IPMI_SET_SERIAL_MODEM_MUX_COMMAND_REQUEST;
 
-typedef struct {
-  UINT8 CompletionCode;
-  UINT8 MuxSetToBmc : 1;
-  UINT8 CommandStatus : 1;
-  UINT8 MessagingSessionActive : 1;
-  UINT8 AlertInProgress : 1;
-  UINT8 Reserved2 : 2;
-  UINT8 MuxToBmcAllowed : 1;
-  UINT8 MuxToSystemBlocked : 1;
+typedef union {
+  struct {
+    UINT8  MuxSetToBmc : 1;
+    UINT8  CommandStatus : 1;
+    UINT8  MessagingSessionActive : 1;
+    UINT8  AlertInProgress : 1;
+    UINT8  Reserved : 2;
+    UINT8  MuxToBmcAllowed : 1;
+    UINT8  MuxToSystemBlocked : 1;
+  } Bits;
+  UINT8  Uint8;
+} IPMI_MUX_SETTING_PRESENT_STATE;
+
+typedef struct {
+  UINT8                           CompletionCode;
+  IPMI_MUX_SETTING_PRESENT_STATE  MuxSetting;
 } IPMI_SET_SERIAL_MODEM_MUX_COMMAND_RESPONSE;
 
 //
@@ -620,12 +806,19 @@ typedef struct {
 //
 //  Constants and Structure definitions for "SOL activating" command to follow here
 //
-typedef struct {
-  UINT8  SessionState : 4;
-  UINT8  Reserved : 4;
-  UINT8  PayloadInstance;
-  UINT8  FormatVersionMajor; // 1
-  UINT8  FormatVersionMinor; // 0
+typedef union {
+  struct {
+    UINT8  SessionState : 4;
+    UINT8  Reserved : 4;
+  } Bits;
+  UINT8  Uint8;
+} IPMI_SOL_SESSION_STATE;
+
+typedef struct {
+  IPMI_SOL_SESSION_STATE  SessionState;
+  UINT8                   PayloadInstance;
+  UINT8                   FormatVersionMajor; // 1
+  UINT8                   FormatVersionMinor; // 0
 } IPMI_SOL_ACTIVATING_REQUEST;
 
 //
@@ -650,11 +843,18 @@ typedef struct {
 #define IPMI_SOL_CONFIGURATION_PARAMETER_SOL_PAYLOAD_CHANNEL   7
 #define IPMI_SOL_CONFIGURATION_PARAMETER_SOL_PAYLOAD_PORT      8
 
+typedef union {
+  struct {
+    UINT8  ChannelNumber : 4;
+    UINT8  Reserved : 4;
+  } Bits;
+  UINT8  Uint8;
+} IPMI_SET_SOL_CONFIG_PARAM_CHANNEL_NUM;
+
 typedef struct {
-  UINT8  ChannelNumber : 4;
-  UINT8  Reserved : 4;
-  UINT8  ParameterSelector;
-  UINT8  ParameterData[0];
+  IPMI_SET_SOL_CONFIG_PARAM_CHANNEL_NUM  ChannelNumber;
+  UINT8                                  ParameterSelector;
+  UINT8                                  ParameterData[0];
 } IPMI_SET_SOL_CONFIGURATION_PARAMETERS_REQUEST;
 
 //
@@ -665,13 +865,20 @@ typedef struct {
 //
 //  Constants and Structure definitions for "Get SOL Configuration Parameters" command to follow here
 //
-typedef struct {
-  UINT8  ChannelNumber : 4;
-  UINT8  Reserved : 3;
-  UINT8  GetParameter : 1;
-  UINT8  ParameterSelector;
-  UINT8  SetSelector;
-  UINT8  BlockSelector;
+typedef union {
+  struct {
+    UINT8  ChannelNumber : 4;
+    UINT8  Reserved : 3;
+    UINT8  GetParameter : 1;
+  } Bits;
+  UINT8  Uint8;
+} IPMI_GET_SOL_CONFIG_PARAM_CHANNEL_NUM;
+
+typedef struct {
+  IPMI_GET_SOL_CONFIG_PARAM_CHANNEL_NUM  ChannelNumber;
+  UINT8                                  ParameterSelector;
+  UINT8                                  SetSelector;
+  UINT8                                  BlockSelector;
 } IPMI_GET_SOL_CONFIGURATION_PARAMETERS_REQUEST;
 
 typedef struct {
-- 
2.12.0.windows.1



  parent reply	other threads:[~2018-06-05  3:20 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-06-05  3:20 [RFC PATCH v1 0/2] Update and refine the IPMI header files Hao Wu
2018-06-05  3:20 ` [RFC PATCH v1 1/2] MdePkg/IndustryStandard/Ipmi: Update " Hao Wu
2018-06-05  3:20 ` Hao Wu [this message]
2018-06-19  4:48 ` [RFC PATCH v1 0/2] Update and refine the " Gao, Liming

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20180605032010.25104-3-hao.a.wu@intel.com \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox