1 | #ifndef __DRM_LEGACY_H__ |
2 | #define __DRM_LEGACY_H__ |
3 | |
4 | /* |
5 | * Copyright (c) 2014 David Herrmann <dh.herrmann@gmail.com> |
6 | * |
7 | * Permission is hereby granted, free of charge, to any person obtaining a |
8 | * copy of this software and associated documentation files (the "Software"), |
9 | * to deal in the Software without restriction, including without limitation |
10 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, |
11 | * and/or sell copies of the Software, and to permit persons to whom the |
12 | * Software is furnished to do so, subject to the following conditions: |
13 | * |
14 | * The above copyright notice and this permission notice shall be included in |
15 | * all copies or substantial portions of the Software. |
16 | * |
17 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
18 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
19 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
20 | * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR |
21 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, |
22 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR |
23 | * OTHER DEALINGS IN THE SOFTWARE. |
24 | */ |
25 | |
26 | /* |
27 | * This file contains legacy interfaces that modern drm drivers |
28 | * should no longer be using. They cannot be removed as legacy |
29 | * drivers use them, and removing them are API breaks. |
30 | */ |
31 | #include <linux/list.h> |
32 | |
33 | #include <drm/drm.h> |
34 | #include <drm/drm_device.h> |
35 | #include <drm/drm_legacy.h> |
36 | |
37 | struct agp_memory; |
38 | struct drm_buf_desc; |
39 | struct drm_device; |
40 | struct drm_file; |
41 | struct drm_hash_item; |
42 | struct drm_open_hash; |
43 | |
44 | /* |
45 | * Hash-table Support |
46 | */ |
47 | |
48 | #define drm_hash_entry(_ptr, _type, _member) container_of(_ptr, _type, _member) |
49 | |
50 | /* drm_hashtab.c */ |
51 | #if IS_ENABLED(CONFIG_DRM_LEGACY) |
52 | int drm_ht_create(struct drm_open_hash *ht, unsigned int order); |
53 | int drm_ht_insert_item(struct drm_open_hash *ht, struct drm_hash_item *item); |
54 | int drm_ht_just_insert_please(struct drm_open_hash *ht, struct drm_hash_item *item, |
55 | unsigned long seed, int bits, int shift, |
56 | unsigned long add); |
57 | int drm_ht_find_item(struct drm_open_hash *ht, unsigned long key, struct drm_hash_item **item); |
58 | |
59 | void drm_ht_verbose_list(struct drm_open_hash *ht, unsigned long key); |
60 | int drm_ht_remove_key(struct drm_open_hash *ht, unsigned long key); |
61 | int drm_ht_remove_item(struct drm_open_hash *ht, struct drm_hash_item *item); |
62 | void drm_ht_remove(struct drm_open_hash *ht); |
63 | #endif |
64 | |
65 | /* |
66 | * RCU-safe interface |
67 | * |
68 | * The user of this API needs to make sure that two or more instances of the |
69 | * hash table manipulation functions are never run simultaneously. |
70 | * The lookup function drm_ht_find_item_rcu may, however, run simultaneously |
71 | * with any of the manipulation functions as long as it's called from within |
72 | * an RCU read-locked section. |
73 | */ |
74 | #define drm_ht_insert_item_rcu drm_ht_insert_item |
75 | #define drm_ht_just_insert_please_rcu drm_ht_just_insert_please |
76 | #define drm_ht_remove_key_rcu drm_ht_remove_key |
77 | #define drm_ht_remove_item_rcu drm_ht_remove_item |
78 | #define drm_ht_find_item_rcu drm_ht_find_item |
79 | |
80 | /* |
81 | * Generic DRM Contexts |
82 | */ |
83 | |
84 | #define DRM_KERNEL_CONTEXT 0 |
85 | #define DRM_RESERVED_CONTEXTS 1 |
86 | |
87 | #if IS_ENABLED(CONFIG_DRM_LEGACY) |
88 | void drm_legacy_ctxbitmap_init(struct drm_device *dev); |
89 | void drm_legacy_ctxbitmap_cleanup(struct drm_device *dev); |
90 | void drm_legacy_ctxbitmap_flush(struct drm_device *dev, struct drm_file *file); |
91 | #else |
92 | static inline void drm_legacy_ctxbitmap_init(struct drm_device *dev) {} |
93 | static inline void drm_legacy_ctxbitmap_cleanup(struct drm_device *dev) {} |
94 | static inline void drm_legacy_ctxbitmap_flush(struct drm_device *dev, struct drm_file *file) {} |
95 | #endif |
96 | |
97 | void drm_legacy_ctxbitmap_free(struct drm_device *dev, int ctx_handle); |
98 | |
99 | #if IS_ENABLED(CONFIG_DRM_LEGACY) |
100 | int drm_legacy_resctx(struct drm_device *d, void *v, struct drm_file *f); |
101 | int drm_legacy_addctx(struct drm_device *d, void *v, struct drm_file *f); |
102 | int drm_legacy_getctx(struct drm_device *d, void *v, struct drm_file *f); |
103 | int drm_legacy_switchctx(struct drm_device *d, void *v, struct drm_file *f); |
104 | int drm_legacy_newctx(struct drm_device *d, void *v, struct drm_file *f); |
105 | int drm_legacy_rmctx(struct drm_device *d, void *v, struct drm_file *f); |
106 | |
107 | int drm_legacy_setsareactx(struct drm_device *d, void *v, struct drm_file *f); |
108 | int drm_legacy_getsareactx(struct drm_device *d, void *v, struct drm_file *f); |
109 | #endif |
110 | |
111 | /* |
112 | * Generic Buffer Management |
113 | */ |
114 | |
115 | #define DRM_MAP_HASH_OFFSET 0x10000000 |
116 | |
117 | #if IS_ENABLED(CONFIG_DRM_LEGACY) |
118 | static inline int drm_legacy_create_map_hash(struct drm_device *dev) |
119 | { |
120 | return drm_ht_create(ht: &dev->map_hash, order: 12); |
121 | } |
122 | |
123 | static inline void drm_legacy_remove_map_hash(struct drm_device *dev) |
124 | { |
125 | drm_ht_remove(ht: &dev->map_hash); |
126 | } |
127 | #else |
128 | static inline int drm_legacy_create_map_hash(struct drm_device *dev) |
129 | { |
130 | return 0; |
131 | } |
132 | |
133 | static inline void drm_legacy_remove_map_hash(struct drm_device *dev) {} |
134 | #endif |
135 | |
136 | |
137 | #if IS_ENABLED(CONFIG_DRM_LEGACY) |
138 | int drm_legacy_getmap_ioctl(struct drm_device *dev, void *data, |
139 | struct drm_file *file_priv); |
140 | int drm_legacy_addmap_ioctl(struct drm_device *d, void *v, struct drm_file *f); |
141 | int drm_legacy_rmmap_ioctl(struct drm_device *d, void *v, struct drm_file *f); |
142 | |
143 | int drm_legacy_addbufs(struct drm_device *d, void *v, struct drm_file *f); |
144 | int drm_legacy_infobufs(struct drm_device *d, void *v, struct drm_file *f); |
145 | int drm_legacy_markbufs(struct drm_device *d, void *v, struct drm_file *f); |
146 | int drm_legacy_freebufs(struct drm_device *d, void *v, struct drm_file *f); |
147 | int drm_legacy_mapbufs(struct drm_device *d, void *v, struct drm_file *f); |
148 | int drm_legacy_dma_ioctl(struct drm_device *d, void *v, struct drm_file *f); |
149 | #endif |
150 | |
151 | int __drm_legacy_infobufs(struct drm_device *, void *, int *, |
152 | int (*)(void *, int, struct drm_buf_entry *)); |
153 | int __drm_legacy_mapbufs(struct drm_device *, void *, int *, |
154 | void __user **, |
155 | int (*)(void *, int, unsigned long, struct drm_buf *), |
156 | struct drm_file *); |
157 | |
158 | #if IS_ENABLED(CONFIG_DRM_LEGACY) |
159 | void drm_legacy_master_rmmaps(struct drm_device *dev, |
160 | struct drm_master *master); |
161 | void drm_legacy_rmmaps(struct drm_device *dev); |
162 | #else |
163 | static inline void drm_legacy_master_rmmaps(struct drm_device *dev, |
164 | struct drm_master *master) {} |
165 | static inline void drm_legacy_rmmaps(struct drm_device *dev) {} |
166 | #endif |
167 | |
168 | #if IS_ENABLED(CONFIG_DRM_LEGACY) |
169 | void drm_legacy_vma_flush(struct drm_device *d); |
170 | #else |
171 | static inline void drm_legacy_vma_flush(struct drm_device *d) |
172 | { |
173 | /* do nothing */ |
174 | } |
175 | #endif |
176 | |
177 | /* |
178 | * AGP Support |
179 | */ |
180 | |
181 | struct drm_agp_mem { |
182 | unsigned long handle; |
183 | struct agp_memory *memory; |
184 | unsigned long bound; |
185 | int pages; |
186 | struct list_head head; |
187 | }; |
188 | |
189 | /* drm_agpsupport.c */ |
190 | #if IS_ENABLED(CONFIG_DRM_LEGACY) && IS_ENABLED(CONFIG_AGP) |
191 | void drm_legacy_agp_clear(struct drm_device *dev); |
192 | |
193 | int drm_legacy_agp_acquire_ioctl(struct drm_device *dev, void *data, |
194 | struct drm_file *file_priv); |
195 | int drm_legacy_agp_release_ioctl(struct drm_device *dev, void *data, |
196 | struct drm_file *file_priv); |
197 | int drm_legacy_agp_enable_ioctl(struct drm_device *dev, void *data, |
198 | struct drm_file *file_priv); |
199 | int drm_legacy_agp_info_ioctl(struct drm_device *dev, void *data, |
200 | struct drm_file *file_priv); |
201 | int drm_legacy_agp_alloc_ioctl(struct drm_device *dev, void *data, |
202 | struct drm_file *file_priv); |
203 | int drm_legacy_agp_free_ioctl(struct drm_device *dev, void *data, |
204 | struct drm_file *file_priv); |
205 | int drm_legacy_agp_unbind_ioctl(struct drm_device *dev, void *data, |
206 | struct drm_file *file_priv); |
207 | int drm_legacy_agp_bind_ioctl(struct drm_device *dev, void *data, |
208 | struct drm_file *file_priv); |
209 | #else |
210 | static inline void drm_legacy_agp_clear(struct drm_device *dev) {} |
211 | #endif |
212 | |
213 | /* drm_lock.c */ |
214 | #if IS_ENABLED(CONFIG_DRM_LEGACY) |
215 | int drm_legacy_lock(struct drm_device *d, void *v, struct drm_file *f); |
216 | int drm_legacy_unlock(struct drm_device *d, void *v, struct drm_file *f); |
217 | void drm_legacy_lock_release(struct drm_device *dev, struct file *filp); |
218 | #else |
219 | static inline void drm_legacy_lock_release(struct drm_device *dev, struct file *filp) {} |
220 | #endif |
221 | |
222 | /* DMA support */ |
223 | #if IS_ENABLED(CONFIG_DRM_LEGACY) |
224 | int drm_legacy_dma_setup(struct drm_device *dev); |
225 | void drm_legacy_dma_takedown(struct drm_device *dev); |
226 | #else |
227 | static inline int drm_legacy_dma_setup(struct drm_device *dev) |
228 | { |
229 | return 0; |
230 | } |
231 | #endif |
232 | |
233 | void drm_legacy_free_buffer(struct drm_device *dev, |
234 | struct drm_buf * buf); |
235 | #if IS_ENABLED(CONFIG_DRM_LEGACY) |
236 | void drm_legacy_reclaim_buffers(struct drm_device *dev, |
237 | struct drm_file *filp); |
238 | #else |
239 | static inline void drm_legacy_reclaim_buffers(struct drm_device *dev, |
240 | struct drm_file *filp) {} |
241 | #endif |
242 | |
243 | /* Scatter Gather Support */ |
244 | #if IS_ENABLED(CONFIG_DRM_LEGACY) |
245 | void drm_legacy_sg_cleanup(struct drm_device *dev); |
246 | int drm_legacy_sg_alloc(struct drm_device *dev, void *data, |
247 | struct drm_file *file_priv); |
248 | int drm_legacy_sg_free(struct drm_device *dev, void *data, |
249 | struct drm_file *file_priv); |
250 | #endif |
251 | |
252 | #if IS_ENABLED(CONFIG_DRM_LEGACY) |
253 | void drm_legacy_init_members(struct drm_device *dev); |
254 | void drm_legacy_destroy_members(struct drm_device *dev); |
255 | void drm_legacy_dev_reinit(struct drm_device *dev); |
256 | int drm_legacy_setup(struct drm_device * dev); |
257 | #else |
258 | static inline void drm_legacy_init_members(struct drm_device *dev) {} |
259 | static inline void drm_legacy_destroy_members(struct drm_device *dev) {} |
260 | static inline void drm_legacy_dev_reinit(struct drm_device *dev) {} |
261 | static inline int drm_legacy_setup(struct drm_device * dev) { return 0; } |
262 | #endif |
263 | |
264 | #if IS_ENABLED(CONFIG_DRM_LEGACY) |
265 | void drm_legacy_lock_master_cleanup(struct drm_device *dev, struct drm_master *master); |
266 | #else |
267 | static inline void drm_legacy_lock_master_cleanup(struct drm_device *dev, struct drm_master *master) {} |
268 | #endif |
269 | |
270 | #if IS_ENABLED(CONFIG_DRM_LEGACY) |
271 | void drm_master_legacy_init(struct drm_master *master); |
272 | #else |
273 | static inline void drm_master_legacy_init(struct drm_master *master) {} |
274 | #endif |
275 | |
276 | /* drm_pci.c */ |
277 | #if IS_ENABLED(CONFIG_DRM_LEGACY) && IS_ENABLED(CONFIG_PCI) |
278 | int drm_legacy_irq_by_busid(struct drm_device *dev, void *data, struct drm_file *file_priv); |
279 | void drm_legacy_pci_agp_destroy(struct drm_device *dev); |
280 | #else |
281 | static inline int drm_legacy_irq_by_busid(struct drm_device *dev, void *data, |
282 | struct drm_file *file_priv) |
283 | { |
284 | return -EINVAL; |
285 | } |
286 | |
287 | static inline void drm_legacy_pci_agp_destroy(struct drm_device *dev) {} |
288 | #endif |
289 | |
290 | #endif /* __DRM_LEGACY_H__ */ |
291 | |