/** @file
This library provides an interfaces to access DynamicPcds used
in Tpm2DeviceLibFfa.
Copyright (c) 2025, Arm Ltd. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#include
#include
#include
#include
#include
#include "Tpm2DeviceLibFfa.h"
TPM2_PTP_INTERFACE_TYPE mActiveTpmInterfaceType;
/**
This function validate TPM interface type for TPM service over FF-A.
@retval EFI_SUCCESS TPM interface type is valid.
@retval EFI_UNSUPPORTED TPM interface type is invalid.
**/
EFI_STATUS
ValidateTpmInterfaceType (
VOID
)
{
mActiveTpmInterfaceType = PcdGet8 (PcdActiveTpmInterfaceType);
//
// Start by checking the PCD out of the gate and read from the CRB if it is invalid
//
if (mActiveTpmInterfaceType == TPM2_FFA_INTERFACE_TYPE_UNKNOWN) {
mActiveTpmInterfaceType = Tpm2GetPtpInterface ((VOID *)(UINTN)PcdGet64 (PcdTpmBaseAddress));
PcdSet8S (PcdActiveTpmInterfaceType, mActiveTpmInterfaceType);
}
if (mActiveTpmInterfaceType != Tpm2PtpInterfaceCrb) {
return EFI_UNSUPPORTED;
}
DEBUG ((DEBUG_INFO, "Setting Tpm Active Interface Type %d\n", mActiveTpmInterfaceType));
return EFI_SUCCESS;
}
/**
This function is used to get the TPM service partition id.
@param[out] PartitionId - Supplies the pointer to the TPM service partition id.
@retval EFI_SUCCESS The TPM command was successfully sent to the TPM
and the response was copied to the Output buffer.
@retval EFI_INVALID_PARAMETER The TPM command buffer is NULL or the TPM command
buffer size is 0.
@retval EFI_DEVICE_ERROR An error occurred in communication with the TPM.
**/
EFI_STATUS
EFIAPI
GetTpmServicePartitionId (
OUT UINT16 *PartitionId
)
{
EFI_STATUS Status;
if (PartitionId == NULL) {
return EFI_INVALID_PARAMETER;
}
if (PcdGet16 (PcdTpmServiceFfaPartitionId) != TPM2_FFA_PARTITION_ID_INVALID) {
*PartitionId = PcdGet16 (PcdTpmServiceFfaPartitionId);
return EFI_SUCCESS;
}
Status = FfaTpm2GetServicePartitionId (PartitionId);
if (!EFI_ERROR (Status)) {
PcdSet16S (PcdTpmServiceFfaPartitionId, *PartitionId);
}
return Status;
}