public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
* [edk2-devel][edk2-platforms][PATCH V3-2] IpmiFeaturePkg:Provided multiple IPMI interface support in PEI
@ 2023-06-12 12:53 Arun K
  2023-06-13  0:35 ` Isaac Oram
  0 siblings, 1 reply; 2+ messages in thread
From: Arun K @ 2023-06-12 12:53 UTC (permalink / raw)
  To: devel@edk2.groups.io, Arun K
  Cc: isaac.w.oram@intel.com, nathaniel.l.desimone@intel.com,
	Ramkumar Krishnamoorthi, Liming Gao

Created IpmiTransport2 PPI/Protocol to support multiple
IPMI BMC Interface support such as KCS/BT/SSIF with 2 API's
IpmiSubmitCommand2 & IpmiSubmitCommand2Ex.
IpmiSubmitCommand2 - This API use the default interface
(PcdDefaultSystemInterface) to send IPMI command.
IpmiSubmitCommand2Ex - This API use the specific interface type
to send IPMI command which is passed as an argument.

Cc: Isaac Oram <isaac.w.oram@intel.com>
Cc: Nate DeSimone <nathaniel.l.desimone@intel.com>
Cc: Liming Gao <gaoliming@byosoft.com.cn>

Signed-off-by: Arun K <arunk@ami.com>
---
 .../GenericIpmi/Pei/PeiGenericIpmi.c          | 295 ++++++++++++++----
 .../GenericIpmi/Pei/PeiGenericIpmi.h          |   3 +
 .../GenericIpmi/Pei/PeiGenericIpmi.inf        |  16 +
 .../GenericIpmi/Pei/PeiIpmiBmc.c              |   3 +-
 .../GenericIpmi/Pei/PeiIpmiBmc.h              |   9 +
 .../GenericIpmi/Pei/PeiIpmiBmcDef.h           |  11 +
 .../IpmiFeaturePkg/Include/IpmiFeature.dsc    |  15 +
 7 files changed, 285 insertions(+), 67 deletions(-)

diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiGenericIpmi.c b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiGenericIpmi.c
index e8b99b6900..e0378d61d4 100644
--- a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiGenericIpmi.c
+++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiGenericIpmi.c
@@ -3,6 +3,7 @@


   @copyright

   Copyright 2017 - 2021 Intel Corporation. <BR>

+  Copyright (c) 1985 - 2023, American Megatrends International LLC. <BR>

   SPDX-License-Identifier: BSD-2-Clause-Patent

 **/



@@ -10,10 +11,143 @@
 #include "PeiGenericIpmi.h"

 #include <Library/ReportStatusCodeLib.h>

 #include <Library/IpmiPlatformHookLib.h>

+#include <Library/BmcCommonInterfaceLib.h>



 ///////////////////////////////////////////////////////////////////////////////

-// Function Implementations

-//

+

+/**

+    Initialize the API and parameters for IPMI Transport2 Instance

+

+    @param[in] IpmiInstance         Pointer to IPMI Instance

+

+    @return VOID

+

+**/

+VOID

+InitIpmiTransport2 (

+  IN  PEI_IPMI_BMC_INSTANCE_DATA *IpmiInstance

+  )

+{

+  IpmiInstance->IpmiTransport2Ppi.InterfaceType           = FixedPcdGet8 (PcdDefaultSystemInterface);

+  IpmiInstance->IpmiTransport2Ppi.IpmiTransport2BmcStatus = BmcStatusOk;

+  IpmiInstance->IpmiTransport2Ppi.IpmiSubmitCommand2      = PeiIpmiSendCommand2;

+  IpmiInstance->IpmiTransport2Ppi.IpmiSubmitCommand2Ex    = PeiIpmiSendCommand2Ex;

+

+#if BtInterfaceSupport

+  if (!EFI_ERROR (PlatformIpmiIoRangeSet(FixedPcdGet16(PcdBtControlPort)))) {

+      InitBtInterfaceData (&IpmiInstance->IpmiTransport2Ppi);

+  }

+#endif

+

+#if SsifInterfaceSupport

+  InitSsifInterfaceData (&IpmiInstance->IpmiTransport2Ppi);

+#endif

+

+#if IpmbInterfaceSupport

+  InitIpmbInterfaceData (&IpmiInstance->IpmiTransport2Ppi);

+#endif

+}

+

+/**

+    Notify callback function for interfaces.

+

+    @param[in] PeiServices          Describes the list of possible PEI

+                                    Services.

+    @param[in] NotifyDescriptor     Pointer to notify descriptor.

+    @param[in] Ppi                  Pointer to Ppi.

+

+    @return EFI_STATUS              Status of Notify call back.

+    @retval EFI_NOT_FOUND           Ipmi hob is not found.

+    @retval EFI_OUT_OF_RESOURCES    Failed to allocate memory.

+    @retval EFI_SUCCESS             Interface is initialized and installed

+                                    Ipmi Ppi successfully.

+    @retval Others                  Error status while installing Ppi.

+**/

+EFI_STATUS

+EFIAPI

+NotifyCallback (

+  IN EFI_PEI_SERVICES             **PeiServices,

+  IN EFI_PEI_NOTIFY_DESCRIPTOR    *NotifyDescriptor,

+  IN VOID                         *Ppi

+  )

+{

+  EFI_STATUS                    Status;

+  PEI_IPMI_BMC_INSTANCE_DATA    *IpmiInstance;

+  PEI_IPMI_DATA_HOB             *IpmiInstancePtrHob;

+  EFI_HOB_GUID_TYPE             *GuidHob;

+  IPMI_INTERFACE_STATE          InterfaceState;

+

+  InterfaceState = IpmiInterfaceNotReady;

+

+  GuidHob    = GetFirstGuidHob (&gPeiIpmiHobGuid);

+  ASSERT (GuidHob != NULL);

+  if (GuidHob == NULL) {

+      return EFI_NOT_FOUND;

+  }

+

+  IpmiInstancePtrHob = (PEI_IPMI_DATA_HOB *) GET_GUID_HOB_DATA(GuidHob);

+  IpmiInstance       = (PEI_IPMI_BMC_INSTANCE_DATA*) IpmiInstancePtrHob->IpmiInstance;

+

+#if SsifInterfaceSupport

+  InitSsifInterfaceData(&IpmiInstance->IpmiTransport2Ppi);

+

+  if (IpmiInstance->IpmiTransport2Ppi.Interface.Ssif.InterfaceState == IpmiInterfaceInitialized){

+      InterfaceState = IpmiInterfaceInitialized;

+  }

+#endif

+

+#if IpmbInterfaceSupport

+  InitIpmbInterfaceData(&IpmiInstance->IpmiTransport2Ppi);

+

+  if (IpmiInstance->IpmiTransport2Ppi.Interface.Ipmb.InterfaceState == IpmiInterfaceInitialized){

+      InterfaceState = IpmiInterfaceInitialized;

+  }

+#endif

+  // Default Interface data should be initialized to install Ipmi Transport2 Protocol.

+  if (InterfaceState != IpmiInterfaceInitialized) {

+      return EFI_UNSUPPORTED;

+  }

+

+  Status = PeiServicesInstallPpi (&IpmiInstance->PeiIpmi2BmcDataDesc);

+  return Status;

+}

+

+/**

+    Registers callback for Ppi.

+

+    @param[in] PeiServices  Describes the list of possible PEI Services.

+    @param[in] PpiGuid      Pointer to Ppi guid to register call back.

+

+    @retval EFI_INVALID_PARAMETER   Invalid parameter.

+    @retval EFI_OUT_OF_RESOURCES    Failed to allocate memory.

+    @retval Others                  Status of NotifyPpi().

+**/

+EFI_STATUS

+RegisterPpiCallback (

+  IN CONST EFI_PEI_SERVICES     **PeiServices,

+  IN       EFI_GUID             *PpiGuid

+  )

+{

+  EFI_STATUS                  Status;

+  EFI_PEI_NOTIFY_DESCRIPTOR   *PpiNotifyDesc;

+

+  if ((PpiGuid == NULL) ||

+      ((PpiGuid != NULL) && IsZeroBuffer(PpiGuid, sizeof (EFI_GUID)))) {

+      return EFI_INVALID_PARAMETER;

+  }

+

+  PpiNotifyDesc = (EFI_PEI_NOTIFY_DESCRIPTOR*) AllocateZeroPool (sizeof (EFI_PEI_NOTIFY_DESCRIPTOR));

+  if (PpiNotifyDesc == NULL) {

+      return EFI_OUT_OF_RESOURCES;

+  }

+

+  PpiNotifyDesc->Flags  = EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST;

+  PpiNotifyDesc->Guid   = PpiGuid;

+  PpiNotifyDesc->Notify = NotifyCallback;

+

+  Status = (*PeiServices)->NotifyPpi (PeiServices, PpiNotifyDesc);

+  return Status;

+}



 /*****************************************************************************

  @brief

@@ -31,8 +165,12 @@ PeiInitializeIpmiKcsPhysicalLayer (
 {

   EFI_STATUS                       Status;

   PEI_IPMI_BMC_INSTANCE_DATA       *mIpmiInstance;

+  PEI_IPMI_DATA_HOB                *IpmiInstancePtrHob;

+  IPMI_INTERFACE_STATE             InterfaceState;

+  UINT8                            Index;



-  mIpmiInstance = NULL;

+  mIpmiInstance  = NULL;

+  InterfaceState = IpmiInterfaceNotReady;



   //

   // Send Pre-Boot signal to BMC

@@ -60,6 +198,18 @@ PeiInitializeIpmiKcsPhysicalLayer (
     return EFI_OUT_OF_RESOURCES;

   }



+

+  // Create Guided hob to pass IPMI Instance data pointer to notify functions.

+  IpmiInstancePtrHob = BuildGuidHob (&gPeiIpmiHobGuid, sizeof(PEI_IPMI_DATA_HOB));

+  if (IpmiInstancePtrHob == NULL) {

+      DEBUG ((DEBUG_ERROR, "Failed to create Hob guid for IPMI Instance!!!\n"));

+      FreePool (mIpmiInstance);

+      return EFI_OUT_OF_RESOURCES;

+  }

+

+  IpmiInstancePtrHob->IpmiInstance         = (UINTN)mIpmiInstance;

+  IpmiInstancePtrHob->PreMemIpmiDataHobPtr = IpmiInstancePtrHob;

+

   //

   // Calibrate TSC Counter.  Stall for 10ms, then multiply the resulting number of

   // ticks in that period by 100 to get the number of ticks in a 1 second timeout

@@ -83,6 +233,7 @@ PeiInitializeIpmiKcsPhysicalLayer (
   mIpmiInstance->PeiIpmiBmcDataDesc.Guid          = &gPeiIpmiTransportPpiGuid;

   mIpmiInstance->PeiIpmiBmcDataDesc.Ppi           = &mIpmiInstance->IpmiTransportPpi;



+#if KcsInterfaceSupport

   //

   // Get the Device ID and check if the system is in Force Update mode.

   //

@@ -94,19 +245,85 @@ PeiInitializeIpmiKcsPhysicalLayer (
   //

   // Do not continue initialization if the BMC is in Force Update Mode.

   //

-  if (mIpmiInstance->BmcStatus == BMC_UPDATE_IN_PROGRESS || mIpmiInstance->BmcStatus == BMC_HARDFAIL) {

-    return EFI_UNSUPPORTED;

+  if (mIpmiInstance->BmcStatus != BMC_UPDATE_IN_PROGRESS && mIpmiInstance->BmcStatus != BMC_HARDFAIL) {

+      Status = PeiServicesInstallPpi (&mIpmiInstance->PeiIpmiBmcDataDesc);

+      if (EFI_ERROR (Status)) {

+        return Status;

+      }

+  }

+#endif

+

+  InitIpmiTransport2(mIpmiInstance);

+

+  // Check interface data initialized successfully else register notify protocol.

+  for (Index = SysInterfaceKcs; Index < SysInterfaceMax; Index++) {

+

+      switch (Index) {

+

+#if KcsInterfaceSupport

+          case SysInterfaceKcs:

+              if ((mIpmiInstance->BmcStatus != BMC_HARDFAIL) && (mIpmiInstance->BmcStatus != BMC_UPDATE_IN_PROGRESS)) {

+                  BMC_INTERFACE_STATUS   BmcStatus;

+                  mIpmiInstance->IpmiTransport2Ppi.Interface.KcsInterfaceState = IpmiInterfaceInitialized;

+                  Status = CheckSelfTestByInterfaceType(

+                                          &mIpmiInstance->IpmiTransport2Ppi,

+                                          &BmcStatus,

+                                          SysInterfaceKcs);

+                  if (!EFI_ERROR (Status) && (BmcStatus != BmcStatusHardFail)) {

+                      InterfaceState = IpmiInterfaceInitialized;

+                  } else {

+                      mIpmiInstance->IpmiTransport2Ppi.Interface.KcsInterfaceState = IpmiInterfaceInitError;

+                  }

+              }

+              break;

+#endif

+

+#if BtInterfaceSupport

+          case SysInterfaceBt:

+              if (mIpmiInstance->IpmiTransport2Ppi.Interface.Bt.InterfaceState == IpmiInterfaceInitialized){

+                  InterfaceState = IpmiInterfaceInitialized;

+              }

+              break;

+#endif

+

+#if SsifInterfaceSupport

+          case SysInterfaceSsif:

+              if (mIpmiInstance->IpmiTransport2Ppi.Interface.Ssif.InterfaceState == IpmiInterfaceInitialized){

+                  InterfaceState = IpmiInterfaceInitialized;

+              } else if (mIpmiInstance->IpmiTransport2Ppi.Interface.Ssif.InterfaceState == IpmiInterfaceInitError) {

+                  // Register protocol notify for SMBUS Protocol.

+                  Status = RegisterPpiCallback (PeiServices, &mIpmiInstance->IpmiTransport2Ppi.Interface.Ssif.SsifInterfaceApiGuid);

+              }

+              break;

+#endif

+

+#if IpmbInterfaceSupport

+          case SysInterfaceIpmb:

+              if (mIpmiInstance->IpmiTransport2Ppi.Interface.Ipmb.InterfaceState == IpmiInterfaceInitialized){

+                  InterfaceState = IpmiInterfaceInitialized;

+              } else if (mIpmiInstance->IpmiTransport2Ppi.Interface.Ipmb.InterfaceState == IpmiInterfaceInitError) {

+                  // Register protocol notify for SMBUS Protocol.

+                  Status = RegisterPpiCallback (PeiServices, &mIpmiInstance->IpmiTransport2Ppi.Interface.Ipmb.IpmbInterfaceApiGuid);

+              }

+              break;

+#endif

+          default:

+              break;

+      }

   }



-  //

-  // Just produce PPI

-  //

-  Status = PeiServicesInstallPpi (&mIpmiInstance->PeiIpmiBmcDataDesc);

-  if (EFI_ERROR (Status)) {

-    return Status;

+  // Any one of the Interface data should be initialized to install Ipmi Transport2 Protocol.

+  if (InterfaceState != IpmiInterfaceInitialized) {

+      DEBUG ((DEBUG_INFO, "Interface not ready yet. \n"));

+      return EFI_SUCCESS;

   }



-  return EFI_SUCCESS;

+  mIpmiInstance->PeiIpmi2BmcDataDesc.Flags  = EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST;

+  mIpmiInstance->PeiIpmi2BmcDataDesc.Guid   = &gPeiIpmiTransport2PpiGuid;

+  mIpmiInstance->PeiIpmi2BmcDataDesc.Ppi    = &mIpmiInstance->IpmiTransport2Ppi;

+

+  Status = PeiServicesInstallPpi (&mIpmiInstance->PeiIpmi2BmcDataDesc);

+  return Status;

 }



 /*****************************************************************************

@@ -176,60 +393,6 @@ PeimIpmiInterfaceInit (
 } // PeimIpmiInterfaceInit()





-EFI_STATUS

-PeiIpmiSendCommand (

-  IN      PEI_IPMI_TRANSPORT_PPI       *This,

-  IN      UINT8                        NetFunction,

-  IN      UINT8                        Lun,

-  IN      UINT8                        Command,

-  IN      UINT8                        *CommandData,

-  IN      UINT32                       CommandDataSize,

-  IN OUT  UINT8                        *ResponseData,

-  IN OUT  UINT32                       *ResponseDataSize

-  )

-/*++

-

-Routine Description:

-

-  Send Ipmi Command in the right mode: HECI or KCS,  to the

-  appropiate device, ME or BMC.

-

-Arguments:

-

-  This              - Pointer to IPMI protocol instance

-  NetFunction       - Net Function of command to send

-  Lun               - LUN of command to send

-  Command           - IPMI command to send

-  CommandData       - Pointer to command data buffer, if needed

-  CommandDataSize   - Size of command data buffer

-  ResponseData      - Pointer to response data buffer

-  ResponseDataSize  - Pointer to response data buffer size

-

-Returns:

-

-  EFI_INVALID_PARAMETER - One of the input values is bad

-  EFI_DEVICE_ERROR      - IPMI command failed

-  EFI_BUFFER_TOO_SMALL  - Response buffer is too small

-  EFI_UNSUPPORTED       - Command is not supported by BMC

-  EFI_SUCCESS           - Command completed successfully

-

---*/

-{

-  //

-  // This Will be unchanged ( BMC/KCS style )

-  //

-  return PeiIpmiSendCommandToBmc (

-           This,

-           NetFunction,

-           Lun,

-           Command,

-           CommandData,

-           (UINT8) CommandDataSize,

-           ResponseData,

-           (UINT8 *) ResponseDataSize,

-           NULL

-           );

-} // IpmiSendCommand()



 EFI_STATUS

 PeiGetIpmiBmcStatus (

diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiGenericIpmi.h b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiGenericIpmi.h
index d31af85325..59b26b6c86 100644
--- a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiGenericIpmi.h
+++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiGenericIpmi.h
@@ -3,6 +3,7 @@


   @copyright

   Copyright 2017 - 2021 Intel Corporation. <BR>

+  Copyright (c) 1985 - 2023, American Megatrends International LLC. <BR>

   SPDX-License-Identifier: BSD-2-Clause-Patent

 **/



@@ -23,7 +24,9 @@
 #include <Library/PeiServicesTablePointerLib.h>

 #include <Library/TimerLib.h>

 #include <Library/PciLib.h>

+#include <Library/HobLib.h>



+#include "PeiIpmiHooks.h"

 #include "PeiIpmiBmcDef.h"

 #include "PeiIpmiBmc.h"



diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiGenericIpmi.inf b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiGenericIpmi.inf
index a646161ce1..555b2e5e6c 100644
--- a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiGenericIpmi.inf
+++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiGenericIpmi.inf
@@ -3,6 +3,7 @@
 #

 # @copyright

 # Copyright 2017 - 2021 Intel Corporation. <BR>

+# Copyright (c) 1985 - 2023, American Megatrends International LLC. <BR>

 # SPDX-License-Identifier: BSD-2-Clause-Patent

 ##



@@ -30,6 +31,8 @@
   PeiIpmiBmcDef.h

   PeiGenericIpmi.c

   PeiGenericIpmi.h

+  PeiIpmiHooks.c

+  PeiIpmiHooks.h



 [Packages]

   MdePkg/MdePkg.dec

@@ -44,17 +47,30 @@
   ReportStatusCodeLib

   TimerLib

   IpmiPlatformHookLib

+  HobLib

+  BmcCommonInterfaceLib

+  BtInterfaceLib

+  SsifInterfaceLib

+  IpmbInterfaceLib



 [Guids]

+  gPeiIpmiHobGuid



 [Ppis]

   gPeiIpmiTransportPpiGuid       #ALWAYS PRODUCE

+  gPeiIpmiTransport2PpiGuid



 [Pcd]

   gIpmiFeaturePkgTokenSpaceGuid.PcdIpmiIoBaseAddress

   gIpmiFeaturePkgTokenSpaceGuid.PcdIpmiBmcReadyDelayTimer

   gIpmiFeaturePkgTokenSpaceGuid.PcdSioMailboxBaseAddress

   gIpmiFeaturePkgTokenSpaceGuid.PcdSignalPreBootToBmc

+  gIpmiFeaturePkgTokenSpaceGuid.PcdDefaultSystemInterface

+  gIpmiFeaturePkgTokenSpaceGuid.PcdBtInterfaceSupport

+  gIpmiFeaturePkgTokenSpaceGuid.PcdSsifInterfaceSupport

+  gIpmiFeaturePkgTokenSpaceGuid.PcdKcsInterfaceSupport

+  gIpmiFeaturePkgTokenSpaceGuid.PcdIpmbInterfaceSupport

+  gIpmiFeaturePkgTokenSpaceGuid.PcdBtControlPort



 [Depex]

   TRUE

diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiIpmiBmc.c b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiIpmiBmc.c
index dbe25421ae..38ec98c959 100644
--- a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiIpmiBmc.c
+++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiIpmiBmc.c
@@ -3,6 +3,7 @@


   @copyright

   Copyright 2016 - 2021 Intel Corporation. <BR>

+  Copyright (c) 1985 - 2023, American Megatrends International LLC. <BR>

   SPDX-License-Identifier: BSD-2-Clause-Patent

 **/



@@ -235,7 +236,7 @@ Returns:




 EFI_STATUS

-PeiIpmiBmcStatus (

+IpmiBmcStatus (

   IN  PEI_IPMI_TRANSPORT_PPI          *This,

   OUT BMC_STATUS                  *BmcStatus,

   OUT SM_COM_ADDRESS              *ComAddress,

diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiIpmiBmc.h b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiIpmiBmc.h
index 40b9429e84..51ba65966a 100644
--- a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiIpmiBmc.h
+++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiIpmiBmc.h
@@ -3,6 +3,7 @@


   @copyright

   Copyright 2016 - 2021 Intel Corporation. <BR>

+  Copyright (c) 1985 - 2023, American Megatrends International LLC. <BR>

   SPDX-License-Identifier: BSD-2-Clause-Patent

 **/



@@ -35,4 +36,12 @@
   SM_IPMI_BMC_SIGNATURE \

   )



+#define INSTANCE_FROM_PEI_IPMI_TRANSPORT2_THIS(a) \

+  CR ( \

+  a, \

+  PEI_IPMI_BMC_INSTANCE_DATA, \

+  IpmiTransport2Ppi, \

+  SM_IPMI_BMC_SIGNATURE \

+  )

+

 #endif // _PEI_IPMI_BMC_H_

diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiIpmiBmcDef.h b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiIpmiBmcDef.h
index fc9fbacf1a..24ef17eadb 100644
--- a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiIpmiBmcDef.h
+++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiIpmiBmcDef.h
@@ -3,6 +3,7 @@


   @copyright

   Copyright 2016 - 2021 Intel Corporation. <BR>

+  Copyright (c) 1985 - 2023, American Megatrends International LLC. <BR>

   SPDX-License-Identifier: BSD-2-Clause-Patent

 **/



@@ -10,6 +11,8 @@
 #define _PEI_IPMI_COMMON_BMC_H_



 #include <Ppi/IpmiTransportPpi.h>

+#include <Ppi/IpmiTransport2Ppi.h>

+#include "ServerManagement.h"



 #define MAX_TEMP_DATA     160

 #define BMC_SLAVE_ADDRESS 0x20

@@ -54,7 +57,9 @@ typedef struct {
   UINT8                  SoftErrorCount;

   UINT16                 IpmiIoBase;

   PEI_IPMI_TRANSPORT_PPI IpmiTransportPpi;

+  IPMI_TRANSPORT2           IpmiTransport2Ppi;

   EFI_PEI_PPI_DESCRIPTOR PeiIpmiBmcDataDesc;

+  EFI_PEI_PPI_DESCRIPTOR    PeiIpmi2BmcDataDesc;

 } PEI_IPMI_BMC_INSTANCE_DATA;



 //

@@ -151,5 +156,11 @@ Returns:
 --*/

 ;



+typedef struct _PEI_IPMI_DATA_HOB PEI_IPMI_DATA_HOB;

+

+struct _PEI_IPMI_DATA_HOB {

+    UINTN                     IpmiInstance;            /// IpmiInstance pointer.

+    PEI_IPMI_DATA_HOB         *PreMemIpmiDataHobPtr;   ///< HOB Data pointer before Memory discovered

+};



 #endif //_PEI_IPMI_COMMON_BMC_H_

diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Include/IpmiFeature.dsc b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Include/IpmiFeature.dsc
index 237a4fc006..0401974b82 100644
--- a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Include/IpmiFeature.dsc
+++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Include/IpmiFeature.dsc
@@ -7,6 +7,7 @@
 # for the build infrastructure.

 #

 # Copyright (c) 2019 - 2021, Intel Corporation. All rights reserved.<BR>

+# Copyright (c) 1985 - 2023, American Megatrends International LLC. <BR>

 #

 # SPDX-License-Identifier: BSD-2-Clause-Patent

 #

@@ -41,10 +42,24 @@


 [LibraryClasses.common.PEI_CORE,LibraryClasses.common.PEIM]

   IpmiBaseLib|IpmiFeaturePkg/Library/PeiIpmiBaseLib/PeiIpmiBaseLib.inf

+  SsifInterfaceLib|IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/SsifInterfaceLib/PeiSsifInterfaceLib.inf

+  IpmbInterfaceLib|IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/IpmbInterfaceLib/PeiIpmbInterfaceLib.inf



 [LibraryClasses.common.DXE_DRIVER,LibraryClasses.common.UEFI_DRIVER]

   IpmiBaseLib|IpmiFeaturePkg/Library/IpmiBaseLib/IpmiBaseLib.inf



+[LibraryClasses.common]

+  BmcCommonInterfaceLib|IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/BmcCommonInterfaceLib.inf

+  BtInterfaceLib|IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/BtInterfaceLib/BtInterfaceLib.inf

+

+[LibraryClasses.common.DXE_RUNTIME_DRIVER, LibraryClasses.common.DXE_DRIVER]

+  SsifInterfaceLib|IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/SsifInterfaceLib/DxeSsifInterfaceLib.inf

+  IpmbInterfaceLib|IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/IpmbInterfaceLib/DxeIpmbInterfaceLib.inf

+

+[LibraryClasses.common.DXE_SMM_DRIVER]

+  SsifInterfaceLib|IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/SsifInterfaceLib/SmmSsifInterfaceLib.inf

+  IpmbInterfaceLib|IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/IpmbInterfaceLib/SmmIpmbInterfaceLib.inf

+

 ################################################################################

 #

 # Component section - list of all components that need built for this feature.

--
2.38.1.windows.1
-The information contained in this message may be confidential and proprietary to American Megatrends (AMI). This communication is intended to be read only by the individual or entity to whom it is addressed or by their designee. If the reader of this message is not the intended recipient, you are on notice that any distribution of this message, in any form, is strictly prohibited. Please promptly notify the sender by reply e-mail or by telephone at 770-246-8600, and then delete or destroy all copies of the transmission.

^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [edk2-devel][edk2-platforms][PATCH V3-2] IpmiFeaturePkg:Provided multiple IPMI interface support in PEI
  2023-06-12 12:53 [edk2-devel][edk2-platforms][PATCH V3-2] IpmiFeaturePkg:Provided multiple IPMI interface support in PEI Arun K
@ 2023-06-13  0:35 ` Isaac Oram
  0 siblings, 0 replies; 2+ messages in thread
