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