public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
* [edk2-platforms][PATCH] ManageabilityPkg/IpmiCommandLib:IPMI Command Library
@ 2023-05-05  5:24 Chang, Abner
  2023-05-05  5:24 ` [edk2-platforms][PATCH] ManageabilityPkg/IpmiCommandLib: Add IpmiCommandLib to package Chang, Abner
                   ` (3 more replies)
  0 siblings, 4 replies; 8+ messages in thread
From: Chang, Abner @ 2023-05-05  5:24 UTC (permalink / raw)
  To: devel; +Cc: Isaac Oram, Abdul Lateef Attar, Nickle Wang, Tinh Nguyen

From: Abner Chang <abner.chang@amd.com>

BZ #: 4444

IpmiCommandLib is cloned from
edk2-platforms/Features/Intel/OutOfBandManagement/
IpmiFeaturePkg/Library/IpmiCommandLib in order to
consolidate edk2 system manageability support in
one place. Function header are added to the source
files and header files. Uncustify is applied to C
files and no functionalities are changed in this patch.

We will still keep the one under IpmiFeaturePkg/Library/
IpmiCommandLib until the reference to this instance are
removed from platforms.

Signed-off-by: Abner Chang <abner.chang@amd.com>
Cc: Isaac Oram <isaac.w.oram@intel.com>
Cc: Abdul Lateef Attar <abdattar@amd.com>
Cc: Nickle Wang <nicklew@nvidia.com>
Cc: Tinh Nguyen <tinhnguyen@os.amperecomputing.com>
---
 .../Library/IpmiCommandLib/IpmiCommandLib.inf |  33 +
 .../Include/Library/IpmiCommandLib.h          | 620 ++++++++++++++++++
 .../IpmiCommandLib/IpmiCommandLibNetFnApp.c   | 444 +++++++++++++
 .../IpmiCommandLibNetFnChassis.c              | 199 ++++++
 .../IpmiCommandLibNetFnStorage.c              | 384 +++++++++++
 .../IpmiCommandLibNetFnTransport.c            | 156 +++++
 6 files changed, 1836 insertions(+)
 create mode 100644 Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLib.inf
 create mode 100644 Features/ManageabilityPkg/Include/Library/IpmiCommandLib.h
 create mode 100644 Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLibNetFnApp.c
 create mode 100644 Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLibNetFnChassis.c
 create mode 100644 Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLibNetFnStorage.c
 create mode 100644 Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLibNetFnTransport.c

diff --git a/Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLib.inf b/Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLib.inf
new file mode 100644
index 0000000000..3dc485cf38
--- /dev/null
+++ b/Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLib.inf
@@ -0,0 +1,33 @@
+### @file
+# Component description file for IPMI Command Library.
+#
+# Copyright (c) 2018 - 2021, Intel Corporation. All rights reserved.<BR>
+# Copyright (C) 2023 Advanced Micro Devices, Inc. All rights reserved.<BR>
+#
+# SPDX-License-Identifier: BSD-2-Clause-Patent
+#
+###
+
+[Defines]
+  INF_VERSION                    = 0x00010005
+  BASE_NAME                      = IpmiCommandLib
+  FILE_GUID                      = 96FC1989-CB7F-489B-9D3B-68DCA2C2DADC
+  MODULE_TYPE                    = UEFI_DRIVER
+  VERSION_STRING                 = 1.0
+  LIBRARY_CLASS                  = IpmiCommandLib
+
+[sources]
+  IpmiCommandLibNetFnApp.c
+  IpmiCommandLibNetFnTransport.c
+  IpmiCommandLibNetFnChassis.c
+  IpmiCommandLibNetFnStorage.c
+
+[Packages]
+  MdePkg/MdePkg.dec
+  MdeModulePkg/MdeModulePkg.dec
+  ManageabilityPkg/ManageabilityPkg.dec
+
+[LibraryClasses]
+  BaseMemoryLib
+  DebugLib
+  IpmiLib
diff --git a/Features/ManageabilityPkg/Include/Library/IpmiCommandLib.h b/Features/ManageabilityPkg/Include/Library/IpmiCommandLib.h
new file mode 100644
index 0000000000..685f6e2ea2
--- /dev/null
+++ b/Features/ManageabilityPkg/Include/Library/IpmiCommandLib.h
@@ -0,0 +1,620 @@
+/** @file
+  This library abstract how to send/receive IPMI command.
+
+Copyright (c) 2018-2021, Intel Corporation. All rights reserved.<BR>
+Copyright (C) 2023 Advanced Micro Devices, Inc. All rights reserved.<BR>
+
+SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#ifndef IPMI_COMMAND_LIB_H_
+#define IPMI_COMMAND_LIB_H_
+
+#include <Uefi.h>
+#include <IndustryStandard/Ipmi.h>
+
+///
+/// Functions for IPMI NetFnApp commands
+///
+
+/**
+  This function is used to retrieve device ID.
+
+  @param [out]  DeviceId  The pointer to receive IPMI_GET_DEVICE_ID_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetDeviceId (
+  OUT IPMI_GET_DEVICE_ID_RESPONSE  *DeviceId
+  );
+
+/**
+  This function returns device self test results
+
+  @param [out]  SelfTestResult  The pointer to receive IPMI_SELF_TEST_RESULT_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetSelfTestResult (
+  OUT IPMI_SELF_TEST_RESULT_RESPONSE  *SelfTestResult
+  );
+
+/**
+  This function is used for starting and restarting the Watchdog
+  Timer from the initial countdown value that was specified in
+  the Set Watchdog Timer command the watchdog timer.
+
+  @param [out]  CompletionCode  IPMI completetion code, refer to Ipmi.h.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiResetWatchdogTimer (
+  OUT UINT8  *CompletionCode
+  );
+
+/**
+  This function  is used for initializing and configuring
+  the watchdog timer.
+
+  @param [in]   SetWatchdogTimer  Pointer to receive IPMI_SET_WATCHDOG_TIMER_REQUEST.
+  @param [out]  CompletionCode    IPMI completetion code, refer to Ipmi.h.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiSetWatchdogTimer (
+  IN  IPMI_SET_WATCHDOG_TIMER_REQUEST  *SetWatchdogTimer,
+  OUT UINT8                            *CompletionCode
+  );
+
+/**
+  This function retrieves the current settings and present
+  countdown of the watchdog timer.
+
+  @param [out]  GetWatchdogTimer  Pointer to receive IPMI_GET_WATCHDOG_TIMER_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetWatchdogTimer (
+  OUT IPMI_GET_WATCHDOG_TIMER_RESPONSE  *GetWatchdogTimer
+  );
+
+/**
+  This function enables message reception into Message Buffers,
+  and any interrupt associated with that buffer getting full.
+
+  @param [in]   SetBmcGlobalEnables  Pointer receive to IPMI_SET_BMC_GLOBAL_ENABLES_REQUEST.
+  @param [out]  CompletionCode       IPMI completetion code, refer to Ipmi.h.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiSetBmcGlobalEnables (
+  IN  IPMI_SET_BMC_GLOBAL_ENABLES_REQUEST  *SetBmcGlobalEnables,
+  OUT UINT8                                *CompletionCode
+  );
+
+/**
+  This function retrieves the present setting of the Global Enables
+
+  @param [out]  GetBmcGlobalEnables  Pointer to receive IPMI_GET_BMC_GLOBAL_ENABLES_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetBmcGlobalEnables (
+  OUT IPMI_GET_BMC_GLOBAL_ENABLES_RESPONSE  *GetBmcGlobalEnables
+  );
+
+/**
+  This function is used to flush unread data from the Receive
+  Message Queue or Event Message Buffer
+
+  @param [in]   ClearMessageFlagsRequest IPMI_CLEAR_MESSAGE_FLAGS_REQUEST
+  @param [out]  CompletionCode           IPMI completetion code, refer to Ipmi.h.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiClearMessageFlags (
+  IN  IPMI_CLEAR_MESSAGE_FLAGS_REQUEST  *ClearMessageFlagsRequest,
+  OUT UINT8                             *CompletionCode
+  );
+
+/**
+  This function is used to retrieve the present message available states.
+
+  @param [out]  GetMessageFlagsResponse  Pointer to receive IPMI_GET_MESSAGE_FLAGS_RESPONSE
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetMessageFlags (
+  OUT IPMI_GET_MESSAGE_FLAGS_RESPONSE  *GetMessageFlagsResponse
+  );
+
+/**
+  This function is used to get data from the Receive Message Queue.
+
+  @param [out]      GetMessageResponse      Pointer to receive IPMI_GET_MESSAGE_RESPONSE.
+  @param [in, out]  GetMessageResponseSize  When in, which is the expected size of
+                                            response. When out, which is the actual
+                                            size returned.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetMessage (
+  OUT IPMI_GET_MESSAGE_RESPONSE  *GetMessageResponse,
+  IN OUT UINT32                  *GetMessageResponseSize
+  );
+
+/**
+  This function is used for bridging IPMI messages between channels,
+  and between the system management software (SMS) and a given channel
+
+  @param [in]   SendMessageRequest       Pointer to IPMI_SEND_MESSAGE_REQUEST.
+  @param [in]   SendMessageRequestSize   Size of entire SendMessageRequestSize.
+  @param [out]  SendMessageResponse      Pointer to receive IPMI_SEND_MESSAGE_RESPONSE.
+  @param [in]   SendMessageResponseSize  When in, which is the expected size of
+                                         response. When out, which is the actual
+                                         size returned.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiSendMessage (
+  IN  IPMI_SEND_MESSAGE_REQUEST   *SendMessageRequest,
+  IN  UINT32                      SendMessageRequestSize,
+  OUT IPMI_SEND_MESSAGE_RESPONSE  *SendMessageResponse,
+  IN OUT UINT32                   *SendMessageResponseSize
+  );
+
+/**
+  This function gets the system UUID.
+
+  @param [out]  SystemGuid   The pointer to retrieve system UUID.
+
+  @retval EFI_SUCCESS               UUID is returned.
+  @retval EFI_INVALID_PARAMETER     SystemGuid is a NULL pointer.
+  @retval Others                    See return value of IpmiSubmitCommand () function.
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetSystemUuid (
+  OUT EFI_GUID  *SystemGuid
+  );
+
+/**
+  This function gets the channel information.
+
+  @param [in]   GetChannelInfoRequest       The get channel information request.
+  @param [out]  GetChannelInfoResponse      The get channel information response.
+  @param [out]  GetChannelInfoResponseSize  When input, the expected size of response.
+                                            When output, the exact size of the returned
+                                            response.
+
+  @retval EFI_SUCCESS            Get channel information successfully.
+  @retval EFI_INVALID_PARAMETER  One of the given input parameters is invalid.
+  @retval Others                 See return value of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetChannelInfo (
+  IN  IPMI_GET_CHANNEL_INFO_REQUEST   *GetChannelInfoRequest,
+  OUT IPMI_GET_CHANNEL_INFO_RESPONSE  *GetChannelInfoResponse,
+  OUT UINT32                          *GetChannelInfoResponseSize
+  );
+
+///
+/// Functions for IPMI NetFnTransport commands.
+///
+
+/**
+  This function sends command to BMC to notify a remote application
+  that a SOL payload is activating on another channel.
+
+  @param [in]   SolActivatingRequest  Pointer to IPMI_SOL_ACTIVATING_REQUEST.
+  @param [out]  CompletionCode        IPMI completetion code, refer to Ipmi.h.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiSolActivating (
+  IN  IPMI_SOL_ACTIVATING_REQUEST  *SolActivatingRequest,
+  OUT UINT8                        *CompletionCode
+  );
+
+/**
+  This function is used to set parameters such as the network addressing
+  information required for SOL payload operation.
+
+  @param [in]  SetConfigurationParametersRequest      Pointer to IPMI_SET_SOL_CONFIGURATION_PARAMETERS_REQUEST.
+  @param [in]  SetConfigurationParametersRequestSize  Size of entire SetConfigurationParametersRequestSize.
+  @param [out] CompletionCode                         IPMI completetion code, refer to Ipmi.h.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiSetSolConfigurationParameters (
+  IN  IPMI_SET_SOL_CONFIGURATION_PARAMETERS_REQUEST  *SetConfigurationParametersRequest,
+  IN  UINT32                                         SetConfigurationParametersRequestSize,
+  OUT UINT8                                          *CompletionCode
+  );
+
+/**
+  This function is used to retrieve the configuration parameters from the
+  Set SOL Configuration Parameters.
+
+  @param [in]       GetConfigurationParametersRequest       Pointer to IPMI_SET_SOL_CONFIGURATION_PARAMETERS_REQUEST.
+  @param [out]      GetConfigurationParametersResponse      Pointer to receive IPMI_GET_SOL_CONFIGURATION_PARAMETERS_RESPONSE.
+  @param [in, out]  GetConfigurationParametersResponseSize  When in, which is the expected size of
+                                                            response. When out, which is the actual
+                                                            size returned.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetSolConfigurationParameters (
+  IN  IPMI_GET_SOL_CONFIGURATION_PARAMETERS_REQUEST   *GetConfigurationParametersRequest,
+  OUT IPMI_GET_SOL_CONFIGURATION_PARAMETERS_RESPONSE  *GetConfigurationParametersResponse,
+  IN OUT UINT32                                       *GetConfigurationParametersResponseSize
+  );
+
+/**
+  This function gets the LAN configuration parameter.
+
+  @param[in]      GetLanConfigurationParametersRequest   Request data
+  @param[out]     GetLanConfigurationParametersResponse  Response data
+  @param[in,out]  GetLanConfigurationParametersSize      When input, the expected size of response data.
+                                                         When out, the exact size of response data.
+
+  @retval EFI_SUCCESS            Lan configuration parameter is returned in the response.
+  @retval EFI_INVALID_PARAMETER  One of the given input parameters is invalid.
+  @retval Others                 Other errors.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetLanConfigurationParameters (
+  IN     IPMI_GET_LAN_CONFIGURATION_PARAMETERS_REQUEST   *GetLanConfigurationParametersRequest,
+  OUT    IPMI_GET_LAN_CONFIGURATION_PARAMETERS_RESPONSE  *GetLanConfigurationParametersResponse,
+  IN OUT UINT32                                          *GetLanConfigurationParametersSize
+  );
+
+///
+/// Functions for IPMI NetFnChasis commands
+///
+
+/**
+  This function returns information about which main chassis management functions are
+  present and  what addresses are used to access those functions.
+
+  @param [out]  GetChassisCapabilitiesResponse  Pointer to IPMI_GET_CHASSIS_CAPABILITIES_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetChassisCapabilities (
+  OUT IPMI_GET_CHASSIS_CAPABILITIES_RESPONSE  *GetChassisCapabilitiesResponse
+  );
+
+/**
+  This function gets  information regarding the high-level status of the system
+  chassis and main power subsystem.
+
+  @param [out]  GetChassisStatusResponse  Pointer to IPMI_GET_CHASSIS_STATUS_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetChassisStatus (
+  OUT IPMI_GET_CHASSIS_STATUS_RESPONSE  *GetChassisStatusResponse
+  );
+
+/**
+  This function sends command to control power up, power down, and reset.
+
+  @param [in]   ChassisControlRequest  Pointer to IPMI_CHASSIS_CONTROL_REQUEST.
+  @param [out]  CompletionCode         IPMI completetion code, refer to Ipmi.h.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiChassisControl (
+  IN IPMI_CHASSIS_CONTROL_REQUEST  *ChassisControlRequest,
+  OUT UINT8                        *CompletionCode
+  );
+
+/**
+  This function is used to configure the power restore policy.
+
+  @param [in]   ChassisControlRequest   Pointer to IPMI_SET_POWER_RESTORE_POLICY_REQUEST.
+  @param [out]  ChassisControlResponse  Pointer to IPMI_SET_POWER_RESTORE_POLICY_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiSetPowerRestorePolicy (
+  IN  IPMI_SET_POWER_RESTORE_POLICY_REQUEST   *ChassisControlRequest,
+  OUT IPMI_SET_POWER_RESTORE_POLICY_RESPONSE  *ChassisControlResponse
+  );
+
+/**
+  This function is used to set parameters that direct the system boot
+  following a system power up or reset.
+
+  @param [in]   BootOptionsRequest   Pointer to IPMI_SET_BOOT_OPTIONS_REQUEST.
+  @param [out]  BootOptionsResponse  Pointer to IPMI_SET_BOOT_OPTIONS_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiSetSystemBootOptions (
+  IN  IPMI_SET_BOOT_OPTIONS_REQUEST   *BootOptionsRequest,
+  OUT IPMI_SET_BOOT_OPTIONS_RESPONSE  *BootOptionsResponse
+  );
+
+/**
+  This function is used to retrieve the boot options set by the
+  Set System Boot Options command.
+
+  @param [in]   BootOptionsRequest   Pointer to IPMI_GET_BOOT_OPTIONS_REQUEST.
+  @param [out]  BootOptionsResponse  Pointer to IPMI_GET_BOOT_OPTIONS_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetSystemBootOptions (
+  IN  IPMI_GET_BOOT_OPTIONS_REQUEST   *BootOptionsRequest,
+  OUT IPMI_GET_BOOT_OPTIONS_RESPONSE  *BootOptionsResponse
+  );
+
+///
+/// Functions for IPMI NetFnStorage commands
+///
+
+/**
+  This function is used to retrieve FRU Inventory Area
+
+  @param [in]   GetFruInventoryAreaInfoRequest   Pointer to IPMI_GET_FRU_INVENTORY_AREA_INFO_REQUEST.
+  @param [out]  GetFruInventoryAreaInfoResponse  Pointer to IPMI_GET_FRU_INVENTORY_AREA_INFO_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetFruInventoryAreaInfo (
+  IN  IPMI_GET_FRU_INVENTORY_AREA_INFO_REQUEST   *GetFruInventoryAreaInfoRequest,
+  OUT IPMI_GET_FRU_INVENTORY_AREA_INFO_RESPONSE  *GetFruInventoryAreaInfoResponse
+  );
+
+/**
+  This function returns specified data from the FRU Inventory Info area.
+
+  @param [in]       ReadFruDataRequest       Pointer to IPMI_READ_FRU_DATA_REQUEST.
+  @param [out]      ReadFruDataResponse      Pointer to IPMI_READ_FRU_DATA_RESPONSE.
+  @param [in, out]  ReadFruDataResponseSize  Returns the size of ReadFruDataResponse.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiReadFruData (
+  IN  IPMI_READ_FRU_DATA_REQUEST   *ReadFruDataRequest,
+  OUT IPMI_READ_FRU_DATA_RESPONSE  *ReadFruDataResponse,
+  IN OUT UINT32                    *ReadFruDataResponseSize
+  );
+
+/**
+  This function writes specified data from the FRU Inventory Info area.
+
+  @param [in]   WriteFruDataRequest      Pointer to IPMI_WRITE_FRU_DATA_REQUEST.
+  @param [in]   WriteFruDataRequestSize  Size of WriteFruDataRequest.
+  @param [out]  WriteFruDataResponse     Pointer to receive IPMI_WRITE_FRU_DATA_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiWriteFruData (
+  IN  IPMI_WRITE_FRU_DATA_REQUEST   *WriteFruDataRequest,
+  IN  UINT32                        WriteFruDataRequestSize,
+  OUT IPMI_WRITE_FRU_DATA_RESPONSE  *WriteFruDataResponse
+  );
+
+/**
+  This function returns the number of entries in the SEL
+
+  @param [out] GetSelInfoResponse     Pointer to receive IPMI_GET_SEL_INFO_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetSelInfo (
+  OUT IPMI_GET_SEL_INFO_RESPONSE  *GetSelInfoResponse
+  );
+
+/**
+  This function retrieves entries from the SEL
+
+  @param [in]   GetSelEntryRequest       Pointer to IPMI_GET_SEL_ENTRY_REQUEST.
+  @param [out]  GetSelEntryResponse      Pointer to receive IPMI_GET_SEL_ENTRY_RESPONSE.
+  @param [in]   GetSelEntryResponseSize  Size of entire GetSelEntryResponse.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetSelEntry (
+  IN IPMI_GET_SEL_ENTRY_REQUEST    *GetSelEntryRequest,
+  OUT IPMI_GET_SEL_ENTRY_RESPONSE  *GetSelEntryResponse,
+  IN OUT UINT32                    *GetSelEntryResponseSize
+  );
+
+/**
+  This function adds an entry in the SEL
+
+  @param [in]   AddSelEntryRequest   Pointer to IPMI_ADD_SEL_ENTRY_REQUEST.
+  @param [out]  AddSelEntryResponse  Pointer to receive IPMI_ADD_SEL_ENTRY_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiAddSelEntry (
+  IN IPMI_ADD_SEL_ENTRY_REQUEST    *AddSelEntryRequest,
+  OUT IPMI_ADD_SEL_ENTRY_RESPONSE  *AddSelEntryResponse
+  );
+
+/**
+  This function adds SEL Entry command that allows the record to be incrementally
+  added to the SEL.
+
+  @param [in]  PartialAddSelEntryRequest      Pointer to IPMI_PARTIAL_ADD_SEL_ENTRY_REQUEST.
+  @param [in]  PartialAddSelEntryRequestSize  Size of entire PartialAddSelEntryRequest.
+  @param [out] PartialAddSelEntryResponse     Pointer to receive IPMI_PARTIAL_ADD_SEL_ENTRY_RESPONSE.
+
+  @retval EFI_STASTUS   See return value of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiPartialAddSelEntry (
+  IN IPMI_PARTIAL_ADD_SEL_ENTRY_REQUEST    *PartialAddSelEntryRequest,
+  IN UINT32                                PartialAddSelEntryRequestSize,
+  OUT IPMI_PARTIAL_ADD_SEL_ENTRY_RESPONSE  *PartialAddSelEntryResponse
+  );
+
+/**
+  This function erases all contents of the System Event Log.
+
+  @param [in]   ClearSelRequest   Pointer to IPMI_CLEAR_SEL_REQUEST.
+  @param [out]  ClearSelResponse  Pointer to receive IPMI_CLEAR_SEL_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiClearSel (
+  IN IPMI_CLEAR_SEL_REQUEST    *ClearSelRequest,
+  OUT IPMI_CLEAR_SEL_RESPONSE  *ClearSelResponse
+  );
+
+/**
+  This function returns the time from the SEL Device.
+
+  @param [out]  GetSelTimeResponse  Pointer to IPMI_GET_SEL_TIME_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetSelTime (
+  OUT IPMI_GET_SEL_TIME_RESPONSE  *GetSelTimeResponse
+  );
+
+/**
+  This function set the time in the SEL Device.
+
+  @param [in]   SetSelTimeRequest  Pointer to IPMI_SET_SEL_TIME_REQUEST.
+  @param [out]  CompletionCode     IPMI completetion code, refer to Ipmi.h.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiSetSelTime (
+  IN IPMI_SET_SEL_TIME_REQUEST  *SetSelTimeRequest,
+  OUT UINT8                     *CompletionCode
+  );
+
+/**
+  This function returns the SDR command version for the SDR Repository.
+
+  @param [out]  ClearSelResponse  Pointer to receive IPMI_GET_SDR_REPOSITORY_INFO_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetSdrRepositoryInfo (
+  OUT IPMI_GET_SDR_REPOSITORY_INFO_RESPONSE  *GetSdrRepositoryInfoResp
+  );
+
+/**
+  This function returns the sensor record specified by Record ID.
+
+  @param [in]       GetSdrRequest       Pointer to IPMI_GET_SDR_REQUEST.
+  @param [out]      GetSdrResponse      Pointer to receive IPMI_GET_SDR_RESPONSE.
+  @param [in, out]  GetSdrResponseSize  Size of entire GetSdrResponse.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetSdr (
+  IN  IPMI_GET_SDR_REQUEST   *GetSdrRequest,
+  OUT IPMI_GET_SDR_RESPONSE  *GetSdrResponse,
+  IN OUT UINT32              *GetSdrResponseSize
+  );
+
+#endif // IPMI_COMMAND_LIB_H_
diff --git a/Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLibNetFnApp.c b/Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLibNetFnApp.c
new file mode 100644
index 0000000000..30c412e2f4
--- /dev/null
+++ b/Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLibNetFnApp.c
@@ -0,0 +1,444 @@
+/** @file
+  IPMI Command - NetFnApp.
+
+  Copyright (c) 2018 - 2021, Intel Corporation. All rights reserved.<BR>
+  Copyright (C) 2023 Advanced Micro Devices, Inc. All rights reserved.<BR>
+
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+**/
+
+#include <PiPei.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/DebugLib.h>
+#include <Library/IpmiLib.h>
+
+#include <IndustryStandard/Ipmi.h>
+
+/**
+  This function is used to retrieve device ID.
+
+  @param [out]  DeviceId  The pointer to receive IPMI_GET_DEVICE_ID_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetDeviceId (
+  OUT IPMI_GET_DEVICE_ID_RESPONSE  *DeviceId
+  )
+{
+  EFI_STATUS  Status;
+  UINT32      DataSize;
+
+  DataSize = sizeof (*DeviceId);
+  Status   = IpmiSubmitCommand (
+               IPMI_NETFN_APP,
+               IPMI_APP_GET_DEVICE_ID,
+               NULL,
+               0,
+               (VOID *)DeviceId,
+               &DataSize
+               );
+  return Status;
+}
+
+/**
+  This function returns device self test results
+
+  @param [out]  SelfTestResult  The pointer to receive IPMI_SELF_TEST_RESULT_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetSelfTestResult (
+  OUT IPMI_SELF_TEST_RESULT_RESPONSE  *SelfTestResult
+  )
+{
+  EFI_STATUS  Status;
+  UINT32      DataSize;
+
+  DataSize = sizeof (*SelfTestResult);
+  Status   = IpmiSubmitCommand (
+               IPMI_NETFN_APP,
+               IPMI_APP_GET_SELFTEST_RESULTS,
+               NULL,
+               0,
+               (VOID *)SelfTestResult,
+               &DataSize
+               );
+  return Status;
+}
+
+/**
+  This function is used for starting and restarting the Watchdog
+  Timer from the initial countdown value that was specified in
+  the Set Watchdog Timer command the watchdog timer
+
+  @param [out]  CompletionCode  IPMI completetion code, refer to Ipmi.h.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiResetWatchdogTimer (
+  OUT UINT8  *CompletionCode
+  )
+{
+  EFI_STATUS  Status;
+  UINT32      DataSize;
+
+  DataSize = sizeof (*CompletionCode);
+  Status   = IpmiSubmitCommand (
+               IPMI_NETFN_APP,
+               IPMI_APP_RESET_WATCHDOG_TIMER,
+               NULL,
+               0,
+               (VOID *)CompletionCode,
+               &DataSize
+               );
+  return Status;
+}
+
+/**
+  This function  is used for initializing and configuring
+  the watchdog timer.
+
+  @param [in]   SetWatchdogTimer  Pointer to receive IPMI_SET_WATCHDOG_TIMER_REQUEST.
+  @param [out]  CompletionCode    IPMI completetion code, refer to Ipmi.h.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiSetWatchdogTimer (
+  IN  IPMI_SET_WATCHDOG_TIMER_REQUEST  *SetWatchdogTimer,
+  OUT UINT8                            *CompletionCode
+  )
+{
+  EFI_STATUS  Status;
+  UINT32      DataSize;
+
+  DataSize = sizeof (*CompletionCode);
+  Status   = IpmiSubmitCommand (
+               IPMI_NETFN_APP,
+               IPMI_APP_SET_WATCHDOG_TIMER,
+               (VOID *)SetWatchdogTimer,
+               sizeof (*SetWatchdogTimer),
+               (VOID *)CompletionCode,
+               &DataSize
+               );
+  return Status;
+}
+
+/**
+  This function retrieves the current settings and present
+  countdown of the watchdog timer.
+
+  @param [out]  GetWatchdogTimer  Pointer to receive IPMI_GET_WATCHDOG_TIMER_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetWatchdogTimer (
+  OUT IPMI_GET_WATCHDOG_TIMER_RESPONSE  *GetWatchdogTimer
+  )
+{
+  EFI_STATUS  Status;
+  UINT32      DataSize;
+
+  DataSize = sizeof (*GetWatchdogTimer);
+  Status   = IpmiSubmitCommand (
+               IPMI_NETFN_APP,
+               IPMI_APP_GET_WATCHDOG_TIMER,
+               NULL,
+               0,
+               (VOID *)GetWatchdogTimer,
+               &DataSize
+               );
+  return Status;
+}
+
+/**
+  This function enables message reception into Message Buffers,
+  and any interrupt associated with that buffer getting full.
+
+  @param [in]   SetBmcGlobalEnables  Pointer receive to IPMI_SET_BMC_GLOBAL_ENABLES_REQUEST.
+  @param [out]  CompletionCode      IPMI completetion code refer to Ipmi.h.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiSetBmcGlobalEnables (
+  IN  IPMI_SET_BMC_GLOBAL_ENABLES_REQUEST  *SetBmcGlobalEnables,
+  OUT UINT8                                *CompletionCode
+  )
+{
+  EFI_STATUS  Status;
+  UINT32      DataSize;
+
+  DataSize = sizeof (*CompletionCode);
+  Status   = IpmiSubmitCommand (
+               IPMI_NETFN_APP,
+               IPMI_APP_SET_BMC_GLOBAL_ENABLES,
+               (VOID *)SetBmcGlobalEnables,
+               sizeof (*SetBmcGlobalEnables),
+               (VOID *)CompletionCode,
+               &DataSize
+               );
+  return Status;
+}
+
+/**
+  This function retrieves the present setting of the Global Enables
+
+  @param [out]  GetBmcGlobalEnables  Pointer to receive IPMI_GET_BMC_GLOBAL_ENABLES_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetBmcGlobalEnables (
+  OUT IPMI_GET_BMC_GLOBAL_ENABLES_RESPONSE  *GetBmcGlobalEnables
+  )
+{
+  EFI_STATUS  Status;
+  UINT32      DataSize;
+
+  DataSize = sizeof (*GetBmcGlobalEnables);
+  Status   = IpmiSubmitCommand (
+               IPMI_NETFN_APP,
+               IPMI_APP_GET_BMC_GLOBAL_ENABLES,
+               NULL,
+               0,
+               (VOID *)GetBmcGlobalEnables,
+               &DataSize
+               );
+  return Status;
+}
+
+/**
+  This function is used to flush unread data from the Receive
+  Message Queue or Event Message Buffer
+
+  @param [in]   ClearMessageFlagsRequest IPMI_CLEAR_MESSAGE_FLAGS_REQUEST
+  @param [out]  CompletionCode           IPMI completetion code, refer to Ipmi.h.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiClearMessageFlags (
+  IN  IPMI_CLEAR_MESSAGE_FLAGS_REQUEST  *ClearMessageFlagsRequest,
+  OUT UINT8                             *CompletionCode
+  )
+{
+  EFI_STATUS  Status;
+  UINT32      DataSize;
+
+  DataSize = sizeof (*CompletionCode);
+  Status   = IpmiSubmitCommand (
+               IPMI_NETFN_APP,
+               IPMI_APP_CLEAR_MESSAGE_FLAGS,
+               (VOID *)ClearMessageFlagsRequest,
+               sizeof (*ClearMessageFlagsRequest),
+               (VOID *)CompletionCode,
+               &DataSize
+               );
+  return Status;
+}
+
+/**
+  This function is used to retrieve the present message available states.
+
+  @param  [out]  GetMessageFlagsResponse  Pointer to receive IPMI_GET_MESSAGE_FLAGS_RESPONSE
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetMessageFlags (
+  OUT IPMI_GET_MESSAGE_FLAGS_RESPONSE  *GetMessageFlagsResponse
+  )
+{
+  EFI_STATUS  Status;
+  UINT32      DataSize;
+
+  DataSize = sizeof (*GetMessageFlagsResponse);
+  Status   = IpmiSubmitCommand (
+               IPMI_NETFN_APP,
+               IPMI_APP_GET_MESSAGE_FLAGS,
+               NULL,
+               0,
+               (VOID *)GetMessageFlagsResponse,
+               &DataSize
+               );
+  return Status;
+}
+
+/**
+  This function is used to get data from the Receive Message Queue.
+
+  @param [out]      GetMessageResponse      Pointer to receive IPMI_GET_MESSAGE_RESPONSE.
+  @param [in, out]  GetMessageResponseSize  When in, which is the expected size of
+                                            response. When out, which is the actual
+                                            size returned.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetMessage (
+  OUT IPMI_GET_MESSAGE_RESPONSE  *GetMessageResponse,
+  IN OUT UINT32                  *GetMessageResponseSize
+  )
+{
+  EFI_STATUS  Status;
+
+  Status = IpmiSubmitCommand (
+             IPMI_NETFN_APP,
+             IPMI_APP_GET_MESSAGE,
+             NULL,
+             0,
+             (VOID *)GetMessageResponse,
+             GetMessageResponseSize
+             );
+  return Status;
+}
+
+/**
+  This function is used for bridging IPMI messages between channels,
+  and between the system management software (SMS) and a given channel
+
+  @param [in]   SendMessageRequest       Pointer to IPMI_SEND_MESSAGE_REQUEST.
+  @param [in]   SendMessageRequestSize   Size of entire SendMessageRequestSize.
+  @param [out]  SendMessageResponse      Pointer to receive IPMI_SEND_MESSAGE_RESPONSE.
+  @param [in]   SendMessageResponseSize  When in, which is the expected size of
+                                         response. When out, which is the actual
+                                         size returned.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiSendMessage (
+  IN  IPMI_SEND_MESSAGE_REQUEST   *SendMessageRequest,
+  IN  UINT32                      SendMessageRequestSize,
+  OUT IPMI_SEND_MESSAGE_RESPONSE  *SendMessageResponse,
+  IN OUT UINT32                   *SendMessageResponseSize
+  )
+{
+  EFI_STATUS  Status;
+
+  Status = IpmiSubmitCommand (
+             IPMI_NETFN_APP,
+             IPMI_APP_SEND_MESSAGE,
+             (VOID *)SendMessageRequest,
+             SendMessageRequestSize,
+             (VOID *)SendMessageResponse,
+             SendMessageResponseSize
+             );
+  return Status;
+}
+
+/**
+  This function gets the system UUID.
+
+  @param[out] SystemGuid   The pointer to retrieve system UUID.
+
+  @retval EFI_SUCCESS               UUID is returned.
+  @retval EFI_INVALID_PARAMETER     SystemGuid is a NULL pointer.
+  @retval Others                    See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetSystemUuid (
+  OUT EFI_GUID  *SystemGuid
+  )
+{
+  EFI_STATUS                     Status;
+  UINT32                         RequestSize;
+  UINT32                         ResponseSize;
+  IPMI_GET_SYSTEM_UUID_RESPONSE  GetSystemUuidResponse;
+
+  if (SystemGuid == NULL) {
+    return EFI_INVALID_PARAMETER;
+  }
+
+  RequestSize  = 0;
+  ResponseSize = sizeof (IPMI_GET_SYSTEM_UUID_RESPONSE);
+  Status       = IpmiSubmitCommand (
+                   IPMI_NETFN_APP,
+                   IPMI_APP_GET_SYSTEM_GUID,
+                   (VOID *)NULL,
+                   RequestSize,
+                   (VOID *)&GetSystemUuidResponse,
+                   &ResponseSize
+                   );
+  if (!EFI_ERROR (Status) && (GetSystemUuidResponse.CompletionCode == IPMI_COMP_CODE_NORMAL)) {
+    CopyMem (
+      (VOID *)SystemGuid,
+      (VOID *)&GetSystemUuidResponse.SystemUuid,
+      sizeof (EFI_GUID)
+      );
+  }
+
+  return Status;
+}
+
+/**
+  This function gets the channel information.
+
+  @param[in]   GetChannelInfoRequest          The get channel information request.
+  @param[out]  GetChannelInfoResponse         The get channel information response.
+  @param[out]  GetChannelInfoResponseSize     When input, the expected size of response.
+                                              When output, the exact size of the returned
+                                              response.
+
+  @retval EFI_SUCCESS            Get channel information successfully.
+  @retval EFI_INVALID_PARAMETER  One of the given input parameters is invalid.
+  @retval Others                 See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetChannelInfo (
+  IN  IPMI_GET_CHANNEL_INFO_REQUEST   *GetChannelInfoRequest,
+  OUT IPMI_GET_CHANNEL_INFO_RESPONSE  *GetChannelInfoResponse,
+  OUT UINT32                          *GetChannelInfoResponseSize
+  )
+{
+  EFI_STATUS  Status;
+
+  if ((GetChannelInfoRequest == NULL) ||
+      (GetChannelInfoResponse == NULL) ||
+      (GetChannelInfoResponseSize == NULL))
+  {
+    return EFI_INVALID_PARAMETER;
+  }
+
+  *GetChannelInfoResponseSize = sizeof (IPMI_GET_CHANNEL_INFO_RESPONSE);
+  Status                      = IpmiSubmitCommand (
+                                  IPMI_NETFN_APP,
+                                  IPMI_APP_GET_CHANNEL_INFO,
+                                  (UINT8 *)GetChannelInfoRequest,
+                                  sizeof (IPMI_GET_CHANNEL_INFO_REQUEST),
+                                  (UINT8 *)GetChannelInfoResponse,
+                                  GetChannelInfoResponseSize
+                                  );
+  return Status;
+}
diff --git a/Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLibNetFnChassis.c b/Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLibNetFnChassis.c
new file mode 100644
index 0000000000..12fd997b11
--- /dev/null
+++ b/Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLibNetFnChassis.c
@@ -0,0 +1,199 @@
+/** @file
+  IPMI Command - NetFnChassis.
+
+  Copyright (c) 2018 - 2021, Intel Corporation. All rights reserved.<BR>
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+**/
+
+#include <PiPei.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/DebugLib.h>
+#include <Library/IpmiLib.h>
+
+#include <IndustryStandard/Ipmi.h>
+
+/**
+  This function returns information about which main chassis management functions are
+  present and  what addresses are used to access those functions.
+
+  @param [out]  GetChassisCapabilitiesResponse  Pointer to IPMI_GET_CHASSIS_CAPABILITIES_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetChassisCapabilities (
+  OUT IPMI_GET_CHASSIS_CAPABILITIES_RESPONSE  *GetChassisCapabilitiesResponse
+  )
+{
+  EFI_STATUS  Status;
+  UINT32      DataSize;
+
+  DataSize = sizeof (*GetChassisCapabilitiesResponse);
+  Status   = IpmiSubmitCommand (
+               IPMI_NETFN_CHASSIS,
+               IPMI_CHASSIS_GET_CAPABILITIES,
+               NULL,
+               0,
+               (VOID *)GetChassisCapabilitiesResponse,
+               &DataSize
+               );
+  return Status;
+}
+
+/**
+  This function gets  information regarding the high-level status of the system
+  chassis and main power subsystem.
+
+  @param [out]  GetChassisStatusResponse  Pointer to IPMI_GET_CHASSIS_STATUS_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetChassisStatus (
+  OUT IPMI_GET_CHASSIS_STATUS_RESPONSE  *GetChassisStatusResponse
+  )
+{
+  EFI_STATUS  Status;
+  UINT32      DataSize;
+
+  DataSize = sizeof (*GetChassisStatusResponse);
+  Status   = IpmiSubmitCommand (
+               IPMI_NETFN_CHASSIS,
+               IPMI_CHASSIS_GET_STATUS,
+               NULL,
+               0,
+               (VOID *)GetChassisStatusResponse,
+               &DataSize
+               );
+  return Status;
+}
+
+/**
+  This function sends command to control power up, power down, and reset.
+
+  @param [in]   ChassisControlRequest  Pointer to IPMI_CHASSIS_CONTROL_REQUEST.
+  @param [out]  CompletionCode         IPMI completetion code, refer to Ipmi.h.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiChassisControl (
+  IN IPMI_CHASSIS_CONTROL_REQUEST  *ChassisControlRequest,
+  OUT UINT8                        *CompletionCode
+  )
+{
+  EFI_STATUS  Status;
+  UINT32      DataSize;
+
+  DataSize = sizeof (*CompletionCode);
+  Status   = IpmiSubmitCommand (
+               IPMI_NETFN_CHASSIS,
+               IPMI_CHASSIS_CONTROL,
+               (VOID *)ChassisControlRequest,
+               sizeof (*ChassisControlRequest),
+               (VOID *)CompletionCode,
+               &DataSize
+               );
+  return Status;
+}
+
+/**
+  This function is used to configure the power restore policy.
+
+  @param [in]   ChassisControlRequest   Pointer to IPMI_SET_POWER_RESTORE_POLICY_REQUEST.
+  @param [out]  ChassisControlResponse  Pointer to IPMI_SET_POWER_RESTORE_POLICY_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiSetPowerRestorePolicy (
+  IN  IPMI_SET_POWER_RESTORE_POLICY_REQUEST   *ChassisControlRequest,
+  OUT IPMI_SET_POWER_RESTORE_POLICY_RESPONSE  *ChassisControlResponse
+  )
+{
+  EFI_STATUS  Status;
+  UINT32      DataSize;
+
+  DataSize = sizeof (*ChassisControlResponse);
+  Status   = IpmiSubmitCommand (
+               IPMI_NETFN_CHASSIS,
+               IPMI_CHASSIS_SET_POWER_RESTORE_POLICY,
+               (VOID *)ChassisControlRequest,
+               sizeof (*ChassisControlRequest),
+               (VOID *)ChassisControlResponse,
+               &DataSize
+               );
+  return Status;
+}
+
+/**
+  This function is used to set parameters that direct the system boot
+  following a system power up or reset.
+
+  @param [in]   BootOptionsRequest   Pointer to IPMI_SET_BOOT_OPTIONS_REQUEST.
+  @param [out]  BootOptionsResponse  Pointer to IPMI_SET_BOOT_OPTIONS_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiSetSystemBootOptions (
+  IN  IPMI_SET_BOOT_OPTIONS_REQUEST   *BootOptionsRequest,
+  OUT IPMI_SET_BOOT_OPTIONS_RESPONSE  *BootOptionsResponse
+  )
+{
+  EFI_STATUS  Status;
+  UINT32      DataSize;
+
+  DataSize = sizeof (*BootOptionsResponse);
+  Status   = IpmiSubmitCommand (
+               IPMI_NETFN_CHASSIS,
+               IPMI_CHASSIS_SET_SYSTEM_BOOT_OPTIONS,
+               (VOID *)BootOptionsRequest,
+               sizeof (*BootOptionsRequest),
+               (VOID *)BootOptionsResponse,
+               &DataSize
+               );
+  return Status;
+}
+
+/**
+  This function is used to retrieve the boot options set by the
+  Set System Boot Options command.
+
+  @param [in]   BootOptionsRequest   Pointer to IPMI_GET_BOOT_OPTIONS_REQUEST.
+  @param [out]  BootOptionsResponse  Pointer to IPMI_GET_BOOT_OPTIONS_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetSystemBootOptions (
+  IN  IPMI_GET_BOOT_OPTIONS_REQUEST   *BootOptionsRequest,
+  OUT IPMI_GET_BOOT_OPTIONS_RESPONSE  *BootOptionsResponse
+  )
+{
+  EFI_STATUS  Status;
+  UINT32      DataSize;
+
+  DataSize = sizeof (*BootOptionsResponse);
+  Status   = IpmiSubmitCommand (
+               IPMI_NETFN_CHASSIS,
+               IPMI_CHASSIS_GET_SYSTEM_BOOT_OPTIONS,
+               (VOID *)BootOptionsRequest,
+               sizeof (*BootOptionsRequest),
+               (VOID *)BootOptionsResponse,
+               &DataSize
+               );
+  return Status;
+}
diff --git a/Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLibNetFnStorage.c b/Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLibNetFnStorage.c
new file mode 100644
index 0000000000..2dbb7ac9ff
--- /dev/null
+++ b/Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLibNetFnStorage.c
@@ -0,0 +1,384 @@
+/** @file
+  IPMI Command - NetFnStorage.
+
+  Copyright (c) 2018 - 2021, Intel Corporation. All rights reserved.<BR>
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+**/
+
+#include <PiPei.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/DebugLib.h>
+#include <Library/IpmiLib.h>
+
+#include <IndustryStandard/Ipmi.h>
+
+/**
+  This function is used to retrieve FRU Inventory Area
+
+  @param [in]  GetFruInventoryAreaInfoRequest   Pointer to IPMI_GET_FRU_INVENTORY_AREA_INFO_REQUEST.
+  @param [out] GetFruInventoryAreaInfoResponse  Pointer to IPMI_GET_FRU_INVENTORY_AREA_INFO_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetFruInventoryAreaInfo (
+  IN  IPMI_GET_FRU_INVENTORY_AREA_INFO_REQUEST   *GetFruInventoryAreaInfoRequest,
+  OUT IPMI_GET_FRU_INVENTORY_AREA_INFO_RESPONSE  *GetFruInventoryAreaInfoResponse
+  )
+{
+  EFI_STATUS  Status;
+  UINT32      DataSize;
+
+  DataSize = sizeof (*GetFruInventoryAreaInfoResponse);
+  Status   = IpmiSubmitCommand (
+               IPMI_NETFN_STORAGE,
+               IPMI_STORAGE_GET_FRU_INVENTORY_AREAINFO,
+               (VOID *)GetFruInventoryAreaInfoRequest,
+               sizeof (*GetFruInventoryAreaInfoRequest),
+               (VOID *)GetFruInventoryAreaInfoResponse,
+               &DataSize
+               );
+  return Status;
+}
+
+/**
+  This function returns specified data from the FRU Inventory Info area.
+
+  @param [in]  ReadFruDataRequest       Pointer to IPMI_READ_FRU_DATA_REQUEST.
+  @param [in]  ReadFruDataResponse      Pointer to IPMI_READ_FRU_DATA_RESPONSE.
+  @param [in, out] ReadFruDataResponseSize  Returns the size of ReadFruDataResponse.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiReadFruData (
+  IN  IPMI_READ_FRU_DATA_REQUEST   *ReadFruDataRequest,
+  OUT IPMI_READ_FRU_DATA_RESPONSE  *ReadFruDataResponse,
+  IN OUT UINT32                    *ReadFruDataResponseSize
+  )
+{
+  EFI_STATUS  Status;
+
+  Status = IpmiSubmitCommand (
+             IPMI_NETFN_STORAGE,
+             IPMI_STORAGE_READ_FRU_DATA,
+             (VOID *)ReadFruDataRequest,
+             sizeof (*ReadFruDataRequest),
+             (VOID *)ReadFruDataResponse,
+             ReadFruDataResponseSize
+             );
+  return Status;
+}
+
+/**
+  This function writes specified data from the FRU Inventory Info area.
+
+  @param [in]  WriteFruDataRequest      Pointer to IPMI_WRITE_FRU_DATA_REQUEST.
+  @param [in]  WriteFruDataRequestSize  Size of WriteFruDataRequest.
+  @param [out] WriteFruDataResponse     Pointer to receive IPMI_WRITE_FRU_DATA_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiWriteFruData (
+  IN  IPMI_WRITE_FRU_DATA_REQUEST   *WriteFruDataRequest,
+  IN  UINT32                        WriteFruDataRequestSize,
+  OUT IPMI_WRITE_FRU_DATA_RESPONSE  *WriteFruDataResponse
+  )
+{
+  EFI_STATUS  Status;
+  UINT32      DataSize;
+
+  DataSize = sizeof (*WriteFruDataResponse);
+  Status   = IpmiSubmitCommand (
+               IPMI_NETFN_STORAGE,
+               IPMI_STORAGE_WRITE_FRU_DATA,
+               (VOID *)WriteFruDataRequest,
+               WriteFruDataRequestSize,
+               (VOID *)WriteFruDataResponse,
+               &DataSize
+               );
+  return Status;
+}
+
+/**
+  This function returns the number of entries in the SEL
+
+  @param [out] GetSelInfoResponse     Pointer to receive IPMI_GET_SEL_INFO_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetSelInfo (
+  OUT IPMI_GET_SEL_INFO_RESPONSE  *GetSelInfoResponse
+  )
+{
+  EFI_STATUS  Status;
+  UINT32      DataSize;
+
+  DataSize = sizeof (*GetSelInfoResponse);
+  Status   = IpmiSubmitCommand (
+               IPMI_NETFN_STORAGE,
+               IPMI_STORAGE_GET_SEL_INFO,
+               NULL,
+               0,
+               (VOID *)GetSelInfoResponse,
+               &DataSize
+               );
+  return Status;
+}
+
+/**
+  This function retrieves entries from the SEL
+
+  @param [in]  GetSelEntryRequest       Pointer to IPMI_GET_SEL_ENTRY_REQUEST.
+  @param [out] GetSelEntryResponse      Pointer to receive IPMI_GET_SEL_ENTRY_RESPONSE.
+  @param [in, out]  GetSelEntryResponseSize  Size of entire GetSelEntryResponse.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetSelEntry (
+  IN IPMI_GET_SEL_ENTRY_REQUEST    *GetSelEntryRequest,
+  OUT IPMI_GET_SEL_ENTRY_RESPONSE  *GetSelEntryResponse,
+  IN OUT UINT32                    *GetSelEntryResponseSize
+  )
+{
+  EFI_STATUS  Status;
+
+  Status = IpmiSubmitCommand (
+             IPMI_NETFN_STORAGE,
+             IPMI_STORAGE_GET_SEL_ENTRY,
+             (VOID *)GetSelEntryRequest,
+             sizeof (*GetSelEntryRequest),
+             (VOID *)GetSelEntryResponse,
+             GetSelEntryResponseSize
+             );
+  return Status;
+}
+
+/**
+  This function adds an entry in the SEL
+
+  @param [in]  AddSelEntryRequest       Pointer to IPMI_ADD_SEL_ENTRY_REQUEST.
+  @param [out] AddSelEntryResponse      Pointer to receive IPMI_ADD_SEL_ENTRY_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiAddSelEntry (
+  IN IPMI_ADD_SEL_ENTRY_REQUEST    *AddSelEntryRequest,
+  OUT IPMI_ADD_SEL_ENTRY_RESPONSE  *AddSelEntryResponse
+  )
+{
+  EFI_STATUS  Status;
+  UINT32      DataSize;
+
+  DataSize = sizeof (*AddSelEntryResponse);
+  Status   = IpmiSubmitCommand (
+               IPMI_NETFN_STORAGE,
+               IPMI_STORAGE_ADD_SEL_ENTRY,
+               (VOID *)AddSelEntryRequest,
+               sizeof (*AddSelEntryRequest),
+               (VOID *)AddSelEntryResponse,
+               &DataSize
+               );
+  return Status;
+}
+
+/**
+  This function adds SEL Entry command that allows the record to be incrementally
+  added to the SEL.
+
+  @param [in]  PartialAddSelEntryRequest       Pointer to IPMI_PARTIAL_ADD_SEL_ENTRY_REQUEST.
+  @param [in]  PartialAddSelEntryRequestSize   Size of entire PartialAddSelEntryRequest.
+  @param [out] PartialAddSelEntryResponse      Pointer to receive IPMI_PARTIAL_ADD_SEL_ENTRY_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiPartialAddSelEntry (
+  IN IPMI_PARTIAL_ADD_SEL_ENTRY_REQUEST    *PartialAddSelEntryRequest,
+  IN UINT32                                PartialAddSelEntryRequestSize,
+  OUT IPMI_PARTIAL_ADD_SEL_ENTRY_RESPONSE  *PartialAddSelEntryResponse
+  )
+{
+  EFI_STATUS  Status;
+  UINT32      DataSize;
+
+  DataSize = sizeof (*PartialAddSelEntryResponse);
+  Status   = IpmiSubmitCommand (
+               IPMI_NETFN_STORAGE,
+               IPMI_STORAGE_PARTIAL_ADD_SEL_ENTRY,
+               (VOID *)PartialAddSelEntryRequest,
+               PartialAddSelEntryRequestSize,
+               (VOID *)PartialAddSelEntryResponse,
+               &DataSize
+               );
+  return Status;
+}
+
+/**
+  This function erases all contents of the System Event Log.
+
+  @param [in]  ClearSelRequest       Pointer to IPMI_CLEAR_SEL_REQUEST.
+  @param [out] ClearSelResponse      Pointer to receive IPMI_CLEAR_SEL_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiClearSel (
+  IN IPMI_CLEAR_SEL_REQUEST    *ClearSelRequest,
+  OUT IPMI_CLEAR_SEL_RESPONSE  *ClearSelResponse
+  )
+{
+  EFI_STATUS  Status;
+  UINT32      DataSize;
+
+  DataSize = sizeof (*ClearSelResponse);
+  Status   = IpmiSubmitCommand (
+               IPMI_NETFN_STORAGE,
+               IPMI_STORAGE_CLEAR_SEL,
+               (VOID *)ClearSelRequest,
+               sizeof (*ClearSelRequest),
+               (VOID *)ClearSelResponse,
+               &DataSize
+               );
+  return Status;
+}
+
+/**
+  This function returns the time from the SEL Device.
+
+  @param [out]  GetSelTimeResponse       Pointer to IPMI_GET_SEL_TIME_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetSelTime (
+  OUT IPMI_GET_SEL_TIME_RESPONSE  *GetSelTimeResponse
+  )
+{
+  EFI_STATUS  Status;
+  UINT32      DataSize;
+
+  DataSize = sizeof (*GetSelTimeResponse);
+  Status   = IpmiSubmitCommand (
+               IPMI_NETFN_STORAGE,
+               IPMI_STORAGE_GET_SEL_TIME,
+               NULL,
+               0,
+               (VOID *)GetSelTimeResponse,
+               &DataSize
+               );
+  return Status;
+}
+
+/**
+  This function set the time in the SEL Device.
+
+  @param [in]  SetSelTimeRequest       Pointer to IPMI_SET_SEL_TIME_REQUEST.
+  @param [out] CompletionCode         IPMI completetion code, refer to Ipmi.h.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiSetSelTime (
+  IN IPMI_SET_SEL_TIME_REQUEST  *SetSelTimeRequest,
+  OUT UINT8                     *CompletionCode
+  )
+{
+  EFI_STATUS  Status;
+  UINT32      DataSize;
+
+  DataSize = sizeof (*CompletionCode);
+  Status   = IpmiSubmitCommand (
+               IPMI_NETFN_STORAGE,
+               IPMI_STORAGE_SET_SEL_TIME,
+               (VOID *)SetSelTimeRequest,
+               sizeof (*SetSelTimeRequest),
+               (VOID *)CompletionCode,
+               &DataSize
+               );
+  return Status;
+}
+
+/**
+  This function returns the SDR command version for the SDR Repository
+
+  @param [out] ClearSelResponse      Pointer to receive IPMI_GET_SDR_REPOSITORY_INFO_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetSdrRepositoryInfo (
+  OUT IPMI_GET_SDR_REPOSITORY_INFO_RESPONSE  *GetSdrRepositoryInfoResp
+  )
+{
+  EFI_STATUS  Status;
+  UINT32      DataSize;
+
+  DataSize = sizeof (*GetSdrRepositoryInfoResp);
+  Status   = IpmiSubmitCommand (
+               IPMI_NETFN_STORAGE,
+               IPMI_STORAGE_GET_SDR_REPOSITORY_INFO,
+               NULL,
+               0,
+               (VOID *)GetSdrRepositoryInfoResp,
+               &DataSize
+               );
+  return Status;
+}
+
+/**
+  This function returns the sensor record specified by Record ID.
+
+  @param [in]  GetSdrRequest       Pointer to IPMI_GET_SDR_REQUEST.
+  @param [out] GetSdrResponse      Pointer to receive IPMI_GET_SDR_RESPONSE.
+  @param [in, out]  GetSdrResponseSize  Size of entire GetSdrResponse.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetSdr (
+  IN  IPMI_GET_SDR_REQUEST   *GetSdrRequest,
+  OUT IPMI_GET_SDR_RESPONSE  *GetSdrResponse,
+  IN OUT UINT32              *GetSdrResponseSize
+  )
+{
+  EFI_STATUS  Status;
+
+  Status = IpmiSubmitCommand (
+             IPMI_NETFN_STORAGE,
+             IPMI_STORAGE_GET_SDR,
+             (VOID *)GetSdrRequest,
+             sizeof (*GetSdrRequest),
+             (VOID *)GetSdrResponse,
+             GetSdrResponseSize
+             );
+  return Status;
+}
diff --git a/Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLibNetFnTransport.c b/Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLibNetFnTransport.c
new file mode 100644
index 0000000000..a93f7406f1
--- /dev/null
+++ b/Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLibNetFnTransport.c
@@ -0,0 +1,156 @@
+/** @file
+  IPMI Command - NetFnTransport.
+
+  Copyright (c) 2018 - 2021, Intel Corporation. All rights reserved.<BR>
+  Copyright (C) 2023 Advanced Micro Devices, Inc. All rights reserved.<BR>
+
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+**/
+
+#include <PiPei.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/DebugLib.h>
+#include <Library/IpmiLib.h>
+
+#include <IndustryStandard/Ipmi.h>
+
+/**
+  This function sends command to BMC to notify a remote application
+  that a SOL payload is activating on another channel.
+
+  @param [in]   SolActivatingRequest  The get channel information request.
+  @param [out]  CompletionCode        IPMI completetion code, refer to Ipmi.h.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiSolActivating (
+  IN  IPMI_SOL_ACTIVATING_REQUEST  *SolActivatingRequest,
+  OUT UINT8                        *CompletionCode
+  )
+{
+  EFI_STATUS  Status;
+  UINT32      DataSize;
+
+  DataSize = sizeof (*CompletionCode);
+  Status   = IpmiSubmitCommand (
+               IPMI_NETFN_TRANSPORT,
+               IPMI_TRANSPORT_SOL_ACTIVATING,
+               (VOID *)SolActivatingRequest,
+               sizeof (*SolActivatingRequest),
+               (VOID *)CompletionCode,
+               &DataSize
+               );
+  return Status;
+}
+
+/**
+  This function is used to set parameters such as the network addressing
+  information required for SOL payload operation.
+
+  @param [in]   SetConfigurationParametersRequest      Pointer to IPMI_SET_SOL_CONFIGURATION_PARAMETERS_REQUEST.
+  @param [in]   SetConfigurationParametersRequestSize  Size of entire SetConfigurationParametersRequestSize.
+  @param [out]  CompletionCode                         IPMI completetion code, refer to Ipmi.h.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiSetSolConfigurationParameters (
+  IN  IPMI_SET_SOL_CONFIGURATION_PARAMETERS_REQUEST  *SetConfigurationParametersRequest,
+  IN  UINT32                                         SetConfigurationParametersRequestSize,
+  OUT UINT8                                          *CompletionCode
+  )
+{
+  EFI_STATUS  Status;
+  UINT32      DataSize;
+
+  DataSize = sizeof (*CompletionCode);
+  Status   = IpmiSubmitCommand (
+               IPMI_NETFN_TRANSPORT,
+               IPMI_TRANSPORT_SET_SOL_CONFIG_PARAM,
+               (VOID *)SetConfigurationParametersRequest,
+               SetConfigurationParametersRequestSize,
+               (VOID *)CompletionCode,
+               &DataSize
+               );
+  return Status;
+}
+
+/**
+  This function is used to retrieve the configuration parameters from the
+  Set SOL Configuration Parameters.
+
+  @param [in]       GetConfigurationParametersRequest       Pointer to IPMI_SET_SOL_CONFIGURATION_PARAMETERS_REQUEST.
+  @param [out]      GetConfigurationParametersResponse      Pointer to receive IPMI_GET_SOL_CONFIGURATION_PARAMETERS_RESPONSE
+  @param [in, out]  GetConfigurationParametersResponseSize  When in, which is the expected size of
+                                                            response. When out, which is the actual
+                                                            size returned.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetSolConfigurationParameters (
+  IN  IPMI_GET_SOL_CONFIGURATION_PARAMETERS_REQUEST   *GetConfigurationParametersRequest,
+  OUT IPMI_GET_SOL_CONFIGURATION_PARAMETERS_RESPONSE  *GetConfigurationParametersResponse,
+  IN OUT UINT32                                       *GetConfigurationParametersResponseSize
+  )
+{
+  EFI_STATUS  Status;
+
+  Status = IpmiSubmitCommand (
+             IPMI_NETFN_TRANSPORT,
+             IPMI_TRANSPORT_GET_SOL_CONFIG_PARAM,
+             (VOID *)GetConfigurationParametersRequest,
+             sizeof (*GetConfigurationParametersRequest),
+             (VOID *)GetConfigurationParametersResponse,
+             GetConfigurationParametersResponseSize
+             );
+  return Status;
+}
+
+/**
+  This function gets the LAN configuration parameter.
+
+  @param[in]      GetLanConfigurationParametersRequest   Request data
+  @param[out]     GetLanConfigurationParametersResponse  Response data
+  @param[in,out]  GetLanConfigurationParametersSize      When input, the expected size of response data.
+                                                         When out, the exact  size of response data.
+
+  @retval EFI_SUCCESS            Lan configuration parameter is returned in the response.
+  @retval EFI_INVALID_PARAMETER  One of the given input parameters is invalid.
+  @retval Others                 Other errors.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetLanConfigurationParameters (
+  IN     IPMI_GET_LAN_CONFIGURATION_PARAMETERS_REQUEST   *GetLanConfigurationParametersRequest,
+  OUT    IPMI_GET_LAN_CONFIGURATION_PARAMETERS_RESPONSE  *GetLanConfigurationParametersResponse,
+  IN OUT UINT32                                          *GetLanConfigurationParametersSize
+  )
+{
+  EFI_STATUS  Status;
+
+  if ((GetLanConfigurationParametersRequest == NULL) ||
+      (GetLanConfigurationParametersResponse == NULL) ||
+      (GetLanConfigurationParametersSize == NULL))
+  {
+    return EFI_INVALID_PARAMETER;
+  }
+
+  Status = IpmiSubmitCommand (
+             IPMI_NETFN_TRANSPORT,
+             IPMI_TRANSPORT_GET_LAN_CONFIG_PARAMETERS,
+             (UINT8 *)GetLanConfigurationParametersRequest,
+             sizeof (*GetLanConfigurationParametersRequest),
+             (UINT8 *)GetLanConfigurationParametersResponse,
+             GetLanConfigurationParametersSize
+             );
+  return Status;
+}
-- 
2.37.1.windows.1


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [edk2-platforms][PATCH] ManageabilityPkg/IpmiCommandLib: Add IpmiCommandLib to package
  2023-05-05  5:24 [edk2-platforms][PATCH] ManageabilityPkg/IpmiCommandLib:IPMI Command Library Chang, Abner
@ 2023-05-05  5:24 ` Chang, Abner
  2023-05-09  6:53   ` Nickle Wang
  2023-05-09  6:57   ` Attar, AbdulLateef (Abdul Lateef)
  2023-05-08 21:19 ` [edk2-devel] [edk2-platforms][PATCH] ManageabilityPkg/IpmiCommandLib:IPMI Command Library Isaac Oram
                   ` (2 subsequent siblings)
  3 siblings, 2 replies; 8+ messages in thread
From: Chang, Abner @ 2023-05-05  5:24 UTC (permalink / raw)
  To: devel; +Cc: Isaac Oram, Abdul Lateef Attar, Nickle Wang, Tinh Nguyen

From: Abner Chang <abner.chang@amd.com>

BZ #: 4444
Add IpmiCommandLib to ManageabilityPkg package.

Signed-off-by: Abner Chang <abner.chang@amd.com>
Cc: Isaac Oram <isaac.w.oram@intel.com>
Cc: Abdul Lateef Attar <abdattar@amd.com>
Cc: Nickle Wang <nicklew@nvidia.com>
Cc: Tinh Nguyen <tinhnguyen@os.amperecomputing.com>
---
 Features/ManageabilityPkg/ManageabilityPkg.dec      | 4 ++++
 Features/ManageabilityPkg/Include/Manageability.dsc | 1 +
 Features/ManageabilityPkg/ManageabilityPkg.dsc      | 1 +
 3 files changed, 6 insertions(+)

diff --git a/Features/ManageabilityPkg/ManageabilityPkg.dec b/Features/ManageabilityPkg/ManageabilityPkg.dec
index 6f58ab4f45..38813c5f48 100644
--- a/Features/ManageabilityPkg/ManageabilityPkg.dec
+++ b/Features/ManageabilityPkg/ManageabilityPkg.dec
@@ -18,6 +18,10 @@
   Include
 
 [LibraryClasses]
+  ##  @libraryclass IPMI command library
+  #   Provide the help functions to send IPMI commands.
+  IpmiCommandLib|Include/Library/IpmiCommandLib.h
+
   ##  @libraryclass Manageability Transport Library
   #   Manageability Transport Library definitions
   ManageabilityTransportLib|Include/Library/ManageabilityTransportLib.h
diff --git a/Features/ManageabilityPkg/Include/Manageability.dsc b/Features/ManageabilityPkg/Include/Manageability.dsc
index 5e7cdb885f..a432b0ff26 100644
--- a/Features/ManageabilityPkg/Include/Manageability.dsc
+++ b/Features/ManageabilityPkg/Include/Manageability.dsc
@@ -7,6 +7,7 @@
 ##
 [LibraryClasses]
   ManageabilityTransportHelperLib|ManageabilityPkg/Library/BaseManageabilityTransportHelperLib/BaseManageabilityTransportHelper.inf
+  IpmiCommandLib|ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLib.inf
 
 [LibraryClasses.common.DXE_DRIVER]
   PldmProtocolLib|ManageabilityPkg/Library/PldmProtocolLibrary/Dxe/PldmProtocolLib.inf
diff --git a/Features/ManageabilityPkg/ManageabilityPkg.dsc b/Features/ManageabilityPkg/ManageabilityPkg.dsc
index a0712d1c0a..e3baf27f2a 100644
--- a/Features/ManageabilityPkg/ManageabilityPkg.dsc
+++ b/Features/ManageabilityPkg/ManageabilityPkg.dsc
@@ -49,6 +49,7 @@
   ManageabilityPkg/Library/ManageabilityTransportKcsLib/Dxe/DxeManageabilityTransportKcs.inf
   ManageabilityPkg/Library/ManageabilityTransportMctpLib/Dxe/DxeManageabilityTransportMctp.inf
   ManageabilityPkg/Library/PldmProtocolLibrary/Dxe/PldmProtocolLib.inf
+  ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLib.inf
 
 [LibraryClasses]
   ManageabilityTransportLib|ManageabilityPkg/Library/BaseManageabilityTransportNullLib/BaseManageabilityTransportNull.inf
-- 
2.37.1.windows.1


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [edk2-devel] [edk2-platforms][PATCH] ManageabilityPkg/IpmiCommandLib:IPMI Command Library
  2023-05-05  5:24 [edk2-platforms][PATCH] ManageabilityPkg/IpmiCommandLib:IPMI Command Library Chang, Abner
  2023-05-05  5:24 ` [edk2-platforms][PATCH] ManageabilityPkg/IpmiCommandLib: Add IpmiCommandLib to package Chang, Abner
@ 2023-05-08 21:19 ` Isaac Oram
  2023-05-09  6:36   ` Chang, Abner
  2023-05-09  6:54 ` Nickle Wang
  2023-05-09  7:01 ` Attar, AbdulLateef (Abdul Lateef)
  3 siblings, 1 reply; 8+ messages in thread
From: Isaac Oram @ 2023-05-08 21:19 UTC (permalink / raw)
  To: devel@edk2.groups.io, abner.chang@amd.com
  Cc: Abdul Lateef Attar, Nickle Wang, Tinh Nguyen

Reviewed-by:  Isaac Oram <isaac.w.oram@intel.com>


A few superficial things that could be fixed now or later.

Typo:  EFI_STASTUS

There is a mismatch between function names and parameter names that looks like a cut/paste from prior function.  Updating would probably match the spirit of "no functional changes", but it is your choice to correct.
IpmiSetPowerRestorePolicy (
  IN  IPMI_SET_POWER_RESTORE_POLICY_REQUEST   *ChassisControlRequest,
  OUT IPMI_SET_POWER_RESTORE_POLICY_RESPONSE  *ChassisControlResponse
  )

-----Original Message-----
From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Chang, Abner via groups.io
Sent: Thursday, May 4, 2023 10:24 PM
To: devel@edk2.groups.io
Cc: Oram, Isaac W <isaac.w.oram@intel.com>; Abdul Lateef Attar <abdattar@amd.com>; Nickle Wang <nicklew@nvidia.com>; Tinh Nguyen <tinhnguyen@os.amperecomputing.com>
Subject: [edk2-devel] [edk2-platforms][PATCH] ManageabilityPkg/IpmiCommandLib:IPMI Command Library

From: Abner Chang <abner.chang@amd.com>

BZ #: 4444

IpmiCommandLib is cloned from
edk2-platforms/Features/Intel/OutOfBandManagement/
IpmiFeaturePkg/Library/IpmiCommandLib in order to
consolidate edk2 system manageability support in
one place. Function header are added to the source
files and header files. Uncustify is applied to C
files and no functionalities are changed in this patch.

We will still keep the one under IpmiFeaturePkg/Library/
IpmiCommandLib until the reference to this instance are
removed from platforms.

Signed-off-by: Abner Chang <abner.chang@amd.com>
Cc: Isaac Oram <isaac.w.oram@intel.com>
Cc: Abdul Lateef Attar <abdattar@amd.com>
Cc: Nickle Wang <nicklew@nvidia.com>
Cc: Tinh Nguyen <tinhnguyen@os.amperecomputing.com>
---
 .../Library/IpmiCommandLib/IpmiCommandLib.inf |  33 +
 .../Include/Library/IpmiCommandLib.h          | 620 ++++++++++++++++++
 .../IpmiCommandLib/IpmiCommandLibNetFnApp.c   | 444 +++++++++++++
 .../IpmiCommandLibNetFnChassis.c              | 199 ++++++
 .../IpmiCommandLibNetFnStorage.c              | 384 +++++++++++
 .../IpmiCommandLibNetFnTransport.c            | 156 +++++
 6 files changed, 1836 insertions(+)
 create mode 100644 Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLib.inf
 create mode 100644 Features/ManageabilityPkg/Include/Library/IpmiCommandLib.h
 create mode 100644 Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLibNetFnApp.c
 create mode 100644 Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLibNetFnChassis.c
 create mode 100644 Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLibNetFnStorage.c
 create mode 100644 Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLibNetFnTransport.c

diff --git a/Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLib.inf b/Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLib.inf
new file mode 100644
index 0000000000..3dc485cf38
--- /dev/null
+++ b/Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLib.inf
@@ -0,0 +1,33 @@
+### @file
+# Component description file for IPMI Command Library.
+#
+# Copyright (c) 2018 - 2021, Intel Corporation. All rights reserved.<BR>
+# Copyright (C) 2023 Advanced Micro Devices, Inc. All rights reserved.<BR>
+#
+# SPDX-License-Identifier: BSD-2-Clause-Patent
+#
+###
+
+[Defines]
+  INF_VERSION                    = 0x00010005
+  BASE_NAME                      = IpmiCommandLib
+  FILE_GUID                      = 96FC1989-CB7F-489B-9D3B-68DCA2C2DADC
+  MODULE_TYPE                    = UEFI_DRIVER
+  VERSION_STRING                 = 1.0
+  LIBRARY_CLASS                  = IpmiCommandLib
+
+[sources]
+  IpmiCommandLibNetFnApp.c
+  IpmiCommandLibNetFnTransport.c
+  IpmiCommandLibNetFnChassis.c
+  IpmiCommandLibNetFnStorage.c
+
+[Packages]
+  MdePkg/MdePkg.dec
+  MdeModulePkg/MdeModulePkg.dec
+  ManageabilityPkg/ManageabilityPkg.dec
+
+[LibraryClasses]
+  BaseMemoryLib
+  DebugLib
+  IpmiLib
diff --git a/Features/ManageabilityPkg/Include/Library/IpmiCommandLib.h b/Features/ManageabilityPkg/Include/Library/IpmiCommandLib.h
new file mode 100644
index 0000000000..685f6e2ea2
--- /dev/null
+++ b/Features/ManageabilityPkg/Include/Library/IpmiCommandLib.h
@@ -0,0 +1,620 @@
+/** @file
+  This library abstract how to send/receive IPMI command.
+
+Copyright (c) 2018-2021, Intel Corporation. All rights reserved.<BR>
+Copyright (C) 2023 Advanced Micro Devices, Inc. All rights reserved.<BR>
+
+SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#ifndef IPMI_COMMAND_LIB_H_
+#define IPMI_COMMAND_LIB_H_
+
+#include <Uefi.h>
+#include <IndustryStandard/Ipmi.h>
+
+///
+/// Functions for IPMI NetFnApp commands
+///
+
+/**
+  This function is used to retrieve device ID.
+
+  @param [out]  DeviceId  The pointer to receive IPMI_GET_DEVICE_ID_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetDeviceId (
+  OUT IPMI_GET_DEVICE_ID_RESPONSE  *DeviceId
+  );
+
+/**
+  This function returns device self test results
+
+  @param [out]  SelfTestResult  The pointer to receive IPMI_SELF_TEST_RESULT_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetSelfTestResult (
+  OUT IPMI_SELF_TEST_RESULT_RESPONSE  *SelfTestResult
+  );
+
+/**
+  This function is used for starting and restarting the Watchdog
+  Timer from the initial countdown value that was specified in
+  the Set Watchdog Timer command the watchdog timer.
+
+  @param [out]  CompletionCode  IPMI completetion code, refer to Ipmi.h.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiResetWatchdogTimer (
+  OUT UINT8  *CompletionCode
+  );
+
+/**
+  This function  is used for initializing and configuring
+  the watchdog timer.
+
+  @param [in]   SetWatchdogTimer  Pointer to receive IPMI_SET_WATCHDOG_TIMER_REQUEST.
+  @param [out]  CompletionCode    IPMI completetion code, refer to Ipmi.h.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiSetWatchdogTimer (
+  IN  IPMI_SET_WATCHDOG_TIMER_REQUEST  *SetWatchdogTimer,
+  OUT UINT8                            *CompletionCode
+  );
+
+/**
+  This function retrieves the current settings and present
+  countdown of the watchdog timer.
+
+  @param [out]  GetWatchdogTimer  Pointer to receive IPMI_GET_WATCHDOG_TIMER_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetWatchdogTimer (
+  OUT IPMI_GET_WATCHDOG_TIMER_RESPONSE  *GetWatchdogTimer
+  );
+
+/**
+  This function enables message reception into Message Buffers,
+  and any interrupt associated with that buffer getting full.
+
+  @param [in]   SetBmcGlobalEnables  Pointer receive to IPMI_SET_BMC_GLOBAL_ENABLES_REQUEST.
+  @param [out]  CompletionCode       IPMI completetion code, refer to Ipmi.h.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiSetBmcGlobalEnables (
+  IN  IPMI_SET_BMC_GLOBAL_ENABLES_REQUEST  *SetBmcGlobalEnables,
+  OUT UINT8                                *CompletionCode
+  );
+
+/**
+  This function retrieves the present setting of the Global Enables
+
+  @param [out]  GetBmcGlobalEnables  Pointer to receive IPMI_GET_BMC_GLOBAL_ENABLES_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetBmcGlobalEnables (
+  OUT IPMI_GET_BMC_GLOBAL_ENABLES_RESPONSE  *GetBmcGlobalEnables
+  );
+
+/**
+  This function is used to flush unread data from the Receive
+  Message Queue or Event Message Buffer
+
+  @param [in]   ClearMessageFlagsRequest IPMI_CLEAR_MESSAGE_FLAGS_REQUEST
+  @param [out]  CompletionCode           IPMI completetion code, refer to Ipmi.h.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiClearMessageFlags (
+  IN  IPMI_CLEAR_MESSAGE_FLAGS_REQUEST  *ClearMessageFlagsRequest,
+  OUT UINT8                             *CompletionCode
+  );
+
+/**
+  This function is used to retrieve the present message available states.
+
+  @param [out]  GetMessageFlagsResponse  Pointer to receive IPMI_GET_MESSAGE_FLAGS_RESPONSE
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetMessageFlags (
+  OUT IPMI_GET_MESSAGE_FLAGS_RESPONSE  *GetMessageFlagsResponse
+  );
+
+/**
+  This function is used to get data from the Receive Message Queue.
+
+  @param [out]      GetMessageResponse      Pointer to receive IPMI_GET_MESSAGE_RESPONSE.
+  @param [in, out]  GetMessageResponseSize  When in, which is the expected size of
+                                            response. When out, which is the actual
+                                            size returned.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetMessage (
+  OUT IPMI_GET_MESSAGE_RESPONSE  *GetMessageResponse,
+  IN OUT UINT32                  *GetMessageResponseSize
+  );
+
+/**
+  This function is used for bridging IPMI messages between channels,
+  and between the system management software (SMS) and a given channel
+
+  @param [in]   SendMessageRequest       Pointer to IPMI_SEND_MESSAGE_REQUEST.
+  @param [in]   SendMessageRequestSize   Size of entire SendMessageRequestSize.
+  @param [out]  SendMessageResponse      Pointer to receive IPMI_SEND_MESSAGE_RESPONSE.
+  @param [in]   SendMessageResponseSize  When in, which is the expected size of
+                                         response. When out, which is the actual
+                                         size returned.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiSendMessage (
+  IN  IPMI_SEND_MESSAGE_REQUEST   *SendMessageRequest,
+  IN  UINT32                      SendMessageRequestSize,
+  OUT IPMI_SEND_MESSAGE_RESPONSE  *SendMessageResponse,
+  IN OUT UINT32                   *SendMessageResponseSize
+  );
+
+/**
+  This function gets the system UUID.
+
+  @param [out]  SystemGuid   The pointer to retrieve system UUID.
+
+  @retval EFI_SUCCESS               UUID is returned.
+  @retval EFI_INVALID_PARAMETER     SystemGuid is a NULL pointer.
+  @retval Others                    See return value of IpmiSubmitCommand () function.
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetSystemUuid (
+  OUT EFI_GUID  *SystemGuid
+  );
+
+/**
+  This function gets the channel information.
+
+  @param [in]   GetChannelInfoRequest       The get channel information request.
+  @param [out]  GetChannelInfoResponse      The get channel information response.
+  @param [out]  GetChannelInfoResponseSize  When input, the expected size of response.
+                                            When output, the exact size of the returned
+                                            response.
+
+  @retval EFI_SUCCESS            Get channel information successfully.
+  @retval EFI_INVALID_PARAMETER  One of the given input parameters is invalid.
+  @retval Others                 See return value of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetChannelInfo (
+  IN  IPMI_GET_CHANNEL_INFO_REQUEST   *GetChannelInfoRequest,
+  OUT IPMI_GET_CHANNEL_INFO_RESPONSE  *GetChannelInfoResponse,
+  OUT UINT32                          *GetChannelInfoResponseSize
+  );
+
+///
+/// Functions for IPMI NetFnTransport commands.
+///
+
+/**
+  This function sends command to BMC to notify a remote application
+  that a SOL payload is activating on another channel.
+
+  @param [in]   SolActivatingRequest  Pointer to IPMI_SOL_ACTIVATING_REQUEST.
+  @param [out]  CompletionCode        IPMI completetion code, refer to Ipmi.h.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiSolActivating (
+  IN  IPMI_SOL_ACTIVATING_REQUEST  *SolActivatingRequest,
+  OUT UINT8                        *CompletionCode
+  );
+
+/**
+  This function is used to set parameters such as the network addressing
+  information required for SOL payload operation.
+
+  @param [in]  SetConfigurationParametersRequest      Pointer to IPMI_SET_SOL_CONFIGURATION_PARAMETERS_REQUEST.
+  @param [in]  SetConfigurationParametersRequestSize  Size of entire SetConfigurationParametersRequestSize.
+  @param [out] CompletionCode                         IPMI completetion code, refer to Ipmi.h.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiSetSolConfigurationParameters (
+  IN  IPMI_SET_SOL_CONFIGURATION_PARAMETERS_REQUEST  *SetConfigurationParametersRequest,
+  IN  UINT32                                         SetConfigurationParametersRequestSize,
+  OUT UINT8                                          *CompletionCode
+  );
+
+/**
+  This function is used to retrieve the configuration parameters from the
+  Set SOL Configuration Parameters.
+
+  @param [in]       GetConfigurationParametersRequest       Pointer to IPMI_SET_SOL_CONFIGURATION_PARAMETERS_REQUEST.
+  @param [out]      GetConfigurationParametersResponse      Pointer to receive IPMI_GET_SOL_CONFIGURATION_PARAMETERS_RESPONSE.
+  @param [in, out]  GetConfigurationParametersResponseSize  When in, which is the expected size of
+                                                            response. When out, which is the actual
+                                                            size returned.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetSolConfigurationParameters (
+  IN  IPMI_GET_SOL_CONFIGURATION_PARAMETERS_REQUEST   *GetConfigurationParametersRequest,
+  OUT IPMI_GET_SOL_CONFIGURATION_PARAMETERS_RESPONSE  *GetConfigurationParametersResponse,
+  IN OUT UINT32                                       *GetConfigurationParametersResponseSize
+  );
+
+/**
+  This function gets the LAN configuration parameter.
+
+  @param[in]      GetLanConfigurationParametersRequest   Request data
+  @param[out]     GetLanConfigurationParametersResponse  Response data
+  @param[in,out]  GetLanConfigurationParametersSize      When input, the expected size of response data.
+                                                         When out, the exact size of response data.
+
+  @retval EFI_SUCCESS            Lan configuration parameter is returned in the response.
+  @retval EFI_INVALID_PARAMETER  One of the given input parameters is invalid.
+  @retval Others                 Other errors.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetLanConfigurationParameters (
+  IN     IPMI_GET_LAN_CONFIGURATION_PARAMETERS_REQUEST   *GetLanConfigurationParametersRequest,
+  OUT    IPMI_GET_LAN_CONFIGURATION_PARAMETERS_RESPONSE  *GetLanConfigurationParametersResponse,
+  IN OUT UINT32                                          *GetLanConfigurationParametersSize
+  );
+
+///
+/// Functions for IPMI NetFnChasis commands
+///
+
+/**
+  This function returns information about which main chassis management functions are
+  present and  what addresses are used to access those functions.
+
+  @param [out]  GetChassisCapabilitiesResponse  Pointer to IPMI_GET_CHASSIS_CAPABILITIES_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetChassisCapabilities (
+  OUT IPMI_GET_CHASSIS_CAPABILITIES_RESPONSE  *GetChassisCapabilitiesResponse
+  );
+
+/**
+  This function gets  information regarding the high-level status of the system
+  chassis and main power subsystem.
+
+  @param [out]  GetChassisStatusResponse  Pointer to IPMI_GET_CHASSIS_STATUS_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetChassisStatus (
+  OUT IPMI_GET_CHASSIS_STATUS_RESPONSE  *GetChassisStatusResponse
+  );
+
+/**
+  This function sends command to control power up, power down, and reset.
+
+  @param [in]   ChassisControlRequest  Pointer to IPMI_CHASSIS_CONTROL_REQUEST.
+  @param [out]  CompletionCode         IPMI completetion code, refer to Ipmi.h.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiChassisControl (
+  IN IPMI_CHASSIS_CONTROL_REQUEST  *ChassisControlRequest,
+  OUT UINT8                        *CompletionCode
+  );
+
+/**
+  This function is used to configure the power restore policy.
+
+  @param [in]   ChassisControlRequest   Pointer to IPMI_SET_POWER_RESTORE_POLICY_REQUEST.
+  @param [out]  ChassisControlResponse  Pointer to IPMI_SET_POWER_RESTORE_POLICY_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiSetPowerRestorePolicy (
+  IN  IPMI_SET_POWER_RESTORE_POLICY_REQUEST   *ChassisControlRequest,
+  OUT IPMI_SET_POWER_RESTORE_POLICY_RESPONSE  *ChassisControlResponse
+  );
+
+/**
+  This function is used to set parameters that direct the system boot
+  following a system power up or reset.
+
+  @param [in]   BootOptionsRequest   Pointer to IPMI_SET_BOOT_OPTIONS_REQUEST.
+  @param [out]  BootOptionsResponse  Pointer to IPMI_SET_BOOT_OPTIONS_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiSetSystemBootOptions (
+  IN  IPMI_SET_BOOT_OPTIONS_REQUEST   *BootOptionsRequest,
+  OUT IPMI_SET_BOOT_OPTIONS_RESPONSE  *BootOptionsResponse
+  );
+
+/**
+  This function is used to retrieve the boot options set by the
+  Set System Boot Options command.
+
+  @param [in]   BootOptionsRequest   Pointer to IPMI_GET_BOOT_OPTIONS_REQUEST.
+  @param [out]  BootOptionsResponse  Pointer to IPMI_GET_BOOT_OPTIONS_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetSystemBootOptions (
+  IN  IPMI_GET_BOOT_OPTIONS_REQUEST   *BootOptionsRequest,
+  OUT IPMI_GET_BOOT_OPTIONS_RESPONSE  *BootOptionsResponse
+  );
+
+///
+/// Functions for IPMI NetFnStorage commands
+///
+
+/**
+  This function is used to retrieve FRU Inventory Area
+
+  @param [in]   GetFruInventoryAreaInfoRequest   Pointer to IPMI_GET_FRU_INVENTORY_AREA_INFO_REQUEST.
+  @param [out]  GetFruInventoryAreaInfoResponse  Pointer to IPMI_GET_FRU_INVENTORY_AREA_INFO_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetFruInventoryAreaInfo (
+  IN  IPMI_GET_FRU_INVENTORY_AREA_INFO_REQUEST   *GetFruInventoryAreaInfoRequest,
+  OUT IPMI_GET_FRU_INVENTORY_AREA_INFO_RESPONSE  *GetFruInventoryAreaInfoResponse
+  );
+
+/**
+  This function returns specified data from the FRU Inventory Info area.
+
+  @param [in]       ReadFruDataRequest       Pointer to IPMI_READ_FRU_DATA_REQUEST.
+  @param [out]      ReadFruDataResponse      Pointer to IPMI_READ_FRU_DATA_RESPONSE.
+  @param [in, out]  ReadFruDataResponseSize  Returns the size of ReadFruDataResponse.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiReadFruData (
+  IN  IPMI_READ_FRU_DATA_REQUEST   *ReadFruDataRequest,
+  OUT IPMI_READ_FRU_DATA_RESPONSE  *ReadFruDataResponse,
+  IN OUT UINT32                    *ReadFruDataResponseSize
+  );
+
+/**
+  This function writes specified data from the FRU Inventory Info area.
+
+  @param [in]   WriteFruDataRequest      Pointer to IPMI_WRITE_FRU_DATA_REQUEST.
+  @param [in]   WriteFruDataRequestSize  Size of WriteFruDataRequest.
+  @param [out]  WriteFruDataResponse     Pointer to receive IPMI_WRITE_FRU_DATA_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiWriteFruData (
+  IN  IPMI_WRITE_FRU_DATA_REQUEST   *WriteFruDataRequest,
+  IN  UINT32                        WriteFruDataRequestSize,
+  OUT IPMI_WRITE_FRU_DATA_RESPONSE  *WriteFruDataResponse
+  );
+
+/**
+  This function returns the number of entries in the SEL
+
+  @param [out] GetSelInfoResponse     Pointer to receive IPMI_GET_SEL_INFO_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetSelInfo (
+  OUT IPMI_GET_SEL_INFO_RESPONSE  *GetSelInfoResponse
+  );
+
+/**
+  This function retrieves entries from the SEL
+
+  @param [in]   GetSelEntryRequest       Pointer to IPMI_GET_SEL_ENTRY_REQUEST.
+  @param [out]  GetSelEntryResponse      Pointer to receive IPMI_GET_SEL_ENTRY_RESPONSE.
+  @param [in]   GetSelEntryResponseSize  Size of entire GetSelEntryResponse.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetSelEntry (
+  IN IPMI_GET_SEL_ENTRY_REQUEST    *GetSelEntryRequest,
+  OUT IPMI_GET_SEL_ENTRY_RESPONSE  *GetSelEntryResponse,
+  IN OUT UINT32                    *GetSelEntryResponseSize
+  );
+
+/**
+  This function adds an entry in the SEL
+
+  @param [in]   AddSelEntryRequest   Pointer to IPMI_ADD_SEL_ENTRY_REQUEST.
+  @param [out]  AddSelEntryResponse  Pointer to receive IPMI_ADD_SEL_ENTRY_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiAddSelEntry (
+  IN IPMI_ADD_SEL_ENTRY_REQUEST    *AddSelEntryRequest,
+  OUT IPMI_ADD_SEL_ENTRY_RESPONSE  *AddSelEntryResponse
+  );
+
+/**
+  This function adds SEL Entry command that allows the record to be incrementally
+  added to the SEL.
+
+  @param [in]  PartialAddSelEntryRequest      Pointer to IPMI_PARTIAL_ADD_SEL_ENTRY_REQUEST.
+  @param [in]  PartialAddSelEntryRequestSize  Size of entire PartialAddSelEntryRequest.
+  @param [out] PartialAddSelEntryResponse     Pointer to receive IPMI_PARTIAL_ADD_SEL_ENTRY_RESPONSE.
+
+  @retval EFI_STASTUS   See return value of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiPartialAddSelEntry (
+  IN IPMI_PARTIAL_ADD_SEL_ENTRY_REQUEST    *PartialAddSelEntryRequest,
+  IN UINT32                                PartialAddSelEntryRequestSize,
+  OUT IPMI_PARTIAL_ADD_SEL_ENTRY_RESPONSE  *PartialAddSelEntryResponse
+  );
+
+/**
+  This function erases all contents of the System Event Log.
+
+  @param [in]   ClearSelRequest   Pointer to IPMI_CLEAR_SEL_REQUEST.
+  @param [out]  ClearSelResponse  Pointer to receive IPMI_CLEAR_SEL_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiClearSel (
+  IN IPMI_CLEAR_SEL_REQUEST    *ClearSelRequest,
+  OUT IPMI_CLEAR_SEL_RESPONSE  *ClearSelResponse
+  );
+
+/**
+  This function returns the time from the SEL Device.
+
+  @param [out]  GetSelTimeResponse  Pointer to IPMI_GET_SEL_TIME_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetSelTime (
+  OUT IPMI_GET_SEL_TIME_RESPONSE  *GetSelTimeResponse
+  );
+
+/**
+  This function set the time in the SEL Device.
+
+  @param [in]   SetSelTimeRequest  Pointer to IPMI_SET_SEL_TIME_REQUEST.
+  @param [out]  CompletionCode     IPMI completetion code, refer to Ipmi.h.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiSetSelTime (
+  IN IPMI_SET_SEL_TIME_REQUEST  *SetSelTimeRequest,
+  OUT UINT8                     *CompletionCode
+  );
+
+/**
+  This function returns the SDR command version for the SDR Repository.
+
+  @param [out]  ClearSelResponse  Pointer to receive IPMI_GET_SDR_REPOSITORY_INFO_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetSdrRepositoryInfo (
+  OUT IPMI_GET_SDR_REPOSITORY_INFO_RESPONSE  *GetSdrRepositoryInfoResp
+  );
+
+/**
+  This function returns the sensor record specified by Record ID.
+
+  @param [in]       GetSdrRequest       Pointer to IPMI_GET_SDR_REQUEST.
+  @param [out]      GetSdrResponse      Pointer to receive IPMI_GET_SDR_RESPONSE.
+  @param [in, out]  GetSdrResponseSize  Size of entire GetSdrResponse.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetSdr (
+  IN  IPMI_GET_SDR_REQUEST   *GetSdrRequest,
+  OUT IPMI_GET_SDR_RESPONSE  *GetSdrResponse,
+  IN OUT UINT32              *GetSdrResponseSize
+  );
+
+#endif // IPMI_COMMAND_LIB_H_
diff --git a/Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLibNetFnApp.c b/Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLibNetFnApp.c
new file mode 100644
index 0000000000..30c412e2f4
--- /dev/null
+++ b/Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLibNetFnApp.c
@@ -0,0 +1,444 @@
+/** @file
+  IPMI Command - NetFnApp.
+
+  Copyright (c) 2018 - 2021, Intel Corporation. All rights reserved.<BR>
+  Copyright (C) 2023 Advanced Micro Devices, Inc. All rights reserved.<BR>
+
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+**/
+
+#include <PiPei.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/DebugLib.h>
+#include <Library/IpmiLib.h>
+
+#include <IndustryStandard/Ipmi.h>
+
+/**
+  This function is used to retrieve device ID.
+
+  @param [out]  DeviceId  The pointer to receive IPMI_GET_DEVICE_ID_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetDeviceId (
+  OUT IPMI_GET_DEVICE_ID_RESPONSE  *DeviceId
+  )
+{
+  EFI_STATUS  Status;
+  UINT32      DataSize;
+
+  DataSize = sizeof (*DeviceId);
+  Status   = IpmiSubmitCommand (
+               IPMI_NETFN_APP,
+               IPMI_APP_GET_DEVICE_ID,
+               NULL,
+               0,
+               (VOID *)DeviceId,
+               &DataSize
+               );
+  return Status;
+}
+
+/**
+  This function returns device self test results
+
+  @param [out]  SelfTestResult  The pointer to receive IPMI_SELF_TEST_RESULT_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetSelfTestResult (
+  OUT IPMI_SELF_TEST_RESULT_RESPONSE  *SelfTestResult
+  )
+{
+  EFI_STATUS  Status;
+  UINT32      DataSize;
+
+  DataSize = sizeof (*SelfTestResult);
+  Status   = IpmiSubmitCommand (
+               IPMI_NETFN_APP,
+               IPMI_APP_GET_SELFTEST_RESULTS,
+               NULL,
+               0,
+               (VOID *)SelfTestResult,
+               &DataSize
+               );
+  return Status;
+}
+
+/**
+  This function is used for starting and restarting the Watchdog
+  Timer from the initial countdown value that was specified in
+  the Set Watchdog Timer command the watchdog timer
+
+  @param [out]  CompletionCode  IPMI completetion code, refer to Ipmi.h.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiResetWatchdogTimer (
+  OUT UINT8  *CompletionCode
+  )
+{
+  EFI_STATUS  Status;
+  UINT32      DataSize;
+
+  DataSize = sizeof (*CompletionCode);
+  Status   = IpmiSubmitCommand (
+               IPMI_NETFN_APP,
+               IPMI_APP_RESET_WATCHDOG_TIMER,
+               NULL,
+               0,
+               (VOID *)CompletionCode,
+               &DataSize
+               );
+  return Status;
+}
+
+/**
+  This function  is used for initializing and configuring
+  the watchdog timer.
+
+  @param [in]   SetWatchdogTimer  Pointer to receive IPMI_SET_WATCHDOG_TIMER_REQUEST.
+  @param [out]  CompletionCode    IPMI completetion code, refer to Ipmi.h.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiSetWatchdogTimer (
+  IN  IPMI_SET_WATCHDOG_TIMER_REQUEST  *SetWatchdogTimer,
+  OUT UINT8                            *CompletionCode
+  )
+{
+  EFI_STATUS  Status;
+  UINT32      DataSize;
+
+  DataSize = sizeof (*CompletionCode);
+  Status   = IpmiSubmitCommand (
+               IPMI_NETFN_APP,
+               IPMI_APP_SET_WATCHDOG_TIMER,
+               (VOID *)SetWatchdogTimer,
+               sizeof (*SetWatchdogTimer),
+               (VOID *)CompletionCode,
+               &DataSize
+               );
+  return Status;
+}
+
+/**
+  This function retrieves the current settings and present
+  countdown of the watchdog timer.
+
+  @param [out]  GetWatchdogTimer  Pointer to receive IPMI_GET_WATCHDOG_TIMER_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetWatchdogTimer (
+  OUT IPMI_GET_WATCHDOG_TIMER_RESPONSE  *GetWatchdogTimer
+  )
+{
+  EFI_STATUS  Status;
+  UINT32      DataSize;
+
+  DataSize = sizeof (*GetWatchdogTimer);
+  Status   = IpmiSubmitCommand (
+               IPMI_NETFN_APP,
+               IPMI_APP_GET_WATCHDOG_TIMER,
+               NULL,
+               0,
+               (VOID *)GetWatchdogTimer,
+               &DataSize
+               );
+  return Status;
+}
+
+/**
+  This function enables message reception into Message Buffers,
+  and any interrupt associated with that buffer getting full.
+
+  @param [in]   SetBmcGlobalEnables  Pointer receive to IPMI_SET_BMC_GLOBAL_ENABLES_REQUEST.
+  @param [out]  CompletionCode      IPMI completetion code refer to Ipmi.h.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiSetBmcGlobalEnables (
+  IN  IPMI_SET_BMC_GLOBAL_ENABLES_REQUEST  *SetBmcGlobalEnables,
+  OUT UINT8                                *CompletionCode
+  )
+{
+  EFI_STATUS  Status;
+  UINT32      DataSize;
+
+  DataSize = sizeof (*CompletionCode);
+  Status   = IpmiSubmitCommand (
+               IPMI_NETFN_APP,
+               IPMI_APP_SET_BMC_GLOBAL_ENABLES,
+               (VOID *)SetBmcGlobalEnables,
+               sizeof (*SetBmcGlobalEnables),
+               (VOID *)CompletionCode,
+               &DataSize
+               );
+  return Status;
+}
+
+/**
+  This function retrieves the present setting of the Global Enables
+
+  @param [out]  GetBmcGlobalEnables  Pointer to receive IPMI_GET_BMC_GLOBAL_ENABLES_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetBmcGlobalEnables (
+  OUT IPMI_GET_BMC_GLOBAL_ENABLES_RESPONSE  *GetBmcGlobalEnables
+  )
+{
+  EFI_STATUS  Status;
+  UINT32      DataSize;
+
+  DataSize = sizeof (*GetBmcGlobalEnables);
+  Status   = IpmiSubmitCommand (
+               IPMI_NETFN_APP,
+               IPMI_APP_GET_BMC_GLOBAL_ENABLES,
+               NULL,
+               0,
+               (VOID *)GetBmcGlobalEnables,
+               &DataSize
+               );
+  return Status;
+}
+
+/**
+  This function is used to flush unread data from the Receive
+  Message Queue or Event Message Buffer
+
+  @param [in]   ClearMessageFlagsRequest IPMI_CLEAR_MESSAGE_FLAGS_REQUEST
+  @param [out]  CompletionCode           IPMI completetion code, refer to Ipmi.h.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiClearMessageFlags (
+  IN  IPMI_CLEAR_MESSAGE_FLAGS_REQUEST  *ClearMessageFlagsRequest,
+  OUT UINT8                             *CompletionCode
+  )
+{
+  EFI_STATUS  Status;
+  UINT32      DataSize;
+
+  DataSize = sizeof (*CompletionCode);
+  Status   = IpmiSubmitCommand (
+               IPMI_NETFN_APP,
+               IPMI_APP_CLEAR_MESSAGE_FLAGS,
+               (VOID *)ClearMessageFlagsRequest,
+               sizeof (*ClearMessageFlagsRequest),
+               (VOID *)CompletionCode,
+               &DataSize
+               );
+  return Status;
+}
+
+/**
+  This function is used to retrieve the present message available states.
+
+  @param  [out]  GetMessageFlagsResponse  Pointer to receive IPMI_GET_MESSAGE_FLAGS_RESPONSE
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetMessageFlags (
+  OUT IPMI_GET_MESSAGE_FLAGS_RESPONSE  *GetMessageFlagsResponse
+  )
+{
+  EFI_STATUS  Status;
+  UINT32      DataSize;
+
+  DataSize = sizeof (*GetMessageFlagsResponse);
+  Status   = IpmiSubmitCommand (
+               IPMI_NETFN_APP,
+               IPMI_APP_GET_MESSAGE_FLAGS,
+               NULL,
+               0,
+               (VOID *)GetMessageFlagsResponse,
+               &DataSize
+               );
+  return Status;
+}
+
+/**
+  This function is used to get data from the Receive Message Queue.
+
+  @param [out]      GetMessageResponse      Pointer to receive IPMI_GET_MESSAGE_RESPONSE.
+  @param [in, out]  GetMessageResponseSize  When in, which is the expected size of
+                                            response. When out, which is the actual
+                                            size returned.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetMessage (
+  OUT IPMI_GET_MESSAGE_RESPONSE  *GetMessageResponse,
+  IN OUT UINT32                  *GetMessageResponseSize
+  )
+{
+  EFI_STATUS  Status;
+
+  Status = IpmiSubmitCommand (
+             IPMI_NETFN_APP,
+             IPMI_APP_GET_MESSAGE,
+             NULL,
+             0,
+             (VOID *)GetMessageResponse,
+             GetMessageResponseSize
+             );
+  return Status;
+}
+
+/**
+  This function is used for bridging IPMI messages between channels,
+  and between the system management software (SMS) and a given channel
+
+  @param [in]   SendMessageRequest       Pointer to IPMI_SEND_MESSAGE_REQUEST.
+  @param [in]   SendMessageRequestSize   Size of entire SendMessageRequestSize.
+  @param [out]  SendMessageResponse      Pointer to receive IPMI_SEND_MESSAGE_RESPONSE.
+  @param [in]   SendMessageResponseSize  When in, which is the expected size of
+                                         response. When out, which is the actual
+                                         size returned.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiSendMessage (
+  IN  IPMI_SEND_MESSAGE_REQUEST   *SendMessageRequest,
+  IN  UINT32                      SendMessageRequestSize,
+  OUT IPMI_SEND_MESSAGE_RESPONSE  *SendMessageResponse,
+  IN OUT UINT32                   *SendMessageResponseSize
+  )
+{
+  EFI_STATUS  Status;
+
+  Status = IpmiSubmitCommand (
+             IPMI_NETFN_APP,
+             IPMI_APP_SEND_MESSAGE,
+             (VOID *)SendMessageRequest,
+             SendMessageRequestSize,
+             (VOID *)SendMessageResponse,
+             SendMessageResponseSize
+             );
+  return Status;
+}
+
+/**
+  This function gets the system UUID.
+
+  @param[out] SystemGuid   The pointer to retrieve system UUID.
+
+  @retval EFI_SUCCESS               UUID is returned.
+  @retval EFI_INVALID_PARAMETER     SystemGuid is a NULL pointer.
+  @retval Others                    See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetSystemUuid (
+  OUT EFI_GUID  *SystemGuid
+  )
+{
+  EFI_STATUS                     Status;
+  UINT32                         RequestSize;
+  UINT32                         ResponseSize;
+  IPMI_GET_SYSTEM_UUID_RESPONSE  GetSystemUuidResponse;
+
+  if (SystemGuid == NULL) {
+    return EFI_INVALID_PARAMETER;
+  }
+
+  RequestSize  = 0;
+  ResponseSize = sizeof (IPMI_GET_SYSTEM_UUID_RESPONSE);
+  Status       = IpmiSubmitCommand (
+                   IPMI_NETFN_APP,
+                   IPMI_APP_GET_SYSTEM_GUID,
+                   (VOID *)NULL,
+                   RequestSize,
+                   (VOID *)&GetSystemUuidResponse,
+                   &ResponseSize
+                   );
+  if (!EFI_ERROR (Status) && (GetSystemUuidResponse.CompletionCode == IPMI_COMP_CODE_NORMAL)) {
+    CopyMem (
+      (VOID *)SystemGuid,
+      (VOID *)&GetSystemUuidResponse.SystemUuid,
+      sizeof (EFI_GUID)
+      );
+  }
+
+  return Status;
+}
+
+/**
+  This function gets the channel information.
+
+  @param[in]   GetChannelInfoRequest          The get channel information request.
+  @param[out]  GetChannelInfoResponse         The get channel information response.
+  @param[out]  GetChannelInfoResponseSize     When input, the expected size of response.
+                                              When output, the exact size of the returned
+                                              response.
+
+  @retval EFI_SUCCESS            Get channel information successfully.
+  @retval EFI_INVALID_PARAMETER  One of the given input parameters is invalid.
+  @retval Others                 See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetChannelInfo (
+  IN  IPMI_GET_CHANNEL_INFO_REQUEST   *GetChannelInfoRequest,
+  OUT IPMI_GET_CHANNEL_INFO_RESPONSE  *GetChannelInfoResponse,
+  OUT UINT32                          *GetChannelInfoResponseSize
+  )
+{
+  EFI_STATUS  Status;
+
+  if ((GetChannelInfoRequest == NULL) ||
+      (GetChannelInfoResponse == NULL) ||
+      (GetChannelInfoResponseSize == NULL))
+  {
+    return EFI_INVALID_PARAMETER;
+  }
+
+  *GetChannelInfoResponseSize = sizeof (IPMI_GET_CHANNEL_INFO_RESPONSE);
+  Status                      = IpmiSubmitCommand (
+                                  IPMI_NETFN_APP,
+                                  IPMI_APP_GET_CHANNEL_INFO,
+                                  (UINT8 *)GetChannelInfoRequest,
+                                  sizeof (IPMI_GET_CHANNEL_INFO_REQUEST),
+                                  (UINT8 *)GetChannelInfoResponse,
+                                  GetChannelInfoResponseSize
+                                  );
+  return Status;
+}
diff --git a/Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLibNetFnChassis.c b/Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLibNetFnChassis.c
new file mode 100644
index 0000000000..12fd997b11
--- /dev/null
+++ b/Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLibNetFnChassis.c
@@ -0,0 +1,199 @@
+/** @file
+  IPMI Command - NetFnChassis.
+
+  Copyright (c) 2018 - 2021, Intel Corporation. All rights reserved.<BR>
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+**/
+
+#include <PiPei.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/DebugLib.h>
+#include <Library/IpmiLib.h>
+
+#include <IndustryStandard/Ipmi.h>
+
+/**
+  This function returns information about which main chassis management functions are
+  present and  what addresses are used to access those functions.
+
+  @param [out]  GetChassisCapabilitiesResponse  Pointer to IPMI_GET_CHASSIS_CAPABILITIES_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetChassisCapabilities (
+  OUT IPMI_GET_CHASSIS_CAPABILITIES_RESPONSE  *GetChassisCapabilitiesResponse
+  )
+{
+  EFI_STATUS  Status;
+  UINT32      DataSize;
+
+  DataSize = sizeof (*GetChassisCapabilitiesResponse);
+  Status   = IpmiSubmitCommand (
+               IPMI_NETFN_CHASSIS,
+               IPMI_CHASSIS_GET_CAPABILITIES,
+               NULL,
+               0,
+               (VOID *)GetChassisCapabilitiesResponse,
+               &DataSize
+               );
+  return Status;
+}
+
+/**
+  This function gets  information regarding the high-level status of the system
+  chassis and main power subsystem.
+
+  @param [out]  GetChassisStatusResponse  Pointer to IPMI_GET_CHASSIS_STATUS_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetChassisStatus (
+  OUT IPMI_GET_CHASSIS_STATUS_RESPONSE  *GetChassisStatusResponse
+  )
+{
+  EFI_STATUS  Status;
+  UINT32      DataSize;
+
+  DataSize = sizeof (*GetChassisStatusResponse);
+  Status   = IpmiSubmitCommand (
+               IPMI_NETFN_CHASSIS,
+               IPMI_CHASSIS_GET_STATUS,
+               NULL,
+               0,
+               (VOID *)GetChassisStatusResponse,
+               &DataSize
+               );
+  return Status;
+}
+
+/**
+  This function sends command to control power up, power down, and reset.
+
+  @param [in]   ChassisControlRequest  Pointer to IPMI_CHASSIS_CONTROL_REQUEST.
+  @param [out]  CompletionCode         IPMI completetion code, refer to Ipmi.h.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiChassisControl (
+  IN IPMI_CHASSIS_CONTROL_REQUEST  *ChassisControlRequest,
+  OUT UINT8                        *CompletionCode
+  )
+{
+  EFI_STATUS  Status;
+  UINT32      DataSize;
+
+  DataSize = sizeof (*CompletionCode);
+  Status   = IpmiSubmitCommand (
+               IPMI_NETFN_CHASSIS,
+               IPMI_CHASSIS_CONTROL,
+               (VOID *)ChassisControlRequest,
+               sizeof (*ChassisControlRequest),
+               (VOID *)CompletionCode,
+               &DataSize
+               );
+  return Status;
+}
+
+/**
+  This function is used to configure the power restore policy.
+
+  @param [in]   ChassisControlRequest   Pointer to IPMI_SET_POWER_RESTORE_POLICY_REQUEST.
+  @param [out]  ChassisControlResponse  Pointer to IPMI_SET_POWER_RESTORE_POLICY_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiSetPowerRestorePolicy (
+  IN  IPMI_SET_POWER_RESTORE_POLICY_REQUEST   *ChassisControlRequest,
+  OUT IPMI_SET_POWER_RESTORE_POLICY_RESPONSE  *ChassisControlResponse
+  )
+{
+  EFI_STATUS  Status;
+  UINT32      DataSize;
+
+  DataSize = sizeof (*ChassisControlResponse);
+  Status   = IpmiSubmitCommand (
+               IPMI_NETFN_CHASSIS,
+               IPMI_CHASSIS_SET_POWER_RESTORE_POLICY,
+               (VOID *)ChassisControlRequest,
+               sizeof (*ChassisControlRequest),
+               (VOID *)ChassisControlResponse,
+               &DataSize
+               );
+  return Status;
+}
+
+/**
+  This function is used to set parameters that direct the system boot
+  following a system power up or reset.
+
+  @param [in]   BootOptionsRequest   Pointer to IPMI_SET_BOOT_OPTIONS_REQUEST.
+  @param [out]  BootOptionsResponse  Pointer to IPMI_SET_BOOT_OPTIONS_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiSetSystemBootOptions (
+  IN  IPMI_SET_BOOT_OPTIONS_REQUEST   *BootOptionsRequest,
+  OUT IPMI_SET_BOOT_OPTIONS_RESPONSE  *BootOptionsResponse
+  )
+{
+  EFI_STATUS  Status;
+  UINT32      DataSize;
+
+  DataSize = sizeof (*BootOptionsResponse);
+  Status   = IpmiSubmitCommand (
+               IPMI_NETFN_CHASSIS,
+               IPMI_CHASSIS_SET_SYSTEM_BOOT_OPTIONS,
+               (VOID *)BootOptionsRequest,
+               sizeof (*BootOptionsRequest),
+               (VOID *)BootOptionsResponse,
+               &DataSize
+               );
+  return Status;
+}
+
+/**
+  This function is used to retrieve the boot options set by the
+  Set System Boot Options command.
+
+  @param [in]   BootOptionsRequest   Pointer to IPMI_GET_BOOT_OPTIONS_REQUEST.
+  @param [out]  BootOptionsResponse  Pointer to IPMI_GET_BOOT_OPTIONS_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetSystemBootOptions (
+  IN  IPMI_GET_BOOT_OPTIONS_REQUEST   *BootOptionsRequest,
+  OUT IPMI_GET_BOOT_OPTIONS_RESPONSE  *BootOptionsResponse
+  )
+{
+  EFI_STATUS  Status;
+  UINT32      DataSize;
+
+  DataSize = sizeof (*BootOptionsResponse);
+  Status   = IpmiSubmitCommand (
+               IPMI_NETFN_CHASSIS,
+               IPMI_CHASSIS_GET_SYSTEM_BOOT_OPTIONS,
+               (VOID *)BootOptionsRequest,
+               sizeof (*BootOptionsRequest),
+               (VOID *)BootOptionsResponse,
+               &DataSize
+               );
+  return Status;
+}
diff --git a/Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLibNetFnStorage.c b/Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLibNetFnStorage.c
new file mode 100644
index 0000000000..2dbb7ac9ff
--- /dev/null
+++ b/Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLibNetFnStorage.c
@@ -0,0 +1,384 @@
+/** @file
+  IPMI Command - NetFnStorage.
+
+  Copyright (c) 2018 - 2021, Intel Corporation. All rights reserved.<BR>
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+**/
+
+#include <PiPei.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/DebugLib.h>
+#include <Library/IpmiLib.h>
+
+#include <IndustryStandard/Ipmi.h>
+
+/**
+  This function is used to retrieve FRU Inventory Area
+
+  @param [in]  GetFruInventoryAreaInfoRequest   Pointer to IPMI_GET_FRU_INVENTORY_AREA_INFO_REQUEST.
+  @param [out] GetFruInventoryAreaInfoResponse  Pointer to IPMI_GET_FRU_INVENTORY_AREA_INFO_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetFruInventoryAreaInfo (
+  IN  IPMI_GET_FRU_INVENTORY_AREA_INFO_REQUEST   *GetFruInventoryAreaInfoRequest,
+  OUT IPMI_GET_FRU_INVENTORY_AREA_INFO_RESPONSE  *GetFruInventoryAreaInfoResponse
+  )
+{
+  EFI_STATUS  Status;
+  UINT32      DataSize;
+
+  DataSize = sizeof (*GetFruInventoryAreaInfoResponse);
+  Status   = IpmiSubmitCommand (
+               IPMI_NETFN_STORAGE,
+               IPMI_STORAGE_GET_FRU_INVENTORY_AREAINFO,
+               (VOID *)GetFruInventoryAreaInfoRequest,
+               sizeof (*GetFruInventoryAreaInfoRequest),
+               (VOID *)GetFruInventoryAreaInfoResponse,
+               &DataSize
+               );
+  return Status;
+}
+
+/**
+  This function returns specified data from the FRU Inventory Info area.
+
+  @param [in]  ReadFruDataRequest       Pointer to IPMI_READ_FRU_DATA_REQUEST.
+  @param [in]  ReadFruDataResponse      Pointer to IPMI_READ_FRU_DATA_RESPONSE.
+  @param [in, out] ReadFruDataResponseSize  Returns the size of ReadFruDataResponse.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiReadFruData (
+  IN  IPMI_READ_FRU_DATA_REQUEST   *ReadFruDataRequest,
+  OUT IPMI_READ_FRU_DATA_RESPONSE  *ReadFruDataResponse,
+  IN OUT UINT32                    *ReadFruDataResponseSize
+  )
+{
+  EFI_STATUS  Status;
+
+  Status = IpmiSubmitCommand (
+             IPMI_NETFN_STORAGE,
+             IPMI_STORAGE_READ_FRU_DATA,
+             (VOID *)ReadFruDataRequest,
+             sizeof (*ReadFruDataRequest),
+             (VOID *)ReadFruDataResponse,
+             ReadFruDataResponseSize
+             );
+  return Status;
+}
+
+/**
+  This function writes specified data from the FRU Inventory Info area.
+
+  @param [in]  WriteFruDataRequest      Pointer to IPMI_WRITE_FRU_DATA_REQUEST.
+  @param [in]  WriteFruDataRequestSize  Size of WriteFruDataRequest.
+  @param [out] WriteFruDataResponse     Pointer to receive IPMI_WRITE_FRU_DATA_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiWriteFruData (
+  IN  IPMI_WRITE_FRU_DATA_REQUEST   *WriteFruDataRequest,
+  IN  UINT32                        WriteFruDataRequestSize,
+  OUT IPMI_WRITE_FRU_DATA_RESPONSE  *WriteFruDataResponse
+  )
+{
+  EFI_STATUS  Status;
+  UINT32      DataSize;
+
+  DataSize = sizeof (*WriteFruDataResponse);
+  Status   = IpmiSubmitCommand (
+               IPMI_NETFN_STORAGE,
+               IPMI_STORAGE_WRITE_FRU_DATA,
+               (VOID *)WriteFruDataRequest,
+               WriteFruDataRequestSize,
+               (VOID *)WriteFruDataResponse,
+               &DataSize
+               );
+  return Status;
+}
+
+/**
+  This function returns the number of entries in the SEL
+
+  @param [out] GetSelInfoResponse     Pointer to receive IPMI_GET_SEL_INFO_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetSelInfo (
+  OUT IPMI_GET_SEL_INFO_RESPONSE  *GetSelInfoResponse
+  )
+{
+  EFI_STATUS  Status;
+  UINT32      DataSize;
+
+  DataSize = sizeof (*GetSelInfoResponse);
+  Status   = IpmiSubmitCommand (
+               IPMI_NETFN_STORAGE,
+               IPMI_STORAGE_GET_SEL_INFO,
+               NULL,
+               0,
+               (VOID *)GetSelInfoResponse,
+               &DataSize
+               );
+  return Status;
+}
+
+/**
+  This function retrieves entries from the SEL
+
+  @param [in]  GetSelEntryRequest       Pointer to IPMI_GET_SEL_ENTRY_REQUEST.
+  @param [out] GetSelEntryResponse      Pointer to receive IPMI_GET_SEL_ENTRY_RESPONSE.
+  @param [in, out]  GetSelEntryResponseSize  Size of entire GetSelEntryResponse.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetSelEntry (
+  IN IPMI_GET_SEL_ENTRY_REQUEST    *GetSelEntryRequest,
+  OUT IPMI_GET_SEL_ENTRY_RESPONSE  *GetSelEntryResponse,
+  IN OUT UINT32                    *GetSelEntryResponseSize
+  )
+{
+  EFI_STATUS  Status;
+
+  Status = IpmiSubmitCommand (
+             IPMI_NETFN_STORAGE,
+             IPMI_STORAGE_GET_SEL_ENTRY,
+             (VOID *)GetSelEntryRequest,
+             sizeof (*GetSelEntryRequest),
+             (VOID *)GetSelEntryResponse,
+             GetSelEntryResponseSize
+             );
+  return Status;
+}
+
+/**
+  This function adds an entry in the SEL
+
+  @param [in]  AddSelEntryRequest       Pointer to IPMI_ADD_SEL_ENTRY_REQUEST.
+  @param [out] AddSelEntryResponse      Pointer to receive IPMI_ADD_SEL_ENTRY_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiAddSelEntry (
+  IN IPMI_ADD_SEL_ENTRY_REQUEST    *AddSelEntryRequest,
+  OUT IPMI_ADD_SEL_ENTRY_RESPONSE  *AddSelEntryResponse
+  )
+{
+  EFI_STATUS  Status;
+  UINT32      DataSize;
+
+  DataSize = sizeof (*AddSelEntryResponse);
+  Status   = IpmiSubmitCommand (
+               IPMI_NETFN_STORAGE,
+               IPMI_STORAGE_ADD_SEL_ENTRY,
+               (VOID *)AddSelEntryRequest,
+               sizeof (*AddSelEntryRequest),
+               (VOID *)AddSelEntryResponse,
+               &DataSize
+               );
+  return Status;
+}
+
+/**
+  This function adds SEL Entry command that allows the record to be incrementally
+  added to the SEL.
+
+  @param [in]  PartialAddSelEntryRequest       Pointer to IPMI_PARTIAL_ADD_SEL_ENTRY_REQUEST.
+  @param [in]  PartialAddSelEntryRequestSize   Size of entire PartialAddSelEntryRequest.
+  @param [out] PartialAddSelEntryResponse      Pointer to receive IPMI_PARTIAL_ADD_SEL_ENTRY_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiPartialAddSelEntry (
+  IN IPMI_PARTIAL_ADD_SEL_ENTRY_REQUEST    *PartialAddSelEntryRequest,
+  IN UINT32                                PartialAddSelEntryRequestSize,
+  OUT IPMI_PARTIAL_ADD_SEL_ENTRY_RESPONSE  *PartialAddSelEntryResponse
+  )
+{
+  EFI_STATUS  Status;
+  UINT32      DataSize;
+
+  DataSize = sizeof (*PartialAddSelEntryResponse);
+  Status   = IpmiSubmitCommand (
+               IPMI_NETFN_STORAGE,
+               IPMI_STORAGE_PARTIAL_ADD_SEL_ENTRY,
+               (VOID *)PartialAddSelEntryRequest,
+               PartialAddSelEntryRequestSize,
+               (VOID *)PartialAddSelEntryResponse,
+               &DataSize
+               );
+  return Status;
+}
+
+/**
+  This function erases all contents of the System Event Log.
+
+  @param [in]  ClearSelRequest       Pointer to IPMI_CLEAR_SEL_REQUEST.
+  @param [out] ClearSelResponse      Pointer to receive IPMI_CLEAR_SEL_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiClearSel (
+  IN IPMI_CLEAR_SEL_REQUEST    *ClearSelRequest,
+  OUT IPMI_CLEAR_SEL_RESPONSE  *ClearSelResponse
+  )
+{
+  EFI_STATUS  Status;
+  UINT32      DataSize;
+
+  DataSize = sizeof (*ClearSelResponse);
+  Status   = IpmiSubmitCommand (
+               IPMI_NETFN_STORAGE,
+               IPMI_STORAGE_CLEAR_SEL,
+               (VOID *)ClearSelRequest,
+               sizeof (*ClearSelRequest),
+               (VOID *)ClearSelResponse,
+               &DataSize
+               );
+  return Status;
+}
+
+/**
+  This function returns the time from the SEL Device.
+
+  @param [out]  GetSelTimeResponse       Pointer to IPMI_GET_SEL_TIME_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetSelTime (
+  OUT IPMI_GET_SEL_TIME_RESPONSE  *GetSelTimeResponse
+  )
+{
+  EFI_STATUS  Status;
+  UINT32      DataSize;
+
+  DataSize = sizeof (*GetSelTimeResponse);
+  Status   = IpmiSubmitCommand (
+               IPMI_NETFN_STORAGE,
+               IPMI_STORAGE_GET_SEL_TIME,
+               NULL,
+               0,
+               (VOID *)GetSelTimeResponse,
+               &DataSize
+               );
+  return Status;
+}
+
+/**
+  This function set the time in the SEL Device.
+
+  @param [in]  SetSelTimeRequest       Pointer to IPMI_SET_SEL_TIME_REQUEST.
+  @param [out] CompletionCode         IPMI completetion code, refer to Ipmi.h.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiSetSelTime (
+  IN IPMI_SET_SEL_TIME_REQUEST  *SetSelTimeRequest,
+  OUT UINT8                     *CompletionCode
+  )
+{
+  EFI_STATUS  Status;
+  UINT32      DataSize;
+
+  DataSize = sizeof (*CompletionCode);
+  Status   = IpmiSubmitCommand (
+               IPMI_NETFN_STORAGE,
+               IPMI_STORAGE_SET_SEL_TIME,
+               (VOID *)SetSelTimeRequest,
+               sizeof (*SetSelTimeRequest),
+               (VOID *)CompletionCode,
+               &DataSize
+               );
+  return Status;
+}
+
+/**
+  This function returns the SDR command version for the SDR Repository
+
+  @param [out] ClearSelResponse      Pointer to receive IPMI_GET_SDR_REPOSITORY_INFO_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetSdrRepositoryInfo (
+  OUT IPMI_GET_SDR_REPOSITORY_INFO_RESPONSE  *GetSdrRepositoryInfoResp
+  )
+{
+  EFI_STATUS  Status;
+  UINT32      DataSize;
+
+  DataSize = sizeof (*GetSdrRepositoryInfoResp);
+  Status   = IpmiSubmitCommand (
+               IPMI_NETFN_STORAGE,
+               IPMI_STORAGE_GET_SDR_REPOSITORY_INFO,
+               NULL,
+               0,
+               (VOID *)GetSdrRepositoryInfoResp,
+               &DataSize
+               );
+  return Status;
+}
+
+/**
+  This function returns the sensor record specified by Record ID.
+
+  @param [in]  GetSdrRequest       Pointer to IPMI_GET_SDR_REQUEST.
+  @param [out] GetSdrResponse      Pointer to receive IPMI_GET_SDR_RESPONSE.
+  @param [in, out]  GetSdrResponseSize  Size of entire GetSdrResponse.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetSdr (
+  IN  IPMI_GET_SDR_REQUEST   *GetSdrRequest,
+  OUT IPMI_GET_SDR_RESPONSE  *GetSdrResponse,
+  IN OUT UINT32              *GetSdrResponseSize
+  )
+{
+  EFI_STATUS  Status;
+
+  Status = IpmiSubmitCommand (
+             IPMI_NETFN_STORAGE,
+             IPMI_STORAGE_GET_SDR,
+             (VOID *)GetSdrRequest,
+             sizeof (*GetSdrRequest),
+             (VOID *)GetSdrResponse,
+             GetSdrResponseSize
+             );
+  return Status;
+}
diff --git a/Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLibNetFnTransport.c b/Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLibNetFnTransport.c
new file mode 100644
index 0000000000..a93f7406f1
--- /dev/null
+++ b/Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLibNetFnTransport.c
@@ -0,0 +1,156 @@
+/** @file
+  IPMI Command - NetFnTransport.
+
+  Copyright (c) 2018 - 2021, Intel Corporation. All rights reserved.<BR>
+  Copyright (C) 2023 Advanced Micro Devices, Inc. All rights reserved.<BR>
+
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+**/
+
+#include <PiPei.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/DebugLib.h>
+#include <Library/IpmiLib.h>
+
+#include <IndustryStandard/Ipmi.h>
+
+/**
+  This function sends command to BMC to notify a remote application
+  that a SOL payload is activating on another channel.
+
+  @param [in]   SolActivatingRequest  The get channel information request.
+  @param [out]  CompletionCode        IPMI completetion code, refer to Ipmi.h.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiSolActivating (
+  IN  IPMI_SOL_ACTIVATING_REQUEST  *SolActivatingRequest,
+  OUT UINT8                        *CompletionCode
+  )
+{
+  EFI_STATUS  Status;
+  UINT32      DataSize;
+
+  DataSize = sizeof (*CompletionCode);
+  Status   = IpmiSubmitCommand (
+               IPMI_NETFN_TRANSPORT,
+               IPMI_TRANSPORT_SOL_ACTIVATING,
+               (VOID *)SolActivatingRequest,
+               sizeof (*SolActivatingRequest),
+               (VOID *)CompletionCode,
+               &DataSize
+               );
+  return Status;
+}
+
+/**
+  This function is used to set parameters such as the network addressing
+  information required for SOL payload operation.
+
+  @param [in]   SetConfigurationParametersRequest      Pointer to IPMI_SET_SOL_CONFIGURATION_PARAMETERS_REQUEST.
+  @param [in]   SetConfigurationParametersRequestSize  Size of entire SetConfigurationParametersRequestSize.
+  @param [out]  CompletionCode                         IPMI completetion code, refer to Ipmi.h.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiSetSolConfigurationParameters (
+  IN  IPMI_SET_SOL_CONFIGURATION_PARAMETERS_REQUEST  *SetConfigurationParametersRequest,
+  IN  UINT32                                         SetConfigurationParametersRequestSize,
+  OUT UINT8                                          *CompletionCode
+  )
+{
+  EFI_STATUS  Status;
+  UINT32      DataSize;
+
+  DataSize = sizeof (*CompletionCode);
+  Status   = IpmiSubmitCommand (
+               IPMI_NETFN_TRANSPORT,
+               IPMI_TRANSPORT_SET_SOL_CONFIG_PARAM,
+               (VOID *)SetConfigurationParametersRequest,
+               SetConfigurationParametersRequestSize,
+               (VOID *)CompletionCode,
+               &DataSize
+               );
+  return Status;
+}
+
+/**
+  This function is used to retrieve the configuration parameters from the
+  Set SOL Configuration Parameters.
+
+  @param [in]       GetConfigurationParametersRequest       Pointer to IPMI_SET_SOL_CONFIGURATION_PARAMETERS_REQUEST.
+  @param [out]      GetConfigurationParametersResponse      Pointer to receive IPMI_GET_SOL_CONFIGURATION_PARAMETERS_RESPONSE
+  @param [in, out]  GetConfigurationParametersResponseSize  When in, which is the expected size of
+                                                            response. When out, which is the actual
+                                                            size returned.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetSolConfigurationParameters (
+  IN  IPMI_GET_SOL_CONFIGURATION_PARAMETERS_REQUEST   *GetConfigurationParametersRequest,
+  OUT IPMI_GET_SOL_CONFIGURATION_PARAMETERS_RESPONSE  *GetConfigurationParametersResponse,
+  IN OUT UINT32                                       *GetConfigurationParametersResponseSize
+  )
+{
+  EFI_STATUS  Status;
+
+  Status = IpmiSubmitCommand (
+             IPMI_NETFN_TRANSPORT,
+             IPMI_TRANSPORT_GET_SOL_CONFIG_PARAM,
+             (VOID *)GetConfigurationParametersRequest,
+             sizeof (*GetConfigurationParametersRequest),
+             (VOID *)GetConfigurationParametersResponse,
+             GetConfigurationParametersResponseSize
+             );
+  return Status;
+}
+
+/**
+  This function gets the LAN configuration parameter.
+
+  @param[in]      GetLanConfigurationParametersRequest   Request data
+  @param[out]     GetLanConfigurationParametersResponse  Response data
+  @param[in,out]  GetLanConfigurationParametersSize      When input, the expected size of response data.
+                                                         When out, the exact  size of response data.
+
+  @retval EFI_SUCCESS            Lan configuration parameter is returned in the response.
+  @retval EFI_INVALID_PARAMETER  One of the given input parameters is invalid.
+  @retval Others                 Other errors.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetLanConfigurationParameters (
+  IN     IPMI_GET_LAN_CONFIGURATION_PARAMETERS_REQUEST   *GetLanConfigurationParametersRequest,
+  OUT    IPMI_GET_LAN_CONFIGURATION_PARAMETERS_RESPONSE  *GetLanConfigurationParametersResponse,
+  IN OUT UINT32                                          *GetLanConfigurationParametersSize
+  )
+{
+  EFI_STATUS  Status;
+
+  if ((GetLanConfigurationParametersRequest == NULL) ||
+      (GetLanConfigurationParametersResponse == NULL) ||
+      (GetLanConfigurationParametersSize == NULL))
+  {
+    return EFI_INVALID_PARAMETER;
+  }
+
+  Status = IpmiSubmitCommand (
+             IPMI_NETFN_TRANSPORT,
+             IPMI_TRANSPORT_GET_LAN_CONFIG_PARAMETERS,
+             (UINT8 *)GetLanConfigurationParametersRequest,
+             sizeof (*GetLanConfigurationParametersRequest),
+             (UINT8 *)GetLanConfigurationParametersResponse,
+             GetLanConfigurationParametersSize
+             );
+  return Status;
+}
-- 
2.37.1.windows.1







^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [edk2-devel] [edk2-platforms][PATCH] ManageabilityPkg/IpmiCommandLib:IPMI Command Library
  2023-05-08 21:19 ` [edk2-devel] [edk2-platforms][PATCH] ManageabilityPkg/IpmiCommandLib:IPMI Command Library Isaac Oram
@ 2023-05-09  6:36   ` Chang, Abner
  0 siblings, 0 replies; 8+ messages in thread
From: Chang, Abner @ 2023-05-09  6:36 UTC (permalink / raw)
  To: Oram, Isaac W, devel@edk2.groups.io
  Cc: Attar, AbdulLateef (Abdul Lateef), Nickle Wang, Tinh Nguyen

[AMD Official Use Only - General]

Thanks, I will correct it before pushing it to edk2-platform.
Abner

> -----Original Message-----
> From: Oram, Isaac W <isaac.w.oram@intel.com>
> Sent: Tuesday, May 9, 2023 5:19 AM
> To: devel@edk2.groups.io; Chang, Abner <Abner.Chang@amd.com>
> Cc: Attar, AbdulLateef (Abdul Lateef) <AbdulLateef.Attar@amd.com>; Nickle
> Wang <nicklew@nvidia.com>; Tinh Nguyen
> <tinhnguyen@os.amperecomputing.com>
> Subject: RE: [edk2-devel] [edk2-platforms][PATCH]
> ManageabilityPkg/IpmiCommandLib:IPMI Command Library
> 
> Caution: This message originated from an External Source. Use proper
> caution when opening attachments, clicking links, or responding.
> 
> 
> Reviewed-by:  Isaac Oram <isaac.w.oram@intel.com>
> 
> 
> A few superficial things that could be fixed now or later.
> 
> Typo:  EFI_STASTUS
> 
> There is a mismatch between function names and parameter names that
> looks like a cut/paste from prior function.  Updating would probably match
> the spirit of "no functional changes", but it is your choice to correct.
> IpmiSetPowerRestorePolicy (
>   IN  IPMI_SET_POWER_RESTORE_POLICY_REQUEST
> *ChassisControlRequest,
>   OUT IPMI_SET_POWER_RESTORE_POLICY_RESPONSE
> *ChassisControlResponse
>   )
> 
> -----Original Message-----
> From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Chang,
> Abner via groups.io
> Sent: Thursday, May 4, 2023 10:24 PM
> To: devel@edk2.groups.io
> Cc: Oram, Isaac W <isaac.w.oram@intel.com>; Abdul Lateef Attar
> <abdattar@amd.com>; Nickle Wang <nicklew@nvidia.com>; Tinh Nguyen
> <tinhnguyen@os.amperecomputing.com>
> Subject: [edk2-devel] [edk2-platforms][PATCH]
> ManageabilityPkg/IpmiCommandLib:IPMI Command Library
> 
> From: Abner Chang <abner.chang@amd.com>
> 
> BZ #: 4444
> 
> IpmiCommandLib is cloned from
> edk2-platforms/Features/Intel/OutOfBandManagement/
> IpmiFeaturePkg/Library/IpmiCommandLib in order to
> consolidate edk2 system manageability support in
> one place. Function header are added to the source
> files and header files. Uncustify is applied to C
> files and no functionalities are changed in this patch.
> 
> We will still keep the one under IpmiFeaturePkg/Library/
> IpmiCommandLib until the reference to this instance are
> removed from platforms.
> 
> Signed-off-by: Abner Chang <abner.chang@amd.com>
> Cc: Isaac Oram <isaac.w.oram@intel.com>
> Cc: Abdul Lateef Attar <abdattar@amd.com>
> Cc: Nickle Wang <nicklew@nvidia.com>
> Cc: Tinh Nguyen <tinhnguyen@os.amperecomputing.com>
> ---
>  .../Library/IpmiCommandLib/IpmiCommandLib.inf |  33 +
>  .../Include/Library/IpmiCommandLib.h          | 620 ++++++++++++++++++
>  .../IpmiCommandLib/IpmiCommandLibNetFnApp.c   | 444 +++++++++++++
>  .../IpmiCommandLibNetFnChassis.c              | 199 ++++++
>  .../IpmiCommandLibNetFnStorage.c              | 384 +++++++++++
>  .../IpmiCommandLibNetFnTransport.c            | 156 +++++
>  6 files changed, 1836 insertions(+)
>  create mode 100644
> Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLib.inf
>  create mode 100644
> Features/ManageabilityPkg/Include/Library/IpmiCommandLib.h
>  create mode 100644
> Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLibNet
> FnApp.c
>  create mode 100644
> Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLibNet
> FnChassis.c
>  create mode 100644
> Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLibNet
> FnStorage.c
>  create mode 100644
> Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLibNet
> FnTransport.c
> 
> diff --git
> a/Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLib.in
> f
> b/Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLib.in
> f
> new file mode 100644
> index 0000000000..3dc485cf38
> --- /dev/null
> +++
> b/Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLib.in
> f
> @@ -0,0 +1,33 @@
> +### @file
> +# Component description file for IPMI Command Library.
> +#
> +# Copyright (c) 2018 - 2021, Intel Corporation. All rights reserved.<BR>
> +# Copyright (C) 2023 Advanced Micro Devices, Inc. All rights reserved.<BR>
> +#
> +# SPDX-License-Identifier: BSD-2-Clause-Patent
> +#
> +###
> +
> +[Defines]
> +  INF_VERSION                    = 0x00010005
> +  BASE_NAME                      = IpmiCommandLib
> +  FILE_GUID                      = 96FC1989-CB7F-489B-9D3B-68DCA2C2DADC
> +  MODULE_TYPE                    = UEFI_DRIVER
> +  VERSION_STRING                 = 1.0
> +  LIBRARY_CLASS                  = IpmiCommandLib
> +
> +[sources]
> +  IpmiCommandLibNetFnApp.c
> +  IpmiCommandLibNetFnTransport.c
> +  IpmiCommandLibNetFnChassis.c
> +  IpmiCommandLibNetFnStorage.c
> +
> +[Packages]
> +  MdePkg/MdePkg.dec
> +  MdeModulePkg/MdeModulePkg.dec
> +  ManageabilityPkg/ManageabilityPkg.dec
> +
> +[LibraryClasses]
> +  BaseMemoryLib
> +  DebugLib
> +  IpmiLib
> diff --git a/Features/ManageabilityPkg/Include/Library/IpmiCommandLib.h
> b/Features/ManageabilityPkg/Include/Library/IpmiCommandLib.h
> new file mode 100644
> index 0000000000..685f6e2ea2
> --- /dev/null
> +++ b/Features/ManageabilityPkg/Include/Library/IpmiCommandLib.h
> @@ -0,0 +1,620 @@
> +/** @file
> +  This library abstract how to send/receive IPMI command.
> +
> +Copyright (c) 2018-2021, Intel Corporation. All rights reserved.<BR>
> +Copyright (C) 2023 Advanced Micro Devices, Inc. All rights reserved.<BR>
> +
> +SPDX-License-Identifier: BSD-2-Clause-Patent
> +
> +**/
> +
> +#ifndef IPMI_COMMAND_LIB_H_
> +#define IPMI_COMMAND_LIB_H_
> +
> +#include <Uefi.h>
> +#include <IndustryStandard/Ipmi.h>
> +
> +///
> +/// Functions for IPMI NetFnApp commands
> +///
> +
> +/**
> +  This function is used to retrieve device ID.
> +
> +  @param [out]  DeviceId  The pointer to receive
> IPMI_GET_DEVICE_ID_RESPONSE.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiGetDeviceId (
> +  OUT IPMI_GET_DEVICE_ID_RESPONSE  *DeviceId
> +  );
> +
> +/**
> +  This function returns device self test results
> +
> +  @param [out]  SelfTestResult  The pointer to receive
> IPMI_SELF_TEST_RESULT_RESPONSE.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiGetSelfTestResult (
> +  OUT IPMI_SELF_TEST_RESULT_RESPONSE  *SelfTestResult
> +  );
> +
> +/**
> +  This function is used for starting and restarting the Watchdog
> +  Timer from the initial countdown value that was specified in
> +  the Set Watchdog Timer command the watchdog timer.
> +
> +  @param [out]  CompletionCode  IPMI completetion code, refer to Ipmi.h.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiResetWatchdogTimer (
> +  OUT UINT8  *CompletionCode
> +  );
> +
> +/**
> +  This function  is used for initializing and configuring
> +  the watchdog timer.
> +
> +  @param [in]   SetWatchdogTimer  Pointer to receive
> IPMI_SET_WATCHDOG_TIMER_REQUEST.
> +  @param [out]  CompletionCode    IPMI completetion code, refer to Ipmi.h.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiSetWatchdogTimer (
> +  IN  IPMI_SET_WATCHDOG_TIMER_REQUEST  *SetWatchdogTimer,
> +  OUT UINT8                            *CompletionCode
> +  );
> +
> +/**
> +  This function retrieves the current settings and present
> +  countdown of the watchdog timer.
> +
> +  @param [out]  GetWatchdogTimer  Pointer to receive
> IPMI_GET_WATCHDOG_TIMER_RESPONSE.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiGetWatchdogTimer (
> +  OUT IPMI_GET_WATCHDOG_TIMER_RESPONSE  *GetWatchdogTimer
> +  );
> +
> +/**
> +  This function enables message reception into Message Buffers,
> +  and any interrupt associated with that buffer getting full.
> +
> +  @param [in]   SetBmcGlobalEnables  Pointer receive to
> IPMI_SET_BMC_GLOBAL_ENABLES_REQUEST.
> +  @param [out]  CompletionCode       IPMI completetion code, refer to
> Ipmi.h.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiSetBmcGlobalEnables (
> +  IN  IPMI_SET_BMC_GLOBAL_ENABLES_REQUEST  *SetBmcGlobalEnables,
> +  OUT UINT8                                *CompletionCode
> +  );
> +
> +/**
> +  This function retrieves the present setting of the Global Enables
> +
> +  @param [out]  GetBmcGlobalEnables  Pointer to receive
> IPMI_GET_BMC_GLOBAL_ENABLES_RESPONSE.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiGetBmcGlobalEnables (
> +  OUT IPMI_GET_BMC_GLOBAL_ENABLES_RESPONSE
> *GetBmcGlobalEnables
> +  );
> +
> +/**
> +  This function is used to flush unread data from the Receive
> +  Message Queue or Event Message Buffer
> +
> +  @param [in]   ClearMessageFlagsRequest
> IPMI_CLEAR_MESSAGE_FLAGS_REQUEST
> +  @param [out]  CompletionCode           IPMI completetion code, refer to
> Ipmi.h.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiClearMessageFlags (
> +  IN  IPMI_CLEAR_MESSAGE_FLAGS_REQUEST  *ClearMessageFlagsRequest,
> +  OUT UINT8                             *CompletionCode
> +  );
> +
> +/**
> +  This function is used to retrieve the present message available states.
> +
> +  @param [out]  GetMessageFlagsResponse  Pointer to receive
> IPMI_GET_MESSAGE_FLAGS_RESPONSE
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiGetMessageFlags (
> +  OUT IPMI_GET_MESSAGE_FLAGS_RESPONSE
> *GetMessageFlagsResponse
> +  );
> +
> +/**
> +  This function is used to get data from the Receive Message Queue.
> +
> +  @param [out]      GetMessageResponse      Pointer to receive
> IPMI_GET_MESSAGE_RESPONSE.
> +  @param [in, out]  GetMessageResponseSize  When in, which is the
> expected size of
> +                                            response. When out, which is the actual
> +                                            size returned.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiGetMessage (
> +  OUT IPMI_GET_MESSAGE_RESPONSE  *GetMessageResponse,
> +  IN OUT UINT32                  *GetMessageResponseSize
> +  );
> +
> +/**
> +  This function is used for bridging IPMI messages between channels,
> +  and between the system management software (SMS) and a given
> channel
> +
> +  @param [in]   SendMessageRequest       Pointer to
> IPMI_SEND_MESSAGE_REQUEST.
> +  @param [in]   SendMessageRequestSize   Size of entire
> SendMessageRequestSize.
> +  @param [out]  SendMessageResponse      Pointer to receive
> IPMI_SEND_MESSAGE_RESPONSE.
> +  @param [in]   SendMessageResponseSize  When in, which is the expected
> size of
> +                                         response. When out, which is the actual
> +                                         size returned.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiSendMessage (
> +  IN  IPMI_SEND_MESSAGE_REQUEST   *SendMessageRequest,
> +  IN  UINT32                      SendMessageRequestSize,
> +  OUT IPMI_SEND_MESSAGE_RESPONSE  *SendMessageResponse,
> +  IN OUT UINT32                   *SendMessageResponseSize
> +  );
> +
> +/**
> +  This function gets the system UUID.
> +
> +  @param [out]  SystemGuid   The pointer to retrieve system UUID.
> +
> +  @retval EFI_SUCCESS               UUID is returned.
> +  @retval EFI_INVALID_PARAMETER     SystemGuid is a NULL pointer.
> +  @retval Others                    See return value of IpmiSubmitCommand ()
> function.
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiGetSystemUuid (
> +  OUT EFI_GUID  *SystemGuid
> +  );
> +
> +/**
> +  This function gets the channel information.
> +
> +  @param [in]   GetChannelInfoRequest       The get channel information
> request.
> +  @param [out]  GetChannelInfoResponse      The get channel information
> response.
> +  @param [out]  GetChannelInfoResponseSize  When input, the expected
> size of response.
> +                                            When output, the exact size of the returned
> +                                            response.
> +
> +  @retval EFI_SUCCESS            Get channel information successfully.
> +  @retval EFI_INVALID_PARAMETER  One of the given input parameters is
> invalid.
> +  @retval Others                 See return value of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiGetChannelInfo (
> +  IN  IPMI_GET_CHANNEL_INFO_REQUEST   *GetChannelInfoRequest,
> +  OUT IPMI_GET_CHANNEL_INFO_RESPONSE  *GetChannelInfoResponse,
> +  OUT UINT32                          *GetChannelInfoResponseSize
> +  );
> +
> +///
> +/// Functions for IPMI NetFnTransport commands.
> +///
> +
> +/**
> +  This function sends command to BMC to notify a remote application
> +  that a SOL payload is activating on another channel.
> +
> +  @param [in]   SolActivatingRequest  Pointer to
> IPMI_SOL_ACTIVATING_REQUEST.
> +  @param [out]  CompletionCode        IPMI completetion code, refer to
> Ipmi.h.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiSolActivating (
> +  IN  IPMI_SOL_ACTIVATING_REQUEST  *SolActivatingRequest,
> +  OUT UINT8                        *CompletionCode
> +  );
> +
> +/**
> +  This function is used to set parameters such as the network addressing
> +  information required for SOL payload operation.
> +
> +  @param [in]  SetConfigurationParametersRequest      Pointer to
> IPMI_SET_SOL_CONFIGURATION_PARAMETERS_REQUEST.
> +  @param [in]  SetConfigurationParametersRequestSize  Size of entire
> SetConfigurationParametersRequestSize.
> +  @param [out] CompletionCode                         IPMI completetion code, refer
> to Ipmi.h.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiSetSolConfigurationParameters (
> +  IN  IPMI_SET_SOL_CONFIGURATION_PARAMETERS_REQUEST
> *SetConfigurationParametersRequest,
> +  IN  UINT32                                         SetConfigurationParametersRequestSize,
> +  OUT UINT8                                          *CompletionCode
> +  );
> +
> +/**
> +  This function is used to retrieve the configuration parameters from the
> +  Set SOL Configuration Parameters.
> +
> +  @param [in]       GetConfigurationParametersRequest       Pointer to
> IPMI_SET_SOL_CONFIGURATION_PARAMETERS_REQUEST.
> +  @param [out]      GetConfigurationParametersResponse      Pointer to
> receive IPMI_GET_SOL_CONFIGURATION_PARAMETERS_RESPONSE.
> +  @param [in, out]  GetConfigurationParametersResponseSize  When in,
> which is the expected size of
> +                                                            response. When out, which is the actual
> +                                                            size returned.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiGetSolConfigurationParameters (
> +  IN  IPMI_GET_SOL_CONFIGURATION_PARAMETERS_REQUEST
> *GetConfigurationParametersRequest,
> +  OUT IPMI_GET_SOL_CONFIGURATION_PARAMETERS_RESPONSE
> *GetConfigurationParametersResponse,
> +  IN OUT UINT32
> *GetConfigurationParametersResponseSize
> +  );
> +
> +/**
> +  This function gets the LAN configuration parameter.
> +
> +  @param[in]      GetLanConfigurationParametersRequest   Request data
> +  @param[out]     GetLanConfigurationParametersResponse  Response data
> +  @param[in,out]  GetLanConfigurationParametersSize      When input, the
> expected size of response data.
> +                                                         When out, the exact size of response data.
> +
> +  @retval EFI_SUCCESS            Lan configuration parameter is returned in the
> response.
> +  @retval EFI_INVALID_PARAMETER  One of the given input parameters is
> invalid.
> +  @retval Others                 Other errors.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiGetLanConfigurationParameters (
> +  IN     IPMI_GET_LAN_CONFIGURATION_PARAMETERS_REQUEST
> *GetLanConfigurationParametersRequest,
> +  OUT    IPMI_GET_LAN_CONFIGURATION_PARAMETERS_RESPONSE
> *GetLanConfigurationParametersResponse,
> +  IN OUT UINT32                                          *GetLanConfigurationParametersSize
> +  );
> +
> +///
> +/// Functions for IPMI NetFnChasis commands
> +///
> +
> +/**
> +  This function returns information about which main chassis management
> functions are
> +  present and  what addresses are used to access those functions.
> +
> +  @param [out]  GetChassisCapabilitiesResponse  Pointer to
> IPMI_GET_CHASSIS_CAPABILITIES_RESPONSE.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiGetChassisCapabilities (
> +  OUT IPMI_GET_CHASSIS_CAPABILITIES_RESPONSE
> *GetChassisCapabilitiesResponse
> +  );
> +
> +/**
> +  This function gets  information regarding the high-level status of the
> system
> +  chassis and main power subsystem.
> +
> +  @param [out]  GetChassisStatusResponse  Pointer to
> IPMI_GET_CHASSIS_STATUS_RESPONSE.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiGetChassisStatus (
> +  OUT IPMI_GET_CHASSIS_STATUS_RESPONSE  *GetChassisStatusResponse
> +  );
> +
> +/**
> +  This function sends command to control power up, power down, and reset.
> +
> +  @param [in]   ChassisControlRequest  Pointer to
> IPMI_CHASSIS_CONTROL_REQUEST.
> +  @param [out]  CompletionCode         IPMI completetion code, refer to
> Ipmi.h.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiChassisControl (
> +  IN IPMI_CHASSIS_CONTROL_REQUEST  *ChassisControlRequest,
> +  OUT UINT8                        *CompletionCode
> +  );
> +
> +/**
> +  This function is used to configure the power restore policy.
> +
> +  @param [in]   ChassisControlRequest   Pointer to
> IPMI_SET_POWER_RESTORE_POLICY_REQUEST.
> +  @param [out]  ChassisControlResponse  Pointer to
> IPMI_SET_POWER_RESTORE_POLICY_RESPONSE.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiSetPowerRestorePolicy (
> +  IN  IPMI_SET_POWER_RESTORE_POLICY_REQUEST
> *ChassisControlRequest,
> +  OUT IPMI_SET_POWER_RESTORE_POLICY_RESPONSE
> *ChassisControlResponse
> +  );
> +
> +/**
> +  This function is used to set parameters that direct the system boot
> +  following a system power up or reset.
> +
> +  @param [in]   BootOptionsRequest   Pointer to
> IPMI_SET_BOOT_OPTIONS_REQUEST.
> +  @param [out]  BootOptionsResponse  Pointer to
> IPMI_SET_BOOT_OPTIONS_RESPONSE.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiSetSystemBootOptions (
> +  IN  IPMI_SET_BOOT_OPTIONS_REQUEST   *BootOptionsRequest,
> +  OUT IPMI_SET_BOOT_OPTIONS_RESPONSE  *BootOptionsResponse
> +  );
> +
> +/**
> +  This function is used to retrieve the boot options set by the
> +  Set System Boot Options command.
> +
> +  @param [in]   BootOptionsRequest   Pointer to
> IPMI_GET_BOOT_OPTIONS_REQUEST.
> +  @param [out]  BootOptionsResponse  Pointer to
> IPMI_GET_BOOT_OPTIONS_RESPONSE.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiGetSystemBootOptions (
> +  IN  IPMI_GET_BOOT_OPTIONS_REQUEST   *BootOptionsRequest,
> +  OUT IPMI_GET_BOOT_OPTIONS_RESPONSE  *BootOptionsResponse
> +  );
> +
> +///
> +/// Functions for IPMI NetFnStorage commands
> +///
> +
> +/**
> +  This function is used to retrieve FRU Inventory Area
> +
> +  @param [in]   GetFruInventoryAreaInfoRequest   Pointer to
> IPMI_GET_FRU_INVENTORY_AREA_INFO_REQUEST.
> +  @param [out]  GetFruInventoryAreaInfoResponse  Pointer to
> IPMI_GET_FRU_INVENTORY_AREA_INFO_RESPONSE.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiGetFruInventoryAreaInfo (
> +  IN  IPMI_GET_FRU_INVENTORY_AREA_INFO_REQUEST
> *GetFruInventoryAreaInfoRequest,
> +  OUT IPMI_GET_FRU_INVENTORY_AREA_INFO_RESPONSE
> *GetFruInventoryAreaInfoResponse
> +  );
> +
> +/**
> +  This function returns specified data from the FRU Inventory Info area.
> +
> +  @param [in]       ReadFruDataRequest       Pointer to
> IPMI_READ_FRU_DATA_REQUEST.
> +  @param [out]      ReadFruDataResponse      Pointer to
> IPMI_READ_FRU_DATA_RESPONSE.
> +  @param [in, out]  ReadFruDataResponseSize  Returns the size of
> ReadFruDataResponse.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiReadFruData (
> +  IN  IPMI_READ_FRU_DATA_REQUEST   *ReadFruDataRequest,
> +  OUT IPMI_READ_FRU_DATA_RESPONSE  *ReadFruDataResponse,
> +  IN OUT UINT32                    *ReadFruDataResponseSize
> +  );
> +
> +/**
> +  This function writes specified data from the FRU Inventory Info area.
> +
> +  @param [in]   WriteFruDataRequest      Pointer to
> IPMI_WRITE_FRU_DATA_REQUEST.
> +  @param [in]   WriteFruDataRequestSize  Size of WriteFruDataRequest.
> +  @param [out]  WriteFruDataResponse     Pointer to receive
> IPMI_WRITE_FRU_DATA_RESPONSE.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiWriteFruData (
> +  IN  IPMI_WRITE_FRU_DATA_REQUEST   *WriteFruDataRequest,
> +  IN  UINT32                        WriteFruDataRequestSize,
> +  OUT IPMI_WRITE_FRU_DATA_RESPONSE  *WriteFruDataResponse
> +  );
> +
> +/**
> +  This function returns the number of entries in the SEL
> +
> +  @param [out] GetSelInfoResponse     Pointer to receive
> IPMI_GET_SEL_INFO_RESPONSE.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiGetSelInfo (
> +  OUT IPMI_GET_SEL_INFO_RESPONSE  *GetSelInfoResponse
> +  );
> +
> +/**
> +  This function retrieves entries from the SEL
> +
> +  @param [in]   GetSelEntryRequest       Pointer to
> IPMI_GET_SEL_ENTRY_REQUEST.
> +  @param [out]  GetSelEntryResponse      Pointer to receive
> IPMI_GET_SEL_ENTRY_RESPONSE.
> +  @param [in]   GetSelEntryResponseSize  Size of entire
> GetSelEntryResponse.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiGetSelEntry (
> +  IN IPMI_GET_SEL_ENTRY_REQUEST    *GetSelEntryRequest,
> +  OUT IPMI_GET_SEL_ENTRY_RESPONSE  *GetSelEntryResponse,
> +  IN OUT UINT32                    *GetSelEntryResponseSize
> +  );
> +
> +/**
> +  This function adds an entry in the SEL
> +
> +  @param [in]   AddSelEntryRequest   Pointer to
> IPMI_ADD_SEL_ENTRY_REQUEST.
> +  @param [out]  AddSelEntryResponse  Pointer to receive
> IPMI_ADD_SEL_ENTRY_RESPONSE.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiAddSelEntry (
> +  IN IPMI_ADD_SEL_ENTRY_REQUEST    *AddSelEntryRequest,
> +  OUT IPMI_ADD_SEL_ENTRY_RESPONSE  *AddSelEntryResponse
> +  );
> +
> +/**
> +  This function adds SEL Entry command that allows the record to be
> incrementally
> +  added to the SEL.
> +
> +  @param [in]  PartialAddSelEntryRequest      Pointer to
> IPMI_PARTIAL_ADD_SEL_ENTRY_REQUEST.
> +  @param [in]  PartialAddSelEntryRequestSize  Size of entire
> PartialAddSelEntryRequest.
> +  @param [out] PartialAddSelEntryResponse     Pointer to receive
> IPMI_PARTIAL_ADD_SEL_ENTRY_RESPONSE.
> +
> +  @retval EFI_STASTUS   See return value of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiPartialAddSelEntry (
> +  IN IPMI_PARTIAL_ADD_SEL_ENTRY_REQUEST
> *PartialAddSelEntryRequest,
> +  IN UINT32                                PartialAddSelEntryRequestSize,
> +  OUT IPMI_PARTIAL_ADD_SEL_ENTRY_RESPONSE
> *PartialAddSelEntryResponse
> +  );
> +
> +/**
> +  This function erases all contents of the System Event Log.
> +
> +  @param [in]   ClearSelRequest   Pointer to IPMI_CLEAR_SEL_REQUEST.
> +  @param [out]  ClearSelResponse  Pointer to receive
> IPMI_CLEAR_SEL_RESPONSE.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiClearSel (
> +  IN IPMI_CLEAR_SEL_REQUEST    *ClearSelRequest,
> +  OUT IPMI_CLEAR_SEL_RESPONSE  *ClearSelResponse
> +  );
> +
> +/**
> +  This function returns the time from the SEL Device.
> +
> +  @param [out]  GetSelTimeResponse  Pointer to
> IPMI_GET_SEL_TIME_RESPONSE.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiGetSelTime (
> +  OUT IPMI_GET_SEL_TIME_RESPONSE  *GetSelTimeResponse
> +  );
> +
> +/**
> +  This function set the time in the SEL Device.
> +
> +  @param [in]   SetSelTimeRequest  Pointer to
> IPMI_SET_SEL_TIME_REQUEST.
> +  @param [out]  CompletionCode     IPMI completetion code, refer to Ipmi.h.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiSetSelTime (
> +  IN IPMI_SET_SEL_TIME_REQUEST  *SetSelTimeRequest,
> +  OUT UINT8                     *CompletionCode
> +  );
> +
> +/**
> +  This function returns the SDR command version for the SDR Repository.
> +
> +  @param [out]  ClearSelResponse  Pointer to receive
> IPMI_GET_SDR_REPOSITORY_INFO_RESPONSE.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiGetSdrRepositoryInfo (
> +  OUT IPMI_GET_SDR_REPOSITORY_INFO_RESPONSE
> *GetSdrRepositoryInfoResp
> +  );
> +
> +/**
> +  This function returns the sensor record specified by Record ID.
> +
> +  @param [in]       GetSdrRequest       Pointer to IPMI_GET_SDR_REQUEST.
> +  @param [out]      GetSdrResponse      Pointer to receive
> IPMI_GET_SDR_RESPONSE.
> +  @param [in, out]  GetSdrResponseSize  Size of entire GetSdrResponse.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiGetSdr (
> +  IN  IPMI_GET_SDR_REQUEST   *GetSdrRequest,
> +  OUT IPMI_GET_SDR_RESPONSE  *GetSdrResponse,
> +  IN OUT UINT32              *GetSdrResponseSize
> +  );
> +
> +#endif // IPMI_COMMAND_LIB_H_
> diff --git
> a/Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLibN
> etFnApp.c
> b/Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLibN
> etFnApp.c
> new file mode 100644
> index 0000000000..30c412e2f4
> --- /dev/null
> +++
> b/Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLibN
> etFnApp.c
> @@ -0,0 +1,444 @@
> +/** @file
> +  IPMI Command - NetFnApp.
> +
> +  Copyright (c) 2018 - 2021, Intel Corporation. All rights reserved.<BR>
> +  Copyright (C) 2023 Advanced Micro Devices, Inc. All rights reserved.<BR>
> +
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +**/
> +
> +#include <PiPei.h>
> +#include <Library/BaseMemoryLib.h>
> +#include <Library/DebugLib.h>
> +#include <Library/IpmiLib.h>
> +
> +#include <IndustryStandard/Ipmi.h>
> +
> +/**
> +  This function is used to retrieve device ID.
> +
> +  @param [out]  DeviceId  The pointer to receive
> IPMI_GET_DEVICE_ID_RESPONSE.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiGetDeviceId (
> +  OUT IPMI_GET_DEVICE_ID_RESPONSE  *DeviceId
> +  )
> +{
> +  EFI_STATUS  Status;
> +  UINT32      DataSize;
> +
> +  DataSize = sizeof (*DeviceId);
> +  Status   = IpmiSubmitCommand (
> +               IPMI_NETFN_APP,
> +               IPMI_APP_GET_DEVICE_ID,
> +               NULL,
> +               0,
> +               (VOID *)DeviceId,
> +               &DataSize
> +               );
> +  return Status;
> +}
> +
> +/**
> +  This function returns device self test results
> +
> +  @param [out]  SelfTestResult  The pointer to receive
> IPMI_SELF_TEST_RESULT_RESPONSE.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiGetSelfTestResult (
> +  OUT IPMI_SELF_TEST_RESULT_RESPONSE  *SelfTestResult
> +  )
> +{
> +  EFI_STATUS  Status;
> +  UINT32      DataSize;
> +
> +  DataSize = sizeof (*SelfTestResult);
> +  Status   = IpmiSubmitCommand (
> +               IPMI_NETFN_APP,
> +               IPMI_APP_GET_SELFTEST_RESULTS,
> +               NULL,
> +               0,
> +               (VOID *)SelfTestResult,
> +               &DataSize
> +               );
> +  return Status;
> +}
> +
> +/**
> +  This function is used for starting and restarting the Watchdog
> +  Timer from the initial countdown value that was specified in
> +  the Set Watchdog Timer command the watchdog timer
> +
> +  @param [out]  CompletionCode  IPMI completetion code, refer to Ipmi.h.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiResetWatchdogTimer (
> +  OUT UINT8  *CompletionCode
> +  )
> +{
> +  EFI_STATUS  Status;
> +  UINT32      DataSize;
> +
> +  DataSize = sizeof (*CompletionCode);
> +  Status   = IpmiSubmitCommand (
> +               IPMI_NETFN_APP,
> +               IPMI_APP_RESET_WATCHDOG_TIMER,
> +               NULL,
> +               0,
> +               (VOID *)CompletionCode,
> +               &DataSize
> +               );
> +  return Status;
> +}
> +
> +/**
> +  This function  is used for initializing and configuring
> +  the watchdog timer.
> +
> +  @param [in]   SetWatchdogTimer  Pointer to receive
> IPMI_SET_WATCHDOG_TIMER_REQUEST.
> +  @param [out]  CompletionCode    IPMI completetion code, refer to Ipmi.h.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiSetWatchdogTimer (
> +  IN  IPMI_SET_WATCHDOG_TIMER_REQUEST  *SetWatchdogTimer,
> +  OUT UINT8                            *CompletionCode
> +  )
> +{
> +  EFI_STATUS  Status;
> +  UINT32      DataSize;
> +
> +  DataSize = sizeof (*CompletionCode);
> +  Status   = IpmiSubmitCommand (
> +               IPMI_NETFN_APP,
> +               IPMI_APP_SET_WATCHDOG_TIMER,
> +               (VOID *)SetWatchdogTimer,
> +               sizeof (*SetWatchdogTimer),
> +               (VOID *)CompletionCode,
> +               &DataSize
> +               );
> +  return Status;
> +}
> +
> +/**
> +  This function retrieves the current settings and present
> +  countdown of the watchdog timer.
> +
> +  @param [out]  GetWatchdogTimer  Pointer to receive
> IPMI_GET_WATCHDOG_TIMER_RESPONSE.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiGetWatchdogTimer (
> +  OUT IPMI_GET_WATCHDOG_TIMER_RESPONSE  *GetWatchdogTimer
> +  )
> +{
> +  EFI_STATUS  Status;
> +  UINT32      DataSize;
> +
> +  DataSize = sizeof (*GetWatchdogTimer);
> +  Status   = IpmiSubmitCommand (
> +               IPMI_NETFN_APP,
> +               IPMI_APP_GET_WATCHDOG_TIMER,
> +               NULL,
> +               0,
> +               (VOID *)GetWatchdogTimer,
> +               &DataSize
> +               );
> +  return Status;
> +}
> +
> +/**
> +  This function enables message reception into Message Buffers,
> +  and any interrupt associated with that buffer getting full.
> +
> +  @param [in]   SetBmcGlobalEnables  Pointer receive to
> IPMI_SET_BMC_GLOBAL_ENABLES_REQUEST.
> +  @param [out]  CompletionCode      IPMI completetion code refer to Ipmi.h.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiSetBmcGlobalEnables (
> +  IN  IPMI_SET_BMC_GLOBAL_ENABLES_REQUEST  *SetBmcGlobalEnables,
> +  OUT UINT8                                *CompletionCode
> +  )
> +{
> +  EFI_STATUS  Status;
> +  UINT32      DataSize;
> +
> +  DataSize = sizeof (*CompletionCode);
> +  Status   = IpmiSubmitCommand (
> +               IPMI_NETFN_APP,
> +               IPMI_APP_SET_BMC_GLOBAL_ENABLES,
> +               (VOID *)SetBmcGlobalEnables,
> +               sizeof (*SetBmcGlobalEnables),
> +               (VOID *)CompletionCode,
> +               &DataSize
> +               );
> +  return Status;
> +}
> +
> +/**
> +  This function retrieves the present setting of the Global Enables
> +
> +  @param [out]  GetBmcGlobalEnables  Pointer to receive
> IPMI_GET_BMC_GLOBAL_ENABLES_RESPONSE.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiGetBmcGlobalEnables (
> +  OUT IPMI_GET_BMC_GLOBAL_ENABLES_RESPONSE
> *GetBmcGlobalEnables
> +  )
> +{
> +  EFI_STATUS  Status;
> +  UINT32      DataSize;
> +
> +  DataSize = sizeof (*GetBmcGlobalEnables);
> +  Status   = IpmiSubmitCommand (
> +               IPMI_NETFN_APP,
> +               IPMI_APP_GET_BMC_GLOBAL_ENABLES,
> +               NULL,
> +               0,
> +               (VOID *)GetBmcGlobalEnables,
> +               &DataSize
> +               );
> +  return Status;
> +}
> +
> +/**
> +  This function is used to flush unread data from the Receive
> +  Message Queue or Event Message Buffer
> +
> +  @param [in]   ClearMessageFlagsRequest
> IPMI_CLEAR_MESSAGE_FLAGS_REQUEST
> +  @param [out]  CompletionCode           IPMI completetion code, refer to
> Ipmi.h.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiClearMessageFlags (
> +  IN  IPMI_CLEAR_MESSAGE_FLAGS_REQUEST  *ClearMessageFlagsRequest,
> +  OUT UINT8                             *CompletionCode
> +  )
> +{
> +  EFI_STATUS  Status;
> +  UINT32      DataSize;
> +
> +  DataSize = sizeof (*CompletionCode);
> +  Status   = IpmiSubmitCommand (
> +               IPMI_NETFN_APP,
> +               IPMI_APP_CLEAR_MESSAGE_FLAGS,
> +               (VOID *)ClearMessageFlagsRequest,
> +               sizeof (*ClearMessageFlagsRequest),
> +               (VOID *)CompletionCode,
> +               &DataSize
> +               );
> +  return Status;
> +}
> +
> +/**
> +  This function is used to retrieve the present message available states.
> +
> +  @param  [out]  GetMessageFlagsResponse  Pointer to receive
> IPMI_GET_MESSAGE_FLAGS_RESPONSE
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiGetMessageFlags (
> +  OUT IPMI_GET_MESSAGE_FLAGS_RESPONSE
> *GetMessageFlagsResponse
> +  )
> +{
> +  EFI_STATUS  Status;
> +  UINT32      DataSize;
> +
> +  DataSize = sizeof (*GetMessageFlagsResponse);
> +  Status   = IpmiSubmitCommand (
> +               IPMI_NETFN_APP,
> +               IPMI_APP_GET_MESSAGE_FLAGS,
> +               NULL,
> +               0,
> +               (VOID *)GetMessageFlagsResponse,
> +               &DataSize
> +               );
> +  return Status;
> +}
> +
> +/**
> +  This function is used to get data from the Receive Message Queue.
> +
> +  @param [out]      GetMessageResponse      Pointer to receive
> IPMI_GET_MESSAGE_RESPONSE.
> +  @param [in, out]  GetMessageResponseSize  When in, which is the
> expected size of
> +                                            response. When out, which is the actual
> +                                            size returned.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiGetMessage (
> +  OUT IPMI_GET_MESSAGE_RESPONSE  *GetMessageResponse,
> +  IN OUT UINT32                  *GetMessageResponseSize
> +  )
> +{
> +  EFI_STATUS  Status;
> +
> +  Status = IpmiSubmitCommand (
> +             IPMI_NETFN_APP,
> +             IPMI_APP_GET_MESSAGE,
> +             NULL,
> +             0,
> +             (VOID *)GetMessageResponse,
> +             GetMessageResponseSize
> +             );
> +  return Status;
> +}
> +
> +/**
> +  This function is used for bridging IPMI messages between channels,
> +  and between the system management software (SMS) and a given
> channel
> +
> +  @param [in]   SendMessageRequest       Pointer to
> IPMI_SEND_MESSAGE_REQUEST.
> +  @param [in]   SendMessageRequestSize   Size of entire
> SendMessageRequestSize.
> +  @param [out]  SendMessageResponse      Pointer to receive
> IPMI_SEND_MESSAGE_RESPONSE.
> +  @param [in]   SendMessageResponseSize  When in, which is the expected
> size of
> +                                         response. When out, which is the actual
> +                                         size returned.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiSendMessage (
> +  IN  IPMI_SEND_MESSAGE_REQUEST   *SendMessageRequest,
> +  IN  UINT32                      SendMessageRequestSize,
> +  OUT IPMI_SEND_MESSAGE_RESPONSE  *SendMessageResponse,
> +  IN OUT UINT32                   *SendMessageResponseSize
> +  )
> +{
> +  EFI_STATUS  Status;
> +
> +  Status = IpmiSubmitCommand (
> +             IPMI_NETFN_APP,
> +             IPMI_APP_SEND_MESSAGE,
> +             (VOID *)SendMessageRequest,
> +             SendMessageRequestSize,
> +             (VOID *)SendMessageResponse,
> +             SendMessageResponseSize
> +             );
> +  return Status;
> +}
> +
> +/**
> +  This function gets the system UUID.
> +
> +  @param[out] SystemGuid   The pointer to retrieve system UUID.
> +
> +  @retval EFI_SUCCESS               UUID is returned.
> +  @retval EFI_INVALID_PARAMETER     SystemGuid is a NULL pointer.
> +  @retval Others                    See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiGetSystemUuid (
> +  OUT EFI_GUID  *SystemGuid
> +  )
> +{
> +  EFI_STATUS                     Status;
> +  UINT32                         RequestSize;
> +  UINT32                         ResponseSize;
> +  IPMI_GET_SYSTEM_UUID_RESPONSE  GetSystemUuidResponse;
> +
> +  if (SystemGuid == NULL) {
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  RequestSize  = 0;
> +  ResponseSize = sizeof (IPMI_GET_SYSTEM_UUID_RESPONSE);
> +  Status       = IpmiSubmitCommand (
> +                   IPMI_NETFN_APP,
> +                   IPMI_APP_GET_SYSTEM_GUID,
> +                   (VOID *)NULL,
> +                   RequestSize,
> +                   (VOID *)&GetSystemUuidResponse,
> +                   &ResponseSize
> +                   );
> +  if (!EFI_ERROR (Status) && (GetSystemUuidResponse.CompletionCode ==
> IPMI_COMP_CODE_NORMAL)) {
> +    CopyMem (
> +      (VOID *)SystemGuid,
> +      (VOID *)&GetSystemUuidResponse.SystemUuid,
> +      sizeof (EFI_GUID)
> +      );
> +  }
> +
> +  return Status;
> +}
> +
> +/**
> +  This function gets the channel information.
> +
> +  @param[in]   GetChannelInfoRequest          The get channel information
> request.
> +  @param[out]  GetChannelInfoResponse         The get channel information
> response.
> +  @param[out]  GetChannelInfoResponseSize     When input, the expected
> size of response.
> +                                              When output, the exact size of the returned
> +                                              response.
> +
> +  @retval EFI_SUCCESS            Get channel information successfully.
> +  @retval EFI_INVALID_PARAMETER  One of the given input parameters is
> invalid.
> +  @retval Others                 See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiGetChannelInfo (
> +  IN  IPMI_GET_CHANNEL_INFO_REQUEST   *GetChannelInfoRequest,
> +  OUT IPMI_GET_CHANNEL_INFO_RESPONSE  *GetChannelInfoResponse,
> +  OUT UINT32                          *GetChannelInfoResponseSize
> +  )
> +{
> +  EFI_STATUS  Status;
> +
> +  if ((GetChannelInfoRequest == NULL) ||
> +      (GetChannelInfoResponse == NULL) ||
> +      (GetChannelInfoResponseSize == NULL))
> +  {
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  *GetChannelInfoResponseSize = sizeof
> (IPMI_GET_CHANNEL_INFO_RESPONSE);
> +  Status                      = IpmiSubmitCommand (
> +                                  IPMI_NETFN_APP,
> +                                  IPMI_APP_GET_CHANNEL_INFO,
> +                                  (UINT8 *)GetChannelInfoRequest,
> +                                  sizeof (IPMI_GET_CHANNEL_INFO_REQUEST),
> +                                  (UINT8 *)GetChannelInfoResponse,
> +                                  GetChannelInfoResponseSize
> +                                  );
> +  return Status;
> +}
> diff --git
> a/Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLibN
> etFnChassis.c
> b/Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLibN
> etFnChassis.c
> new file mode 100644
> index 0000000000..12fd997b11
> --- /dev/null
> +++
> b/Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLibN
> etFnChassis.c
> @@ -0,0 +1,199 @@
> +/** @file
> +  IPMI Command - NetFnChassis.
> +
> +  Copyright (c) 2018 - 2021, Intel Corporation. All rights reserved.<BR>
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +**/
> +
> +#include <PiPei.h>
> +#include <Library/BaseMemoryLib.h>
> +#include <Library/DebugLib.h>
> +#include <Library/IpmiLib.h>
> +
> +#include <IndustryStandard/Ipmi.h>
> +
> +/**
> +  This function returns information about which main chassis management
> functions are
> +  present and  what addresses are used to access those functions.
> +
> +  @param [out]  GetChassisCapabilitiesResponse  Pointer to
> IPMI_GET_CHASSIS_CAPABILITIES_RESPONSE.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiGetChassisCapabilities (
> +  OUT IPMI_GET_CHASSIS_CAPABILITIES_RESPONSE
> *GetChassisCapabilitiesResponse
> +  )
> +{
> +  EFI_STATUS  Status;
> +  UINT32      DataSize;
> +
> +  DataSize = sizeof (*GetChassisCapabilitiesResponse);
> +  Status   = IpmiSubmitCommand (
> +               IPMI_NETFN_CHASSIS,
> +               IPMI_CHASSIS_GET_CAPABILITIES,
> +               NULL,
> +               0,
> +               (VOID *)GetChassisCapabilitiesResponse,
> +               &DataSize
> +               );
> +  return Status;
> +}
> +
> +/**
> +  This function gets  information regarding the high-level status of the
> system
> +  chassis and main power subsystem.
> +
> +  @param [out]  GetChassisStatusResponse  Pointer to
> IPMI_GET_CHASSIS_STATUS_RESPONSE.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiGetChassisStatus (
> +  OUT IPMI_GET_CHASSIS_STATUS_RESPONSE  *GetChassisStatusResponse
> +  )
> +{
> +  EFI_STATUS  Status;
> +  UINT32      DataSize;
> +
> +  DataSize = sizeof (*GetChassisStatusResponse);
> +  Status   = IpmiSubmitCommand (
> +               IPMI_NETFN_CHASSIS,
> +               IPMI_CHASSIS_GET_STATUS,
> +               NULL,
> +               0,
> +               (VOID *)GetChassisStatusResponse,
> +               &DataSize
> +               );
> +  return Status;
> +}
> +
> +/**
> +  This function sends command to control power up, power down, and reset.
> +
> +  @param [in]   ChassisControlRequest  Pointer to
> IPMI_CHASSIS_CONTROL_REQUEST.
> +  @param [out]  CompletionCode         IPMI completetion code, refer to
> Ipmi.h.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiChassisControl (
> +  IN IPMI_CHASSIS_CONTROL_REQUEST  *ChassisControlRequest,
> +  OUT UINT8                        *CompletionCode
> +  )
> +{
> +  EFI_STATUS  Status;
> +  UINT32      DataSize;
> +
> +  DataSize = sizeof (*CompletionCode);
> +  Status   = IpmiSubmitCommand (
> +               IPMI_NETFN_CHASSIS,
> +               IPMI_CHASSIS_CONTROL,
> +               (VOID *)ChassisControlRequest,
> +               sizeof (*ChassisControlRequest),
> +               (VOID *)CompletionCode,
> +               &DataSize
> +               );
> +  return Status;
> +}
> +
> +/**
> +  This function is used to configure the power restore policy.
> +
> +  @param [in]   ChassisControlRequest   Pointer to
> IPMI_SET_POWER_RESTORE_POLICY_REQUEST.
> +  @param [out]  ChassisControlResponse  Pointer to
> IPMI_SET_POWER_RESTORE_POLICY_RESPONSE.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiSetPowerRestorePolicy (
> +  IN  IPMI_SET_POWER_RESTORE_POLICY_REQUEST
> *ChassisControlRequest,
> +  OUT IPMI_SET_POWER_RESTORE_POLICY_RESPONSE
> *ChassisControlResponse
> +  )
> +{
> +  EFI_STATUS  Status;
> +  UINT32      DataSize;
> +
> +  DataSize = sizeof (*ChassisControlResponse);
> +  Status   = IpmiSubmitCommand (
> +               IPMI_NETFN_CHASSIS,
> +               IPMI_CHASSIS_SET_POWER_RESTORE_POLICY,
> +               (VOID *)ChassisControlRequest,
> +               sizeof (*ChassisControlRequest),
> +               (VOID *)ChassisControlResponse,
> +               &DataSize
> +               );
> +  return Status;
> +}
> +
> +/**
> +  This function is used to set parameters that direct the system boot
> +  following a system power up or reset.
> +
> +  @param [in]   BootOptionsRequest   Pointer to
> IPMI_SET_BOOT_OPTIONS_REQUEST.
> +  @param [out]  BootOptionsResponse  Pointer to
> IPMI_SET_BOOT_OPTIONS_RESPONSE.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiSetSystemBootOptions (
> +  IN  IPMI_SET_BOOT_OPTIONS_REQUEST   *BootOptionsRequest,
> +  OUT IPMI_SET_BOOT_OPTIONS_RESPONSE  *BootOptionsResponse
> +  )
> +{
> +  EFI_STATUS  Status;
> +  UINT32      DataSize;
> +
> +  DataSize = sizeof (*BootOptionsResponse);
> +  Status   = IpmiSubmitCommand (
> +               IPMI_NETFN_CHASSIS,
> +               IPMI_CHASSIS_SET_SYSTEM_BOOT_OPTIONS,
> +               (VOID *)BootOptionsRequest,
> +               sizeof (*BootOptionsRequest),
> +               (VOID *)BootOptionsResponse,
> +               &DataSize
> +               );
> +  return Status;
> +}
> +
> +/**
> +  This function is used to retrieve the boot options set by the
> +  Set System Boot Options command.
> +
> +  @param [in]   BootOptionsRequest   Pointer to
> IPMI_GET_BOOT_OPTIONS_REQUEST.
> +  @param [out]  BootOptionsResponse  Pointer to
> IPMI_GET_BOOT_OPTIONS_RESPONSE.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiGetSystemBootOptions (
> +  IN  IPMI_GET_BOOT_OPTIONS_REQUEST   *BootOptionsRequest,
> +  OUT IPMI_GET_BOOT_OPTIONS_RESPONSE  *BootOptionsResponse
> +  )
> +{
> +  EFI_STATUS  Status;
> +  UINT32      DataSize;
> +
> +  DataSize = sizeof (*BootOptionsResponse);
> +  Status   = IpmiSubmitCommand (
> +               IPMI_NETFN_CHASSIS,
> +               IPMI_CHASSIS_GET_SYSTEM_BOOT_OPTIONS,
> +               (VOID *)BootOptionsRequest,
> +               sizeof (*BootOptionsRequest),
> +               (VOID *)BootOptionsResponse,
> +               &DataSize
> +               );
> +  return Status;
> +}
> diff --git
> a/Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLibN
> etFnStorage.c
> b/Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLibN
> etFnStorage.c
> new file mode 100644
> index 0000000000..2dbb7ac9ff
> --- /dev/null
> +++
> b/Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLibN
> etFnStorage.c
> @@ -0,0 +1,384 @@
> +/** @file
> +  IPMI Command - NetFnStorage.
> +
> +  Copyright (c) 2018 - 2021, Intel Corporation. All rights reserved.<BR>
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +**/
> +
> +#include <PiPei.h>
> +#include <Library/BaseMemoryLib.h>
> +#include <Library/DebugLib.h>
> +#include <Library/IpmiLib.h>
> +
> +#include <IndustryStandard/Ipmi.h>
> +
> +/**
> +  This function is used to retrieve FRU Inventory Area
> +
> +  @param [in]  GetFruInventoryAreaInfoRequest   Pointer to
> IPMI_GET_FRU_INVENTORY_AREA_INFO_REQUEST.
> +  @param [out] GetFruInventoryAreaInfoResponse  Pointer to
> IPMI_GET_FRU_INVENTORY_AREA_INFO_RESPONSE.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiGetFruInventoryAreaInfo (
> +  IN  IPMI_GET_FRU_INVENTORY_AREA_INFO_REQUEST
> *GetFruInventoryAreaInfoRequest,
> +  OUT IPMI_GET_FRU_INVENTORY_AREA_INFO_RESPONSE
> *GetFruInventoryAreaInfoResponse
> +  )
> +{
> +  EFI_STATUS  Status;
> +  UINT32      DataSize;
> +
> +  DataSize = sizeof (*GetFruInventoryAreaInfoResponse);
> +  Status   = IpmiSubmitCommand (
> +               IPMI_NETFN_STORAGE,
> +               IPMI_STORAGE_GET_FRU_INVENTORY_AREAINFO,
> +               (VOID *)GetFruInventoryAreaInfoRequest,
> +               sizeof (*GetFruInventoryAreaInfoRequest),
> +               (VOID *)GetFruInventoryAreaInfoResponse,
> +               &DataSize
> +               );
> +  return Status;
> +}
> +
> +/**
> +  This function returns specified data from the FRU Inventory Info area.
> +
> +  @param [in]  ReadFruDataRequest       Pointer to
> IPMI_READ_FRU_DATA_REQUEST.
> +  @param [in]  ReadFruDataResponse      Pointer to
> IPMI_READ_FRU_DATA_RESPONSE.
> +  @param [in, out] ReadFruDataResponseSize  Returns the size of
> ReadFruDataResponse.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiReadFruData (
> +  IN  IPMI_READ_FRU_DATA_REQUEST   *ReadFruDataRequest,
> +  OUT IPMI_READ_FRU_DATA_RESPONSE  *ReadFruDataResponse,
> +  IN OUT UINT32                    *ReadFruDataResponseSize
> +  )
> +{
> +  EFI_STATUS  Status;
> +
> +  Status = IpmiSubmitCommand (
> +             IPMI_NETFN_STORAGE,
> +             IPMI_STORAGE_READ_FRU_DATA,
> +             (VOID *)ReadFruDataRequest,
> +             sizeof (*ReadFruDataRequest),
> +             (VOID *)ReadFruDataResponse,
> +             ReadFruDataResponseSize
> +             );
> +  return Status;
> +}
> +
> +/**
> +  This function writes specified data from the FRU Inventory Info area.
> +
> +  @param [in]  WriteFruDataRequest      Pointer to
> IPMI_WRITE_FRU_DATA_REQUEST.
> +  @param [in]  WriteFruDataRequestSize  Size of WriteFruDataRequest.
> +  @param [out] WriteFruDataResponse     Pointer to receive
> IPMI_WRITE_FRU_DATA_RESPONSE.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiWriteFruData (
> +  IN  IPMI_WRITE_FRU_DATA_REQUEST   *WriteFruDataRequest,
> +  IN  UINT32                        WriteFruDataRequestSize,
> +  OUT IPMI_WRITE_FRU_DATA_RESPONSE  *WriteFruDataResponse
> +  )
> +{
> +  EFI_STATUS  Status;
> +  UINT32      DataSize;
> +
> +  DataSize = sizeof (*WriteFruDataResponse);
> +  Status   = IpmiSubmitCommand (
> +               IPMI_NETFN_STORAGE,
> +               IPMI_STORAGE_WRITE_FRU_DATA,
> +               (VOID *)WriteFruDataRequest,
> +               WriteFruDataRequestSize,
> +               (VOID *)WriteFruDataResponse,
> +               &DataSize
> +               );
> +  return Status;
> +}
> +
> +/**
> +  This function returns the number of entries in the SEL
> +
> +  @param [out] GetSelInfoResponse     Pointer to receive
> IPMI_GET_SEL_INFO_RESPONSE.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiGetSelInfo (
> +  OUT IPMI_GET_SEL_INFO_RESPONSE  *GetSelInfoResponse
> +  )
> +{
> +  EFI_STATUS  Status;
> +  UINT32      DataSize;
> +
> +  DataSize = sizeof (*GetSelInfoResponse);
> +  Status   = IpmiSubmitCommand (
> +               IPMI_NETFN_STORAGE,
> +               IPMI_STORAGE_GET_SEL_INFO,
> +               NULL,
> +               0,
> +               (VOID *)GetSelInfoResponse,
> +               &DataSize
> +               );
> +  return Status;
> +}
> +
> +/**
> +  This function retrieves entries from the SEL
> +
> +  @param [in]  GetSelEntryRequest       Pointer to
> IPMI_GET_SEL_ENTRY_REQUEST.
> +  @param [out] GetSelEntryResponse      Pointer to receive
> IPMI_GET_SEL_ENTRY_RESPONSE.
> +  @param [in, out]  GetSelEntryResponseSize  Size of entire
> GetSelEntryResponse.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiGetSelEntry (
> +  IN IPMI_GET_SEL_ENTRY_REQUEST    *GetSelEntryRequest,
> +  OUT IPMI_GET_SEL_ENTRY_RESPONSE  *GetSelEntryResponse,
> +  IN OUT UINT32                    *GetSelEntryResponseSize
> +  )
> +{
> +  EFI_STATUS  Status;
> +
> +  Status = IpmiSubmitCommand (
> +             IPMI_NETFN_STORAGE,
> +             IPMI_STORAGE_GET_SEL_ENTRY,
> +             (VOID *)GetSelEntryRequest,
> +             sizeof (*GetSelEntryRequest),
> +             (VOID *)GetSelEntryResponse,
> +             GetSelEntryResponseSize
> +             );
> +  return Status;
> +}
> +
> +/**
> +  This function adds an entry in the SEL
> +
> +  @param [in]  AddSelEntryRequest       Pointer to
> IPMI_ADD_SEL_ENTRY_REQUEST.
> +  @param [out] AddSelEntryResponse      Pointer to receive
> IPMI_ADD_SEL_ENTRY_RESPONSE.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiAddSelEntry (
> +  IN IPMI_ADD_SEL_ENTRY_REQUEST    *AddSelEntryRequest,
> +  OUT IPMI_ADD_SEL_ENTRY_RESPONSE  *AddSelEntryResponse
> +  )
> +{
> +  EFI_STATUS  Status;
> +  UINT32      DataSize;
> +
> +  DataSize = sizeof (*AddSelEntryResponse);
> +  Status   = IpmiSubmitCommand (
> +               IPMI_NETFN_STORAGE,
> +               IPMI_STORAGE_ADD_SEL_ENTRY,
> +               (VOID *)AddSelEntryRequest,
> +               sizeof (*AddSelEntryRequest),
> +               (VOID *)AddSelEntryResponse,
> +               &DataSize
> +               );
> +  return Status;
> +}
> +
> +/**
> +  This function adds SEL Entry command that allows the record to be
> incrementally
> +  added to the SEL.
> +
> +  @param [in]  PartialAddSelEntryRequest       Pointer to
> IPMI_PARTIAL_ADD_SEL_ENTRY_REQUEST.
> +  @param [in]  PartialAddSelEntryRequestSize   Size of entire
> PartialAddSelEntryRequest.
> +  @param [out] PartialAddSelEntryResponse      Pointer to receive
> IPMI_PARTIAL_ADD_SEL_ENTRY_RESPONSE.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiPartialAddSelEntry (
> +  IN IPMI_PARTIAL_ADD_SEL_ENTRY_REQUEST
> *PartialAddSelEntryRequest,
> +  IN UINT32                                PartialAddSelEntryRequestSize,
> +  OUT IPMI_PARTIAL_ADD_SEL_ENTRY_RESPONSE
> *PartialAddSelEntryResponse
> +  )
> +{
> +  EFI_STATUS  Status;
> +  UINT32      DataSize;
> +
> +  DataSize = sizeof (*PartialAddSelEntryResponse);
> +  Status   = IpmiSubmitCommand (
> +               IPMI_NETFN_STORAGE,
> +               IPMI_STORAGE_PARTIAL_ADD_SEL_ENTRY,
> +               (VOID *)PartialAddSelEntryRequest,
> +               PartialAddSelEntryRequestSize,
> +               (VOID *)PartialAddSelEntryResponse,
> +               &DataSize
> +               );
> +  return Status;
> +}
> +
> +/**
> +  This function erases all contents of the System Event Log.
> +
> +  @param [in]  ClearSelRequest       Pointer to IPMI_CLEAR_SEL_REQUEST.
> +  @param [out] ClearSelResponse      Pointer to receive
> IPMI_CLEAR_SEL_RESPONSE.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiClearSel (
> +  IN IPMI_CLEAR_SEL_REQUEST    *ClearSelRequest,
> +  OUT IPMI_CLEAR_SEL_RESPONSE  *ClearSelResponse
> +  )
> +{
> +  EFI_STATUS  Status;
> +  UINT32      DataSize;
> +
> +  DataSize = sizeof (*ClearSelResponse);
> +  Status   = IpmiSubmitCommand (
> +               IPMI_NETFN_STORAGE,
> +               IPMI_STORAGE_CLEAR_SEL,
> +               (VOID *)ClearSelRequest,
> +               sizeof (*ClearSelRequest),
> +               (VOID *)ClearSelResponse,
> +               &DataSize
> +               );
> +  return Status;
> +}
> +
> +/**
> +  This function returns the time from the SEL Device.
> +
> +  @param [out]  GetSelTimeResponse       Pointer to
> IPMI_GET_SEL_TIME_RESPONSE.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiGetSelTime (
> +  OUT IPMI_GET_SEL_TIME_RESPONSE  *GetSelTimeResponse
> +  )
> +{
> +  EFI_STATUS  Status;
> +  UINT32      DataSize;
> +
> +  DataSize = sizeof (*GetSelTimeResponse);
> +  Status   = IpmiSubmitCommand (
> +               IPMI_NETFN_STORAGE,
> +               IPMI_STORAGE_GET_SEL_TIME,
> +               NULL,
> +               0,
> +               (VOID *)GetSelTimeResponse,
> +               &DataSize
> +               );
> +  return Status;
> +}
> +
> +/**
> +  This function set the time in the SEL Device.
> +
> +  @param [in]  SetSelTimeRequest       Pointer to
> IPMI_SET_SEL_TIME_REQUEST.
> +  @param [out] CompletionCode         IPMI completetion code, refer to
> Ipmi.h.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiSetSelTime (
> +  IN IPMI_SET_SEL_TIME_REQUEST  *SetSelTimeRequest,
> +  OUT UINT8                     *CompletionCode
> +  )
> +{
> +  EFI_STATUS  Status;
> +  UINT32      DataSize;
> +
> +  DataSize = sizeof (*CompletionCode);
> +  Status   = IpmiSubmitCommand (
> +               IPMI_NETFN_STORAGE,
> +               IPMI_STORAGE_SET_SEL_TIME,
> +               (VOID *)SetSelTimeRequest,
> +               sizeof (*SetSelTimeRequest),
> +               (VOID *)CompletionCode,
> +               &DataSize
> +               );
> +  return Status;
> +}
> +
> +/**
> +  This function returns the SDR command version for the SDR Repository
> +
> +  @param [out] ClearSelResponse      Pointer to receive
> IPMI_GET_SDR_REPOSITORY_INFO_RESPONSE.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiGetSdrRepositoryInfo (
> +  OUT IPMI_GET_SDR_REPOSITORY_INFO_RESPONSE
> *GetSdrRepositoryInfoResp
> +  )
> +{
> +  EFI_STATUS  Status;
> +  UINT32      DataSize;
> +
> +  DataSize = sizeof (*GetSdrRepositoryInfoResp);
> +  Status   = IpmiSubmitCommand (
> +               IPMI_NETFN_STORAGE,
> +               IPMI_STORAGE_GET_SDR_REPOSITORY_INFO,
> +               NULL,
> +               0,
> +               (VOID *)GetSdrRepositoryInfoResp,
> +               &DataSize
> +               );
> +  return Status;
> +}
> +
> +/**
> +  This function returns the sensor record specified by Record ID.
> +
> +  @param [in]  GetSdrRequest       Pointer to IPMI_GET_SDR_REQUEST.
> +  @param [out] GetSdrResponse      Pointer to receive
> IPMI_GET_SDR_RESPONSE.
> +  @param [in, out]  GetSdrResponseSize  Size of entire GetSdrResponse.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiGetSdr (
> +  IN  IPMI_GET_SDR_REQUEST   *GetSdrRequest,
> +  OUT IPMI_GET_SDR_RESPONSE  *GetSdrResponse,
> +  IN OUT UINT32              *GetSdrResponseSize
> +  )
> +{
> +  EFI_STATUS  Status;
> +
> +  Status = IpmiSubmitCommand (
> +             IPMI_NETFN_STORAGE,
> +             IPMI_STORAGE_GET_SDR,
> +             (VOID *)GetSdrRequest,
> +             sizeof (*GetSdrRequest),
> +             (VOID *)GetSdrResponse,
> +             GetSdrResponseSize
> +             );
> +  return Status;
> +}
> diff --git
> a/Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLibN
> etFnTransport.c
> b/Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLibN
> etFnTransport.c
> new file mode 100644
> index 0000000000..a93f7406f1
> --- /dev/null
> +++
> b/Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLibN
> etFnTransport.c
> @@ -0,0 +1,156 @@
> +/** @file
> +  IPMI Command - NetFnTransport.
> +
> +  Copyright (c) 2018 - 2021, Intel Corporation. All rights reserved.<BR>
> +  Copyright (C) 2023 Advanced Micro Devices, Inc. All rights reserved.<BR>
> +
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +**/
> +
> +#include <PiPei.h>
> +#include <Library/BaseMemoryLib.h>
> +#include <Library/DebugLib.h>
> +#include <Library/IpmiLib.h>
> +
> +#include <IndustryStandard/Ipmi.h>
> +
> +/**
> +  This function sends command to BMC to notify a remote application
> +  that a SOL payload is activating on another channel.
> +
> +  @param [in]   SolActivatingRequest  The get channel information request.
> +  @param [out]  CompletionCode        IPMI completetion code, refer to
> Ipmi.h.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiSolActivating (
> +  IN  IPMI_SOL_ACTIVATING_REQUEST  *SolActivatingRequest,
> +  OUT UINT8                        *CompletionCode
> +  )
> +{
> +  EFI_STATUS  Status;
> +  UINT32      DataSize;
> +
> +  DataSize = sizeof (*CompletionCode);
> +  Status   = IpmiSubmitCommand (
> +               IPMI_NETFN_TRANSPORT,
> +               IPMI_TRANSPORT_SOL_ACTIVATING,
> +               (VOID *)SolActivatingRequest,
> +               sizeof (*SolActivatingRequest),
> +               (VOID *)CompletionCode,
> +               &DataSize
> +               );
> +  return Status;
> +}
> +
> +/**
> +  This function is used to set parameters such as the network addressing
> +  information required for SOL payload operation.
> +
> +  @param [in]   SetConfigurationParametersRequest      Pointer to
> IPMI_SET_SOL_CONFIGURATION_PARAMETERS_REQUEST.
> +  @param [in]   SetConfigurationParametersRequestSize  Size of entire
> SetConfigurationParametersRequestSize.
> +  @param [out]  CompletionCode                         IPMI completetion code, refer
> to Ipmi.h.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiSetSolConfigurationParameters (
> +  IN  IPMI_SET_SOL_CONFIGURATION_PARAMETERS_REQUEST
> *SetConfigurationParametersRequest,
> +  IN  UINT32                                         SetConfigurationParametersRequestSize,
> +  OUT UINT8                                          *CompletionCode
> +  )
> +{
> +  EFI_STATUS  Status;
> +  UINT32      DataSize;
> +
> +  DataSize = sizeof (*CompletionCode);
> +  Status   = IpmiSubmitCommand (
> +               IPMI_NETFN_TRANSPORT,
> +               IPMI_TRANSPORT_SET_SOL_CONFIG_PARAM,
> +               (VOID *)SetConfigurationParametersRequest,
> +               SetConfigurationParametersRequestSize,
> +               (VOID *)CompletionCode,
> +               &DataSize
> +               );
> +  return Status;
> +}
> +
> +/**
> +  This function is used to retrieve the configuration parameters from the
> +  Set SOL Configuration Parameters.
> +
> +  @param [in]       GetConfigurationParametersRequest       Pointer to
> IPMI_SET_SOL_CONFIGURATION_PARAMETERS_REQUEST.
> +  @param [out]      GetConfigurationParametersResponse      Pointer to
> receive IPMI_GET_SOL_CONFIGURATION_PARAMETERS_RESPONSE
> +  @param [in, out]  GetConfigurationParametersResponseSize  When in,
> which is the expected size of
> +                                                            response. When out, which is the actual
> +                                                            size returned.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiGetSolConfigurationParameters (
> +  IN  IPMI_GET_SOL_CONFIGURATION_PARAMETERS_REQUEST
> *GetConfigurationParametersRequest,
> +  OUT IPMI_GET_SOL_CONFIGURATION_PARAMETERS_RESPONSE
> *GetConfigurationParametersResponse,
> +  IN OUT UINT32
> *GetConfigurationParametersResponseSize
> +  )
> +{
> +  EFI_STATUS  Status;
> +
> +  Status = IpmiSubmitCommand (
> +             IPMI_NETFN_TRANSPORT,
> +             IPMI_TRANSPORT_GET_SOL_CONFIG_PARAM,
> +             (VOID *)GetConfigurationParametersRequest,
> +             sizeof (*GetConfigurationParametersRequest),
> +             (VOID *)GetConfigurationParametersResponse,
> +             GetConfigurationParametersResponseSize
> +             );
> +  return Status;
> +}
> +
> +/**
> +  This function gets the LAN configuration parameter.
> +
> +  @param[in]      GetLanConfigurationParametersRequest   Request data
> +  @param[out]     GetLanConfigurationParametersResponse  Response data
> +  @param[in,out]  GetLanConfigurationParametersSize      When input, the
> expected size of response data.
> +                                                         When out, the exact  size of response data.
> +
> +  @retval EFI_SUCCESS            Lan configuration parameter is returned in the
> response.
> +  @retval EFI_INVALID_PARAMETER  One of the given input parameters is
> invalid.
> +  @retval Others                 Other errors.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiGetLanConfigurationParameters (
> +  IN     IPMI_GET_LAN_CONFIGURATION_PARAMETERS_REQUEST
> *GetLanConfigurationParametersRequest,
> +  OUT    IPMI_GET_LAN_CONFIGURATION_PARAMETERS_RESPONSE
> *GetLanConfigurationParametersResponse,
> +  IN OUT UINT32                                          *GetLanConfigurationParametersSize
> +  )
> +{
> +  EFI_STATUS  Status;
> +
> +  if ((GetLanConfigurationParametersRequest == NULL) ||
> +      (GetLanConfigurationParametersResponse == NULL) ||
> +      (GetLanConfigurationParametersSize == NULL))
> +  {
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  Status = IpmiSubmitCommand (
> +             IPMI_NETFN_TRANSPORT,
> +             IPMI_TRANSPORT_GET_LAN_CONFIG_PARAMETERS,
> +             (UINT8 *)GetLanConfigurationParametersRequest,
> +             sizeof (*GetLanConfigurationParametersRequest),
> +             (UINT8 *)GetLanConfigurationParametersResponse,
> +             GetLanConfigurationParametersSize
> +             );
> +  return Status;
> +}
> --
> 2.37.1.windows.1
> 
> 
> 
> 
> 

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [edk2-platforms][PATCH] ManageabilityPkg/IpmiCommandLib: Add IpmiCommandLib to package
  2023-05-05  5:24 ` [edk2-platforms][PATCH] ManageabilityPkg/IpmiCommandLib: Add IpmiCommandLib to package Chang, Abner
@ 2023-05-09  6:53   ` Nickle Wang
  2023-05-09  6:57   ` Attar, AbdulLateef (Abdul Lateef)
  1 sibling, 0 replies; 8+ messages in thread
From: Nickle Wang @ 2023-05-09  6:53 UTC (permalink / raw)
  To: abner.chang@amd.com, devel@edk2.groups.io
  Cc: Isaac Oram, Abdul Lateef Attar, Tinh Nguyen

Reviewed-by: Nickle Wang <nicklew@nvidia.com>

Regards,
Nickle

> -----Original Message-----
> From: abner.chang@amd.com <abner.chang@amd.com>
> Sent: Friday, May 5, 2023 1:24 PM
> To: devel@edk2.groups.io
> Cc: Isaac Oram <isaac.w.oram@intel.com>; Abdul Lateef Attar
> <abdattar@amd.com>; Nickle Wang <nicklew@nvidia.com>; Tinh Nguyen
> <tinhnguyen@os.amperecomputing.com>
> Subject: [edk2-platforms][PATCH] ManageabilityPkg/IpmiCommandLib: Add
> IpmiCommandLib to package
> 
> External email: Use caution opening links or attachments
> 
> 
> From: Abner Chang <abner.chang@amd.com>
> 
> BZ #: 4444
> Add IpmiCommandLib to ManageabilityPkg package.
> 
> Signed-off-by: Abner Chang <abner.chang@amd.com>
> Cc: Isaac Oram <isaac.w.oram@intel.com>
> Cc: Abdul Lateef Attar <abdattar@amd.com>
> Cc: Nickle Wang <nicklew@nvidia.com>
> Cc: Tinh Nguyen <tinhnguyen@os.amperecomputing.com>
> ---
>  Features/ManageabilityPkg/ManageabilityPkg.dec      | 4 ++++
>  Features/ManageabilityPkg/Include/Manageability.dsc | 1 +
>  Features/ManageabilityPkg/ManageabilityPkg.dsc      | 1 +
>  3 files changed, 6 insertions(+)
> 
> diff --git a/Features/ManageabilityPkg/ManageabilityPkg.dec
> b/Features/ManageabilityPkg/ManageabilityPkg.dec
> index 6f58ab4f45..38813c5f48 100644
> --- a/Features/ManageabilityPkg/ManageabilityPkg.dec
> +++ b/Features/ManageabilityPkg/ManageabilityPkg.dec
> @@ -18,6 +18,10 @@
>    Include
> 
>  [LibraryClasses]
> +  ##  @libraryclass IPMI command library
> +  #   Provide the help functions to send IPMI commands.
> +  IpmiCommandLib|Include/Library/IpmiCommandLib.h
> +
>    ##  @libraryclass Manageability Transport Library
>    #   Manageability Transport Library definitions
>    ManageabilityTransportLib|Include/Library/ManageabilityTransportLib.h
> diff --git a/Features/ManageabilityPkg/Include/Manageability.dsc
> b/Features/ManageabilityPkg/Include/Manageability.dsc
> index 5e7cdb885f..a432b0ff26 100644
> --- a/Features/ManageabilityPkg/Include/Manageability.dsc
> +++ b/Features/ManageabilityPkg/Include/Manageability.dsc
> @@ -7,6 +7,7 @@
>  ##
>  [LibraryClasses]
> 
> ManageabilityTransportHelperLib|ManageabilityPkg/Library/BaseManageability
> TransportHelperLib/BaseManageabilityTransportHelper.inf
> +
> IpmiCommandLib|ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLi
> b.inf
> 
>  [LibraryClasses.common.DXE_DRIVER]
> 
> PldmProtocolLib|ManageabilityPkg/Library/PldmProtocolLibrary/Dxe/PldmProt
> ocolLib.inf
> diff --git a/Features/ManageabilityPkg/ManageabilityPkg.dsc
> b/Features/ManageabilityPkg/ManageabilityPkg.dsc
> index a0712d1c0a..e3baf27f2a 100644
> --- a/Features/ManageabilityPkg/ManageabilityPkg.dsc
> +++ b/Features/ManageabilityPkg/ManageabilityPkg.dsc
> @@ -49,6 +49,7 @@
> 
> ManageabilityPkg/Library/ManageabilityTransportKcsLib/Dxe/DxeManageability
> TransportKcs.inf
> 
> ManageabilityPkg/Library/ManageabilityTransportMctpLib/Dxe/DxeManageabili
> tyTransportMctp.inf
>    ManageabilityPkg/Library/PldmProtocolLibrary/Dxe/PldmProtocolLib.inf
> +  ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLib.inf
> 
>  [LibraryClasses]
> 
> ManageabilityTransportLib|ManageabilityPkg/Library/BaseManageabilityTransp
> ortNullLib/BaseManageabilityTransportNull.inf
> --
> 2.37.1.windows.1


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [edk2-platforms][PATCH] ManageabilityPkg/IpmiCommandLib:IPMI Command Library
  2023-05-05  5:24 [edk2-platforms][PATCH] ManageabilityPkg/IpmiCommandLib:IPMI Command Library Chang, Abner
  2023-05-05  5:24 ` [edk2-platforms][PATCH] ManageabilityPkg/IpmiCommandLib: Add IpmiCommandLib to package Chang, Abner
  2023-05-08 21:19 ` [edk2-devel] [edk2-platforms][PATCH] ManageabilityPkg/IpmiCommandLib:IPMI Command Library Isaac Oram
@ 2023-05-09  6:54 ` Nickle Wang
  2023-05-09  7:01 ` Attar, AbdulLateef (Abdul Lateef)
  3 siblings, 0 replies; 8+ messages in thread
From: Nickle Wang @ 2023-05-09  6:54 UTC (permalink / raw)
  To: abner.chang@amd.com, devel@edk2.groups.io
  Cc: Isaac Oram, Abdul Lateef Attar, Tinh Nguyen

Reviewed-by: Nickle Wang <nicklew@nvidia.com>

Regards,
Nickle

> -----Original Message-----
> From: abner.chang@amd.com <abner.chang@amd.com>
> Sent: Friday, May 5, 2023 1:24 PM
> To: devel@edk2.groups.io
> Cc: Isaac Oram <isaac.w.oram@intel.com>; Abdul Lateef Attar
> <abdattar@amd.com>; Nickle Wang <nicklew@nvidia.com>; Tinh Nguyen
> <tinhnguyen@os.amperecomputing.com>
> Subject: [edk2-platforms][PATCH] ManageabilityPkg/IpmiCommandLib:IPMI
> Command Library
> 
> External email: Use caution opening links or attachments
> 
> 
> From: Abner Chang <abner.chang@amd.com>
> 
> BZ #: 4444
> 
> IpmiCommandLib is cloned from
> edk2-platforms/Features/Intel/OutOfBandManagement/
> IpmiFeaturePkg/Library/IpmiCommandLib in order to
> consolidate edk2 system manageability support in
> one place. Function header are added to the source
> files and header files. Uncustify is applied to C
> files and no functionalities are changed in this patch.
> 
> We will still keep the one under IpmiFeaturePkg/Library/
> IpmiCommandLib until the reference to this instance are
> removed from platforms.
> 
> Signed-off-by: Abner Chang <abner.chang@amd.com>
> Cc: Isaac Oram <isaac.w.oram@intel.com>
> Cc: Abdul Lateef Attar <abdattar@amd.com>
> Cc: Nickle Wang <nicklew@nvidia.com>
> Cc: Tinh Nguyen <tinhnguyen@os.amperecomputing.com>
> ---
>  .../Library/IpmiCommandLib/IpmiCommandLib.inf |  33 +
>  .../Include/Library/IpmiCommandLib.h          | 620 ++++++++++++++++++
>  .../IpmiCommandLib/IpmiCommandLibNetFnApp.c   | 444 +++++++++++++
>  .../IpmiCommandLibNetFnChassis.c              | 199 ++++++
>  .../IpmiCommandLibNetFnStorage.c              | 384 +++++++++++
>  .../IpmiCommandLibNetFnTransport.c            | 156 +++++
>  6 files changed, 1836 insertions(+)
>  create mode 100644
> Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLib.inf
>  create mode 100644
> Features/ManageabilityPkg/Include/Library/IpmiCommandLib.h
>  create mode 100644
> Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLibNetFnA
> pp.c
>  create mode 100644
> Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLibNetFnC
> hassis.c
>  create mode 100644
> Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLibNetFnSt
> orage.c
>  create mode 100644
> Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLibNetFnTr
> ansport.c
> 
> diff --git
> a/Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLib.inf
> b/Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLib.inf
> new file mode 100644
> index 0000000000..3dc485cf38
> --- /dev/null
> +++
> b/Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLib.inf
> @@ -0,0 +1,33 @@
> +### @file
> +# Component description file for IPMI Command Library.
> +#
> +# Copyright (c) 2018 - 2021, Intel Corporation. All rights reserved.<BR>
> +# Copyright (C) 2023 Advanced Micro Devices, Inc. All rights reserved.<BR>
> +#
> +# SPDX-License-Identifier: BSD-2-Clause-Patent
> +#
> +###
> +
> +[Defines]
> +  INF_VERSION                    = 0x00010005
> +  BASE_NAME                      = IpmiCommandLib
> +  FILE_GUID                      = 96FC1989-CB7F-489B-9D3B-68DCA2C2DADC
> +  MODULE_TYPE                    = UEFI_DRIVER
> +  VERSION_STRING                 = 1.0
> +  LIBRARY_CLASS                  = IpmiCommandLib
> +
> +[sources]
> +  IpmiCommandLibNetFnApp.c
> +  IpmiCommandLibNetFnTransport.c
> +  IpmiCommandLibNetFnChassis.c
> +  IpmiCommandLibNetFnStorage.c
> +
> +[Packages]
> +  MdePkg/MdePkg.dec
> +  MdeModulePkg/MdeModulePkg.dec
> +  ManageabilityPkg/ManageabilityPkg.dec
> +
> +[LibraryClasses]
> +  BaseMemoryLib
> +  DebugLib
> +  IpmiLib
> diff --git a/Features/ManageabilityPkg/Include/Library/IpmiCommandLib.h
> b/Features/ManageabilityPkg/Include/Library/IpmiCommandLib.h
> new file mode 100644
> index 0000000000..685f6e2ea2
> --- /dev/null
> +++ b/Features/ManageabilityPkg/Include/Library/IpmiCommandLib.h
> @@ -0,0 +1,620 @@
> +/** @file
> +  This library abstract how to send/receive IPMI command.
> +
> +Copyright (c) 2018-2021, Intel Corporation. All rights reserved.<BR>
> +Copyright (C) 2023 Advanced Micro Devices, Inc. All rights reserved.<BR>
> +
> +SPDX-License-Identifier: BSD-2-Clause-Patent
> +
> +**/
> +
> +#ifndef IPMI_COMMAND_LIB_H_
> +#define IPMI_COMMAND_LIB_H_
> +
> +#include <Uefi.h>
> +#include <IndustryStandard/Ipmi.h>
> +
> +///
> +/// Functions for IPMI NetFnApp commands
> +///
> +
> +/**
> +  This function is used to retrieve device ID.
> +
> +  @param [out]  DeviceId  The pointer to receive
> IPMI_GET_DEVICE_ID_RESPONSE.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiGetDeviceId (
> +  OUT IPMI_GET_DEVICE_ID_RESPONSE  *DeviceId
> +  );
> +
> +/**
> +  This function returns device self test results
> +
> +  @param [out]  SelfTestResult  The pointer to receive
> IPMI_SELF_TEST_RESULT_RESPONSE.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiGetSelfTestResult (
> +  OUT IPMI_SELF_TEST_RESULT_RESPONSE  *SelfTestResult
> +  );
> +
> +/**
> +  This function is used for starting and restarting the Watchdog
> +  Timer from the initial countdown value that was specified in
> +  the Set Watchdog Timer command the watchdog timer.
> +
> +  @param [out]  CompletionCode  IPMI completetion code, refer to Ipmi.h.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiResetWatchdogTimer (
> +  OUT UINT8  *CompletionCode
> +  );
> +
> +/**
> +  This function  is used for initializing and configuring
> +  the watchdog timer.
> +
> +  @param [in]   SetWatchdogTimer  Pointer to receive
> IPMI_SET_WATCHDOG_TIMER_REQUEST.
> +  @param [out]  CompletionCode    IPMI completetion code, refer to Ipmi.h.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiSetWatchdogTimer (
> +  IN  IPMI_SET_WATCHDOG_TIMER_REQUEST  *SetWatchdogTimer,
> +  OUT UINT8                            *CompletionCode
> +  );
> +
> +/**
> +  This function retrieves the current settings and present
> +  countdown of the watchdog timer.
> +
> +  @param [out]  GetWatchdogTimer  Pointer to receive
> IPMI_GET_WATCHDOG_TIMER_RESPONSE.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiGetWatchdogTimer (
> +  OUT IPMI_GET_WATCHDOG_TIMER_RESPONSE  *GetWatchdogTimer
> +  );
> +
> +/**
> +  This function enables message reception into Message Buffers,
> +  and any interrupt associated with that buffer getting full.
> +
> +  @param [in]   SetBmcGlobalEnables  Pointer receive to
> IPMI_SET_BMC_GLOBAL_ENABLES_REQUEST.
> +  @param [out]  CompletionCode       IPMI completetion code, refer to Ipmi.h.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiSetBmcGlobalEnables (
> +  IN  IPMI_SET_BMC_GLOBAL_ENABLES_REQUEST  *SetBmcGlobalEnables,
> +  OUT UINT8                                *CompletionCode
> +  );
> +
> +/**
> +  This function retrieves the present setting of the Global Enables
> +
> +  @param [out]  GetBmcGlobalEnables  Pointer to receive
> IPMI_GET_BMC_GLOBAL_ENABLES_RESPONSE.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiGetBmcGlobalEnables (
> +  OUT IPMI_GET_BMC_GLOBAL_ENABLES_RESPONSE  *GetBmcGlobalEnables
> +  );
> +
> +/**
> +  This function is used to flush unread data from the Receive
> +  Message Queue or Event Message Buffer
> +
> +  @param [in]   ClearMessageFlagsRequest
> IPMI_CLEAR_MESSAGE_FLAGS_REQUEST
> +  @param [out]  CompletionCode           IPMI completetion code, refer to Ipmi.h.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiClearMessageFlags (
> +  IN  IPMI_CLEAR_MESSAGE_FLAGS_REQUEST  *ClearMessageFlagsRequest,
> +  OUT UINT8                             *CompletionCode
> +  );
> +
> +/**
> +  This function is used to retrieve the present message available states.
> +
> +  @param [out]  GetMessageFlagsResponse  Pointer to receive
> IPMI_GET_MESSAGE_FLAGS_RESPONSE
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiGetMessageFlags (
> +  OUT IPMI_GET_MESSAGE_FLAGS_RESPONSE  *GetMessageFlagsResponse
> +  );
> +
> +/**
> +  This function is used to get data from the Receive Message Queue.
> +
> +  @param [out]      GetMessageResponse      Pointer to receive
> IPMI_GET_MESSAGE_RESPONSE.
> +  @param [in, out]  GetMessageResponseSize  When in, which is the expected
> size of
> +                                            response. When out, which is the actual
> +                                            size returned.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiGetMessage (
> +  OUT IPMI_GET_MESSAGE_RESPONSE  *GetMessageResponse,
> +  IN OUT UINT32                  *GetMessageResponseSize
> +  );
> +
> +/**
> +  This function is used for bridging IPMI messages between channels,
> +  and between the system management software (SMS) and a given channel
> +
> +  @param [in]   SendMessageRequest       Pointer to
> IPMI_SEND_MESSAGE_REQUEST.
> +  @param [in]   SendMessageRequestSize   Size of entire
> SendMessageRequestSize.
> +  @param [out]  SendMessageResponse      Pointer to receive
> IPMI_SEND_MESSAGE_RESPONSE.
> +  @param [in]   SendMessageResponseSize  When in, which is the expected size
> of
> +                                         response. When out, which is the actual
> +                                         size returned.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiSendMessage (
> +  IN  IPMI_SEND_MESSAGE_REQUEST   *SendMessageRequest,
> +  IN  UINT32                      SendMessageRequestSize,
> +  OUT IPMI_SEND_MESSAGE_RESPONSE  *SendMessageResponse,
> +  IN OUT UINT32                   *SendMessageResponseSize
> +  );
> +
> +/**
> +  This function gets the system UUID.
> +
> +  @param [out]  SystemGuid   The pointer to retrieve system UUID.
> +
> +  @retval EFI_SUCCESS               UUID is returned.
> +  @retval EFI_INVALID_PARAMETER     SystemGuid is a NULL pointer.
> +  @retval Others                    See return value of IpmiSubmitCommand () function.
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiGetSystemUuid (
> +  OUT EFI_GUID  *SystemGuid
> +  );
> +
> +/**
> +  This function gets the channel information.
> +
> +  @param [in]   GetChannelInfoRequest       The get channel information
> request.
> +  @param [out]  GetChannelInfoResponse      The get channel information
> response.
> +  @param [out]  GetChannelInfoResponseSize  When input, the expected size
> of response.
> +                                            When output, the exact size of the returned
> +                                            response.
> +
> +  @retval EFI_SUCCESS            Get channel information successfully.
> +  @retval EFI_INVALID_PARAMETER  One of the given input parameters is
> invalid.
> +  @retval Others                 See return value of IpmiSubmitCommand () function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiGetChannelInfo (
> +  IN  IPMI_GET_CHANNEL_INFO_REQUEST   *GetChannelInfoRequest,
> +  OUT IPMI_GET_CHANNEL_INFO_RESPONSE  *GetChannelInfoResponse,
> +  OUT UINT32                          *GetChannelInfoResponseSize
> +  );
> +
> +///
> +/// Functions for IPMI NetFnTransport commands.
> +///
> +
> +/**
> +  This function sends command to BMC to notify a remote application
> +  that a SOL payload is activating on another channel.
> +
> +  @param [in]   SolActivatingRequest  Pointer to
> IPMI_SOL_ACTIVATING_REQUEST.
> +  @param [out]  CompletionCode        IPMI completetion code, refer to Ipmi.h.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiSolActivating (
> +  IN  IPMI_SOL_ACTIVATING_REQUEST  *SolActivatingRequest,
> +  OUT UINT8                        *CompletionCode
> +  );
> +
> +/**
> +  This function is used to set parameters such as the network addressing
> +  information required for SOL payload operation.
> +
> +  @param [in]  SetConfigurationParametersRequest      Pointer to
> IPMI_SET_SOL_CONFIGURATION_PARAMETERS_REQUEST.
> +  @param [in]  SetConfigurationParametersRequestSize  Size of entire
> SetConfigurationParametersRequestSize.
> +  @param [out] CompletionCode                         IPMI completetion code, refer
> to Ipmi.h.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiSetSolConfigurationParameters (
> +  IN  IPMI_SET_SOL_CONFIGURATION_PARAMETERS_REQUEST
> *SetConfigurationParametersRequest,
> +  IN  UINT32                                         SetConfigurationParametersRequestSize,
> +  OUT UINT8                                          *CompletionCode
> +  );
> +
> +/**
> +  This function is used to retrieve the configuration parameters from the
> +  Set SOL Configuration Parameters.
> +
> +  @param [in]       GetConfigurationParametersRequest       Pointer to
> IPMI_SET_SOL_CONFIGURATION_PARAMETERS_REQUEST.
> +  @param [out]      GetConfigurationParametersResponse      Pointer to receive
> IPMI_GET_SOL_CONFIGURATION_PARAMETERS_RESPONSE.
> +  @param [in, out]  GetConfigurationParametersResponseSize  When in, which
> is the expected size of
> +                                                            response. When out, which is the actual
> +                                                            size returned.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiGetSolConfigurationParameters (
> +  IN  IPMI_GET_SOL_CONFIGURATION_PARAMETERS_REQUEST
> *GetConfigurationParametersRequest,
> +  OUT IPMI_GET_SOL_CONFIGURATION_PARAMETERS_RESPONSE
> *GetConfigurationParametersResponse,
> +  IN OUT UINT32
> *GetConfigurationParametersResponseSize
> +  );
> +
> +/**
> +  This function gets the LAN configuration parameter.
> +
> +  @param[in]      GetLanConfigurationParametersRequest   Request data
> +  @param[out]     GetLanConfigurationParametersResponse  Response data
> +  @param[in,out]  GetLanConfigurationParametersSize      When input, the
> expected size of response data.
> +                                                         When out, the exact size of response data.
> +
> +  @retval EFI_SUCCESS            Lan configuration parameter is returned in the
> response.
> +  @retval EFI_INVALID_PARAMETER  One of the given input parameters is
> invalid.
> +  @retval Others                 Other errors.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiGetLanConfigurationParameters (
> +  IN     IPMI_GET_LAN_CONFIGURATION_PARAMETERS_REQUEST
> *GetLanConfigurationParametersRequest,
> +  OUT    IPMI_GET_LAN_CONFIGURATION_PARAMETERS_RESPONSE
> *GetLanConfigurationParametersResponse,
> +  IN OUT UINT32                                          *GetLanConfigurationParametersSize
> +  );
> +
> +///
> +/// Functions for IPMI NetFnChasis commands
> +///
> +
> +/**
> +  This function returns information about which main chassis management
> functions are
> +  present and  what addresses are used to access those functions.
> +
> +  @param [out]  GetChassisCapabilitiesResponse  Pointer to
> IPMI_GET_CHASSIS_CAPABILITIES_RESPONSE.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiGetChassisCapabilities (
> +  OUT IPMI_GET_CHASSIS_CAPABILITIES_RESPONSE
> *GetChassisCapabilitiesResponse
> +  );
> +
> +/**
> +  This function gets  information regarding the high-level status of the system
> +  chassis and main power subsystem.
> +
> +  @param [out]  GetChassisStatusResponse  Pointer to
> IPMI_GET_CHASSIS_STATUS_RESPONSE.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiGetChassisStatus (
> +  OUT IPMI_GET_CHASSIS_STATUS_RESPONSE  *GetChassisStatusResponse
> +  );
> +
> +/**
> +  This function sends command to control power up, power down, and reset.
> +
> +  @param [in]   ChassisControlRequest  Pointer to
> IPMI_CHASSIS_CONTROL_REQUEST.
> +  @param [out]  CompletionCode         IPMI completetion code, refer to Ipmi.h.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiChassisControl (
> +  IN IPMI_CHASSIS_CONTROL_REQUEST  *ChassisControlRequest,
> +  OUT UINT8                        *CompletionCode
> +  );
> +
> +/**
> +  This function is used to configure the power restore policy.
> +
> +  @param [in]   ChassisControlRequest   Pointer to
> IPMI_SET_POWER_RESTORE_POLICY_REQUEST.
> +  @param [out]  ChassisControlResponse  Pointer to
> IPMI_SET_POWER_RESTORE_POLICY_RESPONSE.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiSetPowerRestorePolicy (
> +  IN  IPMI_SET_POWER_RESTORE_POLICY_REQUEST   *ChassisControlRequest,
> +  OUT IPMI_SET_POWER_RESTORE_POLICY_RESPONSE
> *ChassisControlResponse
> +  );
> +
> +/**
> +  This function is used to set parameters that direct the system boot
> +  following a system power up or reset.
> +
> +  @param [in]   BootOptionsRequest   Pointer to
> IPMI_SET_BOOT_OPTIONS_REQUEST.
> +  @param [out]  BootOptionsResponse  Pointer to
> IPMI_SET_BOOT_OPTIONS_RESPONSE.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiSetSystemBootOptions (
> +  IN  IPMI_SET_BOOT_OPTIONS_REQUEST   *BootOptionsRequest,
> +  OUT IPMI_SET_BOOT_OPTIONS_RESPONSE  *BootOptionsResponse
> +  );
> +
> +/**
> +  This function is used to retrieve the boot options set by the
> +  Set System Boot Options command.
> +
> +  @param [in]   BootOptionsRequest   Pointer to
> IPMI_GET_BOOT_OPTIONS_REQUEST.
> +  @param [out]  BootOptionsResponse  Pointer to
> IPMI_GET_BOOT_OPTIONS_RESPONSE.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiGetSystemBootOptions (
> +  IN  IPMI_GET_BOOT_OPTIONS_REQUEST   *BootOptionsRequest,
> +  OUT IPMI_GET_BOOT_OPTIONS_RESPONSE  *BootOptionsResponse
> +  );
> +
> +///
> +/// Functions for IPMI NetFnStorage commands
> +///
> +
> +/**
> +  This function is used to retrieve FRU Inventory Area
> +
> +  @param [in]   GetFruInventoryAreaInfoRequest   Pointer to
> IPMI_GET_FRU_INVENTORY_AREA_INFO_REQUEST.
> +  @param [out]  GetFruInventoryAreaInfoResponse  Pointer to
> IPMI_GET_FRU_INVENTORY_AREA_INFO_RESPONSE.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiGetFruInventoryAreaInfo (
> +  IN  IPMI_GET_FRU_INVENTORY_AREA_INFO_REQUEST
> *GetFruInventoryAreaInfoRequest,
> +  OUT IPMI_GET_FRU_INVENTORY_AREA_INFO_RESPONSE
> *GetFruInventoryAreaInfoResponse
> +  );
> +
> +/**
> +  This function returns specified data from the FRU Inventory Info area.
> +
> +  @param [in]       ReadFruDataRequest       Pointer to
> IPMI_READ_FRU_DATA_REQUEST.
> +  @param [out]      ReadFruDataResponse      Pointer to
> IPMI_READ_FRU_DATA_RESPONSE.
> +  @param [in, out]  ReadFruDataResponseSize  Returns the size of
> ReadFruDataResponse.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiReadFruData (
> +  IN  IPMI_READ_FRU_DATA_REQUEST   *ReadFruDataRequest,
> +  OUT IPMI_READ_FRU_DATA_RESPONSE  *ReadFruDataResponse,
> +  IN OUT UINT32                    *ReadFruDataResponseSize
> +  );
> +
> +/**
> +  This function writes specified data from the FRU Inventory Info area.
> +
> +  @param [in]   WriteFruDataRequest      Pointer to
> IPMI_WRITE_FRU_DATA_REQUEST.
> +  @param [in]   WriteFruDataRequestSize  Size of WriteFruDataRequest.
> +  @param [out]  WriteFruDataResponse     Pointer to receive
> IPMI_WRITE_FRU_DATA_RESPONSE.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiWriteFruData (
> +  IN  IPMI_WRITE_FRU_DATA_REQUEST   *WriteFruDataRequest,
> +  IN  UINT32                        WriteFruDataRequestSize,
> +  OUT IPMI_WRITE_FRU_DATA_RESPONSE  *WriteFruDataResponse
> +  );
> +
> +/**
> +  This function returns the number of entries in the SEL
> +
> +  @param [out] GetSelInfoResponse     Pointer to receive
> IPMI_GET_SEL_INFO_RESPONSE.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiGetSelInfo (
> +  OUT IPMI_GET_SEL_INFO_RESPONSE  *GetSelInfoResponse
> +  );
> +
> +/**
> +  This function retrieves entries from the SEL
> +
> +  @param [in]   GetSelEntryRequest       Pointer to
> IPMI_GET_SEL_ENTRY_REQUEST.
> +  @param [out]  GetSelEntryResponse      Pointer to receive
> IPMI_GET_SEL_ENTRY_RESPONSE.
> +  @param [in]   GetSelEntryResponseSize  Size of entire GetSelEntryResponse.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiGetSelEntry (
> +  IN IPMI_GET_SEL_ENTRY_REQUEST    *GetSelEntryRequest,
> +  OUT IPMI_GET_SEL_ENTRY_RESPONSE  *GetSelEntryResponse,
> +  IN OUT UINT32                    *GetSelEntryResponseSize
> +  );
> +
> +/**
> +  This function adds an entry in the SEL
> +
> +  @param [in]   AddSelEntryRequest   Pointer to
> IPMI_ADD_SEL_ENTRY_REQUEST.
> +  @param [out]  AddSelEntryResponse  Pointer to receive
> IPMI_ADD_SEL_ENTRY_RESPONSE.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiAddSelEntry (
> +  IN IPMI_ADD_SEL_ENTRY_REQUEST    *AddSelEntryRequest,
> +  OUT IPMI_ADD_SEL_ENTRY_RESPONSE  *AddSelEntryResponse
> +  );
> +
> +/**
> +  This function adds SEL Entry command that allows the record to be
> incrementally
> +  added to the SEL.
> +
> +  @param [in]  PartialAddSelEntryRequest      Pointer to
> IPMI_PARTIAL_ADD_SEL_ENTRY_REQUEST.
> +  @param [in]  PartialAddSelEntryRequestSize  Size of entire
> PartialAddSelEntryRequest.
> +  @param [out] PartialAddSelEntryResponse     Pointer to receive
> IPMI_PARTIAL_ADD_SEL_ENTRY_RESPONSE.
> +
> +  @retval EFI_STASTUS   See return value of IpmiSubmitCommand () function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiPartialAddSelEntry (
> +  IN IPMI_PARTIAL_ADD_SEL_ENTRY_REQUEST    *PartialAddSelEntryRequest,
> +  IN UINT32                                PartialAddSelEntryRequestSize,
> +  OUT IPMI_PARTIAL_ADD_SEL_ENTRY_RESPONSE
> *PartialAddSelEntryResponse
> +  );
> +
> +/**
> +  This function erases all contents of the System Event Log.
> +
> +  @param [in]   ClearSelRequest   Pointer to IPMI_CLEAR_SEL_REQUEST.
> +  @param [out]  ClearSelResponse  Pointer to receive
> IPMI_CLEAR_SEL_RESPONSE.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiClearSel (
> +  IN IPMI_CLEAR_SEL_REQUEST    *ClearSelRequest,
> +  OUT IPMI_CLEAR_SEL_RESPONSE  *ClearSelResponse
> +  );
> +
> +/**
> +  This function returns the time from the SEL Device.
> +
> +  @param [out]  GetSelTimeResponse  Pointer to
> IPMI_GET_SEL_TIME_RESPONSE.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiGetSelTime (
> +  OUT IPMI_GET_SEL_TIME_RESPONSE  *GetSelTimeResponse
> +  );
> +
> +/**
> +  This function set the time in the SEL Device.
> +
> +  @param [in]   SetSelTimeRequest  Pointer to IPMI_SET_SEL_TIME_REQUEST.
> +  @param [out]  CompletionCode     IPMI completetion code, refer to Ipmi.h.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiSetSelTime (
> +  IN IPMI_SET_SEL_TIME_REQUEST  *SetSelTimeRequest,
> +  OUT UINT8                     *CompletionCode
> +  );
> +
> +/**
> +  This function returns the SDR command version for the SDR Repository.
> +
> +  @param [out]  ClearSelResponse  Pointer to receive
> IPMI_GET_SDR_REPOSITORY_INFO_RESPONSE.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiGetSdrRepositoryInfo (
> +  OUT IPMI_GET_SDR_REPOSITORY_INFO_RESPONSE
> *GetSdrRepositoryInfoResp
> +  );
> +
> +/**
> +  This function returns the sensor record specified by Record ID.
> +
> +  @param [in]       GetSdrRequest       Pointer to IPMI_GET_SDR_REQUEST.
> +  @param [out]      GetSdrResponse      Pointer to receive
> IPMI_GET_SDR_RESPONSE.
> +  @param [in, out]  GetSdrResponseSize  Size of entire GetSdrResponse.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiGetSdr (
> +  IN  IPMI_GET_SDR_REQUEST   *GetSdrRequest,
> +  OUT IPMI_GET_SDR_RESPONSE  *GetSdrResponse,
> +  IN OUT UINT32              *GetSdrResponseSize
> +  );
> +
> +#endif // IPMI_COMMAND_LIB_H_
> diff --git
> a/Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLibNetFn
> App.c
> b/Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLibNetFn
> App.c
> new file mode 100644
> index 0000000000..30c412e2f4
> --- /dev/null
> +++
> b/Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLibNetFn
> App.c
> @@ -0,0 +1,444 @@
> +/** @file
> +  IPMI Command - NetFnApp.
> +
> +  Copyright (c) 2018 - 2021, Intel Corporation. All rights reserved.<BR>
> +  Copyright (C) 2023 Advanced Micro Devices, Inc. All rights reserved.<BR>
> +
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +**/
> +
> +#include <PiPei.h>
> +#include <Library/BaseMemoryLib.h>
> +#include <Library/DebugLib.h>
> +#include <Library/IpmiLib.h>
> +
> +#include <IndustryStandard/Ipmi.h>
> +
> +/**
> +  This function is used to retrieve device ID.
> +
> +  @param [out]  DeviceId  The pointer to receive
> IPMI_GET_DEVICE_ID_RESPONSE.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiGetDeviceId (
> +  OUT IPMI_GET_DEVICE_ID_RESPONSE  *DeviceId
> +  )
> +{
> +  EFI_STATUS  Status;
> +  UINT32      DataSize;
> +
> +  DataSize = sizeof (*DeviceId);
> +  Status   = IpmiSubmitCommand (
> +               IPMI_NETFN_APP,
> +               IPMI_APP_GET_DEVICE_ID,
> +               NULL,
> +               0,
> +               (VOID *)DeviceId,
> +               &DataSize
> +               );
> +  return Status;
> +}
> +
> +/**
> +  This function returns device self test results
> +
> +  @param [out]  SelfTestResult  The pointer to receive
> IPMI_SELF_TEST_RESULT_RESPONSE.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiGetSelfTestResult (
> +  OUT IPMI_SELF_TEST_RESULT_RESPONSE  *SelfTestResult
> +  )
> +{
> +  EFI_STATUS  Status;
> +  UINT32      DataSize;
> +
> +  DataSize = sizeof (*SelfTestResult);
> +  Status   = IpmiSubmitCommand (
> +               IPMI_NETFN_APP,
> +               IPMI_APP_GET_SELFTEST_RESULTS,
> +               NULL,
> +               0,
> +               (VOID *)SelfTestResult,
> +               &DataSize
> +               );
> +  return Status;
> +}
> +
> +/**
> +  This function is used for starting and restarting the Watchdog
> +  Timer from the initial countdown value that was specified in
> +  the Set Watchdog Timer command the watchdog timer
> +
> +  @param [out]  CompletionCode  IPMI completetion code, refer to Ipmi.h.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiResetWatchdogTimer (
> +  OUT UINT8  *CompletionCode
> +  )
> +{
> +  EFI_STATUS  Status;
> +  UINT32      DataSize;
> +
> +  DataSize = sizeof (*CompletionCode);
> +  Status   = IpmiSubmitCommand (
> +               IPMI_NETFN_APP,
> +               IPMI_APP_RESET_WATCHDOG_TIMER,
> +               NULL,
> +               0,
> +               (VOID *)CompletionCode,
> +               &DataSize
> +               );
> +  return Status;
> +}
> +
> +/**
> +  This function  is used for initializing and configuring
> +  the watchdog timer.
> +
> +  @param [in]   SetWatchdogTimer  Pointer to receive
> IPMI_SET_WATCHDOG_TIMER_REQUEST.
> +  @param [out]  CompletionCode    IPMI completetion code, refer to Ipmi.h.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiSetWatchdogTimer (
> +  IN  IPMI_SET_WATCHDOG_TIMER_REQUEST  *SetWatchdogTimer,
> +  OUT UINT8                            *CompletionCode
> +  )
> +{
> +  EFI_STATUS  Status;
> +  UINT32      DataSize;
> +
> +  DataSize = sizeof (*CompletionCode);
> +  Status   = IpmiSubmitCommand (
> +               IPMI_NETFN_APP,
> +               IPMI_APP_SET_WATCHDOG_TIMER,
> +               (VOID *)SetWatchdogTimer,
> +               sizeof (*SetWatchdogTimer),
> +               (VOID *)CompletionCode,
> +               &DataSize
> +               );
> +  return Status;
> +}
> +
> +/**
> +  This function retrieves the current settings and present
> +  countdown of the watchdog timer.
> +
> +  @param [out]  GetWatchdogTimer  Pointer to receive
> IPMI_GET_WATCHDOG_TIMER_RESPONSE.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiGetWatchdogTimer (
> +  OUT IPMI_GET_WATCHDOG_TIMER_RESPONSE  *GetWatchdogTimer
> +  )
> +{
> +  EFI_STATUS  Status;
> +  UINT32      DataSize;
> +
> +  DataSize = sizeof (*GetWatchdogTimer);
> +  Status   = IpmiSubmitCommand (
> +               IPMI_NETFN_APP,
> +               IPMI_APP_GET_WATCHDOG_TIMER,
> +               NULL,
> +               0,
> +               (VOID *)GetWatchdogTimer,
> +               &DataSize
> +               );
> +  return Status;
> +}
> +
> +/**
> +  This function enables message reception into Message Buffers,
> +  and any interrupt associated with that buffer getting full.
> +
> +  @param [in]   SetBmcGlobalEnables  Pointer receive to
> IPMI_SET_BMC_GLOBAL_ENABLES_REQUEST.
> +  @param [out]  CompletionCode      IPMI completetion code refer to Ipmi.h.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiSetBmcGlobalEnables (
> +  IN  IPMI_SET_BMC_GLOBAL_ENABLES_REQUEST  *SetBmcGlobalEnables,
> +  OUT UINT8                                *CompletionCode
> +  )
> +{
> +  EFI_STATUS  Status;
> +  UINT32      DataSize;
> +
> +  DataSize = sizeof (*CompletionCode);
> +  Status   = IpmiSubmitCommand (
> +               IPMI_NETFN_APP,
> +               IPMI_APP_SET_BMC_GLOBAL_ENABLES,
> +               (VOID *)SetBmcGlobalEnables,
> +               sizeof (*SetBmcGlobalEnables),
> +               (VOID *)CompletionCode,
> +               &DataSize
> +               );
> +  return Status;
> +}
> +
> +/**
> +  This function retrieves the present setting of the Global Enables
> +
> +  @param [out]  GetBmcGlobalEnables  Pointer to receive
> IPMI_GET_BMC_GLOBAL_ENABLES_RESPONSE.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiGetBmcGlobalEnables (
> +  OUT IPMI_GET_BMC_GLOBAL_ENABLES_RESPONSE  *GetBmcGlobalEnables
> +  )
> +{
> +  EFI_STATUS  Status;
> +  UINT32      DataSize;
> +
> +  DataSize = sizeof (*GetBmcGlobalEnables);
> +  Status   = IpmiSubmitCommand (
> +               IPMI_NETFN_APP,
> +               IPMI_APP_GET_BMC_GLOBAL_ENABLES,
> +               NULL,
> +               0,
> +               (VOID *)GetBmcGlobalEnables,
> +               &DataSize
> +               );
> +  return Status;
> +}
> +
> +/**
> +  This function is used to flush unread data from the Receive
> +  Message Queue or Event Message Buffer
> +
> +  @param [in]   ClearMessageFlagsRequest
> IPMI_CLEAR_MESSAGE_FLAGS_REQUEST
> +  @param [out]  CompletionCode           IPMI completetion code, refer to Ipmi.h.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiClearMessageFlags (
> +  IN  IPMI_CLEAR_MESSAGE_FLAGS_REQUEST  *ClearMessageFlagsRequest,
> +  OUT UINT8                             *CompletionCode
> +  )
> +{
> +  EFI_STATUS  Status;
> +  UINT32      DataSize;
> +
> +  DataSize = sizeof (*CompletionCode);
> +  Status   = IpmiSubmitCommand (
> +               IPMI_NETFN_APP,
> +               IPMI_APP_CLEAR_MESSAGE_FLAGS,
> +               (VOID *)ClearMessageFlagsRequest,
> +               sizeof (*ClearMessageFlagsRequest),
> +               (VOID *)CompletionCode,
> +               &DataSize
> +               );
> +  return Status;
> +}
> +
> +/**
> +  This function is used to retrieve the present message available states.
> +
> +  @param  [out]  GetMessageFlagsResponse  Pointer to receive
> IPMI_GET_MESSAGE_FLAGS_RESPONSE
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiGetMessageFlags (
> +  OUT IPMI_GET_MESSAGE_FLAGS_RESPONSE  *GetMessageFlagsResponse
> +  )
> +{
> +  EFI_STATUS  Status;
> +  UINT32      DataSize;
> +
> +  DataSize = sizeof (*GetMessageFlagsResponse);
> +  Status   = IpmiSubmitCommand (
> +               IPMI_NETFN_APP,
> +               IPMI_APP_GET_MESSAGE_FLAGS,
> +               NULL,
> +               0,
> +               (VOID *)GetMessageFlagsResponse,
> +               &DataSize
> +               );
> +  return Status;
> +}
> +
> +/**
> +  This function is used to get data from the Receive Message Queue.
> +
> +  @param [out]      GetMessageResponse      Pointer to receive
> IPMI_GET_MESSAGE_RESPONSE.
> +  @param [in, out]  GetMessageResponseSize  When in, which is the expected
> size of
> +                                            response. When out, which is the actual
> +                                            size returned.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiGetMessage (
> +  OUT IPMI_GET_MESSAGE_RESPONSE  *GetMessageResponse,
> +  IN OUT UINT32                  *GetMessageResponseSize
> +  )
> +{
> +  EFI_STATUS  Status;
> +
> +  Status = IpmiSubmitCommand (
> +             IPMI_NETFN_APP,
> +             IPMI_APP_GET_MESSAGE,
> +             NULL,
> +             0,
> +             (VOID *)GetMessageResponse,
> +             GetMessageResponseSize
> +             );
> +  return Status;
> +}
> +
> +/**
> +  This function is used for bridging IPMI messages between channels,
> +  and between the system management software (SMS) and a given channel
> +
> +  @param [in]   SendMessageRequest       Pointer to
> IPMI_SEND_MESSAGE_REQUEST.
> +  @param [in]   SendMessageRequestSize   Size of entire
> SendMessageRequestSize.
> +  @param [out]  SendMessageResponse      Pointer to receive
> IPMI_SEND_MESSAGE_RESPONSE.
> +  @param [in]   SendMessageResponseSize  When in, which is the expected size
> of
> +                                         response. When out, which is the actual
> +                                         size returned.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiSendMessage (
> +  IN  IPMI_SEND_MESSAGE_REQUEST   *SendMessageRequest,
> +  IN  UINT32                      SendMessageRequestSize,
> +  OUT IPMI_SEND_MESSAGE_RESPONSE  *SendMessageResponse,
> +  IN OUT UINT32                   *SendMessageResponseSize
> +  )
> +{
> +  EFI_STATUS  Status;
> +
> +  Status = IpmiSubmitCommand (
> +             IPMI_NETFN_APP,
> +             IPMI_APP_SEND_MESSAGE,
> +             (VOID *)SendMessageRequest,
> +             SendMessageRequestSize,
> +             (VOID *)SendMessageResponse,
> +             SendMessageResponseSize
> +             );
> +  return Status;
> +}
> +
> +/**
> +  This function gets the system UUID.
> +
> +  @param[out] SystemGuid   The pointer to retrieve system UUID.
> +
> +  @retval EFI_SUCCESS               UUID is returned.
> +  @retval EFI_INVALID_PARAMETER     SystemGuid is a NULL pointer.
> +  @retval Others                    See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiGetSystemUuid (
> +  OUT EFI_GUID  *SystemGuid
> +  )
> +{
> +  EFI_STATUS                     Status;
> +  UINT32                         RequestSize;
> +  UINT32                         ResponseSize;
> +  IPMI_GET_SYSTEM_UUID_RESPONSE  GetSystemUuidResponse;
> +
> +  if (SystemGuid == NULL) {
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  RequestSize  = 0;
> +  ResponseSize = sizeof (IPMI_GET_SYSTEM_UUID_RESPONSE);
> +  Status       = IpmiSubmitCommand (
> +                   IPMI_NETFN_APP,
> +                   IPMI_APP_GET_SYSTEM_GUID,
> +                   (VOID *)NULL,
> +                   RequestSize,
> +                   (VOID *)&GetSystemUuidResponse,
> +                   &ResponseSize
> +                   );
> +  if (!EFI_ERROR (Status) && (GetSystemUuidResponse.CompletionCode ==
> IPMI_COMP_CODE_NORMAL)) {
> +    CopyMem (
> +      (VOID *)SystemGuid,
> +      (VOID *)&GetSystemUuidResponse.SystemUuid,
> +      sizeof (EFI_GUID)
> +      );
> +  }
> +
> +  return Status;
> +}
> +
> +/**
> +  This function gets the channel information.
> +
> +  @param[in]   GetChannelInfoRequest          The get channel information
> request.
> +  @param[out]  GetChannelInfoResponse         The get channel information
> response.
> +  @param[out]  GetChannelInfoResponseSize     When input, the expected size
> of response.
> +                                              When output, the exact size of the returned
> +                                              response.
> +
> +  @retval EFI_SUCCESS            Get channel information successfully.
> +  @retval EFI_INVALID_PARAMETER  One of the given input parameters is
> invalid.
> +  @retval Others                 See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiGetChannelInfo (
> +  IN  IPMI_GET_CHANNEL_INFO_REQUEST   *GetChannelInfoRequest,
> +  OUT IPMI_GET_CHANNEL_INFO_RESPONSE  *GetChannelInfoResponse,
> +  OUT UINT32                          *GetChannelInfoResponseSize
> +  )
> +{
> +  EFI_STATUS  Status;
> +
> +  if ((GetChannelInfoRequest == NULL) ||
> +      (GetChannelInfoResponse == NULL) ||
> +      (GetChannelInfoResponseSize == NULL))
> +  {
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  *GetChannelInfoResponseSize = sizeof
> (IPMI_GET_CHANNEL_INFO_RESPONSE);
> +  Status                      = IpmiSubmitCommand (
> +                                  IPMI_NETFN_APP,
> +                                  IPMI_APP_GET_CHANNEL_INFO,
> +                                  (UINT8 *)GetChannelInfoRequest,
> +                                  sizeof (IPMI_GET_CHANNEL_INFO_REQUEST),
> +                                  (UINT8 *)GetChannelInfoResponse,
> +                                  GetChannelInfoResponseSize
> +                                  );
> +  return Status;
> +}
> diff --git
> a/Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLibNetFn
> Chassis.c
> b/Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLibNetFn
> Chassis.c
> new file mode 100644
> index 0000000000..12fd997b11
> --- /dev/null
> +++
> b/Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLibNetFn
> Chassis.c
> @@ -0,0 +1,199 @@
> +/** @file
> +  IPMI Command - NetFnChassis.
> +
> +  Copyright (c) 2018 - 2021, Intel Corporation. All rights reserved.<BR>
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +**/
> +
> +#include <PiPei.h>
> +#include <Library/BaseMemoryLib.h>
> +#include <Library/DebugLib.h>
> +#include <Library/IpmiLib.h>
> +
> +#include <IndustryStandard/Ipmi.h>
> +
> +/**
> +  This function returns information about which main chassis management
> functions are
> +  present and  what addresses are used to access those functions.
> +
> +  @param [out]  GetChassisCapabilitiesResponse  Pointer to
> IPMI_GET_CHASSIS_CAPABILITIES_RESPONSE.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiGetChassisCapabilities (
> +  OUT IPMI_GET_CHASSIS_CAPABILITIES_RESPONSE
> *GetChassisCapabilitiesResponse
> +  )
> +{
> +  EFI_STATUS  Status;
> +  UINT32      DataSize;
> +
> +  DataSize = sizeof (*GetChassisCapabilitiesResponse);
> +  Status   = IpmiSubmitCommand (
> +               IPMI_NETFN_CHASSIS,
> +               IPMI_CHASSIS_GET_CAPABILITIES,
> +               NULL,
> +               0,
> +               (VOID *)GetChassisCapabilitiesResponse,
> +               &DataSize
> +               );
> +  return Status;
> +}
> +
> +/**
> +  This function gets  information regarding the high-level status of the system
> +  chassis and main power subsystem.
> +
> +  @param [out]  GetChassisStatusResponse  Pointer to
> IPMI_GET_CHASSIS_STATUS_RESPONSE.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiGetChassisStatus (
> +  OUT IPMI_GET_CHASSIS_STATUS_RESPONSE  *GetChassisStatusResponse
> +  )
> +{
> +  EFI_STATUS  Status;
> +  UINT32      DataSize;
> +
> +  DataSize = sizeof (*GetChassisStatusResponse);
> +  Status   = IpmiSubmitCommand (
> +               IPMI_NETFN_CHASSIS,
> +               IPMI_CHASSIS_GET_STATUS,
> +               NULL,
> +               0,
> +               (VOID *)GetChassisStatusResponse,
> +               &DataSize
> +               );
> +  return Status;
> +}
> +
> +/**
> +  This function sends command to control power up, power down, and reset.
> +
> +  @param [in]   ChassisControlRequest  Pointer to
> IPMI_CHASSIS_CONTROL_REQUEST.
> +  @param [out]  CompletionCode         IPMI completetion code, refer to Ipmi.h.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiChassisControl (
> +  IN IPMI_CHASSIS_CONTROL_REQUEST  *ChassisControlRequest,
> +  OUT UINT8                        *CompletionCode
> +  )
> +{
> +  EFI_STATUS  Status;
> +  UINT32      DataSize;
> +
> +  DataSize = sizeof (*CompletionCode);
> +  Status   = IpmiSubmitCommand (
> +               IPMI_NETFN_CHASSIS,
> +               IPMI_CHASSIS_CONTROL,
> +               (VOID *)ChassisControlRequest,
> +               sizeof (*ChassisControlRequest),
> +               (VOID *)CompletionCode,
> +               &DataSize
> +               );
> +  return Status;
> +}
> +
> +/**
> +  This function is used to configure the power restore policy.
> +
> +  @param [in]   ChassisControlRequest   Pointer to
> IPMI_SET_POWER_RESTORE_POLICY_REQUEST.
> +  @param [out]  ChassisControlResponse  Pointer to
> IPMI_SET_POWER_RESTORE_POLICY_RESPONSE.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiSetPowerRestorePolicy (
> +  IN  IPMI_SET_POWER_RESTORE_POLICY_REQUEST   *ChassisControlRequest,
> +  OUT IPMI_SET_POWER_RESTORE_POLICY_RESPONSE
> *ChassisControlResponse
> +  )
> +{
> +  EFI_STATUS  Status;
> +  UINT32      DataSize;
> +
> +  DataSize = sizeof (*ChassisControlResponse);
> +  Status   = IpmiSubmitCommand (
> +               IPMI_NETFN_CHASSIS,
> +               IPMI_CHASSIS_SET_POWER_RESTORE_POLICY,
> +               (VOID *)ChassisControlRequest,
> +               sizeof (*ChassisControlRequest),
> +               (VOID *)ChassisControlResponse,
> +               &DataSize
> +               );
> +  return Status;
> +}
> +
> +/**
> +  This function is used to set parameters that direct the system boot
> +  following a system power up or reset.
> +
> +  @param [in]   BootOptionsRequest   Pointer to
> IPMI_SET_BOOT_OPTIONS_REQUEST.
> +  @param [out]  BootOptionsResponse  Pointer to
> IPMI_SET_BOOT_OPTIONS_RESPONSE.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiSetSystemBootOptions (
> +  IN  IPMI_SET_BOOT_OPTIONS_REQUEST   *BootOptionsRequest,
> +  OUT IPMI_SET_BOOT_OPTIONS_RESPONSE  *BootOptionsResponse
> +  )
> +{
> +  EFI_STATUS  Status;
> +  UINT32      DataSize;
> +
> +  DataSize = sizeof (*BootOptionsResponse);
> +  Status   = IpmiSubmitCommand (
> +               IPMI_NETFN_CHASSIS,
> +               IPMI_CHASSIS_SET_SYSTEM_BOOT_OPTIONS,
> +               (VOID *)BootOptionsRequest,
> +               sizeof (*BootOptionsRequest),
> +               (VOID *)BootOptionsResponse,
> +               &DataSize
> +               );
> +  return Status;
> +}
> +
> +/**
> +  This function is used to retrieve the boot options set by the
> +  Set System Boot Options command.
> +
> +  @param [in]   BootOptionsRequest   Pointer to
> IPMI_GET_BOOT_OPTIONS_REQUEST.
> +  @param [out]  BootOptionsResponse  Pointer to
> IPMI_GET_BOOT_OPTIONS_RESPONSE.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiGetSystemBootOptions (
> +  IN  IPMI_GET_BOOT_OPTIONS_REQUEST   *BootOptionsRequest,
> +  OUT IPMI_GET_BOOT_OPTIONS_RESPONSE  *BootOptionsResponse
> +  )
> +{
> +  EFI_STATUS  Status;
> +  UINT32      DataSize;
> +
> +  DataSize = sizeof (*BootOptionsResponse);
> +  Status   = IpmiSubmitCommand (
> +               IPMI_NETFN_CHASSIS,
> +               IPMI_CHASSIS_GET_SYSTEM_BOOT_OPTIONS,
> +               (VOID *)BootOptionsRequest,
> +               sizeof (*BootOptionsRequest),
> +               (VOID *)BootOptionsResponse,
> +               &DataSize
> +               );
> +  return Status;
> +}
> diff --git
> a/Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLibNetFn
> Storage.c
> b/Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLibNetFn
> Storage.c
> new file mode 100644
> index 0000000000..2dbb7ac9ff
> --- /dev/null
> +++
> b/Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLibNetFn
> Storage.c
> @@ -0,0 +1,384 @@
> +/** @file
> +  IPMI Command - NetFnStorage.
> +
> +  Copyright (c) 2018 - 2021, Intel Corporation. All rights reserved.<BR>
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +**/
> +
> +#include <PiPei.h>
> +#include <Library/BaseMemoryLib.h>
> +#include <Library/DebugLib.h>
> +#include <Library/IpmiLib.h>
> +
> +#include <IndustryStandard/Ipmi.h>
> +
> +/**
> +  This function is used to retrieve FRU Inventory Area
> +
> +  @param [in]  GetFruInventoryAreaInfoRequest   Pointer to
> IPMI_GET_FRU_INVENTORY_AREA_INFO_REQUEST.
> +  @param [out] GetFruInventoryAreaInfoResponse  Pointer to
> IPMI_GET_FRU_INVENTORY_AREA_INFO_RESPONSE.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiGetFruInventoryAreaInfo (
> +  IN  IPMI_GET_FRU_INVENTORY_AREA_INFO_REQUEST
> *GetFruInventoryAreaInfoRequest,
> +  OUT IPMI_GET_FRU_INVENTORY_AREA_INFO_RESPONSE
> *GetFruInventoryAreaInfoResponse
> +  )
> +{
> +  EFI_STATUS  Status;
> +  UINT32      DataSize;
> +
> +  DataSize = sizeof (*GetFruInventoryAreaInfoResponse);
> +  Status   = IpmiSubmitCommand (
> +               IPMI_NETFN_STORAGE,
> +               IPMI_STORAGE_GET_FRU_INVENTORY_AREAINFO,
> +               (VOID *)GetFruInventoryAreaInfoRequest,
> +               sizeof (*GetFruInventoryAreaInfoRequest),
> +               (VOID *)GetFruInventoryAreaInfoResponse,
> +               &DataSize
> +               );
> +  return Status;
> +}
> +
> +/**
> +  This function returns specified data from the FRU Inventory Info area.
> +
> +  @param [in]  ReadFruDataRequest       Pointer to
> IPMI_READ_FRU_DATA_REQUEST.
> +  @param [in]  ReadFruDataResponse      Pointer to
> IPMI_READ_FRU_DATA_RESPONSE.
> +  @param [in, out] ReadFruDataResponseSize  Returns the size of
> ReadFruDataResponse.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiReadFruData (
> +  IN  IPMI_READ_FRU_DATA_REQUEST   *ReadFruDataRequest,
> +  OUT IPMI_READ_FRU_DATA_RESPONSE  *ReadFruDataResponse,
> +  IN OUT UINT32                    *ReadFruDataResponseSize
> +  )
> +{
> +  EFI_STATUS  Status;
> +
> +  Status = IpmiSubmitCommand (
> +             IPMI_NETFN_STORAGE,
> +             IPMI_STORAGE_READ_FRU_DATA,
> +             (VOID *)ReadFruDataRequest,
> +             sizeof (*ReadFruDataRequest),
> +             (VOID *)ReadFruDataResponse,
> +             ReadFruDataResponseSize
> +             );
> +  return Status;
> +}
> +
> +/**
> +  This function writes specified data from the FRU Inventory Info area.
> +
> +  @param [in]  WriteFruDataRequest      Pointer to
> IPMI_WRITE_FRU_DATA_REQUEST.
> +  @param [in]  WriteFruDataRequestSize  Size of WriteFruDataRequest.
> +  @param [out] WriteFruDataResponse     Pointer to receive
> IPMI_WRITE_FRU_DATA_RESPONSE.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiWriteFruData (
> +  IN  IPMI_WRITE_FRU_DATA_REQUEST   *WriteFruDataRequest,
> +  IN  UINT32                        WriteFruDataRequestSize,
> +  OUT IPMI_WRITE_FRU_DATA_RESPONSE  *WriteFruDataResponse
> +  )
> +{
> +  EFI_STATUS  Status;
> +  UINT32      DataSize;
> +
> +  DataSize = sizeof (*WriteFruDataResponse);
> +  Status   = IpmiSubmitCommand (
> +               IPMI_NETFN_STORAGE,
> +               IPMI_STORAGE_WRITE_FRU_DATA,
> +               (VOID *)WriteFruDataRequest,
> +               WriteFruDataRequestSize,
> +               (VOID *)WriteFruDataResponse,
> +               &DataSize
> +               );
> +  return Status;
> +}
> +
> +/**
> +  This function returns the number of entries in the SEL
> +
> +  @param [out] GetSelInfoResponse     Pointer to receive
> IPMI_GET_SEL_INFO_RESPONSE.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiGetSelInfo (
> +  OUT IPMI_GET_SEL_INFO_RESPONSE  *GetSelInfoResponse
> +  )
> +{
> +  EFI_STATUS  Status;
> +  UINT32      DataSize;
> +
> +  DataSize = sizeof (*GetSelInfoResponse);
> +  Status   = IpmiSubmitCommand (
> +               IPMI_NETFN_STORAGE,
> +               IPMI_STORAGE_GET_SEL_INFO,
> +               NULL,
> +               0,
> +               (VOID *)GetSelInfoResponse,
> +               &DataSize
> +               );
> +  return Status;
> +}
> +
> +/**
> +  This function retrieves entries from the SEL
> +
> +  @param [in]  GetSelEntryRequest       Pointer to
> IPMI_GET_SEL_ENTRY_REQUEST.
> +  @param [out] GetSelEntryResponse      Pointer to receive
> IPMI_GET_SEL_ENTRY_RESPONSE.
> +  @param [in, out]  GetSelEntryResponseSize  Size of entire
> GetSelEntryResponse.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiGetSelEntry (
> +  IN IPMI_GET_SEL_ENTRY_REQUEST    *GetSelEntryRequest,
> +  OUT IPMI_GET_SEL_ENTRY_RESPONSE  *GetSelEntryResponse,
> +  IN OUT UINT32                    *GetSelEntryResponseSize
> +  )
> +{
> +  EFI_STATUS  Status;
> +
> +  Status = IpmiSubmitCommand (
> +             IPMI_NETFN_STORAGE,
> +             IPMI_STORAGE_GET_SEL_ENTRY,
> +             (VOID *)GetSelEntryRequest,
> +             sizeof (*GetSelEntryRequest),
> +             (VOID *)GetSelEntryResponse,
> +             GetSelEntryResponseSize
> +             );
> +  return Status;
> +}
> +
> +/**
> +  This function adds an entry in the SEL
> +
> +  @param [in]  AddSelEntryRequest       Pointer to
> IPMI_ADD_SEL_ENTRY_REQUEST.
> +  @param [out] AddSelEntryResponse      Pointer to receive
> IPMI_ADD_SEL_ENTRY_RESPONSE.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiAddSelEntry (
> +  IN IPMI_ADD_SEL_ENTRY_REQUEST    *AddSelEntryRequest,
> +  OUT IPMI_ADD_SEL_ENTRY_RESPONSE  *AddSelEntryResponse
> +  )
> +{
> +  EFI_STATUS  Status;
> +  UINT32      DataSize;
> +
> +  DataSize = sizeof (*AddSelEntryResponse);
> +  Status   = IpmiSubmitCommand (
> +               IPMI_NETFN_STORAGE,
> +               IPMI_STORAGE_ADD_SEL_ENTRY,
> +               (VOID *)AddSelEntryRequest,
> +               sizeof (*AddSelEntryRequest),
> +               (VOID *)AddSelEntryResponse,
> +               &DataSize
> +               );
> +  return Status;
> +}
> +
> +/**
> +  This function adds SEL Entry command that allows the record to be
> incrementally
> +  added to the SEL.
> +
> +  @param [in]  PartialAddSelEntryRequest       Pointer to
> IPMI_PARTIAL_ADD_SEL_ENTRY_REQUEST.
> +  @param [in]  PartialAddSelEntryRequestSize   Size of entire
> PartialAddSelEntryRequest.
> +  @param [out] PartialAddSelEntryResponse      Pointer to receive
> IPMI_PARTIAL_ADD_SEL_ENTRY_RESPONSE.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiPartialAddSelEntry (
> +  IN IPMI_PARTIAL_ADD_SEL_ENTRY_REQUEST    *PartialAddSelEntryRequest,
> +  IN UINT32                                PartialAddSelEntryRequestSize,
> +  OUT IPMI_PARTIAL_ADD_SEL_ENTRY_RESPONSE
> *PartialAddSelEntryResponse
> +  )
> +{
> +  EFI_STATUS  Status;
> +  UINT32      DataSize;
> +
> +  DataSize = sizeof (*PartialAddSelEntryResponse);
> +  Status   = IpmiSubmitCommand (
> +               IPMI_NETFN_STORAGE,
> +               IPMI_STORAGE_PARTIAL_ADD_SEL_ENTRY,
> +               (VOID *)PartialAddSelEntryRequest,
> +               PartialAddSelEntryRequestSize,
> +               (VOID *)PartialAddSelEntryResponse,
> +               &DataSize
> +               );
> +  return Status;
> +}
> +
> +/**
> +  This function erases all contents of the System Event Log.
> +
> +  @param [in]  ClearSelRequest       Pointer to IPMI_CLEAR_SEL_REQUEST.
> +  @param [out] ClearSelResponse      Pointer to receive
> IPMI_CLEAR_SEL_RESPONSE.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiClearSel (
> +  IN IPMI_CLEAR_SEL_REQUEST    *ClearSelRequest,
> +  OUT IPMI_CLEAR_SEL_RESPONSE  *ClearSelResponse
> +  )
> +{
> +  EFI_STATUS  Status;
> +  UINT32      DataSize;
> +
> +  DataSize = sizeof (*ClearSelResponse);
> +  Status   = IpmiSubmitCommand (
> +               IPMI_NETFN_STORAGE,
> +               IPMI_STORAGE_CLEAR_SEL,
> +               (VOID *)ClearSelRequest,
> +               sizeof (*ClearSelRequest),
> +               (VOID *)ClearSelResponse,
> +               &DataSize
> +               );
> +  return Status;
> +}
> +
> +/**
> +  This function returns the time from the SEL Device.
> +
> +  @param [out]  GetSelTimeResponse       Pointer to
> IPMI_GET_SEL_TIME_RESPONSE.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiGetSelTime (
> +  OUT IPMI_GET_SEL_TIME_RESPONSE  *GetSelTimeResponse
> +  )
> +{
> +  EFI_STATUS  Status;
> +  UINT32      DataSize;
> +
> +  DataSize = sizeof (*GetSelTimeResponse);
> +  Status   = IpmiSubmitCommand (
> +               IPMI_NETFN_STORAGE,
> +               IPMI_STORAGE_GET_SEL_TIME,
> +               NULL,
> +               0,
> +               (VOID *)GetSelTimeResponse,
> +               &DataSize
> +               );
> +  return Status;
> +}
> +
> +/**
> +  This function set the time in the SEL Device.
> +
> +  @param [in]  SetSelTimeRequest       Pointer to
> IPMI_SET_SEL_TIME_REQUEST.
> +  @param [out] CompletionCode         IPMI completetion code, refer to Ipmi.h.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiSetSelTime (
> +  IN IPMI_SET_SEL_TIME_REQUEST  *SetSelTimeRequest,
> +  OUT UINT8                     *CompletionCode
> +  )
> +{
> +  EFI_STATUS  Status;
> +  UINT32      DataSize;
> +
> +  DataSize = sizeof (*CompletionCode);
> +  Status   = IpmiSubmitCommand (
> +               IPMI_NETFN_STORAGE,
> +               IPMI_STORAGE_SET_SEL_TIME,
> +               (VOID *)SetSelTimeRequest,
> +               sizeof (*SetSelTimeRequest),
> +               (VOID *)CompletionCode,
> +               &DataSize
> +               );
> +  return Status;
> +}
> +
> +/**
> +  This function returns the SDR command version for the SDR Repository
> +
> +  @param [out] ClearSelResponse      Pointer to receive
> IPMI_GET_SDR_REPOSITORY_INFO_RESPONSE.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiGetSdrRepositoryInfo (
> +  OUT IPMI_GET_SDR_REPOSITORY_INFO_RESPONSE
> *GetSdrRepositoryInfoResp
> +  )
> +{
> +  EFI_STATUS  Status;
> +  UINT32      DataSize;
> +
> +  DataSize = sizeof (*GetSdrRepositoryInfoResp);
> +  Status   = IpmiSubmitCommand (
> +               IPMI_NETFN_STORAGE,
> +               IPMI_STORAGE_GET_SDR_REPOSITORY_INFO,
> +               NULL,
> +               0,
> +               (VOID *)GetSdrRepositoryInfoResp,
> +               &DataSize
> +               );
> +  return Status;
> +}
> +
> +/**
> +  This function returns the sensor record specified by Record ID.
> +
> +  @param [in]  GetSdrRequest       Pointer to IPMI_GET_SDR_REQUEST.
> +  @param [out] GetSdrResponse      Pointer to receive
> IPMI_GET_SDR_RESPONSE.
> +  @param [in, out]  GetSdrResponseSize  Size of entire GetSdrResponse.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiGetSdr (
> +  IN  IPMI_GET_SDR_REQUEST   *GetSdrRequest,
> +  OUT IPMI_GET_SDR_RESPONSE  *GetSdrResponse,
> +  IN OUT UINT32              *GetSdrResponseSize
> +  )
> +{
> +  EFI_STATUS  Status;
> +
> +  Status = IpmiSubmitCommand (
> +             IPMI_NETFN_STORAGE,
> +             IPMI_STORAGE_GET_SDR,
> +             (VOID *)GetSdrRequest,
> +             sizeof (*GetSdrRequest),
> +             (VOID *)GetSdrResponse,
> +             GetSdrResponseSize
> +             );
> +  return Status;
> +}
> diff --git
> a/Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLibNetFn
> Transport.c
> b/Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLibNetFn
> Transport.c
> new file mode 100644
> index 0000000000..a93f7406f1
> --- /dev/null
> +++
> b/Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLibNetFn
> Transport.c
> @@ -0,0 +1,156 @@
> +/** @file
> +  IPMI Command - NetFnTransport.
> +
> +  Copyright (c) 2018 - 2021, Intel Corporation. All rights reserved.<BR>
> +  Copyright (C) 2023 Advanced Micro Devices, Inc. All rights reserved.<BR>
> +
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +**/
> +
> +#include <PiPei.h>
> +#include <Library/BaseMemoryLib.h>
> +#include <Library/DebugLib.h>
> +#include <Library/IpmiLib.h>
> +
> +#include <IndustryStandard/Ipmi.h>
> +
> +/**
> +  This function sends command to BMC to notify a remote application
> +  that a SOL payload is activating on another channel.
> +
> +  @param [in]   SolActivatingRequest  The get channel information request.
> +  @param [out]  CompletionCode        IPMI completetion code, refer to Ipmi.h.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiSolActivating (
> +  IN  IPMI_SOL_ACTIVATING_REQUEST  *SolActivatingRequest,
> +  OUT UINT8                        *CompletionCode
> +  )
> +{
> +  EFI_STATUS  Status;
> +  UINT32      DataSize;
> +
> +  DataSize = sizeof (*CompletionCode);
> +  Status   = IpmiSubmitCommand (
> +               IPMI_NETFN_TRANSPORT,
> +               IPMI_TRANSPORT_SOL_ACTIVATING,
> +               (VOID *)SolActivatingRequest,
> +               sizeof (*SolActivatingRequest),
> +               (VOID *)CompletionCode,
> +               &DataSize
> +               );
> +  return Status;
> +}
> +
> +/**
> +  This function is used to set parameters such as the network addressing
> +  information required for SOL payload operation.
> +
> +  @param [in]   SetConfigurationParametersRequest      Pointer to
> IPMI_SET_SOL_CONFIGURATION_PARAMETERS_REQUEST.
> +  @param [in]   SetConfigurationParametersRequestSize  Size of entire
> SetConfigurationParametersRequestSize.
> +  @param [out]  CompletionCode                         IPMI completetion code, refer
> to Ipmi.h.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiSetSolConfigurationParameters (
> +  IN  IPMI_SET_SOL_CONFIGURATION_PARAMETERS_REQUEST
> *SetConfigurationParametersRequest,
> +  IN  UINT32                                         SetConfigurationParametersRequestSize,
> +  OUT UINT8                                          *CompletionCode
> +  )
> +{
> +  EFI_STATUS  Status;
> +  UINT32      DataSize;
> +
> +  DataSize = sizeof (*CompletionCode);
> +  Status   = IpmiSubmitCommand (
> +               IPMI_NETFN_TRANSPORT,
> +               IPMI_TRANSPORT_SET_SOL_CONFIG_PARAM,
> +               (VOID *)SetConfigurationParametersRequest,
> +               SetConfigurationParametersRequestSize,
> +               (VOID *)CompletionCode,
> +               &DataSize
> +               );
> +  return Status;
> +}
> +
> +/**
> +  This function is used to retrieve the configuration parameters from the
> +  Set SOL Configuration Parameters.
> +
> +  @param [in]       GetConfigurationParametersRequest       Pointer to
> IPMI_SET_SOL_CONFIGURATION_PARAMETERS_REQUEST.
> +  @param [out]      GetConfigurationParametersResponse      Pointer to receive
> IPMI_GET_SOL_CONFIGURATION_PARAMETERS_RESPONSE
> +  @param [in, out]  GetConfigurationParametersResponseSize  When in, which
> is the expected size of
> +                                                            response. When out, which is the actual
> +                                                            size returned.
> +
> +  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand ()
> function.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiGetSolConfigurationParameters (
> +  IN  IPMI_GET_SOL_CONFIGURATION_PARAMETERS_REQUEST
> *GetConfigurationParametersRequest,
> +  OUT IPMI_GET_SOL_CONFIGURATION_PARAMETERS_RESPONSE
> *GetConfigurationParametersResponse,
> +  IN OUT UINT32
> *GetConfigurationParametersResponseSize
> +  )
> +{
> +  EFI_STATUS  Status;
> +
> +  Status = IpmiSubmitCommand (
> +             IPMI_NETFN_TRANSPORT,
> +             IPMI_TRANSPORT_GET_SOL_CONFIG_PARAM,
> +             (VOID *)GetConfigurationParametersRequest,
> +             sizeof (*GetConfigurationParametersRequest),
> +             (VOID *)GetConfigurationParametersResponse,
> +             GetConfigurationParametersResponseSize
> +             );
> +  return Status;
> +}
> +
> +/**
> +  This function gets the LAN configuration parameter.
> +
> +  @param[in]      GetLanConfigurationParametersRequest   Request data
> +  @param[out]     GetLanConfigurationParametersResponse  Response data
> +  @param[in,out]  GetLanConfigurationParametersSize      When input, the
> expected size of response data.
> +                                                         When out, the exact  size of response data.
> +
> +  @retval EFI_SUCCESS            Lan configuration parameter is returned in the
> response.
> +  @retval EFI_INVALID_PARAMETER  One of the given input parameters is
> invalid.
> +  @retval Others                 Other errors.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +IpmiGetLanConfigurationParameters (
> +  IN     IPMI_GET_LAN_CONFIGURATION_PARAMETERS_REQUEST
> *GetLanConfigurationParametersRequest,
> +  OUT    IPMI_GET_LAN_CONFIGURATION_PARAMETERS_RESPONSE
> *GetLanConfigurationParametersResponse,
> +  IN OUT UINT32                                          *GetLanConfigurationParametersSize
> +  )
> +{
> +  EFI_STATUS  Status;
> +
> +  if ((GetLanConfigurationParametersRequest == NULL) ||
> +      (GetLanConfigurationParametersResponse == NULL) ||
> +      (GetLanConfigurationParametersSize == NULL))
> +  {
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  Status = IpmiSubmitCommand (
> +             IPMI_NETFN_TRANSPORT,
> +             IPMI_TRANSPORT_GET_LAN_CONFIG_PARAMETERS,
> +             (UINT8 *)GetLanConfigurationParametersRequest,
> +             sizeof (*GetLanConfigurationParametersRequest),
> +             (UINT8 *)GetLanConfigurationParametersResponse,
> +             GetLanConfigurationParametersSize
> +             );
> +  return Status;
> +}
> --
> 2.37.1.windows.1


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [edk2-platforms][PATCH] ManageabilityPkg/IpmiCommandLib: Add IpmiCommandLib to package
  2023-05-05  5:24 ` [edk2-platforms][PATCH] ManageabilityPkg/IpmiCommandLib: Add IpmiCommandLib to package Chang, Abner
  2023-05-09  6:53   ` Nickle Wang
@ 2023-05-09  6:57   ` Attar, AbdulLateef (Abdul Lateef)
  1 sibling, 0 replies; 8+ messages in thread
From: Attar, AbdulLateef (Abdul Lateef) @ 2023-05-09  6:57 UTC (permalink / raw)
  To: Chang, Abner, devel@edk2.groups.io; +Cc: Isaac Oram, Nickle Wang, Tinh Nguyen

[AMD Official Use Only - General]

Reviewed-by: Abdul Lateef Attar <abdattar@amd.com>

-----Original Message-----
From: Chang, Abner <Abner.Chang@amd.com>
Sent: 05 May 2023 10:54
To: devel@edk2.groups.io
Cc: Isaac Oram <isaac.w.oram@intel.com>; Attar, AbdulLateef (Abdul Lateef) <AbdulLateef.Attar@amd.com>; Nickle Wang <nicklew@nvidia.com>; Tinh Nguyen <tinhnguyen@os.amperecomputing.com>
Subject: [edk2-platforms][PATCH] ManageabilityPkg/IpmiCommandLib: Add IpmiCommandLib to package

From: Abner Chang <abner.chang@amd.com>

BZ #: 4444
Add IpmiCommandLib to ManageabilityPkg package.

Signed-off-by: Abner Chang <abner.chang@amd.com>
Cc: Isaac Oram <isaac.w.oram@intel.com>
Cc: Abdul Lateef Attar <abdattar@amd.com>
Cc: Nickle Wang <nicklew@nvidia.com>
Cc: Tinh Nguyen <tinhnguyen@os.amperecomputing.com>
---
 Features/ManageabilityPkg/ManageabilityPkg.dec      | 4 ++++
 Features/ManageabilityPkg/Include/Manageability.dsc | 1 +
 Features/ManageabilityPkg/ManageabilityPkg.dsc      | 1 +
 3 files changed, 6 insertions(+)

diff --git a/Features/ManageabilityPkg/ManageabilityPkg.dec b/Features/ManageabilityPkg/ManageabilityPkg.dec
index 6f58ab4f45..38813c5f48 100644
--- a/Features/ManageabilityPkg/ManageabilityPkg.dec
+++ b/Features/ManageabilityPkg/ManageabilityPkg.dec
@@ -18,6 +18,10 @@
   Include

 [LibraryClasses]
+  ##  @libraryclass IPMI command library
+  #   Provide the help functions to send IPMI commands.
+  IpmiCommandLib|Include/Library/IpmiCommandLib.h
+
   ##  @libraryclass Manageability Transport Library
   #   Manageability Transport Library definitions
   ManageabilityTransportLib|Include/Library/ManageabilityTransportLib.h
diff --git a/Features/ManageabilityPkg/Include/Manageability.dsc b/Features/ManageabilityPkg/Include/Manageability.dsc
index 5e7cdb885f..a432b0ff26 100644
--- a/Features/ManageabilityPkg/Include/Manageability.dsc
+++ b/Features/ManageabilityPkg/Include/Manageability.dsc
@@ -7,6 +7,7 @@
 ##
 [LibraryClasses]
   ManageabilityTransportHelperLib|ManageabilityPkg/Library/BaseManageabilityTransportHelperLib/BaseManageabilityTransportHelper.inf
+  IpmiCommandLib|ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLib.inf

 [LibraryClasses.common.DXE_DRIVER]
   PldmProtocolLib|ManageabilityPkg/Library/PldmProtocolLibrary/Dxe/PldmProtocolLib.inf
diff --git a/Features/ManageabilityPkg/ManageabilityPkg.dsc b/Features/ManageabilityPkg/ManageabilityPkg.dsc
index a0712d1c0a..e3baf27f2a 100644
--- a/Features/ManageabilityPkg/ManageabilityPkg.dsc
+++ b/Features/ManageabilityPkg/ManageabilityPkg.dsc
@@ -49,6 +49,7 @@
   ManageabilityPkg/Library/ManageabilityTransportKcsLib/Dxe/DxeManageabilityTransportKcs.inf
   ManageabilityPkg/Library/ManageabilityTransportMctpLib/Dxe/DxeManageabilityTransportMctp.inf
   ManageabilityPkg/Library/PldmProtocolLibrary/Dxe/PldmProtocolLib.inf
+  ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLib.inf

 [LibraryClasses]
   ManageabilityTransportLib|ManageabilityPkg/Library/BaseManageabilityTransportNullLib/BaseManageabilityTransportNull.inf
--
2.37.1.windows.1


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [edk2-platforms][PATCH] ManageabilityPkg/IpmiCommandLib:IPMI Command Library
  2023-05-05  5:24 [edk2-platforms][PATCH] ManageabilityPkg/IpmiCommandLib:IPMI Command Library Chang, Abner
                   ` (2 preceding siblings ...)
  2023-05-09  6:54 ` Nickle Wang
@ 2023-05-09  7:01 ` Attar, AbdulLateef (Abdul Lateef)
  3 siblings, 0 replies; 8+ messages in thread
From: Attar, AbdulLateef (Abdul Lateef) @ 2023-05-09  7:01 UTC (permalink / raw)
  To: Chang, Abner, devel@edk2.groups.io; +Cc: Isaac Oram, Nickle Wang, Tinh Nguyen

[AMD Official Use Only - General]

reviewed-by: Abdul Lateef Attar <abdattar@amd.com>

-----Original Message-----
From: Chang, Abner <Abner.Chang@amd.com>
Sent: 05 May 2023 10:54
To: devel@edk2.groups.io
Cc: Isaac Oram <isaac.w.oram@intel.com>; Attar, AbdulLateef (Abdul Lateef) <AbdulLateef.Attar@amd.com>; Nickle Wang <nicklew@nvidia.com>; Tinh Nguyen <tinhnguyen@os.amperecomputing.com>
Subject: [edk2-platforms][PATCH] ManageabilityPkg/IpmiCommandLib:IPMI Command Library

From: Abner Chang <abner.chang@amd.com>

BZ #: 4444

IpmiCommandLib is cloned from
edk2-platforms/Features/Intel/OutOfBandManagement/
IpmiFeaturePkg/Library/IpmiCommandLib in order to
consolidate edk2 system manageability support in
one place. Function header are added to the source
files and header files. Uncustify is applied to C
files and no functionalities are changed in this patch.

We will still keep the one under IpmiFeaturePkg/Library/
IpmiCommandLib until the reference to this instance are
removed from platforms.

Signed-off-by: Abner Chang <abner.chang@amd.com>
Cc: Isaac Oram <isaac.w.oram@intel.com>
Cc: Abdul Lateef Attar <abdattar@amd.com>
Cc: Nickle Wang <nicklew@nvidia.com>
Cc: Tinh Nguyen <tinhnguyen@os.amperecomputing.com>
---
 .../Library/IpmiCommandLib/IpmiCommandLib.inf |  33 +
 .../Include/Library/IpmiCommandLib.h          | 620 ++++++++++++++++++
 .../IpmiCommandLib/IpmiCommandLibNetFnApp.c   | 444 +++++++++++++
 .../IpmiCommandLibNetFnChassis.c              | 199 ++++++
 .../IpmiCommandLibNetFnStorage.c              | 384 +++++++++++
 .../IpmiCommandLibNetFnTransport.c            | 156 +++++
 6 files changed, 1836 insertions(+)
 create mode 100644 Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLib.inf
 create mode 100644 Features/ManageabilityPkg/Include/Library/IpmiCommandLib.h
 create mode 100644 Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLibNetFnApp.c
 create mode 100644 Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLibNetFnChassis.c
 create mode 100644 Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLibNetFnStorage.c
 create mode 100644 Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLibNetFnTransport.c

diff --git a/Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLib.inf b/Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLib.inf
new file mode 100644
index 0000000000..3dc485cf38
--- /dev/null
+++ b/Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLib.inf
@@ -0,0 +1,33 @@
+### @file
+# Component description file for IPMI Command Library.
+#
+# Copyright (c) 2018 - 2021, Intel Corporation. All rights reserved.<BR>
+# Copyright (C) 2023 Advanced Micro Devices, Inc. All rights reserved.<BR>
+#
+# SPDX-License-Identifier: BSD-2-Clause-Patent
+#
+###
+
+[Defines]
+  INF_VERSION                    = 0x00010005
+  BASE_NAME                      = IpmiCommandLib
+  FILE_GUID                      = 96FC1989-CB7F-489B-9D3B-68DCA2C2DADC
+  MODULE_TYPE                    = UEFI_DRIVER
+  VERSION_STRING                 = 1.0
+  LIBRARY_CLASS                  = IpmiCommandLib
+
+[sources]
+  IpmiCommandLibNetFnApp.c
+  IpmiCommandLibNetFnTransport.c
+  IpmiCommandLibNetFnChassis.c
+  IpmiCommandLibNetFnStorage.c
+
+[Packages]
+  MdePkg/MdePkg.dec
+  MdeModulePkg/MdeModulePkg.dec
+  ManageabilityPkg/ManageabilityPkg.dec
+
+[LibraryClasses]
+  BaseMemoryLib
+  DebugLib
+  IpmiLib
diff --git a/Features/ManageabilityPkg/Include/Library/IpmiCommandLib.h b/Features/ManageabilityPkg/Include/Library/IpmiCommandLib.h
new file mode 100644
index 0000000000..685f6e2ea2
--- /dev/null
+++ b/Features/ManageabilityPkg/Include/Library/IpmiCommandLib.h
@@ -0,0 +1,620 @@
+/** @file
+  This library abstract how to send/receive IPMI command.
+
+Copyright (c) 2018-2021, Intel Corporation. All rights reserved.<BR>
+Copyright (C) 2023 Advanced Micro Devices, Inc. All rights reserved.<BR>
+
+SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#ifndef IPMI_COMMAND_LIB_H_
+#define IPMI_COMMAND_LIB_H_
+
+#include <Uefi.h>
+#include <IndustryStandard/Ipmi.h>
+
+///
+/// Functions for IPMI NetFnApp commands
+///
+
+/**
+  This function is used to retrieve device ID.
+
+  @param [out]  DeviceId  The pointer to receive IPMI_GET_DEVICE_ID_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetDeviceId (
+  OUT IPMI_GET_DEVICE_ID_RESPONSE  *DeviceId
+  );
+
+/**
+  This function returns device self test results
+
+  @param [out]  SelfTestResult  The pointer to receive IPMI_SELF_TEST_RESULT_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetSelfTestResult (
+  OUT IPMI_SELF_TEST_RESULT_RESPONSE  *SelfTestResult
+  );
+
+/**
+  This function is used for starting and restarting the Watchdog
+  Timer from the initial countdown value that was specified in
+  the Set Watchdog Timer command the watchdog timer.
+
+  @param [out]  CompletionCode  IPMI completetion code, refer to Ipmi.h.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiResetWatchdogTimer (
+  OUT UINT8  *CompletionCode
+  );
+
+/**
+  This function  is used for initializing and configuring
+  the watchdog timer.
+
+  @param [in]   SetWatchdogTimer  Pointer to receive IPMI_SET_WATCHDOG_TIMER_REQUEST.
+  @param [out]  CompletionCode    IPMI completetion code, refer to Ipmi.h.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiSetWatchdogTimer (
+  IN  IPMI_SET_WATCHDOG_TIMER_REQUEST  *SetWatchdogTimer,
+  OUT UINT8                            *CompletionCode
+  );
+
+/**
+  This function retrieves the current settings and present
+  countdown of the watchdog timer.
+
+  @param [out]  GetWatchdogTimer  Pointer to receive IPMI_GET_WATCHDOG_TIMER_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetWatchdogTimer (
+  OUT IPMI_GET_WATCHDOG_TIMER_RESPONSE  *GetWatchdogTimer
+  );
+
+/**
+  This function enables message reception into Message Buffers,
+  and any interrupt associated with that buffer getting full.
+
+  @param [in]   SetBmcGlobalEnables  Pointer receive to IPMI_SET_BMC_GLOBAL_ENABLES_REQUEST.
+  @param [out]  CompletionCode       IPMI completetion code, refer to Ipmi.h.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiSetBmcGlobalEnables (
+  IN  IPMI_SET_BMC_GLOBAL_ENABLES_REQUEST  *SetBmcGlobalEnables,
+  OUT UINT8                                *CompletionCode
+  );
+
+/**
+  This function retrieves the present setting of the Global Enables
+
+  @param [out]  GetBmcGlobalEnables  Pointer to receive IPMI_GET_BMC_GLOBAL_ENABLES_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetBmcGlobalEnables (
+  OUT IPMI_GET_BMC_GLOBAL_ENABLES_RESPONSE  *GetBmcGlobalEnables
+  );
+
+/**
+  This function is used to flush unread data from the Receive
+  Message Queue or Event Message Buffer
+
+  @param [in]   ClearMessageFlagsRequest IPMI_CLEAR_MESSAGE_FLAGS_REQUEST
+  @param [out]  CompletionCode           IPMI completetion code, refer to Ipmi.h.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiClearMessageFlags (
+  IN  IPMI_CLEAR_MESSAGE_FLAGS_REQUEST  *ClearMessageFlagsRequest,
+  OUT UINT8                             *CompletionCode
+  );
+
+/**
+  This function is used to retrieve the present message available states.
+
+  @param [out]  GetMessageFlagsResponse  Pointer to receive IPMI_GET_MESSAGE_FLAGS_RESPONSE
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetMessageFlags (
+  OUT IPMI_GET_MESSAGE_FLAGS_RESPONSE  *GetMessageFlagsResponse
+  );
+
+/**
+  This function is used to get data from the Receive Message Queue.
+
+  @param [out]      GetMessageResponse      Pointer to receive IPMI_GET_MESSAGE_RESPONSE.
+  @param [in, out]  GetMessageResponseSize  When in, which is the expected size of
+                                            response. When out, which is the actual
+                                            size returned.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetMessage (
+  OUT IPMI_GET_MESSAGE_RESPONSE  *GetMessageResponse,
+  IN OUT UINT32                  *GetMessageResponseSize
+  );
+
+/**
+  This function is used for bridging IPMI messages between channels,
+  and between the system management software (SMS) and a given channel
+
+  @param [in]   SendMessageRequest       Pointer to IPMI_SEND_MESSAGE_REQUEST.
+  @param [in]   SendMessageRequestSize   Size of entire SendMessageRequestSize.
+  @param [out]  SendMessageResponse      Pointer to receive IPMI_SEND_MESSAGE_RESPONSE.
+  @param [in]   SendMessageResponseSize  When in, which is the expected size of
+                                         response. When out, which is the actual
+                                         size returned.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiSendMessage (
+  IN  IPMI_SEND_MESSAGE_REQUEST   *SendMessageRequest,
+  IN  UINT32                      SendMessageRequestSize,
+  OUT IPMI_SEND_MESSAGE_RESPONSE  *SendMessageResponse,
+  IN OUT UINT32                   *SendMessageResponseSize
+  );
+
+/**
+  This function gets the system UUID.
+
+  @param [out]  SystemGuid   The pointer to retrieve system UUID.
+
+  @retval EFI_SUCCESS               UUID is returned.
+  @retval EFI_INVALID_PARAMETER     SystemGuid is a NULL pointer.
+  @retval Others                    See return value of IpmiSubmitCommand () function.
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetSystemUuid (
+  OUT EFI_GUID  *SystemGuid
+  );
+
+/**
+  This function gets the channel information.
+
+  @param [in]   GetChannelInfoRequest       The get channel information request.
+  @param [out]  GetChannelInfoResponse      The get channel information response.
+  @param [out]  GetChannelInfoResponseSize  When input, the expected size of response.
+                                            When output, the exact size of the returned
+                                            response.
+
+  @retval EFI_SUCCESS            Get channel information successfully.
+  @retval EFI_INVALID_PARAMETER  One of the given input parameters is invalid.
+  @retval Others                 See return value of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetChannelInfo (
+  IN  IPMI_GET_CHANNEL_INFO_REQUEST   *GetChannelInfoRequest,
+  OUT IPMI_GET_CHANNEL_INFO_RESPONSE  *GetChannelInfoResponse,
+  OUT UINT32                          *GetChannelInfoResponseSize
+  );
+
+///
+/// Functions for IPMI NetFnTransport commands.
+///
+
+/**
+  This function sends command to BMC to notify a remote application
+  that a SOL payload is activating on another channel.
+
+  @param [in]   SolActivatingRequest  Pointer to IPMI_SOL_ACTIVATING_REQUEST.
+  @param [out]  CompletionCode        IPMI completetion code, refer to Ipmi.h.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiSolActivating (
+  IN  IPMI_SOL_ACTIVATING_REQUEST  *SolActivatingRequest,
+  OUT UINT8                        *CompletionCode
+  );
+
+/**
+  This function is used to set parameters such as the network addressing
+  information required for SOL payload operation.
+
+  @param [in]  SetConfigurationParametersRequest      Pointer to IPMI_SET_SOL_CONFIGURATION_PARAMETERS_REQUEST.
+  @param [in]  SetConfigurationParametersRequestSize  Size of entire SetConfigurationParametersRequestSize.
+  @param [out] CompletionCode                         IPMI completetion code, refer to Ipmi.h.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiSetSolConfigurationParameters (
+  IN  IPMI_SET_SOL_CONFIGURATION_PARAMETERS_REQUEST  *SetConfigurationParametersRequest,
+  IN  UINT32                                         SetConfigurationParametersRequestSize,
+  OUT UINT8                                          *CompletionCode
+  );
+
+/**
+  This function is used to retrieve the configuration parameters from the
+  Set SOL Configuration Parameters.
+
+  @param [in]       GetConfigurationParametersRequest       Pointer to IPMI_SET_SOL_CONFIGURATION_PARAMETERS_REQUEST.
+  @param [out]      GetConfigurationParametersResponse      Pointer to receive IPMI_GET_SOL_CONFIGURATION_PARAMETERS_RESPONSE.
+  @param [in, out]  GetConfigurationParametersResponseSize  When in, which is the expected size of
+                                                            response. When out, which is the actual
+                                                            size returned.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetSolConfigurationParameters (
+  IN  IPMI_GET_SOL_CONFIGURATION_PARAMETERS_REQUEST   *GetConfigurationParametersRequest,
+  OUT IPMI_GET_SOL_CONFIGURATION_PARAMETERS_RESPONSE  *GetConfigurationParametersResponse,
+  IN OUT UINT32                                       *GetConfigurationParametersResponseSize
+  );
+
+/**
+  This function gets the LAN configuration parameter.
+
+  @param[in]      GetLanConfigurationParametersRequest   Request data
+  @param[out]     GetLanConfigurationParametersResponse  Response data
+  @param[in,out]  GetLanConfigurationParametersSize      When input, the expected size of response data.
+                                                         When out, the exact size of response data.
+
+  @retval EFI_SUCCESS            Lan configuration parameter is returned in the response.
+  @retval EFI_INVALID_PARAMETER  One of the given input parameters is invalid.
+  @retval Others                 Other errors.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetLanConfigurationParameters (
+  IN     IPMI_GET_LAN_CONFIGURATION_PARAMETERS_REQUEST   *GetLanConfigurationParametersRequest,
+  OUT    IPMI_GET_LAN_CONFIGURATION_PARAMETERS_RESPONSE  *GetLanConfigurationParametersResponse,
+  IN OUT UINT32                                          *GetLanConfigurationParametersSize
+  );
+
+///
+/// Functions for IPMI NetFnChasis commands
+///
+
+/**
+  This function returns information about which main chassis management functions are
+  present and  what addresses are used to access those functions.
+
+  @param [out]  GetChassisCapabilitiesResponse  Pointer to IPMI_GET_CHASSIS_CAPABILITIES_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetChassisCapabilities (
+  OUT IPMI_GET_CHASSIS_CAPABILITIES_RESPONSE  *GetChassisCapabilitiesResponse
+  );
+
+/**
+  This function gets  information regarding the high-level status of the system
+  chassis and main power subsystem.
+
+  @param [out]  GetChassisStatusResponse  Pointer to IPMI_GET_CHASSIS_STATUS_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetChassisStatus (
+  OUT IPMI_GET_CHASSIS_STATUS_RESPONSE  *GetChassisStatusResponse
+  );
+
+/**
+  This function sends command to control power up, power down, and reset.
+
+  @param [in]   ChassisControlRequest  Pointer to IPMI_CHASSIS_CONTROL_REQUEST.
+  @param [out]  CompletionCode         IPMI completetion code, refer to Ipmi.h.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiChassisControl (
+  IN IPMI_CHASSIS_CONTROL_REQUEST  *ChassisControlRequest,
+  OUT UINT8                        *CompletionCode
+  );
+
+/**
+  This function is used to configure the power restore policy.
+
+  @param [in]   ChassisControlRequest   Pointer to IPMI_SET_POWER_RESTORE_POLICY_REQUEST.
+  @param [out]  ChassisControlResponse  Pointer to IPMI_SET_POWER_RESTORE_POLICY_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiSetPowerRestorePolicy (
+  IN  IPMI_SET_POWER_RESTORE_POLICY_REQUEST   *ChassisControlRequest,
+  OUT IPMI_SET_POWER_RESTORE_POLICY_RESPONSE  *ChassisControlResponse
+  );
+
+/**
+  This function is used to set parameters that direct the system boot
+  following a system power up or reset.
+
+  @param [in]   BootOptionsRequest   Pointer to IPMI_SET_BOOT_OPTIONS_REQUEST.
+  @param [out]  BootOptionsResponse  Pointer to IPMI_SET_BOOT_OPTIONS_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiSetSystemBootOptions (
+  IN  IPMI_SET_BOOT_OPTIONS_REQUEST   *BootOptionsRequest,
+  OUT IPMI_SET_BOOT_OPTIONS_RESPONSE  *BootOptionsResponse
+  );
+
+/**
+  This function is used to retrieve the boot options set by the
+  Set System Boot Options command.
+
+  @param [in]   BootOptionsRequest   Pointer to IPMI_GET_BOOT_OPTIONS_REQUEST.
+  @param [out]  BootOptionsResponse  Pointer to IPMI_GET_BOOT_OPTIONS_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetSystemBootOptions (
+  IN  IPMI_GET_BOOT_OPTIONS_REQUEST   *BootOptionsRequest,
+  OUT IPMI_GET_BOOT_OPTIONS_RESPONSE  *BootOptionsResponse
+  );
+
+///
+/// Functions for IPMI NetFnStorage commands
+///
+
+/**
+  This function is used to retrieve FRU Inventory Area
+
+  @param [in]   GetFruInventoryAreaInfoRequest   Pointer to IPMI_GET_FRU_INVENTORY_AREA_INFO_REQUEST.
+  @param [out]  GetFruInventoryAreaInfoResponse  Pointer to IPMI_GET_FRU_INVENTORY_AREA_INFO_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetFruInventoryAreaInfo (
+  IN  IPMI_GET_FRU_INVENTORY_AREA_INFO_REQUEST   *GetFruInventoryAreaInfoRequest,
+  OUT IPMI_GET_FRU_INVENTORY_AREA_INFO_RESPONSE  *GetFruInventoryAreaInfoResponse
+  );
+
+/**
+  This function returns specified data from the FRU Inventory Info area.
+
+  @param [in]       ReadFruDataRequest       Pointer to IPMI_READ_FRU_DATA_REQUEST.
+  @param [out]      ReadFruDataResponse      Pointer to IPMI_READ_FRU_DATA_RESPONSE.
+  @param [in, out]  ReadFruDataResponseSize  Returns the size of ReadFruDataResponse.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiReadFruData (
+  IN  IPMI_READ_FRU_DATA_REQUEST   *ReadFruDataRequest,
+  OUT IPMI_READ_FRU_DATA_RESPONSE  *ReadFruDataResponse,
+  IN OUT UINT32                    *ReadFruDataResponseSize
+  );
+
+/**
+  This function writes specified data from the FRU Inventory Info area.
+
+  @param [in]   WriteFruDataRequest      Pointer to IPMI_WRITE_FRU_DATA_REQUEST.
+  @param [in]   WriteFruDataRequestSize  Size of WriteFruDataRequest.
+  @param [out]  WriteFruDataResponse     Pointer to receive IPMI_WRITE_FRU_DATA_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiWriteFruData (
+  IN  IPMI_WRITE_FRU_DATA_REQUEST   *WriteFruDataRequest,
+  IN  UINT32                        WriteFruDataRequestSize,
+  OUT IPMI_WRITE_FRU_DATA_RESPONSE  *WriteFruDataResponse
+  );
+
+/**
+  This function returns the number of entries in the SEL
+
+  @param [out] GetSelInfoResponse     Pointer to receive IPMI_GET_SEL_INFO_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetSelInfo (
+  OUT IPMI_GET_SEL_INFO_RESPONSE  *GetSelInfoResponse
+  );
+
+/**
+  This function retrieves entries from the SEL
+
+  @param [in]   GetSelEntryRequest       Pointer to IPMI_GET_SEL_ENTRY_REQUEST.
+  @param [out]  GetSelEntryResponse      Pointer to receive IPMI_GET_SEL_ENTRY_RESPONSE.
+  @param [in]   GetSelEntryResponseSize  Size of entire GetSelEntryResponse.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetSelEntry (
+  IN IPMI_GET_SEL_ENTRY_REQUEST    *GetSelEntryRequest,
+  OUT IPMI_GET_SEL_ENTRY_RESPONSE  *GetSelEntryResponse,
+  IN OUT UINT32                    *GetSelEntryResponseSize
+  );
+
+/**
+  This function adds an entry in the SEL
+
+  @param [in]   AddSelEntryRequest   Pointer to IPMI_ADD_SEL_ENTRY_REQUEST.
+  @param [out]  AddSelEntryResponse  Pointer to receive IPMI_ADD_SEL_ENTRY_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiAddSelEntry (
+  IN IPMI_ADD_SEL_ENTRY_REQUEST    *AddSelEntryRequest,
+  OUT IPMI_ADD_SEL_ENTRY_RESPONSE  *AddSelEntryResponse
+  );
+
+/**
+  This function adds SEL Entry command that allows the record to be incrementally
+  added to the SEL.
+
+  @param [in]  PartialAddSelEntryRequest      Pointer to IPMI_PARTIAL_ADD_SEL_ENTRY_REQUEST.
+  @param [in]  PartialAddSelEntryRequestSize  Size of entire PartialAddSelEntryRequest.
+  @param [out] PartialAddSelEntryResponse     Pointer to receive IPMI_PARTIAL_ADD_SEL_ENTRY_RESPONSE.
+
+  @retval EFI_STASTUS   See return value of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiPartialAddSelEntry (
+  IN IPMI_PARTIAL_ADD_SEL_ENTRY_REQUEST    *PartialAddSelEntryRequest,
+  IN UINT32                                PartialAddSelEntryRequestSize,
+  OUT IPMI_PARTIAL_ADD_SEL_ENTRY_RESPONSE  *PartialAddSelEntryResponse
+  );
+
+/**
+  This function erases all contents of the System Event Log.
+
+  @param [in]   ClearSelRequest   Pointer to IPMI_CLEAR_SEL_REQUEST.
+  @param [out]  ClearSelResponse  Pointer to receive IPMI_CLEAR_SEL_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiClearSel (
+  IN IPMI_CLEAR_SEL_REQUEST    *ClearSelRequest,
+  OUT IPMI_CLEAR_SEL_RESPONSE  *ClearSelResponse
+  );
+
+/**
+  This function returns the time from the SEL Device.
+
+  @param [out]  GetSelTimeResponse  Pointer to IPMI_GET_SEL_TIME_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetSelTime (
+  OUT IPMI_GET_SEL_TIME_RESPONSE  *GetSelTimeResponse
+  );
+
+/**
+  This function set the time in the SEL Device.
+
+  @param [in]   SetSelTimeRequest  Pointer to IPMI_SET_SEL_TIME_REQUEST.
+  @param [out]  CompletionCode     IPMI completetion code, refer to Ipmi.h.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiSetSelTime (
+  IN IPMI_SET_SEL_TIME_REQUEST  *SetSelTimeRequest,
+  OUT UINT8                     *CompletionCode
+  );
+
+/**
+  This function returns the SDR command version for the SDR Repository.
+
+  @param [out]  ClearSelResponse  Pointer to receive IPMI_GET_SDR_REPOSITORY_INFO_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetSdrRepositoryInfo (
+  OUT IPMI_GET_SDR_REPOSITORY_INFO_RESPONSE  *GetSdrRepositoryInfoResp
+  );
+
+/**
+  This function returns the sensor record specified by Record ID.
+
+  @param [in]       GetSdrRequest       Pointer to IPMI_GET_SDR_REQUEST.
+  @param [out]      GetSdrResponse      Pointer to receive IPMI_GET_SDR_RESPONSE.
+  @param [in, out]  GetSdrResponseSize  Size of entire GetSdrResponse.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetSdr (
+  IN  IPMI_GET_SDR_REQUEST   *GetSdrRequest,
+  OUT IPMI_GET_SDR_RESPONSE  *GetSdrResponse,
+  IN OUT UINT32              *GetSdrResponseSize
+  );
+
+#endif // IPMI_COMMAND_LIB_H_
diff --git a/Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLibNetFnApp.c b/Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLibNetFnApp.c
new file mode 100644
index 0000000000..30c412e2f4
--- /dev/null
+++ b/Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLibNetFnApp.c
@@ -0,0 +1,444 @@
+/** @file
+  IPMI Command - NetFnApp.
+
+  Copyright (c) 2018 - 2021, Intel Corporation. All rights reserved.<BR>
+  Copyright (C) 2023 Advanced Micro Devices, Inc. All rights reserved.<BR>
+
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+**/
+
+#include <PiPei.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/DebugLib.h>
+#include <Library/IpmiLib.h>
+
+#include <IndustryStandard/Ipmi.h>
+
+/**
+  This function is used to retrieve device ID.
+
+  @param [out]  DeviceId  The pointer to receive IPMI_GET_DEVICE_ID_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetDeviceId (
+  OUT IPMI_GET_DEVICE_ID_RESPONSE  *DeviceId
+  )
+{
+  EFI_STATUS  Status;
+  UINT32      DataSize;
+
+  DataSize = sizeof (*DeviceId);
+  Status   = IpmiSubmitCommand (
+               IPMI_NETFN_APP,
+               IPMI_APP_GET_DEVICE_ID,
+               NULL,
+               0,
+               (VOID *)DeviceId,
+               &DataSize
+               );
+  return Status;
+}
+
+/**
+  This function returns device self test results
+
+  @param [out]  SelfTestResult  The pointer to receive IPMI_SELF_TEST_RESULT_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetSelfTestResult (
+  OUT IPMI_SELF_TEST_RESULT_RESPONSE  *SelfTestResult
+  )
+{
+  EFI_STATUS  Status;
+  UINT32      DataSize;
+
+  DataSize = sizeof (*SelfTestResult);
+  Status   = IpmiSubmitCommand (
+               IPMI_NETFN_APP,
+               IPMI_APP_GET_SELFTEST_RESULTS,
+               NULL,
+               0,
+               (VOID *)SelfTestResult,
+               &DataSize
+               );
+  return Status;
+}
+
+/**
+  This function is used for starting and restarting the Watchdog
+  Timer from the initial countdown value that was specified in
+  the Set Watchdog Timer command the watchdog timer
+
+  @param [out]  CompletionCode  IPMI completetion code, refer to Ipmi.h.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiResetWatchdogTimer (
+  OUT UINT8  *CompletionCode
+  )
+{
+  EFI_STATUS  Status;
+  UINT32      DataSize;
+
+  DataSize = sizeof (*CompletionCode);
+  Status   = IpmiSubmitCommand (
+               IPMI_NETFN_APP,
+               IPMI_APP_RESET_WATCHDOG_TIMER,
+               NULL,
+               0,
+               (VOID *)CompletionCode,
+               &DataSize
+               );
+  return Status;
+}
+
+/**
+  This function  is used for initializing and configuring
+  the watchdog timer.
+
+  @param [in]   SetWatchdogTimer  Pointer to receive IPMI_SET_WATCHDOG_TIMER_REQUEST.
+  @param [out]  CompletionCode    IPMI completetion code, refer to Ipmi.h.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiSetWatchdogTimer (
+  IN  IPMI_SET_WATCHDOG_TIMER_REQUEST  *SetWatchdogTimer,
+  OUT UINT8                            *CompletionCode
+  )
+{
+  EFI_STATUS  Status;
+  UINT32      DataSize;
+
+  DataSize = sizeof (*CompletionCode);
+  Status   = IpmiSubmitCommand (
+               IPMI_NETFN_APP,
+               IPMI_APP_SET_WATCHDOG_TIMER,
+               (VOID *)SetWatchdogTimer,
+               sizeof (*SetWatchdogTimer),
+               (VOID *)CompletionCode,
+               &DataSize
+               );
+  return Status;
+}
+
+/**
+  This function retrieves the current settings and present
+  countdown of the watchdog timer.
+
+  @param [out]  GetWatchdogTimer  Pointer to receive IPMI_GET_WATCHDOG_TIMER_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetWatchdogTimer (
+  OUT IPMI_GET_WATCHDOG_TIMER_RESPONSE  *GetWatchdogTimer
+  )
+{
+  EFI_STATUS  Status;
+  UINT32      DataSize;
+
+  DataSize = sizeof (*GetWatchdogTimer);
+  Status   = IpmiSubmitCommand (
+               IPMI_NETFN_APP,
+               IPMI_APP_GET_WATCHDOG_TIMER,
+               NULL,
+               0,
+               (VOID *)GetWatchdogTimer,
+               &DataSize
+               );
+  return Status;
+}
+
+/**
+  This function enables message reception into Message Buffers,
+  and any interrupt associated with that buffer getting full.
+
+  @param [in]   SetBmcGlobalEnables  Pointer receive to IPMI_SET_BMC_GLOBAL_ENABLES_REQUEST.
+  @param [out]  CompletionCode      IPMI completetion code refer to Ipmi.h.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiSetBmcGlobalEnables (
+  IN  IPMI_SET_BMC_GLOBAL_ENABLES_REQUEST  *SetBmcGlobalEnables,
+  OUT UINT8                                *CompletionCode
+  )
+{
+  EFI_STATUS  Status;
+  UINT32      DataSize;
+
+  DataSize = sizeof (*CompletionCode);
+  Status   = IpmiSubmitCommand (
+               IPMI_NETFN_APP,
+               IPMI_APP_SET_BMC_GLOBAL_ENABLES,
+               (VOID *)SetBmcGlobalEnables,
+               sizeof (*SetBmcGlobalEnables),
+               (VOID *)CompletionCode,
+               &DataSize
+               );
+  return Status;
+}
+
+/**
+  This function retrieves the present setting of the Global Enables
+
+  @param [out]  GetBmcGlobalEnables  Pointer to receive IPMI_GET_BMC_GLOBAL_ENABLES_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetBmcGlobalEnables (
+  OUT IPMI_GET_BMC_GLOBAL_ENABLES_RESPONSE  *GetBmcGlobalEnables
+  )
+{
+  EFI_STATUS  Status;
+  UINT32      DataSize;
+
+  DataSize = sizeof (*GetBmcGlobalEnables);
+  Status   = IpmiSubmitCommand (
+               IPMI_NETFN_APP,
+               IPMI_APP_GET_BMC_GLOBAL_ENABLES,
+               NULL,
+               0,
+               (VOID *)GetBmcGlobalEnables,
+               &DataSize
+               );
+  return Status;
+}
+
+/**
+  This function is used to flush unread data from the Receive
+  Message Queue or Event Message Buffer
+
+  @param [in]   ClearMessageFlagsRequest IPMI_CLEAR_MESSAGE_FLAGS_REQUEST
+  @param [out]  CompletionCode           IPMI completetion code, refer to Ipmi.h.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiClearMessageFlags (
+  IN  IPMI_CLEAR_MESSAGE_FLAGS_REQUEST  *ClearMessageFlagsRequest,
+  OUT UINT8                             *CompletionCode
+  )
+{
+  EFI_STATUS  Status;
+  UINT32      DataSize;
+
+  DataSize = sizeof (*CompletionCode);
+  Status   = IpmiSubmitCommand (
+               IPMI_NETFN_APP,
+               IPMI_APP_CLEAR_MESSAGE_FLAGS,
+               (VOID *)ClearMessageFlagsRequest,
+               sizeof (*ClearMessageFlagsRequest),
+               (VOID *)CompletionCode,
+               &DataSize
+               );
+  return Status;
+}
+
+/**
+  This function is used to retrieve the present message available states.
+
+  @param  [out]  GetMessageFlagsResponse  Pointer to receive IPMI_GET_MESSAGE_FLAGS_RESPONSE
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetMessageFlags (
+  OUT IPMI_GET_MESSAGE_FLAGS_RESPONSE  *GetMessageFlagsResponse
+  )
+{
+  EFI_STATUS  Status;
+  UINT32      DataSize;
+
+  DataSize = sizeof (*GetMessageFlagsResponse);
+  Status   = IpmiSubmitCommand (
+               IPMI_NETFN_APP,
+               IPMI_APP_GET_MESSAGE_FLAGS,
+               NULL,
+               0,
+               (VOID *)GetMessageFlagsResponse,
+               &DataSize
+               );
+  return Status;
+}
+
+/**
+  This function is used to get data from the Receive Message Queue.
+
+  @param [out]      GetMessageResponse      Pointer to receive IPMI_GET_MESSAGE_RESPONSE.
+  @param [in, out]  GetMessageResponseSize  When in, which is the expected size of
+                                            response. When out, which is the actual
+                                            size returned.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetMessage (
+  OUT IPMI_GET_MESSAGE_RESPONSE  *GetMessageResponse,
+  IN OUT UINT32                  *GetMessageResponseSize
+  )
+{
+  EFI_STATUS  Status;
+
+  Status = IpmiSubmitCommand (
+             IPMI_NETFN_APP,
+             IPMI_APP_GET_MESSAGE,
+             NULL,
+             0,
+             (VOID *)GetMessageResponse,
+             GetMessageResponseSize
+             );
+  return Status;
+}
+
+/**
+  This function is used for bridging IPMI messages between channels,
+  and between the system management software (SMS) and a given channel
+
+  @param [in]   SendMessageRequest       Pointer to IPMI_SEND_MESSAGE_REQUEST.
+  @param [in]   SendMessageRequestSize   Size of entire SendMessageRequestSize.
+  @param [out]  SendMessageResponse      Pointer to receive IPMI_SEND_MESSAGE_RESPONSE.
+  @param [in]   SendMessageResponseSize  When in, which is the expected size of
+                                         response. When out, which is the actual
+                                         size returned.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiSendMessage (
+  IN  IPMI_SEND_MESSAGE_REQUEST   *SendMessageRequest,
+  IN  UINT32                      SendMessageRequestSize,
+  OUT IPMI_SEND_MESSAGE_RESPONSE  *SendMessageResponse,
+  IN OUT UINT32                   *SendMessageResponseSize
+  )
+{
+  EFI_STATUS  Status;
+
+  Status = IpmiSubmitCommand (
+             IPMI_NETFN_APP,
+             IPMI_APP_SEND_MESSAGE,
+             (VOID *)SendMessageRequest,
+             SendMessageRequestSize,
+             (VOID *)SendMessageResponse,
+             SendMessageResponseSize
+             );
+  return Status;
+}
+
+/**
+  This function gets the system UUID.
+
+  @param[out] SystemGuid   The pointer to retrieve system UUID.
+
+  @retval EFI_SUCCESS               UUID is returned.
+  @retval EFI_INVALID_PARAMETER     SystemGuid is a NULL pointer.
+  @retval Others                    See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetSystemUuid (
+  OUT EFI_GUID  *SystemGuid
+  )
+{
+  EFI_STATUS                     Status;
+  UINT32                         RequestSize;
+  UINT32                         ResponseSize;
+  IPMI_GET_SYSTEM_UUID_RESPONSE  GetSystemUuidResponse;
+
+  if (SystemGuid == NULL) {
+    return EFI_INVALID_PARAMETER;
+  }
+
+  RequestSize  = 0;
+  ResponseSize = sizeof (IPMI_GET_SYSTEM_UUID_RESPONSE);
+  Status       = IpmiSubmitCommand (
+                   IPMI_NETFN_APP,
+                   IPMI_APP_GET_SYSTEM_GUID,
+                   (VOID *)NULL,
+                   RequestSize,
+                   (VOID *)&GetSystemUuidResponse,
+                   &ResponseSize
+                   );
+  if (!EFI_ERROR (Status) && (GetSystemUuidResponse.CompletionCode == IPMI_COMP_CODE_NORMAL)) {
+    CopyMem (
+      (VOID *)SystemGuid,
+      (VOID *)&GetSystemUuidResponse.SystemUuid,
+      sizeof (EFI_GUID)
+      );
+  }
+
+  return Status;
+}
+
+/**
+  This function gets the channel information.
+
+  @param[in]   GetChannelInfoRequest          The get channel information request.
+  @param[out]  GetChannelInfoResponse         The get channel information response.
+  @param[out]  GetChannelInfoResponseSize     When input, the expected size of response.
+                                              When output, the exact size of the returned
+                                              response.
+
+  @retval EFI_SUCCESS            Get channel information successfully.
+  @retval EFI_INVALID_PARAMETER  One of the given input parameters is invalid.
+  @retval Others                 See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetChannelInfo (
+  IN  IPMI_GET_CHANNEL_INFO_REQUEST   *GetChannelInfoRequest,
+  OUT IPMI_GET_CHANNEL_INFO_RESPONSE  *GetChannelInfoResponse,
+  OUT UINT32                          *GetChannelInfoResponseSize
+  )
+{
+  EFI_STATUS  Status;
+
+  if ((GetChannelInfoRequest == NULL) ||
+      (GetChannelInfoResponse == NULL) ||
+      (GetChannelInfoResponseSize == NULL))
+  {
+    return EFI_INVALID_PARAMETER;
+  }
+
+  *GetChannelInfoResponseSize = sizeof (IPMI_GET_CHANNEL_INFO_RESPONSE);
+  Status                      = IpmiSubmitCommand (
+                                  IPMI_NETFN_APP,
+                                  IPMI_APP_GET_CHANNEL_INFO,
+                                  (UINT8 *)GetChannelInfoRequest,
+                                  sizeof (IPMI_GET_CHANNEL_INFO_REQUEST),
+                                  (UINT8 *)GetChannelInfoResponse,
+                                  GetChannelInfoResponseSize
+                                  );
+  return Status;
+}
diff --git a/Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLibNetFnChassis.c b/Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLibNetFnChassis.c
new file mode 100644
index 0000000000..12fd997b11
--- /dev/null
+++ b/Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLibNetFnChassis.c
@@ -0,0 +1,199 @@
+/** @file
+  IPMI Command - NetFnChassis.
+
+  Copyright (c) 2018 - 2021, Intel Corporation. All rights reserved.<BR>
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+**/
+
+#include <PiPei.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/DebugLib.h>
+#include <Library/IpmiLib.h>
+
+#include <IndustryStandard/Ipmi.h>
+
+/**
+  This function returns information about which main chassis management functions are
+  present and  what addresses are used to access those functions.
+
+  @param [out]  GetChassisCapabilitiesResponse  Pointer to IPMI_GET_CHASSIS_CAPABILITIES_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetChassisCapabilities (
+  OUT IPMI_GET_CHASSIS_CAPABILITIES_RESPONSE  *GetChassisCapabilitiesResponse
+  )
+{
+  EFI_STATUS  Status;
+  UINT32      DataSize;
+
+  DataSize = sizeof (*GetChassisCapabilitiesResponse);
+  Status   = IpmiSubmitCommand (
+               IPMI_NETFN_CHASSIS,
+               IPMI_CHASSIS_GET_CAPABILITIES,
+               NULL,
+               0,
+               (VOID *)GetChassisCapabilitiesResponse,
+               &DataSize
+               );
+  return Status;
+}
+
+/**
+  This function gets  information regarding the high-level status of the system
+  chassis and main power subsystem.
+
+  @param [out]  GetChassisStatusResponse  Pointer to IPMI_GET_CHASSIS_STATUS_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetChassisStatus (
+  OUT IPMI_GET_CHASSIS_STATUS_RESPONSE  *GetChassisStatusResponse
+  )
+{
+  EFI_STATUS  Status;
+  UINT32      DataSize;
+
+  DataSize = sizeof (*GetChassisStatusResponse);
+  Status   = IpmiSubmitCommand (
+               IPMI_NETFN_CHASSIS,
+               IPMI_CHASSIS_GET_STATUS,
+               NULL,
+               0,
+               (VOID *)GetChassisStatusResponse,
+               &DataSize
+               );
+  return Status;
+}
+
+/**
+  This function sends command to control power up, power down, and reset.
+
+  @param [in]   ChassisControlRequest  Pointer to IPMI_CHASSIS_CONTROL_REQUEST.
+  @param [out]  CompletionCode         IPMI completetion code, refer to Ipmi.h.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiChassisControl (
+  IN IPMI_CHASSIS_CONTROL_REQUEST  *ChassisControlRequest,
+  OUT UINT8                        *CompletionCode
+  )
+{
+  EFI_STATUS  Status;
+  UINT32      DataSize;
+
+  DataSize = sizeof (*CompletionCode);
+  Status   = IpmiSubmitCommand (
+               IPMI_NETFN_CHASSIS,
+               IPMI_CHASSIS_CONTROL,
+               (VOID *)ChassisControlRequest,
+               sizeof (*ChassisControlRequest),
+               (VOID *)CompletionCode,
+               &DataSize
+               );
+  return Status;
+}
+
+/**
+  This function is used to configure the power restore policy.
+
+  @param [in]   ChassisControlRequest   Pointer to IPMI_SET_POWER_RESTORE_POLICY_REQUEST.
+  @param [out]  ChassisControlResponse  Pointer to IPMI_SET_POWER_RESTORE_POLICY_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiSetPowerRestorePolicy (
+  IN  IPMI_SET_POWER_RESTORE_POLICY_REQUEST   *ChassisControlRequest,
+  OUT IPMI_SET_POWER_RESTORE_POLICY_RESPONSE  *ChassisControlResponse
+  )
+{
+  EFI_STATUS  Status;
+  UINT32      DataSize;
+
+  DataSize = sizeof (*ChassisControlResponse);
+  Status   = IpmiSubmitCommand (
+               IPMI_NETFN_CHASSIS,
+               IPMI_CHASSIS_SET_POWER_RESTORE_POLICY,
+               (VOID *)ChassisControlRequest,
+               sizeof (*ChassisControlRequest),
+               (VOID *)ChassisControlResponse,
+               &DataSize
+               );
+  return Status;
+}
+
+/**
+  This function is used to set parameters that direct the system boot
+  following a system power up or reset.
+
+  @param [in]   BootOptionsRequest   Pointer to IPMI_SET_BOOT_OPTIONS_REQUEST.
+  @param [out]  BootOptionsResponse  Pointer to IPMI_SET_BOOT_OPTIONS_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiSetSystemBootOptions (
+  IN  IPMI_SET_BOOT_OPTIONS_REQUEST   *BootOptionsRequest,
+  OUT IPMI_SET_BOOT_OPTIONS_RESPONSE  *BootOptionsResponse
+  )
+{
+  EFI_STATUS  Status;
+  UINT32      DataSize;
+
+  DataSize = sizeof (*BootOptionsResponse);
+  Status   = IpmiSubmitCommand (
+               IPMI_NETFN_CHASSIS,
+               IPMI_CHASSIS_SET_SYSTEM_BOOT_OPTIONS,
+               (VOID *)BootOptionsRequest,
+               sizeof (*BootOptionsRequest),
+               (VOID *)BootOptionsResponse,
+               &DataSize
+               );
+  return Status;
+}
+
+/**
+  This function is used to retrieve the boot options set by the
+  Set System Boot Options command.
+
+  @param [in]   BootOptionsRequest   Pointer to IPMI_GET_BOOT_OPTIONS_REQUEST.
+  @param [out]  BootOptionsResponse  Pointer to IPMI_GET_BOOT_OPTIONS_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetSystemBootOptions (
+  IN  IPMI_GET_BOOT_OPTIONS_REQUEST   *BootOptionsRequest,
+  OUT IPMI_GET_BOOT_OPTIONS_RESPONSE  *BootOptionsResponse
+  )
+{
+  EFI_STATUS  Status;
+  UINT32      DataSize;
+
+  DataSize = sizeof (*BootOptionsResponse);
+  Status   = IpmiSubmitCommand (
+               IPMI_NETFN_CHASSIS,
+               IPMI_CHASSIS_GET_SYSTEM_BOOT_OPTIONS,
+               (VOID *)BootOptionsRequest,
+               sizeof (*BootOptionsRequest),
+               (VOID *)BootOptionsResponse,
+               &DataSize
+               );
+  return Status;
+}
diff --git a/Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLibNetFnStorage.c b/Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLibNetFnStorage.c
new file mode 100644
index 0000000000..2dbb7ac9ff
--- /dev/null
+++ b/Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLibNetFnStorage.c
@@ -0,0 +1,384 @@
+/** @file
+  IPMI Command - NetFnStorage.
+
+  Copyright (c) 2018 - 2021, Intel Corporation. All rights reserved.<BR>
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+**/
+
+#include <PiPei.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/DebugLib.h>
+#include <Library/IpmiLib.h>
+
+#include <IndustryStandard/Ipmi.h>
+
+/**
+  This function is used to retrieve FRU Inventory Area
+
+  @param [in]  GetFruInventoryAreaInfoRequest   Pointer to IPMI_GET_FRU_INVENTORY_AREA_INFO_REQUEST.
+  @param [out] GetFruInventoryAreaInfoResponse  Pointer to IPMI_GET_FRU_INVENTORY_AREA_INFO_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetFruInventoryAreaInfo (
+  IN  IPMI_GET_FRU_INVENTORY_AREA_INFO_REQUEST   *GetFruInventoryAreaInfoRequest,
+  OUT IPMI_GET_FRU_INVENTORY_AREA_INFO_RESPONSE  *GetFruInventoryAreaInfoResponse
+  )
+{
+  EFI_STATUS  Status;
+  UINT32      DataSize;
+
+  DataSize = sizeof (*GetFruInventoryAreaInfoResponse);
+  Status   = IpmiSubmitCommand (
+               IPMI_NETFN_STORAGE,
+               IPMI_STORAGE_GET_FRU_INVENTORY_AREAINFO,
+               (VOID *)GetFruInventoryAreaInfoRequest,
+               sizeof (*GetFruInventoryAreaInfoRequest),
+               (VOID *)GetFruInventoryAreaInfoResponse,
+               &DataSize
+               );
+  return Status;
+}
+
+/**
+  This function returns specified data from the FRU Inventory Info area.
+
+  @param [in]  ReadFruDataRequest       Pointer to IPMI_READ_FRU_DATA_REQUEST.
+  @param [in]  ReadFruDataResponse      Pointer to IPMI_READ_FRU_DATA_RESPONSE.
+  @param [in, out] ReadFruDataResponseSize  Returns the size of ReadFruDataResponse.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiReadFruData (
+  IN  IPMI_READ_FRU_DATA_REQUEST   *ReadFruDataRequest,
+  OUT IPMI_READ_FRU_DATA_RESPONSE  *ReadFruDataResponse,
+  IN OUT UINT32                    *ReadFruDataResponseSize
+  )
+{
+  EFI_STATUS  Status;
+
+  Status = IpmiSubmitCommand (
+             IPMI_NETFN_STORAGE,
+             IPMI_STORAGE_READ_FRU_DATA,
+             (VOID *)ReadFruDataRequest,
+             sizeof (*ReadFruDataRequest),
+             (VOID *)ReadFruDataResponse,
+             ReadFruDataResponseSize
+             );
+  return Status;
+}
+
+/**
+  This function writes specified data from the FRU Inventory Info area.
+
+  @param [in]  WriteFruDataRequest      Pointer to IPMI_WRITE_FRU_DATA_REQUEST.
+  @param [in]  WriteFruDataRequestSize  Size of WriteFruDataRequest.
+  @param [out] WriteFruDataResponse     Pointer to receive IPMI_WRITE_FRU_DATA_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiWriteFruData (
+  IN  IPMI_WRITE_FRU_DATA_REQUEST   *WriteFruDataRequest,
+  IN  UINT32                        WriteFruDataRequestSize,
+  OUT IPMI_WRITE_FRU_DATA_RESPONSE  *WriteFruDataResponse
+  )
+{
+  EFI_STATUS  Status;
+  UINT32      DataSize;
+
+  DataSize = sizeof (*WriteFruDataResponse);
+  Status   = IpmiSubmitCommand (
+               IPMI_NETFN_STORAGE,
+               IPMI_STORAGE_WRITE_FRU_DATA,
+               (VOID *)WriteFruDataRequest,
+               WriteFruDataRequestSize,
+               (VOID *)WriteFruDataResponse,
+               &DataSize
+               );
+  return Status;
+}
+
+/**
+  This function returns the number of entries in the SEL
+
+  @param [out] GetSelInfoResponse     Pointer to receive IPMI_GET_SEL_INFO_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetSelInfo (
+  OUT IPMI_GET_SEL_INFO_RESPONSE  *GetSelInfoResponse
+  )
+{
+  EFI_STATUS  Status;
+  UINT32      DataSize;
+
+  DataSize = sizeof (*GetSelInfoResponse);
+  Status   = IpmiSubmitCommand (
+               IPMI_NETFN_STORAGE,
+               IPMI_STORAGE_GET_SEL_INFO,
+               NULL,
+               0,
+               (VOID *)GetSelInfoResponse,
+               &DataSize
+               );
+  return Status;
+}
+
+/**
+  This function retrieves entries from the SEL
+
+  @param [in]  GetSelEntryRequest       Pointer to IPMI_GET_SEL_ENTRY_REQUEST.
+  @param [out] GetSelEntryResponse      Pointer to receive IPMI_GET_SEL_ENTRY_RESPONSE.
+  @param [in, out]  GetSelEntryResponseSize  Size of entire GetSelEntryResponse.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetSelEntry (
+  IN IPMI_GET_SEL_ENTRY_REQUEST    *GetSelEntryRequest,
+  OUT IPMI_GET_SEL_ENTRY_RESPONSE  *GetSelEntryResponse,
+  IN OUT UINT32                    *GetSelEntryResponseSize
+  )
+{
+  EFI_STATUS  Status;
+
+  Status = IpmiSubmitCommand (
+             IPMI_NETFN_STORAGE,
+             IPMI_STORAGE_GET_SEL_ENTRY,
+             (VOID *)GetSelEntryRequest,
+             sizeof (*GetSelEntryRequest),
+             (VOID *)GetSelEntryResponse,
+             GetSelEntryResponseSize
+             );
+  return Status;
+}
+
+/**
+  This function adds an entry in the SEL
+
+  @param [in]  AddSelEntryRequest       Pointer to IPMI_ADD_SEL_ENTRY_REQUEST.
+  @param [out] AddSelEntryResponse      Pointer to receive IPMI_ADD_SEL_ENTRY_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiAddSelEntry (
+  IN IPMI_ADD_SEL_ENTRY_REQUEST    *AddSelEntryRequest,
+  OUT IPMI_ADD_SEL_ENTRY_RESPONSE  *AddSelEntryResponse
+  )
+{
+  EFI_STATUS  Status;
+  UINT32      DataSize;
+
+  DataSize = sizeof (*AddSelEntryResponse);
+  Status   = IpmiSubmitCommand (
+               IPMI_NETFN_STORAGE,
+               IPMI_STORAGE_ADD_SEL_ENTRY,
+               (VOID *)AddSelEntryRequest,
+               sizeof (*AddSelEntryRequest),
+               (VOID *)AddSelEntryResponse,
+               &DataSize
+               );
+  return Status;
+}
+
+/**
+  This function adds SEL Entry command that allows the record to be incrementally
+  added to the SEL.
+
+  @param [in]  PartialAddSelEntryRequest       Pointer to IPMI_PARTIAL_ADD_SEL_ENTRY_REQUEST.
+  @param [in]  PartialAddSelEntryRequestSize   Size of entire PartialAddSelEntryRequest.
+  @param [out] PartialAddSelEntryResponse      Pointer to receive IPMI_PARTIAL_ADD_SEL_ENTRY_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiPartialAddSelEntry (
+  IN IPMI_PARTIAL_ADD_SEL_ENTRY_REQUEST    *PartialAddSelEntryRequest,
+  IN UINT32                                PartialAddSelEntryRequestSize,
+  OUT IPMI_PARTIAL_ADD_SEL_ENTRY_RESPONSE  *PartialAddSelEntryResponse
+  )
+{
+  EFI_STATUS  Status;
+  UINT32      DataSize;
+
+  DataSize = sizeof (*PartialAddSelEntryResponse);
+  Status   = IpmiSubmitCommand (
+               IPMI_NETFN_STORAGE,
+               IPMI_STORAGE_PARTIAL_ADD_SEL_ENTRY,
+               (VOID *)PartialAddSelEntryRequest,
+               PartialAddSelEntryRequestSize,
+               (VOID *)PartialAddSelEntryResponse,
+               &DataSize
+               );
+  return Status;
+}
+
+/**
+  This function erases all contents of the System Event Log.
+
+  @param [in]  ClearSelRequest       Pointer to IPMI_CLEAR_SEL_REQUEST.
+  @param [out] ClearSelResponse      Pointer to receive IPMI_CLEAR_SEL_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiClearSel (
+  IN IPMI_CLEAR_SEL_REQUEST    *ClearSelRequest,
+  OUT IPMI_CLEAR_SEL_RESPONSE  *ClearSelResponse
+  )
+{
+  EFI_STATUS  Status;
+  UINT32      DataSize;
+
+  DataSize = sizeof (*ClearSelResponse);
+  Status   = IpmiSubmitCommand (
+               IPMI_NETFN_STORAGE,
+               IPMI_STORAGE_CLEAR_SEL,
+               (VOID *)ClearSelRequest,
+               sizeof (*ClearSelRequest),
+               (VOID *)ClearSelResponse,
+               &DataSize
+               );
+  return Status;
+}
+
+/**
+  This function returns the time from the SEL Device.
+
+  @param [out]  GetSelTimeResponse       Pointer to IPMI_GET_SEL_TIME_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetSelTime (
+  OUT IPMI_GET_SEL_TIME_RESPONSE  *GetSelTimeResponse
+  )
+{
+  EFI_STATUS  Status;
+  UINT32      DataSize;
+
+  DataSize = sizeof (*GetSelTimeResponse);
+  Status   = IpmiSubmitCommand (
+               IPMI_NETFN_STORAGE,
+               IPMI_STORAGE_GET_SEL_TIME,
+               NULL,
+               0,
+               (VOID *)GetSelTimeResponse,
+               &DataSize
+               );
+  return Status;
+}
+
+/**
+  This function set the time in the SEL Device.
+
+  @param [in]  SetSelTimeRequest       Pointer to IPMI_SET_SEL_TIME_REQUEST.
+  @param [out] CompletionCode         IPMI completetion code, refer to Ipmi.h.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiSetSelTime (
+  IN IPMI_SET_SEL_TIME_REQUEST  *SetSelTimeRequest,
+  OUT UINT8                     *CompletionCode
+  )
+{
+  EFI_STATUS  Status;
+  UINT32      DataSize;
+
+  DataSize = sizeof (*CompletionCode);
+  Status   = IpmiSubmitCommand (
+               IPMI_NETFN_STORAGE,
+               IPMI_STORAGE_SET_SEL_TIME,
+               (VOID *)SetSelTimeRequest,
+               sizeof (*SetSelTimeRequest),
+               (VOID *)CompletionCode,
+               &DataSize
+               );
+  return Status;
+}
+
+/**
+  This function returns the SDR command version for the SDR Repository
+
+  @param [out] ClearSelResponse      Pointer to receive IPMI_GET_SDR_REPOSITORY_INFO_RESPONSE.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetSdrRepositoryInfo (
+  OUT IPMI_GET_SDR_REPOSITORY_INFO_RESPONSE  *GetSdrRepositoryInfoResp
+  )
+{
+  EFI_STATUS  Status;
+  UINT32      DataSize;
+
+  DataSize = sizeof (*GetSdrRepositoryInfoResp);
+  Status   = IpmiSubmitCommand (
+               IPMI_NETFN_STORAGE,
+               IPMI_STORAGE_GET_SDR_REPOSITORY_INFO,
+               NULL,
+               0,
+               (VOID *)GetSdrRepositoryInfoResp,
+               &DataSize
+               );
+  return Status;
+}
+
+/**
+  This function returns the sensor record specified by Record ID.
+
+  @param [in]  GetSdrRequest       Pointer to IPMI_GET_SDR_REQUEST.
+  @param [out] GetSdrResponse      Pointer to receive IPMI_GET_SDR_RESPONSE.
+  @param [in, out]  GetSdrResponseSize  Size of entire GetSdrResponse.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetSdr (
+  IN  IPMI_GET_SDR_REQUEST   *GetSdrRequest,
+  OUT IPMI_GET_SDR_RESPONSE  *GetSdrResponse,
+  IN OUT UINT32              *GetSdrResponseSize
+  )
+{
+  EFI_STATUS  Status;
+
+  Status = IpmiSubmitCommand (
+             IPMI_NETFN_STORAGE,
+             IPMI_STORAGE_GET_SDR,
+             (VOID *)GetSdrRequest,
+             sizeof (*GetSdrRequest),
+             (VOID *)GetSdrResponse,
+             GetSdrResponseSize
+             );
+  return Status;
+}
diff --git a/Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLibNetFnTransport.c b/Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLibNetFnTransport.c
new file mode 100644
index 0000000000..a93f7406f1
--- /dev/null
+++ b/Features/ManageabilityPkg/Library/IpmiCommandLib/IpmiCommandLibNetFnTransport.c
@@ -0,0 +1,156 @@
+/** @file
+  IPMI Command - NetFnTransport.
+
+  Copyright (c) 2018 - 2021, Intel Corporation. All rights reserved.<BR>
+  Copyright (C) 2023 Advanced Micro Devices, Inc. All rights reserved.<BR>
+
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+**/
+
+#include <PiPei.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/DebugLib.h>
+#include <Library/IpmiLib.h>
+
+#include <IndustryStandard/Ipmi.h>
+
+/**
+  This function sends command to BMC to notify a remote application
+  that a SOL payload is activating on another channel.
+
+  @param [in]   SolActivatingRequest  The get channel information request.
+  @param [out]  CompletionCode        IPMI completetion code, refer to Ipmi.h.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiSolActivating (
+  IN  IPMI_SOL_ACTIVATING_REQUEST  *SolActivatingRequest,
+  OUT UINT8                        *CompletionCode
+  )
+{
+  EFI_STATUS  Status;
+  UINT32      DataSize;
+
+  DataSize = sizeof (*CompletionCode);
+  Status   = IpmiSubmitCommand (
+               IPMI_NETFN_TRANSPORT,
+               IPMI_TRANSPORT_SOL_ACTIVATING,
+               (VOID *)SolActivatingRequest,
+               sizeof (*SolActivatingRequest),
+               (VOID *)CompletionCode,
+               &DataSize
+               );
+  return Status;
+}
+
+/**
+  This function is used to set parameters such as the network addressing
+  information required for SOL payload operation.
+
+  @param [in]   SetConfigurationParametersRequest      Pointer to IPMI_SET_SOL_CONFIGURATION_PARAMETERS_REQUEST.
+  @param [in]   SetConfigurationParametersRequestSize  Size of entire SetConfigurationParametersRequestSize.
+  @param [out]  CompletionCode                         IPMI completetion code, refer to Ipmi.h.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiSetSolConfigurationParameters (
+  IN  IPMI_SET_SOL_CONFIGURATION_PARAMETERS_REQUEST  *SetConfigurationParametersRequest,
+  IN  UINT32                                         SetConfigurationParametersRequestSize,
+  OUT UINT8                                          *CompletionCode
+  )
+{
+  EFI_STATUS  Status;
+  UINT32      DataSize;
+
+  DataSize = sizeof (*CompletionCode);
+  Status   = IpmiSubmitCommand (
+               IPMI_NETFN_TRANSPORT,
+               IPMI_TRANSPORT_SET_SOL_CONFIG_PARAM,
+               (VOID *)SetConfigurationParametersRequest,
+               SetConfigurationParametersRequestSize,
+               (VOID *)CompletionCode,
+               &DataSize
+               );
+  return Status;
+}
+
+/**
+  This function is used to retrieve the configuration parameters from the
+  Set SOL Configuration Parameters.
+
+  @param [in]       GetConfigurationParametersRequest       Pointer to IPMI_SET_SOL_CONFIGURATION_PARAMETERS_REQUEST.
+  @param [out]      GetConfigurationParametersResponse      Pointer to receive IPMI_GET_SOL_CONFIGURATION_PARAMETERS_RESPONSE
+  @param [in, out]  GetConfigurationParametersResponseSize  When in, which is the expected size of
+                                                            response. When out, which is the actual
+                                                            size returned.
+
+  @retval EFI_STASTUS   See the return values of IpmiSubmitCommand () function.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetSolConfigurationParameters (
+  IN  IPMI_GET_SOL_CONFIGURATION_PARAMETERS_REQUEST   *GetConfigurationParametersRequest,
+  OUT IPMI_GET_SOL_CONFIGURATION_PARAMETERS_RESPONSE  *GetConfigurationParametersResponse,
+  IN OUT UINT32                                       *GetConfigurationParametersResponseSize
+  )
+{
+  EFI_STATUS  Status;
+
+  Status = IpmiSubmitCommand (
+             IPMI_NETFN_TRANSPORT,
+             IPMI_TRANSPORT_GET_SOL_CONFIG_PARAM,
+             (VOID *)GetConfigurationParametersRequest,
+             sizeof (*GetConfigurationParametersRequest),
+             (VOID *)GetConfigurationParametersResponse,
+             GetConfigurationParametersResponseSize
+             );
+  return Status;
+}
+
+/**
+  This function gets the LAN configuration parameter.
+
+  @param[in]      GetLanConfigurationParametersRequest   Request data
+  @param[out]     GetLanConfigurationParametersResponse  Response data
+  @param[in,out]  GetLanConfigurationParametersSize      When input, the expected size of response data.
+                                                         When out, the exact  size of response data.
+
+  @retval EFI_SUCCESS            Lan configuration parameter is returned in the response.
+  @retval EFI_INVALID_PARAMETER  One of the given input parameters is invalid.
+  @retval Others                 Other errors.
+
+**/
+EFI_STATUS
+EFIAPI
+IpmiGetLanConfigurationParameters (
+  IN     IPMI_GET_LAN_CONFIGURATION_PARAMETERS_REQUEST   *GetLanConfigurationParametersRequest,
+  OUT    IPMI_GET_LAN_CONFIGURATION_PARAMETERS_RESPONSE  *GetLanConfigurationParametersResponse,
+  IN OUT UINT32                                          *GetLanConfigurationParametersSize
+  )
+{
+  EFI_STATUS  Status;
+
+  if ((GetLanConfigurationParametersRequest == NULL) ||
+      (GetLanConfigurationParametersResponse == NULL) ||
+      (GetLanConfigurationParametersSize == NULL))
+  {
+    return EFI_INVALID_PARAMETER;
+  }
+
+  Status = IpmiSubmitCommand (
+             IPMI_NETFN_TRANSPORT,
+             IPMI_TRANSPORT_GET_LAN_CONFIG_PARAMETERS,
+             (UINT8 *)GetLanConfigurationParametersRequest,
+             sizeof (*GetLanConfigurationParametersRequest),
+             (UINT8 *)GetLanConfigurationParametersResponse,
+             GetLanConfigurationParametersSize
+             );
+  return Status;
+}
--
2.37.1.windows.1


^ permalink raw reply related	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2023-05-09  7:02 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-05-05  5:24 [edk2-platforms][PATCH] ManageabilityPkg/IpmiCommandLib:IPMI Command Library Chang, Abner
2023-05-05  5:24 ` [edk2-platforms][PATCH] ManageabilityPkg/IpmiCommandLib: Add IpmiCommandLib to package Chang, Abner
2023-05-09  6:53   ` Nickle Wang
2023-05-09  6:57   ` Attar, AbdulLateef (Abdul Lateef)
2023-05-08 21:19 ` [edk2-devel] [edk2-platforms][PATCH] ManageabilityPkg/IpmiCommandLib:IPMI Command Library Isaac Oram
2023-05-09  6:36   ` Chang, Abner
2023-05-09  6:54 ` Nickle Wang
2023-05-09  7:01 ` Attar, AbdulLateef (Abdul Lateef)

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox