Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
138 changes: 83 additions & 55 deletions MdeModulePkg/Library/ArmFfaLib/ArmFfaCommon.c
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,6 @@

#include "ArmFfaCommon.h"

BOOLEAN gFfaSupported;
UINT16 gPartId;

/**
Convert EFI_STATUS to FFA return code.

Expand Down Expand Up @@ -190,22 +187,6 @@ ArmCallFfa (
}
}

/**
Check FF-A support or not.

@retval TRUE Supported
@retval FALSE Not supported

**/
BOOLEAN
EFIAPI
IsFfaSupported (
IN VOID
)
{
return gFfaSupported;
}

/**
Get FF-A version.

Expand Down Expand Up @@ -837,15 +818,21 @@ ArmFfaLibMsgSendDirectReq (
{
EFI_STATUS Status;
ARM_FFA_ARGS FfaArgs;
UINT16 PartId;

if ((DestPartId == gPartId) || (ImpDefArgs == NULL)) {
Status = ArmFfaLibGetPartId (&PartId);
if (EFI_ERROR (Status)) {
return Status;
}

if ((DestPartId == PartId) || (ImpDefArgs == NULL)) {
return EFI_INVALID_PARAMETER;
}

ZeroMem (&FfaArgs, sizeof (ARM_FFA_ARGS));

FfaArgs.Arg0 = ARM_FID_FFA_MSG_SEND_DIRECT_REQ;
FfaArgs.Arg1 = PACK_PARTITION_ID_INFO (gPartId, DestPartId);
FfaArgs.Arg1 = PACK_PARTITION_ID_INFO (PartId, DestPartId);
FfaArgs.Arg2 = Flags;
FfaArgs.Arg3 = ImpDefArgs->Arg0;
FfaArgs.Arg4 = ImpDefArgs->Arg1;
Expand Down Expand Up @@ -892,6 +879,7 @@ ArmFfaLibMsgSendDirectReq2 (
EFI_STATUS Status;
UINT64 Uuid[2];
ARM_FFA_ARGS FfaArgs;
UINT16 PartId;

/*
* Direct message request 2 is only supported on AArch64.
Expand All @@ -900,7 +888,12 @@ ArmFfaLibMsgSendDirectReq2 (
return EFI_UNSUPPORTED;
}

if ((DestPartId == gPartId) || (ImpDefArgs == NULL)) {
Status = ArmFfaLibGetPartId (&PartId);
if (EFI_ERROR (Status)) {
return Status;
}

if ((DestPartId == PartId) || (ImpDefArgs == NULL)) {
return EFI_INVALID_PARAMETER;
}

Expand All @@ -913,7 +906,7 @@ ArmFfaLibMsgSendDirectReq2 (
ZeroMem (&FfaArgs, sizeof (ARM_FFA_ARGS));

FfaArgs.Arg0 = ARM_FID_FFA_MSG_SEND_DIRECT_REQ2;
FfaArgs.Arg1 = PACK_PARTITION_ID_INFO (gPartId, DestPartId);
FfaArgs.Arg1 = PACK_PARTITION_ID_INFO (PartId, DestPartId);
FfaArgs.Arg2 = Uuid[0];
FfaArgs.Arg3 = Uuid[1];
FfaArgs.Arg4 = ImpDefArgs->Arg0;
Expand Down Expand Up @@ -959,56 +952,39 @@ ArmFfaLibMsgSendDirectReq2 (
/**
Common ArmFfaLib init.

@param [out] PartId PartitionId
@param [out] IsFfaSupported FF-A supported flag

@retval EFI_SUCCESS Success
@retval EFI_UNSUPPORTED FF-A isn't supported
@retval EFI_INVALID_PARAMETER Invalid parameter
@retval Others Error

**/
EFI_STATUS
EFIAPI
ArmFfaLibCommonInit (
IN VOID
OUT UINT16 *PartId,
OUT BOOLEAN *IsFfaSupported
)
{
EFI_STATUS Status;
UINT16 CurrentMajorVersion;
UINT16 CurrentMinorVersion;

gFfaSupported = FALSE;
if ((PartId == NULL) || (IsFfaSupported == NULL)) {
return EFI_INVALID_PARAMETER;
}

Status = ArmFfaLibGetVersion (
ARM_FFA_MAJOR_VERSION,
ARM_FFA_MINOR_VERSION,
&CurrentMajorVersion,
&CurrentMinorVersion
);
Status = ArmFfaLibIsFfaSupported ();
if (EFI_ERROR (Status)) {
return EFI_UNSUPPORTED;
return Status;
}

if ((ARM_FFA_MAJOR_VERSION != CurrentMajorVersion) ||
(ARM_FFA_MINOR_VERSION > CurrentMinorVersion))
{
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",
ARM_FFA_MAJOR_VERSION,
ARM_FFA_MINOR_VERSION,
CurrentMajorVersion,
CurrentMinorVersion
));
return EFI_UNSUPPORTED;
}
*IsFfaSupported = TRUE;

Status = ArmFfaLibPartitionIdGet (&gPartId);
Status = ArmFfaLibPartitionIdGet (PartId);
if (EFI_ERROR (Status)) {
return Status;
}

gFfaSupported = TRUE;

return EFI_SUCCESS;
}

