edk2/MdePkg/Include/Library/ArmFfaMemMgmtLib.h
Kun Qin a0d78f6625 MdePkg: ArmFfaMemMgmtLib: Introduce FF-A memory protocol library
This change introduced a library interface that implements the FF-A
memory protocol v1.3 ALP1:
https://developer.arm.com/documentation/den0140/f

Signed-off-by: Kun Qin <kun.qin@microsoft.com>
2025-06-26 17:38:28 +00:00

290 lines
11 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/** @file
Library definition for FF-A memory management protocol.
Copyright (c) 2020 - 2022, Arm Ltd. All rights reserved.<BR>
Copyright (c), Microsoft Corporation.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#ifndef ARM_FFA_MEM_MGMT_LIB_H_
#define ARM_FFA_MEM_MGMT_LIB_H_
#include <Uefi.h>
/**
@brief Starts a transaction to transfer of ownership of a memory region
from a Sender endpoint to a Receiver endpoint.
@param[in] TotalLength Total length of the memory transaction descriptor
in bytes
@param[in] FragmentLength Length in bytes of the memory transaction descriptor
passed in this ABI invocation
@param[in] BufferAddr Base address of a buffer allocated by the Owner and
distinct from the TX buffer
@param[in] PageCount Number of 4K pages in the buffer allocated by the
Owner and distinct from the TX buffer
@param[out] Handle Globally unique Handle to identify the memory region
upon successful transmission of the transaction descriptor.
@retval The translated FF-A error status code
**/
EFI_STATUS
EFIAPI
ArmFfaMemLibDonate (
IN UINT32 TotalLength,
IN UINT32 FragmentLength,
IN VOID *BufferAddr,
IN UINT32 PageCount,
OUT UINT64 *Handle
);
/**
@brief Starts a transaction to transfer of ownership of a memory region
from a Sender endpoint to a Receiver endpoint.
@param[in] TotalLength Total length of the memory transaction descriptor
in bytes
@param[in] FragmentLength Length in bytes of the memory transaction descriptor
passed in this ABI invocation
@param[out] Handle Globally unique Handle to identify the memory region
upon successful transmission of the transaction descriptor.
@retval The translated FF-A error status code
**/
EFI_STATUS
EFIAPI
ArmFfaMemLibDonateRxTx (
IN UINT32 TotalLength,
IN UINT32 FragmentLength,
OUT UINT64 *Handle
);
/**
@brief Starts a transaction to transfer an Owners access to a memory
region and grant access to it to one or more Borrowers.
@param[in] TotalLength Total length of the memory transaction descriptor
in bytes
@param[in] FragmentLength Length in bytes of the memory transaction
descriptor passed in this ABI invocation
@param[in] BufferAddr Base address of a buffer allocated by the Owner
and distinct from the TX buffer
@param[in] PageCount Number of 4K pages in the buffer allocated by
the Owner and distinct from the TX buffer
@param[out] Handle Globally unique Handle to identify the memory
region upon successful transmission of the
transaction descriptor.
@retval The translated FF-A error status code
**/
EFI_STATUS
EFIAPI
ArmFfaMemLibLend (
IN UINT32 TotalLength,
IN UINT32 FragmentLength,
IN VOID *BufferAddr,
IN UINT32 PageCount,
OUT UINT64 *Handle
);
/**
@brief Starts a transaction to transfer an Owners access to a memory
region and grant access to it to one or more Borrowers through
Rx/Tx buffer.
@param[in] TotalLength Total length of the memory transaction descriptor
in bytes
@param[in] FragmentLength Length in bytes of the memory transaction descriptor
passed in this ABI invocation
@param[out] Handle Globally unique Handle to identify the memory region
upon successful transmission of the transaction descriptor.
@retval The translated FF-A error status code
**/
EFI_STATUS
EFIAPI
ArmFfaMemLibLendRxTx (
IN UINT32 TotalLength,
IN UINT32 FragmentLength,
OUT UINT64 *Handle
);
/**
@brief Starts a transaction to grant access to a memory region to one or
more Borrowers.
@param[in] TotalLength Total length of the memory transaction descriptor
in bytes
@param[in] FragmentLength Length in bytes of the memory transaction descriptor
passed in this ABI invocation
@param[in] BufferAddr Base address of a buffer allocated by the Owner and
distinct from the TX buffer
@param[in] PageCount Number of 4K pages in the buffer allocated by the
Owner and distinct from the TX buffer
@param[out] Handle Globally unique Handle to identify the memory region
upon successful transmission of the transaction descriptor.
@retval The translated FF-A error status code
**/
EFI_STATUS
EFIAPI
ArmFfaMemLibShare (
IN UINT32 TotalLength,
IN UINT32 FragmentLength,
IN VOID *BufferAddr,
IN UINT32 PageCount,
OUT UINT64 *Handle
);
/**
@brief Starts a transaction to grant access to a memory region to one or
more Borrowers through Rx/Tx buffer.
@param[in] TotalLength Total length of the memory transaction descriptor
in bytes
@param[in] FragmentLength Length in bytes of the memory transaction descriptor
passed in this ABI invocation
@param[out] Handle Globally unique Handle to identify the memory region
upon successful transmission of the transaction descriptor.
@retval The translated FF-A error status code
**/
EFI_STATUS
EFIAPI
ArmFfaMemLibShareRxTx (
IN UINT32 TotalLength,
IN UINT32 FragmentLength,
OUT UINT64 *Handle
);
/**
@brief Requests completion of a donate, lend or share memory management
transaction.
@param[in] TotalLength Total length of the memory transaction descriptor
in bytes
@param[in] FragmentLength Length in bytes of the memory transaction descriptor
passed in this ABI invocation
@param[in] BufferAddr Base address of a buffer allocated by the Owner
and distinct from the TX buffer
@param[in] PageCount Number of 4K pages in the buffer allocated by
the Owner and distinct from the TX buffer
@param[out] RespTotalLength Total length of the response memory transaction
descriptor in bytes
@param[out] RespFragmentLength Length in bytes of the response memory transaction
descriptor passed in this ABI invocation
@retval The translated FF-A error status code
**/
EFI_STATUS
EFIAPI
ArmFfaMemLibRetrieveReq (
IN UINT32 TotalLength,
IN UINT32 FragmentLength,
IN VOID *BufferAddr,
IN UINT32 PageCount,
OUT UINT32 *RespTotalLength,
OUT UINT32 *RespFragmentLength
);
/**
@brief Requests completion of a donate, lend or share memory management
transaction through Rx/Tx buffer.
@param[in] TotalLength Total length of the memory transaction descriptor
in bytes
@param[in] FragmentLength Length in bytes of the memory transaction descriptor
passed in this ABI invocation
@param[out] RespTotalLength Total length of the response memory transaction
descriptor in bytes
@param[out] RespFragmentLength Length in bytes of the response memory transaction
descriptor passed in this ABI invocation
@retval The translated FF-A error status code
**/
EFI_STATUS
EFIAPI
ArmFfaMemLibRetrieveReqRxTx (
IN UINT32 TotalLength,
IN UINT32 FragmentLength,
OUT UINT32 *RespTotalLength,
OUT UINT32 *RespFragmentLength
);
/**
@brief Starts a transaction to transfer access to a shared or lent
memory region from a Borrower back to its Owner.
@retval The translated FF-A error status code
**/
EFI_STATUS
EFIAPI
ArmFfaMemLibRelinquish (
VOID
);
/**
@brief Restores exclusive access to a memory region back to its Owner.
@param[in] Handle Globally unique Handle to identify the memory region
@param[in] Flags Flags for modifying the reclaim behavior
@retval The translated FF-A error status code
**/
EFI_STATUS
EFIAPI
ArmFfaMemLibReclaim (
IN UINT64 Handle,
IN UINT32 Flags
);
/**
@brief Queries the memory attributes of a memory region. This function
can only access the regions of the SP's own translation regine.
Moreover this interface is only available in the boot phase,
i.e. before invoking FFA_MSG_WAIT interface.
@param[in] BaseAddr Base VA of a translation granule whose
permission attributes must be returned.
@param[in] PageCount Number of translation granule size pages from the
Base address whose permissions must be returned.
This is calculated as Input Page count + 1.
@param[out] MemoryPerm Permission attributes of the memory region
@retval The translated FF-A error status code
**/
EFI_STATUS
EFIAPI
ArmFfaMemLibPermGet (
IN CONST VOID *BaseAddr,
IN UINT32 PageCount,
OUT UINT32 *MemoryPerm
);
/**
@brief Sets the memory attributes of a memory regions. This function
can only access the regions of the SP's own translation regine.
Moreover this interface is only available in the boot phase,
i.e. before invoking FFA_MSG_WAIT interface.
@param[in] BaseAddr Base VA of a memory region whose permission
attributes must be set.
@param[in] PageCount Number of translation granule size pages
starting from the Base address whose permissions
must be set.
@param[in] MemoryPerm Permission attributes to be set for the memory
region.
@retval The translated FF-A error status code
**/
EFI_STATUS
EFIAPI
ArmFfaMemLibPermSet (
IN CONST VOID *BaseAddr,
IN UINT32 PageCount,
IN UINT32 MemoryPerm
);
#endif // ARM_FFA_MEM_MGMT_LIB_H_