13d0407baSopenharmony_ci/*
23d0407baSopenharmony_ci * Copyright © 2014 Intel Corporation
33d0407baSopenharmony_ci *   Daniel Vetter <daniel.vetter@ffwll.ch>
43d0407baSopenharmony_ci *
53d0407baSopenharmony_ci * Permission is hereby granted, free of charge, to any person obtaining a
63d0407baSopenharmony_ci * copy of this software and associated documentation files (the "Software"),
73d0407baSopenharmony_ci * to deal in the Software without restriction, including without limitation
83d0407baSopenharmony_ci * the rights to use, copy, modify, merge, publish, distribute, sublicense,
93d0407baSopenharmony_ci * and/or sell copies of the Software, and to permit persons to whom the
103d0407baSopenharmony_ci * Software is furnished to do so, subject to the following conditions:
113d0407baSopenharmony_ci *
123d0407baSopenharmony_ci * The above copyright notice and this permission notice shall be included in
133d0407baSopenharmony_ci * all copies or substantial portions of the Software.
143d0407baSopenharmony_ci *
153d0407baSopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
163d0407baSopenharmony_ci * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
173d0407baSopenharmony_ci * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
183d0407baSopenharmony_ci * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
193d0407baSopenharmony_ci * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
203d0407baSopenharmony_ci * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
213d0407baSopenharmony_ci * OTHER DEALINGS IN THE SOFTWARE.
223d0407baSopenharmony_ci */
233d0407baSopenharmony_ci
243d0407baSopenharmony_ci#include <linux/kthread.h>
253d0407baSopenharmony_ci
263d0407baSopenharmony_ci#include <drm/drm_ioctl.h>
273d0407baSopenharmony_ci#include <drm/drm_vblank.h>
283d0407baSopenharmony_ci
293d0407baSopenharmony_ci#define DRM_IF_MAJOR 1
303d0407baSopenharmony_ci#define DRM_IF_MINOR 4
313d0407baSopenharmony_ci
323d0407baSopenharmony_ci#define DRM_IF_VERSION(maj, min) (maj << 16 | min)
333d0407baSopenharmony_ci
343d0407baSopenharmony_cistruct dentry;
353d0407baSopenharmony_cistruct dma_buf;
363d0407baSopenharmony_cistruct drm_connector;
373d0407baSopenharmony_cistruct drm_crtc;
383d0407baSopenharmony_cistruct drm_framebuffer;
393d0407baSopenharmony_cistruct drm_gem_object;
403d0407baSopenharmony_cistruct drm_master;
413d0407baSopenharmony_cistruct drm_minor;
423d0407baSopenharmony_cistruct drm_prime_file_private;
433d0407baSopenharmony_cistruct drm_printer;
443d0407baSopenharmony_cistruct drm_vblank_crtc;
453d0407baSopenharmony_ci
463d0407baSopenharmony_ci/* drm_file.c */
473d0407baSopenharmony_ciextern struct mutex drm_global_mutex;
483d0407baSopenharmony_cibool drm_dev_needs_global_mutex(struct drm_device *dev);
493d0407baSopenharmony_cistruct drm_file *drm_file_alloc(struct drm_minor *minor);
503d0407baSopenharmony_civoid drm_file_free(struct drm_file *file);
513d0407baSopenharmony_civoid drm_lastclose(struct drm_device *dev);
523d0407baSopenharmony_ci
533d0407baSopenharmony_ci#ifdef CONFIG_PCI
543d0407baSopenharmony_ci
553d0407baSopenharmony_ci/* drm_pci.c */
563d0407baSopenharmony_ciint drm_irq_by_busid(struct drm_device *dev, void *data,
573d0407baSopenharmony_ci		     struct drm_file *file_priv);
583d0407baSopenharmony_civoid drm_pci_agp_destroy(struct drm_device *dev);
593d0407baSopenharmony_ciint drm_pci_set_busid(struct drm_device *dev, struct drm_master *master);
603d0407baSopenharmony_ci
613d0407baSopenharmony_ci#else
623d0407baSopenharmony_ci
633d0407baSopenharmony_cistatic inline int drm_irq_by_busid(struct drm_device *dev, void *data,
643d0407baSopenharmony_ci				   struct drm_file *file_priv)
653d0407baSopenharmony_ci{
663d0407baSopenharmony_ci	return -EINVAL;
673d0407baSopenharmony_ci}
683d0407baSopenharmony_ci
693d0407baSopenharmony_cistatic inline void drm_pci_agp_destroy(struct drm_device *dev)
703d0407baSopenharmony_ci{
713d0407baSopenharmony_ci}
723d0407baSopenharmony_ci
733d0407baSopenharmony_cistatic inline int drm_pci_set_busid(struct drm_device *dev,
743d0407baSopenharmony_ci				    struct drm_master *master)
753d0407baSopenharmony_ci{
763d0407baSopenharmony_ci	return -EINVAL;
773d0407baSopenharmony_ci}
783d0407baSopenharmony_ci
793d0407baSopenharmony_ci#endif
803d0407baSopenharmony_ci
813d0407baSopenharmony_ci/* drm_prime.c */
823d0407baSopenharmony_ciint drm_prime_handle_to_fd_ioctl(struct drm_device *dev, void *data,
833d0407baSopenharmony_ci				 struct drm_file *file_priv);
843d0407baSopenharmony_ciint drm_prime_fd_to_handle_ioctl(struct drm_device *dev, void *data,
853d0407baSopenharmony_ci				 struct drm_file *file_priv);
863d0407baSopenharmony_ci
873d0407baSopenharmony_civoid drm_prime_init_file_private(struct drm_prime_file_private *prime_fpriv);
883d0407baSopenharmony_civoid drm_prime_destroy_file_private(struct drm_prime_file_private *prime_fpriv);
893d0407baSopenharmony_civoid drm_prime_remove_buf_handle_locked(struct drm_prime_file_private *prime_fpriv,
903d0407baSopenharmony_ci					struct dma_buf *dma_buf);
913d0407baSopenharmony_ci
923d0407baSopenharmony_ci/* drm_drv.c */
933d0407baSopenharmony_cistruct drm_minor *drm_minor_acquire(unsigned int minor_id);
943d0407baSopenharmony_civoid drm_minor_release(struct drm_minor *minor);
953d0407baSopenharmony_ci
963d0407baSopenharmony_ci/* drm_managed.c */
973d0407baSopenharmony_civoid drm_managed_release(struct drm_device *dev);
983d0407baSopenharmony_civoid drmm_add_final_kfree(struct drm_device *dev, void *container);
993d0407baSopenharmony_ci
1003d0407baSopenharmony_ci/* drm_vblank.c */
1013d0407baSopenharmony_cistatic inline bool drm_vblank_passed(u64 seq, u64 ref)
1023d0407baSopenharmony_ci{
1033d0407baSopenharmony_ci	return (seq - ref) <= (1 << 23);
1043d0407baSopenharmony_ci}
1053d0407baSopenharmony_ci
1063d0407baSopenharmony_civoid drm_vblank_disable_and_save(struct drm_device *dev, unsigned int pipe);
1073d0407baSopenharmony_ciint drm_vblank_get(struct drm_device *dev, unsigned int pipe);
1083d0407baSopenharmony_civoid drm_vblank_put(struct drm_device *dev, unsigned int pipe);
1093d0407baSopenharmony_ciu64 drm_vblank_count(struct drm_device *dev, unsigned int pipe);
1103d0407baSopenharmony_ci
1113d0407baSopenharmony_ci/* drm_vblank_work.c */
1123d0407baSopenharmony_cistatic inline void drm_vblank_flush_worker(struct drm_vblank_crtc *vblank)
1133d0407baSopenharmony_ci{
1143d0407baSopenharmony_ci	kthread_flush_worker(vblank->worker);
1153d0407baSopenharmony_ci}
1163d0407baSopenharmony_ci
1173d0407baSopenharmony_cistatic inline void drm_vblank_destroy_worker(struct drm_vblank_crtc *vblank)
1183d0407baSopenharmony_ci{
1193d0407baSopenharmony_ci	kthread_destroy_worker(vblank->worker);
1203d0407baSopenharmony_ci}
1213d0407baSopenharmony_ci
1223d0407baSopenharmony_ciint drm_vblank_worker_init(struct drm_vblank_crtc *vblank);
1233d0407baSopenharmony_civoid drm_vblank_cancel_pending_works(struct drm_vblank_crtc *vblank);
1243d0407baSopenharmony_civoid drm_handle_vblank_works(struct drm_vblank_crtc *vblank);
1253d0407baSopenharmony_ci
1263d0407baSopenharmony_ci/* IOCTLS */
1273d0407baSopenharmony_ciint drm_wait_vblank_ioctl(struct drm_device *dev, void *data,
1283d0407baSopenharmony_ci			  struct drm_file *filp);
1293d0407baSopenharmony_ciint drm_legacy_modeset_ctl_ioctl(struct drm_device *dev, void *data,
1303d0407baSopenharmony_ci				 struct drm_file *file_priv);
1313d0407baSopenharmony_ci
1323d0407baSopenharmony_ci/* drm_irq.c */
1333d0407baSopenharmony_ci
1343d0407baSopenharmony_ci/* IOCTLS */
1353d0407baSopenharmony_ci#if IS_ENABLED(CONFIG_DRM_LEGACY)
1363d0407baSopenharmony_ciint drm_legacy_irq_control(struct drm_device *dev, void *data,
1373d0407baSopenharmony_ci			   struct drm_file *file_priv);
1383d0407baSopenharmony_ci#endif
1393d0407baSopenharmony_ci
1403d0407baSopenharmony_ciint drm_crtc_get_sequence_ioctl(struct drm_device *dev, void *data,
1413d0407baSopenharmony_ci				struct drm_file *filp);
1423d0407baSopenharmony_ci
1433d0407baSopenharmony_ciint drm_crtc_queue_sequence_ioctl(struct drm_device *dev, void *data,
1443d0407baSopenharmony_ci				  struct drm_file *filp);
1453d0407baSopenharmony_ci
1463d0407baSopenharmony_ci/* drm_auth.c */
1473d0407baSopenharmony_ciint drm_getmagic(struct drm_device *dev, void *data,
1483d0407baSopenharmony_ci		 struct drm_file *file_priv);
1493d0407baSopenharmony_ciint drm_authmagic(struct drm_device *dev, void *data,
1503d0407baSopenharmony_ci		  struct drm_file *file_priv);
1513d0407baSopenharmony_ciint drm_setmaster_ioctl(struct drm_device *dev, void *data,
1523d0407baSopenharmony_ci			struct drm_file *file_priv);
1533d0407baSopenharmony_ciint drm_dropmaster_ioctl(struct drm_device *dev, void *data,
1543d0407baSopenharmony_ci			 struct drm_file *file_priv);
1553d0407baSopenharmony_ciint drm_master_open(struct drm_file *file_priv);
1563d0407baSopenharmony_civoid drm_master_release(struct drm_file *file_priv);
1573d0407baSopenharmony_cibool drm_master_internal_acquire(struct drm_device *dev);
1583d0407baSopenharmony_civoid drm_master_internal_release(struct drm_device *dev);
1593d0407baSopenharmony_ci
1603d0407baSopenharmony_ci/* drm_sysfs.c */
1613d0407baSopenharmony_ciextern struct class *drm_class;
1623d0407baSopenharmony_ci
1633d0407baSopenharmony_ciint drm_sysfs_init(void);
1643d0407baSopenharmony_civoid drm_sysfs_destroy(void);
1653d0407baSopenharmony_cistruct device *drm_sysfs_minor_alloc(struct drm_minor *minor);
1663d0407baSopenharmony_ciint drm_sysfs_connector_add(struct drm_connector *connector);
1673d0407baSopenharmony_civoid drm_sysfs_connector_remove(struct drm_connector *connector);
1683d0407baSopenharmony_ci
1693d0407baSopenharmony_civoid drm_sysfs_lease_event(struct drm_device *dev);
1703d0407baSopenharmony_ci
1713d0407baSopenharmony_ci/* drm_gem.c */
1723d0407baSopenharmony_cistruct drm_gem_object;
1733d0407baSopenharmony_ciint drm_gem_init(struct drm_device *dev);
1743d0407baSopenharmony_ciint drm_gem_handle_create_tail(struct drm_file *file_priv,
1753d0407baSopenharmony_ci			       struct drm_gem_object *obj,
1763d0407baSopenharmony_ci			       u32 *handlep);
1773d0407baSopenharmony_ciint drm_gem_close_ioctl(struct drm_device *dev, void *data,
1783d0407baSopenharmony_ci			struct drm_file *file_priv);
1793d0407baSopenharmony_ciint drm_gem_flink_ioctl(struct drm_device *dev, void *data,
1803d0407baSopenharmony_ci			struct drm_file *file_priv);
1813d0407baSopenharmony_ciint drm_gem_open_ioctl(struct drm_device *dev, void *data,
1823d0407baSopenharmony_ci		       struct drm_file *file_priv);
1833d0407baSopenharmony_civoid drm_gem_open(struct drm_device *dev, struct drm_file *file_private);
1843d0407baSopenharmony_civoid drm_gem_release(struct drm_device *dev, struct drm_file *file_private);
1853d0407baSopenharmony_civoid drm_gem_print_info(struct drm_printer *p, unsigned int indent,
1863d0407baSopenharmony_ci			const struct drm_gem_object *obj);
1873d0407baSopenharmony_ci
1883d0407baSopenharmony_ciint drm_gem_pin(struct drm_gem_object *obj);
1893d0407baSopenharmony_civoid drm_gem_unpin(struct drm_gem_object *obj);
1903d0407baSopenharmony_civoid *drm_gem_vmap(struct drm_gem_object *obj);
1913d0407baSopenharmony_civoid drm_gem_vunmap(struct drm_gem_object *obj, void *vaddr);
1923d0407baSopenharmony_ci
1933d0407baSopenharmony_ci/* drm_debugfs.c drm_debugfs_crc.c */
1943d0407baSopenharmony_ci#if defined(CONFIG_DEBUG_FS)
1953d0407baSopenharmony_ciint drm_debugfs_init(struct drm_minor *minor, int minor_id,
1963d0407baSopenharmony_ci		     struct dentry *root);
1973d0407baSopenharmony_civoid drm_debugfs_cleanup(struct drm_minor *minor);
1983d0407baSopenharmony_civoid drm_debugfs_connector_add(struct drm_connector *connector);
1993d0407baSopenharmony_civoid drm_debugfs_connector_remove(struct drm_connector *connector);
2003d0407baSopenharmony_civoid drm_debugfs_crtc_add(struct drm_crtc *crtc);
2013d0407baSopenharmony_civoid drm_debugfs_crtc_remove(struct drm_crtc *crtc);
2023d0407baSopenharmony_civoid drm_debugfs_crtc_crc_add(struct drm_crtc *crtc);
2033d0407baSopenharmony_ci#else
2043d0407baSopenharmony_cistatic inline int drm_debugfs_init(struct drm_minor *minor, int minor_id,
2053d0407baSopenharmony_ci				   struct dentry *root)
2063d0407baSopenharmony_ci{
2073d0407baSopenharmony_ci	return 0;
2083d0407baSopenharmony_ci}
2093d0407baSopenharmony_ci
2103d0407baSopenharmony_cistatic inline void drm_debugfs_cleanup(struct drm_minor *minor)
2113d0407baSopenharmony_ci{
2123d0407baSopenharmony_ci}
2133d0407baSopenharmony_ci
2143d0407baSopenharmony_cistatic inline void drm_debugfs_connector_add(struct drm_connector *connector)
2153d0407baSopenharmony_ci{
2163d0407baSopenharmony_ci}
2173d0407baSopenharmony_cistatic inline void drm_debugfs_connector_remove(struct drm_connector *connector)
2183d0407baSopenharmony_ci{
2193d0407baSopenharmony_ci}
2203d0407baSopenharmony_ci
2213d0407baSopenharmony_cistatic inline void drm_debugfs_crtc_add(struct drm_crtc *crtc)
2223d0407baSopenharmony_ci{
2233d0407baSopenharmony_ci}
2243d0407baSopenharmony_cistatic inline void drm_debugfs_crtc_remove(struct drm_crtc *crtc)
2253d0407baSopenharmony_ci{
2263d0407baSopenharmony_ci}
2273d0407baSopenharmony_ci
2283d0407baSopenharmony_cistatic inline void drm_debugfs_crtc_crc_add(struct drm_crtc *crtc)
2293d0407baSopenharmony_ci{
2303d0407baSopenharmony_ci}
2313d0407baSopenharmony_ci
2323d0407baSopenharmony_ci#endif
2333d0407baSopenharmony_ci
2343d0407baSopenharmony_cidrm_ioctl_t drm_version;
2353d0407baSopenharmony_cidrm_ioctl_t drm_getunique;
2363d0407baSopenharmony_cidrm_ioctl_t drm_getclient;
2373d0407baSopenharmony_ci
2383d0407baSopenharmony_ci/* drm_syncobj.c */
2393d0407baSopenharmony_civoid drm_syncobj_open(struct drm_file *file_private);
2403d0407baSopenharmony_civoid drm_syncobj_release(struct drm_file *file_private);
2413d0407baSopenharmony_ciint drm_syncobj_create_ioctl(struct drm_device *dev, void *data,
2423d0407baSopenharmony_ci			     struct drm_file *file_private);
2433d0407baSopenharmony_ciint drm_syncobj_destroy_ioctl(struct drm_device *dev, void *data,
2443d0407baSopenharmony_ci			      struct drm_file *file_private);
2453d0407baSopenharmony_ciint drm_syncobj_handle_to_fd_ioctl(struct drm_device *dev, void *data,
2463d0407baSopenharmony_ci				   struct drm_file *file_private);
2473d0407baSopenharmony_ciint drm_syncobj_fd_to_handle_ioctl(struct drm_device *dev, void *data,
2483d0407baSopenharmony_ci				   struct drm_file *file_private);
2493d0407baSopenharmony_ciint drm_syncobj_transfer_ioctl(struct drm_device *dev, void *data,
2503d0407baSopenharmony_ci			       struct drm_file *file_private);
2513d0407baSopenharmony_ciint drm_syncobj_wait_ioctl(struct drm_device *dev, void *data,
2523d0407baSopenharmony_ci			   struct drm_file *file_private);
2533d0407baSopenharmony_ciint drm_syncobj_timeline_wait_ioctl(struct drm_device *dev, void *data,
2543d0407baSopenharmony_ci				    struct drm_file *file_private);
2553d0407baSopenharmony_ciint drm_syncobj_reset_ioctl(struct drm_device *dev, void *data,
2563d0407baSopenharmony_ci			    struct drm_file *file_private);
2573d0407baSopenharmony_ciint drm_syncobj_signal_ioctl(struct drm_device *dev, void *data,
2583d0407baSopenharmony_ci			     struct drm_file *file_private);
2593d0407baSopenharmony_ciint drm_syncobj_timeline_signal_ioctl(struct drm_device *dev, void *data,
2603d0407baSopenharmony_ci				      struct drm_file *file_private);
2613d0407baSopenharmony_ciint drm_syncobj_query_ioctl(struct drm_device *dev, void *data,
2623d0407baSopenharmony_ci			    struct drm_file *file_private);
2633d0407baSopenharmony_ci
2643d0407baSopenharmony_ci/* drm_framebuffer.c */
2653d0407baSopenharmony_civoid drm_framebuffer_print_info(struct drm_printer *p, unsigned int indent,
2663d0407baSopenharmony_ci				const struct drm_framebuffer *fb);
2673d0407baSopenharmony_civoid drm_framebuffer_debugfs_init(struct drm_minor *minor);
268