1 /* 2 * include/linux/ion.h 3 * 4 * Copyright (C) 2011 Google, Inc. 5 * Copyright (c) 2011-2012, The Linux Foundation. All rights reserved. 6 * 7 * This software is licensed under the terms of the GNU General Public 8 * License version 2, as published by the Free Software Foundation, and 9 * may be copied, distributed, and modified under those terms. 10 * 11 * This program is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 * GNU General Public License for more details. 15 * 16 */ 17 18 #ifndef _LINUX_ION_H 19 #define _LINUX_ION_H 20 21 #include <linux/ioctl.h> 22 #include <linux/types.h> 23 24 struct ion_handle; 25 typedef struct ion_handle *ion_user_handle_t; 26 /** 27 * enum ion_heap_types - list of all possible types of heaps 28 * @ION_HEAP_TYPE_SYSTEM: memory allocated via vmalloc 29 * @ION_HEAP_TYPE_SYSTEM_CONTIG: memory allocated via kmalloc 30 * @ION_HEAP_TYPE_CARVEOUT: memory allocated from a prereserved 31 * carveout heap, allocations are physically 32 * contiguous 33 * @ION_HEAP_TYPE_IOMMU: IOMMU memory 34 * @ION_HEAP_TYPE_CP: memory allocated from a prereserved 35 * carveout heap, allocations are physically 36 * contiguous. Used for content protection. 37 * @ION_HEAP_TYPE_DMA: memory allocated via DMA API 38 * @ION_NUM_HEAPS: helper for iterating over heaps, a bit mask 39 * is used to identify the heaps, so only 32 40 * total heap types are supported 41 */ 42 enum ion_heap_type { 43 ION_HEAP_TYPE_SYSTEM, 44 ION_HEAP_TYPE_SYSTEM_CONTIG, 45 ION_HEAP_TYPE_CARVEOUT, 46 ION_HEAP_TYPE_DMA, 47 ION_HEAP_TYPE_CUSTOM, /* must be last so device specific heaps always 48 are at the end of this enum */ 49 ION_NUM_HEAPS = 16, 50 }; 51 52 #define ION_HEAP_SYSTEM_MASK (1 << ION_HEAP_TYPE_SYSTEM) 53 #define ION_HEAP_SYSTEM_CONTIG_MASK (1 << ION_HEAP_TYPE_SYSTEM_CONTIG) 54 #define ION_HEAP_CARVEOUT_MASK (1 << ION_HEAP_TYPE_CARVEOUT) 55 #define ION_HEAP_TYPE_DMA_MASK (1 << ION_HEAP_TYPE_DMA) 56 57 /** 58 * heap flags - the lower 16 bits are used by core ion, the upper 16 59 * bits are reserved for use by the heaps themselves. 60 */ 61 #define ION_FLAG_CACHED 1 /* mappings of this buffer should be 62 cached, ion will do cache 63 maintenance when the buffer is 64 mapped for dma */ 65 66 #ifdef __KERNEL__ 67 #include <linux/err.h> 68 #include <mach/ion.h> 69 struct ion_device; 70 struct ion_heap; 71 struct ion_mapper; 72 struct ion_client; 73 struct ion_buffer; 74 75 /* This should be removed some day when phys_addr_t's are fully 76 plumbed in the kernel, and all instances of ion_phys_addr_t should 77 be converted to phys_addr_t. For the time being many kernel interfaces 78 do not accept phys_addr_t's that would have to */ 79 #define ion_phys_addr_t unsigned long 80 #define ion_virt_addr_t unsigned long 81 82 /** 83 * struct ion_platform_heap - defines a heap in the given platform 84 * @type: type of the heap from ion_heap_type enum 85 * @id: unique identifier for heap. When allocating (lower numbers 86 * will be allocated from first) 87 * @name: used for debug purposes 88 * @base: base address of heap in physical memory if applicable 89 * @size: size of the heap in bytes if applicable 90 * @memory_type:Memory type used for the heap 91 * @has_outer_cache: set to 1 if outer cache is used, 0 otherwise. 92 * @extra_data: Extra data specific to each heap type 93 * @priv: heap private data 94 */ 95 struct ion_platform_heap { 96 enum ion_heap_type type; 97 unsigned int id; 98 const char *name; 99 ion_phys_addr_t base; 100 size_t size; 101 enum ion_memory_types memory_type; 102 unsigned int has_outer_cache; 103 void *extra_data; 104 void *priv; 105 }; 106 107 /** 108 * struct ion_platform_data - array of platform heaps passed from board file 109 * @has_outer_cache: set to 1 if outer cache is used, 0 otherwise. 110 * @nr: number of structures in the array 111 * @request_region: function to be called when the number of allocations goes 112 * from 0 -> 1 113 * @release_region: function to be called when the number of allocations goes 114 * from 1 -> 0 115 * @setup_region: function to be called upon ion registration 116 * @heaps: array of platform_heap structions 117 * 118 * Provided by the board file in the form of platform data to a platform device. 119 */ 120 struct ion_platform_data { 121 unsigned int has_outer_cache; 122 int nr; 123 int (*request_region)(void *); 124 int (*release_region)(void *); 125 void *(*setup_region)(void); 126 struct ion_platform_heap *heaps; 127 }; 128 129 #ifdef CONFIG_ION 130 131 /** 132 * ion_reserve() - reserve memory for ion heaps if applicable 133 * @data: platform data specifying starting physical address and 134 * size 135 * 136 * Calls memblock reserve to set aside memory for heaps that are 137 * located at specific memory addresses or of specfic sizes not 138 * managed by the kernel 139 */ 140 void ion_reserve(struct ion_platform_data *data); 141 142 /** 143 * ion_client_create() - allocate a client and returns it 144 * @dev: the global ion device 145 * @heap_mask: mask of heaps this client can allocate from 146 * @name: used for debugging 147 */ 148 struct ion_client *ion_client_create(struct ion_device *dev, 149 unsigned int heap_mask, const char *name); 150 151 /** 152 * msm_ion_client_create - allocate a client using the ion_device specified in 153 * drivers/gpu/ion/msm/msm_ion.c 154 * 155 * heap_mask and name are the same as ion_client_create, return values 156 * are the same as ion_client_create. 157 */ 158 159 struct ion_client *msm_ion_client_create(unsigned int heap_mask, 160 const char *name); 161 162 /** 163 * ion_client_destroy() - free's a client and all it's handles 164 * @client: the client 165 * 166 * Free the provided client and all it's resources including 167 * any handles it is holding. 168 */ 169 void ion_client_destroy(struct ion_client *client); 170 171 /** 172 * ion_alloc - allocate ion memory 173 * @client: the client 174 * @len: size of the allocation 175 * @align: requested allocation alignment, lots of hardware blocks have 176 * alignment requirements of some kind 177 * @heap_mask: mask of heaps to allocate from, if multiple bits are set 178 * heaps will be tried in order from lowest to highest order bit 179 * @flags: heap flags, the low 16 bits are consumed by ion, the high 16 180 * bits are passed on to the respective heap and can be heap 181 * custom 182 * 183 * Allocate memory in one of the heaps provided in heap mask and return 184 * an opaque handle to it. 185 */ 186 struct ion_handle *ion_alloc(struct ion_client *client, size_t len, 187 size_t align, unsigned int heap_mask, 188 unsigned int flags); 189 190 /** 191 * ion_free - free a handle 192 * @client: the client 193 * @handle: the handle to free 194 * 195 * Free the provided handle. 196 */ 197 void ion_free(struct ion_client *client, struct ion_handle *handle); 198 199 /** 200 * ion_phys - returns the physical address and len of a handle 201 * @client: the client 202 * @handle: the handle 203 * @addr: a pointer to put the address in 204 * @len: a pointer to put the length in 205 * 206 * This function queries the heap for a particular handle to get the 207 * handle's physical address. It't output is only correct if 208 * a heap returns physically contiguous memory -- in other cases 209 * this api should not be implemented -- ion_sg_table should be used 210 * instead. Returns -EINVAL if the handle is invalid. This has 211 * no implications on the reference counting of the handle -- 212 * the returned value may not be valid if the caller is not 213 * holding a reference. 214 */ 215 int ion_phys(struct ion_client *client, struct ion_handle *handle, 216 ion_phys_addr_t *addr, size_t *len); 217 218 /** 219 * ion_map_dma - return an sg_table describing a handle 220 * @client: the client 221 * @handle: the handle 222 * 223 * This function returns the sg_table describing 224 * a particular ion handle. 225 */ 226 struct sg_table *ion_sg_table(struct ion_client *client, 227 struct ion_handle *handle); 228 229 /** 230 * ion_map_kernel - create mapping for the given handle 231 * @client: the client 232 * @handle: handle to map 233 * @flags: flags for this mapping 234 * 235 * Map the given handle into the kernel and return a kernel address that 236 * can be used to access this address. If no flags are specified, this 237 * will return a non-secure uncached mapping. 238 */ 239 void *ion_map_kernel(struct ion_client *client, struct ion_handle *handle); 240 241 /** 242 * ion_unmap_kernel() - destroy a kernel mapping for a handle 243 * @client: the client 244 * @handle: handle to unmap 245 */ 246 void ion_unmap_kernel(struct ion_client *client, struct ion_handle *handle); 247 248 /** 249 * ion_share_dma_buf() - given an ion client, create a dma-buf fd 250 * @client: the client 251 * @handle: the handle 252 */ 253 int ion_share_dma_buf(struct ion_client *client, struct ion_handle *handle); 254 255 /** 256 * ion_import_dma_buf() - given an dma-buf fd from the ion exporter get handle 257 * @client: the client 258 * @fd: the dma-buf fd 259 * 260 * Given an dma-buf fd that was allocated through ion via ion_share_dma_buf, 261 * import that fd and return a handle representing it. If a dma-buf from 262 * another exporter is passed in this function will return ERR_PTR(-EINVAL) 263 */ 264 struct ion_handle *ion_import_dma_buf(struct ion_client *client, int fd); 265 266 /** 267 * ion_handle_get_flags - get the flags for a given handle 268 * 269 * @client - client who allocated the handle 270 * @handle - handle to get the flags 271 * @flags - pointer to store the flags 272 * 273 * Gets the current flags for a handle. These flags indicate various options 274 * of the buffer (caching, security, etc.) 275 */ 276 int ion_handle_get_flags(struct ion_client *client, struct ion_handle *handle, 277 unsigned long *flags); 278 279 280 /** 281 * ion_map_iommu - map the given handle into an iommu 282 * 283 * @client - client who allocated the handle 284 * @handle - handle to map 285 * @domain_num - domain number to map to 286 * @partition_num - partition number to allocate iova from 287 * @align - alignment for the iova 288 * @iova_length - length of iova to map. If the iova length is 289 * greater than the handle length, the remaining 290 * address space will be mapped to a dummy buffer. 291 * @iova - pointer to store the iova address 292 * @buffer_size - pointer to store the size of the buffer 293 * @flags - flags for options to map 294 * @iommu_flags - flags specific to the iommu. 295 * 296 * Maps the handle into the iova space specified via domain number. Iova 297 * will be allocated from the partition specified via partition_num. 298 * Returns 0 on success, negative value on error. 299 */ 300 int ion_map_iommu(struct ion_client *client, struct ion_handle *handle, 301 int domain_num, int partition_num, unsigned long align, 302 unsigned long iova_length, unsigned long *iova, 303 unsigned long *buffer_size, 304 unsigned long flags, unsigned long iommu_flags); 305 306 307 /** 308 * ion_handle_get_size - get the allocated size of a given handle 309 * 310 * @client - client who allocated the handle 311 * @handle - handle to get the size 312 * @size - pointer to store the size 313 * 314 * gives the allocated size of a handle. returns 0 on success, negative 315 * value on error 316 * 317 * NOTE: This is intended to be used only to get a size to pass to map_iommu. 318 * You should *NOT* rely on this for any other usage. 319 */ 320 321 int ion_handle_get_size(struct ion_client *client, struct ion_handle *handle, 322 unsigned long *size); 323 324 /** 325 * ion_unmap_iommu - unmap the handle from an iommu 326 * 327 * @client - client who allocated the handle 328 * @handle - handle to unmap 329 * @domain_num - domain to unmap from 330 * @partition_num - partition to unmap from 331 * 332 * Decrement the reference count on the iommu mapping. If the count is 333 * 0, the mapping will be removed from the iommu. 334 */ 335 void ion_unmap_iommu(struct ion_client *client, struct ion_handle *handle, 336 int domain_num, int partition_num); 337 338 339 /** 340 * ion_secure_heap - secure a heap 341 * 342 * @client - a client that has allocated from the heap heap_id 343 * @heap_id - heap id to secure. 344 * @version - version of content protection 345 * @data - extra data needed for protection 346 * 347 * Secure a heap 348 * Returns 0 on success 349 */ 350 int ion_secure_heap(struct ion_device *dev, int heap_id, int version, 351 void *data); 352 353 /** 354 * ion_unsecure_heap - un-secure a heap 355 * 356 * @client - a client that has allocated from the heap heap_id 357 * @heap_id - heap id to un-secure. 358 * @version - version of content protection 359 * @data - extra data needed for protection 360 * 361 * Un-secure a heap 362 * Returns 0 on success 363 */ 364 int ion_unsecure_heap(struct ion_device *dev, int heap_id, int version, 365 void *data); 366 367 /** 368 * msm_ion_do_cache_op - do cache operations. 369 * 370 * @client - pointer to ION client. 371 * @handle - pointer to buffer handle. 372 * @vaddr - virtual address to operate on. 373 * @len - Length of data to do cache operation on. 374 * @cmd - Cache operation to perform: 375 * ION_IOC_CLEAN_CACHES 376 * ION_IOC_INV_CACHES 377 * ION_IOC_CLEAN_INV_CACHES 378 * 379 * Returns 0 on success 380 */ 381 int msm_ion_do_cache_op(struct ion_client *client, struct ion_handle *handle, 382 void *vaddr, unsigned long len, unsigned int cmd); 383 384 #else 385 static inline void ion_reserve(struct ion_platform_data *data) 386 { 387 388 } 389 390 static inline struct ion_client *ion_client_create(struct ion_device *dev, 391 unsigned int heap_mask, const char *name) 392 { 393 return ERR_PTR(-ENODEV); 394 } 395 396 static inline struct ion_client *msm_ion_client_create(unsigned int heap_mask, 397 const char *name) 398 { 399 return ERR_PTR(-ENODEV); 400 } 401 402 static inline void ion_client_destroy(struct ion_client *client) { } 403 404 static inline struct ion_handle *ion_alloc(struct ion_client *client, 405 size_t len, size_t align, 406 unsigned int heap_mask, 407 unsigned int flags) 408 { 409 return ERR_PTR(-ENODEV); 410 } 411 412 static inline void ion_free(struct ion_client *client, 413 struct ion_handle *handle) { } 414 415 416 static inline int ion_phys(struct ion_client *client, 417 struct ion_handle *handle, ion_phys_addr_t *addr, size_t *len) 418 { 419 return -ENODEV; 420 } 421 422 static inline struct sg_table *ion_sg_table(struct ion_client *client, 423 struct ion_handle *handle) 424 { 425 return ERR_PTR(-ENODEV); 426 } 427 428 static inline void *ion_map_kernel(struct ion_client *client, 429 struct ion_handle *handle, unsigned long flags) 430 { 431 return ERR_PTR(-ENODEV); 432 } 433 434 static inline void ion_unmap_kernel(struct ion_client *client, 435 struct ion_handle *handle) { } 436 437 static inline int ion_share_dma_buf(struct ion_client *client, struct ion_handle *handle) 438 { 439 return -ENODEV; 440 } 441 442 static inline struct ion_handle *ion_import_dma_buf(struct ion_client *client, int fd) 443 { 444 return ERR_PTR(-ENODEV); 445 } 446 447 static inline int ion_handle_get_flags(struct ion_client *client, 448 struct ion_handle *handle, unsigned long *flags) 449 { 450 return -ENODEV; 451 } 452 453 static inline int ion_map_iommu(struct ion_client *client, 454 struct ion_handle *handle, int domain_num, 455 int partition_num, unsigned long align, 456 unsigned long iova_length, unsigned long *iova, 457 unsigned long *buffer_size, 458 unsigned long flags, 459 unsigned long iommu_flags) 460 { 461 return -ENODEV; 462 } 463 464 static inline void ion_unmap_iommu(struct ion_client *client, 465 struct ion_handle *handle, int domain_num, 466 int partition_num) 467 { 468 return; 469 } 470 471 static inline int ion_secure_heap(struct ion_device *dev, int heap_id, 472 int version, void *data) 473 { 474 return -ENODEV; 475 476 } 477 478 static inline int ion_unsecure_heap(struct ion_device *dev, int heap_id, 479 int version, void *data) 480 { 481 return -ENODEV; 482 } 483 484 static inline int msm_ion_do_cache_op(struct ion_client *client, 485 struct ion_handle *handle, void *vaddr, 486 unsigned long len, unsigned int cmd) 487 { 488 return -ENODEV; 489 } 490 491 #endif /* CONFIG_ION */ 492 #endif /* __KERNEL__ */ 493 494 /** 495 * DOC: Ion Userspace API 496 * 497 * create a client by opening /dev/ion 498 * most operations handled via following ioctls 499 * 500 */ 501 502 /** 503 * struct ion_allocation_data - metadata passed from userspace for allocations 504 * @len: size of the allocation 505 * @align: required alignment of the allocation 506 * @heap_mask: mask of heaps to allocate from 507 * @flags: flags passed to heap 508 * @handle: pointer that will be populated with a cookie to use to refer 509 * to this allocation 510 * 511 * Provided by userspace as an argument to the ioctl 512 */ 513 struct ion_allocation_data { 514 size_t len; 515 size_t align; 516 unsigned int heap_id_mask; 517 unsigned int flags; 518 ion_user_handle_t handle; 519 }; 520 521 /** 522 * struct ion_fd_data - metadata passed to/from userspace for a handle/fd pair 523 * @handle: a handle 524 * @fd: a file descriptor representing that handle 525 * 526 * For ION_IOC_SHARE or ION_IOC_MAP userspace populates the handle field with 527 * the handle returned from ion alloc, and the kernel returns the file 528 * descriptor to share or map in the fd field. For ION_IOC_IMPORT, userspace 529 * provides the file descriptor and the kernel returns the handle. 530 */ 531 struct ion_fd_data { 532 ion_user_handle_t handle; 533 int fd; 534 }; 535 536 /** 537 * struct ion_handle_data - a handle passed to/from the kernel 538 * @handle: a handle 539 */ 540 struct ion_handle_data { 541 ion_user_handle_t handle; 542 }; 543 544 /** 545 * struct ion_custom_data - metadata passed to/from userspace for a custom ioctl 546 * @cmd: the custom ioctl function to call 547 * @arg: additional data to pass to the custom ioctl, typically a user 548 * pointer to a predefined structure 549 * 550 * This works just like the regular cmd and arg fields of an ioctl. 551 */ 552 struct ion_custom_data { 553 unsigned int cmd; 554 unsigned long arg; 555 }; 556 #define ION_IOC_MAGIC 'I' 557 558 /** 559 * DOC: ION_IOC_ALLOC - allocate memory 560 * 561 * Takes an ion_allocation_data struct and returns it with the handle field 562 * populated with the opaque handle for the allocation. 563 */ 564 #define ION_IOC_ALLOC _IOWR(ION_IOC_MAGIC, 0, \ 565 struct ion_allocation_data) 566 567 /** 568 * DOC: ION_IOC_FREE - free memory 569 * 570 * Takes an ion_handle_data struct and frees the handle. 571 */ 572 #define ION_IOC_FREE _IOWR(ION_IOC_MAGIC, 1, struct ion_handle_data) 573 574 /** 575 * DOC: ION_IOC_MAP - get a file descriptor to mmap 576 * 577 * Takes an ion_fd_data struct with the handle field populated with a valid 578 * opaque handle. Returns the struct with the fd field set to a file 579 * descriptor open in the current address space. This file descriptor 580 * can then be used as an argument to mmap. 581 */ 582 #define ION_IOC_MAP _IOWR(ION_IOC_MAGIC, 2, struct ion_fd_data) 583 584 /** 585 * DOC: ION_IOC_SHARE - creates a file descriptor to use to share an allocation 586 * 587 * Takes an ion_fd_data struct with the handle field populated with a valid 588 * opaque handle. Returns the struct with the fd field set to a file 589 * descriptor open in the current address space. This file descriptor 590 * can then be passed to another process. The corresponding opaque handle can 591 * be retrieved via ION_IOC_IMPORT. 592 */ 593 #define ION_IOC_SHARE _IOWR(ION_IOC_MAGIC, 4, struct ion_fd_data) 594 595 /** 596 * DOC: ION_IOC_IMPORT - imports a shared file descriptor 597 * 598 * Takes an ion_fd_data struct with the fd field populated with a valid file 599 * descriptor obtained from ION_IOC_SHARE and returns the struct with the handle 600 * filed set to the corresponding opaque handle. 601 */ 602 #define ION_IOC_IMPORT _IOWR(ION_IOC_MAGIC, 5, struct ion_fd_data) 603 604 /** 605 * DOC: ION_IOC_CUSTOM - call architecture specific ion ioctl 606 * 607 * Takes the argument of the architecture specific ioctl to call and 608 * passes appropriate userdata for that ioctl 609 */ 610 #define ION_IOC_CUSTOM _IOWR(ION_IOC_MAGIC, 6, struct ion_custom_data) 611 612 /** 613 * DOC: ION_IOC_SYNC - syncs a shared file descriptors to memory 614 * 615 * Deprecated in favor of using the dma_buf api's correctly (syncing 616 * will happend automatically when the buffer is mapped to a device). 617 * If necessary should be used after touching a cached buffer from the cpu, 618 * this will make the buffer in memory coherent. 619 */ 620 #define ION_IOC_SYNC _IOWR(ION_IOC_MAGIC, 7, struct ion_fd_data) 621 #endif /* _LINUX_ION_H */ 622