1 /* 2 * Copyright (C) 2010, 2012-2014, 2016-2017 ARM Limited. All rights reserved. 3 * 4 * This program is free software and is provided to you under the terms of the GNU General Public License version 2 5 * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. 6 * 7 * A copy of the licence is included with the program, and can also be obtained from Free Software 8 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 9 */ 10 11 /** 12 * @file ump_uk_types.h 13 * Defines the types and constants used in the user-kernel interface 14 */ 15 16 #ifndef __UMP_UK_TYPES_H__ 17 #define __UMP_UK_TYPES_H__ 18 19 #ifdef __cplusplus 20 extern "C" { 21 #endif 22 23 /* Helpers for API version handling */ 24 #define MAKE_VERSION_ID(x) (((x) << 16UL) | (x)) 25 #define IS_VERSION_ID(x) (((x) & 0xFFFF) == (((x) >> 16UL) & 0xFFFF)) 26 #define GET_VERSION(x) (((x) >> 16UL) & 0xFFFF) 27 #define IS_API_MATCH(x, y) (IS_VERSION_ID((x)) && IS_VERSION_ID((y)) && (GET_VERSION((x)) == GET_VERSION((y)))) 28 29 /** 30 * API version define. 31 * Indicates the version of the kernel API 32 * The version is a 16bit integer incremented on each API change. 33 * The 16bit integer is stored twice in a 32bit integer 34 * So for version 1 the value would be 0x00010001 35 */ 36 #define UMP_IOCTL_API_VERSION MAKE_VERSION_ID(3) 37 38 typedef enum 39 { 40 _UMP_IOC_QUERY_API_VERSION = 1, 41 _UMP_IOC_ALLOCATE, 42 _UMP_IOC_RELEASE, 43 _UMP_IOC_SIZE_GET, 44 _UMP_IOC_MAP_MEM, /* not used in Linux */ 45 _UMP_IOC_UNMAP_MEM, /* not used in Linux */ 46 _UMP_IOC_MSYNC, 47 _UMP_IOC_CACHE_OPERATIONS_CONTROL, 48 _UMP_IOC_SWITCH_HW_USAGE, 49 _UMP_IOC_LOCK, 50 _UMP_IOC_UNLOCK, 51 _UMP_IOC_DMABUF_IMPORT, 52 } _ump_uk_functions; 53 54 typedef enum 55 { 56 UMP_REF_DRV_UK_CONSTRAINT_NONE = 0, 57 UMP_REF_DRV_UK_CONSTRAINT_PHYSICALLY_LINEAR = 1, 58 UMP_REF_DRV_UK_CONSTRAINT_USE_CACHE = 4, 59 } ump_uk_alloc_constraints; 60 61 typedef enum 62 { 63 _UMP_UK_MSYNC_CLEAN = 0, 64 _UMP_UK_MSYNC_CLEAN_AND_INVALIDATE = 1, 65 _UMP_UK_MSYNC_INVALIDATE = 2, 66 _UMP_UK_MSYNC_FLUSH_L1 = 3, 67 _UMP_UK_MSYNC_READOUT_CACHE_ENABLED = 128, 68 } ump_uk_msync_op; 69 70 typedef enum 71 { 72 _UMP_UK_CACHE_OP_START = 0, 73 _UMP_UK_CACHE_OP_FINISH = 1, 74 } ump_uk_cache_op_control; 75 76 typedef enum 77 { 78 _UMP_UK_READ = 1, 79 _UMP_UK_READ_WRITE = 3, 80 } ump_uk_lock_usage; 81 82 typedef enum 83 { 84 _UMP_UK_USED_BY_CPU = 0, 85 _UMP_UK_USED_BY_MALI = 1, 86 _UMP_UK_USED_BY_UNKNOWN_DEVICE = 100, 87 } ump_uk_user; 88 89 /** 90 * Get API version ([in,out] u32 api_version, [out] u32 compatible) 91 */ 92 typedef struct _ump_uk_api_version_s 93 { 94 void *ctx; /**< [in,out] user-kernel context (trashed on output) */ 95 u32 version; /**< Set to the user space version on entry, stores the device driver version on exit */ 96 u32 compatible; /**< Non-null if the device is compatible with the client */ 97 } _ump_uk_api_version_s; 98 99 /** 100 * ALLOCATE ([out] u32 secure_id, [in,out] u32 size, [in] contraints) 101 */ 102 typedef struct _ump_uk_allocate_s 103 { 104 void *ctx; /**< [in,out] user-kernel context (trashed on output) */ 105 u32 secure_id; /**< Return value from DD to Userdriver */ 106 u32 size; /**< Input and output. Requested size; input. Returned size; output */ 107 ump_uk_alloc_constraints constraints; /**< Only input to Devicedriver */ 108 } _ump_uk_allocate_s; 109 110 /** 111 * SIZE_GET ([in] u32 secure_id, [out]size ) 112 */ 113 typedef struct _ump_uk_size_get_s 114 { 115 void *ctx; /**< [in,out] user-kernel context (trashed on output) */ 116 u32 secure_id; /**< Input to DD */ 117 u32 size; /**< Returned size; output */ 118 } _ump_uk_size_get_s; 119 120 /** 121 * Release ([in] u32 secure_id) 122 */ 123 typedef struct _ump_uk_release_s 124 { 125 void *ctx; /**< [in,out] user-kernel context (trashed on output) */ 126 u32 secure_id; /**< Input to DD */ 127 } _ump_uk_release_s; 128 129 typedef struct _ump_uk_map_mem_s 130 { 131 void *ctx; /**< [in,out] user-kernel context (trashed on output) */ 132 void *mapping; /**< [out] Returns user-space virtual address for the mapping */ 133 void *phys_addr; /**< [in] physical address */ 134 unsigned long size; /**< [in] size */ 135 u32 secure_id; /**< [in] secure_id to assign to mapping */ 136 void *_ukk_private; /**< Only used inside linux port between kernel frontend and common part to store vma */ 137 u32 cookie; 138 u32 is_cached; /**< [in,out] caching of CPU mappings */ 139 } _ump_uk_map_mem_s; 140 141 typedef struct _ump_uk_unmap_mem_s 142 { 143 void *ctx; /**< [in,out] user-kernel context (trashed on output) */ 144 void *mapping; 145 u32 size; 146 void *_ukk_private; 147 u32 cookie; 148 } _ump_uk_unmap_mem_s; 149 150 typedef struct _ump_uk_msync_s 151 { 152 void *ctx; /**< [in,out] user-kernel context (trashed on output) */ 153 void *mapping; /**< [in] mapping addr */ 154 void *address; /**< [in] flush start addr */ 155 u32 size; /**< [in] size to flush */ 156 ump_uk_msync_op op; /**< [in] flush operation */ 157 u32 cookie; /**< [in] cookie stored with reference to the kernel mapping internals */ 158 u32 secure_id; /**< [in] secure_id that identifies the ump buffer */ 159 u32 is_cached; /**< [out] caching of CPU mappings */ 160 } _ump_uk_msync_s; 161 162 typedef struct _ump_uk_cache_operations_control_s 163 { 164 void *ctx; /**< [in,out] user-kernel context (trashed on output) */ 165 ump_uk_cache_op_control op; /**< [in] cache operations start/stop */ 166 } _ump_uk_cache_operations_control_s; 167 168 169 typedef struct _ump_uk_switch_hw_usage_s 170 { 171 void *ctx; /**< [in,out] user-kernel context (trashed on output) */ 172 u32 secure_id; /**< [in] secure_id that identifies the ump buffer */ 173 ump_uk_user new_user; /**< [in] cookie stored with reference to the kernel mapping internals */ 174 175 } _ump_uk_switch_hw_usage_s; 176 177 typedef struct _ump_uk_lock_s 178 { 179 void *ctx; /**< [in,out] user-kernel context (trashed on output) */ 180 u32 secure_id; /**< [in] secure_id that identifies the ump buffer */ 181 ump_uk_lock_usage lock_usage; 182 } _ump_uk_lock_s; 183 184 typedef struct _ump_uk_unlock_s 185 { 186 void *ctx; /**< [in,out] user-kernel context (trashed on output) */ 187 u32 secure_id; /**< [in] secure_id that identifies the ump buffer */ 188 } _ump_uk_unlock_s; 189 190 typedef struct _ump_uk_dmabuf_s 191 { 192 void *ctx; /**< [in,out] user-kernel context (trashed on output) */ 193 int fd; /**< [in] dmabuf_fd that identifies the dmabuf buffer */ 194 size_t size; /**< [in] size of the buffer */ 195 u32 secure_id; /**< [out] secure_id that identifies the ump buffer */ 196 } _ump_uk_dmabuf_s; 197 198 #ifdef __cplusplus 199 } 200 #endif 201 202 #endif /* __UMP_UK_TYPES_H__ */ 203