From 166c3b2eb79b1bdfd74b582446d4c5fa2402d33d Mon Sep 17 00:00:00 2001 From: Levi Yun Date: Mon, 5 Aug 2024 17:40:12 +0100 Subject: ArmPkg: Add ArmFfaLib used in PEIM Add ArmFfaLib used in PEIM. Signed-off-by: Levi Yun --- ArmPkg/ArmPkg.dsc | 2 + ArmPkg/Library/ArmFfaLib/ArmFfaPeiLib.c | 98 +++++++++++++++++++++++++++++++ ArmPkg/Library/ArmFfaLib/ArmFfaPeiLib.inf | 45 ++++++++++++++ 3 files changed, 145 insertions(+) create mode 100644 ArmPkg/Library/ArmFfaLib/ArmFfaPeiLib.c create mode 100644 ArmPkg/Library/ArmFfaLib/ArmFfaPeiLib.inf (limited to 'ArmPkg') diff --git a/ArmPkg/ArmPkg.dsc b/ArmPkg/ArmPkg.dsc index 8f64eb4c9b..df50b38b7d 100644 --- a/ArmPkg/ArmPkg.dsc +++ b/ArmPkg/ArmPkg.dsc @@ -100,6 +100,7 @@ MemoryAllocationLib|MdePkg/Library/PeiMemoryAllocationLib/PeiMemoryAllocationLib.inf PeiServicesLib|MdePkg/Library/PeiServicesLib/PeiServicesLib.inf PeiServicesTablePointerLib|MdePkg/Library/PeiServicesTablePointerLib/PeiServicesTablePointerLib.inf + ArmFfaLib|ArmPkg/Library/ArmFfaLib/ArmFfaPeiLib.inf [Components.common] ArmPkg/Library/ArmCacheMaintenanceLib/ArmCacheMaintenanceLib.inf @@ -133,6 +134,7 @@ ArmPkg/Library/ArmSvcLib/ArmSvcLib.inf ArmPkg/Library/OpteeLib/OpteeLib.inf ArmPkg/Library/ArmTransferListLib/ArmTransferListLib.inf + ArmPkg/Library/ArmFfaLib/ArmFfaPeiLib.inf ArmPkg/Library/ArmFfaLib/ArmFfaDxeLib.inf ArmPkg/Filesystem/SemihostFs/SemihostFs.inf diff --git a/ArmPkg/Library/ArmFfaLib/ArmFfaPeiLib.c b/ArmPkg/Library/ArmFfaLib/ArmFfaPeiLib.c new file mode 100644 index 0000000000..8a1d892941 --- /dev/null +++ b/ArmPkg/Library/ArmFfaLib/ArmFfaPeiLib.c @@ -0,0 +1,98 @@ +/** @file + Arm Ffa library code for PEI Driver + + Copyright (c) 2024, Arm Limited. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent + + @par Glossary: + - FF-A - Firmware Framework for Arm A-profile + + @par Reference(s): + - Arm Firmware Framework for Arm A-Profile [https://developer.arm.com/documentation/den0077/latest] + +**/ + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "ArmFfaCommon.h" +#include "ArmFfaRxTxMap.h" + +/** + ArmFfaLib Constructor. + + @param [in] FileHandle File Handle + @param [in] PeiServices Pei Service Table + + @retval EFI_SUCCESS Success + @retval Others Error + +**/ +EFI_STATUS +EFIAPI +ArmFfaPeiLibConstructor ( + IN EFI_PEI_FILE_HANDLE FileHandle, + IN CONST EFI_PEI_SERVICES **PeiServices + ) +{ + EFI_STATUS Status; + EFI_HOB_GUID_TYPE *RxTxBufferHob; + ARM_FFA_RX_TX_BUFFER_INFO *BufferInfo; + + Status = ArmFfaLibCommonInit (); + if (EFI_ERROR (Status)) { + if (Status == EFI_UNSUPPORTED) { + /* + * EFI_UNSUPPORTED return from ArmFfaLibCommonInit() means + * FF-A interface doesn't support. + * However, It doesn't make failure of loading driver/library instance + * (i.e) ArmPkg's MmCommunication Dxe/PEI Driver uses as well as SpmMm. + * So If FF-A is not supported the the MmCommunication Dxe/PEI falls + * back to SpmMm. + * For this case, return EFI_SUCCESS. + + */ + return EFI_SUCCESS; + } + + return Status; + } + + RxTxBufferHob = GetFirstGuidHob (&gArmFfaRxTxBufferInfoGuid); + if (RxTxBufferHob == NULL) { + Status = ArmFfaLibRxTxMap (); + if (EFI_ERROR (Status)) { + return Status; + } + + BufferInfo = BuildGuidHob ( + &gArmFfaRxTxBufferInfoGuid, + sizeof (ARM_FFA_RX_TX_BUFFER_INFO) + ); + if (BufferInfo == NULL) { + ArmFfaLibRxTxUnmap (); + return EFI_OUT_OF_RESOURCES; + } + + BufferInfo->TxBufferAddr = (VOID *)(UINTN)PcdGet64 (PcdFfaTxBuffer); + BufferInfo->TxBufferSize = PcdGet64 (PcdFfaTxRxPageCount) * EFI_PAGE_SIZE; + BufferInfo->RxBufferAddr = (VOID *)(UINTN)PcdGet64 (PcdFfaRxBuffer); + BufferInfo->RxBufferSize = PcdGet64 (PcdFfaTxRxPageCount) * EFI_PAGE_SIZE; + } + + return EFI_SUCCESS; +} diff --git a/ArmPkg/Library/ArmFfaLib/ArmFfaPeiLib.inf b/ArmPkg/Library/ArmFfaLib/ArmFfaPeiLib.inf new file mode 100644 index 0000000000..e4ecae0c1c --- /dev/null +++ b/ArmPkg/Library/ArmFfaLib/ArmFfaPeiLib.inf @@ -0,0 +1,45 @@ +## @file +# Provides FF-A ABI Library used in PEI Driver. +# +# Copyright (c) 2024, Arm Limited. All rights reserved.
+# +# SPDX-License-Identifier: BSD-2-Clause-Patent +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = ArmFfaPeiLib + FILE_GUID = 6e21912a-5f50-11ef-a3ae-dfe665fd4fc0 + MODULE_TYPE = PEIM + VERSION_STRING = 1.0 + LIBRARY_CLASS = ArmFfaLib|PEIM + CONSTRUCTOR = ArmFfaPeiLibConstructor + +[Sources] + ArmFfaCommon.h + ArmFfaCommon.c + ArmFfaRxTxMap.h + ArmFfaRxTxMap.c + ArmFfaPeiLib.c + +[Packages] + MdePkg/MdePkg.dec + ArmPkg/ArmPkg.dec + +[LibraryClasses] + ArmSmcLib + ArmSvcLib + BaseLib + BaseMemoryLib + DebugLib + HobLib + +[Pcd] + gArmTokenSpaceGuid.PcdFfaLibConduitSmc + gArmTokenSpaceGuid.PcdFfaTxBuffer + gArmTokenSpaceGuid.PcdFfaRxBuffer + gArmTokenSpaceGuid.PcdFfaTxRxPageCount + gArmTokenSpaceGuid.PcdFfaExitBootEventRegistered + +[Guids] + gArmFfaRxTxBufferInfoGuid -- cgit