ArmPkg,MdePkg,MdeModulePkg: change ArmFfaLibGetVersion() with whole version Current ArmFfaLibGetVersion()'s arguments receive two arguments -- major version and minor version. However, This gives some impression treating major and minor version of the ABI as two unrelated 16-bit variables as opposed to the upper and lower 16-bits of a 32-bit version variable. Therefore, change the arguments with whole version and let user to get major/minor version via ARM_FFA_MAJOR/MINOR_VERSION_GET macros. Also, add some useful helper to check version compatibility and mimimum require ABI version. Continuous-integration-options: PatchCheck.ignore-multi-package Suggested-by: Leif Lindholm <quic_llindhol@quicinc.com> Signed-off-by: Yeoreum Yun <yeoreum.yun@arm.com>
diff --git a/ArmPkg/Drivers/MmCommunicationDxe/MmCommunication.c b/ArmPkg/Drivers/MmCommunicationDxe/MmCommunication.c index edbd294..7cbccec 100644 --- a/ArmPkg/Drivers/MmCommunicationDxe/MmCommunication.c +++ b/ArmPkg/Drivers/MmCommunicationDxe/MmCommunication.c
@@ -495,23 +495,18 @@ ) { EFI_STATUS Status; - UINT16 CurrentMajorVersion; - UINT16 CurrentMinorVersion; + UINT32 CurrentVersion; Status = ArmFfaLibGetVersion ( - ARM_FFA_MAJOR_VERSION, - ARM_FFA_MINOR_VERSION, - &CurrentMajorVersion, - &CurrentMinorVersion + ARM_FFA_CREATE_VERSION (ARM_FFA_MAJOR_VERSION, ARM_FFA_MINOR_VERSION), + &CurrentVersion ); if (EFI_ERROR (Status)) { DEBUG ((DEBUG_ERROR, "Failed to get FF-A version. Status: %r\n", Status)); return EFI_UNSUPPORTED; } - if ((ARM_FFA_MAJOR_VERSION != CurrentMajorVersion) || - (ARM_FFA_MINOR_VERSION > CurrentMinorVersion)) - { + if (!ARM_FFA_ABI_COMPATIBLE (CurrentVersion, ARM_FFA_MAJOR_VERSION, ARM_FFA_MINOR_VERSION)) { DEBUG (( DEBUG_ERROR, "Incompatible FF-A Versions for MM_COMM.\n" \ @@ -519,8 +514,8 @@ "Current Version: Major=0x%x, Minor>=0x%x.\n", ARM_FFA_MAJOR_VERSION, ARM_FFA_MINOR_VERSION, - CurrentMajorVersion, - CurrentMinorVersion + ARM_FFA_MAJOR_VERSION_GET (CurrentVersion), + ARM_FFA_MINOR_VERSION_GET (CurrentVersion) )); return EFI_UNSUPPORTED; } @@ -528,8 +523,8 @@ DEBUG (( DEBUG_INFO, "FF-A Version for MM_COMM: Major=0x%x, Minor=0x%x\n", - CurrentMajorVersion, - CurrentMinorVersion + ARM_FFA_MAJOR_VERSION_GET (CurrentVersion), + ARM_FFA_MINOR_VERSION_GET (CurrentVersion) )); return EFI_SUCCESS;
diff --git a/ArmPkg/Drivers/MmCommunicationPei/MmCommunicationPei.c b/ArmPkg/Drivers/MmCommunicationPei/MmCommunicationPei.c index 3f64fb3..00a56a4 100644 --- a/ArmPkg/Drivers/MmCommunicationPei/MmCommunicationPei.c +++ b/ArmPkg/Drivers/MmCommunicationPei/MmCommunicationPei.c
@@ -91,22 +91,17 @@ ) { EFI_STATUS Status; - UINT16 CurrentMajorVersion; - UINT16 CurrentMinorVersion; + UINT32 CurrentVersion; Status = ArmFfaLibGetVersion ( - ARM_FFA_MAJOR_VERSION, - ARM_FFA_MINOR_VERSION, - &CurrentMajorVersion, - &CurrentMinorVersion + ARM_FFA_CREATE_VERSION (ARM_FFA_MAJOR_VERSION, ARM_FFA_MINOR_VERSION), + &CurrentVersion ); if (EFI_ERROR (Status)) { return EFI_UNSUPPORTED; } - if ((ARM_FFA_MAJOR_VERSION != CurrentMajorVersion) || - (ARM_FFA_MINOR_VERSION > CurrentMinorVersion)) - { + if (!ARM_FFA_ABI_COMPATIBLE (CurrentVersion, ARM_FFA_MAJOR_VERSION, ARM_FFA_MINOR_VERSION)) { DEBUG (( DEBUG_INFO, "Incompatible FF-A Versions for MM_COMM.\n" \ @@ -114,8 +109,8 @@ "Current Version: Major=0x%x, Minor>=0x%x.\n", ARM_FFA_MAJOR_VERSION, ARM_FFA_MINOR_VERSION, - CurrentMajorVersion, - CurrentMinorVersion + ARM_FFA_MAJOR_VERSION_GET (CurrentVersion), + ARM_FFA_MINOR_VERSION_GET (CurrentVersion) )); return EFI_UNSUPPORTED; } @@ -123,8 +118,8 @@ DEBUG (( DEBUG_INFO, "FF-A Version for MM_COMM: Major=0x%x, Minor=0x%x\n", - CurrentMajorVersion, - CurrentMinorVersion + ARM_FFA_MAJOR_VERSION_GET (CurrentVersion), + ARM_FFA_MINOR_VERSION_GET (CurrentVersion) )); return EFI_SUCCESS;
diff --git a/ArmPkg/Library/ArmStandaloneMmCoreEntryPoint/ArmStandaloneMmCoreEntryPoint.c b/ArmPkg/Library/ArmStandaloneMmCoreEntryPoint/ArmStandaloneMmCoreEntryPoint.c index a93a7e8..d5c786b 100644 --- a/ArmPkg/Library/ArmStandaloneMmCoreEntryPoint/ArmStandaloneMmCoreEntryPoint.c +++ b/ArmPkg/Library/ArmStandaloneMmCoreEntryPoint/ArmStandaloneMmCoreEntryPoint.c
@@ -76,6 +76,7 @@ EFI_STATUS Status; UINT16 RequestMajorVersion; UINT16 RequestMinorVersion; + UINT32 CurrentVersion; UINT16 CurrentMajorVersion; UINT16 CurrentMinorVersion; ARM_SVC_ARGS SvcArgs; @@ -84,13 +85,13 @@ RequestMinorVersion = ARM_FFA_MINOR_VERSION; Status = ArmFfaLibGetVersion ( - RequestMajorVersion, - RequestMinorVersion, - &CurrentMajorVersion, - &CurrentMinorVersion + ARM_FFA_CREATE_VERSION (RequestMajorVersion, RequestMinorVersion), + &CurrentVersion ); if (!EFI_ERROR (Status)) { - *CommProtocol = CommProtocolFfa; + *CommProtocol = CommProtocolFfa; + CurrentMajorVersion = ARM_FFA_MAJOR_VERSION_GET (CurrentVersion); + CurrentMinorVersion = ARM_FFA_MINOR_VERSION_GET (CurrentVersion); } else { ZeroMem (&SvcArgs, sizeof (ARM_SVC_ARGS)); SvcArgs.Arg0 = ARM_FID_SPM_MM_VERSION_AARCH32;
diff --git a/ArmPkg/Library/StandaloneMmMmuLib/ArmMmuStandaloneMmLib.c b/ArmPkg/Library/StandaloneMmMmuLib/ArmMmuStandaloneMmLib.c index f37cffe..a046407 100644 --- a/ArmPkg/Library/StandaloneMmMmuLib/ArmMmuStandaloneMmLib.c +++ b/ArmPkg/Library/StandaloneMmMmuLib/ArmMmuStandaloneMmLib.c
@@ -35,8 +35,7 @@ StMM Core invokes this library before constructors are called and before the StMM image itself is relocated. - @param[out] MajorVersion Major Version of ABI. - @param[out] MinorVersion Minor Version of ABI. + @param[out] Version Version of FF-A ABI. @retval TRUE Use FF-A MemPerm ABIs. @retval FALSE Use MM MemPerm ABIs. @@ -46,20 +45,16 @@ BOOLEAN EFIAPI IsFfaMemoryAbiSupported ( - OUT UINT16 *MajorVersion, - OUT UINT16 *MinorVersion + OUT UINT32 *Version ) { EFI_STATUS Status; - *MajorVersion = 0; - *MinorVersion = 0; + *Version = 0; Status = ArmFfaLibGetVersion ( - ARM_FFA_MAJOR_VERSION, - ARM_FFA_MINOR_VERSION, - MajorVersion, - MinorVersion + ARM_FFA_CREATE_VERSION (ARM_FFA_MAJOR_VERSION, ARM_FFA_MINOR_VERSION), + Version ); if (EFI_ERROR (Status)) { return FALSE; @@ -151,8 +146,7 @@ /** Request the permission attributes of a memory region from S-EL0. @param [in] UseFfaAbis Use FF-A abis or not. - @param [in] AbiMajorVersion ABI Major Version - @param [in] AbiMinorVersion ABI Minor Version + @param [in] AbiVersion ABI Version @param [in] BaseAddress Base address for the memory region. @param [in] Length Size of memory region. @param [out] MemoryAttributes Pointer to return the memory attributes. @@ -174,8 +168,7 @@ EFI_STATUS GetMemoryPermissions ( IN BOOLEAN UseFfaAbis, - IN UINT16 AbiMajorVersion, - IN UINT16 AbiMinorVersion, + IN UINT32 AbiVersion, IN EFI_PHYSICAL_ADDRESS BaseAddress, IN UINT64 Length, OUT UINT32 *MemoryAttributes, @@ -200,7 +193,7 @@ SvcArgs.Arg0 = Fid; SvcArgs.Arg1 = BaseAddress; - if (UseFfaAbis && ((AbiMajorVersion > 1) || (AbiMinorVersion > 2))) { + if (UseFfaAbis && ARM_FFA_ABI_MINIMUM (AbiVersion, 1, 3)) { /* * The input page count is encoded as (page count - 1), * so subtract 1 from the actual page count. @@ -216,7 +209,7 @@ *PageCount = 0; } else { *MemoryAttributes = Ret; - if (UseFfaAbis && ((AbiMajorVersion > 1) || (AbiMinorVersion > 2))) { + if (UseFfaAbis && ARM_FFA_ABI_MINIMUM (AbiVersion, 1, 3)) { /* * The output page count is encoded as (page count - 1), * so add 1 to get the actual page count. @@ -289,18 +282,16 @@ UINT32 MemoryAttributes; UINT32 PermissionRequest; BOOLEAN UseFfaAbis; - UINT16 MajorVersion; - UINT16 MinorVersion; + UINT32 Version; UINTN Size; UINT32 PageCount; - UseFfaAbis = IsFfaMemoryAbiSupported (&MajorVersion, &MinorVersion); + UseFfaAbis = IsFfaMemoryAbiSupported (&Version); while (Length > 0) { Status = GetMemoryPermissions ( UseFfaAbis, - MajorVersion, - MinorVersion, + Version, BaseAddress, Length, &MemoryAttributes, @@ -355,18 +346,16 @@ UINT32 MemoryAttributes; UINT32 PermissionRequest; BOOLEAN UseFfaAbis; - UINT16 MajorVersion; - UINT16 MinorVersion; + UINT32 Version; UINTN Size; UINT32 PageCount; - UseFfaAbis = IsFfaMemoryAbiSupported (&MajorVersion, &MinorVersion); + UseFfaAbis = IsFfaMemoryAbiSupported (&Version); while (Length > 0) { Status = GetMemoryPermissions ( UseFfaAbis, - MajorVersion, - MinorVersion, + Version, BaseAddress, Length, &MemoryAttributes, @@ -421,18 +410,16 @@ UINT32 MemoryAttributes; UINT32 PermissionRequest; BOOLEAN UseFfaAbis; - UINT16 MajorVersion; - UINT16 MinorVersion; + UINT32 Version; UINTN Size; UINT32 PageCount; - UseFfaAbis = IsFfaMemoryAbiSupported (&MajorVersion, &MinorVersion); + UseFfaAbis = IsFfaMemoryAbiSupported (&Version); while (Length > 0) { Status = GetMemoryPermissions ( UseFfaAbis, - MajorVersion, - MinorVersion, + Version, BaseAddress, Length, &MemoryAttributes, @@ -487,18 +474,16 @@ UINT32 MemoryAttributes; UINT32 PermissionRequest; BOOLEAN UseFfaAbis; - UINT16 MajorVersion; - UINT16 MinorVersion; + UINT32 Version; UINTN Size; UINT32 PageCount; - UseFfaAbis = IsFfaMemoryAbiSupported (&MajorVersion, &MinorVersion); + UseFfaAbis = IsFfaMemoryAbiSupported (&Version); while (Length > 0) { Status = GetMemoryPermissions ( UseFfaAbis, - MajorVersion, - MinorVersion, + Version, BaseAddress, Length, &MemoryAttributes,
diff --git a/MdeModulePkg/Library/ArmFfaLib/ArmFfaCommon.c b/MdeModulePkg/Library/ArmFfaLib/ArmFfaCommon.c index 466b12b..f64d5cb 100644 --- a/MdeModulePkg/Library/ArmFfaLib/ArmFfaCommon.c +++ b/MdeModulePkg/Library/ArmFfaLib/ArmFfaCommon.c
@@ -176,19 +176,15 @@ /** Get FF-A version. - @param [in] RequestMajorVersion Minimal request major version - @param [in] RequestMinorVersion Minimal request minor version - @param [out] CurrentMajorVersion Current major version - @param [out] CurrentMinorVersion Current minor version + @param [in] RequestVersion Minimal request version + @param [out] CurrentVersion Current major version **/ EFI_STATUS EFIAPI ArmFfaLibGetVersion ( - IN UINT16 RequestMajorVersion, - IN UINT16 RequestMinorVersion, - OUT UINT16 *CurrentMajorVersion, - OUT UINT16 *CurrentMinorVersion + IN UINT32 RequestVersion, + OUT UINT32 *CurrentVersion ) { EFI_STATUS Status; @@ -197,10 +193,7 @@ ZeroMem (&FfaArgs, sizeof (ARM_FFA_ARGS)); FfaArgs.Arg0 = ARM_FID_FFA_VERSION; - FfaArgs.Arg1 = ARM_FFA_CREATE_VERSION ( - RequestMajorVersion, - RequestMinorVersion - ); + FfaArgs.Arg1 = RequestVersion; ArmCallFfa (&FfaArgs); @@ -209,12 +202,8 @@ return Status; } - if (CurrentMajorVersion != NULL) { - *CurrentMajorVersion = ARM_FFA_MAJOR_VERSION_GET (FfaArgs.Arg0); - } - - if (CurrentMinorVersion != NULL) { - *CurrentMinorVersion = ARM_FFA_MINOR_VERSION_GET (FfaArgs.Arg0); + if (CurrentVersion != NULL) { + *CurrentVersion = FfaArgs.Arg0; } return EFI_SUCCESS; @@ -1208,31 +1197,26 @@ ) { EFI_STATUS Status; - UINT16 CurrentMajorVersion; - UINT16 CurrentMinorVersion; + UINT32 CurrentVersion; Status = ArmFfaLibGetVersion ( - ARM_FFA_MAJOR_VERSION, - ARM_FFA_MINOR_VERSION, - &CurrentMajorVersion, - &CurrentMinorVersion + ARM_FFA_CREATE_VERSION (ARM_FFA_MAJOR_VERSION, ARM_FFA_MINOR_VERSION), + &CurrentVersion ); if (EFI_ERROR (Status)) { return FALSE; } - if ((ARM_FFA_MAJOR_VERSION != CurrentMajorVersion) || - (ARM_FFA_MINOR_VERSION > CurrentMinorVersion)) - { + if (!ARM_FFA_ABI_COMPATIBLE (CurrentVersion, ARM_FFA_MAJOR_VERSION, ARM_FFA_MINOR_VERSION)) { DEBUG (( DEBUG_INFO, "Incompatible FF-A Versions.\n" \ "Request Version: Major=0x%x, Minor=0x%x.\n" \ - "Current Version: Major=0x%x, Minor>=0x%x.\n", + "Current Version: Major=0x%x, Minor=0x%x.\n", ARM_FFA_MAJOR_VERSION, ARM_FFA_MINOR_VERSION, - CurrentMajorVersion, - CurrentMinorVersion + ARM_FFA_MAJOR_VERSION_GET (CurrentVersion), + ARM_FFA_MINOR_VERSION_GET (CurrentVersion) )); return FALSE; }
diff --git a/MdePkg/Include/IndustryStandard/ArmFfaSvc.h b/MdePkg/Include/IndustryStandard/ArmFfaSvc.h index d6a384f..614afbc 100644 --- a/MdePkg/Include/IndustryStandard/ArmFfaSvc.h +++ b/MdePkg/Include/IndustryStandard/ArmFfaSvc.h
@@ -113,6 +113,15 @@ (((major) << ARM_FFA_MAJOR_VERSION_SHIFT) | \ ((minor) << ARM_FFA_MINOR_VERSION_SHIFT)) +#define ARM_FFA_ABI_COMPATIBLE(version, major, minor) \ + ((BOOLEAN)(((ARM_FFA_MAJOR_VERSION_GET(version)) == major) && \ + ((ARM_FFA_MINOR_VERSION_GET(version)) >= minor))) + +#define ARM_FFA_ABI_MINIMUM(version, major, minor) \ + ((BOOLEAN)(((ARM_FFA_MAJOR_VERSION_GET(version)) < major) ? FALSE : \ + (((ARM_FFA_MAJOR_VERSION_GET(version)) > major) ? TRUE : \ + ((ARM_FFA_MINOR_VERSION_GET(version)) >= minor)))) + #define ARM_FFA_FEATURES_ID_TYPE_SHIFT 31 #define ARM_FFA_FEATURES_ID_TYPE_MASK 1 #define ARM_FFA_FEATURES_ID_TYPE_FEATURE 0
diff --git a/MdePkg/Include/Library/ArmFfaLib.h b/MdePkg/Include/Library/ArmFfaLib.h index bf0bbdb..9adfffb 100644 --- a/MdePkg/Include/Library/ArmFfaLib.h +++ b/MdePkg/Include/Library/ArmFfaLib.h
@@ -172,19 +172,15 @@ /** Get FF-A version - @param [in] RequestMajorVersion Minimal request major version - @param [in] RequestMinorVersion Minimal request minor version - @param [out] CurrentMajorVersion Current major version - @param [out] CurrentMinorVersion Current minor version + @param [in] RequestVersion Minimal request version + @param [out] CurrentVersion Current major version **/ EFI_STATUS EFIAPI ArmFfaLibGetVersion ( - IN UINT16 RequestMajorVersion, - IN UINT16 RequestMinorVersion, - OUT UINT16 *CurrentMajorVersion, - OUT UINT16 *CurrentMinorVersion + IN UINT32 RequestVersion, + OUT UINT32 *CurrentVersion ); /**