/** @file Instance of EDKII PLDM Protocol Library in DXE phase Copyright (C) 2023-2026 Advanced Micro Devices, Inc. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include #include #include #include #include #include EDKII_PLDM_PROTOCOL *mEdkiiPldmProtocol = NULL; UINT8 mSourcePldmTerminusId = 0; UINT8 mDestinationPldmTerminusId = 0; /** This function sets the PLDM source terminus and destination terminus ID for SMBIOS PLDM transfer. @param[in] SourceId PLDM source terminus ID. @param[in] DestinationId PLDM destination terminus ID. @retval EFI_SUCCESS The terminus is set successfully. @retval EFI_INVALID_PARAMETER The terminus is set unsuccessfully. **/ EFI_STATUS PldmSetTerminus ( IN UINT8 SourceId, IN UINT8 DestinationId ) { mSourcePldmTerminusId = SourceId; mDestinationPldmTerminusId = DestinationId; return EFI_SUCCESS; } /** This service enables submitting commands via EDKII PLDM protocol. @param[in] PldmType PLDM message type. @param[in] Command PLDM Command of PLDM message type. @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 PLDM message was successfully sent to transport interface and a response was successfully received. @retval EFI_NOT_FOUND Transport interface is not found. @retval EFI_NOT_READY Transport interface is not ready for PLDM message. @retval EFI_DEVICE_ERROR Transport interface has an hardware error. @retval EFI_TIMEOUT Send PLDM message got a timeout. @retval EFI_UNSUPPORTED PLDM message is unsupported. @retval EFI_OUT_OF_RESOURCES The resource allocation is out of resource or data size error. **/ EFI_STATUS PldmSubmitCommand ( IN UINT8 PldmType, IN UINT8 Command, IN UINT8 *RequestData, IN UINT32 RequestDataSize, OUT UINT8 *ResponseData, IN OUT UINT32 *ResponseDataSize ) { EFI_STATUS Status; if (mEdkiiPldmProtocol == NULL) { Status = gBS->LocateProtocol ( &gEdkiiPldmProtocolGuid, NULL, (VOID **)&mEdkiiPldmProtocol ); if (EFI_ERROR (Status)) { // // Dxe PLDM Protocol is not installed. So, PLDM device is not present. // DEBUG ((DEBUG_ERROR, "%a: EDKII PLDM protocol is not found - %r\n", __func__, Status)); return EFI_NOT_FOUND; } } DEBUG ((DEBUG_MANAGEABILITY_INFO, "%a: PLDM Type: 0x%x, Command: 0x%x\n", __func__, PldmType, Command)); if ((RequestData != NULL) && (RequestDataSize != 0)) { HelperManageabilityDebugPrint ((VOID *)RequestData, RequestDataSize, "PLDM PLDM application layer Type/Command specific request payload\n"); } Status = mEdkiiPldmProtocol->Functions.Version1_0->PldmSubmitCommand ( mEdkiiPldmProtocol, PldmType, Command, mSourcePldmTerminusId, mDestinationPldmTerminusId, RequestData, RequestDataSize, ResponseData, ResponseDataSize ); if (EFI_ERROR (Status)) { DEBUG ((DEBUG_ERROR, "Fails to send PLDM package - %r\n", Status)); return Status; } if ((ResponseData != NULL) && (*ResponseDataSize != 0)) { HelperManageabilityDebugPrint ((VOID *)ResponseData, *ResponseDataSize, "PLDM application layer response payload\n"); } return Status; } /** Initialize mSourcePldmTerminusId and mDestinationPldmTerminusId. @param ImageHandle The image handle. @param SystemTable The system table. @retval EFI_SUCCESS Protocol listener is registered successfully. **/ EFI_STATUS EFIAPI PldmProtocolLibConstructor ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable ) { PldmSetTerminus (PcdGet8 (PcdPldmSourceTerminusId), PcdGet8 (PcdPldmDestinationEndpointId)); return EFI_SUCCESS; }