From: Abner Chang <abner.ch...@amd.com> Add MCTP manageability transport interface library.
The functionality is verified by checking the binary debug output of payload. Signed-off-by: Abner Chang <abner.ch...@amd.com> Cc: Isaac Oram <isaac.w.o...@intel.com> Cc: Abdul Lateef Attar <abdat...@amd.com> Cc: Nickle Wang <nick...@nvidia.com> Cc: Igor Kulchytskyy <ig...@ami.com> --- .../ManageabilityPkg/ManageabilityPkg.dsc | 1 + .../Dxe/DxeManageabilityTransportMctp.inf | 44 +++ .../Dxe/ManageabilityTransportMctp.h | 26 ++ .../Dxe/ManageabilityTransportMctp.c | 367 ++++++++++++++++++ .../Dxe/ManageabilityTransportMctp.uni | 13 + 5 files changed, 451 insertions(+) create mode 100644 Features/ManageabilityPkg/Library/ManageabilityTransportMctpLib/Dxe/DxeManageabilityTransportMctp.inf create mode 100644 Features/ManageabilityPkg/Library/ManageabilityTransportMctpLib/Dxe/ManageabilityTransportMctp.h create mode 100644 Features/ManageabilityPkg/Library/ManageabilityTransportMctpLib/Dxe/ManageabilityTransportMctp.c create mode 100644 Features/ManageabilityPkg/Library/ManageabilityTransportMctpLib/Dxe/ManageabilityTransportMctp.uni diff --git a/Features/ManageabilityPkg/ManageabilityPkg.dsc b/Features/ManageabilityPkg/ManageabilityPkg.dsc index 412029ef6c..959b3eabd2 100644 --- a/Features/ManageabilityPkg/ManageabilityPkg.dsc +++ b/Features/ManageabilityPkg/ManageabilityPkg.dsc @@ -37,6 +37,7 @@ [Components] ManageabilityPkg/Library/ManageabilityTransportKcsLib/Dxe/DxeManageabilityTransportKcs.inf + ManageabilityPkg/Library/ManageabilityTransportMctpLib/Dxe/DxeManageabilityTransportMctp.inf ManageabilityPkg/Library/PldmProtocolLibrary/Dxe/PldmProtocolLib.inf [LibraryClasses] diff --git a/Features/ManageabilityPkg/Library/ManageabilityTransportMctpLib/Dxe/DxeManageabilityTransportMctp.inf b/Features/ManageabilityPkg/Library/ManageabilityTransportMctpLib/Dxe/DxeManageabilityTransportMctp.inf new file mode 100644 index 0000000000..22ea37c516 --- /dev/null +++ b/Features/ManageabilityPkg/Library/ManageabilityTransportMctpLib/Dxe/DxeManageabilityTransportMctp.inf @@ -0,0 +1,44 @@ +## @file +# MCTP instance of Manageability Transport Library +# +# Copyright (C) 2023 Advanced Micro Devices, Inc. All rights reserved.<BR> +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x0001001B + BASE_NAME = DxeManageabilityTransportMctp + MODULE_UNI_FILE = ManageabilityTransportMctp.uni + FILE_GUID = 7770FA0F-4808-47BD-89F4-717185332486 + MODULE_TYPE = DXE_DRIVER + VERSION_STRING = 1.0 + LIBRARY_CLASS = ManageabilityTransportLib + +# +# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 +# + +[Sources] + ManageabilityTransportMctp.c + ManageabilityTransportMctp.h + +[Packages] + ManageabilityPkg/ManageabilityPkg.dec + MdePkg/MdePkg.dec + +[LibraryClasses] + DebugLib + MemoryAllocationLib + UefiBootServicesTableLib + +[Protocols] + gEdkiiMctpProtocolGuid + +[Guids] + gManageabilityProtocolPldmGuid + gManageabilityTransportMctpGuid + +[Depex] + gEdkiiMctpProtocolGuid ## ALWAYS_CONSUMES + diff --git a/Features/ManageabilityPkg/Library/ManageabilityTransportMctpLib/Dxe/ManageabilityTransportMctp.h b/Features/ManageabilityPkg/Library/ManageabilityTransportMctpLib/Dxe/ManageabilityTransportMctp.h new file mode 100644 index 0000000000..1ce0d3a8bc --- /dev/null +++ b/Features/ManageabilityPkg/Library/ManageabilityTransportMctpLib/Dxe/ManageabilityTransportMctp.h @@ -0,0 +1,26 @@ +/** @file + + Manageability transport MCTP internal used definitions. + + Copyright (C) 2023 Advanced Micro Devices, Inc. All rights reserved.<BR> + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#ifndef MANAGEABILITY_TRANSPORT_MCTP_LIB_INTERNAL_H_ +#define MANAGEABILITY_TRANSPORT_MCTP_LIB_INTERNAL_H_ + +#include <Library/ManageabilityTransportLib.h> + +#define MANAGEABILITY_TRANSPORT_MCTP_SIGNATURE SIGNATURE_32 ('M', 'T', 'M', 'C') + +/// +/// Manageability transport KCS internal data structure. +/// +typedef struct { + UINTN Signature; + MANAGEABILITY_TRANSPORT_TOKEN Token; +} MANAGEABILITY_TRANSPORT_MCTP; + +#define MANAGEABILITY_TRANSPORT_MCTP_FROM_LINK(a) CR (a, MANAGEABILITY_TRANSPORT_MCTP, Token, MANAGEABILITY_TRANSPORT_MCTP_SIGNATURE) + +#endif // MANAGEABILITY_TRANSPORT_MCTP_LIB_INTERNAL_H_ diff --git a/Features/ManageabilityPkg/Library/ManageabilityTransportMctpLib/Dxe/ManageabilityTransportMctp.c b/Features/ManageabilityPkg/Library/ManageabilityTransportMctpLib/Dxe/ManageabilityTransportMctp.c new file mode 100644 index 0000000000..5b186e53f3 --- /dev/null +++ b/Features/ManageabilityPkg/Library/ManageabilityTransportMctpLib/Dxe/ManageabilityTransportMctp.c @@ -0,0 +1,367 @@ +/** @file + + MCTP instance of Manageability Transport Library + + Copyright (C) 2023 Advanced Micro Devices, Inc. All rights reserved.<BR> + SPDX-License-Identifier: BSD-2-Clause-Patent + +*/ + +#include <Uefi.h> +#include <Library/IoLib.h> +#include <Library/DebugLib.h> +#include <Library/MemoryAllocationLib.h> +#include <Library/ManageabilityTransportLib.h> +#include <Library/ManageabilityTransportMctpLib.h> +#include <Library/ManageabilityTransportHelperLib.h> +#include <Library/UefiBootServicesTableLib.h> +#include <Protocol/MctpProtocol.h> + +#include "ManageabilityTransportMctp.h" + +MANAGEABILITY_TRANSPORT_MCTP *mSingleSessionToken = NULL; +EDKII_MCTP_PROTOCOL *mMctpProtocol = NULL; + +EFI_GUID *SupportedManageabilityProtocol[] = { + &gManageabilityProtocolPldmGuid +}; + +UINT8 NumberOfSupportedProtocol = (sizeof (SupportedManageabilityProtocol)/sizeof (EFI_GUID *)); + +/** + This function initializes the transport interface. + + @param [in] TransportToken The transport token acquired through + AcquireTransportSession function. + @param [in] HardwareInfo The hardware information + assigned to MCTP transport interface. + + @retval EFI_SUCCESS Transport interface is initialized + successfully. + @retval EFI_INVALID_PARAMETER The invalid transport token. + @retval EFI_NOT_READY The transport interface works fine but + @retval is not ready. + @retval EFI_DEVICE_ERROR The transport interface has problems. + @retval EFI_ALREADY_STARTED Teh protocol interface has already initialized. + @retval Otherwise Other errors. + +**/ +EFI_STATUS +EFIAPI +MctpTransportInit ( + IN MANAGEABILITY_TRANSPORT_TOKEN *TransportToken, + IN MANAGEABILITY_TRANSPORT_HARDWARE_INFORMATION HardwareInfo OPTIONAL + ) +{ + return EFI_SUCCESS; +} + +/** + This function returns the transport interface status. + The generic EFI_STATUS is returned to caller directly, The additional + information of transport interface could be optionally returned in + TransportAdditionalStatus to describes the status that can't be + described obviously through EFI_STATUS. + See the definition of MANAGEABILITY_TRANSPORT_STATUS. + + @param [in] TransportToken The transport token acquired through + AcquireTransportSession function. + @param [out] TransportAdditionalStatus The additional status of transport + interface. + NULL means no additional status of this + transport interface. + + @retval EFI_SUCCESS Transport interface status is returned. + @retval EFI_INVALID_PARAMETER The invalid transport token. + @retval EFI_DEVICE_ERROR The transport interface has problems to return + @retval EFI_UNSUPPORTED The transport interface doesn't have status report. + Otherwise Other errors. + +**/ +EFI_STATUS +EFIAPI +MctpTransportStatus ( + IN MANAGEABILITY_TRANSPORT_TOKEN *TransportToken, + OUT MANAGEABILITY_TRANSPORT_ADDITIONAL_STATUS *TransportAdditionalStatus OPTIONAL + ) +{ + if (TransportToken == NULL) { + DEBUG ((DEBUG_ERROR, "%a: Invalid transport token.\n", __FUNCTION__)); + return EFI_INVALID_PARAMETER; + } + + if (TransportAdditionalStatus != NULL) { + *TransportAdditionalStatus = MANAGEABILITY_TRANSPORT_ADDITIONAL_STATUS_NO_ERRORS; + } + + return EFI_SUCCESS; +} + +/** + This function resets the transport interface. + The generic EFI_STATUS is returned to caller directly after reseting transport + interface. The additional information of transport interface could be optionally + returned in TransportAdditionalStatus to describes the status that can't be + described obviously through EFI_STATUS. + See the definition of MANAGEABILITY_TRANSPORT_ADDITIONAL_STATUS. + + @param [in] TransportToken The transport token acquired through + AcquireTransportSession function. + @param [out] TransportAdditionalStatus The additional status of specific transport + interface after the reset. + NULL means no additional status of this + transport interface. + + @retval EFI_SUCCESS Transport interface status is returned. + @retval EFI_INVALID_PARAMETER The invalid transport token. + @retval EFI_TIMEOUT The reset process is time out. + @retval EFI_DEVICE_ERROR The transport interface has problems to return + status. + Otherwise Other errors. + +**/ +EFI_STATUS +EFIAPI +MctpTransportReset ( + IN MANAGEABILITY_TRANSPORT_TOKEN *TransportToken, + OUT MANAGEABILITY_TRANSPORT_ADDITIONAL_STATUS *TransportAdditionalStatus OPTIONAL + ) +{ + if (TransportAdditionalStatus != NULL) { + *TransportAdditionalStatus = MANAGEABILITY_TRANSPORT_ADDITIONAL_STATUS_NOT_AVAILABLE; + } + + return EFI_UNSUPPORTED; +} + +/** + This function transmit the request over target transport interface. + The generic EFI_STATUS is returned to caller directly after reseting transport + interface. The additional information of transport interface could be optionally + returned in TransportAdditionalStatus to describes the status that can't be + described obviously through EFI_STATUS. + See the definition of MANAGEABILITY_TRANSPORT_ADDITIONAL_STATUS. + + @param [in] TransportToken The transport token acquired through + AcquireTransportSession function. + @param [in] TransferToken The transfer token, see the definition of + MANAGEABILITY_TRANSFER_TOKEN. + + @retval The EFI status is returned in MANAGEABILITY_TRANSFER_TOKEN. + +**/ +VOID +EFIAPI +MctpTransportTransmitReceive ( + IN MANAGEABILITY_TRANSPORT_TOKEN *TransportToken, + IN MANAGEABILITY_TRANSFER_TOKEN *TransferToken + ) +{ + EFI_STATUS Status; + MANAGEABILITY_MCTP_TRANSPORT_HEADER *TransmitHeader; + + if (TransportToken == NULL) { + DEBUG ((DEBUG_ERROR, "%a: Invalid transport token.\n", __FUNCTION__)); + TransferToken->TransportAdditionalStatus = MANAGEABILITY_TRANSPORT_ADDITIONAL_STATUS_NOT_AVAILABLE; + return; + } + + TransmitHeader = (MANAGEABILITY_MCTP_TRANSPORT_HEADER *)TransferToken->TransmitHeader; + if (TransmitHeader == NULL) { + TransferToken->TransferStatus = EFI_INVALID_PARAMETER; + TransferToken->TransportAdditionalStatus = MANAGEABILITY_TRANSPORT_ADDITIONAL_STATUS_NOT_AVAILABLE; + return; + } + + if (mMctpProtocol == NULL) { + Status = gBS->LocateProtocol ( + &gEdkiiMctpProtocolGuid, + NULL, + (VOID **)&mMctpProtocol + ); + if (EFI_ERROR (Status)) { + // + // Dxe MCTP Protocol is not installed. + // + DEBUG ((DEBUG_ERROR, "%a: EDKII MCTP protocol is not found - %r\n", Status)); + return; + } + } + + DEBUG (( + DEBUG_MANAGEABILITY_INFO, + "%a: MCTP message type: 0x%x, SourceEndpointId: 0x%x, DestinationEndpointId: 0x%x\n", + __FUNCTION__, + TransmitHeader->MessageHeader.MessageType, + TransmitHeader->SourceEndpointId, + TransmitHeader->DestinationEndpointId + )); + DEBUG (( + DEBUG_MANAGEABILITY_INFO, + " - Request message size: 0x%x, Response message size: %x\n", + TransferToken->TransmitPackage.TransmitSizeInByte, + TransferToken->ReceivePackage.ReceiveSizeInByte + )); + Status = mMctpProtocol->Functions.Version1_0->MctpSubmitCommand ( + mMctpProtocol, + TransmitHeader->MessageHeader.MessageType, + TransmitHeader->SourceEndpointId, + TransmitHeader->DestinationEndpointId, + (BOOLEAN)TransmitHeader->MessageHeader.IntegrityCheck, + TransferToken->TransmitPackage.TransmitPayload, + TransferToken->TransmitPackage.TransmitSizeInByte, + TransferToken->TransmitPackage.TransmitTimeoutInMillisecond, + TransferToken->ReceivePackage.ReceiveBuffer, + &TransferToken->ReceivePackage.ReceiveSizeInByte, + TransferToken->ReceivePackage.TransmitTimeoutInMillisecond, + &TransferToken->TransportAdditionalStatus + ); + TransferToken->TransferStatus = Status; +} + +/** + This function acquires to create a transport session to transmit manageability + packet. A transport token is returned to caller for the follow up operations. + + @param [in] ManageabilityProtocolSpec The protocol spec the transport interface is acquired. + @param [out] TransportToken The pointer to receive the transport token created by + the target transport interface library. + @retval EFI_SUCCESS Token is created successfully. + @retval EFI_OUT_OF_RESOURCES Out of resource to create a new transport session. + @retval EFI_UNSUPPORTED Protocol is not supported on this transport interface. + @retval Otherwise Other errors. + +**/ +EFI_STATUS +AcquireTransportSession ( + IN EFI_GUID *ManageabilityProtocolSpec, + OUT MANAGEABILITY_TRANSPORT_TOKEN **TransportToken + ) +{ + EFI_STATUS Status; + MANAGEABILITY_TRANSPORT_MCTP *MctpTransportToken; + + if (ManageabilityProtocolSpec == NULL) { + DEBUG ((DEBUG_ERROR, "%a: No Manageability protocol specification specified.\n", __FUNCTION__)); + return EFI_INVALID_PARAMETER; + } + + Status = HelperManageabilityCheckSupportedSpec ( + &gManageabilityTransportMctpGuid, + SupportedManageabilityProtocol, + NumberOfSupportedProtocol, + ManageabilityProtocolSpec + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: Protocol is not supported on this transport interface.\n", __FUNCTION__)); + return EFI_UNSUPPORTED; + } + + if (mSingleSessionToken != NULL) { + DEBUG ((DEBUG_ERROR, "%a: This manageability transport library only supports one session transport token.\n", __FUNCTION__)); + return EFI_OUT_OF_RESOURCES; + } + + MctpTransportToken = (MANAGEABILITY_TRANSPORT_MCTP *)AllocateZeroPool (sizeof (MANAGEABILITY_TRANSPORT_MCTP)); + if (MctpTransportToken == NULL) { + DEBUG ((DEBUG_ERROR, "%a: Fail to allocate memory for MANAGEABILITY_TRANSPORT_MCTP\n", __FUNCTION__)); + return EFI_OUT_OF_RESOURCES; + } + + MctpTransportToken->Token.Transport = AllocateZeroPool (sizeof (MANAGEABILITY_TRANSPORT)); + if (MctpTransportToken->Token.Transport == NULL) { + FreePool (MctpTransportToken); + DEBUG ((DEBUG_ERROR, "%a: Fail to allocate memory for MANAGEABILITY_TRANSPORT\n", __FUNCTION__)); + return EFI_OUT_OF_RESOURCES; + } + + MctpTransportToken->Signature = MANAGEABILITY_TRANSPORT_MCTP_SIGNATURE; + MctpTransportToken->Token.ManageabilityProtocolSpecification = ManageabilityProtocolSpec; + MctpTransportToken->Token.Transport->TransportVersion = MANAGEABILITY_TRANSPORT_TOKEN_VERSION; + MctpTransportToken->Token.Transport->ManageabilityTransportSpecification = &gManageabilityTransportMctpGuid; + MctpTransportToken->Token.Transport->TransportName = L"MCTP"; + MctpTransportToken->Token.Transport->Function.Version1_0 = AllocateZeroPool (sizeof (MANAGEABILITY_TRANSPORT_FUNCTION_V1_0)); + if (MctpTransportToken->Token.Transport->Function.Version1_0 == NULL) { + DEBUG ((DEBUG_ERROR, "%a: Fail to allocate memory for MANAGEABILITY_TRANSPORT_FUNCTION_V1_0\n", __FUNCTION__)); + FreePool (MctpTransportToken); + FreePool (MctpTransportToken->Token.Transport); + return EFI_OUT_OF_RESOURCES; + } + + MctpTransportToken->Token.Transport->Function.Version1_0->TransportInit = MctpTransportInit; + MctpTransportToken->Token.Transport->Function.Version1_0->TransportReset = MctpTransportReset; + MctpTransportToken->Token.Transport->Function.Version1_0->TransportStatus = MctpTransportStatus; + MctpTransportToken->Token.Transport->Function.Version1_0->TransportTransmitReceive = MctpTransportTransmitReceive; + + mSingleSessionToken = MctpTransportToken; + *TransportToken = &MctpTransportToken->Token; + return EFI_SUCCESS; +} + +/** + This function returns the transport capabilities according to + the manageability protocol. + + @param [in] TransportToken Transport token acquired from manageability + transport library. + @param [out] TransportFeature Pointer to receive transport capabilities. + See the definitions of + MANAGEABILITY_TRANSPORT_CAPABILITY. + @retval EFI_SUCCESS TransportCapability is returned successfully. + @retval EFI_INVALID_PARAMETER TransportToken is not a valid token. +**/ +EFI_STATUS +GetTransportCapability ( + IN MANAGEABILITY_TRANSPORT_TOKEN *TransportToken, + OUT MANAGEABILITY_TRANSPORT_CAPABILITY *TransportCapability + ) +{ + if ((TransportToken == NULL) || (TransportCapability == NULL)) { + return EFI_INVALID_PARAMETER; + } + + *TransportCapability = 0; + return EFI_SUCCESS; +} + +/** + This function releases the manageability session. + + @param [in] TransportToken The transport token acquired through + AcquireTransportSession. + @retval EFI_SUCCESS Token is released successfully. + @retval EFI_INVALID_PARAMETER Invalid TransportToken. + @retval Otherwise Other errors. + +**/ +EFI_STATUS +ReleaseTransportSession ( + IN MANAGEABILITY_TRANSPORT_TOKEN *TransportToken + ) +{ + EFI_STATUS Status; + MANAGEABILITY_TRANSPORT_MCTP *MctpTransportToken; + + if (TransportToken == NULL) { + Status = EFI_INVALID_PARAMETER; + } + + MctpTransportToken = MANAGEABILITY_TRANSPORT_MCTP_FROM_LINK (TransportToken); + if (mSingleSessionToken != MctpTransportToken) { + Status = EFI_INVALID_PARAMETER; + } + + if (MctpTransportToken != NULL) { + FreePool (MctpTransportToken->Token.Transport->Function.Version1_0); + FreePool (MctpTransportToken->Token.Transport); + FreePool (MctpTransportToken); + mSingleSessionToken = NULL; + Status = EFI_SUCCESS; + } + + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: Fail to release MCTP transport token (%r).\n", __FUNCTION__, Status)); + } + + return Status; +} diff --git a/Features/ManageabilityPkg/Library/ManageabilityTransportMctpLib/Dxe/ManageabilityTransportMctp.uni b/Features/ManageabilityPkg/Library/ManageabilityTransportMctpLib/Dxe/ManageabilityTransportMctp.uni new file mode 100644 index 0000000000..ca8125a4a7 --- /dev/null +++ b/Features/ManageabilityPkg/Library/ManageabilityTransportMctpLib/Dxe/ManageabilityTransportMctp.uni @@ -0,0 +1,13 @@ +// /** @file +// MCTP instance of Manageability Transport Library +// +// Copyright (C) 2023 Advanced Micro Devices, Inc. All rights reserved.<BR> +// +// SPDX-License-Identifier: BSD-2-Clause-Patent +// +// **/ + +#string STR_MODULE_ABSTRACT #language en-US "MCTP instance of Manageability Transport Library" + +#string STR_MODULE_DESCRIPTION #language en-US "MCTP Manageability Transport library implementation." + -- 2.37.1.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#103145): https://edk2.groups.io/g/devel/message/103145 Mute This Topic: https://groups.io/mt/98339122/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-