/** @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_