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