blob: 390322c10dd42132f2695f6247576b5123d144e1 [file] [log] [blame]
Rebecca Schultz Zavinc80005a2011-06-29 19:44:29 -07001/*
2 * include/linux/ion.h
3 *
4 * Copyright (C) 2011 Google, Inc.
Olav Haugan0a852512012-01-09 10:20:55 -08005 * Copyright (c) 2011-2012, Code Aurora Forum. All rights reserved.
Rebecca Schultz Zavinc80005a2011-06-29 19:44:29 -07006 *
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
Laura Abbottabcb6f72011-10-04 16:26:49 -070021#include <linux/ioctl.h>
Rebecca Schultz Zavinc80005a2011-06-29 19:44:29 -070022#include <linux/types.h>
23
24struct ion_handle;
25/**
26 * enum ion_heap_types - list of all possible types of heaps
Iliyan Malchevf22301562011-07-06 16:53:21 -070027 * @ION_HEAP_TYPE_SYSTEM: memory allocated via vmalloc
28 * @ION_HEAP_TYPE_SYSTEM_CONTIG: memory allocated via kmalloc
29 * @ION_HEAP_TYPE_CARVEOUT: memory allocated from a prereserved
Olav Hauganb5be7992011-11-18 14:29:02 -080030 * carveout heap, allocations are physically
31 * contiguous
Olav Haugan0a852512012-01-09 10:20:55 -080032 * @ION_HEAP_TYPE_IOMMU: IOMMU memory
33 * @ION_HEAP_TYPE_CP: memory allocated from a prereserved
34 * carveout heap, allocations are physically
35 * contiguous. Used for content protection.
36 * @ION_HEAP_END: helper for iterating over heaps
Rebecca Schultz Zavinc80005a2011-06-29 19:44:29 -070037 */
38enum ion_heap_type {
39 ION_HEAP_TYPE_SYSTEM,
40 ION_HEAP_TYPE_SYSTEM_CONTIG,
41 ION_HEAP_TYPE_CARVEOUT,
42 ION_HEAP_TYPE_CUSTOM, /* must be last so device specific heaps always
43 are at the end of this enum */
Rebecca Schultz Zavine6ee1242011-06-30 12:19:55 -070044 ION_NUM_HEAPS,
Rebecca Schultz Zavinc80005a2011-06-29 19:44:29 -070045};
46
Iliyan Malchevf22301562011-07-06 16:53:21 -070047#define ION_HEAP_SYSTEM_MASK (1 << ION_HEAP_TYPE_SYSTEM)
48#define ION_HEAP_SYSTEM_CONTIG_MASK (1 << ION_HEAP_TYPE_SYSTEM_CONTIG)
49#define ION_HEAP_CARVEOUT_MASK (1 << ION_HEAP_TYPE_CARVEOUT)
Rebecca Schultz Zavinc80005a2011-06-29 19:44:29 -070050
Mitchel Humpherys97e21232012-09-11 15:59:11 -070051/**
52 * heap flags - the lower 16 bits are used by core ion, the upper 16
53 * bits are reserved for use by the heaps themselves.
54 */
55#define ION_FLAG_CACHED 1 /* mappings of this buffer should be
56 cached, ion will do cache
57 maintenance when the buffer is
58 mapped for dma */
Laura Abbotta2e93632011-08-19 13:36:32 -070059
Rebecca Schultz Zavinc80005a2011-06-29 19:44:29 -070060#ifdef __KERNEL__
Laura Abbott65576962011-10-31 12:13:25 -070061#include <linux/err.h>
Laura Abbottcffdff52011-09-23 10:40:19 -070062#include <mach/ion.h>
Rebecca Schultz Zavinc80005a2011-06-29 19:44:29 -070063struct ion_device;
64struct ion_heap;
65struct ion_mapper;
66struct ion_client;
67struct ion_buffer;
68
69/* This should be removed some day when phys_addr_t's are fully
70 plumbed in the kernel, and all instances of ion_phys_addr_t should
71 be converted to phys_addr_t. For the time being many kernel interfaces
72 do not accept phys_addr_t's that would have to */
73#define ion_phys_addr_t unsigned long
Laura Abbottcaafeea2011-12-13 11:43:10 -080074#define ion_virt_addr_t unsigned long
Rebecca Schultz Zavinc80005a2011-06-29 19:44:29 -070075
Rebecca Schultz Zavinc80005a2011-06-29 19:44:29 -070076/**
77 * struct ion_platform_heap - defines a heap in the given platform
78 * @type: type of the heap from ion_heap_type enum
Olav Hauganee0f7802011-12-19 13:28:57 -080079 * @id: unique identifier for heap. When allocating (lower numbers
Olav Hauganb5be7992011-11-18 14:29:02 -080080 * will be allocated from first)
Rebecca Schultz Zavinc80005a2011-06-29 19:44:29 -070081 * @name: used for debug purposes
82 * @base: base address of heap in physical memory if applicable
83 * @size: size of the heap in bytes if applicable
Laura Abbottcaafeea2011-12-13 11:43:10 -080084 * @memory_type:Memory type used for the heap
Olav Haugan85c95402012-05-30 17:32:37 -070085 * @has_outer_cache: set to 1 if outer cache is used, 0 otherwise.
Laura Abbottcaafeea2011-12-13 11:43:10 -080086 * @extra_data: Extra data specific to each heap type
Benjamin Gaignard0085c1a2012-06-25 15:30:18 -070087 * @priv: heap private data
Rebecca Schultz Zavinc80005a2011-06-29 19:44:29 -070088 */
89struct ion_platform_heap {
90 enum ion_heap_type type;
Rebecca Schultz Zavine6ee1242011-06-30 12:19:55 -070091 unsigned int id;
Rebecca Schultz Zavinc80005a2011-06-29 19:44:29 -070092 const char *name;
93 ion_phys_addr_t base;
94 size_t size;
Laura Abbotta2e93632011-08-19 13:36:32 -070095 enum ion_memory_types memory_type;
Olav Haugan85c95402012-05-30 17:32:37 -070096 unsigned int has_outer_cache;
Olav Haugan0703dbf2011-12-19 17:53:38 -080097 void *extra_data;
Benjamin Gaignard0085c1a2012-06-25 15:30:18 -070098 void *priv;
Olav Haugan0703dbf2011-12-19 17:53:38 -080099};
100
Laura Abbottcaafeea2011-12-13 11:43:10 -0800101/**
Rebecca Schultz Zavinc80005a2011-06-29 19:44:29 -0700102 * struct ion_platform_data - array of platform heaps passed from board file
Olav Haugan85c95402012-05-30 17:32:37 -0700103 * @has_outer_cache: set to 1 if outer cache is used, 0 otherwise.
Alex Bird27ca6612011-11-01 14:40:06 -0700104 * @nr: number of structures in the array
105 * @request_region: function to be called when the number of allocations goes
106 * from 0 -> 1
107 * @release_region: function to be called when the number of allocations goes
108 * from 1 -> 0
109 * @setup_region: function to be called upon ion registration
110 * @heaps: array of platform_heap structions
Rebecca Schultz Zavinc80005a2011-06-29 19:44:29 -0700111 *
112 * Provided by the board file in the form of platform data to a platform device.
113 */
114struct ion_platform_data {
Olav Haugan85c95402012-05-30 17:32:37 -0700115 unsigned int has_outer_cache;
Rebecca Schultz Zavinc80005a2011-06-29 19:44:29 -0700116 int nr;
Olav Hauganee0f7802011-12-19 13:28:57 -0800117 int (*request_region)(void *);
118 int (*release_region)(void *);
Alex Bird27ca6612011-11-01 14:40:06 -0700119 void *(*setup_region)(void);
Benjamin Gaignardb2d367c2012-06-25 15:27:30 -0700120 struct ion_platform_heap *heaps;
Rebecca Schultz Zavinc80005a2011-06-29 19:44:29 -0700121};
122
Jordan Crouse8cd48322011-10-12 17:05:19 -0600123#ifdef CONFIG_ION
124
Rebecca Schultz Zavinc80005a2011-06-29 19:44:29 -0700125/**
Laura Abbottb14ed962012-01-30 14:18:08 -0800126 * ion_reserve() - reserve memory for ion heaps if applicable
127 * @data: platform data specifying starting physical address and
128 * size
129 *
130 * Calls memblock reserve to set aside memory for heaps that are
131 * located at specific memory addresses or of specfic sizes not
132 * managed by the kernel
133 */
134void ion_reserve(struct ion_platform_data *data);
135
136/**
Rebecca Schultz Zavinc80005a2011-06-29 19:44:29 -0700137 * ion_client_create() - allocate a client and returns it
138 * @dev: the global ion device
139 * @heap_mask: mask of heaps this client can allocate from
140 * @name: used for debugging
141 */
142struct ion_client *ion_client_create(struct ion_device *dev,
143 unsigned int heap_mask, const char *name);
144
145/**
Laura Abbott302911d2011-08-15 17:12:57 -0700146 * msm_ion_client_create - allocate a client using the ion_device specified in
147 * drivers/gpu/ion/msm/msm_ion.c
148 *
149 * heap_mask and name are the same as ion_client_create, return values
150 * are the same as ion_client_create.
151 */
152
153struct ion_client *msm_ion_client_create(unsigned int heap_mask,
154 const char *name);
155
156/**
Rebecca Schultz Zavinc80005a2011-06-29 19:44:29 -0700157 * ion_client_destroy() - free's a client and all it's handles
158 * @client: the client
159 *
160 * Free the provided client and all it's resources including
161 * any handles it is holding.
162 */
163void ion_client_destroy(struct ion_client *client);
164
165/**
166 * ion_alloc - allocate ion memory
167 * @client: the client
168 * @len: size of the allocation
169 * @align: requested allocation alignment, lots of hardware blocks have
170 * alignment requirements of some kind
Hanumant Singh2ac41c92012-08-29 18:39:44 -0700171 * @heap_mask: mask of heaps to allocate from, if multiple bits are set
Rebecca Schultz Zavine6ee1242011-06-30 12:19:55 -0700172 * heaps will be tried in order from lowest to highest order bit
Hanumant Singh2ac41c92012-08-29 18:39:44 -0700173 * @flags: heap flags, the low 16 bits are consumed by ion, the high 16
174 * bits are passed on to the respective heap and can be heap
175 * custom
Rebecca Schultz Zavinc80005a2011-06-29 19:44:29 -0700176 *
177 * Allocate memory in one of the heaps provided in heap mask and return
178 * an opaque handle to it.
179 */
180struct ion_handle *ion_alloc(struct ion_client *client, size_t len,
Hanumant Singh2ac41c92012-08-29 18:39:44 -0700181 size_t align, unsigned int heap_mask,
182 unsigned int flags);
Rebecca Schultz Zavinc80005a2011-06-29 19:44:29 -0700183
184/**
185 * ion_free - free a handle
186 * @client: the client
187 * @handle: the handle to free
188 *
189 * Free the provided handle.
190 */
191void ion_free(struct ion_client *client, struct ion_handle *handle);
192
193/**
194 * ion_phys - returns the physical address and len of a handle
195 * @client: the client
196 * @handle: the handle
197 * @addr: a pointer to put the address in
198 * @len: a pointer to put the length in
199 *
200 * This function queries the heap for a particular handle to get the
201 * handle's physical address. It't output is only correct if
202 * a heap returns physically contiguous memory -- in other cases
Laura Abbottb14ed962012-01-30 14:18:08 -0800203 * this api should not be implemented -- ion_sg_table should be used
Rebecca Schultz Zavinc80005a2011-06-29 19:44:29 -0700204 * instead. Returns -EINVAL if the handle is invalid. This has
205 * no implications on the reference counting of the handle --
206 * the returned value may not be valid if the caller is not
207 * holding a reference.
208 */
209int ion_phys(struct ion_client *client, struct ion_handle *handle,
210 ion_phys_addr_t *addr, size_t *len);
211
212/**
Laura Abbottb14ed962012-01-30 14:18:08 -0800213 * ion_map_dma - return an sg_table describing a handle
214 * @client: the client
215 * @handle: the handle
216 *
217 * This function returns the sg_table describing
218 * a particular ion handle.
219 */
220struct sg_table *ion_sg_table(struct ion_client *client,
221 struct ion_handle *handle);
222
223/**
Rebecca Schultz Zavinc80005a2011-06-29 19:44:29 -0700224 * ion_map_kernel - create mapping for the given handle
225 * @client: the client
226 * @handle: handle to map
Laura Abbott894fd582011-08-19 13:33:56 -0700227 * @flags: flags for this mapping
Rebecca Schultz Zavinc80005a2011-06-29 19:44:29 -0700228 *
229 * Map the given handle into the kernel and return a kernel address that
Laura Abbott894fd582011-08-19 13:33:56 -0700230 * can be used to access this address. If no flags are specified, this
231 * will return a non-secure uncached mapping.
Rebecca Schultz Zavinc80005a2011-06-29 19:44:29 -0700232 */
Mitchel Humpherys456e2682012-09-12 14:42:50 -0700233void *ion_map_kernel(struct ion_client *client, struct ion_handle *handle);
Rebecca Schultz Zavinc80005a2011-06-29 19:44:29 -0700234
235/**
236 * ion_unmap_kernel() - destroy a kernel mapping for a handle
237 * @client: the client
238 * @handle: handle to unmap
239 */
240void ion_unmap_kernel(struct ion_client *client, struct ion_handle *handle);
241
242/**
Laura Abbottb14ed962012-01-30 14:18:08 -0800243 * ion_share_dma_buf() - given an ion client, create a dma-buf fd
Rebecca Schultz Zavinc80005a2011-06-29 19:44:29 -0700244 * @client: the client
Laura Abbottb14ed962012-01-30 14:18:08 -0800245 * @handle: the handle
Rebecca Schultz Zavinc80005a2011-06-29 19:44:29 -0700246 */
Laura Abbottb14ed962012-01-30 14:18:08 -0800247int ion_share_dma_buf(struct ion_client *client, struct ion_handle *handle);
Rebecca Schultz Zavinc80005a2011-06-29 19:44:29 -0700248
249/**
Laura Abbottb14ed962012-01-30 14:18:08 -0800250 * ion_import_dma_buf() - given an dma-buf fd from the ion exporter get handle
Rebecca Schultz Zavinc80005a2011-06-29 19:44:29 -0700251 * @client: the client
Laura Abbottb14ed962012-01-30 14:18:08 -0800252 * @fd: the dma-buf fd
Rebecca Schultz Zavinc80005a2011-06-29 19:44:29 -0700253 *
Laura Abbottb14ed962012-01-30 14:18:08 -0800254 * Given an dma-buf fd that was allocated through ion via ion_share_dma_buf,
255 * import that fd and return a handle representing it. If a dma-buf from
256 * another exporter is passed in this function will return ERR_PTR(-EINVAL)
Rebecca Schultz Zavinc80005a2011-06-29 19:44:29 -0700257 */
Laura Abbottb14ed962012-01-30 14:18:08 -0800258struct ion_handle *ion_import_dma_buf(struct ion_client *client, int fd);
Laura Abbott273dd8e2011-10-12 14:26:33 -0700259
Laura Abbott273dd8e2011-10-12 14:26:33 -0700260/**
261 * ion_handle_get_flags - get the flags for a given handle
262 *
263 * @client - client who allocated the handle
264 * @handle - handle to get the flags
265 * @flags - pointer to store the flags
266 *
267 * Gets the current flags for a handle. These flags indicate various options
268 * of the buffer (caching, security, etc.)
269 */
270int ion_handle_get_flags(struct ion_client *client, struct ion_handle *handle,
271 unsigned long *flags);
272
Laura Abbott8c017362011-09-22 20:59:12 -0700273
274/**
275 * ion_map_iommu - map the given handle into an iommu
276 *
277 * @client - client who allocated the handle
278 * @handle - handle to map
279 * @domain_num - domain number to map to
280 * @partition_num - partition number to allocate iova from
281 * @align - alignment for the iova
282 * @iova_length - length of iova to map. If the iova length is
283 * greater than the handle length, the remaining
284 * address space will be mapped to a dummy buffer.
285 * @iova - pointer to store the iova address
286 * @buffer_size - pointer to store the size of the buffer
Mitchel Humpherysdc4d01d2012-09-13 10:53:22 -0700287 * @flags - flags for options to map
Olav Hauganb3676592012-03-02 15:02:25 -0800288 * @iommu_flags - flags specific to the iommu.
Laura Abbott8c017362011-09-22 20:59:12 -0700289 *
290 * Maps the handle into the iova space specified via domain number. Iova
291 * will be allocated from the partition specified via partition_num.
292 * Returns 0 on success, negative value on error.
293 */
294int ion_map_iommu(struct ion_client *client, struct ion_handle *handle,
295 int domain_num, int partition_num, unsigned long align,
296 unsigned long iova_length, unsigned long *iova,
297 unsigned long *buffer_size,
Olav Hauganb3676592012-03-02 15:02:25 -0800298 unsigned long flags, unsigned long iommu_flags);
Laura Abbott8c017362011-09-22 20:59:12 -0700299
300
301/**
302 * ion_handle_get_size - get the allocated size of a given handle
303 *
304 * @client - client who allocated the handle
305 * @handle - handle to get the size
306 * @size - pointer to store the size
307 *
308 * gives the allocated size of a handle. returns 0 on success, negative
309 * value on error
310 *
311 * NOTE: This is intended to be used only to get a size to pass to map_iommu.
312 * You should *NOT* rely on this for any other usage.
313 */
314
315int ion_handle_get_size(struct ion_client *client, struct ion_handle *handle,
316 unsigned long *size);
317
318/**
319 * ion_unmap_iommu - unmap the handle from an iommu
320 *
321 * @client - client who allocated the handle
322 * @handle - handle to unmap
323 * @domain_num - domain to unmap from
324 * @partition_num - partition to unmap from
325 *
326 * Decrement the reference count on the iommu mapping. If the count is
327 * 0, the mapping will be removed from the iommu.
328 */
329void ion_unmap_iommu(struct ion_client *client, struct ion_handle *handle,
330 int domain_num, int partition_num);
331
332
Olav Haugan0a852512012-01-09 10:20:55 -0800333/**
334 * ion_secure_heap - secure a heap
335 *
336 * @client - a client that has allocated from the heap heap_id
337 * @heap_id - heap id to secure.
Laura Abbott7e446482012-06-13 15:59:39 -0700338 * @version - version of content protection
339 * @data - extra data needed for protection
Olav Haugan0a852512012-01-09 10:20:55 -0800340 *
341 * Secure a heap
342 * Returns 0 on success
343 */
Laura Abbott7e446482012-06-13 15:59:39 -0700344int ion_secure_heap(struct ion_device *dev, int heap_id, int version,
345 void *data);
Olav Haugan0a852512012-01-09 10:20:55 -0800346
347/**
348 * ion_unsecure_heap - un-secure a heap
349 *
350 * @client - a client that has allocated from the heap heap_id
351 * @heap_id - heap id to un-secure.
Laura Abbott7e446482012-06-13 15:59:39 -0700352 * @version - version of content protection
353 * @data - extra data needed for protection
Olav Haugan0a852512012-01-09 10:20:55 -0800354 *
355 * Un-secure a heap
356 * Returns 0 on success
357 */
Laura Abbott7e446482012-06-13 15:59:39 -0700358int ion_unsecure_heap(struct ion_device *dev, int heap_id, int version,
359 void *data);
Olav Haugan0a852512012-01-09 10:20:55 -0800360
361/**
Olav Haugan41f85792012-02-08 15:28:05 -0800362 * msm_ion_do_cache_op - do cache operations.
363 *
364 * @client - pointer to ION client.
365 * @handle - pointer to buffer handle.
366 * @vaddr - virtual address to operate on.
367 * @len - Length of data to do cache operation on.
368 * @cmd - Cache operation to perform:
369 * ION_IOC_CLEAN_CACHES
370 * ION_IOC_INV_CACHES
371 * ION_IOC_CLEAN_INV_CACHES
372 *
373 * Returns 0 on success
374 */
375int msm_ion_do_cache_op(struct ion_client *client, struct ion_handle *handle,
376 void *vaddr, unsigned long len, unsigned int cmd);
377
Jordan Crouse8cd48322011-10-12 17:05:19 -0600378#else
Laura Abbottb14ed962012-01-30 14:18:08 -0800379static inline void ion_reserve(struct ion_platform_data *data)
380{
381
382}
383
Jordan Crouse8cd48322011-10-12 17:05:19 -0600384static inline struct ion_client *ion_client_create(struct ion_device *dev,
385 unsigned int heap_mask, const char *name)
386{
387 return ERR_PTR(-ENODEV);
388}
Laura Abbott273dd8e2011-10-12 14:26:33 -0700389
Jordan Crouse8cd48322011-10-12 17:05:19 -0600390static inline struct ion_client *msm_ion_client_create(unsigned int heap_mask,
391 const char *name)
392{
393 return ERR_PTR(-ENODEV);
394}
395
396static inline void ion_client_destroy(struct ion_client *client) { }
397
398static inline struct ion_handle *ion_alloc(struct ion_client *client,
Hanumant Singh2ac41c92012-08-29 18:39:44 -0700399 size_t len, size_t align,
400 unsigned int heap_mask,
401 unsigned int flags)
Jordan Crouse8cd48322011-10-12 17:05:19 -0600402{
403 return ERR_PTR(-ENODEV);
404}
405
406static inline void ion_free(struct ion_client *client,
407 struct ion_handle *handle) { }
408
409
410static inline int ion_phys(struct ion_client *client,
411 struct ion_handle *handle, ion_phys_addr_t *addr, size_t *len)
412{
413 return -ENODEV;
414}
415
Laura Abbottb14ed962012-01-30 14:18:08 -0800416static inline struct sg_table *ion_sg_table(struct ion_client *client,
417 struct ion_handle *handle)
418{
419 return ERR_PTR(-ENODEV);
420}
421
Jordan Crouse8cd48322011-10-12 17:05:19 -0600422static inline void *ion_map_kernel(struct ion_client *client,
423 struct ion_handle *handle, unsigned long flags)
424{
425 return ERR_PTR(-ENODEV);
426}
427
428static inline void ion_unmap_kernel(struct ion_client *client,
429 struct ion_handle *handle) { }
430
Laura Abbottb14ed962012-01-30 14:18:08 -0800431static inline int ion_share_dma_buf(struct ion_client *client, struct ion_handle *handle)
Jordan Crouse8cd48322011-10-12 17:05:19 -0600432{
Laura Abbottb14ed962012-01-30 14:18:08 -0800433 return -ENODEV;
Jordan Crouse8cd48322011-10-12 17:05:19 -0600434}
435
Laura Abbottb14ed962012-01-30 14:18:08 -0800436static inline struct ion_handle *ion_import_dma_buf(struct ion_client *client, int fd)
Jordan Crouse8cd48322011-10-12 17:05:19 -0600437{
438 return ERR_PTR(-ENODEV);
439}
440
441static inline int ion_handle_get_flags(struct ion_client *client,
442 struct ion_handle *handle, unsigned long *flags)
443{
444 return -ENODEV;
445}
Laura Abbott8c017362011-09-22 20:59:12 -0700446
447static inline int ion_map_iommu(struct ion_client *client,
448 struct ion_handle *handle, int domain_num,
449 int partition_num, unsigned long align,
450 unsigned long iova_length, unsigned long *iova,
Olav Haugan9a27d4c2012-02-23 09:35:16 -0800451 unsigned long *buffer_size,
Olav Hauganb3676592012-03-02 15:02:25 -0800452 unsigned long flags,
453 unsigned long iommu_flags)
Laura Abbott8c017362011-09-22 20:59:12 -0700454{
455 return -ENODEV;
456}
457
458static inline void ion_unmap_iommu(struct ion_client *client,
459 struct ion_handle *handle, int domain_num,
460 int partition_num)
461{
462 return;
463}
464
Laura Abbott7e446482012-06-13 15:59:39 -0700465static inline int ion_secure_heap(struct ion_device *dev, int heap_id,
466 int version, void *data)
Olav Haugan0a852512012-01-09 10:20:55 -0800467{
468 return -ENODEV;
Laura Abbott8c017362011-09-22 20:59:12 -0700469
Olav Haugan0a852512012-01-09 10:20:55 -0800470}
471
Laura Abbott7e446482012-06-13 15:59:39 -0700472static inline int ion_unsecure_heap(struct ion_device *dev, int heap_id,
473 int version, void *data)
Olav Haugan0a852512012-01-09 10:20:55 -0800474{
475 return -ENODEV;
476}
477
Olav Haugan41f85792012-02-08 15:28:05 -0800478static inline int msm_ion_do_cache_op(struct ion_client *client,
479 struct ion_handle *handle, void *vaddr,
480 unsigned long len, unsigned int cmd)
481{
482 return -ENODEV;
483}
484
Jordan Crouse8cd48322011-10-12 17:05:19 -0600485#endif /* CONFIG_ION */
Rebecca Schultz Zavinc80005a2011-06-29 19:44:29 -0700486#endif /* __KERNEL__ */
487
488/**
489 * DOC: Ion Userspace API
490 *
491 * create a client by opening /dev/ion
492 * most operations handled via following ioctls
493 *
494 */
495
496/**
497 * struct ion_allocation_data - metadata passed from userspace for allocations
498 * @len: size of the allocation
499 * @align: required alignment of the allocation
Brian Muramatsub6b0b652012-07-30 22:54:08 -0700500 * @heap_mask: mask of heaps to allocate from
Rebecca Schultz Zavinc80005a2011-06-29 19:44:29 -0700501 * @flags: flags passed to heap
502 * @handle: pointer that will be populated with a cookie to use to refer
503 * to this allocation
504 *
505 * Provided by userspace as an argument to the ioctl
506 */
507struct ion_allocation_data {
508 size_t len;
509 size_t align;
Brian Muramatsub6b0b652012-07-30 22:54:08 -0700510 unsigned int heap_mask;
Rebecca Schultz Zavinc80005a2011-06-29 19:44:29 -0700511 unsigned int flags;
512 struct ion_handle *handle;
513};
514
515/**
516 * struct ion_fd_data - metadata passed to/from userspace for a handle/fd pair
517 * @handle: a handle
518 * @fd: a file descriptor representing that handle
519 *
520 * For ION_IOC_SHARE or ION_IOC_MAP userspace populates the handle field with
521 * the handle returned from ion alloc, and the kernel returns the file
522 * descriptor to share or map in the fd field. For ION_IOC_IMPORT, userspace
523 * provides the file descriptor and the kernel returns the handle.
524 */
525struct ion_fd_data {
526 struct ion_handle *handle;
527 int fd;
528};
529
530/**
531 * struct ion_handle_data - a handle passed to/from the kernel
532 * @handle: a handle
533 */
534struct ion_handle_data {
535 struct ion_handle *handle;
536};
537
Rebecca Schultz Zavine6ee1242011-06-30 12:19:55 -0700538/**
539 * struct ion_custom_data - metadata passed to/from userspace for a custom ioctl
540 * @cmd: the custom ioctl function to call
541 * @arg: additional data to pass to the custom ioctl, typically a user
542 * pointer to a predefined structure
543 *
544 * This works just like the regular cmd and arg fields of an ioctl.
545 */
Rebecca Schultz Zavinc80005a2011-06-29 19:44:29 -0700546struct ion_custom_data {
547 unsigned int cmd;
548 unsigned long arg;
549};
Rebecca Schultz Zavinc80005a2011-06-29 19:44:29 -0700550#define ION_IOC_MAGIC 'I'
551
552/**
553 * DOC: ION_IOC_ALLOC - allocate memory
554 *
555 * Takes an ion_allocation_data struct and returns it with the handle field
556 * populated with the opaque handle for the allocation.
557 */
558#define ION_IOC_ALLOC _IOWR(ION_IOC_MAGIC, 0, \
559 struct ion_allocation_data)
560
561/**
562 * DOC: ION_IOC_FREE - free memory
563 *
564 * Takes an ion_handle_data struct and frees the handle.
565 */
566#define ION_IOC_FREE _IOWR(ION_IOC_MAGIC, 1, struct ion_handle_data)
567
568/**
569 * DOC: ION_IOC_MAP - get a file descriptor to mmap
570 *
571 * Takes an ion_fd_data struct with the handle field populated with a valid
572 * opaque handle. Returns the struct with the fd field set to a file
573 * descriptor open in the current address space. This file descriptor
574 * can then be used as an argument to mmap.
575 */
576#define ION_IOC_MAP _IOWR(ION_IOC_MAGIC, 2, struct ion_fd_data)
577
578/**
579 * DOC: ION_IOC_SHARE - creates a file descriptor to use to share an allocation
580 *
581 * Takes an ion_fd_data struct with the handle field populated with a valid
582 * opaque handle. Returns the struct with the fd field set to a file
583 * descriptor open in the current address space. This file descriptor
584 * can then be passed to another process. The corresponding opaque handle can
585 * be retrieved via ION_IOC_IMPORT.
586 */
587#define ION_IOC_SHARE _IOWR(ION_IOC_MAGIC, 4, struct ion_fd_data)
588
589/**
590 * DOC: ION_IOC_IMPORT - imports a shared file descriptor
591 *
592 * Takes an ion_fd_data struct with the fd field populated with a valid file
593 * descriptor obtained from ION_IOC_SHARE and returns the struct with the handle
594 * filed set to the corresponding opaque handle.
595 */
Ajay Dudanif572d262012-08-29 18:02:11 -0700596#define ION_IOC_IMPORT _IOWR(ION_IOC_MAGIC, 5, struct ion_fd_data)
Rebecca Schultz Zavinc80005a2011-06-29 19:44:29 -0700597
598/**
599 * DOC: ION_IOC_CUSTOM - call architecture specific ion ioctl
600 *
601 * Takes the argument of the architecture specific ioctl to call and
602 * passes appropriate userdata for that ioctl
603 */
604#define ION_IOC_CUSTOM _IOWR(ION_IOC_MAGIC, 6, struct ion_custom_data)
605
Laura Abbottabcb6f72011-10-04 16:26:49 -0700606
Rebecca Schultz Zavinc80005a2011-06-29 19:44:29 -0700607#endif /* _LINUX_ION_H */