blob: d18b70280c31946bc9d793c873df76b7f2b81912 [file]
/** @file
Instance of EDKII PLDM Protocol Library in DXE phase
Copyright (C) 2023-2026 Advanced Micro Devices, Inc. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#include <PiDxe.h>
#include <Protocol/PldmProtocol.h>
#include <Library/DebugLib.h>
#include <Library/PcdLib.h>
#include <Library/ManageabilityTransportHelperLib.h>
#include <Library/UefiBootServicesTableLib.h>
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;
}