ion.h revision 349c9e13855109df99c5205a4e8d53d9fa169490
1/* 2 * drivers/staging/android/ion/ion.h 3 * 4 * Copyright (C) 2011 Google, Inc. 5 * 6 * This software is licensed under the terms of the GNU General Public 7 * License version 2, as published by the Free Software Foundation, and 8 * may be copied, distributed, and modified under those terms. 9 * 10 * This program is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * GNU General Public License for more details. 14 * 15 */ 16 17#ifndef _LINUX_ION_H 18#define _LINUX_ION_H 19 20#include <linux/types.h> 21 22struct ion_handle; 23/** 24 * enum ion_heap_types - list of all possible types of heaps 25 * @ION_HEAP_TYPE_SYSTEM: memory allocated via vmalloc 26 * @ION_HEAP_TYPE_SYSTEM_CONTIG: memory allocated via kmalloc 27 * @ION_HEAP_TYPE_CARVEOUT: memory allocated from a prereserved 28 * carveout heap, allocations are physically 29 * contiguous 30 * @ION_HEAP_TYPE_DMA: memory allocated via DMA API 31 * @ION_NUM_HEAPS: helper for iterating over heaps, a bit mask 32 * is used to identify the heaps, so only 32 33 * total heap types are supported 34 */ 35enum ion_heap_type { 36 ION_HEAP_TYPE_SYSTEM, 37 ION_HEAP_TYPE_SYSTEM_CONTIG, 38 ION_HEAP_TYPE_CARVEOUT, 39 ION_HEAP_TYPE_CHUNK, 40 ION_HEAP_TYPE_DMA, 41 ION_HEAP_TYPE_CUSTOM, /* must be last so device specific heaps always 42 are at the end of this enum */ 43 ION_NUM_HEAPS, 44}; 45 46#define ION_HEAP_SYSTEM_MASK (1 << ION_HEAP_TYPE_SYSTEM) 47#define ION_HEAP_SYSTEM_CONTIG_MASK (1 << ION_HEAP_TYPE_SYSTEM_CONTIG) 48#define ION_HEAP_CARVEOUT_MASK (1 << ION_HEAP_TYPE_CARVEOUT) 49#define ION_HEAP_TYPE_DMA_MASK (1 << ION_HEAP_TYPE_DMA) 50 51#define ION_NUM_HEAP_IDS sizeof(unsigned int) * 8 52 53/** 54 * allocation flags - the lower 16 bits are used by core ion, the upper 16 55 * bits are reserved for use by the heaps themselves. 56 */ 57#define ION_FLAG_CACHED 1 /* mappings of this buffer should be 58 cached, ion will do cache 59 maintenance when the buffer is 60 mapped for dma */ 61#define ION_FLAG_CACHED_NEEDS_SYNC 2 /* mappings of this buffer will created 62 at mmap time, if this is set 63 caches must be managed manually */ 64 65#ifdef __KERNEL__ 66struct ion_device; 67struct ion_heap; 68struct ion_mapper; 69struct ion_client; 70struct ion_buffer; 71 72/* This should be removed some day when phys_addr_t's are fully 73 plumbed in the kernel, and all instances of ion_phys_addr_t should 74 be converted to phys_addr_t. For the time being many kernel interfaces 75 do not accept phys_addr_t's that would have to */ 76#define ion_phys_addr_t unsigned long 77 78/** 79 * struct ion_platform_heap - defines a heap in the given platform 80 * @type: type of the heap from ion_heap_type enum 81 * @id: unique identifier for heap. When allocating higher numbers 82 * will be allocated from first. At allocation these are passed 83 * as a bit mask and therefore can not exceed ION_NUM_HEAP_IDS. 84 * @name: used for debug purposes 85 * @base: base address of heap in physical memory if applicable 86 * @size: size of the heap in bytes if applicable 87 * @align: required alignment in physical memory if applicable 88 * @priv: private info passed from the board file 89 * 90 * Provided by the board file. 91 */ 92struct ion_platform_heap { 93 enum ion_heap_type type; 94 unsigned int id; 95 const char *name; 96 ion_phys_addr_t base; 97 size_t size; 98 ion_phys_addr_t align; 99 void *priv; 100}; 101 102/** 103 * struct ion_platform_data - array of platform heaps passed from board file 104 * @nr: number of structures in the array 105 * @heaps: array of platform_heap structions 106 * 107 * Provided by the board file in the form of platform data to a platform device. 108 */ 109struct ion_platform_data { 110 int nr; 111 struct ion_platform_heap *heaps; 112}; 113 114/** 115 * ion_reserve() - reserve memory for ion heaps if applicable 116 * @data: platform data specifying starting physical address and 117 * size 118 * 119 * Calls memblock reserve to set aside memory for heaps that are 120 * located at specific memory addresses or of specfic sizes not 121 * managed by the kernel 122 */ 123void ion_reserve(struct ion_platform_data *data); 124 125/** 126 * ion_client_create() - allocate a client and returns it 127 * @dev: the global ion device 128 * @heap_type_mask: mask of heaps this client can allocate from 129 * @name: used for debugging 130 */ 131struct ion_client *ion_client_create(struct ion_device *dev, 132 const char *name); 133 134/** 135 * ion_client_destroy() - free's a client and all it's handles 136 * @client: the client 137 * 138 * Free the provided client and all it's resources including 139 * any handles it is holding. 140 */ 141void ion_client_destroy(struct ion_client *client); 142 143/** 144 * ion_alloc - allocate ion memory 145 * @client: the client 146 * @len: size of the allocation 147 * @align: requested allocation alignment, lots of hardware blocks 148 * have alignment requirements of some kind 149 * @heap_id_mask: mask of heaps to allocate from, if multiple bits are set 150 * heaps will be tried in order from highest to lowest 151 * id 152 * @flags: heap flags, the low 16 bits are consumed by ion, the 153 * high 16 bits are passed on to the respective heap and 154 * can be heap custom 155 * 156 * Allocate memory in one of the heaps provided in heap mask and return 157 * an opaque handle to it. 158 */ 159struct ion_handle *ion_alloc(struct ion_client *client, size_t len, 160 size_t align, unsigned int heap_id_mask, 161 unsigned int flags); 162 163/** 164 * ion_free - free a handle 165 * @client: the client 166 * @handle: the handle to free 167 * 168 * Free the provided handle. 169 */ 170void ion_free(struct ion_client *client, struct ion_handle *handle); 171 172/** 173 * ion_phys - returns the physical address and len of a handle 174 * @client: the client 175 * @handle: the handle 176 * @addr: a pointer to put the address in 177 * @len: a pointer to put the length in 178 * 179 * This function queries the heap for a particular handle to get the 180 * handle's physical address. It't output is only correct if 181 * a heap returns physically contiguous memory -- in other cases 182 * this api should not be implemented -- ion_sg_table should be used 183 * instead. Returns -EINVAL if the handle is invalid. This has 184 * no implications on the reference counting of the handle -- 185 * the returned value may not be valid if the caller is not 186 * holding a reference. 187 */ 188int ion_phys(struct ion_client *client, struct ion_handle *handle, 189 ion_phys_addr_t *addr, size_t *len); 190 191/** 192 * ion_map_dma - return an sg_table describing a handle 193 * @client: the client 194 * @handle: the handle 195 * 196 * This function returns the sg_table describing 197 * a particular ion handle. 198 */ 199struct sg_table *ion_sg_table(struct ion_client *client, 200 struct ion_handle *handle); 201 202/** 203 * ion_map_kernel - create mapping for the given handle 204 * @client: the client 205 * @handle: handle to map 206 * 207 * Map the given handle into the kernel and return a kernel address that 208 * can be used to access this address. 209 */ 210void *ion_map_kernel(struct ion_client *client, struct ion_handle *handle); 211 212/** 213 * ion_unmap_kernel() - destroy a kernel mapping for a handle 214 * @client: the client 215 * @handle: handle to unmap 216 */ 217void ion_unmap_kernel(struct ion_client *client, struct ion_handle *handle); 218 219/** 220 * ion_share_dma_buf() - share buffer as dma-buf 221 * @client: the client 222 * @handle: the handle 223 */ 224struct dma_buf *ion_share_dma_buf(struct ion_client *client, 225 struct ion_handle *handle); 226 227/** 228 * ion_share_dma_buf_fd() - given an ion client, create a dma-buf fd 229 * @client: the client 230 * @handle: the handle 231 */ 232int ion_share_dma_buf_fd(struct ion_client *client, struct ion_handle *handle); 233 234/** 235 * ion_import_dma_buf() - given an dma-buf fd from the ion exporter get handle 236 * @client: the client 237 * @fd: the dma-buf fd 238 * 239 * Given an dma-buf fd that was allocated through ion via ion_share_dma_buf, 240 * import that fd and return a handle representing it. If a dma-buf from 241 * another exporter is passed in this function will return ERR_PTR(-EINVAL) 242 */ 243struct ion_handle *ion_import_dma_buf(struct ion_client *client, int fd); 244 245#endif /* __KERNEL__ */ 246 247/** 248 * DOC: Ion Userspace API 249 * 250 * create a client by opening /dev/ion 251 * most operations handled via following ioctls 252 * 253 */ 254 255/** 256 * struct ion_allocation_data - metadata passed from userspace for allocations 257 * @len: size of the allocation 258 * @align: required alignment of the allocation 259 * @heap_id_mask: mask of heap ids to allocate from 260 * @flags: flags passed to heap 261 * @handle: pointer that will be populated with a cookie to use to 262 * refer to this allocation 263 * 264 * Provided by userspace as an argument to the ioctl 265 */ 266struct ion_allocation_data { 267 size_t len; 268 size_t align; 269 unsigned int heap_id_mask; 270 unsigned int flags; 271 struct ion_handle *handle; 272}; 273 274/** 275 * struct ion_fd_data - metadata passed to/from userspace for a handle/fd pair 276 * @handle: a handle 277 * @fd: a file descriptor representing that handle 278 * 279 * For ION_IOC_SHARE or ION_IOC_MAP userspace populates the handle field with 280 * the handle returned from ion alloc, and the kernel returns the file 281 * descriptor to share or map in the fd field. For ION_IOC_IMPORT, userspace 282 * provides the file descriptor and the kernel returns the handle. 283 */ 284struct ion_fd_data { 285 struct ion_handle *handle; 286 int fd; 287}; 288 289/** 290 * struct ion_handle_data - a handle passed to/from the kernel 291 * @handle: a handle 292 */ 293struct ion_handle_data { 294 struct ion_handle *handle; 295}; 296 297/** 298 * struct ion_custom_data - metadata passed to/from userspace for a custom ioctl 299 * @cmd: the custom ioctl function to call 300 * @arg: additional data to pass to the custom ioctl, typically a user 301 * pointer to a predefined structure 302 * 303 * This works just like the regular cmd and arg fields of an ioctl. 304 */ 305struct ion_custom_data { 306 unsigned int cmd; 307 unsigned long arg; 308}; 309 310#define ION_IOC_MAGIC 'I' 311 312/** 313 * DOC: ION_IOC_ALLOC - allocate memory 314 * 315 * Takes an ion_allocation_data struct and returns it with the handle field 316 * populated with the opaque handle for the allocation. 317 */ 318#define ION_IOC_ALLOC _IOWR(ION_IOC_MAGIC, 0, \ 319 struct ion_allocation_data) 320 321/** 322 * DOC: ION_IOC_FREE - free memory 323 * 324 * Takes an ion_handle_data struct and frees the handle. 325 */ 326#define ION_IOC_FREE _IOWR(ION_IOC_MAGIC, 1, struct ion_handle_data) 327 328/** 329 * DOC: ION_IOC_MAP - get a file descriptor to mmap 330 * 331 * Takes an ion_fd_data struct with the handle field populated with a valid 332 * opaque handle. Returns the struct with the fd field set to a file 333 * descriptor open in the current address space. This file descriptor 334 * can then be used as an argument to mmap. 335 */ 336#define ION_IOC_MAP _IOWR(ION_IOC_MAGIC, 2, struct ion_fd_data) 337 338/** 339 * DOC: ION_IOC_SHARE - creates a file descriptor to use to share an allocation 340 * 341 * Takes an ion_fd_data struct with the handle field populated with a valid 342 * opaque handle. Returns the struct with the fd field set to a file 343 * descriptor open in the current address space. This file descriptor 344 * can then be passed to another process. The corresponding opaque handle can 345 * be retrieved via ION_IOC_IMPORT. 346 */ 347#define ION_IOC_SHARE _IOWR(ION_IOC_MAGIC, 4, struct ion_fd_data) 348 349/** 350 * DOC: ION_IOC_IMPORT - imports a shared file descriptor 351 * 352 * Takes an ion_fd_data struct with the fd field populated with a valid file 353 * descriptor obtained from ION_IOC_SHARE and returns the struct with the handle 354 * filed set to the corresponding opaque handle. 355 */ 356#define ION_IOC_IMPORT _IOWR(ION_IOC_MAGIC, 5, struct ion_fd_data) 357 358/** 359 * DOC: ION_IOC_SYNC - syncs a shared file descriptors to memory 360 * 361 * Deprecated in favor of using the dma_buf api's correctly (syncing 362 * will happend automatically when the buffer is mapped to a device). 363 * If necessary should be used after touching a cached buffer from the cpu, 364 * this will make the buffer in memory coherent. 365 */ 366#define ION_IOC_SYNC _IOWR(ION_IOC_MAGIC, 7, struct ion_fd_data) 367 368/** 369 * DOC: ION_IOC_CUSTOM - call architecture specific ion ioctl 370 * 371 * Takes the argument of the architecture specific ioctl to call and 372 * passes appropriate userdata for that ioctl 373 */ 374#define ION_IOC_CUSTOM _IOWR(ION_IOC_MAGIC, 6, struct ion_custom_data) 375 376#endif /* _LINUX_ION_H */ 377