/* * * (C) COPYRIGHT 2008-2013 ARM Limited. All rights reserved. * * This program is free software and is provided to you under the terms of the * GNU General Public License version 2 as published by the Free Software * Foundation, and any use by you of this program is subject to the terms * of such GNU licence. * * A copy of the licence is included with the program, and can also be obtained * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * */ #ifndef _UMP_IOCTL_H_ #define _UMP_IOCTL_H #include /* * The order and size of the members of these have been chosen so the structures look the same in 32-bit and 64-bit builds. * If any changes are done build the ump_struct_size_checker test for 32-bit and 64-bit targets. Both must compile successfully to commit. */ /** 32/64-bit neutral way to represent pointers */ typedef union ump_pointer { void * value; /**< client should store their pointers here */ uint32_t compat_value; /**< 64-bit kernels should fetch value here when handling 32-bit clients */ uint64_t sizer; /**< Force 64-bit storage for all clients regardless */ } ump_pointer; /** * UMP allocation request. * Used when performing ump_allocate */ typedef struct ump_k_allocate { uint64_t size; /**< [in] Size in bytes to allocate */ ump_secure_id secure_id; /**< [out] Secure ID of allocation on success */ ump_alloc_flags alloc_flags; /**< [in] Flags to use when allocating */ } ump_k_allocate; /** * UMP size query request. * Used when performing ump_size_get */ typedef struct ump_k_sizequery { uint64_t size; /**< [out] Size of allocation */ ump_secure_id secure_id; /**< [in] ID of allocation to query the size of */ uint32_t padding; /* don't remove */ } ump_k_sizequery; /** * UMP cache synchronization request. * Used when performing ump_cpu_msync_now */ typedef struct ump_k_msync { ump_pointer mapped_ptr; /**< [in] CPU VA to perform cache operation on */ ump_secure_id secure_id; /**< [in] ID of allocation to perform cache operation on */ ump_cpu_msync_op cache_operation; /**< [in] Cache operation to perform */ uint64_t size; /**< [in] Size in bytes of the range to synchronize */ } ump_k_msync; /** * UMP memory retain request. * Used when performing ump_retain */ typedef struct ump_k_retain { ump_secure_id secure_id; /**< [in] ID of allocation to retain a reference to */ uint32_t padding; /* don't remove */ } ump_k_retain; /** * UMP memory release request. * Used when performing ump_release */ typedef struct ump_k_release { ump_secure_id secure_id; /**< [in] ID of allocation to release a reference to */ uint32_t padding; /* don't remove */ } ump_k_release; typedef struct ump_k_import { ump_pointer phandle; /**< [in] Pointer to handle to import */ uint32_t type; /**< [in] Type of handle to import */ ump_alloc_flags alloc_flags; /**< [in] Flags to assign to the imported memory */ ump_secure_id secure_id; /**< [out] UMP ID representing the imported memory */ uint32_t padding; /* don't remove */ } ump_k_import; /** * UMP allocation flags request. * Used when performing umpp_get_allocation_flags * * used only by v1 API */ typedef struct ump_k_allocation_flags { ump_secure_id secure_id; /**< [in] Secure ID of allocation on success */ ump_alloc_flags alloc_flags; /**< [out] Flags to use when allocating */ } ump_k_allocation_flags; #define UMP_CALL_MAX_SIZE 512 /* * Ioctl definitions */ /* Use '~' as magic number */ #define UMP_IOC_MAGIC '~' #define UMP_FUNC_ALLOCATE _IOWR(UMP_IOC_MAGIC, 1, ump_k_allocate) #define UMP_FUNC_SIZEQUERY _IOWR(UMP_IOC_MAGIC, 2, ump_k_sizequery) #define UMP_FUNC_MSYNC _IOWR(UMP_IOC_MAGIC, 3, ump_k_msync) #define UMP_FUNC_RETAIN _IOW(UMP_IOC_MAGIC, 4, ump_k_retain) #define UMP_FUNC_RELEASE _IOW(UMP_IOC_MAGIC, 5, ump_k_release) #define UMP_FUNC_ALLOCATION_FLAGS_GET _IOWR(UMP_IOC_MAGIC, 6, ump_k_allocation_flags) #define UMP_FUNC_IMPORT _IOWR(UMP_IOC_MAGIC, 7, ump_k_import) /*max ioctl sequential number*/ #define UMP_IOC_MAXNR 7 /* 15 bits for the UMP ID (allowing 32768 IDs) */ #define UMP_LINUX_ID_BITS 15 #define UMP_LINUX_ID_MASK ((1ULL << UMP_LINUX_ID_BITS) - 1ULL) /* 64-bit (really 52 bits) encoding: 15 bits for the ID, 37 bits for the offset */ #define UMP_LINUX_OFFSET_BITS_64 37 #define UMP_LINUX_OFFSET_MASK_64 ((1ULL << UMP_LINUX_OFFSET_BITS_64)-1) /* 32-bit encoding: 15 bits for the ID, 17 bits for the offset */ #define UMP_LINUX_OFFSET_BITS_32 17 #define UMP_LINUX_OFFSET_MASK_32 ((1ULL << UMP_LINUX_OFFSET_BITS_32)-1) #if __SIZEOF_LONG__ == 8 #define UMP_LINUX_OFFSET_BITS UMP_LINUX_OFFSET_BITS_64 #define UMP_LINUX_OFFSET_MASK UMP_LINUX_OFFSET_MASK_64 #else #define UMP_LINUX_OFFSET_BITS UMP_LINUX_OFFSET_BITS_32 #define UMP_LINUX_OFFSET_MASK UMP_LINUX_OFFSET_MASK_32 #endif #endif /* _UMP_IOCTL_H_ */