public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
* [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