1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
|
/*
* include/linux/nvmap.h
*
* structure declarations for nvmem and nvmap user-space ioctls
*
* Copyright (c) 2009-2013, NVIDIA CORPORATION. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include <linux/ioctl.h>
#include <linux/file.h>
#include <linux/rbtree.h>
#if defined(__KERNEL__)
#include <linux/dma-buf.h>
#endif
#ifndef _LINUX_NVMAP_H
#define _LINUX_NVMAP_H
#define NVMAP_HEAP_IOVMM (1ul<<30)
/* common carveout heaps */
#define NVMAP_HEAP_CARVEOUT_IRAM (1ul<<29)
#define NVMAP_HEAP_CARVEOUT_VPR (1ul<<28)
#define NVMAP_HEAP_CARVEOUT_TSEC (1ul<<27)
#define NVMAP_HEAP_CARVEOUT_GENERIC (1ul<<0)
#define NVMAP_HEAP_CARVEOUT_MASK (NVMAP_HEAP_IOVMM - 1)
/* allocation flags */
#define NVMAP_HANDLE_UNCACHEABLE (0x0ul << 0)
#define NVMAP_HANDLE_WRITE_COMBINE (0x1ul << 0)
#define NVMAP_HANDLE_INNER_CACHEABLE (0x2ul << 0)
#define NVMAP_HANDLE_CACHEABLE (0x3ul << 0)
#define NVMAP_HANDLE_CACHE_FLAG (0x3ul << 0)
#define NVMAP_HANDLE_SECURE (0x1ul << 2)
#define NVMAP_HANDLE_KIND_SPECIFIED (0x1ul << 3)
#define NVMAP_HANDLE_COMPR_SPECIFIED (0x1ul << 4)
#define NVMAP_HANDLE_ZEROED_PAGES (0x1ul << 5)
struct nvmap_handle;
#if defined(__KERNEL__)
#if defined(CONFIG_TEGRA_NVMAP)
struct nvmap_client;
struct nvmap_device;
/* Convert User space handle to Kernel. */
#define nvmap_convert_handle_u2k(h) (h)
#elif defined(CONFIG_ION_TEGRA)
/* For Ion Mem Manager support through nvmap_* API's. */
#include "../../../../../drivers/gpu/ion/ion_priv.h"
#define nvmap_client ion_client
#define nvmap_device ion_device
#define nvmap_handle ion_handle
#define nvmap_handle_ref ion_handle
/* Convert User space handle to Kernel. */
#define nvmap_convert_handle_u2k(h) ({ \
if ((u32)h >= TASK_SIZE) { \
pr_err("Invalid user space handle."); \
BUG(); \
} \
(*((u32 *)h)); })
#endif /* CONFIG_ION_TEGRA */
struct nvmap_client *nvmap_create_client(struct nvmap_device *dev,
const char *name);
struct nvmap_handle_ref *nvmap_alloc(struct nvmap_client *client, size_t size,
size_t align, unsigned int flags,
unsigned int heap_mask);
struct dma_buf *nvmap_alloc_dmabuf(size_t size, size_t align,
unsigned int flags,
unsigned int heap_mask);
struct dma_buf *nvmap_dmabuf_export(struct nvmap_client *client, ulong user_id);
struct dma_buf *nvmap_dmabuf_export_from_ref(struct nvmap_handle_ref *ref);
ulong nvmap_ref_to_user_id(struct nvmap_handle_ref *ref);
phys_addr_t nvmap_get_addr_from_user_id(ulong user_id);
void nvmap_free(struct nvmap_client *client, struct nvmap_handle_ref *r);
void _nvmap_free(struct nvmap_client *client, struct nvmap_handle_ref *r);
void *nvmap_mmap(struct nvmap_handle_ref *r);
void nvmap_munmap(struct nvmap_handle_ref *r, void *addr);
void *nvmap_kmap(struct nvmap_handle_ref *r, unsigned int pagenum);
void nvmap_kunmap(struct nvmap_handle_ref *r, unsigned int pagenum,
void *addr);
struct nvmap_client *nvmap_client_get_file(int fd);
struct nvmap_client *nvmap_client_get(struct nvmap_client *client);
void nvmap_client_put(struct nvmap_client *c);
int nvmap_pin(struct nvmap_client *c, struct nvmap_handle_ref *r,
phys_addr_t *phys);
phys_addr_t nvmap_handle_address_user_id(struct nvmap_client *c,
unsigned long user_id);
void nvmap_unpin(struct nvmap_client *client, struct nvmap_handle_ref *r);
struct nvmap_handle_ref *nvmap_duplicate_handle_user_id(
struct nvmap_client *client,
unsigned long user_id);
int nvmap_pin_array(struct nvmap_client *client,
unsigned long *user_ids,
long unsigned id_type_mask,
long unsigned id_type,
int nr,
struct nvmap_handle **unique_arr,
struct nvmap_handle_ref **unique_arr_refs);
ulong nvmap_get_handle_user_id(struct nvmap_client *client,
unsigned long id);
void nvmap_put_handle_user_id(ulong user_id);
/*
* Create a sg_table struct from the pages allocated for a handle. Note that
* this does not increment refcount of the handle, so keep a reference to the
* buffer for as long as you use the sg_table.
*/
struct sg_table *nvmap_sg_table(struct nvmap_client *client,
struct nvmap_handle_ref *ref);
void nvmap_free_sg_table(struct nvmap_client *client,
struct nvmap_handle_ref *ref, struct sg_table *sgt);
void nvmap_set_nvhost_private(struct nvmap_handle_ref *ref, void *priv,
void (*delete)(void *priv));
void *nvmap_get_nvhost_private(struct nvmap_handle_ref *ref);
/*
* Flush cache maintenance operations for the handle that have been deferred.
* Use this if you don't use nvmap_pin for mapping the buffer to IOVA.
*/
void nvmap_flush_deferred_cache(struct nvmap_client *client,
struct nvmap_handle_ref *ref);
int nvmap_get_handle_param(struct nvmap_client *client,
struct nvmap_handle_ref *ref, u32 param, u64 *result);
int nvmap_get_dmabuf_param(struct dma_buf *dmabuf, u32 param, u64 *result);
#ifdef CONFIG_NVMAP_PAGE_POOLS
ulong nvmap_page_pool_get_unused_pages(void);
#else
static inline int nvmap_page_pool_get_unused_pages(void)
{
return 0;
}
#endif
ulong nvmap_iovmm_get_used_pages(void);
struct nvmap_platform_carveout {
const char *name;
unsigned int usage_mask;
phys_addr_t base;
size_t size;
size_t buddy_size;
};
struct nvmap_platform_data {
const struct nvmap_platform_carveout *carveouts;
unsigned int nr_carveouts;
};
extern struct nvmap_device *nvmap_dev;
#endif /* __KERNEL__ */
/*
* DOC: NvMap Userspace API
*
* create a client by opening /dev/nvmap
* most operations handled via following ioctls
*
*/
enum {
NVMAP_HANDLE_PARAM_SIZE = 1,
NVMAP_HANDLE_PARAM_ALIGNMENT,
NVMAP_HANDLE_PARAM_BASE,
NVMAP_HANDLE_PARAM_HEAP,
NVMAP_HANDLE_PARAM_KIND,
NVMAP_HANDLE_PARAM_COMPR, /* ignored, to be removed */
};
enum {
NVMAP_CACHE_OP_WB = 0,
NVMAP_CACHE_OP_INV,
NVMAP_CACHE_OP_WB_INV,
};
struct nvmap_create_handle {
#ifdef CONFIG_COMPAT
union {
__u32 id; /* FromId */
__u32 size; /* CreateHandle */
__s32 fd; /* DmaBufFd or FromFd */
};
__u32 handle; /* returns nvmap handle */
#else
union {
unsigned long id; /* FromId */
__u32 size; /* CreateHandle */
__s32 fd; /* DmaBufFd or FromFd */
};
struct nvmap_handle *handle; /* returns nvmap handle */
#endif
};
struct nvmap_alloc_handle {
#ifdef CONFIG_COMPAT
__u32 handle; /* nvmap handle */
#else
struct nvmap_handle *handle; /* nvmap handle */
#endif
__u32 heap_mask; /* heaps to allocate from */
__u32 flags; /* wb/wc/uc/iwb etc. */
__u32 align; /* min alignment necessary */
};
struct nvmap_alloc_kind_handle {
#ifdef CONFIG_COMPAT
__u32 handle; /* nvmap handle */
#else
struct nvmap_handle *handle; /* nvmap handle */
#endif
__u32 heap_mask;
__u32 flags;
__u32 align;
__u8 kind;
__u8 comp_tags;
};
struct nvmap_map_caller {
#ifdef CONFIG_COMPAT
__u32 handle; /* nvmap handle */
#else
struct nvmap_handle *handle; /* nvmap handle */
#endif
__u32 offset; /* offset into hmem; should be page-aligned */
__u32 length; /* number of bytes to map */
__u32 flags; /* maps as wb/iwb etc. */
#ifdef CONFIG_COMPAT
__u32 addr; /* user pointer*/
#else
unsigned long addr; /* user pointer */
#endif
};
struct nvmap_rw_handle {
#ifdef CONFIG_COMPAT
__u32 addr; /* user pointer */
__u32 handle; /* nvmap handle */
#else
unsigned long addr; /* user pointer*/
struct nvmap_handle *handle; /* nvmap handle */
#endif
__u32 offset; /* offset into hmem */
__u32 elem_size; /* individual atom size */
__u32 hmem_stride; /* delta in bytes between atoms in hmem */
__u32 user_stride; /* delta in bytes between atoms in user */
__u32 count; /* number of atoms to copy */
};
struct nvmap_pin_handle {
#ifdef CONFIG_COMPAT
__u32 *handles; /* array of handles to pin/unpin */
__u32 *addr; /* array of addresses to return */
#else
struct nvmap_handle **handles; /* array of handles to pin/unpin */
unsigned long *addr; /* array of addresses to return */
#endif
__u32 count; /* number of entries in handles */
};
struct nvmap_handle_param {
#ifdef CONFIG_COMPAT
__u32 handle; /* nvmap handle */
#else
struct nvmap_handle *handle; /* nvmap handle */
#endif
__u32 param; /* size/align/base/heap etc. */
#ifdef CONFIG_COMPAT
__u32 result; /* returnes requested info*/
#else
unsigned long result; /* returnes requested info*/
#endif
};
struct nvmap_cache_op {
#ifdef CONFIG_COMPAT
__u32 addr; /* user pointer*/
__u32 handle; /* nvmap handle */
#else
unsigned long addr; /* user pointer*/
struct nvmap_handle *handle; /* nvmap handle */
#endif
__u32 len; /* bytes to flush */
__s32 op; /* wb/wb_inv/inv */
};
#define NVMAP_IOC_MAGIC 'N'
/* Creates a new memory handle. On input, the argument is the size of the new
* handle; on return, the argument is the name of the new handle
*/
#define NVMAP_IOC_CREATE _IOWR(NVMAP_IOC_MAGIC, 0, struct nvmap_create_handle)
#define NVMAP_IOC_CLAIM _IOWR(NVMAP_IOC_MAGIC, 1, struct nvmap_create_handle)
#define NVMAP_IOC_FROM_ID _IOWR(NVMAP_IOC_MAGIC, 2, struct nvmap_create_handle)
/* Actually allocates memory for the specified handle */
#define NVMAP_IOC_ALLOC _IOW(NVMAP_IOC_MAGIC, 3, struct nvmap_alloc_handle)
/* Frees a memory handle, unpinning any pinned pages and unmapping any mappings
*/
#define NVMAP_IOC_FREE _IO(NVMAP_IOC_MAGIC, 4)
/* Maps the region of the specified handle into a user-provided virtual address
* that was previously created via an mmap syscall on this fd */
#define NVMAP_IOC_MMAP _IOWR(NVMAP_IOC_MAGIC, 5, struct nvmap_map_caller)
/* Reads/writes data (possibly strided) from a user-provided buffer into the
* hmem at the specified offset */
#define NVMAP_IOC_WRITE _IOW(NVMAP_IOC_MAGIC, 6, struct nvmap_rw_handle)
#define NVMAP_IOC_READ _IOW(NVMAP_IOC_MAGIC, 7, struct nvmap_rw_handle)
#define NVMAP_IOC_PARAM _IOWR(NVMAP_IOC_MAGIC, 8, struct nvmap_handle_param)
/* Pins a list of memory handles into IO-addressable memory (either IOVMM
* space or physical memory, depending on the allocation), and returns the
* address. Handles may be pinned recursively. */
#define NVMAP_IOC_PIN_MULT _IOWR(NVMAP_IOC_MAGIC, 10, struct nvmap_pin_handle)
#define NVMAP_IOC_UNPIN_MULT _IOW(NVMAP_IOC_MAGIC, 11, struct nvmap_pin_handle)
#define NVMAP_IOC_CACHE _IOW(NVMAP_IOC_MAGIC, 12, struct nvmap_cache_op)
/* Returns a global ID usable to allow a remote process to create a handle
* reference to the same handle */
#define NVMAP_IOC_GET_ID _IOWR(NVMAP_IOC_MAGIC, 13, struct nvmap_create_handle)
/* Returns a dma-buf fd usable to allow a remote process to create a handle
* reference to the same handle */
#define NVMAP_IOC_SHARE _IOWR(NVMAP_IOC_MAGIC, 14, struct nvmap_create_handle)
/* Returns a file id that allows a remote process to create a handle
* reference to the same handle */
#define NVMAP_IOC_GET_FD _IOWR(NVMAP_IOC_MAGIC, 15, struct nvmap_create_handle)
/* Create a new memory handle from file id passed */
#define NVMAP_IOC_FROM_FD _IOWR(NVMAP_IOC_MAGIC, 16, struct nvmap_create_handle)
/* START of T124 IOCTLS */
/* Actually allocates memory for the specified handle, with kind */
#define NVMAP_IOC_ALLOC_KIND _IOW(NVMAP_IOC_MAGIC, 100, struct nvmap_alloc_kind_handle)
#define NVMAP_IOC_MAXNR (_IOC_NR(NVMAP_IOC_ALLOC_KIND))
#endif /* _LINUX_NVMAP_H */
|