* [edk2-devel][edk2-platforms][PATCH V3-2] IpmiFeaturePkg:Provided multiple IPMI interface support in PEI
@ 2023-06-12 12:53 Arun K
2023-06-13 0:35 ` Isaac Oram
0 siblings, 1 reply; 2+ messages in thread
From: Arun K @ 2023-06-12 12:53 UTC (permalink / raw)
To: devel@edk2.groups.io, Arun K
Cc: isaac.w.oram@intel.com, nathaniel.l.desimone@intel.com,
Ramkumar Krishnamoorthi, Liming Gao
Created IpmiTransport2 PPI/Protocol to support multiple
IPMI BMC Interface support such as KCS/BT/SSIF with 2 API's
IpmiSubmitCommand2 & IpmiSubmitCommand2Ex.
IpmiSubmitCommand2 - This API use the default interface
(PcdDefaultSystemInterface) to send IPMI command.
IpmiSubmitCommand2Ex - This API use the specific interface type
to send IPMI command which is passed as an argument.
Cc: Isaac Oram <isaac.w.oram@intel.com>
Cc: Nate DeSimone <nathaniel.l.desimone@intel.com>
Cc: Liming Gao <gaoliming@byosoft.com.cn>
Signed-off-by: Arun K <arunk@ami.com>
---
.../GenericIpmi/Pei/PeiGenericIpmi.c | 295 ++++++++++++++----
.../GenericIpmi/Pei/PeiGenericIpmi.h | 3 +
.../GenericIpmi/Pei/PeiGenericIpmi.inf | 16 +
.../GenericIpmi/Pei/PeiIpmiBmc.c | 3 +-
.../GenericIpmi/Pei/PeiIpmiBmc.h | 9 +
.../GenericIpmi/Pei/PeiIpmiBmcDef.h | 11 +
.../IpmiFeaturePkg/Include/IpmiFeature.dsc | 15 +
7 files changed, 285 insertions(+), 67 deletions(-)
diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiGenericIpmi.c b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiGenericIpmi.c
index e8b99b6900..e0378d61d4 100644
--- a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiGenericIpmi.c
+++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiGenericIpmi.c
@@ -3,6 +3,7 @@
@copyright
Copyright 2017 - 2021 Intel Corporation. <BR>
+ Copyright (c) 1985 - 2023, American Megatrends International LLC. <BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
@@ -10,10 +11,143 @@
#include "PeiGenericIpmi.h"
#include <Library/ReportStatusCodeLib.h>
#include <Library/IpmiPlatformHookLib.h>
+#include <Library/BmcCommonInterfaceLib.h>
///////////////////////////////////////////////////////////////////////////////
-// Function Implementations
-//
+
+/**
+ Initialize the API and parameters for IPMI Transport2 Instance
+
+ @param[in] IpmiInstance Pointer to IPMI Instance
+
+ @return VOID
+
+**/
+VOID
+InitIpmiTransport2 (
+ IN PEI_IPMI_BMC_INSTANCE_DATA *IpmiInstance
+ )
+{
+ IpmiInstance->IpmiTransport2Ppi.InterfaceType = FixedPcdGet8 (PcdDefaultSystemInterface);
+ IpmiInstance->IpmiTransport2Ppi.IpmiTransport2BmcStatus = BmcStatusOk;
+ IpmiInstance->IpmiTransport2Ppi.IpmiSubmitCommand2 = PeiIpmiSendCommand2;
+ IpmiInstance->IpmiTransport2Ppi.IpmiSubmitCommand2Ex = PeiIpmiSendCommand2Ex;
+
+#if BtInterfaceSupport
+ if (!EFI_ERROR (PlatformIpmiIoRangeSet(FixedPcdGet16(PcdBtControlPort)))) {
+ InitBtInterfaceData (&IpmiInstance->IpmiTransport2Ppi);
+ }
+#endif
+
+#if SsifInterfaceSupport
+ InitSsifInterfaceData (&IpmiInstance->IpmiTransport2Ppi);
+#endif
+
+#if IpmbInterfaceSupport
+ InitIpmbInterfaceData (&IpmiInstance->IpmiTransport2Ppi);
+#endif
+}
+
+/**
+ Notify callback function for interfaces.
+
+ @param[in] PeiServices Describes the list of possible PEI
+ Services.
+ @param[in] NotifyDescriptor Pointer to notify descriptor.
+ @param[in] Ppi Pointer to Ppi.
+
+ @return EFI_STATUS Status of Notify call back.
+ @retval EFI_NOT_FOUND Ipmi hob is not found.
+ @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
+ @retval EFI_SUCCESS Interface is initialized and installed
+ Ipmi Ppi successfully.
+ @retval Others Error status while installing Ppi.
+**/
+EFI_STATUS
+EFIAPI
+NotifyCallback (
+ IN EFI_PEI_SERVICES **PeiServices,
+ IN EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDescriptor,
+ IN VOID *Ppi
+ )
+{
+ EFI_STATUS Status;
+ PEI_IPMI_BMC_INSTANCE_DATA *IpmiInstance;
+ PEI_IPMI_DATA_HOB *IpmiInstancePtrHob;
+ EFI_HOB_GUID_TYPE *GuidHob;
+ IPMI_INTERFACE_STATE InterfaceState;
+
+ InterfaceState = IpmiInterfaceNotReady;
+
+ GuidHob = GetFirstGuidHob (&gPeiIpmiHobGuid);
+ ASSERT (GuidHob != NULL);
+ if (GuidHob == NULL) {
+ return EFI_NOT_FOUND;
+ }
+
+ IpmiInstancePtrHob = (PEI_IPMI_DATA_HOB *) GET_GUID_HOB_DATA(GuidHob);
+ IpmiInstance = (PEI_IPMI_BMC_INSTANCE_DATA*) IpmiInstancePtrHob->IpmiInstance;
+
+#if SsifInterfaceSupport
+ InitSsifInterfaceData(&IpmiInstance->IpmiTransport2Ppi);
+
+ if (IpmiInstance->IpmiTransport2Ppi.Interface.Ssif.InterfaceState == IpmiInterfaceInitialized){
+ InterfaceState = IpmiInterfaceInitialized;
+ }
+#endif
+
+#if IpmbInterfaceSupport
+ InitIpmbInterfaceData(&IpmiInstance->IpmiTransport2Ppi);
+
+ if (IpmiInstance->IpmiTransport2Ppi.Interface.Ipmb.InterfaceState == IpmiInterfaceInitialized){
+ InterfaceState = IpmiInterfaceInitialized;
+ }
+#endif
+ // Default Interface data should be initialized to install Ipmi Transport2 Protocol.
+ if (InterfaceState != IpmiInterfaceInitialized) {
+ return EFI_UNSUPPORTED;
+ }
+
+ Status = PeiServicesInstallPpi (&IpmiInstance->PeiIpmi2BmcDataDesc);
+ return Status;
+}
+
+/**
+ Registers callback for Ppi.
+
+ @param[in] PeiServices Describes the list of possible PEI Services.
+ @param[in] PpiGuid Pointer to Ppi guid to register call back.
+
+ @retval EFI_INVALID_PARAMETER Invalid parameter.
+ @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
+ @retval Others Status of NotifyPpi().
+**/
+EFI_STATUS
+RegisterPpiCallback (
+ IN CONST EFI_PEI_SERVICES **PeiServices,
+ IN EFI_GUID *PpiGuid
+ )
+{
+ EFI_STATUS Status;
+ EFI_PEI_NOTIFY_DESCRIPTOR *PpiNotifyDesc;
+
+ if ((PpiGuid == NULL) ||
+ ((PpiGuid != NULL) && IsZeroBuffer(PpiGuid, sizeof (EFI_GUID)))) {
+ return EFI_INVALID_PARAMETER;
+ }
+
+ PpiNotifyDesc = (EFI_PEI_NOTIFY_DESCRIPTOR*) AllocateZeroPool (sizeof (EFI_PEI_NOTIFY_DESCRIPTOR));
+ if (PpiNotifyDesc == NULL) {
+ return EFI_OUT_OF_RESOURCES;
+ }
+
+ PpiNotifyDesc->Flags = EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST;
+ PpiNotifyDesc->Guid = PpiGuid;
+ PpiNotifyDesc->Notify = NotifyCallback;
+
+ Status = (*PeiServices)->NotifyPpi (PeiServices, PpiNotifyDesc);
+ return Status;
+}
/*****************************************************************************
@brief
@@ -31,8 +165,12 @@ PeiInitializeIpmiKcsPhysicalLayer (
{
EFI_STATUS Status;
PEI_IPMI_BMC_INSTANCE_DATA *mIpmiInstance;
+ PEI_IPMI_DATA_HOB *IpmiInstancePtrHob;
+ IPMI_INTERFACE_STATE InterfaceState;
+ UINT8 Index;
- mIpmiInstance = NULL;
+ mIpmiInstance = NULL;
+ InterfaceState = IpmiInterfaceNotReady;
//
// Send Pre-Boot signal to BMC
@@ -60,6 +198,18 @@ PeiInitializeIpmiKcsPhysicalLayer (
return EFI_OUT_OF_RESOURCES;
}
+
+ // Create Guided hob to pass IPMI Instance data pointer to notify functions.
+ IpmiInstancePtrHob = BuildGuidHob (&gPeiIpmiHobGuid, sizeof(PEI_IPMI_DATA_HOB));
+ if (IpmiInstancePtrHob == NULL) {
+ DEBUG ((DEBUG_ERROR, "Failed to create Hob guid for IPMI Instance!!!\n"));
+ FreePool (mIpmiInstance);
+ return EFI_OUT_OF_RESOURCES;
+ }
+
+ IpmiInstancePtrHob->IpmiInstance = (UINTN)mIpmiInstance;
+ IpmiInstancePtrHob->PreMemIpmiDataHobPtr = IpmiInstancePtrHob;
+
//
// Calibrate TSC Counter. Stall for 10ms, then multiply the resulting number of
// ticks in that period by 100 to get the number of ticks in a 1 second timeout
@@ -83,6 +233,7 @@ PeiInitializeIpmiKcsPhysicalLayer (
mIpmiInstance->PeiIpmiBmcDataDesc.Guid = &gPeiIpmiTransportPpiGuid;
mIpmiInstance->PeiIpmiBmcDataDesc.Ppi = &mIpmiInstance->IpmiTransportPpi;
+#if KcsInterfaceSupport
//
// Get the Device ID and check if the system is in Force Update mode.
//
@@ -94,19 +245,85 @@ PeiInitializeIpmiKcsPhysicalLayer (
//
// Do not continue initialization if the BMC is in Force Update Mode.
//
- if (mIpmiInstance->BmcStatus == BMC_UPDATE_IN_PROGRESS || mIpmiInstance->BmcStatus == BMC_HARDFAIL) {
- return EFI_UNSUPPORTED;
+ if (mIpmiInstance->BmcStatus != BMC_UPDATE_IN_PROGRESS && mIpmiInstance->BmcStatus != BMC_HARDFAIL) {
+ Status = PeiServicesInstallPpi (&mIpmiInstance->PeiIpmiBmcDataDesc);
+ if (EFI_ERROR (Status)) {
+ return Status;
+ }
+ }
+#endif
+
+ InitIpmiTransport2(mIpmiInstance);
+
+ // Check interface data initialized successfully else register notify protocol.
+ for (Index = SysInterfaceKcs; Index < SysInterfaceMax; Index++) {
+
+ switch (Index) {
+
+#if KcsInterfaceSupport
+ case SysInterfaceKcs:
+ if ((mIpmiInstance->BmcStatus != BMC_HARDFAIL) && (mIpmiInstance->BmcStatus != BMC_UPDATE_IN_PROGRESS)) {
+ BMC_INTERFACE_STATUS BmcStatus;
+ mIpmiInstance->IpmiTransport2Ppi.Interface.KcsInterfaceState = IpmiInterfaceInitialized;
+ Status = CheckSelfTestByInterfaceType(
+ &mIpmiInstance->IpmiTransport2Ppi,
+ &BmcStatus,
+ SysInterfaceKcs);
+ if (!EFI_ERROR (Status) && (BmcStatus != BmcStatusHardFail)) {
+ InterfaceState = IpmiInterfaceInitialized;
+ } else {
+ mIpmiInstance->IpmiTransport2Ppi.Interface.KcsInterfaceState = IpmiInterfaceInitError;
+ }
+ }
+ break;
+#endif
+
+#if BtInterfaceSupport
+ case SysInterfaceBt:
+ if (mIpmiInstance->IpmiTransport2Ppi.Interface.Bt.InterfaceState == IpmiInterfaceInitialized){
+ InterfaceState = IpmiInterfaceInitialized;
+ }
+ break;
+#endif
+
+#if SsifInterfaceSupport
+ case SysInterfaceSsif:
+ if (mIpmiInstance->IpmiTransport2Ppi.Interface.Ssif.InterfaceState == IpmiInterfaceInitialized){
+ InterfaceState = IpmiInterfaceInitialized;
+ } else if (mIpmiInstance->IpmiTransport2Ppi.Interface.Ssif.InterfaceState == IpmiInterfaceInitError) {
+ // Register protocol notify for SMBUS Protocol.
+ Status = RegisterPpiCallback (PeiServices, &mIpmiInstance->IpmiTransport2Ppi.Interface.Ssif.SsifInterfaceApiGuid);
+ }
+ break;
+#endif
+
+#if IpmbInterfaceSupport
+ case SysInterfaceIpmb:
+ if (mIpmiInstance->IpmiTransport2Ppi.Interface.Ipmb.InterfaceState == IpmiInterfaceInitialized){
+ InterfaceState = IpmiInterfaceInitialized;
+ } else if (mIpmiInstance->IpmiTransport2Ppi.Interface.Ipmb.InterfaceState == IpmiInterfaceInitError) {
+ // Register protocol notify for SMBUS Protocol.
+ Status = RegisterPpiCallback (PeiServices, &mIpmiInstance->IpmiTransport2Ppi.Interface.Ipmb.IpmbInterfaceApiGuid);
+ }
+ break;
+#endif
+ default:
+ break;
+ }
}
- //
- // Just produce PPI
- //
- Status = PeiServicesInstallPpi (&mIpmiInstance->PeiIpmiBmcDataDesc);
- if (EFI_ERROR (Status)) {
- return Status;
+ // Any one of the Interface data should be initialized to install Ipmi Transport2 Protocol.
+ if (InterfaceState != IpmiInterfaceInitialized) {
+ DEBUG ((DEBUG_INFO, "Interface not ready yet. \n"));
+ return EFI_SUCCESS;
}
- return EFI_SUCCESS;
+ mIpmiInstance->PeiIpmi2BmcDataDesc.Flags = EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST;
+ mIpmiInstance->PeiIpmi2BmcDataDesc.Guid = &gPeiIpmiTransport2PpiGuid;
+ mIpmiInstance->PeiIpmi2BmcDataDesc.Ppi = &mIpmiInstance->IpmiTransport2Ppi;
+
+ Status = PeiServicesInstallPpi (&mIpmiInstance->PeiIpmi2BmcDataDesc);
+ return Status;
}
/*****************************************************************************
@@ -176,60 +393,6 @@ PeimIpmiInterfaceInit (
} // PeimIpmiInterfaceInit()
-EFI_STATUS
-PeiIpmiSendCommand (
- IN PEI_IPMI_TRANSPORT_PPI *This,
- IN UINT8 NetFunction,
- IN UINT8 Lun,
- IN UINT8 Command,
- IN UINT8 *CommandData,
- IN UINT32 CommandDataSize,
- IN OUT UINT8 *ResponseData,
- IN OUT UINT32 *ResponseDataSize
- )
-/*++
-
-Routine Description:
-
- Send Ipmi Command in the right mode: HECI or KCS, to the
- appropiate device, ME or BMC.
-
-Arguments:
-
- This - Pointer to IPMI protocol instance
- NetFunction - Net Function of command to send
- Lun - LUN of command to send
- Command - IPMI command to send
- CommandData - Pointer to command data buffer, if needed
- CommandDataSize - Size of command data buffer
- ResponseData - Pointer to response data buffer
- ResponseDataSize - Pointer to response data buffer size
-
-Returns:
-
- EFI_INVALID_PARAMETER - One of the input values is bad
- EFI_DEVICE_ERROR - IPMI command failed
- EFI_BUFFER_TOO_SMALL - Response buffer is too small
- EFI_UNSUPPORTED - Command is not supported by BMC
- EFI_SUCCESS - Command completed successfully
-
---*/
-{
- //
- // This Will be unchanged ( BMC/KCS style )
- //
- return PeiIpmiSendCommandToBmc (
- This,
- NetFunction,
- Lun,
- Command,
- CommandData,
- (UINT8) CommandDataSize,
- ResponseData,
- (UINT8 *) ResponseDataSize,
- NULL
- );
-} // IpmiSendCommand()
EFI_STATUS
PeiGetIpmiBmcStatus (
diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiGenericIpmi.h b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiGenericIpmi.h
index d31af85325..59b26b6c86 100644
--- a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiGenericIpmi.h
+++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiGenericIpmi.h
@@ -3,6 +3,7 @@
@copyright
Copyright 2017 - 2021 Intel Corporation. <BR>
+ Copyright (c) 1985 - 2023, American Megatrends International LLC. <BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
@@ -23,7 +24,9 @@
#include <Library/PeiServicesTablePointerLib.h>
#include <Library/TimerLib.h>
#include <Library/PciLib.h>
+#include <Library/HobLib.h>
+#include "PeiIpmiHooks.h"
#include "PeiIpmiBmcDef.h"
#include "PeiIpmiBmc.h"
diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiGenericIpmi.inf b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiGenericIpmi.inf
index a646161ce1..555b2e5e6c 100644
--- a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiGenericIpmi.inf
+++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiGenericIpmi.inf
@@ -3,6 +3,7 @@
#
# @copyright
# Copyright 2017 - 2021 Intel Corporation. <BR>
+# Copyright (c) 1985 - 2023, American Megatrends International LLC. <BR>
# SPDX-License-Identifier: BSD-2-Clause-Patent
##
@@ -30,6 +31,8 @@
PeiIpmiBmcDef.h
PeiGenericIpmi.c
PeiGenericIpmi.h
+ PeiIpmiHooks.c
+ PeiIpmiHooks.h
[Packages]
MdePkg/MdePkg.dec
@@ -44,17 +47,30 @@
ReportStatusCodeLib
TimerLib
IpmiPlatformHookLib
+ HobLib
+ BmcCommonInterfaceLib
+ BtInterfaceLib
+ SsifInterfaceLib
+ IpmbInterfaceLib
[Guids]
+ gPeiIpmiHobGuid
[Ppis]
gPeiIpmiTransportPpiGuid #ALWAYS PRODUCE
+ gPeiIpmiTransport2PpiGuid
[Pcd]
gIpmiFeaturePkgTokenSpaceGuid.PcdIpmiIoBaseAddress
gIpmiFeaturePkgTokenSpaceGuid.PcdIpmiBmcReadyDelayTimer
gIpmiFeaturePkgTokenSpaceGuid.PcdSioMailboxBaseAddress
gIpmiFeaturePkgTokenSpaceGuid.PcdSignalPreBootToBmc
+ gIpmiFeaturePkgTokenSpaceGuid.PcdDefaultSystemInterface
+ gIpmiFeaturePkgTokenSpaceGuid.PcdBtInterfaceSupport
+ gIpmiFeaturePkgTokenSpaceGuid.PcdSsifInterfaceSupport
+ gIpmiFeaturePkgTokenSpaceGuid.PcdKcsInterfaceSupport
+ gIpmiFeaturePkgTokenSpaceGuid.PcdIpmbInterfaceSupport
+ gIpmiFeaturePkgTokenSpaceGuid.PcdBtControlPort
[Depex]
TRUE
diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiIpmiBmc.c b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiIpmiBmc.c
index dbe25421ae..38ec98c959 100644
--- a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiIpmiBmc.c
+++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiIpmiBmc.c
@@ -3,6 +3,7 @@
@copyright
Copyright 2016 - 2021 Intel Corporation. <BR>
+ Copyright (c) 1985 - 2023, American Megatrends International LLC. <BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
@@ -235,7 +236,7 @@ Returns:
EFI_STATUS
-PeiIpmiBmcStatus (
+IpmiBmcStatus (
IN PEI_IPMI_TRANSPORT_PPI *This,
OUT BMC_STATUS *BmcStatus,
OUT SM_COM_ADDRESS *ComAddress,
diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiIpmiBmc.h b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiIpmiBmc.h
index 40b9429e84..51ba65966a 100644
--- a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiIpmiBmc.h
+++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiIpmiBmc.h
@@ -3,6 +3,7 @@
@copyright
Copyright 2016 - 2021 Intel Corporation. <BR>
+ Copyright (c) 1985 - 2023, American Megatrends International LLC. <BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
@@ -35,4 +36,12 @@
SM_IPMI_BMC_SIGNATURE \
)
+#define INSTANCE_FROM_PEI_IPMI_TRANSPORT2_THIS(a) \
+ CR ( \
+ a, \
+ PEI_IPMI_BMC_INSTANCE_DATA, \
+ IpmiTransport2Ppi, \
+ SM_IPMI_BMC_SIGNATURE \
+ )
+
#endif // _PEI_IPMI_BMC_H_
diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiIpmiBmcDef.h b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiIpmiBmcDef.h
index fc9fbacf1a..24ef17eadb 100644
--- a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiIpmiBmcDef.h
+++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiIpmiBmcDef.h
@@ -3,6 +3,7 @@
@copyright
Copyright 2016 - 2021 Intel Corporation. <BR>
+ Copyright (c) 1985 - 2023, American Megatrends International LLC. <BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
@@ -10,6 +11,8 @@
#define _PEI_IPMI_COMMON_BMC_H_
#include <Ppi/IpmiTransportPpi.h>
+#include <Ppi/IpmiTransport2Ppi.h>
+#include "ServerManagement.h"
#define MAX_TEMP_DATA 160
#define BMC_SLAVE_ADDRESS 0x20
@@ -54,7 +57,9 @@ typedef struct {
UINT8 SoftErrorCount;
UINT16 IpmiIoBase;
PEI_IPMI_TRANSPORT_PPI IpmiTransportPpi;
+ IPMI_TRANSPORT2 IpmiTransport2Ppi;
EFI_PEI_PPI_DESCRIPTOR PeiIpmiBmcDataDesc;
+ EFI_PEI_PPI_DESCRIPTOR PeiIpmi2BmcDataDesc;
} PEI_IPMI_BMC_INSTANCE_DATA;
//
@@ -151,5 +156,11 @@ Returns:
--*/
;
+typedef struct _PEI_IPMI_DATA_HOB PEI_IPMI_DATA_HOB;
+
+struct _PEI_IPMI_DATA_HOB {
+ UINTN IpmiInstance; /// IpmiInstance pointer.
+ PEI_IPMI_DATA_HOB *PreMemIpmiDataHobPtr; ///< HOB Data pointer before Memory discovered
+};
#endif //_PEI_IPMI_COMMON_BMC_H_
diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Include/IpmiFeature.dsc b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Include/IpmiFeature.dsc
index 237a4fc006..0401974b82 100644
--- a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Include/IpmiFeature.dsc
+++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Include/IpmiFeature.dsc
@@ -7,6 +7,7 @@
# for the build infrastructure.
#
# Copyright (c) 2019 - 2021, Intel Corporation. All rights reserved.<BR>
+# Copyright (c) 1985 - 2023, American Megatrends International LLC. <BR>
#
# SPDX-License-Identifier: BSD-2-Clause-Patent
#
@@ -41,10 +42,24 @@
[LibraryClasses.common.PEI_CORE,LibraryClasses.common.PEIM]
IpmiBaseLib|IpmiFeaturePkg/Library/PeiIpmiBaseLib/PeiIpmiBaseLib.inf
+ SsifInterfaceLib|IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/SsifInterfaceLib/PeiSsifInterfaceLib.inf
+ IpmbInterfaceLib|IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/IpmbInterfaceLib/PeiIpmbInterfaceLib.inf
[LibraryClasses.common.DXE_DRIVER,LibraryClasses.common.UEFI_DRIVER]
IpmiBaseLib|IpmiFeaturePkg/Library/IpmiBaseLib/IpmiBaseLib.inf
+[LibraryClasses.common]
+ BmcCommonInterfaceLib|IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/BmcCommonInterfaceLib.inf
+ BtInterfaceLib|IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/BtInterfaceLib/BtInterfaceLib.inf
+
+[LibraryClasses.common.DXE_RUNTIME_DRIVER, LibraryClasses.common.DXE_DRIVER]
+ SsifInterfaceLib|IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/SsifInterfaceLib/DxeSsifInterfaceLib.inf
+ IpmbInterfaceLib|IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/IpmbInterfaceLib/DxeIpmbInterfaceLib.inf
+
+[LibraryClasses.common.DXE_SMM_DRIVER]
+ SsifInterfaceLib|IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/SsifInterfaceLib/SmmSsifInterfaceLib.inf
+ IpmbInterfaceLib|IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/IpmbInterfaceLib/SmmIpmbInterfaceLib.inf
+
################################################################################
#
# Component section - list of all components that need built for this feature.
--
2.38.1.windows.1
-The information contained in this message may be confidential and proprietary to American Megatrends (AMI). This communication is intended to be read only by the individual or entity to whom it is addressed or by their designee. If the reader of this message is not the intended recipient, you are on notice that any distribution of this message, in any form, is strictly prohibited. Please promptly notify the sender by reply e-mail or by telephone at 770-246-8600, and then delete or destroy all copies of the transmission.
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [edk2-devel][edk2-platforms][PATCH V3-2] IpmiFeaturePkg:Provided multiple IPMI interface support in PEI
2023-06-12 12:53 [edk2-devel][edk2-platforms][PATCH V3-2] IpmiFeaturePkg:Provided multiple IPMI interface support in PEI Arun K
@ 2023-06-13 0:35 ` Isaac Oram
0 siblings, 0 replies; 2+ messages in thread
From: Isaac Oram @ 2023-06-13 0:35 UTC (permalink / raw)
To: Arun K, devel@edk2.groups.io
Cc: Desimone, Nathaniel L, Ramkumar Krishnamoorthi, Gao, Liming
Similar issues with four space indents, lack of spaces before { and (, #if logic.
Regards,
Isaac
-----Original Message-----
From: Arun K <arunk@ami.com>
Sent: Monday, June 12, 2023 5:53 AM
To: devel@edk2.groups.io; Arun K <arunk@ami.com>
Cc: Oram, Isaac W <isaac.w.oram@intel.com>; Desimone, Nathaniel L <nathaniel.l.desimone@intel.com>; Ramkumar Krishnamoorthi <ramkumark@ami.com>; Gao, Liming <gaoliming@byosoft.com.cn>
Subject: [edk2-devel][edk2-platforms][PATCH V3-2] IpmiFeaturePkg:Provided multiple IPMI interface support in PEI
Created IpmiTransport2 PPI/Protocol to support multiple IPMI BMC Interface support such as KCS/BT/SSIF with 2 API's
IpmiSubmitCommand2 & IpmiSubmitCommand2Ex.
IpmiSubmitCommand2 - This API use the default interface
(PcdDefaultSystemInterface) to send IPMI command.
IpmiSubmitCommand2Ex - This API use the specific interface type to send IPMI command which is passed as an argument.
Cc: Isaac Oram <isaac.w.oram@intel.com>
Cc: Nate DeSimone <nathaniel.l.desimone@intel.com>
Cc: Liming Gao <gaoliming@byosoft.com.cn>
Signed-off-by: Arun K <arunk@ami.com>
---
.../GenericIpmi/Pei/PeiGenericIpmi.c | 295 ++++++++++++++----
.../GenericIpmi/Pei/PeiGenericIpmi.h | 3 +
.../GenericIpmi/Pei/PeiGenericIpmi.inf | 16 +
.../GenericIpmi/Pei/PeiIpmiBmc.c | 3 +-
.../GenericIpmi/Pei/PeiIpmiBmc.h | 9 +
.../GenericIpmi/Pei/PeiIpmiBmcDef.h | 11 +
.../IpmiFeaturePkg/Include/IpmiFeature.dsc | 15 +
7 files changed, 285 insertions(+), 67 deletions(-)
diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiGenericIpmi.c b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiGenericIpmi.c
index e8b99b6900..e0378d61d4 100644
--- a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiGenericIpmi.c
+++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/
+++ PeiGenericIpmi.c
@@ -3,6 +3,7 @@
@copyright
Copyright 2017 - 2021 Intel Corporation. <BR>
+ Copyright (c) 1985 - 2023, American Megatrends International LLC.
+ <BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
@@ -10,10 +11,143 @@
#include "PeiGenericIpmi.h"
#include <Library/ReportStatusCodeLib.h>
#include <Library/IpmiPlatformHookLib.h>
+#include <Library/BmcCommonInterfaceLib.h>
///////////////////////////////////////////////////////////////////////////////
-// Function Implementations
-//
+
+/**
+ Initialize the API and parameters for IPMI Transport2 Instance
+
+ @param[in] IpmiInstance Pointer to IPMI Instance
+
+ @return VOID
+
+**/
+VOID
+InitIpmiTransport2 (
+ IN PEI_IPMI_BMC_INSTANCE_DATA *IpmiInstance
+ )
+{
+ IpmiInstance->IpmiTransport2Ppi.InterfaceType = FixedPcdGet8 (PcdDefaultSystemInterface);
+ IpmiInstance->IpmiTransport2Ppi.IpmiTransport2BmcStatus =
+ BmcStatusOk;
+ IpmiInstance->IpmiTransport2Ppi.IpmiSubmitCommand2 = PeiIpmiSendCommand2;
+ IpmiInstance->IpmiTransport2Ppi.IpmiSubmitCommand2Ex = PeiIpmiSendCommand2Ex;
+
+#if BtInterfaceSupport
+ if (!EFI_ERROR
+ (PlatformIpmiIoRangeSet(FixedPcdGet16(PcdBtControlPort)))) {
+ InitBtInterfaceData (&IpmiInstance->IpmiTransport2Ppi);
+ }
+#endif
+
+#if SsifInterfaceSupport
+ InitSsifInterfaceData (&IpmiInstance->IpmiTransport2Ppi);
+#endif
+
+#if IpmbInterfaceSupport
+ InitIpmbInterfaceData (&IpmiInstance->IpmiTransport2Ppi);
+#endif
+}
+
+/**
+ Notify callback function for interfaces.
+
+ @param[in] PeiServices Describes the list of possible PEI
+ Services.
+ @param[in] NotifyDescriptor Pointer to notify descriptor.
+ @param[in] Ppi Pointer to Ppi.
+
+ @return EFI_STATUS Status of Notify call back.
+ @retval EFI_NOT_FOUND Ipmi hob is not found.
+ @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
+ @retval EFI_SUCCESS Interface is initialized and installed
+ Ipmi Ppi successfully.
+ @retval Others Error status while installing Ppi.
+**/
+EFI_STATUS
+EFIAPI
+NotifyCallback (
+ IN EFI_PEI_SERVICES **PeiServices,
+ IN EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDescriptor,
+ IN VOID *Ppi
+ )
+{
+ EFI_STATUS Status;
+ PEI_IPMI_BMC_INSTANCE_DATA *IpmiInstance;
+ PEI_IPMI_DATA_HOB *IpmiInstancePtrHob;
+ EFI_HOB_GUID_TYPE *GuidHob;
+ IPMI_INTERFACE_STATE InterfaceState;
+
+ InterfaceState = IpmiInterfaceNotReady;
+
+ GuidHob = GetFirstGuidHob (&gPeiIpmiHobGuid);
+ ASSERT (GuidHob != NULL);
+ if (GuidHob == NULL) {
+ return EFI_NOT_FOUND;
+ }
+
+ IpmiInstancePtrHob = (PEI_IPMI_DATA_HOB *)
+ GET_GUID_HOB_DATA(GuidHob);
+ IpmiInstance = (PEI_IPMI_BMC_INSTANCE_DATA*) IpmiInstancePtrHob->IpmiInstance;
+
+#if SsifInterfaceSupport
+ InitSsifInterfaceData(&IpmiInstance->IpmiTransport2Ppi);
+
+ if (IpmiInstance->IpmiTransport2Ppi.Interface.Ssif.InterfaceState ==
+ IpmiInterfaceInitialized){
+ InterfaceState = IpmiInterfaceInitialized;
+ }
+#endif
+
+#if IpmbInterfaceSupport
+ InitIpmbInterfaceData(&IpmiInstance->IpmiTransport2Ppi);
+
+ if (IpmiInstance->IpmiTransport2Ppi.Interface.Ipmb.InterfaceState ==
+ IpmiInterfaceInitialized){
+ InterfaceState = IpmiInterfaceInitialized;
+ }
+#endif
+ // Default Interface data should be initialized to install Ipmi Transport2 Protocol.
+ if (InterfaceState != IpmiInterfaceInitialized) {
+ return EFI_UNSUPPORTED;
+ }
+
+ Status = PeiServicesInstallPpi (&IpmiInstance->PeiIpmi2BmcDataDesc);
+ return Status;
+}
+
+/**
+ Registers callback for Ppi.
+
+ @param[in] PeiServices Describes the list of possible PEI Services.
+ @param[in] PpiGuid Pointer to Ppi guid to register call back.
+
+ @retval EFI_INVALID_PARAMETER Invalid parameter.
+ @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
+ @retval Others Status of NotifyPpi().
+**/
+EFI_STATUS
+RegisterPpiCallback (
+ IN CONST EFI_PEI_SERVICES **PeiServices,
+ IN EFI_GUID *PpiGuid
+ )
+{
+ EFI_STATUS Status;
+ EFI_PEI_NOTIFY_DESCRIPTOR *PpiNotifyDesc;
+
+ if ((PpiGuid == NULL) ||
+ ((PpiGuid != NULL) && IsZeroBuffer(PpiGuid, sizeof (EFI_GUID))))
+ {
+ return EFI_INVALID_PARAMETER;
+ }
+
+ PpiNotifyDesc = (EFI_PEI_NOTIFY_DESCRIPTOR*) AllocateZeroPool (sizeof
+ (EFI_PEI_NOTIFY_DESCRIPTOR));
+ if (PpiNotifyDesc == NULL) {
+ return EFI_OUT_OF_RESOURCES;
+ }
+
+ PpiNotifyDesc->Flags = EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK |
+ EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST;
+ PpiNotifyDesc->Guid = PpiGuid;
+ PpiNotifyDesc->Notify = NotifyCallback;
+
+ Status = (*PeiServices)->NotifyPpi (PeiServices, PpiNotifyDesc);
+ return Status;
+}
/*****************************************************************************
@brief
@@ -31,8 +165,12 @@ PeiInitializeIpmiKcsPhysicalLayer ( {
EFI_STATUS Status;
PEI_IPMI_BMC_INSTANCE_DATA *mIpmiInstance;
+ PEI_IPMI_DATA_HOB *IpmiInstancePtrHob;
+ IPMI_INTERFACE_STATE InterfaceState;
+ UINT8 Index;
- mIpmiInstance = NULL;
+ mIpmiInstance = NULL;
+ InterfaceState = IpmiInterfaceNotReady;
//
// Send Pre-Boot signal to BMC
@@ -60,6 +198,18 @@ PeiInitializeIpmiKcsPhysicalLayer (
return EFI_OUT_OF_RESOURCES;
}
+
+ // Create Guided hob to pass IPMI Instance data pointer to notify functions.
+ IpmiInstancePtrHob = BuildGuidHob (&gPeiIpmiHobGuid,
+ sizeof(PEI_IPMI_DATA_HOB));
+ if (IpmiInstancePtrHob == NULL) {
+ DEBUG ((DEBUG_ERROR, "Failed to create Hob guid for IPMI
+ Instance!!!\n"));
+ FreePool (mIpmiInstance);
+ return EFI_OUT_OF_RESOURCES;
+ }
+
+ IpmiInstancePtrHob->IpmiInstance = (UINTN)mIpmiInstance;
+ IpmiInstancePtrHob->PreMemIpmiDataHobPtr = IpmiInstancePtrHob;
+
//
// Calibrate TSC Counter. Stall for 10ms, then multiply the resulting number of
// ticks in that period by 100 to get the number of ticks in a 1 second timeout
@@ -83,6 +233,7 @@ PeiInitializeIpmiKcsPhysicalLayer (
mIpmiInstance->PeiIpmiBmcDataDesc.Guid = &gPeiIpmiTransportPpiGuid;
mIpmiInstance->PeiIpmiBmcDataDesc.Ppi = &mIpmiInstance->IpmiTransportPpi;
+#if KcsInterfaceSupport
//
// Get the Device ID and check if the system is in Force Update mode.
//
@@ -94,19 +245,85 @@ PeiInitializeIpmiKcsPhysicalLayer (
//
// Do not continue initialization if the BMC is in Force Update Mode.
//
- if (mIpmiInstance->BmcStatus == BMC_UPDATE_IN_PROGRESS || mIpmiInstance->BmcStatus == BMC_HARDFAIL) {
- return EFI_UNSUPPORTED;
+ if (mIpmiInstance->BmcStatus != BMC_UPDATE_IN_PROGRESS &&
+ mIpmiInstance->BmcStatus != BMC_HARDFAIL) {
+ Status = PeiServicesInstallPpi
+ (&mIpmiInstance->PeiIpmiBmcDataDesc);
+ if (EFI_ERROR (Status)) {
+ return Status;
+ }
+ }
+#endif
+
+ InitIpmiTransport2(mIpmiInstance);
+
+ // Check interface data initialized successfully else register notify protocol.
+ for (Index = SysInterfaceKcs; Index < SysInterfaceMax; Index++) {
+
+ switch (Index) {
+
+#if KcsInterfaceSupport
+ case SysInterfaceKcs:
+ if ((mIpmiInstance->BmcStatus != BMC_HARDFAIL) &&
+ (mIpmiInstance->BmcStatus != BMC_UPDATE_IN_PROGRESS)) {
+ BMC_INTERFACE_STATUS BmcStatus;
+
+ mIpmiInstance->IpmiTransport2Ppi.Interface.KcsInterfaceState =
+ IpmiInterfaceInitialized;
+ Status = CheckSelfTestByInterfaceType(
+
+ &mIpmiInstance->IpmiTransport2Ppi,
+ &BmcStatus,
+ SysInterfaceKcs);
+ if (!EFI_ERROR (Status) && (BmcStatus !=
+ BmcStatusHardFail)) {
+ InterfaceState = IpmiInterfaceInitialized;
+ } else {
+
+ mIpmiInstance->IpmiTransport2Ppi.Interface.KcsInterfaceState =
+ IpmiInterfaceInitError;
+ }
+ }
+ break;
+#endif
+
+#if BtInterfaceSupport
+ case SysInterfaceBt:
+ if
+ (mIpmiInstance->IpmiTransport2Ppi.Interface.Bt.InterfaceState ==
+ IpmiInterfaceInitialized){
+ InterfaceState = IpmiInterfaceInitialized;
+ }
+ break;
+#endif
+
+#if SsifInterfaceSupport
+ case SysInterfaceSsif:
+ if
+ (mIpmiInstance->IpmiTransport2Ppi.Interface.Ssif.InterfaceState ==
+ IpmiInterfaceInitialized){
+ InterfaceState = IpmiInterfaceInitialized;
+ } else if
+ (mIpmiInstance->IpmiTransport2Ppi.Interface.Ssif.InterfaceState ==
+ IpmiInterfaceInitError) {
+ // Register protocol notify for SMBUS Protocol.
+ Status = RegisterPpiCallback (PeiServices,
+ &mIpmiInstance->IpmiTransport2Ppi.Interface.Ssif.SsifInterfaceApiGuid)
+ ;
+ }
+ break;
+#endif
+
+#if IpmbInterfaceSupport
+ case SysInterfaceIpmb:
+ if
+ (mIpmiInstance->IpmiTransport2Ppi.Interface.Ipmb.InterfaceState ==
+ IpmiInterfaceInitialized){
+ InterfaceState = IpmiInterfaceInitialized;
+ } else if
+ (mIpmiInstance->IpmiTransport2Ppi.Interface.Ipmb.InterfaceState ==
+ IpmiInterfaceInitError) {
+ // Register protocol notify for SMBUS Protocol.
+ Status = RegisterPpiCallback (PeiServices,
+ &mIpmiInstance->IpmiTransport2Ppi.Interface.Ipmb.IpmbInterfaceApiGuid)
+ ;
+ }
+ break;
+#endif
+ default:
+ break;
+ }
}
- //
- // Just produce PPI
- //
- Status = PeiServicesInstallPpi (&mIpmiInstance->PeiIpmiBmcDataDesc);
- if (EFI_ERROR (Status)) {
- return Status;
+ // Any one of the Interface data should be initialized to install Ipmi Transport2 Protocol.
+ if (InterfaceState != IpmiInterfaceInitialized) {
+ DEBUG ((DEBUG_INFO, "Interface not ready yet. \n"));
+ return EFI_SUCCESS;
}
- return EFI_SUCCESS;
+ mIpmiInstance->PeiIpmi2BmcDataDesc.Flags =
+ EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST;
+ mIpmiInstance->PeiIpmi2BmcDataDesc.Guid = &gPeiIpmiTransport2PpiGuid;
+ mIpmiInstance->PeiIpmi2BmcDataDesc.Ppi = &mIpmiInstance->IpmiTransport2Ppi;
+
+ Status = PeiServicesInstallPpi (&mIpmiInstance->PeiIpmi2BmcDataDesc);
+ return Status;
}
/*****************************************************************************
@@ -176,60 +393,6 @@ PeimIpmiInterfaceInit ( } // PeimIpmiInterfaceInit()
-EFI_STATUS
-PeiIpmiSendCommand (
- IN PEI_IPMI_TRANSPORT_PPI *This,
- IN UINT8 NetFunction,
- IN UINT8 Lun,
- IN UINT8 Command,
- IN UINT8 *CommandData,
- IN UINT32 CommandDataSize,
- IN OUT UINT8 *ResponseData,
- IN OUT UINT32 *ResponseDataSize
- )
-/*++
-
-Routine Description:
-
- Send Ipmi Command in the right mode: HECI or KCS, to the
- appropiate device, ME or BMC.
-
-Arguments:
-
- This - Pointer to IPMI protocol instance
- NetFunction - Net Function of command to send
- Lun - LUN of command to send
- Command - IPMI command to send
- CommandData - Pointer to command data buffer, if needed
- CommandDataSize - Size of command data buffer
- ResponseData - Pointer to response data buffer
- ResponseDataSize - Pointer to response data buffer size
-
-Returns:
-
- EFI_INVALID_PARAMETER - One of the input values is bad
- EFI_DEVICE_ERROR - IPMI command failed
- EFI_BUFFER_TOO_SMALL - Response buffer is too small
- EFI_UNSUPPORTED - Command is not supported by BMC
- EFI_SUCCESS - Command completed successfully
-
---*/
-{
- //
- // This Will be unchanged ( BMC/KCS style )
- //
- return PeiIpmiSendCommandToBmc (
- This,
- NetFunction,
- Lun,
- Command,
- CommandData,
- (UINT8) CommandDataSize,
- ResponseData,
- (UINT8 *) ResponseDataSize,
- NULL
- );
-} // IpmiSendCommand()
EFI_STATUS
PeiGetIpmiBmcStatus (
diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiGenericIpmi.h b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiGenericIpmi.h
index d31af85325..59b26b6c86 100644
--- a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiGenericIpmi.h
+++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/
+++ PeiGenericIpmi.h
@@ -3,6 +3,7 @@
@copyright
Copyright 2017 - 2021 Intel Corporation. <BR>
+ Copyright (c) 1985 - 2023, American Megatrends International LLC.
+ <BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
@@ -23,7 +24,9 @@
#include <Library/PeiServicesTablePointerLib.h>
#include <Library/TimerLib.h>
#include <Library/PciLib.h>
+#include <Library/HobLib.h>
+#include "PeiIpmiHooks.h"
#include "PeiIpmiBmcDef.h"
#include "PeiIpmiBmc.h"
diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiGenericIpmi.inf b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiGenericIpmi.inf
index a646161ce1..555b2e5e6c 100644
--- a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiGenericIpmi.inf
+++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/
+++ PeiGenericIpmi.inf
@@ -3,6 +3,7 @@
#
# @copyright
# Copyright 2017 - 2021 Intel Corporation. <BR>
+# Copyright (c) 1985 - 2023, American Megatrends International LLC.
+<BR>
# SPDX-License-Identifier: BSD-2-Clause-Patent
##
@@ -30,6 +31,8 @@
PeiIpmiBmcDef.h
PeiGenericIpmi.c
PeiGenericIpmi.h
+ PeiIpmiHooks.c
+ PeiIpmiHooks.h
[Packages]
MdePkg/MdePkg.dec
@@ -44,17 +47,30 @@
ReportStatusCodeLib
TimerLib
IpmiPlatformHookLib
+ HobLib
+ BmcCommonInterfaceLib
+ BtInterfaceLib
+ SsifInterfaceLib
+ IpmbInterfaceLib
[Guids]
+ gPeiIpmiHobGuid
[Ppis]
gPeiIpmiTransportPpiGuid #ALWAYS PRODUCE
+ gPeiIpmiTransport2PpiGuid
[Pcd]
gIpmiFeaturePkgTokenSpaceGuid.PcdIpmiIoBaseAddress
gIpmiFeaturePkgTokenSpaceGuid.PcdIpmiBmcReadyDelayTimer
gIpmiFeaturePkgTokenSpaceGuid.PcdSioMailboxBaseAddress
gIpmiFeaturePkgTokenSpaceGuid.PcdSignalPreBootToBmc
+ gIpmiFeaturePkgTokenSpaceGuid.PcdDefaultSystemInterface
+ gIpmiFeaturePkgTokenSpaceGuid.PcdBtInterfaceSupport
+ gIpmiFeaturePkgTokenSpaceGuid.PcdSsifInterfaceSupport
+ gIpmiFeaturePkgTokenSpaceGuid.PcdKcsInterfaceSupport
+ gIpmiFeaturePkgTokenSpaceGuid.PcdIpmbInterfaceSupport
+ gIpmiFeaturePkgTokenSpaceGuid.PcdBtControlPort
[Depex]
TRUE
diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiIpmiBmc.c b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiIpmiBmc.c
index dbe25421ae..38ec98c959 100644
--- a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiIpmiBmc.c
+++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/
+++ PeiIpmiBmc.c
@@ -3,6 +3,7 @@
@copyright
Copyright 2016 - 2021 Intel Corporation. <BR>
+ Copyright (c) 1985 - 2023, American Megatrends International LLC.
+ <BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
@@ -235,7 +236,7 @@ Returns:
EFI_STATUS
-PeiIpmiBmcStatus (
+IpmiBmcStatus (
IN PEI_IPMI_TRANSPORT_PPI *This,
OUT BMC_STATUS *BmcStatus,
OUT SM_COM_ADDRESS *ComAddress,
diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiIpmiBmc.h b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiIpmiBmc.h
index 40b9429e84..51ba65966a 100644
--- a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiIpmiBmc.h
+++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/
+++ PeiIpmiBmc.h
@@ -3,6 +3,7 @@
@copyright
Copyright 2016 - 2021 Intel Corporation. <BR>
+ Copyright (c) 1985 - 2023, American Megatrends International LLC.
+ <BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
@@ -35,4 +36,12 @@
SM_IPMI_BMC_SIGNATURE \
)
+#define INSTANCE_FROM_PEI_IPMI_TRANSPORT2_THIS(a) \
+ CR ( \
+ a, \
+ PEI_IPMI_BMC_INSTANCE_DATA, \
+ IpmiTransport2Ppi, \
+ SM_IPMI_BMC_SIGNATURE \
+ )
+
#endif // _PEI_IPMI_BMC_H_
diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiIpmiBmcDef.h b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiIpmiBmcDef.h
index fc9fbacf1a..24ef17eadb 100644
--- a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiIpmiBmcDef.h
+++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/
+++ PeiIpmiBmcDef.h
@@ -3,6 +3,7 @@
@copyright
Copyright 2016 - 2021 Intel Corporation. <BR>
+ Copyright (c) 1985 - 2023, American Megatrends International LLC.
+ <BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
@@ -10,6 +11,8 @@
#define _PEI_IPMI_COMMON_BMC_H_
#include <Ppi/IpmiTransportPpi.h>
+#include <Ppi/IpmiTransport2Ppi.h>
+#include "ServerManagement.h"
#define MAX_TEMP_DATA 160
#define BMC_SLAVE_ADDRESS 0x20
@@ -54,7 +57,9 @@ typedef struct {
UINT8 SoftErrorCount;
UINT16 IpmiIoBase;
PEI_IPMI_TRANSPORT_PPI IpmiTransportPpi;
+ IPMI_TRANSPORT2 IpmiTransport2Ppi;
EFI_PEI_PPI_DESCRIPTOR PeiIpmiBmcDataDesc;
+ EFI_PEI_PPI_DESCRIPTOR PeiIpmi2BmcDataDesc;
} PEI_IPMI_BMC_INSTANCE_DATA;
//
@@ -151,5 +156,11 @@ Returns:
--*/
;
+typedef struct _PEI_IPMI_DATA_HOB PEI_IPMI_DATA_HOB;
+
+struct _PEI_IPMI_DATA_HOB {
+ UINTN IpmiInstance; /// IpmiInstance pointer.
+ PEI_IPMI_DATA_HOB *PreMemIpmiDataHobPtr; ///< HOB Data pointer before Memory discovered
+};
#endif //_PEI_IPMI_COMMON_BMC_H_
diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Include/IpmiFeature.dsc b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Include/IpmiFeature.dsc
index 237a4fc006..0401974b82 100644
--- a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Include/IpmiFeature.dsc
+++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Include/IpmiFeat
+++ ure.dsc
@@ -7,6 +7,7 @@
# for the build infrastructure.
#
# Copyright (c) 2019 - 2021, Intel Corporation. All rights reserved.<BR>
+# Copyright (c) 1985 - 2023, American Megatrends International LLC.
+<BR>
#
# SPDX-License-Identifier: BSD-2-Clause-Patent
#
@@ -41,10 +42,24 @@
[LibraryClasses.common.PEI_CORE,LibraryClasses.common.PEIM]
IpmiBaseLib|IpmiFeaturePkg/Library/PeiIpmiBaseLib/PeiIpmiBaseLib.inf
+
+ SsifInterfaceLib|IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/SsifI
+ nterfaceLib/PeiSsifInterfaceLib.inf
+
+ IpmbInterfaceLib|IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/IpmbI
+ nterfaceLib/PeiIpmbInterfaceLib.inf
[LibraryClasses.common.DXE_DRIVER,LibraryClasses.common.UEFI_DRIVER]
IpmiBaseLib|IpmiFeaturePkg/Library/IpmiBaseLib/IpmiBaseLib.inf
+[LibraryClasses.common]
+
+ BmcCommonInterfaceLib|IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/
+ BmcCommonInterfaceLib.inf
+
+ BtInterfaceLib|IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/BtInter
+ faceLib/BtInterfaceLib.inf
+
+[LibraryClasses.common.DXE_RUNTIME_DRIVER,
+LibraryClasses.common.DXE_DRIVER]
+
+ SsifInterfaceLib|IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/SsifI
+ nterfaceLib/DxeSsifInterfaceLib.inf
+
+ IpmbInterfaceLib|IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/IpmbI
+ nterfaceLib/DxeIpmbInterfaceLib.inf
+
+[LibraryClasses.common.DXE_SMM_DRIVER]
+
+ SsifInterfaceLib|IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/SsifI
+ nterfaceLib/SmmSsifInterfaceLib.inf
+
+ IpmbInterfaceLib|IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/IpmbI
+ nterfaceLib/SmmIpmbInterfaceLib.inf
+
################################################################################
#
# Component section - list of all components that need built for this feature.
--
2.38.1.windows.1
-The information contained in this message may be confidential and proprietary to American Megatrends (AMI). This communication is intended to be read only by the individual or entity to whom it is addressed or by their designee. If the reader of this message is not the intended recipient, you are on notice that any distribution of this message, in any form, is strictly prohibited. Please promptly notify the sender by reply e-mail or by telephone at 770-246-8600, and then delete or destroy all copies of the transmission.
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2023-06-13 0:35 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-06-12 12:53 [edk2-devel][edk2-platforms][PATCH V3-2] IpmiFeaturePkg:Provided multiple IPMI interface support in PEI Arun K
2023-06-13 0:35 ` Isaac Oram
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox