Merge branch 'linux-linaro-lsk' into linux-linaro-lsk-android
[firefly-linux-kernel-4.4.55.git] / drivers / staging / android / ion / ion.h
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
22 #include "../uapi/ion.h"
23
24 struct ion_handle;
25 struct ion_device;
26 struct ion_heap;
27 struct ion_mapper;
28 struct ion_client;
29 struct ion_buffer;
30
31 /* This should be removed some day when phys_addr_t's are fully
32    plumbed in the kernel, and all instances of ion_phys_addr_t should
33    be converted to phys_addr_t.  For the time being many kernel interfaces
34    do not accept phys_addr_t's that would have to */
35 #define ion_phys_addr_t unsigned long
36
37 /**
38  * struct ion_platform_heap - defines a heap in the given platform
39  * @type:       type of the heap from ion_heap_type enum
40  * @id:         unique identifier for heap.  When allocating higher numbers
41  *              will be allocated from first.  At allocation these are passed
42  *              as a bit mask and therefore can not exceed ION_NUM_HEAP_IDS.
43  * @name:       used for debug purposes
44  * @base:       base address of heap in physical memory if applicable
45  * @size:       size of the heap in bytes if applicable
46  * @align:      required alignment in physical memory if applicable
47  * @priv:       private info passed from the board file
48  *
49  * Provided by the board file.
50  */
51 struct ion_platform_heap {
52         enum ion_heap_type type;
53         unsigned int id;
54         const char *name;
55         ion_phys_addr_t base;
56         size_t size;
57         ion_phys_addr_t align;
58         void *priv;
59 };
60
61 /**
62  * struct ion_platform_data - array of platform heaps passed from board file
63  * @nr:         number of structures in the array
64  * @heaps:      array of platform_heap structions
65  *
66  * Provided by the board file in the form of platform data to a platform device.
67  */
68 struct ion_platform_data {
69         int nr;
70         struct ion_platform_heap *heaps;
71 };
72
73 /**
74  * ion_reserve() - reserve memory for ion heaps if applicable
75  * @data:       platform data specifying starting physical address and
76  *              size
77  *
78  * Calls memblock reserve to set aside memory for heaps that are
79  * located at specific memory addresses or of specfic sizes not
80  * managed by the kernel
81  */
82 void ion_reserve(struct ion_platform_data *data);
83
84 /**
85  * ion_client_create() -  allocate a client and returns it
86  * @dev:                the global ion device
87  * @heap_type_mask:     mask of heaps this client can allocate from
88  * @name:               used for debugging
89  */
90 struct ion_client *ion_client_create(struct ion_device *dev,
91                                      const char *name);
92
93 /**
94  * ion_client_destroy() -  free's a client and all it's handles
95  * @client:     the client
96  *
97  * Free the provided client and all it's resources including
98  * any handles it is holding.
99  */
100 void ion_client_destroy(struct ion_client *client);
101
102 /**
103  * ion_alloc - allocate ion memory
104  * @client:             the client
105  * @len:                size of the allocation
106  * @align:              requested allocation alignment, lots of hardware blocks
107  *                      have alignment requirements of some kind
108  * @heap_id_mask:       mask of heaps to allocate from, if multiple bits are set
109  *                      heaps will be tried in order from highest to lowest
110  *                      id
111  * @flags:              heap flags, the low 16 bits are consumed by ion, the
112  *                      high 16 bits are passed on to the respective heap and
113  *                      can be heap custom
114  *
115  * Allocate memory in one of the heaps provided in heap mask and return
116  * an opaque handle to it.
117  */
118 struct ion_handle *ion_alloc(struct ion_client *client, size_t len,
119                              size_t align, unsigned int heap_id_mask,
120                              unsigned int flags);
121
122 /**
123  * ion_free - free a handle
124  * @client:     the client
125  * @handle:     the handle to free
126  *
127  * Free the provided handle.
128  */
129 void ion_free(struct ion_client *client, struct ion_handle *handle);
130
131 /**
132  * ion_phys - returns the physical address and len of a handle
133  * @client:     the client
134  * @handle:     the handle
135  * @addr:       a pointer to put the address in
136  * @len:        a pointer to put the length in
137  *
138  * This function queries the heap for a particular handle to get the
139  * handle's physical address.  It't output is only correct if
140  * a heap returns physically contiguous memory -- in other cases
141  * this api should not be implemented -- ion_sg_table should be used
142  * instead.  Returns -EINVAL if the handle is invalid.  This has
143  * no implications on the reference counting of the handle --
144  * the returned value may not be valid if the caller is not
145  * holding a reference.
146  */
147 int ion_phys(struct ion_client *client, struct ion_handle *handle,
148              ion_phys_addr_t *addr, size_t *len);
149
150 /**
151  * ion_map_dma - return an sg_table describing a handle
152  * @client:     the client
153  * @handle:     the handle
154  *
155  * This function returns the sg_table describing
156  * a particular ion handle.
157  */
158 struct sg_table *ion_sg_table(struct ion_client *client,
159                               struct ion_handle *handle);
160
161 /**
162  * ion_map_kernel - create mapping for the given handle
163  * @client:     the client
164  * @handle:     handle to map
165  *
166  * Map the given handle into the kernel and return a kernel address that
167  * can be used to access this address.
168  */
169 void *ion_map_kernel(struct ion_client *client, struct ion_handle *handle);
170
171 /**
172  * ion_unmap_kernel() - destroy a kernel mapping for a handle
173  * @client:     the client
174  * @handle:     handle to unmap
175  */
176 void ion_unmap_kernel(struct ion_client *client, struct ion_handle *handle);
177
178 /**
179  * ion_share_dma_buf() - share buffer as dma-buf
180  * @client:     the client
181  * @handle:     the handle
182  */
183 struct dma_buf *ion_share_dma_buf(struct ion_client *client,
184                                                 struct ion_handle *handle);
185
186 /**
187  * ion_share_dma_buf_fd() - given an ion client, create a dma-buf fd
188  * @client:     the client
189  * @handle:     the handle
190  */
191 int ion_share_dma_buf_fd(struct ion_client *client, struct ion_handle *handle);
192
193 /**
194  * ion_import_dma_buf() - given an dma-buf fd from the ion exporter get handle
195  * @client:     the client
196  * @fd:         the dma-buf fd
197  *
198  * Given an dma-buf fd that was allocated through ion via ion_share_dma_buf,
199  * import that fd and return a handle representing it.  If a dma-buf from
200  * another exporter is passed in this function will return ERR_PTR(-EINVAL)
201  */
202 struct ion_handle *ion_import_dma_buf(struct ion_client *client, int fd);
203
204 #endif /* _LINUX_ION_H */