[AMD Official Use Only - General]
> -----Original Message----- > From: Chang, Abner > Sent: Saturday, April 15, 2023 4:39 PM > To: Tinh Nguyen <tinhngu...@amperemail.onmicrosoft.com>; > devel@edk2.groups.io > Cc: Liming Gao <gaolim...@byosoft.com.cn>; Isaac Oram > <isaac.w.o...@intel.com>; Nate DeSimone > <nathaniel.l.desim...@intel.com>; Attar, AbdulLateef (Abdul Lateef) > <abdullateef.at...@amd.com>; Nickle Wang <nick...@nvidia.com>; Igor > Kulchytskyy <ig...@ami.com> > Subject: RE: [edk2-devel] [PATCH v4 7/9] ManageabilityPkg: Implement Ipmi > Protocol/Ppi > > [AMD Official Use Only - General] > > > > > -----Original Message----- > > From: Tinh Nguyen <tinhngu...@amperemail.onmicrosoft.com> > > Sent: Friday, March 24, 2023 3:41 AM > > To: devel@edk2.groups.io; Chang, Abner <abner.ch...@amd.com> > > Cc: Liming Gao <gaolim...@byosoft.com.cn>; Isaac Oram > > <isaac.w.o...@intel.com>; Nate DeSimone > > <nathaniel.l.desim...@intel.com>; Attar, AbdulLateef (Abdul Lateef) > > <abdullateef.at...@amd.com>; Nickle Wang <nick...@nvidia.com>; Igor > > Kulchytskyy <ig...@ami.com> > > Subject: Re: [edk2-devel] [PATCH v4 7/9] ManageabilityPkg: Implement > Ipmi > > Protocol/Ppi > > > > Caution: This message originated from an External Source. Use proper > > caution when opening attachments, clicking links, or responding. > > > > > > Hi Abner, > > > > > > On 3/22/2023 9:48 AM, Chang, Abner via groups.io wrote: > > > From: Abner Chang <abner.ch...@amd.com> > > > > > > Add Ipmi Protocol/Ppi/SMM implementations. > > > The underlying implementation of transport interface depends on the > > > binded ManageabilityTransportLib. > > > > > > Signed-off-by: Abner Chang <abner.ch...@amd.com> > > > Cc: Liming Gao <gaolim...@byosoft.com.cn> > > > Cc: Isaac Oram <isaac.w.o...@intel.com> > > > Cc: Nate DeSimone <nathaniel.l.desim...@intel.com> > > > Cc: Abdul Lateef Attar <abdat...@amd.com> > > > Cc: Nickle Wang <nick...@nvidia.com> > > > Cc: Igor Kulchytskyy <ig...@ami.com> > > > --- > > > .../IpmiProtocol/Dxe/IpmiProtocolDxe.inf | 50 ++++ > > > .../Universal/IpmiProtocol/Pei/IpmiPpiPei.inf | 53 ++++ > > > .../IpmiProtocol/Smm/IpmiProtocolSmm.inf | 52 ++++ > > > .../IpmiProtocol/Common/IpmiProtocolCommon.h | 108 ++++++++ > > > .../IpmiProtocol/Pei/IpmiPpiInternal.h | 25 ++ > > > .../IpmiProtocol/Common/IpmiProtocolCommon.c | 252 > > ++++++++++++++++++ > > > .../Universal/IpmiProtocol/Dxe/IpmiProtocol.c | 177 ++++++++++++ > > > .../Universal/IpmiProtocol/Pei/IpmiPpi.c | 159 +++++++++++ > > > .../Universal/IpmiProtocol/Smm/IpmiProtocol.c | 147 ++++++++++ > > > 9 files changed, 1023 insertions(+) > > > create mode 100644 > > > Features/ManageabilityPkg/Universal/IpmiProtocol/Dxe/IpmiProtocolDxe.in > > f > > > create mode 100644 > > Features/ManageabilityPkg/Universal/IpmiProtocol/Pei/IpmiPpiPei.inf > > > create mode 100644 > > > Features/ManageabilityPkg/Universal/IpmiProtocol/Smm/IpmiProtocolSmm > > .inf > > > create mode 100644 > > > Features/ManageabilityPkg/Universal/IpmiProtocol/Common/IpmiProtocolC > > ommon.h > > > create mode 100644 > > Features/ManageabilityPkg/Universal/IpmiProtocol/Pei/IpmiPpiInternal.h > > > create mode 100644 > > > Features/ManageabilityPkg/Universal/IpmiProtocol/Common/IpmiProtocolC > > ommon.c > > > create mode 100644 > > Features/ManageabilityPkg/Universal/IpmiProtocol/Dxe/IpmiProtocol.c > > > create mode 100644 > > Features/ManageabilityPkg/Universal/IpmiProtocol/Pei/IpmiPpi.c > > > create mode 100644 > > > Features/ManageabilityPkg/Universal/IpmiProtocol/Smm/IpmiProtocol.c > > > > > > diff --git > > > > > > a/Features/ManageabilityPkg/Universal/IpmiProtocol/Dxe/IpmiProtocolDxe > > > .inf > > > > > > b/Features/ManageabilityPkg/Universal/IpmiProtocol/Dxe/IpmiProtocolDxe > > > .inf > > > new file mode 100644 > > > index 0000000000..ff5ec56c73 > > > --- /dev/null > > > +++ > > b/Features/ManageabilityPkg/Universal/IpmiProtocol/Dxe/IpmiProtoco > > > +++ lDxe.inf > > > @@ -0,0 +1,50 @@ > > > +## @file > > > +# IPMI Protocol DXE Driver. > > > +# > > > +# Copyright (C) 2023 Advanced Micro Devices, Inc. All rights > > > +reserved.<BR> # SPDX-License-Identifier: BSD-2-Clause-Patent ## > > > + > > > +[Defines] > > > + INF_VERSION = 0x0001001d > > > + BASE_NAME = IpmiDxe > > > + FILE_GUID = BC41B0C2-9D8A-42B5-A28F-02CE0D4A6C28 > > > + MODULE_TYPE = DXE_DRIVER > > > + VERSION_STRING = 1.0 > > > + ENTRY_POINT = DxeIpmiEntry > > > + UNLOAD_IMAGE = IpmiUnloadImage > > > + > > > +# > > > +# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 > > > +# > > > + > > > +[Sources] > > > + IpmiProtocol.c > > > + ../Common/IpmiProtocolCommon.c > > > + ../Common/IpmiProtocolCommon.h > > > + > > > +[Packages] > > > + MdePkg/MdePkg.dec > > > + MdeModulePkg/MdeModulePkg.dec > > > + ManageabilityPkg/ManageabilityPkg.dec > > > + > > > +[LibraryClasses] > > > + BaseMemoryLib > > > + DebugLib > > > + ManageabilityTransportHelperLib > > > + ManageabilityTransportLib > > > + UefiDriverEntryPoint > > > + UefiBootServicesTableLib > > > + > > > +[Protocols] > > > + gIpmiProtocolGuid # PROTOCOL ALWAYS_PRODUCED > > > + > > > +[Guids] > > > + gManageabilityProtocolIpmiGuid > > > + gManageabilityTransportKcsGuid > > > + > > > +[FixedPcd] > > > + gEfiMdePkgTokenSpaceGuid.PcdIpmiKcsBaseAddress > > > + > > > +[Depex] > > > + TRUE > > > diff --git > > > a/Features/ManageabilityPkg/Universal/IpmiProtocol/Pei/IpmiPpiPei.inf > > > b/Features/ManageabilityPkg/Universal/IpmiProtocol/Pei/IpmiPpiPei.inf > > > new file mode 100644 > > > index 0000000000..4e00693f64 > > > --- /dev/null > > > +++ > b/Features/ManageabilityPkg/Universal/IpmiProtocol/Pei/IpmiPpiPei. > > > +++ inf > > > @@ -0,0 +1,53 @@ > > > +## @file > > > +# IPMI Protocol PEI Driver. > > > +# > > > +# Copyright (C) 2023 Advanced Micro Devices, Inc. All rights > > > +reserved.<BR> # SPDX-License-Identifier: BSD-2-Clause-Patent ## > > > + > > > +[Defines] > > > + INF_VERSION = 0x0001001d > > > + BASE_NAME = IpmiPei > > > + FILE_GUID = 7832F989-CB72-4715-ADCA-35C0B031856C > > > + MODULE_TYPE = PEIM > > > + VERSION_STRING = 1.0 > > > + ENTRY_POINT = PeiIpmiEntry > > > + > > > +# > > > +# The following information is for reference only and not required by > the > > build tools. > > > +# > > > +# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 > > > +# > > > + > > > +[Sources] > > > + IpmiPpi.c > > > + IpmiPpiInternal.h > > > + ../Common/IpmiProtocolCommon.c > > > + ../Common/IpmiProtocolCommon.h > > > + > > > +[Packages] > > > + MdePkg/MdePkg.dec > > > + MdeModulePkg/MdeModulePkg.dec > > > + ManageabilityPkg/ManageabilityPkg.dec > > > + > > > +[LibraryClasses] > > > + BaseMemoryLib > > > + DebugLib > > > + MemoryAllocationLib > > > + ManageabilityTransportHelperLib > > > + ManageabilityTransportLib > > > + PeimEntryPoint > > > + ManageabilityTransportLib > > Duplicate ManageabilityTransportLib > Ok, will fix it. > > > > + > > > +[Ppis] > > > + gPeiIpmiPpiGuid # PPI ALWAYS PRODUCED > > > + > > > +[Guids] > > > + gManageabilityProtocolIpmiGuid > > > + gManageabilityTransportKcsGuid > > > + > > > +[FixedPcd] > > > + gEfiMdePkgTokenSpaceGuid.PcdIpmiKcsBaseAddress > > > + > > > +[Depex] > > > + TRUE > > > diff --git > > > > > > a/Features/ManageabilityPkg/Universal/IpmiProtocol/Smm/IpmiProtocolSm > > m > > > .inf > > > > > > b/Features/ManageabilityPkg/Universal/IpmiProtocol/Smm/IpmiProtocolSm > > m > > > .inf > > > new file mode 100644 > > > index 0000000000..cae1462f4f > > > --- /dev/null > > > +++ > > b/Features/ManageabilityPkg/Universal/IpmiProtocol/Smm/IpmiProtoco > > > +++ lSmm.inf > > > @@ -0,0 +1,52 @@ > > > +## @file > > > +# IPMI Protocol SMM Driver. > > > +# > > > +# Copyright (C) 2023 Advanced Micro Devices, Inc. All rights > > > +reserved.<BR> # SPDX-License-Identifier: BSD-2-Clause-Patent ## > > > + > > > +# > > > +# The following information is for reference only and not required by > the > > build tools. > > > +# > > > +# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 > > > +# > > > +[Defines] > > > + INF_VERSION = 0x0001001d > > > + BASE_NAME = IpmiSmm > > > + FILE_GUID = > > > CDD5D1DE-E3D3-4B1F-8689-DCC661561BB4 > > > + MODULE_TYPE = DXE_SMM_DRIVER > > > + PI_SPECIFICATION_VERSION = 0x0001000A > > > + VERSION_STRING = 1.0 > > > + ENTRY_POINT = SmmIpmiEntry > > > + > > > +[Sources] > > > + IpmiProtocol.c > > > + ../Common/IpmiProtocolCommon.c > > > + ../Common/IpmiProtocolCommon.h > > > + > > > +[Packages] > > > + MdePkg/MdePkg.dec > > > + MdeModulePkg/MdeModulePkg.dec > > > + ManageabilityPkg/ManageabilityPkg.dec > > > + > > > +[LibraryClasses] > > > + BaseMemoryLib > > > + DebugLib > > > + ManageabilityTransportHelperLib > > > + ManageabilityTransportLib > > > + SmmServicesTableLib > > > + UefiDriverEntryPoint > > > + UefiBootServicesTableLib > > > + > > > +[Protocols] > > > + gSmmIpmiProtocolGuid # PROTOCOL ALWAYS_PRODUCED > > > + > > > +[Guids] > > > + gManageabilityProtocolIpmiGuid > > > + gManageabilityTransportKcsGuid > > > + > > > +[FixedPcd] > > > + gEfiMdePkgTokenSpaceGuid.PcdIpmiKcsBaseAddress > > > + > > > +[Depex] > > > + TRUE > > > diff --git > > > > > > a/Features/ManageabilityPkg/Universal/IpmiProtocol/Common/IpmiProtoc > > ol > > > Common.h > > > > > > b/Features/ManageabilityPkg/Universal/IpmiProtocol/Common/IpmiProtoc > > ol > > > Common.h > > > new file mode 100644 > > > index 0000000000..57b92cf2be > > > --- /dev/null > > > +++ > > b/Features/ManageabilityPkg/Universal/IpmiProtocol/Common/IpmiProt > > > +++ ocolCommon.h > > > @@ -0,0 +1,108 @@ > > > +/** @file > > > + > > > + IPMI Manageability Protocol common header file. > > > + > > > + Copyright (C) 2023 Advanced Micro Devices, Inc. All rights > > > +reserved.<BR> > > > + SPDX-License-Identifier: BSD-2-Clause-Patent **/ > > > + > > > +#ifndef MANAGEABILITY_IPMI_COMMON_H_ > > > +#define MANAGEABILITY_IPMI_COMMON_H_ > > > + > > > +#include <IndustryStandard/IpmiKcs.h> #include > > > +<Library/ManageabilityTransportLib.h> > > > + > > > +/// > > > +/// IPMI KCS hardware information. > > > +/// > > > +#define IPMI_KCS_BASE_ADDRESS PcdGet16 (PcdIpmiKcsBaseAddress) > > > +#define IPMI_KCS_REG_DATA_IN IPMI_KCS_BASE_ADDRESS + > > IPMI_KCS_DATA_IN_REGISTER_OFFSET > > > +#define IPMI_KCS_REG_DATA_OUT IPMI_KCS_BASE_ADDRESS + > > IPMI_KCS_DATA_OUT_REGISTER_OFFSET > > > +#define IPMI_KCS_REG_COMMAND IPMI_KCS_BASE_ADDRESS + > > IPMI_KCS_COMMAND_REGISTER_OFFSET > > > +#define IPMI_KCS_REG_STATUS IPMI_KCS_BASE_ADDRESS + > > IPMI_KCS_STATUS_REGISTER_OFFSET > > > + > > > +/** > > > + This functions setup the IPMI transport hardware information > > > +according > > > + to the specification of transport token acquired from transport > > > library. > > > + > > > + @param[in] TransportToken The transport interface. > > > + @param[out] HardwareInformation Pointer to receive the > hardware > > information. > > > + > > > + @retval EFI_SUCCESS Hardware information is returned in > > HardwareInformation. > > > + Caller must free the memory allocated > > > for > > HardwareInformation > > > + once it doesn't need it. > > > + @retval EFI_UNSUPPORTED No hardware information for the > > specification specified > > > + in the transport token. > > > +**/ > > > +EFI_STATUS > > > +SetupIpmiTransportHardwareInformation ( > > > + IN MANAGEABILITY_TRANSPORT_TOKEN *TransportToken, > > > + OUT MANAGEABILITY_TRANSPORT_HARDWARE_INFORMATION > > > +*HardwareInformation > > > + ); > > > + > > > +/** > > > + This functions setup the final header/body/trailer packets for > > > + the acquired transport interface. > > > + > > > + @param[in] TransportToken The transport interface. > > > + @param[in] NetFunction IPMI function. > > > + @param[in] Command IPMI command. > > > + @param[out] PacketHeader The pointer to receive header of > > request. > > > + @param[in, out] PacketBody The request body. > > > + When IN, it is the caller's request > > > body. > > > + When OUT and NULL, the request body > > > is not > > > + changed. > > > + Whee out and non-NULL, the request > > > body is > > > + changed to comfort the transport > > > interface. > > > + @param[in, out] PacketBodySize The request body size. > > > + When IN and non-zero, it is the new > > > data > > > + length of request body. > > > + When IN and zero, the request body > > > is unchanged. > > > + @param[out] PacketTrailer The pointer to receive trailer of > request. > > > + > > > + @retval EFI_SUCCESS Request packet is returned. > > > + @retval EFI_UNSUPPORTED Request packet is not returned > because > > > + the unsupported transport interface. > > > +**/ > > > +EFI_STATUS > > > +SetupIpmiRequestTransportPacket ( > > > + IN MANAGEABILITY_TRANSPORT_TOKEN *TransportToken, > > > + IN UINT8 NetFunction, > > > + IN UINT8 Command, > > > + OUT MANAGEABILITY_TRANSPORT_HEADER *PacketHeader > OPTIONAL, > > > + IN OUT UINT8 **PacketBody OPTIONAL, > > > + IN OUT UINT32 *PacketBodySize OPTIONAL, > > > + OUT MANAGEABILITY_TRANSPORT_TRAILER *PacketTrailer > OPTIONAL > > > + ); > > > + > > > +/** > > > + Common code to submit IPMI commands > > > + > > > + @param[in] TransportToken TRansport token. > > > + @param[in] NetFunction Net function of the command. > > > + @param[in] Command IPMI Command. > > > + @param[in] RequestData Command Request Data. > > > + @param[in] RequestDataSize Size of Command Request Data. > > > + @param[out] ResponseData Command Response Data. The > > completion code is the first byte of response data. > > > + @param[in, out] ResponseDataSize Size of Command Response Data. > > > + > > > + @retval EFI_SUCCESS The command byte stream was successfully > > submit to the device and a response was successfully received. > > > + @retval EFI_NOT_FOUND The command was not successfully sent > > to the device or a response was not successfully received from the device. > > > + @retval EFI_NOT_READY Ipmi Device is not ready for Ipmi > command > > access. > > > + @retval EFI_DEVICE_ERROR Ipmi Device hardware error. > > > + @retval EFI_TIMEOUT The command time out. > > > + @retval EFI_UNSUPPORTED The command was not successfully > sent > > to the device. > > > + @retval EFI_OUT_OF_RESOURCES The resource allocation is out of > > resource or data size error. > > > +**/ > > > +EFI_STATUS > > > +CommonIpmiSubmitCommand ( > > > + IN MANAGEABILITY_TRANSPORT_TOKEN *TransportToken, > > > + IN UINT8 NetFunction, > > > + IN UINT8 Command, > > > + IN UINT8 *RequestData OPTIONAL, > > > + IN UINT32 RequestDataSize, > > > + OUT UINT8 *ResponseData OPTIONAL, > > > + IN OUT UINT32 *ResponseDataSize OPTIONAL > > > + ); > > > + > > > +#endif > > > diff --git > > > > a/Features/ManageabilityPkg/Universal/IpmiProtocol/Pei/IpmiPpiInternal > > > .h > > > > b/Features/ManageabilityPkg/Universal/IpmiProtocol/Pei/IpmiPpiInternal > > > .h > > > new file mode 100644 > > > index 0000000000..bbe0c8c5cb > > > --- /dev/null > > > +++ > b/Features/ManageabilityPkg/Universal/IpmiProtocol/Pei/IpmiPpiInte > > > +++ rnal.h > > > @@ -0,0 +1,25 @@ > > > +/** @file > > > + > > > + IPMI Manageability PPI internal header file. > > > + > > > + Copyright (C) 2023 Advanced Micro Devices, Inc. All rights > > > +reserved.<BR> > > > + SPDX-License-Identifier: BSD-2-Clause-Patent **/ > > > + > > > +#ifndef MANAGEABILITY_IPMI_PPI_INTERNAL_H_ > > > +#define MANAGEABILITY_IPMI_PPI_INTERNAL_H_ > > > + > > > +#include <Library/ManageabilityTransportLib.h> > > > +#include <Ppi/IpmiPpi.h> > > > + > > > +#define MANAGEABILITY_IPMI_PPI_INTERNAL_SIGNATURE > > SIGNATURE_32 ('I', > > > +'P', 'P', 'I') > > > + > > > +#define MANAGEABILITY_IPMI_PPI_INTERNAL_FROM_LINK(a) CR (a, > > > +PEI_IPMI_PPI_INTERNAL, PeiIpmiPpi, > > > +MANAGEABILITY_IPMI_PPI_INTERNAL_SIGNATURE) > > > + > > > +typedef struct { > > > + UINT32 Signature; > > > + MANAGEABILITY_TRANSPORT_TOKEN *TransportToken; > > > + PEI_IPMI_PPI PeiIpmiPpi; > > > +} PEI_IPMI_PPI_INTERNAL; > > > + > > > +#endif // MANAGEABILITY_IPMI_PPI_INTERNAL_H_ > > > diff --git > > > > > > a/Features/ManageabilityPkg/Universal/IpmiProtocol/Common/IpmiProtoc > > ol > > > Common.c > > > > > > b/Features/ManageabilityPkg/Universal/IpmiProtocol/Common/IpmiProtoc > > ol > > > Common.c > > > new file mode 100644 > > > index 0000000000..d1294d2f7c > > > --- /dev/null > > > +++ > > b/Features/ManageabilityPkg/Universal/IpmiProtocol/Common/IpmiProt > > > +++ ocolCommon.c > > > @@ -0,0 +1,252 @@ > > > +/** @file > > > + > > > + IPMI Manageability Protocol common file. > > > + > > > + Copyright (C) 2023 Advanced Micro Devices, Inc. All rights > > > + reserved.<BR> > > > + SPDX-License-Identifier: BSD-2-Clause-Patent > > > + > > > +**/ > > > +#include <Uefi.h> > > > +#include <Library/BaseMemoryLib.h> > > > +#include <Library/DebugLib.h> > > > +#include <Library/MemoryAllocationLib.h> #include > > > +<Library/ManageabilityTransportIpmiLib.h> > > > +#include <Library/ManageabilityTransportLib.h> > > > + > > > +#include "IpmiProtocolCommon.h" > > > + > > > +/** > > > + This functions setup the IPMI transport hardware information > > > +according > > > + to the specification of transport token acquired from transport > > > library. > > > + > > > + @param[in] TransportToken The transport interface. > > > + @param[out] HardwareInformation Pointer to receive the > hardware > > information. > > > + > > > + @retval EFI_SUCCESS Hardware information is returned in > > HardwareInformation. > > > + Caller must free the memory allocated > > > for > > HardwareInformation > > > + once it doesn't need it. > > > + @retval EFI_UNSUPPORTED No hardware information for the > > specification specified > > > + in the transport token. > > > + #retval EFI_OUT_OF_RESOURCES Not enough memory for > > MANAGEABILITY_TRANSPORT_KCS_HARDWARE_INFO. > > > +**/ > > > +EFI_STATUS > > > +SetupIpmiTransportHardwareInformation ( > > > + IN MANAGEABILITY_TRANSPORT_TOKEN *TransportToken, > > > + OUT MANAGEABILITY_TRANSPORT_HARDWARE_INFORMATION > > > +*HardwareInformation > > > + ) > > > +{ > > > + MANAGEABILITY_TRANSPORT_KCS_HARDWARE_INFO > > *KcsHardwareInfo; > > > + > > > + KcsHardwareInfo = AllocatePool (sizeof > > > + (MANAGEABILITY_TRANSPORT_KCS_HARDWARE_INFO)); > > > + if (KcsHardwareInfo == NULL) { > > > + DEBUG ((DEBUG_ERROR, "%a: Not enough memory for > > MANAGEABILITY_TRANSPORT_KCS_HARDWARE_INFO.\n", > > __FUNCTION__)); > > > + return EFI_OUT_OF_RESOURCES; > > > + } > > > + > > > + if (CompareGuid (&gManageabilityTransportKcsGuid, TransportToken- > > >Transport->ManageabilityTransportSpecification)) { > > > + // This is KCS transport interface. > > > + KcsHardwareInfo->MemoryMap = > > MANAGEABILITY_TRANSPORT_KCS_IO_MAP_IO; > > > + KcsHardwareInfo->IoBaseAddress.IoAddress16 = > > IPMI_KCS_BASE_ADDRESS; > > > + KcsHardwareInfo->IoDataInAddress.IoAddress16 = > > IPMI_KCS_REG_DATA_IN; > > > + KcsHardwareInfo->IoDataOutAddress.IoAddress16 = > > IPMI_KCS_REG_DATA_OUT; > > > + KcsHardwareInfo->IoCommandAddress.IoAddress16 = > > IPMI_KCS_REG_COMMAND; > > > + KcsHardwareInfo->IoStatusAddress.IoAddress16 = > > IPMI_KCS_REG_STATUS; > > > + *HardwareInformation = > > > + > > > (MANAGEABILITY_TRANSPORT_HARDWARE_INFORMATION)KcsHardwareIn > > fo; > > > + return EFI_SUCCESS; > > > + } else { > > > + DEBUG ((DEBUG_ERROR, "%a: No implementation of setting > hardware > > information.", __FUNCTION__)); > > > + ASSERT (FALSE); > > > + } > > > + > > > + return EFI_UNSUPPORTED; > > > +} > > > + > > > +/** > > > + This functions setup the final header/body/trailer packets for > > > + the acquired transport interface. > > > + > > > + @param[in] TransportToken The transport interface. > > > + @param[in] NetFunction IPMI function. > > > + @param[in] Command IPMI command. > > > + @param[out] PacketHeader The pointer to receive header of > > request. > > > + @param[in, out] PacketBody The request body. > > > + When IN, it is the caller's request > > > body. > > > + When OUT and NULL, the request body > > > is not > > > + changed. > > > + When OUT and non-NULL, the request > > > body is > > > + changed to conform the transport > > > interface. > > > + @param[in, out] PacketBodySize The request body size. > > > + When OUT and non-zero, it is the > > > new data > > > + length of request body. > > > + When OUT and zero, the request body > > > is unchanged. > > > + @param[out] PacketTrailer The pointer to receive trailer of > request. > > > + > > > + @retval EFI_SUCCESS Request packet is returned. > > > + @retval EFI_UNSUPPORTED Request packet is not returned > because > > > + the unsupported transport interface. > > > +**/ > > > +EFI_STATUS > > > +SetupIpmiRequestTransportPacket ( > > > + IN MANAGEABILITY_TRANSPORT_TOKEN *TransportToken, > > > + IN UINT8 NetFunction, > > > + IN UINT8 Command, > > > + OUT MANAGEABILITY_TRANSPORT_HEADER *PacketHeader > OPTIONAL, > > > + IN OUT UINT8 **PacketBody OPTIONAL, > > > + IN OUT UINT32 *PacketBodySize OPTIONAL, > > > + OUT MANAGEABILITY_TRANSPORT_TRAILER *PacketTrailer > OPTIONAL > > > + ) > > > +{ > > > + MANAGEABILITY_IPMI_TRANSPORT_HEADER *IpmiHeader; > > > + > > > + if (CompareGuid (&gManageabilityTransportKcsGuid, TransportToken- > > >Transport->ManageabilityTransportSpecification)) { > > > + // This is KCS transport interface. > > > + IpmiHeader = AllocateZeroPool (sizeof > > (MANAGEABILITY_IPMI_TRANSPORT_HEADER)); > > > + if (IpmiHeader == NULL) { > > > + return EFI_OUT_OF_RESOURCES; > > > + } > > > + > > > + IpmiHeader->Command = Command; > > > + IpmiHeader->Lun = 0; > > > + IpmiHeader->NetFn = NetFunction; > > > + if (PacketHeader != NULL) { > > > + *PacketHeader = (MANAGEABILITY_TRANSPORT_HEADER > > *)IpmiHeader; > > > + } > > > + if (PacketTrailer != NULL) { > > > + *PacketTrailer = NULL; > > > + } > > > + if (PacketBody != NULL) { > > > + *PacketBody = NULL; > > > + } > > > + if (PacketBodySize != NULL) { > > > + *PacketBodySize = 0; > > > + } > > > + } else { > > > + DEBUG ((DEBUG_ERROR, "%a: No implementation of building up > > packet.", __FUNCTION__)); > > > + ASSERT (FALSE); > > > + } > > > + return EFI_SUCCESS; > > > +} > > > + > > > +/** > > > + Common code to submit IPMI commands > > > + > > > + @param[in] TransportToken TRansport token. > > > + @param[in] NetFunction Net function of the command. > > > + @param[in] Command IPMI Command. > > > + @param[in] RequestData Command Request Data. > > > + @param[in] RequestDataSize Size of Command Request Data. > > > + @param[out] ResponseData Command Response Data. The > > completion code is the first byte of response data. > > > + @param[in, out] ResponseDataSize Size of Command Response Data. > > > + > > > + @retval EFI_SUCCESS The command byte stream was successfully > > submit to the device and a response was successfully received. > > > + @retval EFI_NOT_FOUND The command was not successfully sent > > to the device or a response was not successfully received from the device. > > > + @retval EFI_NOT_READY Ipmi Device is not ready for Ipmi > command > > access. > > > + @retval EFI_DEVICE_ERROR Ipmi Device hardware error. > > > + @retval EFI_TIMEOUT The command time out. > > > + @retval EFI_UNSUPPORTED The command was not successfully > sent > > to the device. > > > + @retval EFI_OUT_OF_RESOURCES The resource allocation is out of > > resource or data size error. > > > +**/ > > > +EFI_STATUS > > > +CommonIpmiSubmitCommand ( > > > + IN MANAGEABILITY_TRANSPORT_TOKEN *TransportToken, > > > + IN UINT8 NetFunction, > > > + IN UINT8 Command, > > > + IN UINT8 *RequestData OPTIONAL, > > > + IN UINT32 RequestDataSize, > > > + OUT UINT8 *ResponseData OPTIONAL, > > > + IN OUT UINT32 *ResponseDataSize OPTIONAL > > > + ) > > > +{ > > > + EFI_STATUS Status; > > > + UINT8 *ThisRequestData; > > > + UINT32 ThisRequestDataSize; > > > + MANAGEABILITY_TRANSFER_TOKEN TransferToken; > > > + MANAGEABILITY_TRANSPORT_HEADER IpmiTransportHeader; > > > + MANAGEABILITY_TRANSPORT_TRAILER IpmiTransportTrailer; > > > + MANAGEABILITY_TRANSPORT_ADDITIONAL_STATUS > > > +TransportAdditionalStatus; > > > + > > > + if (TransportToken == NULL) { > > > + DEBUG ((DEBUG_ERROR, "%a: No transport toke for IPMI\n", > > __FUNCTION__)); > > > + return EFI_UNSUPPORTED; > > > + } > > > + > > > + Status = TransportToken->Transport->Function.Version1_0- > > >TransportStatus ( > > > + > > > TransportToken, > > > + > > > &TransportAdditionalStatus > > > + ); if > > > + (EFI_ERROR (Status)) { > > > + DEBUG ((DEBUG_ERROR, "%a: Transport for IPMI has problem - > (%r)\n", > > __FUNCTION__, Status)); > > > + return Status; > > > + } > > > + > > > + ThisRequestData = RequestData; > > > + ThisRequestDataSize = RequestDataSize; > > > + IpmiTransportHeader = NULL; > > > + IpmiTransportTrailer = NULL; > > > + Status = SetupIpmiRequestTransportPacket ( > > > + TransportToken, > > > + NetFunction, > > > + Command, > > > + &IpmiTransportHeader, > > > + &ThisRequestData, > > > + &ThisRequestDataSize, > > > + &IpmiTransportTrailer > > > + ); > > > + if (EFI_ERROR (Status)) { > > > + DEBUG ((DEBUG_ERROR, "%a: Fail to build packets - (%r)\n", > > __FUNCTION__, Status)); > > > + return Status; > > > + } > > > + > > > + ZeroMem (&TransferToken, sizeof > > (MANAGEABILITY_TRANSFER_TOKEN)); > > > + TransferToken.TransmitHeader = IpmiTransportHeader; > > > + TransferToken.TransmitTrailer = IpmiTransportTrailer; > > > + > > > + // Transmit packet. > > > + if ((ThisRequestData == NULL) || (ThisRequestDataSize == 0)) { > > > + > > > + // Transmit parameter were not changed by > > SetupIpmiRequestTransportPacket(). > > > + TransferToken.TransmitPackage.TransmitPayload = RequestData; > > > + TransferToken.TransmitPackage.TransmitSizeInByte = > > > + RequestDataSize; } else { > > > + TransferToken.TransmitPackage.TransmitPayload = ThisRequestData; > > > + TransferToken.TransmitPackage.TransmitSizeInByte = > > > + ThisRequestDataSize; } > > > + > > > + TransferToken.TransmitPackage.TransmitTimeoutInMillisecond = > > > + MANAGEABILITY_TRANSPORT_NO_TIMEOUT; > > > + > > > + // Receive packet. > > > + TransferToken.ReceivePackage.ReceiveBuffer = > > > ResponseData; > > > + TransferToken.ReceivePackage.ReceiveSizeInByte = > > *ResponseDataSize; > > > + TransferToken.ReceivePackage.TransmitTimeoutInMillisecond = > > > + MANAGEABILITY_TRANSPORT_NO_TIMEOUT; > > > + TransportToken->Transport->Function.Version1_0- > > >TransportTransmitReceive ( > > > + TransportToken, > > > + &TransferToken > > > + ); > > > + > > > + if (IpmiTransportHeader != NULL) { > > > + FreePool ((VOID *)IpmiTransportHeader); } > > > + > > > + if (IpmiTransportTrailer != NULL) { > > > + FreePool ((VOID *)IpmiTransportTrailer); } > > > + > > > + if (ThisRequestData != NULL) { > > > + FreePool ((VOID *)ThisRequestData); } > > > + > > > + // Return transfer status. > > > + // > > > + Status = TransferToken.TransferStatus; > > > + TransportAdditionalStatus = > > > + TransferToken.TransportAdditionalStatus; > > > + if (EFI_ERROR (Status)) { > > > + DEBUG ((DEBUG_ERROR, "%a: Failed to send IPMI command.\n", > > __FUNCTION__)); > > > + return Status; > > > + } > > > + > > > + if (ResponseDataSize != NULL) { > > > + *ResponseDataSize = > > > +TransferToken.ReceivePackage.ReceiveSizeInByte; > > > + } > > > + return Status; > > > +} > > > diff --git > > > > a/Features/ManageabilityPkg/Universal/IpmiProtocol/Dxe/IpmiProtocol.c > > > > b/Features/ManageabilityPkg/Universal/IpmiProtocol/Dxe/IpmiProtocol.c > > > new file mode 100644 > > > index 0000000000..05175ee448 > > > --- /dev/null > > > +++ > > b/Features/ManageabilityPkg/Universal/IpmiProtocol/Dxe/IpmiProtoco > > > +++ l.c > > > @@ -0,0 +1,177 @@ > > > +/** @file > > > + This file provides IPMI Protocol implementation. > > > + > > > + Copyright (C) 2023 Advanced Micro Devices, Inc. All rights > > > +reserved.<BR> > > > + SPDX-License-Identifier: BSD-2-Clause-Patent **/ > > > + > > > +#include <PiDxe.h> > > > +#include <Library/DebugLib.h> > > > +#include <Library/BaseMemoryLib.h> > > > +#include <Library/MemoryAllocationLib.h> #include > > > +<Library/ManageabilityTransportLib.h> > > > +#include <Library/ManageabilityTransportIpmiLib.h> > > > +#include <Library/ManageabilityTransportHelperLib.h> > > > +#include <Library/UefiBootServicesTableLib.h> > > > +#include <Protocol/IpmiProtocol.h> > > > + > > > +#include "IpmiProtocolCommon.h" > > > + > > > +MANAGEABILITY_TRANSPORT_TOKEN *mTransportToken = NULL; > > > +CHAR16 *mTransportName; > > > + > > > +MANAGEABILITY_TRANSPORT_HARDWARE_INFORMATION > > mHardwareInformation; > > > + > > > +/** > > > + This service enables submitting commands via Ipmi. > > > + > > > + @param[in] This This point for IPMI_PROTOCOL > > > structure. > > > + @param[in] NetFunction Net function of the command. > > > + @param[in] Command IPMI Command. > > > + @param[in] RequestData Command Request Data. > > > + @param[in] RequestDataSize Size of Command Request Data. > > > + @param[out] ResponseData Command Response Data. The > > completion code is the first byte of response data. > > > + @param[in, out] ResponseDataSize Size of Command Response Data. > > > + > > > + @retval EFI_SUCCESS The command byte stream was successfully > > submit to the device and a response was successfully received. > > > + @retval EFI_NOT_FOUND The command was not successfully sent > > to the device or a response was not successfully received from the device. > > > + @retval EFI_NOT_READY Ipmi Device is not ready for Ipmi > command > > access. > > > + @retval EFI_DEVICE_ERROR Ipmi Device hardware error. > > > + @retval EFI_TIMEOUT The command time out. > > > + @retval EFI_UNSUPPORTED The command was not successfully > sent > > to the device. > > > + @retval EFI_OUT_OF_RESOURCES The resource allocation is out of > > resource or data size error. > > > +**/ > > > +EFI_STATUS > > > +EFIAPI > > > +DxeIpmiSubmitCommand ( > > > + IN IPMI_PROTOCOL *This, > > > + IN UINT8 NetFunction, > > > + IN UINT8 Command, > > > + IN UINT8 *RequestData, > > > + IN UINT32 RequestDataSize, > > > + OUT UINT8 *ResponseData, > > > + IN OUT UINT32 *ResponseDataSize > > > + ) > > > +{ > > > + EFI_STATUS Status; > > > + > > > + Status = CommonIpmiSubmitCommand ( > > > + mTransportToken, > > > + NetFunction, > > > + Command, > > > + RequestData, > > > + RequestDataSize, > > > + ResponseData, > > > + ResponseDataSize > > > + ); > > > + return Status; > > > +} > > > + > > > +static IPMI_PROTOCOL mIpmiProtocol = { > > > + DxeIpmiSubmitCommand > > > +}; > > > + > > > +/** > > > + The entry point of the Ipmi DXE driver. > > > + > > > + @param[in] ImageHandle - Handle of this driver image @param[in] > > > + SystemTable - Table containing standard EFI services > > > + > > > + @retval EFI_SUCCESS - IPMI Protocol is installed successfully. > > > + @retval Otherwise - Other errors. > > > +**/ > > > +EFI_STATUS > > > +EFIAPI > > > +DxeIpmiEntry ( > > > + IN EFI_HANDLE ImageHandle, > > > + IN EFI_SYSTEM_TABLE *SystemTable > > > + ) > > > +{ > > > + EFI_STATUS Status; > > > + EFI_HANDLE Handle; > > > + MANAGEABILITY_TRANSPORT_CAPABILITY TransportCapability; > > > + MANAGEABILITY_TRANSPORT_ADDITIONAL_STATUS > > > +TransportAdditionalStatus; > > > + > > > + GetTransportCapability (&TransportCapability); > > > + > > > + Status = HelperAcquireManageabilityTransport ( > > > + &gManageabilityProtocolIpmiGuid, > > > + &mTransportToken > > > + ); > > > + if (EFI_ERROR (Status)) { > > > + DEBUG ((DEBUG_ERROR, "%a: Failed to acquire transport interface for > > IPMI protocol - %r\n", __FUNCTION__, Status)); > > > + return Status; > > > + } > > > + > > > + mTransportName = HelperManageabilitySpecName > > > + (mTransportToken->Transport->ManageabilityTransportSpecification); > > > + DEBUG ((DEBUG_INFO, "%a: IPMI protocol over %s.\n", > __FUNCTION__, > > > + mTransportName)); > > > + > > > + // > > > + // Setup hardware information according to the transport interface. > > > + Status = SetupIpmiTransportHardwareInformation ( > > > + mTransportToken, > > > + &mHardwareInformation > > > + ); > > > + if (EFI_ERROR (Status)) { > > > + if (Status == EFI_UNSUPPORTED) { > > > + DEBUG ((DEBUG_ERROR, "%a: No hardware information of %s > > transport interface.\n", __FUNCTION__, mTransportName)); > > > + } > > > + > > > + return Status; > > > + } > > > + > > > + // > > > + // Initial transport interface with the hardware information assigned. > > This, I think is not a comment style defined in the EDK2 coding style. > > > + Status = HelperInitManageabilityTransport ( > > > + mTransportToken, > > > + mHardwareInformation, > > > + &TransportAdditionalStatus > > > + ); > > > + if (EFI_ERROR (Status)) { > > > + return Status; > > > + } > > > + > > > > At here, everything is ready to go. We will install the protocol and done. > > But > > what about the "Host's partner"? > > > > IPMI protocol is usually to use to communicate between Host and BMC. In > > some systems, > > > > BMC will provide a mechanism to the host to notify it that everything is > > fine > > and that it is ready to communicate (the common way is GPIO). > > > > What if we issue a request to BMC, and BMC fails to respond or returns > > dummy data? > > > > On one level, it is an enhancement feature, and it is not supported by all > > platforms. Why don't we support a library/protocol > > > > that allows platforms to choose whether or not to issue a request?. > > Because the problem could occur at any time, we should check before > > starting a request. > > > > It can be put into CommonIpmiSubmitCommand (). > > > > > > Why not include it in ManageabilityTransportLib? Because that is the IPMI > > issue, > > > > the KCS controller is fine, the I2C controller is fine, and the BMC is > > ready to > > communicate via MCTP, but IPMI is stuck > > > We currently provide MANAGEABILITY_TRANSPORT_STATUS to get the > transport interface status in the a standard way, however your suggestion > sounds to me fair for the platform implementation. > I prefer to have a generic protocol/ppi that allow platform having some > proprietary implementations, however the protocol/ppi could be apply on > the transport interfaces, not only for the specific transport interface. > How about the protocol interface as below? > > EDK2_PLATFORM_MANAGEABILITY_TRANSPORT_PROTOCOL (PPI) > > For example: > The platform function for MANAGEABILITY_TRANSPORT_STATUS: > > EFI_STATUS > PlatformManageabilityTransportGetStatus( > EFI_GUID > Transportinterface, > MANAGEABILITY_TRANSPORT_HARDWARE_INFORMATION > Hardwareinformation, > MANAGEABILITY_TRANSPORT_ADDITIONAL_STATUS > *AdditionalStatus > ) > > > I'm happy when you can assist with this. Personally, I love Protocol more > Yes, I can. > > Abner BTW, could you please create a BZ ticket for this? Thanks Abner > > > > - Tinh > > > > > + Handle = NULL; > > > + Status = gBS->InstallProtocolInterface ( > > > + &Handle, > > > + &gIpmiProtocolGuid, > > > + EFI_NATIVE_INTERFACE, > > > + (VOID **)&mIpmiProtocol > > > + ); > > > + if (EFI_ERROR (Status)) { > > > + DEBUG ((DEBUG_ERROR, "%a: Failed to install IPMI protocol - > > > + %r\n", __FUNCTION__, Status)); } > > > + > > > + return Status; > > > +} > > > + > > > +/** > > > + This is the unload handler for IPMI protocol module. > > > + > > > + Release the MANAGEABILITY_TRANSPORT_TOKEN acquired at entry > > point. > > > + > > > + @param[in] ImageHandle The drivers' driver image. > > > + > > > + @retval EFI_SUCCESS The image is unloaded. > > > + @retval Others Failed to unload the image. > > > + > > > +**/ > > > +EFI_STATUS > > > +EFIAPI > > > +IpmiUnloadImage ( > > > + IN EFI_HANDLE ImageHandle > > > + ) > > > +{ > > > + EFI_STATUS Status; > > > + > > > + Status = EFI_SUCCESS; > > > + if (mTransportToken != NULL) { > > > + Status = ReleaseTransportSession (mTransportToken); } > > > + > > > + if (mHardwareInformation.Pointer != NULL) { > > > + FreePool (mHardwareInformation.Pointer); } > > > + > > > + return Status; > > > +} > > > diff --git > > > a/Features/ManageabilityPkg/Universal/IpmiProtocol/Pei/IpmiPpi.c > > > b/Features/ManageabilityPkg/Universal/IpmiProtocol/Pei/IpmiPpi.c > > > new file mode 100644 > > > index 0000000000..f839cd7387 > > > --- /dev/null > > > +++ b/Features/ManageabilityPkg/Universal/IpmiProtocol/Pei/IpmiPpi.c > > > @@ -0,0 +1,159 @@ > > > +/** @file > > > + This file provides IPMI PPI implementation. > > > + > > > + Copyright (C) 2023 Advanced Micro Devices, Inc. All rights > > > + reserved.<BR> > > > + SPDX-License-Identifier: BSD-2-Clause-Patent > > > + > > > +**/ > > > + > > > +#include <PiPei.h> > > > +#include <Library/DebugLib.h> > > > +#include <Library/BaseMemoryLib.h> > > > +#include <Library/MemoryAllocationLib.h> #include > > > +<Library/ManageabilityTransportLib.h> > > > +#include <Library/ManageabilityTransportIpmiLib.h> > > > +#include <Library/ManageabilityTransportHelperLib.h> > > > +#include <Library/PeiServicesLib.h> > > > + > > > +#include <Ppi/IpmiPpi.h> > > > + > > > +#include "IpmiProtocolCommon.h" > > > +#include "IpmiPpiInternal.h" > > > + > > > +/** > > > + This service enables submitting commands via Ipmi. > > > + > > > + @param[in] This This point for PEI_IPMI_PPI > > > structure. > > > + @param[in] NetFunction Net function of the command. > > > + @param[in] Command IPMI Command. > > > + @param[in] RequestData Command Request Data. > > > + @param[in] RequestDataSize Size of Command Request Data. > > > + @param[out] ResponseData Command Response Data. The > > completion code is the first byte of response data. > > > + @param[in, out] ResponseDataSize Size of Command Response Data. > > > + > > > + @retval EFI_SUCCESS The command byte stream was successfully > > submit to the device and a response was successfully received. > > > + @retval EFI_NOT_FOUND The command was not successfully sent > > to the device or a response was not successfully received from the device. > > > + @retval EFI_NOT_READY Ipmi Device is not ready for Ipmi > command > > access. > > > + @retval EFI_DEVICE_ERROR Ipmi Device hardware error. > > > + @retval EFI_TIMEOUT The command time out. > > > + @retval EFI_UNSUPPORTED The command was not successfully > sent > > to the device. > > > + @retval EFI_OUT_OF_RESOURCES The resource allocation is out of > > resource or data size error. > > > +**/ > > > +EFI_STATUS > > > +EFIAPI > > > +PeiIpmiSubmitCommand ( > > > + IN PEI_IPMI_PPI *This, > > > + IN UINT8 NetFunction, > > > + IN UINT8 Command, > > > + IN UINT8 *RequestData, > > > + IN UINT32 RequestDataSize, > > > + OUT UINT8 *ResponseData, > > > + IN OUT UINT32 *ResponseDataSize > > > + ) > > > +{ > > > + EFI_STATUS Status; > > > + PEI_IPMI_PPI_INTERNAL *PeiIpmiPpiinternal; > > > + > > > + PeiIpmiPpiinternal = > > > +MANAGEABILITY_IPMI_PPI_INTERNAL_FROM_LINK(This); > > > + Status = CommonIpmiSubmitCommand ( > > > + PeiIpmiPpiinternal->TransportToken, > > > + NetFunction, > > > + Command, > > > + RequestData, > > > + RequestDataSize, > > > + ResponseData, > > > + ResponseDataSize > > > + ); > > > + return Status; > > > +} > > > + > > > +/** > > > + The entry point of the Ipmi PPI PEIM. > > > + > > > + @param FileHandle Handle of the file being invoked. > > > + @param PeiServices Describes the list of possible PEI Services. > > > + > > > + @retval EFI_SUCCESS Indicates that Ipmi initialization completed > > successfully. > > > + @retval Others Indicates that Ipmi initialization could not > > > complete > > successfully. > > > +**/ > > > +EFI_STATUS > > > +EFIAPI > > > +PeiIpmiEntry ( > > > + IN EFI_PEI_FILE_HANDLE FileHandle, > > > + IN CONST EFI_PEI_SERVICES **PeiServices > > > + ) > > > +{ > > > + EFI_STATUS Status; > > > + CHAR16 *TransportName; > > > + PEI_IPMI_PPI_INTERNAL *PeiIpmiPpiinternal; > > > + EFI_PEI_PPI_DESCRIPTOR *PpiDescriptor; > > > + MANAGEABILITY_TRANSPORT_CAPABILITY TransportCapability; > > > + MANAGEABILITY_TRANSPORT_ADDITIONAL_STATUS > > TransportAdditionalStatus; > > > + MANAGEABILITY_TRANSPORT_HARDWARE_INFORMATION > > HardwareInformation; > > > + > > > + PeiIpmiPpiinternal = (PEI_IPMI_PPI_INTERNAL *)AllocateZeroPool > > > + (sizeof(PEI_IPMI_PPI_INTERNAL)); if (PeiIpmiPpiinternal == NULL) { > > > + DEBUG ((DEBUG_ERROR, "%a: Not enough memory for > > PEI_IPMI_PPI_INTERNAL.\n", __FUNCTION__)); > > > + return EFI_OUT_OF_RESOURCES; > > > + } > > > + PpiDescriptor = (EFI_PEI_PPI_DESCRIPTOR *)AllocateZeroPool > > > + (sizeof(EFI_PEI_PPI_DESCRIPTOR)); if (PpiDescriptor == NULL) { > > > + DEBUG ((DEBUG_ERROR, "%a: Not enough memory for > > EFI_PEI_PPI_DESCRIPTOR.\n", __FUNCTION__)); > > > + return EFI_OUT_OF_RESOURCES; > > > + } > > > + > > > + PeiIpmiPpiinternal->Signature = > > > + MANAGEABILITY_IPMI_PPI_INTERNAL_SIGNATURE; > > > + PeiIpmiPpiinternal->PeiIpmiPpi.IpmiSubmitCommand = > > > + PeiIpmiSubmitCommand; > > > + > > > + PpiDescriptor->Flags = EFI_PEI_PPI_DESCRIPTOR_PPI | > > > + EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST; > > > + PpiDescriptor->Guid = &gPeiIpmiPpiGuid; > > > + PpiDescriptor->Ppi = &PeiIpmiPpiinternal->PeiIpmiPpi; > > > + > > > + GetTransportCapability (&TransportCapability); Status = > > > + HelperAcquireManageabilityTransport ( > > > + &gManageabilityProtocolIpmiGuid, > > > + &PeiIpmiPpiinternal->TransportToken > > > + ); > > > + if (EFI_ERROR (Status)) { > > > + DEBUG ((DEBUG_ERROR, "%a: Failed to acquire transport interface for > > IPMI protocol - %r\n", __FUNCTION__, Status)); > > > + return Status; > > > + } > > > + > > > + TransportName = HelperManageabilitySpecName > > > + (PeiIpmiPpiinternal->TransportToken->Transport- > >ManageabilityTranspo > > > + rtSpecification); DEBUG ((DEBUG_INFO, "%a: IPMI protocol over > > > + %s.\n", __FUNCTION__, TransportName)); > > > + > > > + // > > > + // Setup hardware information according to the transport interface. > > > + Status = SetupIpmiTransportHardwareInformation ( > > > + PeiIpmiPpiinternal->TransportToken, > > > + &HardwareInformation > > > + ); > > > + if (EFI_ERROR (Status)) { > > > + if (Status == EFI_UNSUPPORTED) { > > > + DEBUG ((DEBUG_ERROR, "%a: No hardware information of %s > > transport interface.\n", __FUNCTION__, TransportName)); > > > + } > > > + > > > + return Status; > > > + } > > > + > > > + // > > > + // Initial transport interface with the hardware information assigned. > > > + Status = HelperInitManageabilityTransport ( > > > + PeiIpmiPpiinternal->TransportToken, > > > + HardwareInformation, > > > + &TransportAdditionalStatus > > > + ); > > > + if (EFI_ERROR (Status)) { > > > + return Status; > > > + } > > > + > > > + // > > > + // Install IPMI PPI. > > > + // > > > + Status = PeiServicesInstallPpi (PpiDescriptor); if (EFI_ERROR > > > + (Status)) { > > > + DEBUG ((DEBUG_ERROR, "%a: Failed to install IPMI PPI - %r\n", > > > + __FUNCTION__, Status)); } > > > + > > > + return Status; > > > +} > > > diff --git > > > > a/Features/ManageabilityPkg/Universal/IpmiProtocol/Smm/IpmiProtocol.c > > > > > > b/Features/ManageabilityPkg/Universal/IpmiProtocol/Smm/IpmiProtocol.c > > > new file mode 100644 > > > index 0000000000..87a5436bdf > > > --- /dev/null > > > +++ > > b/Features/ManageabilityPkg/Universal/IpmiProtocol/Smm/IpmiProtoco > > > +++ l.c > > > @@ -0,0 +1,147 @@ > > > +/** @file > > > + This file provides IPMI SMM Protocol implementation. > > > + > > > + Copyright (C) 2023 Advanced Micro Devices, Inc. All rights > > > +reserved.<BR> > > > + SPDX-License-Identifier: BSD-2-Clause-Patent **/ > > > + > > > +#include <PiDxe.h> > > > +#include <Library/DebugLib.h> > > > +#include <Library/BaseMemoryLib.h> > > > +#include <Library/ManageabilityTransportLib.h> > > > +#include <Library/ManageabilityTransportIpmiLib.h> > > > +#include <Library/ManageabilityTransportHelperLib.h> > > > +#include <Library/SmmServicesTableLib.h> #include > > > +<Library/UefiBootServicesTableLib.h> > > > + > > > +#include <Protocol/IpmiProtocol.h> > > > + > > > +#include "IpmiProtocolCommon.h" > > > + > > > +MANAGEABILITY_TRANSPORT_TOKEN *mTransportToken = NULL; > > > +CHAR16 *mTransportName; > > > + > > > +MANAGEABILITY_TRANSPORT_HARDWARE_INFORMATION > > mHardwareInformation; > > > + > > > +/** > > > + This service enables submitting commands via Ipmi. > > > + > > > + @param[in] This This point for IPMI_PROTOCOL > > > structure. > > > + @param[in] NetFunction Net function of the command. > > > + @param[in] Command IPMI Command. > > > + @param[in] RequestData Command Request Data. > > > + @param[in] RequestDataSize Size of Command Request Data. > > > + @param[out] ResponseData Command Response Data. The > > completion code is the first byte of response data. > > > + @param[in, out] ResponseDataSize Size of Command Response Data. > > > + > > > + @retval EFI_SUCCESS The command byte stream was successfully > > submit to the device and a response was successfully received. > > > + @retval EFI_NOT_FOUND The command was not successfully sent > > to the device or a response was not successfully received from the device. > > > + @retval EFI_NOT_READY Ipmi Device is not ready for Ipmi > command > > access. > > > + @retval EFI_DEVICE_ERROR Ipmi Device hardware error. > > > + @retval EFI_TIMEOUT The command time out. > > > + @retval EFI_UNSUPPORTED The command was not successfully > sent > > to the device. > > > + @retval EFI_OUT_OF_RESOURCES The resource allocation is out of > > resource or data size error. > > > +**/ > > > +EFI_STATUS > > > +EFIAPI > > > +SmmIpmiSubmitCommand ( > > > + IN IPMI_PROTOCOL *This, > > > + IN UINT8 NetFunction, > > > + IN UINT8 Command, > > > + IN UINT8 *RequestData, > > > + IN UINT32 RequestDataSize, > > > + OUT UINT8 *ResponseData, > > > + IN OUT UINT32 *ResponseDataSize > > > + ) > > > +{ > > > + EFI_STATUS Status; > > > + > > > + Status = CommonIpmiSubmitCommand ( > > > + mTransportToken, > > > + NetFunction, > > > + Command, > > > + RequestData, > > > + RequestDataSize, > > > + ResponseData, > > > + ResponseDataSize > > > + ); > > > + return Status; > > > +} > > > + > > > +static IPMI_PROTOCOL mIpmiProtocol = { > > > + SmmIpmiSubmitCommand > > > +}; > > > + > > > +/** > > > + The entry point of the Ipmi DXE driver. > > > + > > > + @param[in] ImageHandle - Handle of this driver image @param[in] > > > + SystemTable - Table containing standard EFI services > > > + > > > + @retval EFI_SUCCESS - IPMI Protocol is installed successfully. > > > + @retval Otherwise - Other errors. > > > +**/ > > > +EFI_STATUS > > > +EFIAPI > > > +SmmIpmiEntry ( > > > + IN EFI_HANDLE ImageHandle, > > > + IN EFI_SYSTEM_TABLE *SystemTable > > > + ) > > > +{ > > > + EFI_STATUS Status; > > > + EFI_HANDLE Handle; > > > + MANAGEABILITY_TRANSPORT_CAPABILITY TransportCapability; > > > + MANAGEABILITY_TRANSPORT_ADDITIONAL_STATUS > > > +TransportAdditionalStatus; > > > + > > > + GetTransportCapability (&TransportCapability); > > > + > > > + Status = HelperAcquireManageabilityTransport ( > > > + &gManageabilityProtocolIpmiGuid, > > > + &mTransportToken > > > + ); > > > + if (EFI_ERROR (Status)) { > > > + DEBUG ((DEBUG_ERROR, "%a: Failed to acquire transport interface for > > IPMI protocol - %r\n", __FUNCTION__, Status)); > > > + return Status; > > > + } > > > + > > > + mTransportName = HelperManageabilitySpecName > > > + (mTransportToken->Transport->ManageabilityTransportSpecification); > > > + DEBUG ((DEBUG_INFO, "%a: IPMI protocol over %s.\n", > __FUNCTION__, > > > + mTransportName)); > > > + > > > + // > > > + // Setup hardware information according to the transport interface. > > > + Status = SetupIpmiTransportHardwareInformation ( > > > + mTransportToken, > > > + &mHardwareInformation > > > + ); > > > + if (EFI_ERROR (Status)) { > > > + if (Status == EFI_UNSUPPORTED) { > > > + DEBUG ((DEBUG_ERROR, "%a: No hardware information of %s > > transport interface.\n", __FUNCTION__, mTransportName)); > > > + } > > > + > > > + return Status; > > > + } > > > + > > > + // > > > + // Initial transport interface with the hardware information assigned. > > > + Status = HelperInitManageabilityTransport ( > > > + mTransportToken, > > > + mHardwareInformation, > > > + &TransportAdditionalStatus > > > + ); > > > + if (EFI_ERROR (Status)) { > > > + return Status; > > > + } > > > + > > > + Handle = NULL; > > > + Status = gSmst->SmmInstallProtocolInterface ( > > > + &Handle, > > > + &gSmmIpmiProtocolGuid, > > > + EFI_NATIVE_INTERFACE, > > > + (VOID **)&mIpmiProtocol > > > + ); > > > + if (EFI_ERROR (Status)) { > > > + DEBUG ((DEBUG_ERROR, "%a: Failed to install IPMI SMM protocol - > > > + %r\n", __FUNCTION__, Status)); } > > > + > > > + return Status; > > > +} -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#103037): https://edk2.groups.io/g/devel/message/103037 Mute This Topic: https://groups.io/mt/97770714/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-