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