* [edk2-devel] [PATCH v1 1/1] IpmiFeaturePkg/GenericIpmi: Sync change from SMM
@ 2023-12-06 6:59 Huang, Li-Xia
2023-12-11 21:15 ` Nate DeSimone
2023-12-11 21:16 ` Nate DeSimone
0 siblings, 2 replies; 3+ messages in thread
From: Huang, Li-Xia @ 2023-12-06 6:59 UTC (permalink / raw)
To: devel; +Cc: Abner Chang, Nate DeSimone
Sync change from SMM to StandaloneMm GenericIpmi driver.
Update SmmIpmbInterface and SmmSsifInterface Lib to support
MM_STANDALONE. And Format code with uncrustify.
Cc: Abner Chang <Abner.Chang@amd.com>
Cc: Nate DeSimone <nathaniel.l.desimone@intel.com>
Signed-off-by: Lixia Huang <lisa.huang@intel.com>
---
Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/StandaloneMm/StandaloneMmGenericIpmi.c | 315 +++++++++++++++++---
Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/IpmbInterfaceLib/SmmIpmbInterfaceLib.c | 4 +-
Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/SsifInterfaceLib/SmmSsifInterfaceLib.c | 64 ++--
Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/StandaloneMm/StandaloneMmGenericIpmi.inf | 10 +
Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Include/IpmiFeature.dsc | 2 +-
Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/IpmbInterfaceLib/SmmIpmbInterfaceLib.inf | 4 +-
Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/SsifInterfaceLib/SmmSsifInterfaceLib.inf | 4 +-
7 files changed, 326 insertions(+), 77 deletions(-)
diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/StandaloneMm/StandaloneMmGenericIpmi.c b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/StandaloneMm/StandaloneMmGenericIpmi.c
index d808e2517c99..1b9841e4b745 100644
--- a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/StandaloneMm/StandaloneMmGenericIpmi.c
+++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/StandaloneMm/StandaloneMmGenericIpmi.c
@@ -19,17 +19,157 @@
#include <Library/UefiBootServicesTableLib.h>
#include <Library/IpmiBaseLib.h>
#include <Library/TimerLib.h>
+#include <Library/BmcCommonInterfaceLib.h>
#include <SmStatusCodes.h>
#include "IpmiHooks.h"
#include "IpmiBmcCommon.h"
#include "IpmiBmc.h"
-IPMI_BMC_INSTANCE_DATA *mIpmiInstance;
-EFI_HANDLE mHandle;
+IPMI_BMC_INSTANCE_DATA *mIpmiInstance;
+EFI_HANDLE mIpmiTransportHandle;
+EFI_HANDLE mIpmiTransport2Handle;
/**
+
+Routine Description:
+ Initialize the API and parameters for IPMI Transport2 Instance
+
+Arguments:
+ IpmiInstance - Pointer to IPMI Instance.
+
+Returns:
+ VOID - Nothing.
+
+**/
+VOID
+InitIpmiTransport2 (
+ IN IPMI_BMC_INSTANCE_DATA *IpmiInstance
+ )
+{
+ IpmiInstance->IpmiTransport2.InterfaceType = FixedPcdGet8 (PcdDefaultSystemInterface);
+ IpmiInstance->IpmiTransport2.IpmiTransport2BmcStatus = BmcStatusOk;
+ IpmiInstance->IpmiTransport2.IpmiSubmitCommand2 = IpmiSendCommand2;
+ IpmiInstance->IpmiTransport2.IpmiSubmitCommand2Ex = IpmiSendCommand2Ex;
+
+ if (FixedPcdGet8 (PcdBtInterfaceSupport) == 1) {
+ InitBtInterfaceData (&IpmiInstance->IpmiTransport2);
+ }
+
+ if (FixedPcdGet8 (PcdSsifInterfaceSupport) == 1) {
+ InitSsifInterfaceData (&IpmiInstance->IpmiTransport2);
+ }
+
+ if (FixedPcdGet8 (PcdIpmbInterfaceSupport) == 1) {
+ InitIpmbInterfaceData (&IpmiInstance->IpmiTransport2);
+ }
+}
+
+/**
+
+Routine Description:
+ Notify call back to initialize the interfaces and install SMM IPMI
+ protocol.
+
+Arguments:
+ Protocol - Pointer to the protocol guid.
+ Interface - Pointer to the protocol instance.
+ Handle - Handle on which the protocol is installed.
+
+Returns:
+ Status of Notify call back.
+
+**/
+EFI_STATUS
+EFIAPI
+SmmNotifyCallback (
+ IN CONST EFI_GUID *Protocol,
+ IN VOID *Interface,
+ IN EFI_HANDLE Handle
+ )
+{
+ EFI_STATUS Status;
+ IPMI_INTERFACE_STATE InterfaceState;
+
+ InterfaceState = IpmiInterfaceNotReady;
+
+ if (FixedPcdGet8 (PcdSsifInterfaceSupport) == 1) {
+ InitSsifInterfaceData (&mIpmiInstance->IpmiTransport2);
+
+ if (mIpmiInstance->IpmiTransport2.Interface.Ssif.InterfaceState == IpmiInterfaceInitialized) {
+ InterfaceState = IpmiInterfaceInitialized;
+ }
+ }
+
+ if (FixedPcdGet8 (PcdIpmbInterfaceSupport) == 1) {
+ InitIpmbInterfaceData (&mIpmiInstance->IpmiTransport2);
+ }
+
+ if (mIpmiInstance->IpmiTransport2.Interface.Ipmb.InterfaceState == IpmiInterfaceInitialized) {
+ InterfaceState = IpmiInterfaceInitialized;
+ }
+
+ if (InterfaceState != IpmiInterfaceInitialized) {
+ return EFI_SUCCESS;
+ }
+
+ // Default Interface data should be initialized to install Ipmi Transport2 Protocol.
+ if (InterfaceState == IpmiInterfaceInitialized) {
+ mIpmiTransport2Handle = NULL;
+ Status = gMmst->MmInstallProtocolInterface (
+ &mIpmiTransport2Handle,
+ &gSmmIpmiTransport2ProtocolGuid,
+ EFI_NATIVE_INTERFACE,
+ &mIpmiInstance->IpmiTransport2
+ );
+ }
+
+ ASSERT_EFI_ERROR (Status);
+ return EFI_SUCCESS;
+}
+
+/**
+
+Routine Description:
+ Registers Protocol call back.
+
+Arguments:
+ ProtocolGuid - Pointer to Protocol GUID to register call back.
+
+Returns:
+ Status.
+
+**/
+EFI_STATUS
+MmRegisterProtocolCallback (
+ IN EFI_GUID *ProtocolGuid
+ )
+{
+ EFI_STATUS Status;
+ VOID *Registration;
+
+ if ((ProtocolGuid == NULL) ||
+ ((ProtocolGuid != NULL) && IsZeroBuffer (ProtocolGuid, sizeof (EFI_GUID))))
+ {
+ return EFI_INVALID_PARAMETER;
+ }
+
+ Status = gMmst->MmRegisterProtocolNotify (
+ ProtocolGuid,
+ SmmNotifyCallback,
+ &Registration
+ );
+ return Status;
+}
+
+EFI_STATUS
+SmmInitializeIpmiKcsPhysicalLayer (
+ VOID
+ )
+
+/**
+
Routine Description:
- Setup and initialize the BMC for the SMM phase. In order to verify the BMC is functioning
+ Setup and initialize the BMC for the DXE phase. In order to verify the BMC is functioning
as expected, the BMC Selftest is performed. The results are then checked and any errors are
reported to the error manager. Errors are collected throughout this routine and reported
just prior to installing the driver. If there are more errors than MAX_SOFT_COUNT, then they
@@ -43,25 +183,27 @@ Returns:
EFI_SUCCESS - Successful driver initialization
**/
-EFI_STATUS
-SmmInitializeIpmiKcsPhysicalLayer (
- VOID
- )
{
- EFI_STATUS Status;
+ EFI_STATUS Status;
+ UINT8 ErrorCount;
+ IPMI_INTERFACE_STATE InterfaceState;
+ UINT8 Index;
- DEBUG ((DEBUG_INFO,"SmmInitializeIpmiKcsPhysicalLayer entry \n"));
+ DEBUG ((DEBUG_INFO, "SmmInitializeIpmiKcsPhysicalLayer entry \n"));
+ ErrorCount = 0;
+ InterfaceState = IpmiInterfaceNotReady;
Status = gMmst->MmAllocatePool (
EfiRuntimeServicesData,
sizeof (IPMI_BMC_INSTANCE_DATA),
- (VOID **)&mIpmiInstance);
-
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "mIpmiInstance mem alloc failed - 0x%x\n", Status));
- return Status;
+ (VOID **)&mIpmiInstance
+ );
+ ASSERT (mIpmiInstance != NULL);
+ if (mIpmiInstance == NULL) {
+ DEBUG ((DEBUG_ERROR, "ERROR!! Null Pointer returned by AllocateZeroPool ()\n"));
+ ASSERT_EFI_ERROR (EFI_OUT_OF_RESOURCES);
+ return EFI_OUT_OF_RESOURCES;
} else {
-
//
// Initialize the KCS transaction timeout. Assume delay unit is 1000 us.
//
@@ -70,23 +212,110 @@ SmmInitializeIpmiKcsPhysicalLayer (
//
// Initialize IPMI IO Base, we still use SMS IO base to get device ID and Seltest result since SMM IF may have different cmds supported
//
- mIpmiInstance->IpmiIoBase = FixedPcdGet16 (PcdIpmiSmmIoBaseAddress);
- mIpmiInstance->Signature = SM_IPMI_BMC_SIGNATURE;
- mIpmiInstance->SlaveAddress = BMC_SLAVE_ADDRESS;
- mIpmiInstance->BmcStatus = BMC_NOTREADY;
- mIpmiInstance->IpmiTransport.IpmiSubmitCommand = IpmiSendCommand;
- mIpmiInstance->IpmiTransport.GetBmcStatus = IpmiGetBmcStatus;
-
- mHandle = NULL;
- Status = gMmst->MmInstallProtocolInterface (
- &mHandle,
- &gSmmIpmiTransportProtocolGuid,
- EFI_NATIVE_INTERFACE,
- &mIpmiInstance->IpmiTransport
- );
- ASSERT_EFI_ERROR (Status);
-
- DEBUG ((DEBUG_INFO,"SmmInitializeIpmiKcsPhysicalLayer exit \n"));
+ mIpmiInstance->IpmiIoBase = FixedPcdGet16 (PcdIpmiSmmIoBaseAddress);
+ mIpmiInstance->Signature = SM_IPMI_BMC_SIGNATURE;
+ mIpmiInstance->SlaveAddress = BMC_SLAVE_ADDRESS;
+ mIpmiInstance->BmcStatus = BMC_NOTREADY;
+ mIpmiInstance->IpmiTransport.IpmiSubmitCommand = IpmiSendCommand;
+ mIpmiInstance->IpmiTransport.GetBmcStatus = IpmiGetBmcStatus;
+
+ if (FixedPcdGet8 (PcdKcsInterfaceSupport) == 1) {
+ DEBUG ((DEBUG_INFO, "IPMI: Waiting for Getting BMC DID in SMM \n"));
+ //
+ // Get the Device ID and check if the system is in Force Update mode.
+ //
+ // Just obey the Spec..
+ // To improve performance, we're going to comment it.
+ //
+
+ mIpmiTransportHandle = NULL;
+ Status = gMmst->MmInstallProtocolInterface (
+ &mIpmiTransportHandle,
+ &gSmmIpmiTransportProtocolGuid,
+ EFI_NATIVE_INTERFACE,
+ &mIpmiInstance->IpmiTransport
+ );
+ ASSERT_EFI_ERROR (Status);
+ }
+
+ InitIpmiTransport2 (mIpmiInstance);
+
+ // Check interface data initialized successfully else register notify protocol.
+ for (Index = SysInterfaceKcs; Index < SysInterfaceMax; Index++) {
+ switch (Index) {
+ case SysInterfaceKcs:
+ if (FixedPcdGet8 (PcdKcsInterfaceSupport) == 1) {
+ if ((mIpmiInstance->BmcStatus != BMC_HARDFAIL) && (mIpmiInstance->BmcStatus != BMC_UPDATE_IN_PROGRESS)) {
+ BMC_INTERFACE_STATUS BmcStatus;
+ mIpmiInstance->IpmiTransport2.Interface.KcsInterfaceState = IpmiInterfaceInitialized;
+ Status = CheckSelfTestByInterfaceType (
+ &mIpmiInstance->IpmiTransport2,
+ &BmcStatus,
+ SysInterfaceKcs
+ );
+ if (!EFI_ERROR (Status) && (BmcStatus != BmcStatusHardFail)) {
+ InterfaceState = IpmiInterfaceInitialized;
+ } else {
+ mIpmiInstance->IpmiTransport2.Interface.KcsInterfaceState = IpmiInterfaceInitError;
+ }
+ }
+ }
+
+ break;
+
+ case SysInterfaceBt:
+ if (FixedPcdGet8 (PcdBtInterfaceSupport) == 1) {
+ if (mIpmiInstance->IpmiTransport2.Interface.Bt.InterfaceState == IpmiInterfaceInitialized) {
+ InterfaceState = IpmiInterfaceInitialized;
+ }
+ }
+
+ break;
+
+ case SysInterfaceSsif:
+ if (FixedPcdGet8 (PcdSsifInterfaceSupport) == 1) {
+ if (mIpmiInstance->IpmiTransport2.Interface.Ssif.InterfaceState == IpmiInterfaceInitialized) {
+ InterfaceState = IpmiInterfaceInitialized;
+ } else if (mIpmiInstance->IpmiTransport2.Interface.Ssif.InterfaceState == IpmiInterfaceInitError) {
+ // Register protocol notify for SMBUS Protocol.
+ Status = MmRegisterProtocolCallback (&mIpmiInstance->IpmiTransport2.Interface.Ssif.SsifInterfaceApiGuid);
+ }
+ }
+
+ break;
+
+ case SysInterfaceIpmb:
+ if (FixedPcdGet8 (PcdIpmbInterfaceSupport) == 1) {
+ if (mIpmiInstance->IpmiTransport2.Interface.Ipmb.InterfaceState == IpmiInterfaceInitialized) {
+ InterfaceState = IpmiInterfaceInitialized;
+ } else if (mIpmiInstance->IpmiTransport2.Interface.Ipmb.InterfaceState == IpmiInterfaceInitError) {
+ // Register protocol notify for SMBUS Protocol.
+ Status = MmRegisterProtocolCallback (&mIpmiInstance->IpmiTransport2.Interface.Ipmb.IpmbInterfaceApiGuid);
+ }
+ }
+
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ // Default Interface data should be initialized to install Ipmi Transport2 Protocol.
+ if (InterfaceState == IpmiInterfaceInitialized) {
+ mIpmiTransport2Handle = NULL;
+ Status = gMmst->MmInstallProtocolInterface (
+ &mIpmiTransport2Handle,
+ &gSmmIpmiTransport2ProtocolGuid,
+ EFI_NATIVE_INTERFACE,
+ &mIpmiInstance->IpmiTransport2
+ );
+ if (EFI_ERROR (Status)) {
+ DEBUG ((DEBUG_ERROR, "IPMI Transport2 protocol install Status = %r \n", Status));
+ }
+ }
+
+ DEBUG ((DEBUG_INFO, "SmmInitializeIpmiKcsPhysicalLayer exit \n"));
return EFI_SUCCESS;
}
@@ -104,8 +333,8 @@ SmmInitializeIpmiKcsPhysicalLayer (
**/
EFI_STATUS
InitializeGenericIpmiStandaloneMm (
- IN EFI_HANDLE ImageHandle,
- IN EFI_MM_SYSTEM_TABLE *SystemTable
+ IN EFI_HANDLE ImageHandle,
+ IN EFI_MM_SYSTEM_TABLE *SystemTable
)
{
SmmInitializeIpmiKcsPhysicalLayer ();
@@ -124,21 +353,31 @@ InitializeGenericIpmiStandaloneMm (
EFI_STATUS
EFIAPI
GenericIpmiStandaloneMmUnload (
- IN EFI_HANDLE ImageHandle
+ IN EFI_HANDLE ImageHandle
)
{
- EFI_STATUS Status;
+ EFI_STATUS Status;
Status = EFI_SUCCESS;
if (mIpmiInstance != NULL) {
- if (mHandle != NULL) {
+ if (mIpmiTransportHandle != NULL) {
Status = gMmst->MmUninstallProtocolInterface (
- mHandle,
+ mIpmiTransportHandle,
&gSmmIpmiTransportProtocolGuid,
&mIpmiInstance->IpmiTransport
);
ASSERT_EFI_ERROR (Status);
}
+
+ if (mIpmiTransport2Handle != NULL) {
+ Status = gMmst->MmUninstallProtocolInterface (
+ mIpmiTransport2Handle,
+ &gSmmIpmiTransport2ProtocolGuid,
+ &mIpmiInstance->IpmiTransport2
+ );
+ ASSERT_EFI_ERROR (Status);
+ }
+
gMmst->MmFreePool (mIpmiInstance);
}
diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/IpmbInterfaceLib/SmmIpmbInterfaceLib.c b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/IpmbInterfaceLib/SmmIpmbInterfaceLib.c
index b5d63353e403..589ea81a72c1 100644
--- a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/IpmbInterfaceLib/SmmIpmbInterfaceLib.c
+++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/IpmbInterfaceLib/SmmIpmbInterfaceLib.c
@@ -8,7 +8,7 @@
**/
#include <Library/DebugLib.h>
-#include <Library/SmmServicesTableLib.h>
+#include <Library/MmServicesTableLib.h>
#include <Library/BmcCommonInterfaceLib.h>
#include <Library/IpmbInterfaceLib.h>
#include <Protocol/I2cMaster.h>
@@ -76,7 +76,7 @@ IpmiGetI2cApiPtr (
IpmiTransport2->Interface.Ipmb.IpmbInterfaceApiGuid = gEfiI2cMasterProtocolGuid;
// Locate the I2C SMM Protocol for Communication.
- Status = gSmst->SmmLocateProtocol (
+ Status = gMmst->MmLocateProtocol (
&gEfiI2cMasterProtocolGuid,
NULL,
(VOID **)&I2cMasterTransmit
diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/SsifInterfaceLib/SmmSsifInterfaceLib.c b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/SsifInterfaceLib/SmmSsifInterfaceLib.c
index e784631909ce..1f50977c31be 100644
--- a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/SsifInterfaceLib/SmmSsifInterfaceLib.c
+++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/SsifInterfaceLib/SmmSsifInterfaceLib.c
@@ -8,7 +8,7 @@
**/
#include <Library/DebugLib.h>
-#include <Library/SmmServicesTableLib.h>
+#include <Library/MmServicesTableLib.h>
#include <Library/BmcCommonInterfaceLib.h>
#include <Library/MemoryAllocationLib.h>
#include <Library/SsifInterfaceLib.h>
@@ -54,14 +54,14 @@ IpmiSmbusSendCommand (
if (EfiSmbusHcProtocol != NULL) {
Status = EfiSmbusHcProtocol->Execute (
- EfiSmbusHcProtocol,
- SlaveAddress,
- Command,
- Operation,
- PecCheck,
- Length,
- Buffer
- );
+ EfiSmbusHcProtocol,
+ SlaveAddress,
+ Command,
+ Operation,
+ PecCheck,
+ Length,
+ Buffer
+ );
}
DEBUG ((DEBUG_INFO, "%a EfiSmbusHcProtocol->Execute Status = %r\n", __func__, Status));
@@ -95,13 +95,13 @@ IpmiGetSmbusApiPtr (
IpmiTransport2->Interface.Ssif.SsifInterfaceApiGuid = gEfiSmbusHcProtocolGuid;
HandleCount = 0;
- Status = gSmst->SmmLocateHandle (
- ByProtocol,
- &gEfiSmbusHcProtocolGuid,
- NULL,
- &HandleCount,
- HandleBuffer
- );
+ Status = gMmst->MmLocateHandle (
+ ByProtocol,
+ &gEfiSmbusHcProtocolGuid,
+ NULL,
+ &HandleCount,
+ HandleBuffer
+ );
if (EFI_ERROR (Status) && (Status == EFI_BUFFER_TOO_SMALL)) {
// Allocate memory for Handle buffer
HandleBuffer = AllocateZeroPool (HandleCount);
@@ -109,13 +109,13 @@ IpmiGetSmbusApiPtr (
return EFI_NOT_FOUND;
}
- Status = gSmst->SmmLocateHandle (
- ByProtocol,
- &gEfiSmbusHcProtocolGuid,
- NULL,
- &HandleCount,
- HandleBuffer
- );
+ Status = gMmst->MmLocateHandle (
+ ByProtocol,
+ &gEfiSmbusHcProtocolGuid,
+ NULL,
+ &HandleCount,
+ HandleBuffer
+ );
if (EFI_ERROR (Status)) {
// Free HandleBuffer memory
FreePool (HandleBuffer);
@@ -124,11 +124,11 @@ IpmiGetSmbusApiPtr (
}
for (Index = 0; Index < HandleCount; Index++) {
- Status = gSmst->SmmHandleProtocol (
- HandleBuffer[Index],
- &gEfiSmbusHcProtocolGuid,
- (VOID **)&EfiSmbusHcProtocol
- );
+ Status = gMmst->MmHandleProtocol (
+ HandleBuffer[Index],
+ &gEfiSmbusHcProtocolGuid,
+ (VOID **)&EfiSmbusHcProtocol
+ );
if (EFI_ERROR (Status)) {
continue;
}
@@ -137,10 +137,10 @@ IpmiGetSmbusApiPtr (
IpmiTransport2->Interface.Ssif.SsifInterfaceApiPtr = (UINTN)EfiSmbusHcProtocol;
Status = CheckSelfTestByInterfaceType (
- IpmiTransport2,
- &BmcStatus,
- SysInterfaceSsif
- );
+ IpmiTransport2,
+ &BmcStatus,
+ SysInterfaceSsif
+ );
if (EFI_ERROR (Status) || (BmcStatus == BmcStatusHardFail)) {
IpmiTransport2->Interface.Ssif.InterfaceState = IpmiInterfaceInitError;
continue;
diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/StandaloneMm/StandaloneMmGenericIpmi.inf b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/StandaloneMm/StandaloneMmGenericIpmi.inf
index 170e0a8d136b..e4abc4db29fe 100644
--- a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/StandaloneMm/StandaloneMmGenericIpmi.inf
+++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/StandaloneMm/StandaloneMmGenericIpmi.inf
@@ -38,14 +38,24 @@
IoLib
ReportStatusCodeLib
TimerLib
+ BmcCommonInterfaceLib
+ BtInterfaceLib
+ SsifInterfaceLib
+ IpmbInterfaceLib
[Protocols]
gSmmIpmiTransportProtocolGuid # PROTOCOL ALWAYS_PRODUCED
+ gSmmIpmiTransport2ProtocolGuid # PROTOCOL ALWAYS_PRODUCED
[Guids]
[Pcd]
gIpmiFeaturePkgTokenSpaceGuid.PcdIpmiSmmIoBaseAddress
+ gIpmiFeaturePkgTokenSpaceGuid.PcdDefaultSystemInterface
+ gIpmiFeaturePkgTokenSpaceGuid.PcdBtInterfaceSupport
+ gIpmiFeaturePkgTokenSpaceGuid.PcdSsifInterfaceSupport
+ gIpmiFeaturePkgTokenSpaceGuid.PcdKcsInterfaceSupport
+ gIpmiFeaturePkgTokenSpaceGuid.PcdIpmbInterfaceSupport
[Depex]
gIpmiTransportProtocolGuid
diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Include/IpmiFeature.dsc b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Include/IpmiFeature.dsc
index cfdfc916a464..c9c76565c672 100644
--- a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Include/IpmiFeature.dsc
+++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Include/IpmiFeature.dsc
@@ -57,7 +57,7 @@
SsifInterfaceLib|IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/SsifInterfaceLib/DxeSsifInterfaceLib.inf
IpmbInterfaceLib|IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/IpmbInterfaceLib/DxeIpmbInterfaceLib.inf
-[LibraryClasses.common.DXE_SMM_DRIVER]
+[LibraryClasses.common.DXE_SMM_DRIVER,LibraryClasses.common.MM_STANDALONE]
IpmiBaseLib|IpmiFeaturePkg/Library/SmmIpmiBaseLib/SmmIpmiBaseLib.inf
SsifInterfaceLib|IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/SsifInterfaceLib/SmmSsifInterfaceLib.inf
IpmbInterfaceLib|IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/IpmbInterfaceLib/SmmIpmbInterfaceLib.inf
diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/IpmbInterfaceLib/SmmIpmbInterfaceLib.inf b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/IpmbInterfaceLib/SmmIpmbInterfaceLib.inf
index 5030d5659dc2..32e72bef9bc1 100644
--- a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/IpmbInterfaceLib/SmmIpmbInterfaceLib.inf
+++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/IpmbInterfaceLib/SmmIpmbInterfaceLib.inf
@@ -14,7 +14,7 @@
FILE_GUID = C39F9DC3-37C7-41C1-BE05-8C1524493947
MODULE_TYPE = DXE_SMM_DRIVER
VERSION_STRING = 1.1
- LIBRARY_CLASS = IpmbInterfaceLib | DXE_SMM_DRIVER
+ LIBRARY_CLASS = IpmbInterfaceLib | DXE_SMM_DRIVER MM_STANDALONE
[Sources]
SmmIpmbInterfaceLib.c
@@ -27,7 +27,7 @@
[LibraryClasses]
DebugLib
BaseMemoryLib
- SmmServicesTableLib
+ MmServicesTableLib
BmcCommonInterfaceLib
[Protocols]
diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/SsifInterfaceLib/SmmSsifInterfaceLib.inf b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/SsifInterfaceLib/SmmSsifInterfaceLib.inf
index b1fb44241c37..8ff1a2cf927e 100644
--- a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/SsifInterfaceLib/SmmSsifInterfaceLib.inf
+++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/SsifInterfaceLib/SmmSsifInterfaceLib.inf
@@ -14,7 +14,7 @@
FILE_GUID = DB817B63-FA26-44FA-BF84-8D48596F982B
MODULE_TYPE = DXE_SMM_DRIVER
VERSION_STRING = 1.1
- LIBRARY_CLASS = SsifInterfaceLib | DXE_SMM_DRIVER
+ LIBRARY_CLASS = SsifInterfaceLib | DXE_SMM_DRIVER MM_STANDALONE
[Sources]
SmmSsifInterfaceLib.c
@@ -26,7 +26,7 @@
IpmiFeaturePkg/IpmiFeaturePkg.dec
[LibraryClasses]
- SmmServicesTableLib
+ MmServicesTableLib
MemoryAllocationLib
BmcCommonInterfaceLib
--
2.26.2.windows.1
-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#112091): https://edk2.groups.io/g/devel/message/112091
Mute This Topic: https://groups.io/mt/103008784/7686176
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io]
-=-=-=-=-=-=-=-=-=-=-=-
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [edk2-devel] [PATCH v1 1/1] IpmiFeaturePkg/GenericIpmi: Sync change from SMM
2023-12-06 6:59 [edk2-devel] [PATCH v1 1/1] IpmiFeaturePkg/GenericIpmi: Sync change from SMM Huang, Li-Xia
@ 2023-12-11 21:15 ` Nate DeSimone
2023-12-11 21:16 ` Nate DeSimone
1 sibling, 0 replies; 3+ messages in thread
From: Nate DeSimone @ 2023-12-11 21:15 UTC (permalink / raw)
To: Huang, Li-Xia, devel@edk2.groups.io; +Cc: Abner Chang
Reviewed-by: Nate DeSimone <nathaniel.l.desimone@intel.com>
-----Original Message-----
From: Huang, Li-Xia <lisa.huang@intel.com>
Sent: Tuesday, December 5, 2023 11:00 PM
To: devel@edk2.groups.io
Cc: Abner Chang <Abner.Chang@amd.com>; Desimone, Nathaniel L <nathaniel.l.desimone@intel.com>
Subject: [PATCH v1 1/1] IpmiFeaturePkg/GenericIpmi: Sync change from SMM
Sync change from SMM to StandaloneMm GenericIpmi driver.
Update SmmIpmbInterface and SmmSsifInterface Lib to support MM_STANDALONE. And Format code with uncrustify.
Cc: Abner Chang <Abner.Chang@amd.com>
Cc: Nate DeSimone <nathaniel.l.desimone@intel.com>
Signed-off-by: Lixia Huang <lisa.huang@intel.com>
---
Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/StandaloneMm/StandaloneMmGenericIpmi.c | 315 +++++++++++++++++---
Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/IpmbInterfaceLib/SmmIpmbInterfaceLib.c | 4 +-
Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/SsifInterfaceLib/SmmSsifInterfaceLib.c | 64 ++--
Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/StandaloneMm/StandaloneMmGenericIpmi.inf | 10 +
Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Include/IpmiFeature.dsc | 2 +-
Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/IpmbInterfaceLib/SmmIpmbInterfaceLib.inf | 4 +-
Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/SsifInterfaceLib/SmmSsifInterfaceLib.inf | 4 +-
7 files changed, 326 insertions(+), 77 deletions(-)
diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/StandaloneMm/StandaloneMmGenericIpmi.c b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/StandaloneMm/StandaloneMmGenericIpmi.c
index d808e2517c99..1b9841e4b745 100644
--- a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/StandaloneMm/StandaloneMmGenericIpmi.c
+++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Stan
+++ daloneMm/StandaloneMmGenericIpmi.c
@@ -19,17 +19,157 @@
#include <Library/UefiBootServicesTableLib.h>
#include <Library/IpmiBaseLib.h>
#include <Library/TimerLib.h>
+#include <Library/BmcCommonInterfaceLib.h>
#include <SmStatusCodes.h>
#include "IpmiHooks.h"
#include "IpmiBmcCommon.h"
#include "IpmiBmc.h"
-IPMI_BMC_INSTANCE_DATA *mIpmiInstance;
-EFI_HANDLE mHandle;
+IPMI_BMC_INSTANCE_DATA *mIpmiInstance;
+EFI_HANDLE mIpmiTransportHandle;
+EFI_HANDLE mIpmiTransport2Handle;
/**
+
+Routine Description:
+ Initialize the API and parameters for IPMI Transport2 Instance
+
+Arguments:
+ IpmiInstance - Pointer to IPMI Instance.
+
+Returns:
+ VOID - Nothing.
+
+**/
+VOID
+InitIpmiTransport2 (
+ IN IPMI_BMC_INSTANCE_DATA *IpmiInstance
+ )
+{
+ IpmiInstance->IpmiTransport2.InterfaceType = FixedPcdGet8 (PcdDefaultSystemInterface);
+ IpmiInstance->IpmiTransport2.IpmiTransport2BmcStatus = BmcStatusOk;
+ IpmiInstance->IpmiTransport2.IpmiSubmitCommand2 = IpmiSendCommand2;
+ IpmiInstance->IpmiTransport2.IpmiSubmitCommand2Ex = IpmiSendCommand2Ex;
+
+ if (FixedPcdGet8 (PcdBtInterfaceSupport) == 1) {
+ InitBtInterfaceData (&IpmiInstance->IpmiTransport2); }
+
+ if (FixedPcdGet8 (PcdSsifInterfaceSupport) == 1) {
+ InitSsifInterfaceData (&IpmiInstance->IpmiTransport2); }
+
+ if (FixedPcdGet8 (PcdIpmbInterfaceSupport) == 1) {
+ InitIpmbInterfaceData (&IpmiInstance->IpmiTransport2);
+ }
+}
+
+/**
+
+Routine Description:
+ Notify call back to initialize the interfaces and install SMM IPMI
+ protocol.
+
+Arguments:
+ Protocol - Pointer to the protocol guid.
+ Interface - Pointer to the protocol instance.
+ Handle - Handle on which the protocol is installed.
+
+Returns:
+ Status of Notify call back.
+
+**/
+EFI_STATUS
+EFIAPI
+SmmNotifyCallback (
+ IN CONST EFI_GUID *Protocol,
+ IN VOID *Interface,
+ IN EFI_HANDLE Handle
+ )
+{
+ EFI_STATUS Status;
+ IPMI_INTERFACE_STATE InterfaceState;
+
+ InterfaceState = IpmiInterfaceNotReady;
+
+ if (FixedPcdGet8 (PcdSsifInterfaceSupport) == 1) {
+ InitSsifInterfaceData (&mIpmiInstance->IpmiTransport2);
+
+ if (mIpmiInstance->IpmiTransport2.Interface.Ssif.InterfaceState == IpmiInterfaceInitialized) {
+ InterfaceState = IpmiInterfaceInitialized;
+ }
+ }
+
+ if (FixedPcdGet8 (PcdIpmbInterfaceSupport) == 1) {
+ InitIpmbInterfaceData (&mIpmiInstance->IpmiTransport2); }
+
+ if (mIpmiInstance->IpmiTransport2.Interface.Ipmb.InterfaceState == IpmiInterfaceInitialized) {
+ InterfaceState = IpmiInterfaceInitialized; }
+
+ if (InterfaceState != IpmiInterfaceInitialized) {
+ return EFI_SUCCESS;
+ }
+
+ // Default Interface data should be initialized to install Ipmi Transport2 Protocol.
+ if (InterfaceState == IpmiInterfaceInitialized) {
+ mIpmiTransport2Handle = NULL;
+ Status = gMmst->MmInstallProtocolInterface (
+ &mIpmiTransport2Handle,
+ &gSmmIpmiTransport2ProtocolGuid,
+ EFI_NATIVE_INTERFACE,
+ &mIpmiInstance->IpmiTransport2
+ ); }
+
+ ASSERT_EFI_ERROR (Status);
+ return EFI_SUCCESS;
+}
+
+/**
+
+Routine Description:
+ Registers Protocol call back.
+
+Arguments:
+ ProtocolGuid - Pointer to Protocol GUID to register call back.
+
+Returns:
+ Status.
+
+**/
+EFI_STATUS
+MmRegisterProtocolCallback (
+ IN EFI_GUID *ProtocolGuid
+ )
+{
+ EFI_STATUS Status;
+ VOID *Registration;
+
+ if ((ProtocolGuid == NULL) ||
+ ((ProtocolGuid != NULL) && IsZeroBuffer (ProtocolGuid, sizeof
+ (EFI_GUID)))) {
+ return EFI_INVALID_PARAMETER;
+ }
+
+ Status = gMmst->MmRegisterProtocolNotify (
+ ProtocolGuid,
+ SmmNotifyCallback,
+ &Registration
+ );
+ return Status;
+}
+
+EFI_STATUS
+SmmInitializeIpmiKcsPhysicalLayer (
+ VOID
+ )
+
+/**
+
Routine Description:
- Setup and initialize the BMC for the SMM phase. In order to verify the BMC is functioning
+ Setup and initialize the BMC for the DXE phase. In order to verify
+ the BMC is functioning
as expected, the BMC Selftest is performed. The results are then checked and any errors are
reported to the error manager. Errors are collected throughout this routine and reported
just prior to installing the driver. If there are more errors than MAX_SOFT_COUNT, then they @@ -43,25 +183,27 @@ Returns:
EFI_SUCCESS - Successful driver initialization
**/
-EFI_STATUS
-SmmInitializeIpmiKcsPhysicalLayer (
- VOID
- )
{
- EFI_STATUS Status;
+ EFI_STATUS Status;
+ UINT8 ErrorCount;
+ IPMI_INTERFACE_STATE InterfaceState;
+ UINT8 Index;
- DEBUG ((DEBUG_INFO,"SmmInitializeIpmiKcsPhysicalLayer entry \n"));
+ DEBUG ((DEBUG_INFO, "SmmInitializeIpmiKcsPhysicalLayer entry \n"));
+ ErrorCount = 0;
+ InterfaceState = IpmiInterfaceNotReady;
Status = gMmst->MmAllocatePool (
EfiRuntimeServicesData,
sizeof (IPMI_BMC_INSTANCE_DATA),
- (VOID **)&mIpmiInstance);
-
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "mIpmiInstance mem alloc failed - 0x%x\n", Status));
- return Status;
+ (VOID **)&mIpmiInstance
+ );
+ ASSERT (mIpmiInstance != NULL);
+ if (mIpmiInstance == NULL) {
+ DEBUG ((DEBUG_ERROR, "ERROR!! Null Pointer returned by AllocateZeroPool ()\n"));
+ ASSERT_EFI_ERROR (EFI_OUT_OF_RESOURCES);
+ return EFI_OUT_OF_RESOURCES;
} else {
-
//
// Initialize the KCS transaction timeout. Assume delay unit is 1000 us.
//
@@ -70,23 +212,110 @@ SmmInitializeIpmiKcsPhysicalLayer (
//
// Initialize IPMI IO Base, we still use SMS IO base to get device ID and Seltest result since SMM IF may have different cmds supported
//
- mIpmiInstance->IpmiIoBase = FixedPcdGet16 (PcdIpmiSmmIoBaseAddress);
- mIpmiInstance->Signature = SM_IPMI_BMC_SIGNATURE;
- mIpmiInstance->SlaveAddress = BMC_SLAVE_ADDRESS;
- mIpmiInstance->BmcStatus = BMC_NOTREADY;
- mIpmiInstance->IpmiTransport.IpmiSubmitCommand = IpmiSendCommand;
- mIpmiInstance->IpmiTransport.GetBmcStatus = IpmiGetBmcStatus;
-
- mHandle = NULL;
- Status = gMmst->MmInstallProtocolInterface (
- &mHandle,
- &gSmmIpmiTransportProtocolGuid,
- EFI_NATIVE_INTERFACE,
- &mIpmiInstance->IpmiTransport
- );
- ASSERT_EFI_ERROR (Status);
-
- DEBUG ((DEBUG_INFO,"SmmInitializeIpmiKcsPhysicalLayer exit \n"));
+ mIpmiInstance->IpmiIoBase = FixedPcdGet16 (PcdIpmiSmmIoBaseAddress);
+ mIpmiInstance->Signature = SM_IPMI_BMC_SIGNATURE;
+ mIpmiInstance->SlaveAddress = BMC_SLAVE_ADDRESS;
+ mIpmiInstance->BmcStatus = BMC_NOTREADY;
+ mIpmiInstance->IpmiTransport.IpmiSubmitCommand = IpmiSendCommand;
+ mIpmiInstance->IpmiTransport.GetBmcStatus = IpmiGetBmcStatus;
+
+ if (FixedPcdGet8 (PcdKcsInterfaceSupport) == 1) {
+ DEBUG ((DEBUG_INFO, "IPMI: Waiting for Getting BMC DID in SMM \n"));
+ //
+ // Get the Device ID and check if the system is in Force Update mode.
+ //
+ // Just obey the Spec..
+ // To improve performance, we're going to comment it.
+ //
+
+ mIpmiTransportHandle = NULL;
+ Status = gMmst->MmInstallProtocolInterface (
+ &mIpmiTransportHandle,
+ &gSmmIpmiTransportProtocolGuid,
+ EFI_NATIVE_INTERFACE,
+ &mIpmiInstance->IpmiTransport
+ );
+ ASSERT_EFI_ERROR (Status);
+ }
+
+ InitIpmiTransport2 (mIpmiInstance);
+
+ // Check interface data initialized successfully else register notify protocol.
+ for (Index = SysInterfaceKcs; Index < SysInterfaceMax; Index++) {
+ switch (Index) {
+ case SysInterfaceKcs:
+ if (FixedPcdGet8 (PcdKcsInterfaceSupport) == 1) {
+ if ((mIpmiInstance->BmcStatus != BMC_HARDFAIL) && (mIpmiInstance->BmcStatus != BMC_UPDATE_IN_PROGRESS)) {
+ BMC_INTERFACE_STATUS BmcStatus;
+ mIpmiInstance->IpmiTransport2.Interface.KcsInterfaceState = IpmiInterfaceInitialized;
+ Status = CheckSelfTestByInterfaceType (
+ &mIpmiInstance->IpmiTransport2,
+ &BmcStatus,
+ SysInterfaceKcs
+ );
+ if (!EFI_ERROR (Status) && (BmcStatus != BmcStatusHardFail)) {
+ InterfaceState = IpmiInterfaceInitialized;
+ } else {
+ mIpmiInstance->IpmiTransport2.Interface.KcsInterfaceState = IpmiInterfaceInitError;
+ }
+ }
+ }
+
+ break;
+
+ case SysInterfaceBt:
+ if (FixedPcdGet8 (PcdBtInterfaceSupport) == 1) {
+ if (mIpmiInstance->IpmiTransport2.Interface.Bt.InterfaceState == IpmiInterfaceInitialized) {
+ InterfaceState = IpmiInterfaceInitialized;
+ }
+ }
+
+ break;
+
+ case SysInterfaceSsif:
+ if (FixedPcdGet8 (PcdSsifInterfaceSupport) == 1) {
+ if (mIpmiInstance->IpmiTransport2.Interface.Ssif.InterfaceState == IpmiInterfaceInitialized) {
+ InterfaceState = IpmiInterfaceInitialized;
+ } else if (mIpmiInstance->IpmiTransport2.Interface.Ssif.InterfaceState == IpmiInterfaceInitError) {
+ // Register protocol notify for SMBUS Protocol.
+ Status = MmRegisterProtocolCallback (&mIpmiInstance->IpmiTransport2.Interface.Ssif.SsifInterfaceApiGuid);
+ }
+ }
+
+ break;
+
+ case SysInterfaceIpmb:
+ if (FixedPcdGet8 (PcdIpmbInterfaceSupport) == 1) {
+ if (mIpmiInstance->IpmiTransport2.Interface.Ipmb.InterfaceState == IpmiInterfaceInitialized) {
+ InterfaceState = IpmiInterfaceInitialized;
+ } else if (mIpmiInstance->IpmiTransport2.Interface.Ipmb.InterfaceState == IpmiInterfaceInitError) {
+ // Register protocol notify for SMBUS Protocol.
+ Status = MmRegisterProtocolCallback (&mIpmiInstance->IpmiTransport2.Interface.Ipmb.IpmbInterfaceApiGuid);
+ }
+ }
+
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ // Default Interface data should be initialized to install Ipmi Transport2 Protocol.
+ if (InterfaceState == IpmiInterfaceInitialized) {
+ mIpmiTransport2Handle = NULL;
+ Status = gMmst->MmInstallProtocolInterface (
+ &mIpmiTransport2Handle,
+ &gSmmIpmiTransport2ProtocolGuid,
+ EFI_NATIVE_INTERFACE,
+ &mIpmiInstance->IpmiTransport2
+ );
+ if (EFI_ERROR (Status)) {
+ DEBUG ((DEBUG_ERROR, "IPMI Transport2 protocol install Status = %r \n", Status));
+ }
+ }
+
+ DEBUG ((DEBUG_INFO, "SmmInitializeIpmiKcsPhysicalLayer exit \n"));
return EFI_SUCCESS;
}
@@ -104,8 +333,8 @@ SmmInitializeIpmiKcsPhysicalLayer ( **/ EFI_STATUS InitializeGenericIpmiStandaloneMm (
- IN EFI_HANDLE ImageHandle,
- IN EFI_MM_SYSTEM_TABLE *SystemTable
+ IN EFI_HANDLE ImageHandle,
+ IN EFI_MM_SYSTEM_TABLE *SystemTable
)
{
SmmInitializeIpmiKcsPhysicalLayer (); @@ -124,21 +353,31 @@ InitializeGenericIpmiStandaloneMm ( EFI_STATUS EFIAPI GenericIpmiStandaloneMmUnload (
- IN EFI_HANDLE ImageHandle
+ IN EFI_HANDLE ImageHandle
)
{
- EFI_STATUS Status;
+ EFI_STATUS Status;
Status = EFI_SUCCESS;
if (mIpmiInstance != NULL) {
- if (mHandle != NULL) {
+ if (mIpmiTransportHandle != NULL) {
Status = gMmst->MmUninstallProtocolInterface (
- mHandle,
+ mIpmiTransportHandle,
&gSmmIpmiTransportProtocolGuid,
&mIpmiInstance->IpmiTransport
);
ASSERT_EFI_ERROR (Status);
}
+
+ if (mIpmiTransport2Handle != NULL) {
+ Status = gMmst->MmUninstallProtocolInterface (
+ mIpmiTransport2Handle,
+ &gSmmIpmiTransport2ProtocolGuid,
+ &mIpmiInstance->IpmiTransport2
+ );
+ ASSERT_EFI_ERROR (Status);
+ }
+
gMmst->MmFreePool (mIpmiInstance);
}
diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/IpmbInterfaceLib/SmmIpmbInterfaceLib.c b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/IpmbInterfaceLib/SmmIpmbInterfaceLib.c
index b5d63353e403..589ea81a72c1 100644
--- a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/IpmbInterfaceLib/SmmIpmbInterfaceLib.c
+++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/BmcInter
+++ faceCommonAccess/IpmbInterfaceLib/SmmIpmbInterfaceLib.c
@@ -8,7 +8,7 @@
**/
#include <Library/DebugLib.h>
-#include <Library/SmmServicesTableLib.h>
+#include <Library/MmServicesTableLib.h>
#include <Library/BmcCommonInterfaceLib.h> #include <Library/IpmbInterfaceLib.h> #include <Protocol/I2cMaster.h> @@ -76,7 +76,7 @@ IpmiGetI2cApiPtr (
IpmiTransport2->Interface.Ipmb.IpmbInterfaceApiGuid = gEfiI2cMasterProtocolGuid;
// Locate the I2C SMM Protocol for Communication.
- Status = gSmst->SmmLocateProtocol (
+ Status = gMmst->MmLocateProtocol (
&gEfiI2cMasterProtocolGuid,
NULL,
(VOID **)&I2cMasterTransmit diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/SsifInterfaceLib/SmmSsifInterfaceLib.c b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/SsifInterfaceLib/SmmSsifInterfaceLib.c
index e784631909ce..1f50977c31be 100644
--- a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/SsifInterfaceLib/SmmSsifInterfaceLib.c
+++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/BmcInter
+++ faceCommonAccess/SsifInterfaceLib/SmmSsifInterfaceLib.c
@@ -8,7 +8,7 @@
**/
#include <Library/DebugLib.h>
-#include <Library/SmmServicesTableLib.h>
+#include <Library/MmServicesTableLib.h>
#include <Library/BmcCommonInterfaceLib.h> #include <Library/MemoryAllocationLib.h> #include <Library/SsifInterfaceLib.h> @@ -54,14 +54,14 @@ IpmiSmbusSendCommand (
if (EfiSmbusHcProtocol != NULL) {
Status = EfiSmbusHcProtocol->Execute (
- EfiSmbusHcProtocol,
- SlaveAddress,
- Command,
- Operation,
- PecCheck,
- Length,
- Buffer
- );
+ EfiSmbusHcProtocol,
+ SlaveAddress,
+ Command,
+ Operation,
+ PecCheck,
+ Length,
+ Buffer
+ );
}
DEBUG ((DEBUG_INFO, "%a EfiSmbusHcProtocol->Execute Status = %r\n", __func__, Status)); @@ -95,13 +95,13 @@ IpmiGetSmbusApiPtr (
IpmiTransport2->Interface.Ssif.SsifInterfaceApiGuid = gEfiSmbusHcProtocolGuid;
HandleCount = 0;
- Status = gSmst->SmmLocateHandle (
- ByProtocol,
- &gEfiSmbusHcProtocolGuid,
- NULL,
- &HandleCount,
- HandleBuffer
- );
+ Status = gMmst->MmLocateHandle (
+ ByProtocol,
+ &gEfiSmbusHcProtocolGuid,
+ NULL,
+ &HandleCount,
+ HandleBuffer
+ );
if (EFI_ERROR (Status) && (Status == EFI_BUFFER_TOO_SMALL)) {
// Allocate memory for Handle buffer
HandleBuffer = AllocateZeroPool (HandleCount); @@ -109,13 +109,13 @@ IpmiGetSmbusApiPtr (
return EFI_NOT_FOUND;
}
- Status = gSmst->SmmLocateHandle (
- ByProtocol,
- &gEfiSmbusHcProtocolGuid,
- NULL,
- &HandleCount,
- HandleBuffer
- );
+ Status = gMmst->MmLocateHandle (
+ ByProtocol,
+ &gEfiSmbusHcProtocolGuid,
+ NULL,
+ &HandleCount,
+ HandleBuffer
+ );
if (EFI_ERROR (Status)) {
// Free HandleBuffer memory
FreePool (HandleBuffer);
@@ -124,11 +124,11 @@ IpmiGetSmbusApiPtr (
}
for (Index = 0; Index < HandleCount; Index++) {
- Status = gSmst->SmmHandleProtocol (
- HandleBuffer[Index],
- &gEfiSmbusHcProtocolGuid,
- (VOID **)&EfiSmbusHcProtocol
- );
+ Status = gMmst->MmHandleProtocol (
+ HandleBuffer[Index],
+ &gEfiSmbusHcProtocolGuid,
+ (VOID **)&EfiSmbusHcProtocol
+ );
if (EFI_ERROR (Status)) {
continue;
}
@@ -137,10 +137,10 @@ IpmiGetSmbusApiPtr (
IpmiTransport2->Interface.Ssif.SsifInterfaceApiPtr = (UINTN)EfiSmbusHcProtocol;
Status = CheckSelfTestByInterfaceType (
- IpmiTransport2,
- &BmcStatus,
- SysInterfaceSsif
- );
+ IpmiTransport2,
+ &BmcStatus,
+ SysInterfaceSsif
+ );
if (EFI_ERROR (Status) || (BmcStatus == BmcStatusHardFail)) {
IpmiTransport2->Interface.Ssif.InterfaceState = IpmiInterfaceInitError;
continue;
diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/StandaloneMm/StandaloneMmGenericIpmi.inf b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/StandaloneMm/StandaloneMmGenericIpmi.inf
index 170e0a8d136b..e4abc4db29fe 100644
--- a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/StandaloneMm/StandaloneMmGenericIpmi.inf
+++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Stan
+++ daloneMm/StandaloneMmGenericIpmi.inf
@@ -38,14 +38,24 @@
IoLib
ReportStatusCodeLib
TimerLib
+ BmcCommonInterfaceLib
+ BtInterfaceLib
+ SsifInterfaceLib
+ IpmbInterfaceLib
[Protocols]
gSmmIpmiTransportProtocolGuid # PROTOCOL ALWAYS_PRODUCED
+ gSmmIpmiTransport2ProtocolGuid # PROTOCOL ALWAYS_PRODUCED
[Guids]
[Pcd]
gIpmiFeaturePkgTokenSpaceGuid.PcdIpmiSmmIoBaseAddress
+ gIpmiFeaturePkgTokenSpaceGuid.PcdDefaultSystemInterface
+ gIpmiFeaturePkgTokenSpaceGuid.PcdBtInterfaceSupport
+ gIpmiFeaturePkgTokenSpaceGuid.PcdSsifInterfaceSupport
+ gIpmiFeaturePkgTokenSpaceGuid.PcdKcsInterfaceSupport
+ gIpmiFeaturePkgTokenSpaceGuid.PcdIpmbInterfaceSupport
[Depex]
gIpmiTransportProtocolGuid
diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Include/IpmiFeature.dsc b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Include/IpmiFeature.dsc
index cfdfc916a464..c9c76565c672 100644
--- a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Include/IpmiFeature.dsc
+++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Include/IpmiFeat
+++ ure.dsc
@@ -57,7 +57,7 @@
SsifInterfaceLib|IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/SsifInterfaceLib/DxeSsifInterfaceLib.inf
IpmbInterfaceLib|IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/IpmbInterfaceLib/DxeIpmbInterfaceLib.inf
-[LibraryClasses.common.DXE_SMM_DRIVER]
+[LibraryClasses.common.DXE_SMM_DRIVER,LibraryClasses.common.MM_STANDALO
+NE]
IpmiBaseLib|IpmiFeaturePkg/Library/SmmIpmiBaseLib/SmmIpmiBaseLib.inf
SsifInterfaceLib|IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/SsifInterfaceLib/SmmSsifInterfaceLib.inf
IpmbInterfaceLib|IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/IpmbInterfaceLib/SmmIpmbInterfaceLib.inf
diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/IpmbInterfaceLib/SmmIpmbInterfaceLib.inf b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/IpmbInterfaceLib/SmmIpmbInterfaceLib.inf
index 5030d5659dc2..32e72bef9bc1 100644
--- a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/IpmbInterfaceLib/SmmIpmbInterfaceLib.inf
+++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/BmcInter
+++ faceCommonAccess/IpmbInterfaceLib/SmmIpmbInterfaceLib.inf
@@ -14,7 +14,7 @@
FILE_GUID = C39F9DC3-37C7-41C1-BE05-8C1524493947
MODULE_TYPE = DXE_SMM_DRIVER
VERSION_STRING = 1.1
- LIBRARY_CLASS = IpmbInterfaceLib | DXE_SMM_DRIVER
+ LIBRARY_CLASS = IpmbInterfaceLib | DXE_SMM_DRIVER MM_STANDALONE
[Sources]
SmmIpmbInterfaceLib.c
@@ -27,7 +27,7 @@
[LibraryClasses]
DebugLib
BaseMemoryLib
- SmmServicesTableLib
+ MmServicesTableLib
BmcCommonInterfaceLib
[Protocols]
diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/SsifInterfaceLib/SmmSsifInterfaceLib.inf b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/SsifInterfaceLib/SmmSsifInterfaceLib.inf
index b1fb44241c37..8ff1a2cf927e 100644
--- a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/SsifInterfaceLib/SmmSsifInterfaceLib.inf
+++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/BmcInter
+++ faceCommonAccess/SsifInterfaceLib/SmmSsifInterfaceLib.inf
@@ -14,7 +14,7 @@
FILE_GUID = DB817B63-FA26-44FA-BF84-8D48596F982B
MODULE_TYPE = DXE_SMM_DRIVER
VERSION_STRING = 1.1
- LIBRARY_CLASS = SsifInterfaceLib | DXE_SMM_DRIVER
+ LIBRARY_CLASS = SsifInterfaceLib | DXE_SMM_DRIVER MM_STANDALONE
[Sources]
SmmSsifInterfaceLib.c
@@ -26,7 +26,7 @@
IpmiFeaturePkg/IpmiFeaturePkg.dec
[LibraryClasses]
- SmmServicesTableLib
+ MmServicesTableLib
MemoryAllocationLib
BmcCommonInterfaceLib
--
2.26.2.windows.1
-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#112328): https://edk2.groups.io/g/devel/message/112328
Mute This Topic: https://groups.io/mt/103008784/7686176
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io]
-=-=-=-=-=-=-=-=-=-=-=-
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [edk2-devel] [PATCH v1 1/1] IpmiFeaturePkg/GenericIpmi: Sync change from SMM
2023-12-06 6:59 [edk2-devel] [PATCH v1 1/1] IpmiFeaturePkg/GenericIpmi: Sync change from SMM Huang, Li-Xia
2023-12-11 21:15 ` Nate DeSimone
@ 2023-12-11 21:16 ` Nate DeSimone
1 sibling, 0 replies; 3+ messages in thread
From: Nate DeSimone @ 2023-12-11 21:16 UTC (permalink / raw)
To: Huang, Li-Xia, devel@edk2.groups.io; +Cc: Abner Chang
Pushed as 7afba0.
-----Original Message-----
From: Huang, Li-Xia <lisa.huang@intel.com>
Sent: Tuesday, December 5, 2023 11:00 PM
To: devel@edk2.groups.io
Cc: Abner Chang <Abner.Chang@amd.com>; Desimone, Nathaniel L <nathaniel.l.desimone@intel.com>
Subject: [PATCH v1 1/1] IpmiFeaturePkg/GenericIpmi: Sync change from SMM
Sync change from SMM to StandaloneMm GenericIpmi driver.
Update SmmIpmbInterface and SmmSsifInterface Lib to support MM_STANDALONE. And Format code with uncrustify.
Cc: Abner Chang <Abner.Chang@amd.com>
Cc: Nate DeSimone <nathaniel.l.desimone@intel.com>
Signed-off-by: Lixia Huang <lisa.huang@intel.com>
---
Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/StandaloneMm/StandaloneMmGenericIpmi.c | 315 +++++++++++++++++---
Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/IpmbInterfaceLib/SmmIpmbInterfaceLib.c | 4 +-
Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/SsifInterfaceLib/SmmSsifInterfaceLib.c | 64 ++--
Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/StandaloneMm/StandaloneMmGenericIpmi.inf | 10 +
Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Include/IpmiFeature.dsc | 2 +-
Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/IpmbInterfaceLib/SmmIpmbInterfaceLib.inf | 4 +-
Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/SsifInterfaceLib/SmmSsifInterfaceLib.inf | 4 +-
7 files changed, 326 insertions(+), 77 deletions(-)
diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/StandaloneMm/StandaloneMmGenericIpmi.c b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/StandaloneMm/StandaloneMmGenericIpmi.c
index d808e2517c99..1b9841e4b745 100644
--- a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/StandaloneMm/StandaloneMmGenericIpmi.c
+++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Stan
+++ daloneMm/StandaloneMmGenericIpmi.c
@@ -19,17 +19,157 @@
#include <Library/UefiBootServicesTableLib.h>
#include <Library/IpmiBaseLib.h>
#include <Library/TimerLib.h>
+#include <Library/BmcCommonInterfaceLib.h>
#include <SmStatusCodes.h>
#include "IpmiHooks.h"
#include "IpmiBmcCommon.h"
#include "IpmiBmc.h"
-IPMI_BMC_INSTANCE_DATA *mIpmiInstance;
-EFI_HANDLE mHandle;
+IPMI_BMC_INSTANCE_DATA *mIpmiInstance;
+EFI_HANDLE mIpmiTransportHandle;
+EFI_HANDLE mIpmiTransport2Handle;
/**
+
+Routine Description:
+ Initialize the API and parameters for IPMI Transport2 Instance
+
+Arguments:
+ IpmiInstance - Pointer to IPMI Instance.
+
+Returns:
+ VOID - Nothing.
+
+**/
+VOID
+InitIpmiTransport2 (
+ IN IPMI_BMC_INSTANCE_DATA *IpmiInstance
+ )
+{
+ IpmiInstance->IpmiTransport2.InterfaceType = FixedPcdGet8 (PcdDefaultSystemInterface);
+ IpmiInstance->IpmiTransport2.IpmiTransport2BmcStatus = BmcStatusOk;
+ IpmiInstance->IpmiTransport2.IpmiSubmitCommand2 = IpmiSendCommand2;
+ IpmiInstance->IpmiTransport2.IpmiSubmitCommand2Ex = IpmiSendCommand2Ex;
+
+ if (FixedPcdGet8 (PcdBtInterfaceSupport) == 1) {
+ InitBtInterfaceData (&IpmiInstance->IpmiTransport2); }
+
+ if (FixedPcdGet8 (PcdSsifInterfaceSupport) == 1) {
+ InitSsifInterfaceData (&IpmiInstance->IpmiTransport2); }
+
+ if (FixedPcdGet8 (PcdIpmbInterfaceSupport) == 1) {
+ InitIpmbInterfaceData (&IpmiInstance->IpmiTransport2);
+ }
+}
+
+/**
+
+Routine Description:
+ Notify call back to initialize the interfaces and install SMM IPMI
+ protocol.
+
+Arguments:
+ Protocol - Pointer to the protocol guid.
+ Interface - Pointer to the protocol instance.
+ Handle - Handle on which the protocol is installed.
+
+Returns:
+ Status of Notify call back.
+
+**/
+EFI_STATUS
+EFIAPI
+SmmNotifyCallback (
+ IN CONST EFI_GUID *Protocol,
+ IN VOID *Interface,
+ IN EFI_HANDLE Handle
+ )
+{
+ EFI_STATUS Status;
+ IPMI_INTERFACE_STATE InterfaceState;
+
+ InterfaceState = IpmiInterfaceNotReady;
+
+ if (FixedPcdGet8 (PcdSsifInterfaceSupport) == 1) {
+ InitSsifInterfaceData (&mIpmiInstance->IpmiTransport2);
+
+ if (mIpmiInstance->IpmiTransport2.Interface.Ssif.InterfaceState == IpmiInterfaceInitialized) {
+ InterfaceState = IpmiInterfaceInitialized;
+ }
+ }
+
+ if (FixedPcdGet8 (PcdIpmbInterfaceSupport) == 1) {
+ InitIpmbInterfaceData (&mIpmiInstance->IpmiTransport2); }
+
+ if (mIpmiInstance->IpmiTransport2.Interface.Ipmb.InterfaceState == IpmiInterfaceInitialized) {
+ InterfaceState = IpmiInterfaceInitialized; }
+
+ if (InterfaceState != IpmiInterfaceInitialized) {
+ return EFI_SUCCESS;
+ }
+
+ // Default Interface data should be initialized to install Ipmi Transport2 Protocol.
+ if (InterfaceState == IpmiInterfaceInitialized) {
+ mIpmiTransport2Handle = NULL;
+ Status = gMmst->MmInstallProtocolInterface (
+ &mIpmiTransport2Handle,
+ &gSmmIpmiTransport2ProtocolGuid,
+ EFI_NATIVE_INTERFACE,
+ &mIpmiInstance->IpmiTransport2
+ ); }
+
+ ASSERT_EFI_ERROR (Status);
+ return EFI_SUCCESS;
+}
+
+/**
+
+Routine Description:
+ Registers Protocol call back.
+
+Arguments:
+ ProtocolGuid - Pointer to Protocol GUID to register call back.
+
+Returns:
+ Status.
+
+**/
+EFI_STATUS
+MmRegisterProtocolCallback (
+ IN EFI_GUID *ProtocolGuid
+ )
+{
+ EFI_STATUS Status;
+ VOID *Registration;
+
+ if ((ProtocolGuid == NULL) ||
+ ((ProtocolGuid != NULL) && IsZeroBuffer (ProtocolGuid, sizeof
+ (EFI_GUID)))) {
+ return EFI_INVALID_PARAMETER;
+ }
+
+ Status = gMmst->MmRegisterProtocolNotify (
+ ProtocolGuid,
+ SmmNotifyCallback,
+ &Registration
+ );
+ return Status;
+}
+
+EFI_STATUS
+SmmInitializeIpmiKcsPhysicalLayer (
+ VOID
+ )
+
+/**
+
Routine Description:
- Setup and initialize the BMC for the SMM phase. In order to verify the BMC is functioning
+ Setup and initialize the BMC for the DXE phase. In order to verify
+ the BMC is functioning
as expected, the BMC Selftest is performed. The results are then checked and any errors are
reported to the error manager. Errors are collected throughout this routine and reported
just prior to installing the driver. If there are more errors than MAX_SOFT_COUNT, then they @@ -43,25 +183,27 @@ Returns:
EFI_SUCCESS - Successful driver initialization
**/
-EFI_STATUS
-SmmInitializeIpmiKcsPhysicalLayer (
- VOID
- )
{
- EFI_STATUS Status;
+ EFI_STATUS Status;
+ UINT8 ErrorCount;
+ IPMI_INTERFACE_STATE InterfaceState;
+ UINT8 Index;
- DEBUG ((DEBUG_INFO,"SmmInitializeIpmiKcsPhysicalLayer entry \n"));
+ DEBUG ((DEBUG_INFO, "SmmInitializeIpmiKcsPhysicalLayer entry \n"));
+ ErrorCount = 0;
+ InterfaceState = IpmiInterfaceNotReady;
Status = gMmst->MmAllocatePool (
EfiRuntimeServicesData,
sizeof (IPMI_BMC_INSTANCE_DATA),
- (VOID **)&mIpmiInstance);
-
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_ERROR, "mIpmiInstance mem alloc failed - 0x%x\n", Status));
- return Status;
+ (VOID **)&mIpmiInstance
+ );
+ ASSERT (mIpmiInstance != NULL);
+ if (mIpmiInstance == NULL) {
+ DEBUG ((DEBUG_ERROR, "ERROR!! Null Pointer returned by AllocateZeroPool ()\n"));
+ ASSERT_EFI_ERROR (EFI_OUT_OF_RESOURCES);
+ return EFI_OUT_OF_RESOURCES;
} else {
-
//
// Initialize the KCS transaction timeout. Assume delay unit is 1000 us.
//
@@ -70,23 +212,110 @@ SmmInitializeIpmiKcsPhysicalLayer (
//
// Initialize IPMI IO Base, we still use SMS IO base to get device ID and Seltest result since SMM IF may have different cmds supported
//
- mIpmiInstance->IpmiIoBase = FixedPcdGet16 (PcdIpmiSmmIoBaseAddress);
- mIpmiInstance->Signature = SM_IPMI_BMC_SIGNATURE;
- mIpmiInstance->SlaveAddress = BMC_SLAVE_ADDRESS;
- mIpmiInstance->BmcStatus = BMC_NOTREADY;
- mIpmiInstance->IpmiTransport.IpmiSubmitCommand = IpmiSendCommand;
- mIpmiInstance->IpmiTransport.GetBmcStatus = IpmiGetBmcStatus;
-
- mHandle = NULL;
- Status = gMmst->MmInstallProtocolInterface (
- &mHandle,
- &gSmmIpmiTransportProtocolGuid,
- EFI_NATIVE_INTERFACE,
- &mIpmiInstance->IpmiTransport
- );
- ASSERT_EFI_ERROR (Status);
-
- DEBUG ((DEBUG_INFO,"SmmInitializeIpmiKcsPhysicalLayer exit \n"));
+ mIpmiInstance->IpmiIoBase = FixedPcdGet16 (PcdIpmiSmmIoBaseAddress);
+ mIpmiInstance->Signature = SM_IPMI_BMC_SIGNATURE;
+ mIpmiInstance->SlaveAddress = BMC_SLAVE_ADDRESS;
+ mIpmiInstance->BmcStatus = BMC_NOTREADY;
+ mIpmiInstance->IpmiTransport.IpmiSubmitCommand = IpmiSendCommand;
+ mIpmiInstance->IpmiTransport.GetBmcStatus = IpmiGetBmcStatus;
+
+ if (FixedPcdGet8 (PcdKcsInterfaceSupport) == 1) {
+ DEBUG ((DEBUG_INFO, "IPMI: Waiting for Getting BMC DID in SMM \n"));
+ //
+ // Get the Device ID and check if the system is in Force Update mode.
+ //
+ // Just obey the Spec..
+ // To improve performance, we're going to comment it.
+ //
+
+ mIpmiTransportHandle = NULL;
+ Status = gMmst->MmInstallProtocolInterface (
+ &mIpmiTransportHandle,
+ &gSmmIpmiTransportProtocolGuid,
+ EFI_NATIVE_INTERFACE,
+ &mIpmiInstance->IpmiTransport
+ );
+ ASSERT_EFI_ERROR (Status);
+ }
+
+ InitIpmiTransport2 (mIpmiInstance);
+
+ // Check interface data initialized successfully else register notify protocol.
+ for (Index = SysInterfaceKcs; Index < SysInterfaceMax; Index++) {
+ switch (Index) {
+ case SysInterfaceKcs:
+ if (FixedPcdGet8 (PcdKcsInterfaceSupport) == 1) {
+ if ((mIpmiInstance->BmcStatus != BMC_HARDFAIL) && (mIpmiInstance->BmcStatus != BMC_UPDATE_IN_PROGRESS)) {
+ BMC_INTERFACE_STATUS BmcStatus;
+ mIpmiInstance->IpmiTransport2.Interface.KcsInterfaceState = IpmiInterfaceInitialized;
+ Status = CheckSelfTestByInterfaceType (
+ &mIpmiInstance->IpmiTransport2,
+ &BmcStatus,
+ SysInterfaceKcs
+ );
+ if (!EFI_ERROR (Status) && (BmcStatus != BmcStatusHardFail)) {
+ InterfaceState = IpmiInterfaceInitialized;
+ } else {
+ mIpmiInstance->IpmiTransport2.Interface.KcsInterfaceState = IpmiInterfaceInitError;
+ }
+ }
+ }
+
+ break;
+
+ case SysInterfaceBt:
+ if (FixedPcdGet8 (PcdBtInterfaceSupport) == 1) {
+ if (mIpmiInstance->IpmiTransport2.Interface.Bt.InterfaceState == IpmiInterfaceInitialized) {
+ InterfaceState = IpmiInterfaceInitialized;
+ }
+ }
+
+ break;
+
+ case SysInterfaceSsif:
+ if (FixedPcdGet8 (PcdSsifInterfaceSupport) == 1) {
+ if (mIpmiInstance->IpmiTransport2.Interface.Ssif.InterfaceState == IpmiInterfaceInitialized) {
+ InterfaceState = IpmiInterfaceInitialized;
+ } else if (mIpmiInstance->IpmiTransport2.Interface.Ssif.InterfaceState == IpmiInterfaceInitError) {
+ // Register protocol notify for SMBUS Protocol.
+ Status = MmRegisterProtocolCallback (&mIpmiInstance->IpmiTransport2.Interface.Ssif.SsifInterfaceApiGuid);
+ }
+ }
+
+ break;
+
+ case SysInterfaceIpmb:
+ if (FixedPcdGet8 (PcdIpmbInterfaceSupport) == 1) {
+ if (mIpmiInstance->IpmiTransport2.Interface.Ipmb.InterfaceState == IpmiInterfaceInitialized) {
+ InterfaceState = IpmiInterfaceInitialized;
+ } else if (mIpmiInstance->IpmiTransport2.Interface.Ipmb.InterfaceState == IpmiInterfaceInitError) {
+ // Register protocol notify for SMBUS Protocol.
+ Status = MmRegisterProtocolCallback (&mIpmiInstance->IpmiTransport2.Interface.Ipmb.IpmbInterfaceApiGuid);
+ }
+ }
+
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ // Default Interface data should be initialized to install Ipmi Transport2 Protocol.
+ if (InterfaceState == IpmiInterfaceInitialized) {
+ mIpmiTransport2Handle = NULL;
+ Status = gMmst->MmInstallProtocolInterface (
+ &mIpmiTransport2Handle,
+ &gSmmIpmiTransport2ProtocolGuid,
+ EFI_NATIVE_INTERFACE,
+ &mIpmiInstance->IpmiTransport2
+ );
+ if (EFI_ERROR (Status)) {
+ DEBUG ((DEBUG_ERROR, "IPMI Transport2 protocol install Status = %r \n", Status));
+ }
+ }
+
+ DEBUG ((DEBUG_INFO, "SmmInitializeIpmiKcsPhysicalLayer exit \n"));
return EFI_SUCCESS;
}
@@ -104,8 +333,8 @@ SmmInitializeIpmiKcsPhysicalLayer ( **/ EFI_STATUS InitializeGenericIpmiStandaloneMm (
- IN EFI_HANDLE ImageHandle,
- IN EFI_MM_SYSTEM_TABLE *SystemTable
+ IN EFI_HANDLE ImageHandle,
+ IN EFI_MM_SYSTEM_TABLE *SystemTable
)
{
SmmInitializeIpmiKcsPhysicalLayer (); @@ -124,21 +353,31 @@ InitializeGenericIpmiStandaloneMm ( EFI_STATUS EFIAPI GenericIpmiStandaloneMmUnload (
- IN EFI_HANDLE ImageHandle
+ IN EFI_HANDLE ImageHandle
)
{
- EFI_STATUS Status;
+ EFI_STATUS Status;
Status = EFI_SUCCESS;
if (mIpmiInstance != NULL) {
- if (mHandle != NULL) {
+ if (mIpmiTransportHandle != NULL) {
Status = gMmst->MmUninstallProtocolInterface (
- mHandle,
+ mIpmiTransportHandle,
&gSmmIpmiTransportProtocolGuid,
&mIpmiInstance->IpmiTransport
);
ASSERT_EFI_ERROR (Status);
}
+
+ if (mIpmiTransport2Handle != NULL) {
+ Status = gMmst->MmUninstallProtocolInterface (
+ mIpmiTransport2Handle,
+ &gSmmIpmiTransport2ProtocolGuid,
+ &mIpmiInstance->IpmiTransport2
+ );
+ ASSERT_EFI_ERROR (Status);
+ }
+
gMmst->MmFreePool (mIpmiInstance);
}
diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/IpmbInterfaceLib/SmmIpmbInterfaceLib.c b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/IpmbInterfaceLib/SmmIpmbInterfaceLib.c
index b5d63353e403..589ea81a72c1 100644
--- a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/IpmbInterfaceLib/SmmIpmbInterfaceLib.c
+++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/BmcInter
+++ faceCommonAccess/IpmbInterfaceLib/SmmIpmbInterfaceLib.c
@@ -8,7 +8,7 @@
**/
#include <Library/DebugLib.h>
-#include <Library/SmmServicesTableLib.h>
+#include <Library/MmServicesTableLib.h>
#include <Library/BmcCommonInterfaceLib.h> #include <Library/IpmbInterfaceLib.h> #include <Protocol/I2cMaster.h> @@ -76,7 +76,7 @@ IpmiGetI2cApiPtr (
IpmiTransport2->Interface.Ipmb.IpmbInterfaceApiGuid = gEfiI2cMasterProtocolGuid;
// Locate the I2C SMM Protocol for Communication.
- Status = gSmst->SmmLocateProtocol (
+ Status = gMmst->MmLocateProtocol (
&gEfiI2cMasterProtocolGuid,
NULL,
(VOID **)&I2cMasterTransmit diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/SsifInterfaceLib/SmmSsifInterfaceLib.c b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/SsifInterfaceLib/SmmSsifInterfaceLib.c
index e784631909ce..1f50977c31be 100644
--- a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/SsifInterfaceLib/SmmSsifInterfaceLib.c
+++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/BmcInter
+++ faceCommonAccess/SsifInterfaceLib/SmmSsifInterfaceLib.c
@@ -8,7 +8,7 @@
**/
#include <Library/DebugLib.h>
-#include <Library/SmmServicesTableLib.h>
+#include <Library/MmServicesTableLib.h>
#include <Library/BmcCommonInterfaceLib.h> #include <Library/MemoryAllocationLib.h> #include <Library/SsifInterfaceLib.h> @@ -54,14 +54,14 @@ IpmiSmbusSendCommand (
if (EfiSmbusHcProtocol != NULL) {
Status = EfiSmbusHcProtocol->Execute (
- EfiSmbusHcProtocol,
- SlaveAddress,
- Command,
- Operation,
- PecCheck,
- Length,
- Buffer
- );
+ EfiSmbusHcProtocol,
+ SlaveAddress,
+ Command,
+ Operation,
+ PecCheck,
+ Length,
+ Buffer
+ );
}
DEBUG ((DEBUG_INFO, "%a EfiSmbusHcProtocol->Execute Status = %r\n", __func__, Status)); @@ -95,13 +95,13 @@ IpmiGetSmbusApiPtr (
IpmiTransport2->Interface.Ssif.SsifInterfaceApiGuid = gEfiSmbusHcProtocolGuid;
HandleCount = 0;
- Status = gSmst->SmmLocateHandle (
- ByProtocol,
- &gEfiSmbusHcProtocolGuid,
- NULL,
- &HandleCount,
- HandleBuffer
- );
+ Status = gMmst->MmLocateHandle (
+ ByProtocol,
+ &gEfiSmbusHcProtocolGuid,
+ NULL,
+ &HandleCount,
+ HandleBuffer
+ );
if (EFI_ERROR (Status) && (Status == EFI_BUFFER_TOO_SMALL)) {
// Allocate memory for Handle buffer
HandleBuffer = AllocateZeroPool (HandleCount); @@ -109,13 +109,13 @@ IpmiGetSmbusApiPtr (
return EFI_NOT_FOUND;
}
- Status = gSmst->SmmLocateHandle (
- ByProtocol,
- &gEfiSmbusHcProtocolGuid,
- NULL,
- &HandleCount,
- HandleBuffer
- );
+ Status = gMmst->MmLocateHandle (
+ ByProtocol,
+ &gEfiSmbusHcProtocolGuid,
+ NULL,
+ &HandleCount,
+ HandleBuffer
+ );
if (EFI_ERROR (Status)) {
// Free HandleBuffer memory
FreePool (HandleBuffer);
@@ -124,11 +124,11 @@ IpmiGetSmbusApiPtr (
}
for (Index = 0; Index < HandleCount; Index++) {
- Status = gSmst->SmmHandleProtocol (
- HandleBuffer[Index],
- &gEfiSmbusHcProtocolGuid,
- (VOID **)&EfiSmbusHcProtocol
- );
+ Status = gMmst->MmHandleProtocol (
+ HandleBuffer[Index],
+ &gEfiSmbusHcProtocolGuid,
+ (VOID **)&EfiSmbusHcProtocol
+ );
if (EFI_ERROR (Status)) {
continue;
}
@@ -137,10 +137,10 @@ IpmiGetSmbusApiPtr (
IpmiTransport2->Interface.Ssif.SsifInterfaceApiPtr = (UINTN)EfiSmbusHcProtocol;
Status = CheckSelfTestByInterfaceType (
- IpmiTransport2,
- &BmcStatus,
- SysInterfaceSsif
- );
+ IpmiTransport2,
+ &BmcStatus,
+ SysInterfaceSsif
+ );
if (EFI_ERROR (Status) || (BmcStatus == BmcStatusHardFail)) {
IpmiTransport2->Interface.Ssif.InterfaceState = IpmiInterfaceInitError;
continue;
diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/StandaloneMm/StandaloneMmGenericIpmi.inf b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/StandaloneMm/StandaloneMmGenericIpmi.inf
index 170e0a8d136b..e4abc4db29fe 100644
--- a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/StandaloneMm/StandaloneMmGenericIpmi.inf
+++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Stan
+++ daloneMm/StandaloneMmGenericIpmi.inf
@@ -38,14 +38,24 @@
IoLib
ReportStatusCodeLib
TimerLib
+ BmcCommonInterfaceLib
+ BtInterfaceLib
+ SsifInterfaceLib
+ IpmbInterfaceLib
[Protocols]
gSmmIpmiTransportProtocolGuid # PROTOCOL ALWAYS_PRODUCED
+ gSmmIpmiTransport2ProtocolGuid # PROTOCOL ALWAYS_PRODUCED
[Guids]
[Pcd]
gIpmiFeaturePkgTokenSpaceGuid.PcdIpmiSmmIoBaseAddress
+ gIpmiFeaturePkgTokenSpaceGuid.PcdDefaultSystemInterface
+ gIpmiFeaturePkgTokenSpaceGuid.PcdBtInterfaceSupport
+ gIpmiFeaturePkgTokenSpaceGuid.PcdSsifInterfaceSupport
+ gIpmiFeaturePkgTokenSpaceGuid.PcdKcsInterfaceSupport
+ gIpmiFeaturePkgTokenSpaceGuid.PcdIpmbInterfaceSupport
[Depex]
gIpmiTransportProtocolGuid
diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Include/IpmiFeature.dsc b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Include/IpmiFeature.dsc
index cfdfc916a464..c9c76565c672 100644
--- a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Include/IpmiFeature.dsc
+++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Include/IpmiFeat
+++ ure.dsc
@@ -57,7 +57,7 @@
SsifInterfaceLib|IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/SsifInterfaceLib/DxeSsifInterfaceLib.inf
IpmbInterfaceLib|IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/IpmbInterfaceLib/DxeIpmbInterfaceLib.inf
-[LibraryClasses.common.DXE_SMM_DRIVER]
+[LibraryClasses.common.DXE_SMM_DRIVER,LibraryClasses.common.MM_STANDALO
+NE]
IpmiBaseLib|IpmiFeaturePkg/Library/SmmIpmiBaseLib/SmmIpmiBaseLib.inf
SsifInterfaceLib|IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/SsifInterfaceLib/SmmSsifInterfaceLib.inf
IpmbInterfaceLib|IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/IpmbInterfaceLib/SmmIpmbInterfaceLib.inf
diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/IpmbInterfaceLib/SmmIpmbInterfaceLib.inf b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/IpmbInterfaceLib/SmmIpmbInterfaceLib.inf
index 5030d5659dc2..32e72bef9bc1 100644
--- a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/IpmbInterfaceLib/SmmIpmbInterfaceLib.inf
+++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/BmcInter
+++ faceCommonAccess/IpmbInterfaceLib/SmmIpmbInterfaceLib.inf
@@ -14,7 +14,7 @@
FILE_GUID = C39F9DC3-37C7-41C1-BE05-8C1524493947
MODULE_TYPE = DXE_SMM_DRIVER
VERSION_STRING = 1.1
- LIBRARY_CLASS = IpmbInterfaceLib | DXE_SMM_DRIVER
+ LIBRARY_CLASS = IpmbInterfaceLib | DXE_SMM_DRIVER MM_STANDALONE
[Sources]
SmmIpmbInterfaceLib.c
@@ -27,7 +27,7 @@
[LibraryClasses]
DebugLib
BaseMemoryLib
- SmmServicesTableLib
+ MmServicesTableLib
BmcCommonInterfaceLib
[Protocols]
diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/SsifInterfaceLib/SmmSsifInterfaceLib.inf b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/SsifInterfaceLib/SmmSsifInterfaceLib.inf
index b1fb44241c37..8ff1a2cf927e 100644
--- a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/SsifInterfaceLib/SmmSsifInterfaceLib.inf
+++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Library/BmcInter
+++ faceCommonAccess/SsifInterfaceLib/SmmSsifInterfaceLib.inf
@@ -14,7 +14,7 @@
FILE_GUID = DB817B63-FA26-44FA-BF84-8D48596F982B
MODULE_TYPE = DXE_SMM_DRIVER
VERSION_STRING = 1.1
- LIBRARY_CLASS = SsifInterfaceLib | DXE_SMM_DRIVER
+ LIBRARY_CLASS = SsifInterfaceLib | DXE_SMM_DRIVER MM_STANDALONE
[Sources]
SmmSsifInterfaceLib.c
@@ -26,7 +26,7 @@
IpmiFeaturePkg/IpmiFeaturePkg.dec
[LibraryClasses]
- SmmServicesTableLib
+ MmServicesTableLib
MemoryAllocationLib
BmcCommonInterfaceLib
--
2.26.2.windows.1
-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#112329): https://edk2.groups.io/g/devel/message/112329
Mute This Topic: https://groups.io/mt/103008784/7686176
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io]
-=-=-=-=-=-=-=-=-=-=-=-
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2023-12-11 21:17 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-12-06 6:59 [edk2-devel] [PATCH v1 1/1] IpmiFeaturePkg/GenericIpmi: Sync change from SMM Huang, Li-Xia
2023-12-11 21:15 ` Nate DeSimone
2023-12-11 21:16 ` Nate DeSimone
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox