/** @file
Library definition for FF-A memory management protocol.
Copyright (c) 2020 - 2022, Arm Ltd. All rights reserved.
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
/**
@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 Owner’s 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 Owner’s 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_