From: Isaac Oram @ 2023-06-13  0:35 UTC (permalink / raw)
  To: Arun K, devel@edk2.groups.io
  Cc: Desimone, Nathaniel L, Ramkumar Krishnamoorthi, Gao, Liming

Similar issues with four space indents, lack of spaces before { and (, #if logic.

Regards,
Isaac

-----Original Message-----
From: Arun K <arunk@ami.com> 
Sent: Monday, June 12, 2023 5:53 AM
To: devel@edk2.groups.io; Arun K <arunk@ami.com>
Cc: Oram, Isaac W <isaac.w.oram@intel.com>; Desimone, Nathaniel L <nathaniel.l.desimone@intel.com>; Ramkumar Krishnamoorthi <ramkumark@ami.com>; Gao, Liming <gaoliming@byosoft.com.cn>
Subject: [edk2-devel][edk2-platforms][PATCH V3-2] IpmiFeaturePkg:Provided multiple IPMI interface support in PEI

Created IpmiTransport2 PPI/Protocol to support multiple IPMI BMC Interface support such as KCS/BT/SSIF with 2 API's
IpmiSubmitCommand2 & IpmiSubmitCommand2Ex.
IpmiSubmitCommand2 - This API use the default interface
(PcdDefaultSystemInterface) to send IPMI command.
IpmiSubmitCommand2Ex - This API use the specific interface type to send IPMI command which is passed as an argument.

Cc: Isaac Oram <isaac.w.oram@intel.com>
Cc: Nate DeSimone <nathaniel.l.desimone@intel.com>
Cc: Liming Gao <gaoliming@byosoft.com.cn>

Signed-off-by: Arun K <arunk@ami.com>
---
 .../GenericIpmi/Pei/PeiGenericIpmi.c          | 295 ++++++++++++++----
 .../GenericIpmi/Pei/PeiGenericIpmi.h          |   3 +
 .../GenericIpmi/Pei/PeiGenericIpmi.inf        |  16 +
 .../GenericIpmi/Pei/PeiIpmiBmc.c              |   3 +-
 .../GenericIpmi/Pei/PeiIpmiBmc.h              |   9 +
 .../GenericIpmi/Pei/PeiIpmiBmcDef.h           |  11 +
 .../IpmiFeaturePkg/Include/IpmiFeature.dsc    |  15 +
 7 files changed, 285 insertions(+), 67 deletions(-)

diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiGenericIpmi.c b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiGenericIpmi.c
index e8b99b6900..e0378d61d4 100644
--- a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiGenericIpmi.c
+++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/
+++ PeiGenericIpmi.c
@@ -3,6 +3,7 @@


   @copyright

   Copyright 2017 - 2021 Intel Corporation. <BR>

+  Copyright (c) 1985 - 2023, American Megatrends International LLC. 
+ <BR>

   SPDX-License-Identifier: BSD-2-Clause-Patent

 **/



@@ -10,10 +11,143 @@
 #include "PeiGenericIpmi.h"

 #include <Library/ReportStatusCodeLib.h>

 #include <Library/IpmiPlatformHookLib.h>

+#include <Library/BmcCommonInterfaceLib.h>



 ///////////////////////////////////////////////////////////////////////////////

-// Function Implementations

-//

+

+/**

+    Initialize the API and parameters for IPMI Transport2 Instance

+

+    @param[in] IpmiInstance         Pointer to IPMI Instance

+

+    @return VOID

+

+**/

+VOID

+InitIpmiTransport2 (

+  IN  PEI_IPMI_BMC_INSTANCE_DATA *IpmiInstance

+  )

+{

+  IpmiInstance->IpmiTransport2Ppi.InterfaceType           = FixedPcdGet8 (PcdDefaultSystemInterface);

+  IpmiInstance->IpmiTransport2Ppi.IpmiTransport2BmcStatus = 
+ BmcStatusOk;

+  IpmiInstance->IpmiTransport2Ppi.IpmiSubmitCommand2      = PeiIpmiSendCommand2;

+  IpmiInstance->IpmiTransport2Ppi.IpmiSubmitCommand2Ex    = PeiIpmiSendCommand2Ex;

+

+#if BtInterfaceSupport

+  if (!EFI_ERROR 
+ (PlatformIpmiIoRangeSet(FixedPcdGet16(PcdBtControlPort)))) {

+      InitBtInterfaceData (&IpmiInstance->IpmiTransport2Ppi);

+  }

+#endif

+

+#if SsifInterfaceSupport

+  InitSsifInterfaceData (&IpmiInstance->IpmiTransport2Ppi);

+#endif

+

+#if IpmbInterfaceSupport

+  InitIpmbInterfaceData (&IpmiInstance->IpmiTransport2Ppi);

+#endif

+}

+

+/**

+    Notify callback function for interfaces.

+

+    @param[in] PeiServices          Describes the list of possible PEI

+                                    Services.

+    @param[in] NotifyDescriptor     Pointer to notify descriptor.

+    @param[in] Ppi                  Pointer to Ppi.

+

+    @return EFI_STATUS              Status of Notify call back.

+    @retval EFI_NOT_FOUND           Ipmi hob is not found.

+    @retval EFI_OUT_OF_RESOURCES    Failed to allocate memory.

+    @retval EFI_SUCCESS             Interface is initialized and installed

+                                    Ipmi Ppi successfully.

+    @retval Others                  Error status while installing Ppi.

+**/

+EFI_STATUS

+EFIAPI

+NotifyCallback (

+  IN EFI_PEI_SERVICES             **PeiServices,

+  IN EFI_PEI_NOTIFY_DESCRIPTOR    *NotifyDescriptor,

+  IN VOID                         *Ppi

+  )

+{

+  EFI_STATUS                    Status;

+  PEI_IPMI_BMC_INSTANCE_DATA    *IpmiInstance;

+  PEI_IPMI_DATA_HOB             *IpmiInstancePtrHob;

+  EFI_HOB_GUID_TYPE             *GuidHob;

+  IPMI_INTERFACE_STATE          InterfaceState;

+

+  InterfaceState = IpmiInterfaceNotReady;

+

+  GuidHob    = GetFirstGuidHob (&gPeiIpmiHobGuid);

+  ASSERT (GuidHob != NULL);

+  if (GuidHob == NULL) {

+      return EFI_NOT_FOUND;

+  }

+

+  IpmiInstancePtrHob = (PEI_IPMI_DATA_HOB *) 
+ GET_GUID_HOB_DATA(GuidHob);

+  IpmiInstance       = (PEI_IPMI_BMC_INSTANCE_DATA*) IpmiInstancePtrHob->IpmiInstance;

+

+#if SsifInterfaceSupport

+  InitSsifInterfaceData(&IpmiInstance->IpmiTransport2Ppi);

+

+  if (IpmiInstance->IpmiTransport2Ppi.Interface.Ssif.InterfaceState == 
+ IpmiInterfaceInitialized){

+      InterfaceState = IpmiInterfaceInitialized;

+  }

+#endif

+

+#if IpmbInterfaceSupport

+  InitIpmbInterfaceData(&IpmiInstance->IpmiTransport2Ppi);

+

+  if (IpmiInstance->IpmiTransport2Ppi.Interface.Ipmb.InterfaceState == 
+ IpmiInterfaceInitialized){

+      InterfaceState = IpmiInterfaceInitialized;

+  }

+#endif

+  // Default Interface data should be initialized to install Ipmi Transport2 Protocol.

+  if (InterfaceState != IpmiInterfaceInitialized) {

+      return EFI_UNSUPPORTED;

+  }

+

+  Status = PeiServicesInstallPpi (&IpmiInstance->PeiIpmi2BmcDataDesc);

+  return Status;

+}

+

+/**

+    Registers callback for Ppi.

+

+    @param[in] PeiServices  Describes the list of possible PEI Services.

+    @param[in] PpiGuid      Pointer to Ppi guid to register call back.

+

+    @retval EFI_INVALID_PARAMETER   Invalid parameter.

+    @retval EFI_OUT_OF_RESOURCES    Failed to allocate memory.

+    @retval Others                  Status of NotifyPpi().

+**/

+EFI_STATUS

+RegisterPpiCallback (

+  IN CONST EFI_PEI_SERVICES     **PeiServices,

+  IN       EFI_GUID             *PpiGuid

+  )

+{

+  EFI_STATUS                  Status;

+  EFI_PEI_NOTIFY_DESCRIPTOR   *PpiNotifyDesc;

+

+  if ((PpiGuid == NULL) ||

+      ((PpiGuid != NULL) && IsZeroBuffer(PpiGuid, sizeof (EFI_GUID)))) 
+ {

+      return EFI_INVALID_PARAMETER;

+  }

+

+  PpiNotifyDesc = (EFI_PEI_NOTIFY_DESCRIPTOR*) AllocateZeroPool (sizeof 
+ (EFI_PEI_NOTIFY_DESCRIPTOR));

+  if (PpiNotifyDesc == NULL) {

+      return EFI_OUT_OF_RESOURCES;

+  }

+

+  PpiNotifyDesc->Flags  = EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK | 
+ EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST;

+  PpiNotifyDesc->Guid   = PpiGuid;

+  PpiNotifyDesc->Notify = NotifyCallback;

+

+  Status = (*PeiServices)->NotifyPpi (PeiServices, PpiNotifyDesc);

+  return Status;

+}



 /*****************************************************************************

  @brief

@@ -31,8 +165,12 @@ PeiInitializeIpmiKcsPhysicalLayer (  {

   EFI_STATUS                       Status;

   PEI_IPMI_BMC_INSTANCE_DATA       *mIpmiInstance;

+  PEI_IPMI_DATA_HOB                *IpmiInstancePtrHob;

+  IPMI_INTERFACE_STATE             InterfaceState;

+  UINT8                            Index;



-  mIpmiInstance = NULL;

+  mIpmiInstance  = NULL;

+  InterfaceState = IpmiInterfaceNotReady;



   //

   // Send Pre-Boot signal to BMC

@@ -60,6 +198,18 @@ PeiInitializeIpmiKcsPhysicalLayer (
     return EFI_OUT_OF_RESOURCES;

   }



+

+  // Create Guided hob to pass IPMI Instance data pointer to notify functions.

+  IpmiInstancePtrHob = BuildGuidHob (&gPeiIpmiHobGuid, 
+ sizeof(PEI_IPMI_DATA_HOB));

+  if (IpmiInstancePtrHob == NULL) {

+      DEBUG ((DEBUG_ERROR, "Failed to create Hob guid for IPMI 
+ Instance!!!\n"));

+      FreePool (mIpmiInstance);

+      return EFI_OUT_OF_RESOURCES;

+  }

+

+  IpmiInstancePtrHob->IpmiInstance         = (UINTN)mIpmiInstance;

+  IpmiInstancePtrHob->PreMemIpmiDataHobPtr = IpmiInstancePtrHob;

+

   //

   // Calibrate TSC Counter.  Stall for 10ms, then multiply the resulting number of

   // ticks in that period by 100 to get the number of ticks in a 1 second timeout

@@ -83,6 +233,7 @@ PeiInitializeIpmiKcsPhysicalLayer (
   mIpmiInstance->PeiIpmiBmcDataDesc.Guid          = &gPeiIpmiTransportPpiGuid;

   mIpmiInstance->PeiIpmiBmcDataDesc.Ppi           = &mIpmiInstance->IpmiTransportPpi;



+#if KcsInterfaceSupport

   //

   // Get the Device ID and check if the system is in Force Update mode.

   //

@@ -94,19 +245,85 @@ PeiInitializeIpmiKcsPhysicalLayer (
   //

   // Do not continue initialization if the BMC is in Force Update Mode.

   //

-  if (mIpmiInstance->BmcStatus == BMC_UPDATE_IN_PROGRESS || mIpmiInstance->BmcStatus == BMC_HARDFAIL) {

-    return EFI_UNSUPPORTED;

+  if (mIpmiInstance->BmcStatus != BMC_UPDATE_IN_PROGRESS && 
+ mIpmiInstance->BmcStatus != BMC_HARDFAIL) {

+      Status = PeiServicesInstallPpi 
+ (&mIpmiInstance->PeiIpmiBmcDataDesc);

+      if (EFI_ERROR (Status)) {

+        return Status;

+      }

+  }

+#endif

+

+  InitIpmiTransport2(mIpmiInstance);

+

+  // Check interface data initialized successfully else register notify protocol.

+  for (Index = SysInterfaceKcs; Index < SysInterfaceMax; Index++) {

+

+      switch (Index) {

+

+#if KcsInterfaceSupport

+          case SysInterfaceKcs:

+              if ((mIpmiInstance->BmcStatus != BMC_HARDFAIL) && 
+ (mIpmiInstance->BmcStatus != BMC_UPDATE_IN_PROGRESS)) {

+                  BMC_INTERFACE_STATUS   BmcStatus;

+                  
+ mIpmiInstance->IpmiTransport2Ppi.Interface.KcsInterfaceState = 
+ IpmiInterfaceInitialized;

+                  Status = CheckSelfTestByInterfaceType(

+                                          
+ &mIpmiInstance->IpmiTransport2Ppi,

+                                          &BmcStatus,

+                                          SysInterfaceKcs);

+                  if (!EFI_ERROR (Status) && (BmcStatus != 
+ BmcStatusHardFail)) {

+                      InterfaceState = IpmiInterfaceInitialized;

+                  } else {

+                      
+ mIpmiInstance->IpmiTransport2Ppi.Interface.KcsInterfaceState = 
+ IpmiInterfaceInitError;

+                  }

+              }

+              break;

+#endif

+

+#if BtInterfaceSupport

+          case SysInterfaceBt:

+              if 
+ (mIpmiInstance->IpmiTransport2Ppi.Interface.Bt.InterfaceState == 
+ IpmiInterfaceInitialized){

+                  InterfaceState = IpmiInterfaceInitialized;

+              }

+              break;

+#endif

+

+#if SsifInterfaceSupport

+          case SysInterfaceSsif:

+              if 
+ (mIpmiInstance->IpmiTransport2Ppi.Interface.Ssif.InterfaceState == 
+ IpmiInterfaceInitialized){

+                  InterfaceState = IpmiInterfaceInitialized;

+              } else if 
+ (mIpmiInstance->IpmiTransport2Ppi.Interface.Ssif.InterfaceState == 
+ IpmiInterfaceInitError) {

+                  // Register protocol notify for SMBUS Protocol.

+                  Status = RegisterPpiCallback (PeiServices, 
+ &mIpmiInstance->IpmiTransport2Ppi.Interface.Ssif.SsifInterfaceApiGuid)
+ ;

+              }

+              break;

+#endif

+

+#if IpmbInterfaceSupport

+          case SysInterfaceIpmb:

+              if 
+ (mIpmiInstance->IpmiTransport2Ppi.Interface.Ipmb.InterfaceState == 
+ IpmiInterfaceInitialized){

+                  InterfaceState = IpmiInterfaceInitialized;

+              } else if 
+ (mIpmiInstance->IpmiTransport2Ppi.Interface.Ipmb.InterfaceState == 
+ IpmiInterfaceInitError) {

+                  // Register protocol notify for SMBUS Protocol.

+                  Status = RegisterPpiCallback (PeiServices, 
+ &mIpmiInstance->IpmiTransport2Ppi.Interface.Ipmb.IpmbInterfaceApiGuid)
+ ;

+              }

+              break;

+#endif

+          default:

+              break;

+      }

   }



-  //

-  // Just produce PPI

-  //

-  Status = PeiServicesInstallPpi (&mIpmiInstance->PeiIpmiBmcDataDesc);

-  if (EFI_ERROR (Status)) {

-    return Status;

+  // Any one of the Interface data should be initialized to install Ipmi Transport2 Protocol.

+  if (InterfaceState != IpmiInterfaceInitialized) {

+      DEBUG ((DEBUG_INFO, "Interface not ready yet. \n"));

+      return EFI_SUCCESS;

   }



-  return EFI_SUCCESS;

+  mIpmiInstance->PeiIpmi2BmcDataDesc.Flags  = 
+ EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST;

+  mIpmiInstance->PeiIpmi2BmcDataDesc.Guid   = &gPeiIpmiTransport2PpiGuid;

+  mIpmiInstance->PeiIpmi2BmcDataDesc.Ppi    = &mIpmiInstance->IpmiTransport2Ppi;

+

+  Status = PeiServicesInstallPpi (&mIpmiInstance->PeiIpmi2BmcDataDesc);

+  return Status;

 }



 /*****************************************************************************

@@ -176,60 +393,6 @@ PeimIpmiInterfaceInit (  } // PeimIpmiInterfaceInit()





-EFI_STATUS

-PeiIpmiSendCommand (

-  IN      PEI_IPMI_TRANSPORT_PPI       *This,

-  IN      UINT8                        NetFunction,

-  IN      UINT8                        Lun,

-  IN      UINT8                        Command,

-  IN      UINT8                        *CommandData,

-  IN      UINT32                       CommandDataSize,

-  IN OUT  UINT8                        *ResponseData,

-  IN OUT  UINT32                       *ResponseDataSize

-  )

-/*++

-

-Routine Description:

-

-  Send Ipmi Command in the right mode: HECI or KCS,  to the

-  appropiate device, ME or BMC.

-

-Arguments:

-

-  This              - Pointer to IPMI protocol instance

-  NetFunction       - Net Function of command to send

-  Lun               - LUN of command to send

-  Command           - IPMI command to send

-  CommandData       - Pointer to command data buffer, if needed

-  CommandDataSize   - Size of command data buffer

-  ResponseData      - Pointer to response data buffer

-  ResponseDataSize  - Pointer to response data buffer size

-

-Returns:

-

-  EFI_INVALID_PARAMETER - One of the input values is bad

-  EFI_DEVICE_ERROR      - IPMI command failed

-  EFI_BUFFER_TOO_SMALL  - Response buffer is too small

-  EFI_UNSUPPORTED       - Command is not supported by BMC

-  EFI_SUCCESS           - Command completed successfully

-

---*/

-{

-  //

-  // This Will be unchanged ( BMC/KCS style )

-  //

-  return PeiIpmiSendCommandToBmc (

-           This,

-           NetFunction,

-           Lun,

-           Command,

-           CommandData,

-           (UINT8) CommandDataSize,

-           ResponseData,

-           (UINT8 *) ResponseDataSize,

-           NULL

-           );

-} // IpmiSendCommand()



 EFI_STATUS

 PeiGetIpmiBmcStatus (

diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiGenericIpmi.h b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiGenericIpmi.h
index d31af85325..59b26b6c86 100644
--- a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiGenericIpmi.h
+++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/
+++ PeiGenericIpmi.h
@@ -3,6 +3,7 @@


   @copyright

   Copyright 2017 - 2021 Intel Corporation. <BR>

+  Copyright (c) 1985 - 2023, American Megatrends International LLC. 
+ <BR>

   SPDX-License-Identifier: BSD-2-Clause-Patent

 **/



@@ -23,7 +24,9 @@
 #include <Library/PeiServicesTablePointerLib.h>

 #include <Library/TimerLib.h>

 #include <Library/PciLib.h>

+#include <Library/HobLib.h>



+#include "PeiIpmiHooks.h"

 #include "PeiIpmiBmcDef.h"

 #include "PeiIpmiBmc.h"



diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiGenericIpmi.inf b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiGenericIpmi.inf
index a646161ce1..555b2e5e6c 100644
--- a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiGenericIpmi.inf
+++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/
+++ PeiGenericIpmi.inf
@@ -3,6 +3,7 @@
 #

 # @copyright

 # Copyright 2017 - 2021 Intel Corporation. <BR>

+# Copyright (c) 1985 - 2023, American Megatrends International LLC. 
+<BR>

 # SPDX-License-Identifier: BSD-2-Clause-Patent

 ##



@@ -30,6 +31,8 @@
   PeiIpmiBmcDef.h

   PeiGenericIpmi.c

   PeiGenericIpmi.h

+  PeiIpmiHooks.c

+  PeiIpmiHooks.h



 [Packages]

   MdePkg/MdePkg.dec

@@ -44,17 +47,30 @@
   ReportStatusCodeLib

   TimerLib

   IpmiPlatformHookLib

+  HobLib

+  BmcCommonInterfaceLib

+  BtInterfaceLib

+  SsifInterfaceLib

+  IpmbInterfaceLib



 [Guids]

+  gPeiIpmiHobGuid



 [Ppis]

   gPeiIpmiTransportPpiGuid       #ALWAYS PRODUCE

+  gPeiIpmiTransport2PpiGuid



 [Pcd]

   gIpmiFeaturePkgTokenSpaceGuid.PcdIpmiIoBaseAddress

   gIpmiFeaturePkgTokenSpaceGuid.PcdIpmiBmcReadyDelayTimer

   gIpmiFeaturePkgTokenSpaceGuid.PcdSioMailboxBaseAddress

   gIpmiFeaturePkgTokenSpaceGuid.PcdSignalPreBootToBmc

+  gIpmiFeaturePkgTokenSpaceGuid.PcdDefaultSystemInterface

+  gIpmiFeaturePkgTokenSpaceGuid.PcdBtInterfaceSupport

+  gIpmiFeaturePkgTokenSpaceGuid.PcdSsifInterfaceSupport

+  gIpmiFeaturePkgTokenSpaceGuid.PcdKcsInterfaceSupport

+  gIpmiFeaturePkgTokenSpaceGuid.PcdIpmbInterfaceSupport

+  gIpmiFeaturePkgTokenSpaceGuid.PcdBtControlPort



 [Depex]

   TRUE

diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiIpmiBmc.c b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiIpmiBmc.c
index dbe25421ae..38ec98c959 100644
--- a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiIpmiBmc.c
+++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/
+++ PeiIpmiBmc.c
@@ -3,6 +3,7 @@


   @copyright

   Copyright 2016 - 2021 Intel Corporation. <BR>

+  Copyright (c) 1985 - 2023, American Megatrends International LLC. 
+ <BR>

   SPDX-License-Identifier: BSD-2-Clause-Patent

 **/



@@ -235,7 +236,7 @@ Returns:




 EFI_STATUS

-PeiIpmiBmcStatus (

+IpmiBmcStatus (

   IN  PEI_IPMI_TRANSPORT_PPI          *This,

   OUT BMC_STATUS                  *BmcStatus,

   OUT SM_COM_ADDRESS              *ComAddress,

diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiIpmiBmc.h b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiIpmiBmc.h
index 40b9429e84..51ba65966a 100644
--- a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiIpmiBmc.h
+++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/
+++ PeiIpmiBmc.h
@@ -3,6 +3,7 @@


   @copyright

   Copyright 2016 - 2021 Intel Corporation. <BR>

+  Copyright (c) 1985 - 2023, American Megatrends International LLC. 
+ <BR>

   SPDX-License-Identifier: BSD-2-Clause-Patent

 **/



@@ -35,4 +36,12 @@
   SM_IPMI_BMC_SIGNATURE \

   )



+#define INSTANCE_FROM_PEI_IPMI_TRANSPORT2_THIS(a) \

+  CR ( \

+  a, \

+  PEI_IPMI_BMC_INSTANCE_DATA, \

+  IpmiTransport2Ppi, \

+  SM_IPMI_BMC_SIGNATURE \

+  )

+

 #endif // _PEI_IPMI_BMC_H_

diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiIpmiBmcDef.h b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiIpmiBmcDef.h
index fc9fbacf1a..24ef17eadb 100644
--- a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/PeiIpmiBmcDef.h
+++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/GenericIpmi/Pei/
+++ PeiIpmiBmcDef.h
@@ -3,6 +3,7 @@


   @copyright

   Copyright 2016 - 2021 Intel Corporation. <BR>

+  Copyright (c) 1985 - 2023, American Megatrends International LLC. 
+ <BR>

   SPDX-License-Identifier: BSD-2-Clause-Patent

 **/



@@ -10,6 +11,8 @@
 #define _PEI_IPMI_COMMON_BMC_H_



 #include <Ppi/IpmiTransportPpi.h>

+#include <Ppi/IpmiTransport2Ppi.h>

+#include "ServerManagement.h"



 #define MAX_TEMP_DATA     160

 #define BMC_SLAVE_ADDRESS 0x20

@@ -54,7 +57,9 @@ typedef struct {
   UINT8                  SoftErrorCount;

   UINT16                 IpmiIoBase;

   PEI_IPMI_TRANSPORT_PPI IpmiTransportPpi;

+  IPMI_TRANSPORT2           IpmiTransport2Ppi;

   EFI_PEI_PPI_DESCRIPTOR PeiIpmiBmcDataDesc;

+  EFI_PEI_PPI_DESCRIPTOR    PeiIpmi2BmcDataDesc;

 } PEI_IPMI_BMC_INSTANCE_DATA;



 //

@@ -151,5 +156,11 @@ Returns:
 --*/

 ;



+typedef struct _PEI_IPMI_DATA_HOB PEI_IPMI_DATA_HOB;

+

+struct _PEI_IPMI_DATA_HOB {

+    UINTN                     IpmiInstance;            /// IpmiInstance pointer.

+    PEI_IPMI_DATA_HOB         *PreMemIpmiDataHobPtr;   ///< HOB Data pointer before Memory discovered

+};



 #endif //_PEI_IPMI_COMMON_BMC_H_

diff --git a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Include/IpmiFeature.dsc b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Include/IpmiFeature.dsc
index 237a4fc006..0401974b82 100644
--- a/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Include/IpmiFeature.dsc
+++ b/Features/Intel/OutOfBandManagement/IpmiFeaturePkg/Include/IpmiFeat
+++ ure.dsc
@@ -7,6 +7,7 @@
 # for the build infrastructure.

 #

 # Copyright (c) 2019 - 2021, Intel Corporation. All rights reserved.<BR>

+# Copyright (c) 1985 - 2023, American Megatrends International LLC. 
+<BR>

 #

 # SPDX-License-Identifier: BSD-2-Clause-Patent

 #

@@ -41,10 +42,24 @@


 [LibraryClasses.common.PEI_CORE,LibraryClasses.common.PEIM]

   IpmiBaseLib|IpmiFeaturePkg/Library/PeiIpmiBaseLib/PeiIpmiBaseLib.inf

+  
+ SsifInterfaceLib|IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/SsifI
+ nterfaceLib/PeiSsifInterfaceLib.inf

+  
+ IpmbInterfaceLib|IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/IpmbI
+ nterfaceLib/PeiIpmbInterfaceLib.inf



 [LibraryClasses.common.DXE_DRIVER,LibraryClasses.common.UEFI_DRIVER]

   IpmiBaseLib|IpmiFeaturePkg/Library/IpmiBaseLib/IpmiBaseLib.inf



+[LibraryClasses.common]

+  
+ BmcCommonInterfaceLib|IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/
+ BmcCommonInterfaceLib.inf

+  
+ BtInterfaceLib|IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/BtInter
+ faceLib/BtInterfaceLib.inf

+

+[LibraryClasses.common.DXE_RUNTIME_DRIVER, 
+LibraryClasses.common.DXE_DRIVER]

+  
+ SsifInterfaceLib|IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/SsifI
+ nterfaceLib/DxeSsifInterfaceLib.inf

+  
+ IpmbInterfaceLib|IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/IpmbI
+ nterfaceLib/DxeIpmbInterfaceLib.inf

+

+[LibraryClasses.common.DXE_SMM_DRIVER]

+  
+ SsifInterfaceLib|IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/SsifI
+ nterfaceLib/SmmSsifInterfaceLib.inf

+  
+ IpmbInterfaceLib|IpmiFeaturePkg/Library/BmcInterfaceCommonAccess/IpmbI
+ nterfaceLib/SmmIpmbInterfaceLib.inf

+

 ################################################################################

 #

 # Component section - list of all components that need built for this feature.

--
2.38.1.windows.1
-The information contained in this message may be confidential and proprietary to American Megatrends (AMI). This communication is intended to be read only by the individual or entity to whom it is addressed or by their designee. If the reader of this message is not the intended recipient, you are on notice that any distribution of this message, in any form, is strictly prohibited. Please promptly notify the sender by reply e-mail or by telephone at 770-246-8600, and then delete or destroy all copies of the transmission.

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2023-06-13  0:35 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-06-12 12:53 [edk2-devel][edk2-platforms][PATCH V3-2] IpmiFeaturePkg:Provided multiple IPMI interface support in PEI Arun K
2023-06-13  0:35 ` Isaac Oram

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox