tegra: Add nvmap_mark_global()
[linux-2.6.git] / include / linux / nvmap.h
1 /*
2  * include/linux/nvmap.h
3  *
4  * structure declarations for nvmem and nvmap user-space ioctls
5  *
6  * Copyright (c) 2009-2012, NVIDIA CORPORATION. All rights reserved.
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful, but WITHOUT
14  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
15  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
16  * more details.
17  *
18  * You should have received a copy of the GNU General Public License along
19  * with this program; if not, write to the Free Software Foundation, Inc.,
20  * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
21  */
22
23 #include <linux/ioctl.h>
24 #include <linux/file.h>
25 #include <linux/rbtree.h>
26
27 #if !defined(__KERNEL__)
28 #define __user
29 #endif
30
31 #ifndef _LINUX_NVMAP_H
32 #define _LINUX_NVMAP_H
33
34 #define NVMAP_HEAP_SYSMEM  (1ul<<31)
35 #define NVMAP_HEAP_IOVMM   (1ul<<30)
36
37 /* common carveout heaps */
38 #define NVMAP_HEAP_CARVEOUT_IRAM    (1ul<<29)
39 #define NVMAP_HEAP_CARVEOUT_VPR     (1ul<<28)
40 #define NVMAP_HEAP_CARVEOUT_GENERIC (1ul<<0)
41
42 #define NVMAP_HEAP_CARVEOUT_MASK    (NVMAP_HEAP_IOVMM - 1)
43
44 /* allocation flags */
45 #define NVMAP_HANDLE_UNCACHEABLE     (0x0ul << 0)
46 #define NVMAP_HANDLE_WRITE_COMBINE   (0x1ul << 0)
47 #define NVMAP_HANDLE_INNER_CACHEABLE (0x2ul << 0)
48 #define NVMAP_HANDLE_CACHEABLE       (0x3ul << 0)
49 #define NVMAP_HANDLE_CACHE_FLAG      (0x3ul << 0)
50
51 #define NVMAP_HANDLE_SECURE          (0x1ul << 2)
52 #define NVMAP_HANDLE_ZEROED_PAGES    (0x1ul << 3)
53
54 #if defined(__KERNEL__)
55
56 #if defined(CONFIG_TEGRA_NVMAP)
57 struct nvmap_handle;
58 struct nvmap_client;
59 struct nvmap_device;
60
61 #define nvmap_ref_to_handle(_ref) (*(struct nvmap_handle **)(_ref))
62 /* Convert User space handle to Kernel. */
63 #define nvmap_convert_handle_u2k(h) (h)
64
65 /* handle_ref objects are client-local references to an nvmap_handle;
66  * they are distinct objects so that handles can be unpinned and
67  * unreferenced the correct number of times when a client abnormally
68  * terminates */
69 struct nvmap_handle_ref {
70         struct nvmap_handle *handle;
71         struct rb_node  node;
72         atomic_t        dupes;  /* number of times to free on file close */
73         atomic_t        pin;    /* number of times to unpin on free */
74 };
75
76 #elif defined(CONFIG_ION_TEGRA)
77 /* For Ion Mem Manager support through nvmap_* API's. */
78 #include "../../../../../drivers/gpu/ion/ion_priv.h"
79 #define nvmap_client ion_client
80 #define nvmap_device ion_device
81 #define nvmap_handle ion_handle
82 #define nvmap_handle_ref ion_handle
83 #define nvmap_ref_to_handle(_ref) (struct ion_handle *)_ref
84 /* Convert User space handle to Kernel. */
85 #define nvmap_convert_handle_u2k(h) ({ \
86         if ((u32)h >= TASK_SIZE) { \
87                 pr_err("Invalid user space handle."); \
88                 BUG(); \
89         } \
90         (*((u32 *)h)); })
91
92 #endif /* CONFIG_ION_TEGRA */
93
94 #define nvmap_id_to_handle(_id) ((struct nvmap_handle *)(_id))
95
96 struct nvmap_client *nvmap_create_client(struct nvmap_device *dev,
97                                          const char *name);
98
99 struct nvmap_handle_ref *nvmap_alloc(struct nvmap_client *client, size_t size,
100                                      size_t align, unsigned int flags,
101                                      unsigned int heap_mask);
102
103 void nvmap_free(struct nvmap_client *client, struct nvmap_handle_ref *r);
104
105 void *nvmap_mmap(struct nvmap_handle_ref *r);
106
107 void nvmap_munmap(struct nvmap_handle_ref *r, void *addr);
108
109 struct nvmap_client *nvmap_client_get_file(int fd);
110
111 struct nvmap_client *nvmap_client_get(struct nvmap_client *client);
112
113 void nvmap_client_put(struct nvmap_client *c);
114
115 phys_addr_t nvmap_pin(struct nvmap_client *c, struct nvmap_handle_ref *r);
116
117 phys_addr_t nvmap_handle_address(struct nvmap_client *c, unsigned long id);
118
119 void nvmap_unpin(struct nvmap_client *client, struct nvmap_handle_ref *r);
120
121 void nvmap_unpin_handles(struct nvmap_client *client,
122                          struct nvmap_handle **h, int nr);
123
124 struct nvmap_handle_ref *nvmap_duplicate_handle_id(struct nvmap_client *client,
125                                                    unsigned long id);
126
127 int nvmap_mark_global(struct nvmap_client *client, struct nvmap_handle_ref *r);
128
129 struct nvmap_platform_carveout {
130         const char *name;
131         unsigned int usage_mask;
132         phys_addr_t base;
133         size_t size;
134         size_t buddy_size;
135 };
136
137 struct nvmap_platform_data {
138         const struct nvmap_platform_carveout *carveouts;
139         unsigned int nr_carveouts;
140 };
141
142 extern struct nvmap_device *nvmap_dev;
143
144 #endif /* __KERNEL__ */
145
146 #endif /* _LINUX_NVMAP_H */