From: "Nate DeSimone" <nathaniel.l.desimone@intel.com>
To: devel@edk2.groups.io
Cc: Isaac Oram <isaac.w.oram@intel.com>,
Sai Chaganty <rangasai.v.chaganty@intel.com>,
Liming Gao <gaoliming@byosoft.com.cn>,
Michael Kubacki <michael.kubacki@microsoft.com>
Subject: [edk2-platforms] [PATCH v1 2/9] IpmiFeaturePkg: Add IpmiBaseLib and IpmiCommandLib
Date: Mon, 1 Mar 2021 18:27:57 -0800 [thread overview]
Message-ID: <20210302022804.8641-3-nathaniel.l.desimone@intel.com> (raw)
In-Reply-To: <20210302022804.8641-1-nathaniel.l.desimone@intel.com>
From: Isaac Oram <isaac.w.oram@intel.com>
REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3242
Adds IpmiBaseLib and adds new commands to IpmiCommandLib
Cc: Sai Chaganty <rangasai.v.chaganty@intel.com>
Cc: Liming Gao <gaoliming@byosoft.com.cn>
Cc: Michael Kubacki <michael.kubacki@microsoft.com>
Signed-off-by: Isaac Oram <isaac.w.oram@intel.com>
Co-authored-by: Nate DeSimone <nathaniel.l.desimone@intel.com>
---
.../Library/IpmiBaseLib/IpmiBaseLib.c | 155 +++++++++++++++
.../Library/IpmiBaseLib/IpmiBaseLib.inf | 28 +++
.../Library/IpmiBaseLibNull/IpmiBaseLibNull.c | 76 ++++++++
.../IpmiBaseLibNull/IpmiBaseLibNull.inf | 36 ++++
.../Library/IpmiCommandLib/IpmiCommandLib.inf | 4 +-
.../IpmiCommandLib/IpmiCommandLibNetFnApp.c | 7 +-
.../IpmiCommandLibNetFnChassis.c | 51 ++++-
.../IpmiCommandLibNetFnStorage.c | 7 +-
.../IpmiCommandLibNetFnTransport.c | 7 +-
.../Library/PeiIpmiBaseLib/PeiIpmiBaseLib.c | 111 +++++++++++
.../Library/PeiIpmiBaseLib/PeiIpmiBaseLib.inf | 30 +++
.../Library/SmmIpmiBaseLib/SmmIpmiBaseLib.c | 180 ++++++++++++++++++
.../Library/SmmIpmiBaseLib/SmmIpmiBaseLib.inf | 29 +++
13 files changed, 703 insertions(+), 18 deletions(-)
create mode 100644 Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/IpmiBaseLib/IpmiBaseLib.c
create mode 100644 Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/IpmiBaseLib/IpmiBaseLib.inf
create mode 100644 Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/IpmiBaseLibNull/IpmiBaseLibNull.c
create mode 100644 Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/IpmiBaseLibNull/IpmiBaseLibNull.inf
create mode 100644 Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/PeiIpmiBaseLib/PeiIpmiBaseLib.c
create mode 100644 Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/PeiIpmiBaseLib/PeiIpmiBaseLib.inf
create mode 100644 Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/SmmIpmiBaseLib/SmmIpmiBaseLib.c
create mode 100644 Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/SmmIpmiBaseLib/SmmIpmiBaseLib.inf
diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/IpmiBaseLib/IpmiBaseLib.c b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/IpmiBaseLib/IpmiBaseLib.c
new file mode 100644
index 0000000000..6b2e0a9e1e
--- /dev/null
+++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/IpmiBaseLib/IpmiBaseLib.c
@@ -0,0 +1,155 @@
+/** @file
+ A Library to support all BMC access via IPMI command during Dxe Phase.
+
+ @copyright
+ Copyright 1999 - 2021 Intel Corporation. <BR>
+ SPDX-License-Identifier: BSD-2-Clause-Patent
+**/
+
+#include <PiDxe.h>
+#include <Protocol/IpmiTransportProtocol.h>
+#include <Library/UefiBootServicesTableLib.h>
+#include <Library/DebugLib.h>
+
+STATIC IPMI_TRANSPORT *mIpmiTransport = NULL;
+VOID *mEfiIpmiProtocolNotifyReg;
+EFI_EVENT mEfiIpmiProtocolEvent;
+
+/**
+ Callback function for locating the IpmiTransport protocol.
+ @param[in] Event Event on which the callback is called.
+ @param[in] Context The context of the Callback.
+
+ @retval EFI_SUCCESS Return from EfiLocateProtocolInterface function.
+ @retval Other Failure.
+
+**/
+EFI_STATUS
+NotifyIpmiTransportCallback (
+ IN EFI_EVENT Event,
+ IN VOID *Context
+ )
+{
+ EFI_STATUS Status;
+
+ Status = EFI_SUCCESS;
+ if (mIpmiTransport == NULL) {
+ Status = gBS->LocateProtocol (
+ &gIpmiTransportProtocolGuid,
+ NULL,
+ (VOID **) &mIpmiTransport
+ );
+ }
+
+ return Status;
+}
+
+/**
+ Initialize the global varible with the pointer of IpmiTransport Protocol.
+
+ @retval EFI_SUCCESS Always return success.
+
+**/
+EFI_STATUS
+InitializeIpmiBase (
+ VOID
+ )
+{
+ EFI_STATUS Status;
+
+ if (mIpmiTransport == NULL) {
+ Status = gBS->CreateEvent (EVT_NOTIFY_SIGNAL, TPL_CALLBACK, (EFI_EVENT_NOTIFY) NotifyIpmiTransportCallback, NULL, &mEfiIpmiProtocolEvent);
+ ASSERT_EFI_ERROR (Status);
+ if (Status != EFI_SUCCESS) {
+ return Status;
+ }
+
+ Status = gBS->RegisterProtocolNotify (&gIpmiTransportProtocolGuid, mEfiIpmiProtocolEvent, &mEfiIpmiProtocolNotifyReg);
+ ASSERT_EFI_ERROR (Status);
+ if (Status != EFI_SUCCESS) {
+ return Status;
+ }
+
+ gBS->SignalEvent (mEfiIpmiProtocolEvent);
+ }
+
+ return EFI_SUCCESS;
+}
+
+/**
+ Routine to send commands to BMC.
+ @param[in] NetFunction Net function of the command
+ @param[in] Command IPMI Command
+ @param[in] CommandData Command Data
+ @param[in] CommandDataSize Size of CommandData
+ @param[out] ResponseData Response Data
+ @param[in, out] ResponseDataSize Response Data Size
+
+ @retval EFI_SUCCESS Return Successly.
+ @retval EFI_NOT_AVAILABLE_YET IpmiTransport Protocol is not installed yet
+ @retval Other Failure.
+
+**/
+EFI_STATUS
+IpmiSubmitCommand (
+ IN UINT8 NetFunction,
+ IN UINT8 Command,
+ IN UINT8 *CommandData,
+ IN UINT32 CommandDataSize,
+ OUT UINT8 *ResponseData,
+ IN OUT UINT32 *ResponseDataSize
+ )
+{
+ EFI_STATUS Status;
+
+ Status = gBS->LocateProtocol (&gIpmiTransportProtocolGuid, NULL, (VOID **) &mIpmiTransport);
+ if (EFI_ERROR (Status)) {
+ ASSERT_EFI_ERROR (Status);
+ return Status;
+ }
+
+ Status = mIpmiTransport->IpmiSubmitCommand (
+ mIpmiTransport,
+ NetFunction,
+ 0,
+ Command,
+ CommandData,
+ CommandDataSize,
+ ResponseData,
+ ResponseDataSize
+ );
+ return Status;
+}
+
+/**
+ Routine to send commands to BMC.
+ @param[out] BmcStatus A pointer to the BMC_STATUS.
+ @param[out] ComAddress Pointer to the SM_COM_ADDRESS.
+
+ @retval EFI_SUCCESS Restart Successly.
+ @retval EFI_NOT_AVAILABLE_YET IpmiTransport Protocol is not installed yet.
+ @retval Other Failure.
+
+**/
+EFI_STATUS
+IpmiGetBmcStatus (
+ OUT BMC_STATUS *BmcStatus,
+ OUT SM_COM_ADDRESS *ComAddress
+ )
+{
+ EFI_STATUS Status;
+
+ Status = gBS->LocateProtocol (&gIpmiTransportProtocolGuid, NULL, (VOID **) &mIpmiTransport);
+ if (EFI_ERROR (Status)) {
+ ASSERT_EFI_ERROR (Status);
+ return Status;
+ }
+
+ Status = mIpmiTransport->GetBmcStatus (
+ mIpmiTransport,
+ BmcStatus,
+ ComAddress
+ );
+ return Status;
+}
+
diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/IpmiBaseLib/IpmiBaseLib.inf b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/IpmiBaseLib/IpmiBaseLib.inf
new file mode 100644
index 0000000000..b429d3b7b9
--- /dev/null
+++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/IpmiBaseLib/IpmiBaseLib.inf
@@ -0,0 +1,28 @@
+## @file
+#
+# @copyright
+# Copyright 2010 - 2021 Intel Corporation. <BR>
+# SPDX-License-Identifier: BSD-2-Clause-Patent
+##
+
+[Defines]
+ INF_VERSION = 0x00010005
+ BASE_NAME = IpmiBaseLib
+ FILE_GUID = 2B5AD78E-5CF8-45d2-B2AC-749A09425911
+ MODULE_TYPE = UEFI_DRIVER
+ VERSION_STRING = 1.0
+ LIBRARY_CLASS = IpmiBaseLib|DXE_RUNTIME_DRIVER DXE_DRIVER UEFI_APPLICATION UEFI_DRIVER
+
+[sources]
+ IpmiBaseLib.c
+
+[Packages]
+ MdePkg/MdePkg.dec
+ OutOfBandManagement/IpmiFeaturePkg/IpmiFeaturePkg.dec
+
+[LibraryClasses]
+ UefiBootServicesTableLib
+ DebugLib
+
+[Protocols]
+ gIpmiTransportProtocolGuid
diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/IpmiBaseLibNull/IpmiBaseLibNull.c b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/IpmiBaseLibNull/IpmiBaseLibNull.c
new file mode 100644
index 0000000000..7c4c67f6ac
--- /dev/null
+++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/IpmiBaseLibNull/IpmiBaseLibNull.c
@@ -0,0 +1,76 @@
+/** @file
+ A Null Library to support all BMC access via IPMI command.
+
+ @copyright
+ Copyright 2011 - 2021 Intel Corporation. <BR>
+ SPDX-License-Identifier: BSD-2-Clause-Patent
+**/
+
+#include <Library/BaseLib.h>
+#include <Library/UefiBootServicesTableLib.h>
+#include <Library/DxeServicesLib.h>
+#include <Library/DebugLib.h>
+#include <Library/IpmiBaseLib.h>
+#include <Ppi/IpmiTransportPpi.h>
+
+/**
+
+ Initialize the global varible with the pointer of IpmiTransport Protocol
+
+ @retval EFI_SUCCESS Always return success.
+
+**/
+EFI_STATUS
+InitializeIpmiBase (
+ VOID
+ )
+{
+ return EFI_SUCCESS;
+}
+
+/**
+ Routine to send commands to BMC.
+ @param [in] NetFunction Net function of the command
+ @param [in] Command IPMI Command
+ @param [in] CommandData Command Data
+ @param [in] CommandDataSize Size of CommandData
+ @param [out] ResponseData Response Data
+ @param [out] ResponseDataSize Response Data Size
+
+ @retval EFI_SUCCESS Restart Successly.
+ @retval EFI_NOT_AVAILABLE_YET IpmiTransport Protocol is not installed yet.
+ @retval Other Failure.
+
+**/
+EFI_STATUS
+IpmiSubmitCommand (
+ IN UINT8 NetFunction,
+ IN UINT8 Command,
+ IN UINT8 *CommandData,
+ IN UINT32 CommandDataSize,
+ OUT UINT8 *ResponseData,
+ OUT UINT32 *ResponseDataSize
+ )
+{
+ return EFI_SUCCESS;
+}
+
+/**
+ Routine to send commands to BMC.
+ @param [out] BmcStatus A pointer to BMC_STATUS.
+ @param [out] ComAddress A pointer to SM_COM_ADDRESS.
+
+ @retval EFI_SUCCESS Restart Successly.
+ @retval EFI_NOT_AVAILABLE_YET - IpmiTransport Protocol is not installed yet.
+ @retval Other Failure.
+
+**/
+EFI_STATUS
+GetBmcStatus (
+ OUT BMC_STATUS *BmcStatus,
+ OUT SM_COM_ADDRESS *ComAddress
+ )
+{
+ return EFI_SUCCESS;
+}
+
diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/IpmiBaseLibNull/IpmiBaseLibNull.inf b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/IpmiBaseLibNull/IpmiBaseLibNull.inf
new file mode 100644
index 0000000000..5478f9842b
--- /dev/null
+++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/IpmiBaseLibNull/IpmiBaseLibNull.inf
@@ -0,0 +1,36 @@
+## @file
+#
+# @copyright
+# Copyright 2011 - 2021 Intel Corporation. <BR>
+# SPDX-License-Identifier: BSD-2-Clause-Patent
+##
+
+[Defines]
+ INF_VERSION = 0x00010005
+ BASE_NAME = IpmiBaseLibNull
+ FILE_GUID = 3444CF4F-8B88-4579-9A95-2E7678C0E945
+ MODULE_TYPE = DXE_SMM_DRIVER
+ VERSION_STRING = 1.0
+ LIBRARY_CLASS = IpmiBaseLib|DXE_CORE DXE_DRIVER DXE_RUNTIME_DRIVER DXE_SMM_DRIVER UEFI_APPLICATION UEFI_DRIVER SMM_CORE
+
+#
+# The following information is for reference only and not required by the build tools.
+#
+# VALID_ARCHITECTURES = IA32 X64
+#
+
+[Sources.common]
+ IpmiBaseLibNull.c
+
+[Packages]
+ MdePkg/MdePkg.dec
+ OutOfBandManagement/IpmiFeaturePkg/IpmiFeaturePkg.dec
+
+[LibraryClasses]
+ BaseLib
+ UefiBootServicesTableLib
+ DxeServicesLib
+ DebugLib
+
+[Guids]
+
diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/IpmiCommandLib/IpmiCommandLib.inf b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/IpmiCommandLib/IpmiCommandLib.inf
index 0bdace8688..f8e7ba5a8f 100644
--- a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/IpmiCommandLib/IpmiCommandLib.inf
+++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/IpmiCommandLib/IpmiCommandLib.inf
@@ -1,7 +1,7 @@
### @file
# Component description file for IPMI Command Library.
#
-# Copyright (c) 2018 - 2019, Intel Corporation. All rights reserved.<BR>
+# Copyright (c) 2018 - 2021, Intel Corporation. All rights reserved.<BR>
#
# SPDX-License-Identifier: BSD-2-Clause-Patent
#
@@ -29,4 +29,4 @@
[LibraryClasses]
BaseMemoryLib
DebugLib
- IpmiLib
+ IpmiBaseLib
diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/IpmiCommandLib/IpmiCommandLibNetFnApp.c b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/IpmiCommandLib/IpmiCommandLibNetFnApp.c
index b57db50610..addabc554e 100644
--- a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/IpmiCommandLib/IpmiCommandLibNetFnApp.c
+++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/IpmiCommandLib/IpmiCommandLibNetFnApp.c
@@ -1,15 +1,14 @@
/** @file
IPMI Command - NetFnApp.
-Copyright (c) 2018, Intel Corporation. All rights reserved.<BR>
-SPDX-License-Identifier: BSD-2-Clause-Patent
-
+ 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 <Library/IpmiBaseLib.h>
#include <IndustryStandard/Ipmi.h>
diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/IpmiCommandLib/IpmiCommandLibNetFnChassis.c b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/IpmiCommandLib/IpmiCommandLibNetFnChassis.c
index 1b86aa888e..9c19f52ce4 100644
--- a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/IpmiCommandLib/IpmiCommandLibNetFnChassis.c
+++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/IpmiCommandLib/IpmiCommandLibNetFnChassis.c
@@ -1,15 +1,14 @@
/** @file
IPMI Command - NetFnChassis.
-Copyright (c) 2018, Intel Corporation. All rights reserved.<BR>
-SPDX-License-Identifier: BSD-2-Clause-Patent
-
+ 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 <Library/IpmiBaseLib.h>
#include <IndustryStandard/Ipmi.h>
@@ -99,3 +98,47 @@ IpmiSetPowerRestorePolicy (
);
return Status;
}
+
+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;
+}
+
+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/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/IpmiCommandLib/IpmiCommandLibNetFnStorage.c b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/IpmiCommandLib/IpmiCommandLibNetFnStorage.c
index 8e892c5f84..2215028089 100644
--- a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/IpmiCommandLib/IpmiCommandLibNetFnStorage.c
+++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/IpmiCommandLib/IpmiCommandLibNetFnStorage.c
@@ -1,15 +1,14 @@
/** @file
IPMI Command - NetFnStorage.
-Copyright (c) 2018, Intel Corporation. All rights reserved.<BR>
-SPDX-License-Identifier: BSD-2-Clause-Patent
-
+ 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 <Library/IpmiBaseLib.h>
#include <IndustryStandard/Ipmi.h>
diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/IpmiCommandLib/IpmiCommandLibNetFnTransport.c b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/IpmiCommandLib/IpmiCommandLibNetFnTransport.c
index 3b9b17b909..7dfcf86126 100644
--- a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/IpmiCommandLib/IpmiCommandLibNetFnTransport.c
+++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/IpmiCommandLib/IpmiCommandLibNetFnTransport.c
@@ -1,15 +1,14 @@
/** @file
IPMI Command - NetFnTransport.
-Copyright (c) 2018, Intel Corporation. All rights reserved.<BR>
-SPDX-License-Identifier: BSD-2-Clause-Patent
-
+ 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 <Library/IpmiBaseLib.h>
#include <IndustryStandard/Ipmi.h>
diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/PeiIpmiBaseLib/PeiIpmiBaseLib.c b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/PeiIpmiBaseLib/PeiIpmiBaseLib.c
new file mode 100644
index 0000000000..8679cd95db
--- /dev/null
+++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/PeiIpmiBaseLib/PeiIpmiBaseLib.c
@@ -0,0 +1,111 @@
+/** @file
+ A Library to support all BMC access via IPMI command during PEI Phase.
+
+ @copyright
+ Copyright 2017 - 2021 Intel Corporation. <BR>
+ SPDX-License-Identifier: BSD-2-Clause-Patent
+**/
+
+#include <PiPei.h>
+#include <Library/IpmiBaseLib.h>
+#include <Library/PeiServicesLib.h>
+#include <Library/DebugLib.h>
+#include <Ppi/IpmiTransportPpi.h>
+
+
+/**
+ Initialize the global varible with the pointer of IpmiTransport Protocol.
+
+ @return EFI_SUCCESS - Always return success
+
+**/
+EFI_STATUS
+InitializeIpmiBase (
+ VOID
+ )
+{
+ EFI_STATUS Status;
+ PEI_IPMI_TRANSPORT_PPI *IpmiTransport;
+
+ Status = PeiServicesLocatePpi (&gPeiIpmiTransportPpiGuid, 0, NULL, (VOID **) &IpmiTransport);
+ if (EFI_ERROR (Status)) {
+ ASSERT_EFI_ERROR (Status);
+ }
+ return Status;
+}
+
+/**
+ Routine to send commands to BMC.
+
+ @param NetFunction - Net function of the command
+ @param Command - IPMI Command
+ @param CommandData - Command Data
+ @param CommandDataSize - Size of CommandData
+ @param ResponseData - Response Data
+ @param ResponseDataSize - Response Data Size
+
+ @return EFI_NOT_AVAILABLE_YET - IpmiTransport Protocol is not installed yet
+
+**/
+EFI_STATUS
+IpmiSubmitCommand (
+ IN UINT8 NetFunction,
+ IN UINT8 Command,
+ IN UINT8 *CommandData,
+ IN UINT32 CommandDataSize,
+ OUT UINT8 *ResponseData,
+ IN OUT UINT32 *ResponseDataSize
+ )
+{
+ EFI_STATUS Status;
+ PEI_IPMI_TRANSPORT_PPI *IpmiTransport;
+
+ Status = PeiServicesLocatePpi (&gPeiIpmiTransportPpiGuid, 0, NULL, (VOID **) &IpmiTransport);
+ if (EFI_ERROR (Status)) {
+ ASSERT_EFI_ERROR (Status);
+ return Status;
+ }
+ Status = IpmiTransport->IpmiSubmitCommand (
+ IpmiTransport,
+ NetFunction,
+ 0,
+ Command,
+ CommandData,
+ CommandDataSize,
+ ResponseData,
+ ResponseDataSize
+ );
+ return Status;
+}
+
+/**
+ Routine to send commands to BMC.
+
+ @param BmcStatus - Ststus of Bmc
+ @param ComAddress - IPMI Address
+
+ @return EFI_NOT_AVAILABLE_YET - IpmiTransport Protocol is not installed yet
+
+**/
+EFI_STATUS
+GetBmcStatus (
+ OUT BMC_STATUS *BmcStatus,
+ OUT SM_COM_ADDRESS *ComAddress
+ )
+{
+ EFI_STATUS Status;
+ PEI_IPMI_TRANSPORT_PPI *IpmiTransport;
+
+ Status = PeiServicesLocatePpi (&gPeiIpmiTransportPpiGuid, 0, NULL, (VOID **) &IpmiTransport);
+ if (EFI_ERROR (Status)) {
+ ASSERT_EFI_ERROR (Status);
+ return Status;
+ }
+ Status = IpmiTransport->GetBmcStatus (
+ IpmiTransport,
+ BmcStatus,
+ ComAddress
+ );
+ return Status;
+}
+
diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/PeiIpmiBaseLib/PeiIpmiBaseLib.inf b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/PeiIpmiBaseLib/PeiIpmiBaseLib.inf
new file mode 100644
index 0000000000..f89614adfb
--- /dev/null
+++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/PeiIpmiBaseLib/PeiIpmiBaseLib.inf
@@ -0,0 +1,30 @@
+## @file
+#
+# @copyright
+# Copyright 2014 - 2021 Intel Corporation. <BR>
+# SPDX-License-Identifier: BSD-2-Clause-Patent
+##
+
+[Defines]
+ INF_VERSION = 0x00010005
+ BASE_NAME = PeiIpmiBaseLib
+ FILE_GUID = 616A8628-9A5C-4d19-9C62-3874C5E6F4A6
+ MODULE_TYPE = PEIM
+ VERSION_STRING = 1.0
+ LIBRARY_CLASS = IpmiBaseLib|PEIM PEI_CORE
+
+[sources]
+ PeiIpmiBaseLib.c
+
+[Packages]
+ MdePkg/MdePkg.dec
+ OutOfBandManagement/IpmiFeaturePkg/IpmiFeaturePkg.dec
+
+[LibraryClasses]
+ DebugLib
+ BaseMemoryLib
+ PeiServicesLib
+
+
+[Ppis]
+ gPeiIpmiTransportPpiGuid
diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/SmmIpmiBaseLib/SmmIpmiBaseLib.c b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/SmmIpmiBaseLib/SmmIpmiBaseLib.c
new file mode 100644
index 0000000000..6282adc269
--- /dev/null
+++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/SmmIpmiBaseLib/SmmIpmiBaseLib.c
@@ -0,0 +1,180 @@
+/** @file
+ A Library to support all BMC access via IPMI command during SMM Phase.
+
+ @copyright
+ Copyright 1999 - 2021 Intel Corporation. <BR>
+ SPDX-License-Identifier: BSD-2-Clause-Patent
+**/
+
+#include <PiDxe.h>
+#include <Protocol/IpmiTransportProtocol.h>
+#include <Library/IpmiBaseLib.h>
+#include <Library/UefiBootServicesTableLib.h>
+#include <Library/SmmServicesTableLib.h>
+#include <Library/DebugLib.h>
+
+STATIC IPMI_TRANSPORT *mIpmiTransport = NULL;
+VOID *mEfiIpmiProtocolNotifyReg = NULL;
+EFI_EVENT mEfiIpmiProtocolEvent;
+
+/**
+ Callback function for locating the IpmiTransport protocol.
+
+ @param Protocol A pointer to EFI_GUID
+ @param Interface A pointer to Interface
+ @param Handle Handle
+
+ @retval EFI_SUCCESS: Callback successfully
+
+**/
+EFI_STATUS
+NotifyIpmiTransportCallback (
+ IN CONST EFI_GUID *Protocol,
+ IN VOID *Interface,
+ IN EFI_HANDLE Handle
+ )
+{
+ EFI_STATUS Status;
+ Status = EFI_SUCCESS;
+ if (mIpmiTransport == NULL) {
+ Status = gSmst->SmmLocateProtocol (
+ &gSmmIpmiTransportProtocolGuid,
+ NULL,
+ (VOID **) &mIpmiTransport
+ );
+ }
+
+ return Status;
+}
+
+/**
+ Routine to send commands to BMC.
+
+ @retval EFI_SUCCESS: Always return success
+
+**/
+EFI_STATUS
+InitializeIpmiBase (
+ VOID
+ )
+{
+ EFI_STATUS Status;
+ if (mIpmiTransport == NULL) {
+ Status = gSmst->SmmLocateProtocol (
+ &gSmmIpmiTransportProtocolGuid,
+ NULL,
+ (VOID **) &mIpmiTransport
+ );
+ if (EFI_ERROR (Status)) {
+ Status = gSmst->SmmRegisterProtocolNotify (
+ &gSmmIpmiTransportProtocolGuid,
+ (EFI_SMM_NOTIFY_FN) NotifyIpmiTransportCallback,
+ &mEfiIpmiProtocolNotifyReg
+ );
+ }
+ ASSERT_EFI_ERROR (Status);
+ if (Status != EFI_SUCCESS) {
+ return Status;
+ }
+ }
+
+ return EFI_SUCCESS;
+}
+
+/**
+ Routine to send commands to BMC.
+
+ @param NetFunction - Net function of the command
+ @param Command - IPMI Command
+ @param CommandData - Command Data
+ @param CommandDataSize - Size of CommandData
+ @param ResponseData - Response Data
+ @param ResponseDataSize - Response Data Size
+
+ @retval EFI_SUCCESS: Get successfully
+ @retval EFI_NOT_AVAILABLE_YET
+
+**/
+EFI_STATUS
+IpmiSubmitCommand (
+ IN UINT8 NetFunction,
+ IN UINT8 Command,
+ IN UINT8 *CommandData,
+ IN UINT32 CommandDataSize,
+ OUT UINT8 *ResponseData,
+ IN OUT UINT32 *ResponseDataSize
+ )
+/*++
+
+Routine Description:
+
+ Routine to send commands to BMC
+
+Arguments:
+
+ NetFunction - Net function of the command
+ Command - IPMI Command
+ CommandData - Command Data
+ CommandDataSize - Size of CommandData
+ ResponseData - Response Data
+ ResponseDataSize - Response Data Size
+
+Returns:
+
+ EFI_NOT_AVAILABLE_YET - IpmiTransport Protocol is not installed yet
+
+--*/
+{
+ EFI_STATUS Status;
+
+ Status = gSmst->SmmLocateProtocol (&gSmmIpmiTransportProtocolGuid, NULL, (VOID **) &mIpmiTransport);
+ if (EFI_ERROR (Status)) {
+ ASSERT_EFI_ERROR (Status);
+ return Status;
+ }
+
+ Status = mIpmiTransport->IpmiSubmitCommand (
+ mIpmiTransport,
+ NetFunction,
+ 0,
+ Command,
+ CommandData,
+ CommandDataSize,
+ ResponseData,
+ ResponseDataSize
+ );
+ return Status;
+}
+
+/**
+ Routine to send commands to BMC.
+
+ @param BmcStatus The ConnectAllComplete EFI Event.
+ @param ComAddress Event context pass to create function
+
+ @retval EFI_SUCCESS: Get successfully
+ @retval EFI_NOT_AVAILABLE_YET
+
+**/
+EFI_STATUS
+GetBmcStatus (
+ OUT BMC_STATUS *BmcStatus,
+ OUT SM_COM_ADDRESS *ComAddress
+ )
+{
+ EFI_STATUS Status;
+
+ Status = gSmst->SmmLocateProtocol (&gSmmIpmiTransportProtocolGuid, NULL, (VOID **) &mIpmiTransport);
+ if (EFI_ERROR (Status)) {
+ ASSERT_EFI_ERROR (Status);
+ return Status;
+ }
+
+ Status = mIpmiTransport->GetBmcStatus (
+ mIpmiTransport,
+ BmcStatus,
+ ComAddress
+ );
+ return Status;
+}
+
diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/SmmIpmiBaseLib/SmmIpmiBaseLib.inf b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/SmmIpmiBaseLib/SmmIpmiBaseLib.inf
new file mode 100644
index 0000000000..bb1ccf1ca2
--- /dev/null
+++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/SmmIpmiBaseLib/SmmIpmiBaseLib.inf
@@ -0,0 +1,29 @@
+## @file
+#
+# @copyright
+# Copyright 2010 - 2021 Intel Corporation. <BR>
+# SPDX-License-Identifier: BSD-2-Clause-Patent
+##
+
+[Defines]
+ INF_VERSION = 0x00010005
+ BASE_NAME = SmmIpmiBaseLib
+ FILE_GUID = 2B5AD78E-5CF8-45d2-B2AC-749A09425911
+ MODULE_TYPE = DXE_SMM_DRIVER
+ VERSION_STRING = 1.0
+ LIBRARY_CLASS = IpmiBaseLib|DXE_SMM_DRIVER SMM_CORE
+
+[sources]
+ SmmIpmiBaseLib.c
+
+[Packages]
+ MdePkg/MdePkg.dec
+ OutOfBandManagement/IpmiFeaturePkg/IpmiFeaturePkg.dec
+
+[LibraryClasses]
+ UefiBootServicesTableLib
+ DebugLib
+ SmmServicesTableLib
+
+[Protocols]
+ gSmmIpmiTransportProtocolGuid
--
2.27.0.windows.1
next prev parent reply other threads:[~2021-03-02 2:29 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-03-02 2:27 [edk2-platforms] [PATCH v1 0/9] IpmiFeaturePkg: Add IPMI transport drivers Nate DeSimone
2021-03-02 2:27 ` [edk2-platforms] [PATCH v1 1/9] IpmiFeaturePkg: Add IPMI driver Include headers Nate DeSimone
2021-03-02 2:27 ` Nate DeSimone [this message]
2021-03-02 2:27 ` [edk2-platforms] [PATCH v1 3/9] IpmiFeaturePkg: Add IpmiInit driver DEPEXs Nate DeSimone
2021-03-02 2:27 ` [edk2-platforms] [PATCH v1 4/9] IpmiFeaturePkg: Add GenericIpmi driver common code Nate DeSimone
2021-03-02 2:28 ` [edk2-platforms] [PATCH v1 5/9] IpmiFeaturePkg: Add GenericIpmi PEIM Nate DeSimone
2021-03-02 2:28 ` [edk2-platforms] [PATCH v1 6/9] IpmiFeaturePkg: Add GenericIpmi DXE Driver Nate DeSimone
2021-03-02 2:28 ` [edk2-platforms] [PATCH v1 7/9] IpmiFeaturePkg: Add GenericIpmi SMM Driver Nate DeSimone
2021-03-02 2:28 ` [edk2-platforms] [PATCH v1 8/9] IpmiFeaturePkg: Add IPMI driver build files Nate DeSimone
2021-03-02 2:28 ` [edk2-platforms] [PATCH v1 9/9] Maintainers.txt: Add IpmiFeaturePkg maintainers Nate DeSimone
2021-03-03 19:22 ` [edk2-devel] [edk2-platforms] [PATCH v1 0/9] IpmiFeaturePkg: Add IPMI transport drivers Michael Kubacki
2021-03-04 23:33 ` Oram, Isaac W
2021-03-05 11:06 ` Nhi Pham
2021-03-11 19:29 ` Chaganty, Rangasai V
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210302022804.8641-3-nathaniel.l.desimone@intel.com \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox