| /* |
| * Copyright (C) 2010-2013 ARM Limited. All rights reserved. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /** |
| * @file ump.h |
| * |
| * This file contains the user space part of the UMP API. |
| */ |
| |
| #ifndef _UNIFIED_MEMORY_PROVIDER_H_ |
| #define _UNIFIED_MEMORY_PROVIDER_H_ |
| |
| |
| /** @defgroup ump_user_space_api UMP User Space API |
| * @{ */ |
| |
| |
| #include "ump_platform.h" |
| |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| |
| /** |
| * External representation of a UMP handle in user space. |
| */ |
| typedef void * ump_handle; |
| |
| /** |
| * Typedef for a secure ID, a system wide identificator for UMP memory buffers. |
| */ |
| typedef unsigned int ump_secure_id; |
| |
| /** |
| * Value to indicate an invalid UMP memory handle. |
| */ |
| #define UMP_INVALID_MEMORY_HANDLE ((ump_handle)0) |
| |
| /** |
| * Value to indicate an invalid secure Id. |
| */ |
| #define UMP_INVALID_SECURE_ID ((ump_secure_id)-1) |
| |
| /** |
| * UMP error codes for user space. |
| */ |
| typedef enum |
| { |
| UMP_OK = 0, /**< indicates success */ |
| UMP_ERROR, /**< indicates failure */ |
| } ump_result; |
| |
| |
| /** |
| * Opens and initializes the UMP library. |
| * |
| * This function must be called at least once before calling any other UMP API functions. |
| * Each open is reference counted and must be matched with a call to @ref ump_close "ump_close". |
| * |
| * @see ump_close |
| * |
| * @return UMP_OK indicates success, UMP_ERROR indicates failure. |
| */ |
| UMP_API_EXPORT ump_result ump_open(void); |
| |
| |
| /** |
| * Terminate the UMP library. |
| * |
| * This must be called once for every successful @ref ump_open "ump_open". The UMP library is |
| * terminated when, and only when, the last open reference to the UMP interface is closed. |
| * |
| * @see ump_open |
| */ |
| UMP_API_EXPORT void ump_close(void); |
| |
| |
| /** |
| * Retrieves the secure ID for the specified UMP memory. |
| * |
| * This identificator is unique across the entire system, and uniquely identifies |
| * the specified UMP memory. This identificator can later be used through the |
| * @ref ump_handle_create_from_secure_id "ump_handle_create_from_secure_id" or |
| * @ref ump_dd_handle_create_from_secure_id "ump_dd_handle_create_from_secure_id" |
| * functions in order to access this UMP memory, for instance from another process. |
| * |
| * @note There is a kernel space equivalent function called @ref ump_dd_secure_id_get "ump_dd_secure_id_get" |
| * |
| * @see ump_handle_create_from_secure_id |
| * @see ump_dd_handle_create_from_secure_id |
| * @see ump_dd_secure_id_get |
| * |
| * @param mem Handle to UMP memory. |
| * |
| * @return Returns the secure ID for the specified UMP memory. |
| */ |
| UMP_API_EXPORT ump_secure_id ump_secure_id_get(ump_handle mem); |
| |
| |
| /** |
| * Retrieves a handle to allocated UMP memory. |
| * |
| * The usage of UMP memory is reference counted, so this will increment the reference |
| * count by one for the specified UMP memory. |
| * Use @ref ump_reference_release "ump_reference_release" when there is no longer any |
| * use for the retrieved handle. |
| * |
| * @note There is a kernel space equivalent function called @ref ump_dd_handle_create_from_secure_id "ump_dd_handle_create_from_secure_id" |
| * |
| * @see ump_reference_release |
| * @see ump_dd_handle_create_from_secure_id |
| * |
| * @param secure_id The secure ID of the UMP memory to open, that can be retrieved using the @ref ump_secure_id_get "ump_secure_id_get " function. |
| * |
| * @return UMP_INVALID_MEMORY_HANDLE indicates failure, otherwise a valid handle is returned. |
| */ |
| UMP_API_EXPORT ump_handle ump_handle_create_from_secure_id(ump_secure_id secure_id); |
| |
| |
| /** |
| * Retrieves the actual size of the specified UMP memory. |
| * |
| * The size is reported in bytes, and is typically page aligned. |
| * |
| * @note There is a kernel space equivalent function called @ref ump_dd_size_get "ump_dd_size_get" |
| * |
| * @see ump_dd_size_get |
| * |
| * @param mem Handle to UMP memory. |
| * |
| * @return Returns the allocated size of the specified UMP memory, in bytes. |
| */ |
| UMP_API_EXPORT unsigned long ump_size_get(ump_handle mem); |
| |
| |
| /** |
| * Read from specified UMP memory. |
| * |
| * Another way of reading from (and writing to) UMP memory is to use the |
| * @ref ump_mapped_pointer_get "ump_mapped_pointer_get" to retrieve |
| * a CPU mapped pointer to the memory. |
| * |
| * @see ump_mapped_pointer_get |
| * |
| * @param dst Destination buffer. |
| * @param src Handle to UMP memory to read from. |
| * @param offset Where to start reading, given in bytes. |
| * @param length How much to read, given in bytes. |
| */ |
| UMP_API_EXPORT void ump_read(void * dst, ump_handle src, unsigned long offset, unsigned long length); |
| |
| |
| /** |
| * Write to specified UMP memory. |
| * |
| * Another way of writing to (and reading from) UMP memory is to use the |
| * @ref ump_mapped_pointer_get "ump_mapped_pointer_get" to retrieve |
| * a CPU mapped pointer to the memory. |
| * |
| * @see ump_mapped_pointer_get |
| * |
| * @param dst Handle to UMP memory to write to. |
| * @param offset Where to start writing, given in bytes. |
| * @param src Buffer to read from. |
| * @param length How much to write, given in bytes. |
| */ |
| UMP_API_EXPORT void ump_write(ump_handle dst, unsigned long offset, const void * src, unsigned long length); |
| |
| |
| /** |
| * Retrieves a memory mapped pointer to the specified UMP memory. |
| * |
| * This function retrieves a memory mapped pointer to the specified UMP memory, |
| * that can be used by the CPU. Every successful call to |
| * @ref ump_mapped_pointer_get "ump_mapped_pointer_get" is reference counted, |
| * and must therefore be followed by a call to |
| * @ref ump_mapped_pointer_release "ump_mapped_pointer_release " when the |
| * memory mapping is no longer needed. |
| * |
| * @note Systems without a MMU for the CPU only return the physical address, because no mapping is required. |
| * |
| * @see ump_mapped_pointer_release |
| * |
| * @param mem Handle to UMP memory. |
| * |
| * @return NULL indicates failure, otherwise a CPU mapped pointer is returned. |
| */ |
| UMP_API_EXPORT void * ump_mapped_pointer_get(ump_handle mem); |
| |
| |
| /** |
| * Releases a previously mapped pointer to the specified UMP memory. |
| * |
| * The CPU mapping of the specified UMP memory memory is reference counted, |
| * so every call to @ref ump_mapped_pointer_get "ump_mapped_pointer_get" must |
| * be matched with a call to this function when the mapping is no longer needed. |
| * |
| * The CPU mapping is not removed before all references to the mapping is released. |
| * |
| * @note Systems without a MMU must still implement this function, even though no unmapping should be needed. |
| * |
| * @param mem Handle to UMP memory. |
| */ |
| UMP_API_EXPORT void ump_mapped_pointer_release(ump_handle mem); |
| |
| |
| /** |
| * Adds an extra reference to the specified UMP memory. |
| * |
| * This function adds an extra reference to the specified UMP memory. This function should |
| * be used every time a UMP memory handle is duplicated, that is, assigned to another ump_handle |
| * variable. The function @ref ump_reference_release "ump_reference_release" must then be used |
| * to release each copy of the UMP memory handle. |
| * |
| * @note You are not required to call @ref ump_reference_add "ump_reference_add" |
| * for UMP handles returned from |
| * @ref ump_handle_create_from_secure_id "ump_handle_create_from_secure_id", |
| * because these handles are already reference counted by this function. |
| * |
| * @note There is a kernel space equivalent function called @ref ump_dd_reference_add "ump_dd_reference_add" |
| * |
| * @see ump_dd_reference_add |
| * |
| * @param mem Handle to UMP memory. |
| */ |
| UMP_API_EXPORT void ump_reference_add(ump_handle mem); |
| |
| |
| /** |
| * Releases a reference from the specified UMP memory. |
| * |
| * This function should be called once for every reference to the UMP memory handle. |
| * When the last reference is released, all resources associated with this UMP memory |
| * handle are freed. |
| * |
| * @note There is a kernel space equivalent function called @ref ump_dd_reference_release "ump_dd_reference_release" |
| * |
| * @see ump_dd_reference_release |
| * |
| * @param mem Handle to UMP memory. |
| */ |
| UMP_API_EXPORT void ump_reference_release(ump_handle mem); |
| |
| |
| #ifdef __cplusplus |
| } |
| #endif |
| |
| |
| /** @} */ /* end group ump_user_space_api */ |
| |
| |
| #endif /*_UNIFIED_MEMORY_PROVIDER_H_ */ |