Expand Down Expand Up @@ -1043,6 +1019,7 @@ ArmFfaLibGetPartitionInfo (
UINT64 RxBufferSize;
UINT32 Count;
UINT32 Size;
UINT16 PartId;

if (PartDesc == NULL) {
return EFI_INVALID_PARAMETER;
Expand Down Expand Up @@ -1081,13 +1058,18 @@ ArmFfaLibGetPartitionInfo (
return Status;
}

Status = ArmFfaLibGetPartId (&PartId);
if (EFI_ERROR (Status)) {
return Status;
}

if ((Size < sizeof (EFI_FFA_PART_INFO_DESC))) {
ArmFfaLibRxRelease (gPartId);
ArmFfaLibRxRelease (PartId);
return EFI_INVALID_PARAMETER;
}

CopyMem (PartDesc, RxBuffer, sizeof (EFI_FFA_PART_INFO_DESC));
ArmFfaLibRxRelease (gPartId);
ArmFfaLibRxRelease (PartId);

return EFI_SUCCESS;
}
Expand Down Expand Up @@ -1234,3 +1216,49 @@ GetRxTxBufferMinSizeAndAlign (

return EFI_SUCCESS;
}

/**
Determine if FF-A is supported

@retval EFI_SUCCESS FF-A is supported
@retval EFI_UNSUPPORTED FF-A isn't supported

**/
EFI_STATUS
EFIAPI
ArmFfaLibIsFfaSupported (
IN VOID
)
{
EFI_STATUS Status;
UINT16 CurrentMajorVersion;
UINT16 CurrentMinorVersion;

Status = ArmFfaLibGetVersion (
ARM_FFA_MAJOR_VERSION,
ARM_FFA_MINOR_VERSION,
&CurrentMajorVersion,
&CurrentMinorVersion
);
if (EFI_ERROR (Status)) {
return EFI_UNSUPPORTED;
}

if ((ARM_FFA_MAJOR_VERSION != CurrentMajorVersion) ||
(ARM_FFA_MINOR_VERSION > CurrentMinorVersion))
{
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",
ARM_FFA_MAJOR_VERSION,
ARM_FFA_MINOR_VERSION,
CurrentMajorVersion,
CurrentMinorVersion
));
return EFI_UNSUPPORTED;
}

return EFI_SUCCESS;
}
46 changes: 39 additions & 7 deletions MdeModulePkg/Library/ArmFfaLib/ArmFfaCommon.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,6 @@

#include <Library/ArmFfaLib.h>

extern BOOLEAN gFfaSupported;
extern UINT16 gPartId;

/**
Convert FfArgs to EFI_STATUS.

Expand All @@ -37,16 +34,21 @@ FfaArgsToEfiStatus (
);

/**
Common ArmFfaLib Constructor.
Common ArmFfaLib init.

@retval EFI_SUCCESS
@retval Others Error
@param [out] PartId PartitionId
@param [out] IsFfaSupported FF-A supported flag

@retval EFI_SUCCESS Success
@retval EFI_INVALID_PARAMETER Invalid parameter
@retval Others Error

**/
EFI_STATUS
EFIAPI
ArmFfaLibCommonInit (
IN VOID
OUT UINT16 *PartId,
OUT BOOLEAN *IsFfaSupported
);

/**
Expand Down Expand Up @@ -86,4 +88,34 @@ GetRxTxBufferMinSizeAndAlign (
OUT UINTN *MinSizeAndAlign
);

/**
Determine if FF-A is supported

@param[out] IsSupported If FF-A is supported

@retval EFI_SUCCESS FF-A is supported
@retval EFI_UNSUPPORTED FF-A isn't supported

**/
EFI_STATUS
EFIAPI
ArmFfaLibIsFfaSupported (
IN VOID
);

/**
Return partition or VM ID

@param[out] PartId The partition or VM ID

@retval EFI_SUCCESS
@retval Others Errors

**/
EFI_STATUS
EFIAPI
ArmFfaLibGetPartId (
OUT UINT16 *PartId
);

#endif
54 changes: 53 additions & 1 deletion MdeModulePkg/Library/ArmFfaLib/ArmFfaDxeLib.c
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@
#include "ArmFfaRxTxMap.h"

STATIC EFI_EVENT mFfaExitBootServiceEvent;
STATIC UINT16 mPartId;
STATIC BOOLEAN mIsFfaSupported;

/**
Unmap RX/TX buffer on Exit Boot Service.
Expand Down Expand Up @@ -78,7 +80,7 @@ ArmFfaDxeLibConstructor (
UINTN Property1;
UINTN Property2;

Status = ArmFfaLibCommonInit ();
Status = ArmFfaLibCommonInit (&mPartId, &mIsFfaSupported);
if (EFI_ERROR (Status)) {
if (Status == EFI_UNSUPPORTED) {
/*
Expand Down Expand Up @@ -194,3 +196,53 @@ ArmFfaDxeLibConstructor (

return Status;
}

/**
Return partition or VM ID

@retval EFI_SUCCESS
@retval Others Errors

**/
EFI_STATUS
EFIAPI
ArmFfaLibGetPartId (
IN UINT16 *PartId
)
{
if (PartId != NULL) {
*PartId = mPartId;
}

return EFI_SUCCESS;
}

/**
Check FF-A support or not.

@retval TRUE Supported
@retval FALSE Not supported

**/
BOOLEAN
EFIAPI
IsFfaSupported (
IN VOID
)
{
return mIsFfaSupported;
}

/**
Callback for when Unmap is called to handle any post unmap
functionality.

**/
VOID
EFIAPI
UnmapCallback (
IN VOID
)
{
// Do nothing
}
Loading