mirror of
https://github.com/tianocore/edk2
synced 2026-08-27 00:23:19 -04:00
ManageabilityPkg is migrated from edk2-platform repository. The last commit ID of ManageabilityPkg on edk2-platform is <4538a1b94c0e55d58e3841b2d640df7da0a3b149>. Signed-off-by: Abner Chang <abner.chang@amd.com>
134 lines
4.9 KiB
C
134 lines
4.9 KiB
C
/** @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;
|
|
}
|