* [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-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: 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-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: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: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