diff options
-rw-r--r-- | ArmPkg/ArmPkg.dsc | 2 | ||||
-rw-r--r-- | ArmPkg/Library/ArmFfaLib/ArmFfaPeiLib.c | 98 | ||||
-rw-r--r-- | ArmPkg/Library/ArmFfaLib/ArmFfaPeiLib.inf | 45 |
3 files changed, 145 insertions, 0 deletions
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.<BR>
+ 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 <Uefi.h>
+#include <PiPei.h>
+#include <Pi/PiPeiCis.h>
+#include <Pi/PiMultiPhase.h>
+
+#include <Library/ArmLib.h>
+#include <Library/ArmSmcLib.h>
+#include <Library/ArmFfaLib.h>
+#include <Library/BaseLib.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/DebugLib.h>
+#include <Library/HobLib.h>
+#include <Library/MemoryAllocationLib.h>
+#include <Library/PcdLib.h>
+
+#include <IndustryStandard/ArmFfaSvc.h>
+
+#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.<BR>
+#
+# 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
|