xref: /openbsd-src/sys/dev/pci/drm/drm_internal.h (revision 9ae055aa98477c317a219e1583828bdc1a75a10b)
14e5201e3Skettenis /*
24e5201e3Skettenis  * Copyright © 2014 Intel Corporation
34e5201e3Skettenis  *   Daniel Vetter <daniel.vetter@ffwll.ch>
44e5201e3Skettenis  *
54e5201e3Skettenis  * Permission is hereby granted, free of charge, to any person obtaining a
64e5201e3Skettenis  * copy of this software and associated documentation files (the "Software"),
74e5201e3Skettenis  * to deal in the Software without restriction, including without limitation
84e5201e3Skettenis  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
94e5201e3Skettenis  * and/or sell copies of the Software, and to permit persons to whom the
104e5201e3Skettenis  * Software is furnished to do so, subject to the following conditions:
114e5201e3Skettenis  *
124e5201e3Skettenis  * The above copyright notice and this permission notice shall be included in
134e5201e3Skettenis  * all copies or substantial portions of the Software.
144e5201e3Skettenis  *
154e5201e3Skettenis  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
164e5201e3Skettenis  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
174e5201e3Skettenis  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
184e5201e3Skettenis  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
194e5201e3Skettenis  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
204e5201e3Skettenis  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
214e5201e3Skettenis  * OTHER DEALINGS IN THE SOFTWARE.
224e5201e3Skettenis  */
234e5201e3Skettenis 
24ad8b1aafSjsg #include <linux/kthread.h>
25ad8b1aafSjsg 
26c349dbc7Sjsg #include <drm/drm_ioctl.h>
27ad8b1aafSjsg #include <drm/drm_vblank.h>
28c349dbc7Sjsg 
297f4dd379Sjsg #define DRM_IF_MAJOR 1
307f4dd379Sjsg #define DRM_IF_MINOR 4
314e5201e3Skettenis 
32c349dbc7Sjsg #define DRM_IF_VERSION(maj, min) (maj << 16 | min)
33c349dbc7Sjsg 
34c349dbc7Sjsg struct dentry;
35c349dbc7Sjsg struct dma_buf;
361bb76ff1Sjsg struct iosys_map;
37c349dbc7Sjsg struct drm_connector;
38c349dbc7Sjsg struct drm_crtc;
39c349dbc7Sjsg struct drm_framebuffer;
40c349dbc7Sjsg struct drm_gem_object;
41c349dbc7Sjsg struct drm_master;
42c349dbc7Sjsg struct drm_minor;
43c349dbc7Sjsg struct drm_prime_file_private;
44c349dbc7Sjsg struct drm_printer;
45ad8b1aafSjsg struct drm_vblank_crtc;
46c349dbc7Sjsg 
477f4dd379Sjsg /* drm_file.c */
48c349dbc7Sjsg extern struct rwlock drm_global_mutex;
49c349dbc7Sjsg bool drm_dev_needs_global_mutex(struct drm_device *dev);
507f4dd379Sjsg struct drm_file *drm_file_alloc(struct drm_minor *minor);
517f4dd379Sjsg void drm_file_free(struct drm_file *file);
52c349dbc7Sjsg void drm_lastclose(struct drm_device *dev);
53c349dbc7Sjsg 
54c349dbc7Sjsg #ifdef CONFIG_PCI
554e5201e3Skettenis 
564e5201e3Skettenis /* drm_pci.c */
577f4dd379Sjsg int drm_pci_set_busid(struct drm_device *dev, struct drm_master *master);
58c349dbc7Sjsg 
59c349dbc7Sjsg #else
60c349dbc7Sjsg 
61c349dbc7Sjsg static inline int drm_pci_set_busid(struct drm_device *dev,
62c349dbc7Sjsg 				    struct drm_master *master)
63c349dbc7Sjsg {
64c349dbc7Sjsg 	return -EINVAL;
65c349dbc7Sjsg }
66c349dbc7Sjsg 
674e5201e3Skettenis #endif
684e5201e3Skettenis 
694e5201e3Skettenis /* drm_prime.c */
704e5201e3Skettenis int drm_prime_handle_to_fd_ioctl(struct drm_device *dev, void *data,
714e5201e3Skettenis 				 struct drm_file *file_priv);
724e5201e3Skettenis int drm_prime_fd_to_handle_ioctl(struct drm_device *dev, void *data,
734e5201e3Skettenis 				 struct drm_file *file_priv);
744e5201e3Skettenis 
754e5201e3Skettenis void drm_prime_init_file_private(struct drm_prime_file_private *prime_fpriv);
764e5201e3Skettenis void drm_prime_destroy_file_private(struct drm_prime_file_private *prime_fpriv);
779524f5bdSjsg void drm_prime_remove_buf_handle(struct drm_prime_file_private *prime_fpriv,
789524f5bdSjsg 				 uint32_t handle);
794e5201e3Skettenis 
80ad8b1aafSjsg /* drm_managed.c */
81ad8b1aafSjsg void drm_managed_release(struct drm_device *dev);
82ad8b1aafSjsg void drmm_add_final_kfree(struct drm_device *dev, void *container);
83ad8b1aafSjsg 
847f4dd379Sjsg /* drm_vblank.c */
85ad8b1aafSjsg static inline bool drm_vblank_passed(u64 seq, u64 ref)
86ad8b1aafSjsg {
87ad8b1aafSjsg 	return (seq - ref) <= (1 << 23);
88ad8b1aafSjsg }
89ad8b1aafSjsg 
907f4dd379Sjsg void drm_vblank_disable_and_save(struct drm_device *dev, unsigned int pipe);
91ad8b1aafSjsg int drm_vblank_get(struct drm_device *dev, unsigned int pipe);
92ad8b1aafSjsg void drm_vblank_put(struct drm_device *dev, unsigned int pipe);
93ad8b1aafSjsg u64 drm_vblank_count(struct drm_device *dev, unsigned int pipe);
94ad8b1aafSjsg 
95ad8b1aafSjsg /* drm_vblank_work.c */
96ad8b1aafSjsg static inline void drm_vblank_flush_worker(struct drm_vblank_crtc *vblank)
97ad8b1aafSjsg {
98ad8b1aafSjsg 	kthread_flush_worker(vblank->worker);
99ad8b1aafSjsg }
100ad8b1aafSjsg 
101ad8b1aafSjsg static inline void drm_vblank_destroy_worker(struct drm_vblank_crtc *vblank)
102ad8b1aafSjsg {
1031bb76ff1Sjsg 	if (vblank->worker)
104ad8b1aafSjsg 		kthread_destroy_worker(vblank->worker);
105ad8b1aafSjsg }
106ad8b1aafSjsg 
107ad8b1aafSjsg int drm_vblank_worker_init(struct drm_vblank_crtc *vblank);
108ad8b1aafSjsg void drm_vblank_cancel_pending_works(struct drm_vblank_crtc *vblank);
109ad8b1aafSjsg void drm_handle_vblank_works(struct drm_vblank_crtc *vblank);
1107f4dd379Sjsg 
1117f4dd379Sjsg /* IOCTLS */
1127f4dd379Sjsg int drm_wait_vblank_ioctl(struct drm_device *dev, void *data,
1137f4dd379Sjsg 			  struct drm_file *filp);
1147f4dd379Sjsg int drm_legacy_modeset_ctl_ioctl(struct drm_device *dev, void *data,
1157f4dd379Sjsg 				 struct drm_file *file_priv);
1164e5201e3Skettenis 
1174e5201e3Skettenis /* drm_irq.c */
1187f4dd379Sjsg 
1197f4dd379Sjsg /* IOCTLS */
120c349dbc7Sjsg #if IS_ENABLED(CONFIG_DRM_LEGACY)
1217f4dd379Sjsg int drm_legacy_irq_control(struct drm_device *dev, void *data,
1224e5201e3Skettenis 			   struct drm_file *file_priv);
123c349dbc7Sjsg #endif
1247f4dd379Sjsg 
1257f4dd379Sjsg int drm_crtc_get_sequence_ioctl(struct drm_device *dev, void *data,
1267f4dd379Sjsg 				struct drm_file *filp);
1277f4dd379Sjsg 
1287f4dd379Sjsg int drm_crtc_queue_sequence_ioctl(struct drm_device *dev, void *data,
1297f4dd379Sjsg 				  struct drm_file *filp);
1304e5201e3Skettenis 
1314e5201e3Skettenis /* drm_auth.c */
1324e5201e3Skettenis int drm_getmagic(struct drm_device *dev, void *data,
1334e5201e3Skettenis 		 struct drm_file *file_priv);
1344e5201e3Skettenis int drm_authmagic(struct drm_device *dev, void *data,
1354e5201e3Skettenis 		  struct drm_file *file_priv);
1367f4dd379Sjsg int drm_setmaster_ioctl(struct drm_device *dev, void *data,
1377f4dd379Sjsg 			struct drm_file *file_priv);
1387f4dd379Sjsg int drm_dropmaster_ioctl(struct drm_device *dev, void *data,
1397f4dd379Sjsg 			 struct drm_file *file_priv);
1407f4dd379Sjsg int drm_master_open(struct drm_file *file_priv);
1417f4dd379Sjsg void drm_master_release(struct drm_file *file_priv);
142c349dbc7Sjsg bool drm_master_internal_acquire(struct drm_device *dev);
143c349dbc7Sjsg void drm_master_internal_release(struct drm_device *dev);
1444e5201e3Skettenis 
1454e5201e3Skettenis /* drm_sysfs.c */
146c349dbc7Sjsg #ifdef __linux__
1474e5201e3Skettenis extern struct class *drm_class;
1484e5201e3Skettenis 
1494e5201e3Skettenis int drm_sysfs_init(void);
1504e5201e3Skettenis void drm_sysfs_destroy(void);
1514e5201e3Skettenis struct device *drm_sysfs_minor_alloc(struct drm_minor *minor);
1524e5201e3Skettenis int drm_sysfs_connector_add(struct drm_connector *connector);
1534e5201e3Skettenis void drm_sysfs_connector_remove(struct drm_connector *connector);
1547f4dd379Sjsg 
1557f4dd379Sjsg void drm_sysfs_lease_event(struct drm_device *dev);
156c349dbc7Sjsg #else
157c349dbc7Sjsg static inline struct device *
158c349dbc7Sjsg drm_sysfs_minor_alloc(struct drm_minor *minor)
159c349dbc7Sjsg {
160c349dbc7Sjsg 	return ERR_PTR(-ENOSYS);
161c349dbc7Sjsg }
162c349dbc7Sjsg 
163c349dbc7Sjsg static inline int
164c349dbc7Sjsg drm_sysfs_connector_add(struct drm_connector *connector)
165c349dbc7Sjsg {
166c349dbc7Sjsg 	return 0;
167c349dbc7Sjsg }
168c349dbc7Sjsg 
169c349dbc7Sjsg static inline void
170c349dbc7Sjsg drm_sysfs_connector_remove(struct drm_connector *connector)
171c349dbc7Sjsg {
172c349dbc7Sjsg }
173c349dbc7Sjsg #endif
1744e5201e3Skettenis 
1754e5201e3Skettenis /* drm_gem.c */
1764e5201e3Skettenis int drm_gem_init(struct drm_device *dev);
1774e5201e3Skettenis int drm_gem_handle_create_tail(struct drm_file *file_priv,
1784e5201e3Skettenis 			       struct drm_gem_object *obj,
1794e5201e3Skettenis 			       u32 *handlep);
1804e5201e3Skettenis int drm_gem_close_ioctl(struct drm_device *dev, void *data,
1814e5201e3Skettenis 			struct drm_file *file_priv);
1824e5201e3Skettenis int drm_gem_flink_ioctl(struct drm_device *dev, void *data,
1834e5201e3Skettenis 			struct drm_file *file_priv);
1844e5201e3Skettenis int drm_gem_open_ioctl(struct drm_device *dev, void *data,
1854e5201e3Skettenis 		       struct drm_file *file_priv);
1864e5201e3Skettenis void drm_gem_open(struct drm_device *dev, struct drm_file *file_private);
1874e5201e3Skettenis void drm_gem_release(struct drm_device *dev, struct drm_file *file_private);
1887f4dd379Sjsg void drm_gem_print_info(struct drm_printer *p, unsigned int indent,
1897f4dd379Sjsg 			const struct drm_gem_object *obj);
1904e5201e3Skettenis 
191c349dbc7Sjsg int drm_gem_pin(struct drm_gem_object *obj);
192c349dbc7Sjsg void drm_gem_unpin(struct drm_gem_object *obj);
1931bb76ff1Sjsg int drm_gem_vmap(struct drm_gem_object *obj, struct iosys_map *map);
1941bb76ff1Sjsg void drm_gem_vunmap(struct drm_gem_object *obj, struct iosys_map *map);
1955ca02815Sjsg 
1967f4dd379Sjsg /* drm_debugfs.c drm_debugfs_crc.c */
1974e5201e3Skettenis #if defined(CONFIG_DEBUG_FS)
1984e5201e3Skettenis int drm_debugfs_init(struct drm_minor *minor, int minor_id,
1994e5201e3Skettenis 		     struct dentry *root);
200c349dbc7Sjsg void drm_debugfs_cleanup(struct drm_minor *minor);
201*f005ef32Sjsg void drm_debugfs_late_register(struct drm_device *dev);
202c349dbc7Sjsg void drm_debugfs_connector_add(struct drm_connector *connector);
2034e5201e3Skettenis void drm_debugfs_connector_remove(struct drm_connector *connector);
204c349dbc7Sjsg void drm_debugfs_crtc_add(struct drm_crtc *crtc);
2057f4dd379Sjsg void drm_debugfs_crtc_remove(struct drm_crtc *crtc);
206c349dbc7Sjsg void drm_debugfs_crtc_crc_add(struct drm_crtc *crtc);
2074e5201e3Skettenis #else
2084e5201e3Skettenis static inline int drm_debugfs_init(struct drm_minor *minor, int minor_id,
2094e5201e3Skettenis 				   struct dentry *root)
2104e5201e3Skettenis {
2114e5201e3Skettenis 	return 0;
2124e5201e3Skettenis }
2134e5201e3Skettenis 
214c349dbc7Sjsg static inline void drm_debugfs_cleanup(struct drm_minor *minor)
2154e5201e3Skettenis {
2164e5201e3Skettenis }
2174e5201e3Skettenis 
218*f005ef32Sjsg static inline void drm_debugfs_late_register(struct drm_device *dev)
219*f005ef32Sjsg {
220*f005ef32Sjsg }
221*f005ef32Sjsg 
222c349dbc7Sjsg static inline void drm_debugfs_connector_add(struct drm_connector *connector)
2234e5201e3Skettenis {
2244e5201e3Skettenis }
2254e5201e3Skettenis static inline void drm_debugfs_connector_remove(struct drm_connector *connector)
2264e5201e3Skettenis {
2274e5201e3Skettenis }
2287f4dd379Sjsg 
229c349dbc7Sjsg static inline void drm_debugfs_crtc_add(struct drm_crtc *crtc)
2307f4dd379Sjsg {
2317f4dd379Sjsg }
2327f4dd379Sjsg static inline void drm_debugfs_crtc_remove(struct drm_crtc *crtc)
2337f4dd379Sjsg {
2347f4dd379Sjsg }
2357f4dd379Sjsg 
236c349dbc7Sjsg static inline void drm_debugfs_crtc_crc_add(struct drm_crtc *crtc)
2377f4dd379Sjsg {
2387f4dd379Sjsg }
2397f4dd379Sjsg 
2404e5201e3Skettenis #endif
2417f4dd379Sjsg 
2427f4dd379Sjsg drm_ioctl_t drm_version;
2437f4dd379Sjsg drm_ioctl_t drm_getunique;
2447f4dd379Sjsg drm_ioctl_t drm_getclient;
2457f4dd379Sjsg 
2467f4dd379Sjsg /* drm_syncobj.c */
2477f4dd379Sjsg void drm_syncobj_open(struct drm_file *file_private);
2487f4dd379Sjsg void drm_syncobj_release(struct drm_file *file_private);
2497f4dd379Sjsg int drm_syncobj_create_ioctl(struct drm_device *dev, void *data,
2507f4dd379Sjsg 			     struct drm_file *file_private);
2517f4dd379Sjsg int drm_syncobj_destroy_ioctl(struct drm_device *dev, void *data,
2527f4dd379Sjsg 			      struct drm_file *file_private);
2537f4dd379Sjsg int drm_syncobj_handle_to_fd_ioctl(struct drm_device *dev, void *data,
2547f4dd379Sjsg 				   struct drm_file *file_private);
2557f4dd379Sjsg int drm_syncobj_fd_to_handle_ioctl(struct drm_device *dev, void *data,
2567f4dd379Sjsg 				   struct drm_file *file_private);
257c349dbc7Sjsg int drm_syncobj_transfer_ioctl(struct drm_device *dev, void *data,
258c349dbc7Sjsg 			       struct drm_file *file_private);
2597f4dd379Sjsg int drm_syncobj_wait_ioctl(struct drm_device *dev, void *data,
2607f4dd379Sjsg 			   struct drm_file *file_private);
261c349dbc7Sjsg int drm_syncobj_timeline_wait_ioctl(struct drm_device *dev, void *data,
262c349dbc7Sjsg 				    struct drm_file *file_private);
263*f005ef32Sjsg int drm_syncobj_eventfd_ioctl(struct drm_device *dev, void *data,
264*f005ef32Sjsg 			      struct drm_file *file_private);
2657f4dd379Sjsg int drm_syncobj_reset_ioctl(struct drm_device *dev, void *data,
2667f4dd379Sjsg 			    struct drm_file *file_private);
2677f4dd379Sjsg int drm_syncobj_signal_ioctl(struct drm_device *dev, void *data,
2687f4dd379Sjsg 			     struct drm_file *file_private);
269c349dbc7Sjsg int drm_syncobj_timeline_signal_ioctl(struct drm_device *dev, void *data,
270c349dbc7Sjsg 				      struct drm_file *file_private);
271c349dbc7Sjsg int drm_syncobj_query_ioctl(struct drm_device *dev, void *data,
272c349dbc7Sjsg 			    struct drm_file *file_private);
2737f4dd379Sjsg 
2747f4dd379Sjsg /* drm_framebuffer.c */
2757f4dd379Sjsg void drm_framebuffer_print_info(struct drm_printer *p, unsigned int indent,
2767f4dd379Sjsg 				const struct drm_framebuffer *fb);
277ad8b1aafSjsg void drm_framebuffer_debugfs_init(struct drm_minor *minor);
278