18c2ecf20Sopenharmony_ci/* 28c2ecf20Sopenharmony_ci * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas. 38c2ecf20Sopenharmony_ci * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California. 48c2ecf20Sopenharmony_ci * Copyright (c) 2009-2010, Code Aurora Forum. 58c2ecf20Sopenharmony_ci * Copyright 2016 Intel Corp. 68c2ecf20Sopenharmony_ci * 78c2ecf20Sopenharmony_ci * Permission is hereby granted, free of charge, to any person obtaining a 88c2ecf20Sopenharmony_ci * copy of this software and associated documentation files (the "Software"), 98c2ecf20Sopenharmony_ci * to deal in the Software without restriction, including without limitation 108c2ecf20Sopenharmony_ci * the rights to use, copy, modify, merge, publish, distribute, sublicense, 118c2ecf20Sopenharmony_ci * and/or sell copies of the Software, and to permit persons to whom the 128c2ecf20Sopenharmony_ci * Software is furnished to do so, subject to the following conditions: 138c2ecf20Sopenharmony_ci * 148c2ecf20Sopenharmony_ci * The above copyright notice and this permission notice (including the next 158c2ecf20Sopenharmony_ci * paragraph) shall be included in all copies or substantial portions of the 168c2ecf20Sopenharmony_ci * Software. 178c2ecf20Sopenharmony_ci * 188c2ecf20Sopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 198c2ecf20Sopenharmony_ci * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 208c2ecf20Sopenharmony_ci * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 218c2ecf20Sopenharmony_ci * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 228c2ecf20Sopenharmony_ci * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 238c2ecf20Sopenharmony_ci * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 248c2ecf20Sopenharmony_ci * OTHER DEALINGS IN THE SOFTWARE. 258c2ecf20Sopenharmony_ci */ 268c2ecf20Sopenharmony_ci 278c2ecf20Sopenharmony_ci#ifndef _DRM_DRV_H_ 288c2ecf20Sopenharmony_ci#define _DRM_DRV_H_ 298c2ecf20Sopenharmony_ci 308c2ecf20Sopenharmony_ci#include <linux/list.h> 318c2ecf20Sopenharmony_ci#include <linux/irqreturn.h> 328c2ecf20Sopenharmony_ci 338c2ecf20Sopenharmony_ci#include <drm/drm_device.h> 348c2ecf20Sopenharmony_ci 358c2ecf20Sopenharmony_cistruct drm_file; 368c2ecf20Sopenharmony_cistruct drm_gem_object; 378c2ecf20Sopenharmony_cistruct drm_master; 388c2ecf20Sopenharmony_cistruct drm_minor; 398c2ecf20Sopenharmony_cistruct dma_buf_attachment; 408c2ecf20Sopenharmony_cistruct drm_display_mode; 418c2ecf20Sopenharmony_cistruct drm_mode_create_dumb; 428c2ecf20Sopenharmony_cistruct drm_printer; 438c2ecf20Sopenharmony_ci 448c2ecf20Sopenharmony_ci/** 458c2ecf20Sopenharmony_ci * enum drm_driver_feature - feature flags 468c2ecf20Sopenharmony_ci * 478c2ecf20Sopenharmony_ci * See &drm_driver.driver_features, drm_device.driver_features and 488c2ecf20Sopenharmony_ci * drm_core_check_feature(). 498c2ecf20Sopenharmony_ci */ 508c2ecf20Sopenharmony_cienum drm_driver_feature { 518c2ecf20Sopenharmony_ci /** 528c2ecf20Sopenharmony_ci * @DRIVER_GEM: 538c2ecf20Sopenharmony_ci * 548c2ecf20Sopenharmony_ci * Driver use the GEM memory manager. This should be set for all modern 558c2ecf20Sopenharmony_ci * drivers. 568c2ecf20Sopenharmony_ci */ 578c2ecf20Sopenharmony_ci DRIVER_GEM = BIT(0), 588c2ecf20Sopenharmony_ci /** 598c2ecf20Sopenharmony_ci * @DRIVER_MODESET: 608c2ecf20Sopenharmony_ci * 618c2ecf20Sopenharmony_ci * Driver supports mode setting interfaces (KMS). 628c2ecf20Sopenharmony_ci */ 638c2ecf20Sopenharmony_ci DRIVER_MODESET = BIT(1), 648c2ecf20Sopenharmony_ci /** 658c2ecf20Sopenharmony_ci * @DRIVER_RENDER: 668c2ecf20Sopenharmony_ci * 678c2ecf20Sopenharmony_ci * Driver supports dedicated render nodes. See also the :ref:`section on 688c2ecf20Sopenharmony_ci * render nodes <drm_render_node>` for details. 698c2ecf20Sopenharmony_ci */ 708c2ecf20Sopenharmony_ci DRIVER_RENDER = BIT(3), 718c2ecf20Sopenharmony_ci /** 728c2ecf20Sopenharmony_ci * @DRIVER_ATOMIC: 738c2ecf20Sopenharmony_ci * 748c2ecf20Sopenharmony_ci * Driver supports the full atomic modesetting userspace API. Drivers 758c2ecf20Sopenharmony_ci * which only use atomic internally, but do not the support the full 768c2ecf20Sopenharmony_ci * userspace API (e.g. not all properties converted to atomic, or 778c2ecf20Sopenharmony_ci * multi-plane updates are not guaranteed to be tear-free) should not 788c2ecf20Sopenharmony_ci * set this flag. 798c2ecf20Sopenharmony_ci */ 808c2ecf20Sopenharmony_ci DRIVER_ATOMIC = BIT(4), 818c2ecf20Sopenharmony_ci /** 828c2ecf20Sopenharmony_ci * @DRIVER_SYNCOBJ: 838c2ecf20Sopenharmony_ci * 848c2ecf20Sopenharmony_ci * Driver supports &drm_syncobj for explicit synchronization of command 858c2ecf20Sopenharmony_ci * submission. 868c2ecf20Sopenharmony_ci */ 878c2ecf20Sopenharmony_ci DRIVER_SYNCOBJ = BIT(5), 888c2ecf20Sopenharmony_ci /** 898c2ecf20Sopenharmony_ci * @DRIVER_SYNCOBJ_TIMELINE: 908c2ecf20Sopenharmony_ci * 918c2ecf20Sopenharmony_ci * Driver supports the timeline flavor of &drm_syncobj for explicit 928c2ecf20Sopenharmony_ci * synchronization of command submission. 938c2ecf20Sopenharmony_ci */ 948c2ecf20Sopenharmony_ci DRIVER_SYNCOBJ_TIMELINE = BIT(6), 958c2ecf20Sopenharmony_ci 968c2ecf20Sopenharmony_ci /* IMPORTANT: Below are all the legacy flags, add new ones above. */ 978c2ecf20Sopenharmony_ci 988c2ecf20Sopenharmony_ci /** 998c2ecf20Sopenharmony_ci * @DRIVER_USE_AGP: 1008c2ecf20Sopenharmony_ci * 1018c2ecf20Sopenharmony_ci * Set up DRM AGP support, see drm_agp_init(), the DRM core will manage 1028c2ecf20Sopenharmony_ci * AGP resources. New drivers don't need this. 1038c2ecf20Sopenharmony_ci */ 1048c2ecf20Sopenharmony_ci DRIVER_USE_AGP = BIT(25), 1058c2ecf20Sopenharmony_ci /** 1068c2ecf20Sopenharmony_ci * @DRIVER_LEGACY: 1078c2ecf20Sopenharmony_ci * 1088c2ecf20Sopenharmony_ci * Denote a legacy driver using shadow attach. Do not use. 1098c2ecf20Sopenharmony_ci */ 1108c2ecf20Sopenharmony_ci DRIVER_LEGACY = BIT(26), 1118c2ecf20Sopenharmony_ci /** 1128c2ecf20Sopenharmony_ci * @DRIVER_PCI_DMA: 1138c2ecf20Sopenharmony_ci * 1148c2ecf20Sopenharmony_ci * Driver is capable of PCI DMA, mapping of PCI DMA buffers to userspace 1158c2ecf20Sopenharmony_ci * will be enabled. Only for legacy drivers. Do not use. 1168c2ecf20Sopenharmony_ci */ 1178c2ecf20Sopenharmony_ci DRIVER_PCI_DMA = BIT(27), 1188c2ecf20Sopenharmony_ci /** 1198c2ecf20Sopenharmony_ci * @DRIVER_SG: 1208c2ecf20Sopenharmony_ci * 1218c2ecf20Sopenharmony_ci * Driver can perform scatter/gather DMA, allocation and mapping of 1228c2ecf20Sopenharmony_ci * scatter/gather buffers will be enabled. Only for legacy drivers. Do 1238c2ecf20Sopenharmony_ci * not use. 1248c2ecf20Sopenharmony_ci */ 1258c2ecf20Sopenharmony_ci DRIVER_SG = BIT(28), 1268c2ecf20Sopenharmony_ci 1278c2ecf20Sopenharmony_ci /** 1288c2ecf20Sopenharmony_ci * @DRIVER_HAVE_DMA: 1298c2ecf20Sopenharmony_ci * 1308c2ecf20Sopenharmony_ci * Driver supports DMA, the userspace DMA API will be supported. Only 1318c2ecf20Sopenharmony_ci * for legacy drivers. Do not use. 1328c2ecf20Sopenharmony_ci */ 1338c2ecf20Sopenharmony_ci DRIVER_HAVE_DMA = BIT(29), 1348c2ecf20Sopenharmony_ci /** 1358c2ecf20Sopenharmony_ci * @DRIVER_HAVE_IRQ: 1368c2ecf20Sopenharmony_ci * 1378c2ecf20Sopenharmony_ci * Legacy irq support. Only for legacy drivers. Do not use. 1388c2ecf20Sopenharmony_ci * 1398c2ecf20Sopenharmony_ci * New drivers can either use the drm_irq_install() and 1408c2ecf20Sopenharmony_ci * drm_irq_uninstall() helper functions, or roll their own irq support 1418c2ecf20Sopenharmony_ci * code by calling request_irq() directly. 1428c2ecf20Sopenharmony_ci */ 1438c2ecf20Sopenharmony_ci DRIVER_HAVE_IRQ = BIT(30), 1448c2ecf20Sopenharmony_ci /** 1458c2ecf20Sopenharmony_ci * @DRIVER_KMS_LEGACY_CONTEXT: 1468c2ecf20Sopenharmony_ci * 1478c2ecf20Sopenharmony_ci * Used only by nouveau for backwards compatibility with existing 1488c2ecf20Sopenharmony_ci * userspace. Do not use. 1498c2ecf20Sopenharmony_ci */ 1508c2ecf20Sopenharmony_ci DRIVER_KMS_LEGACY_CONTEXT = BIT(31), 1518c2ecf20Sopenharmony_ci}; 1528c2ecf20Sopenharmony_ci 1538c2ecf20Sopenharmony_ci/** 1548c2ecf20Sopenharmony_ci * struct drm_driver - DRM driver structure 1558c2ecf20Sopenharmony_ci * 1568c2ecf20Sopenharmony_ci * This structure represent the common code for a family of cards. There will be 1578c2ecf20Sopenharmony_ci * one &struct drm_device for each card present in this family. It contains lots 1588c2ecf20Sopenharmony_ci * of vfunc entries, and a pile of those probably should be moved to more 1598c2ecf20Sopenharmony_ci * appropriate places like &drm_mode_config_funcs or into a new operations 1608c2ecf20Sopenharmony_ci * structure for GEM drivers. 1618c2ecf20Sopenharmony_ci */ 1628c2ecf20Sopenharmony_cistruct drm_driver { 1638c2ecf20Sopenharmony_ci /** 1648c2ecf20Sopenharmony_ci * @load: 1658c2ecf20Sopenharmony_ci * 1668c2ecf20Sopenharmony_ci * Backward-compatible driver callback to complete initialization steps 1678c2ecf20Sopenharmony_ci * after the driver is registered. For this reason, may suffer from 1688c2ecf20Sopenharmony_ci * race conditions and its use is deprecated for new drivers. It is 1698c2ecf20Sopenharmony_ci * therefore only supported for existing drivers not yet converted to 1708c2ecf20Sopenharmony_ci * the new scheme. See devm_drm_dev_alloc() and drm_dev_register() for 1718c2ecf20Sopenharmony_ci * proper and race-free way to set up a &struct drm_device. 1728c2ecf20Sopenharmony_ci * 1738c2ecf20Sopenharmony_ci * This is deprecated, do not use! 1748c2ecf20Sopenharmony_ci * 1758c2ecf20Sopenharmony_ci * Returns: 1768c2ecf20Sopenharmony_ci * 1778c2ecf20Sopenharmony_ci * Zero on success, non-zero value on failure. 1788c2ecf20Sopenharmony_ci */ 1798c2ecf20Sopenharmony_ci int (*load) (struct drm_device *, unsigned long flags); 1808c2ecf20Sopenharmony_ci 1818c2ecf20Sopenharmony_ci /** 1828c2ecf20Sopenharmony_ci * @open: 1838c2ecf20Sopenharmony_ci * 1848c2ecf20Sopenharmony_ci * Driver callback when a new &struct drm_file is opened. Useful for 1858c2ecf20Sopenharmony_ci * setting up driver-private data structures like buffer allocators, 1868c2ecf20Sopenharmony_ci * execution contexts or similar things. Such driver-private resources 1878c2ecf20Sopenharmony_ci * must be released again in @postclose. 1888c2ecf20Sopenharmony_ci * 1898c2ecf20Sopenharmony_ci * Since the display/modeset side of DRM can only be owned by exactly 1908c2ecf20Sopenharmony_ci * one &struct drm_file (see &drm_file.is_master and &drm_device.master) 1918c2ecf20Sopenharmony_ci * there should never be a need to set up any modeset related resources 1928c2ecf20Sopenharmony_ci * in this callback. Doing so would be a driver design bug. 1938c2ecf20Sopenharmony_ci * 1948c2ecf20Sopenharmony_ci * Returns: 1958c2ecf20Sopenharmony_ci * 1968c2ecf20Sopenharmony_ci * 0 on success, a negative error code on failure, which will be 1978c2ecf20Sopenharmony_ci * promoted to userspace as the result of the open() system call. 1988c2ecf20Sopenharmony_ci */ 1998c2ecf20Sopenharmony_ci int (*open) (struct drm_device *, struct drm_file *); 2008c2ecf20Sopenharmony_ci 2018c2ecf20Sopenharmony_ci /** 2028c2ecf20Sopenharmony_ci * @postclose: 2038c2ecf20Sopenharmony_ci * 2048c2ecf20Sopenharmony_ci * One of the driver callbacks when a new &struct drm_file is closed. 2058c2ecf20Sopenharmony_ci * Useful for tearing down driver-private data structures allocated in 2068c2ecf20Sopenharmony_ci * @open like buffer allocators, execution contexts or similar things. 2078c2ecf20Sopenharmony_ci * 2088c2ecf20Sopenharmony_ci * Since the display/modeset side of DRM can only be owned by exactly 2098c2ecf20Sopenharmony_ci * one &struct drm_file (see &drm_file.is_master and &drm_device.master) 2108c2ecf20Sopenharmony_ci * there should never be a need to tear down any modeset related 2118c2ecf20Sopenharmony_ci * resources in this callback. Doing so would be a driver design bug. 2128c2ecf20Sopenharmony_ci */ 2138c2ecf20Sopenharmony_ci void (*postclose) (struct drm_device *, struct drm_file *); 2148c2ecf20Sopenharmony_ci 2158c2ecf20Sopenharmony_ci /** 2168c2ecf20Sopenharmony_ci * @lastclose: 2178c2ecf20Sopenharmony_ci * 2188c2ecf20Sopenharmony_ci * Called when the last &struct drm_file has been closed and there's 2198c2ecf20Sopenharmony_ci * currently no userspace client for the &struct drm_device. 2208c2ecf20Sopenharmony_ci * 2218c2ecf20Sopenharmony_ci * Modern drivers should only use this to force-restore the fbdev 2228c2ecf20Sopenharmony_ci * framebuffer using drm_fb_helper_restore_fbdev_mode_unlocked(). 2238c2ecf20Sopenharmony_ci * Anything else would indicate there's something seriously wrong. 2248c2ecf20Sopenharmony_ci * Modern drivers can also use this to execute delayed power switching 2258c2ecf20Sopenharmony_ci * state changes, e.g. in conjunction with the :ref:`vga_switcheroo` 2268c2ecf20Sopenharmony_ci * infrastructure. 2278c2ecf20Sopenharmony_ci * 2288c2ecf20Sopenharmony_ci * This is called after @postclose hook has been called. 2298c2ecf20Sopenharmony_ci * 2308c2ecf20Sopenharmony_ci * NOTE: 2318c2ecf20Sopenharmony_ci * 2328c2ecf20Sopenharmony_ci * All legacy drivers use this callback to de-initialize the hardware. 2338c2ecf20Sopenharmony_ci * This is purely because of the shadow-attach model, where the DRM 2348c2ecf20Sopenharmony_ci * kernel driver does not really own the hardware. Instead ownershipe is 2358c2ecf20Sopenharmony_ci * handled with the help of userspace through an inheritedly racy dance 2368c2ecf20Sopenharmony_ci * to set/unset the VT into raw mode. 2378c2ecf20Sopenharmony_ci * 2388c2ecf20Sopenharmony_ci * Legacy drivers initialize the hardware in the @firstopen callback, 2398c2ecf20Sopenharmony_ci * which isn't even called for modern drivers. 2408c2ecf20Sopenharmony_ci */ 2418c2ecf20Sopenharmony_ci void (*lastclose) (struct drm_device *); 2428c2ecf20Sopenharmony_ci 2438c2ecf20Sopenharmony_ci /** 2448c2ecf20Sopenharmony_ci * @unload: 2458c2ecf20Sopenharmony_ci * 2468c2ecf20Sopenharmony_ci * Reverse the effects of the driver load callback. Ideally, 2478c2ecf20Sopenharmony_ci * the clean up performed by the driver should happen in the 2488c2ecf20Sopenharmony_ci * reverse order of the initialization. Similarly to the load 2498c2ecf20Sopenharmony_ci * hook, this handler is deprecated and its usage should be 2508c2ecf20Sopenharmony_ci * dropped in favor of an open-coded teardown function at the 2518c2ecf20Sopenharmony_ci * driver layer. See drm_dev_unregister() and drm_dev_put() 2528c2ecf20Sopenharmony_ci * for the proper way to remove a &struct drm_device. 2538c2ecf20Sopenharmony_ci * 2548c2ecf20Sopenharmony_ci * The unload() hook is called right after unregistering 2558c2ecf20Sopenharmony_ci * the device. 2568c2ecf20Sopenharmony_ci * 2578c2ecf20Sopenharmony_ci */ 2588c2ecf20Sopenharmony_ci void (*unload) (struct drm_device *); 2598c2ecf20Sopenharmony_ci 2608c2ecf20Sopenharmony_ci /** 2618c2ecf20Sopenharmony_ci * @release: 2628c2ecf20Sopenharmony_ci * 2638c2ecf20Sopenharmony_ci * Optional callback for destroying device data after the final 2648c2ecf20Sopenharmony_ci * reference is released, i.e. the device is being destroyed. 2658c2ecf20Sopenharmony_ci * 2668c2ecf20Sopenharmony_ci * This is deprecated, clean up all memory allocations associated with a 2678c2ecf20Sopenharmony_ci * &drm_device using drmm_add_action(), drmm_kmalloc() and related 2688c2ecf20Sopenharmony_ci * managed resources functions. 2698c2ecf20Sopenharmony_ci */ 2708c2ecf20Sopenharmony_ci void (*release) (struct drm_device *); 2718c2ecf20Sopenharmony_ci 2728c2ecf20Sopenharmony_ci /** 2738c2ecf20Sopenharmony_ci * @irq_handler: 2748c2ecf20Sopenharmony_ci * 2758c2ecf20Sopenharmony_ci * Interrupt handler called when using drm_irq_install(). Not used by 2768c2ecf20Sopenharmony_ci * drivers which implement their own interrupt handling. 2778c2ecf20Sopenharmony_ci */ 2788c2ecf20Sopenharmony_ci irqreturn_t(*irq_handler) (int irq, void *arg); 2798c2ecf20Sopenharmony_ci 2808c2ecf20Sopenharmony_ci /** 2818c2ecf20Sopenharmony_ci * @irq_preinstall: 2828c2ecf20Sopenharmony_ci * 2838c2ecf20Sopenharmony_ci * Optional callback used by drm_irq_install() which is called before 2848c2ecf20Sopenharmony_ci * the interrupt handler is registered. This should be used to clear out 2858c2ecf20Sopenharmony_ci * any pending interrupts (from e.g. firmware based drives) and reset 2868c2ecf20Sopenharmony_ci * the interrupt handling registers. 2878c2ecf20Sopenharmony_ci */ 2888c2ecf20Sopenharmony_ci void (*irq_preinstall) (struct drm_device *dev); 2898c2ecf20Sopenharmony_ci 2908c2ecf20Sopenharmony_ci /** 2918c2ecf20Sopenharmony_ci * @irq_postinstall: 2928c2ecf20Sopenharmony_ci * 2938c2ecf20Sopenharmony_ci * Optional callback used by drm_irq_install() which is called after 2948c2ecf20Sopenharmony_ci * the interrupt handler is registered. This should be used to enable 2958c2ecf20Sopenharmony_ci * interrupt generation in the hardware. 2968c2ecf20Sopenharmony_ci */ 2978c2ecf20Sopenharmony_ci int (*irq_postinstall) (struct drm_device *dev); 2988c2ecf20Sopenharmony_ci 2998c2ecf20Sopenharmony_ci /** 3008c2ecf20Sopenharmony_ci * @irq_uninstall: 3018c2ecf20Sopenharmony_ci * 3028c2ecf20Sopenharmony_ci * Optional callback used by drm_irq_uninstall() which is called before 3038c2ecf20Sopenharmony_ci * the interrupt handler is unregistered. This should be used to disable 3048c2ecf20Sopenharmony_ci * interrupt generation in the hardware. 3058c2ecf20Sopenharmony_ci */ 3068c2ecf20Sopenharmony_ci void (*irq_uninstall) (struct drm_device *dev); 3078c2ecf20Sopenharmony_ci 3088c2ecf20Sopenharmony_ci /** 3098c2ecf20Sopenharmony_ci * @master_set: 3108c2ecf20Sopenharmony_ci * 3118c2ecf20Sopenharmony_ci * Called whenever the minor master is set. Only used by vmwgfx. 3128c2ecf20Sopenharmony_ci */ 3138c2ecf20Sopenharmony_ci void (*master_set)(struct drm_device *dev, struct drm_file *file_priv, 3148c2ecf20Sopenharmony_ci bool from_open); 3158c2ecf20Sopenharmony_ci /** 3168c2ecf20Sopenharmony_ci * @master_drop: 3178c2ecf20Sopenharmony_ci * 3188c2ecf20Sopenharmony_ci * Called whenever the minor master is dropped. Only used by vmwgfx. 3198c2ecf20Sopenharmony_ci */ 3208c2ecf20Sopenharmony_ci void (*master_drop)(struct drm_device *dev, struct drm_file *file_priv); 3218c2ecf20Sopenharmony_ci 3228c2ecf20Sopenharmony_ci /** 3238c2ecf20Sopenharmony_ci * @debugfs_init: 3248c2ecf20Sopenharmony_ci * 3258c2ecf20Sopenharmony_ci * Allows drivers to create driver-specific debugfs files. 3268c2ecf20Sopenharmony_ci */ 3278c2ecf20Sopenharmony_ci void (*debugfs_init)(struct drm_minor *minor); 3288c2ecf20Sopenharmony_ci 3298c2ecf20Sopenharmony_ci /** 3308c2ecf20Sopenharmony_ci * @gem_free_object_unlocked: deconstructor for drm_gem_objects 3318c2ecf20Sopenharmony_ci * 3328c2ecf20Sopenharmony_ci * This is deprecated and should not be used by new drivers. Use 3338c2ecf20Sopenharmony_ci * &drm_gem_object_funcs.free instead. 3348c2ecf20Sopenharmony_ci */ 3358c2ecf20Sopenharmony_ci void (*gem_free_object_unlocked) (struct drm_gem_object *obj); 3368c2ecf20Sopenharmony_ci 3378c2ecf20Sopenharmony_ci /** 3388c2ecf20Sopenharmony_ci * @gem_open_object: 3398c2ecf20Sopenharmony_ci * 3408c2ecf20Sopenharmony_ci * This callback is deprecated in favour of &drm_gem_object_funcs.open. 3418c2ecf20Sopenharmony_ci * 3428c2ecf20Sopenharmony_ci * Driver hook called upon gem handle creation 3438c2ecf20Sopenharmony_ci */ 3448c2ecf20Sopenharmony_ci int (*gem_open_object) (struct drm_gem_object *, struct drm_file *); 3458c2ecf20Sopenharmony_ci 3468c2ecf20Sopenharmony_ci /** 3478c2ecf20Sopenharmony_ci * @gem_close_object: 3488c2ecf20Sopenharmony_ci * 3498c2ecf20Sopenharmony_ci * This callback is deprecated in favour of &drm_gem_object_funcs.close. 3508c2ecf20Sopenharmony_ci * 3518c2ecf20Sopenharmony_ci * Driver hook called upon gem handle release 3528c2ecf20Sopenharmony_ci */ 3538c2ecf20Sopenharmony_ci void (*gem_close_object) (struct drm_gem_object *, struct drm_file *); 3548c2ecf20Sopenharmony_ci 3558c2ecf20Sopenharmony_ci /** 3568c2ecf20Sopenharmony_ci * @gem_create_object: constructor for gem objects 3578c2ecf20Sopenharmony_ci * 3588c2ecf20Sopenharmony_ci * Hook for allocating the GEM object struct, for use by the CMA and 3598c2ecf20Sopenharmony_ci * SHMEM GEM helpers. 3608c2ecf20Sopenharmony_ci */ 3618c2ecf20Sopenharmony_ci struct drm_gem_object *(*gem_create_object)(struct drm_device *dev, 3628c2ecf20Sopenharmony_ci size_t size); 3638c2ecf20Sopenharmony_ci /** 3648c2ecf20Sopenharmony_ci * @prime_handle_to_fd: 3658c2ecf20Sopenharmony_ci * 3668c2ecf20Sopenharmony_ci * Main PRIME export function. Should be implemented with 3678c2ecf20Sopenharmony_ci * drm_gem_prime_handle_to_fd() for GEM based drivers. 3688c2ecf20Sopenharmony_ci * 3698c2ecf20Sopenharmony_ci * For an in-depth discussion see :ref:`PRIME buffer sharing 3708c2ecf20Sopenharmony_ci * documentation <prime_buffer_sharing>`. 3718c2ecf20Sopenharmony_ci */ 3728c2ecf20Sopenharmony_ci int (*prime_handle_to_fd)(struct drm_device *dev, struct drm_file *file_priv, 3738c2ecf20Sopenharmony_ci uint32_t handle, uint32_t flags, int *prime_fd); 3748c2ecf20Sopenharmony_ci /** 3758c2ecf20Sopenharmony_ci * @prime_fd_to_handle: 3768c2ecf20Sopenharmony_ci * 3778c2ecf20Sopenharmony_ci * Main PRIME import function. Should be implemented with 3788c2ecf20Sopenharmony_ci * drm_gem_prime_fd_to_handle() for GEM based drivers. 3798c2ecf20Sopenharmony_ci * 3808c2ecf20Sopenharmony_ci * For an in-depth discussion see :ref:`PRIME buffer sharing 3818c2ecf20Sopenharmony_ci * documentation <prime_buffer_sharing>`. 3828c2ecf20Sopenharmony_ci */ 3838c2ecf20Sopenharmony_ci int (*prime_fd_to_handle)(struct drm_device *dev, struct drm_file *file_priv, 3848c2ecf20Sopenharmony_ci int prime_fd, uint32_t *handle); 3858c2ecf20Sopenharmony_ci /** 3868c2ecf20Sopenharmony_ci * @gem_prime_export: 3878c2ecf20Sopenharmony_ci * 3888c2ecf20Sopenharmony_ci * Export hook for GEM drivers. Deprecated in favour of 3898c2ecf20Sopenharmony_ci * &drm_gem_object_funcs.export. 3908c2ecf20Sopenharmony_ci */ 3918c2ecf20Sopenharmony_ci struct dma_buf * (*gem_prime_export)(struct drm_gem_object *obj, 3928c2ecf20Sopenharmony_ci int flags); 3938c2ecf20Sopenharmony_ci /** 3948c2ecf20Sopenharmony_ci * @gem_prime_import: 3958c2ecf20Sopenharmony_ci * 3968c2ecf20Sopenharmony_ci * Import hook for GEM drivers. 3978c2ecf20Sopenharmony_ci * 3988c2ecf20Sopenharmony_ci * This defaults to drm_gem_prime_import() if not set. 3998c2ecf20Sopenharmony_ci */ 4008c2ecf20Sopenharmony_ci struct drm_gem_object * (*gem_prime_import)(struct drm_device *dev, 4018c2ecf20Sopenharmony_ci struct dma_buf *dma_buf); 4028c2ecf20Sopenharmony_ci 4038c2ecf20Sopenharmony_ci /** 4048c2ecf20Sopenharmony_ci * @gem_prime_pin: 4058c2ecf20Sopenharmony_ci * 4068c2ecf20Sopenharmony_ci * Deprecated hook in favour of &drm_gem_object_funcs.pin. 4078c2ecf20Sopenharmony_ci */ 4088c2ecf20Sopenharmony_ci int (*gem_prime_pin)(struct drm_gem_object *obj); 4098c2ecf20Sopenharmony_ci 4108c2ecf20Sopenharmony_ci /** 4118c2ecf20Sopenharmony_ci * @gem_prime_unpin: 4128c2ecf20Sopenharmony_ci * 4138c2ecf20Sopenharmony_ci * Deprecated hook in favour of &drm_gem_object_funcs.unpin. 4148c2ecf20Sopenharmony_ci */ 4158c2ecf20Sopenharmony_ci void (*gem_prime_unpin)(struct drm_gem_object *obj); 4168c2ecf20Sopenharmony_ci 4178c2ecf20Sopenharmony_ci 4188c2ecf20Sopenharmony_ci /** 4198c2ecf20Sopenharmony_ci * @gem_prime_get_sg_table: 4208c2ecf20Sopenharmony_ci * 4218c2ecf20Sopenharmony_ci * Deprecated hook in favour of &drm_gem_object_funcs.get_sg_table. 4228c2ecf20Sopenharmony_ci */ 4238c2ecf20Sopenharmony_ci struct sg_table *(*gem_prime_get_sg_table)(struct drm_gem_object *obj); 4248c2ecf20Sopenharmony_ci 4258c2ecf20Sopenharmony_ci /** 4268c2ecf20Sopenharmony_ci * @gem_prime_import_sg_table: 4278c2ecf20Sopenharmony_ci * 4288c2ecf20Sopenharmony_ci * Optional hook used by the PRIME helper functions 4298c2ecf20Sopenharmony_ci * drm_gem_prime_import() respectively drm_gem_prime_import_dev(). 4308c2ecf20Sopenharmony_ci */ 4318c2ecf20Sopenharmony_ci struct drm_gem_object *(*gem_prime_import_sg_table)( 4328c2ecf20Sopenharmony_ci struct drm_device *dev, 4338c2ecf20Sopenharmony_ci struct dma_buf_attachment *attach, 4348c2ecf20Sopenharmony_ci struct sg_table *sgt); 4358c2ecf20Sopenharmony_ci /** 4368c2ecf20Sopenharmony_ci * @gem_prime_vmap: 4378c2ecf20Sopenharmony_ci * 4388c2ecf20Sopenharmony_ci * Deprecated vmap hook for GEM drivers. Please use 4398c2ecf20Sopenharmony_ci * &drm_gem_object_funcs.vmap instead. 4408c2ecf20Sopenharmony_ci */ 4418c2ecf20Sopenharmony_ci void *(*gem_prime_vmap)(struct drm_gem_object *obj); 4428c2ecf20Sopenharmony_ci 4438c2ecf20Sopenharmony_ci /** 4448c2ecf20Sopenharmony_ci * @gem_prime_vunmap: 4458c2ecf20Sopenharmony_ci * 4468c2ecf20Sopenharmony_ci * Deprecated vunmap hook for GEM drivers. Please use 4478c2ecf20Sopenharmony_ci * &drm_gem_object_funcs.vunmap instead. 4488c2ecf20Sopenharmony_ci */ 4498c2ecf20Sopenharmony_ci void (*gem_prime_vunmap)(struct drm_gem_object *obj, void *vaddr); 4508c2ecf20Sopenharmony_ci 4518c2ecf20Sopenharmony_ci /** 4528c2ecf20Sopenharmony_ci * @gem_prime_mmap: 4538c2ecf20Sopenharmony_ci * 4548c2ecf20Sopenharmony_ci * mmap hook for GEM drivers, used to implement dma-buf mmap in the 4558c2ecf20Sopenharmony_ci * PRIME helpers. 4568c2ecf20Sopenharmony_ci * 4578c2ecf20Sopenharmony_ci * FIXME: There's way too much duplication going on here, and also moved 4588c2ecf20Sopenharmony_ci * to &drm_gem_object_funcs. 4598c2ecf20Sopenharmony_ci */ 4608c2ecf20Sopenharmony_ci int (*gem_prime_mmap)(struct drm_gem_object *obj, 4618c2ecf20Sopenharmony_ci struct vm_area_struct *vma); 4628c2ecf20Sopenharmony_ci 4638c2ecf20Sopenharmony_ci /** 4648c2ecf20Sopenharmony_ci * @dumb_create: 4658c2ecf20Sopenharmony_ci * 4668c2ecf20Sopenharmony_ci * This creates a new dumb buffer in the driver's backing storage manager (GEM, 4678c2ecf20Sopenharmony_ci * TTM or something else entirely) and returns the resulting buffer handle. This 4688c2ecf20Sopenharmony_ci * handle can then be wrapped up into a framebuffer modeset object. 4698c2ecf20Sopenharmony_ci * 4708c2ecf20Sopenharmony_ci * Note that userspace is not allowed to use such objects for render 4718c2ecf20Sopenharmony_ci * acceleration - drivers must create their own private ioctls for such a use 4728c2ecf20Sopenharmony_ci * case. 4738c2ecf20Sopenharmony_ci * 4748c2ecf20Sopenharmony_ci * Width, height and depth are specified in the &drm_mode_create_dumb 4758c2ecf20Sopenharmony_ci * argument. The callback needs to fill the handle, pitch and size for 4768c2ecf20Sopenharmony_ci * the created buffer. 4778c2ecf20Sopenharmony_ci * 4788c2ecf20Sopenharmony_ci * Called by the user via ioctl. 4798c2ecf20Sopenharmony_ci * 4808c2ecf20Sopenharmony_ci * Returns: 4818c2ecf20Sopenharmony_ci * 4828c2ecf20Sopenharmony_ci * Zero on success, negative errno on failure. 4838c2ecf20Sopenharmony_ci */ 4848c2ecf20Sopenharmony_ci int (*dumb_create)(struct drm_file *file_priv, 4858c2ecf20Sopenharmony_ci struct drm_device *dev, 4868c2ecf20Sopenharmony_ci struct drm_mode_create_dumb *args); 4878c2ecf20Sopenharmony_ci /** 4888c2ecf20Sopenharmony_ci * @dumb_map_offset: 4898c2ecf20Sopenharmony_ci * 4908c2ecf20Sopenharmony_ci * Allocate an offset in the drm device node's address space to be able to 4918c2ecf20Sopenharmony_ci * memory map a dumb buffer. 4928c2ecf20Sopenharmony_ci * 4938c2ecf20Sopenharmony_ci * The default implementation is drm_gem_create_mmap_offset(). GEM based 4948c2ecf20Sopenharmony_ci * drivers must not overwrite this. 4958c2ecf20Sopenharmony_ci * 4968c2ecf20Sopenharmony_ci * Called by the user via ioctl. 4978c2ecf20Sopenharmony_ci * 4988c2ecf20Sopenharmony_ci * Returns: 4998c2ecf20Sopenharmony_ci * 5008c2ecf20Sopenharmony_ci * Zero on success, negative errno on failure. 5018c2ecf20Sopenharmony_ci */ 5028c2ecf20Sopenharmony_ci int (*dumb_map_offset)(struct drm_file *file_priv, 5038c2ecf20Sopenharmony_ci struct drm_device *dev, uint32_t handle, 5048c2ecf20Sopenharmony_ci uint64_t *offset); 5058c2ecf20Sopenharmony_ci /** 5068c2ecf20Sopenharmony_ci * @dumb_destroy: 5078c2ecf20Sopenharmony_ci * 5088c2ecf20Sopenharmony_ci * This destroys the userspace handle for the given dumb backing storage buffer. 5098c2ecf20Sopenharmony_ci * Since buffer objects must be reference counted in the kernel a buffer object 5108c2ecf20Sopenharmony_ci * won't be immediately freed if a framebuffer modeset object still uses it. 5118c2ecf20Sopenharmony_ci * 5128c2ecf20Sopenharmony_ci * Called by the user via ioctl. 5138c2ecf20Sopenharmony_ci * 5148c2ecf20Sopenharmony_ci * The default implementation is drm_gem_dumb_destroy(). GEM based drivers 5158c2ecf20Sopenharmony_ci * must not overwrite this. 5168c2ecf20Sopenharmony_ci * 5178c2ecf20Sopenharmony_ci * Returns: 5188c2ecf20Sopenharmony_ci * 5198c2ecf20Sopenharmony_ci * Zero on success, negative errno on failure. 5208c2ecf20Sopenharmony_ci */ 5218c2ecf20Sopenharmony_ci int (*dumb_destroy)(struct drm_file *file_priv, 5228c2ecf20Sopenharmony_ci struct drm_device *dev, 5238c2ecf20Sopenharmony_ci uint32_t handle); 5248c2ecf20Sopenharmony_ci 5258c2ecf20Sopenharmony_ci /** 5268c2ecf20Sopenharmony_ci * @gem_vm_ops: Driver private ops for this object 5278c2ecf20Sopenharmony_ci * 5288c2ecf20Sopenharmony_ci * For GEM drivers this is deprecated in favour of 5298c2ecf20Sopenharmony_ci * &drm_gem_object_funcs.vm_ops. 5308c2ecf20Sopenharmony_ci */ 5318c2ecf20Sopenharmony_ci const struct vm_operations_struct *gem_vm_ops; 5328c2ecf20Sopenharmony_ci 5338c2ecf20Sopenharmony_ci /** @major: driver major number */ 5348c2ecf20Sopenharmony_ci int major; 5358c2ecf20Sopenharmony_ci /** @minor: driver minor number */ 5368c2ecf20Sopenharmony_ci int minor; 5378c2ecf20Sopenharmony_ci /** @patchlevel: driver patch level */ 5388c2ecf20Sopenharmony_ci int patchlevel; 5398c2ecf20Sopenharmony_ci /** @name: driver name */ 5408c2ecf20Sopenharmony_ci char *name; 5418c2ecf20Sopenharmony_ci /** @desc: driver description */ 5428c2ecf20Sopenharmony_ci char *desc; 5438c2ecf20Sopenharmony_ci /** @date: driver date */ 5448c2ecf20Sopenharmony_ci char *date; 5458c2ecf20Sopenharmony_ci 5468c2ecf20Sopenharmony_ci /** 5478c2ecf20Sopenharmony_ci * @driver_features: 5488c2ecf20Sopenharmony_ci * Driver features, see &enum drm_driver_feature. Drivers can disable 5498c2ecf20Sopenharmony_ci * some features on a per-instance basis using 5508c2ecf20Sopenharmony_ci * &drm_device.driver_features. 5518c2ecf20Sopenharmony_ci */ 5528c2ecf20Sopenharmony_ci u32 driver_features; 5538c2ecf20Sopenharmony_ci 5548c2ecf20Sopenharmony_ci /** 5558c2ecf20Sopenharmony_ci * @ioctls: 5568c2ecf20Sopenharmony_ci * 5578c2ecf20Sopenharmony_ci * Array of driver-private IOCTL description entries. See the chapter on 5588c2ecf20Sopenharmony_ci * :ref:`IOCTL support in the userland interfaces 5598c2ecf20Sopenharmony_ci * chapter<drm_driver_ioctl>` for the full details. 5608c2ecf20Sopenharmony_ci */ 5618c2ecf20Sopenharmony_ci 5628c2ecf20Sopenharmony_ci const struct drm_ioctl_desc *ioctls; 5638c2ecf20Sopenharmony_ci /** @num_ioctls: Number of entries in @ioctls. */ 5648c2ecf20Sopenharmony_ci int num_ioctls; 5658c2ecf20Sopenharmony_ci 5668c2ecf20Sopenharmony_ci /** 5678c2ecf20Sopenharmony_ci * @fops: 5688c2ecf20Sopenharmony_ci * 5698c2ecf20Sopenharmony_ci * File operations for the DRM device node. See the discussion in 5708c2ecf20Sopenharmony_ci * :ref:`file operations<drm_driver_fops>` for in-depth coverage and 5718c2ecf20Sopenharmony_ci * some examples. 5728c2ecf20Sopenharmony_ci */ 5738c2ecf20Sopenharmony_ci const struct file_operations *fops; 5748c2ecf20Sopenharmony_ci 5758c2ecf20Sopenharmony_ci /* Everything below here is for legacy driver, never use! */ 5768c2ecf20Sopenharmony_ci /* private: */ 5778c2ecf20Sopenharmony_ci 5788c2ecf20Sopenharmony_ci /* List of devices hanging off this driver with stealth attach. */ 5798c2ecf20Sopenharmony_ci struct list_head legacy_dev_list; 5808c2ecf20Sopenharmony_ci int (*firstopen) (struct drm_device *); 5818c2ecf20Sopenharmony_ci void (*preclose) (struct drm_device *, struct drm_file *file_priv); 5828c2ecf20Sopenharmony_ci int (*dma_ioctl) (struct drm_device *dev, void *data, struct drm_file *file_priv); 5838c2ecf20Sopenharmony_ci int (*dma_quiescent) (struct drm_device *); 5848c2ecf20Sopenharmony_ci int (*context_dtor) (struct drm_device *dev, int context); 5858c2ecf20Sopenharmony_ci u32 (*get_vblank_counter)(struct drm_device *dev, unsigned int pipe); 5868c2ecf20Sopenharmony_ci int (*enable_vblank)(struct drm_device *dev, unsigned int pipe); 5878c2ecf20Sopenharmony_ci void (*disable_vblank)(struct drm_device *dev, unsigned int pipe); 5888c2ecf20Sopenharmony_ci int dev_priv_size; 5898c2ecf20Sopenharmony_ci}; 5908c2ecf20Sopenharmony_ci 5918c2ecf20Sopenharmony_civoid *__devm_drm_dev_alloc(struct device *parent, struct drm_driver *driver, 5928c2ecf20Sopenharmony_ci size_t size, size_t offset); 5938c2ecf20Sopenharmony_ci 5948c2ecf20Sopenharmony_ci/** 5958c2ecf20Sopenharmony_ci * devm_drm_dev_alloc - Resource managed allocation of a &drm_device instance 5968c2ecf20Sopenharmony_ci * @parent: Parent device object 5978c2ecf20Sopenharmony_ci * @driver: DRM driver 5988c2ecf20Sopenharmony_ci * @type: the type of the struct which contains struct &drm_device 5998c2ecf20Sopenharmony_ci * @member: the name of the &drm_device within @type. 6008c2ecf20Sopenharmony_ci * 6018c2ecf20Sopenharmony_ci * This allocates and initialize a new DRM device. No device registration is done. 6028c2ecf20Sopenharmony_ci * Call drm_dev_register() to advertice the device to user space and register it 6038c2ecf20Sopenharmony_ci * with other core subsystems. This should be done last in the device 6048c2ecf20Sopenharmony_ci * initialization sequence to make sure userspace can't access an inconsistent 6058c2ecf20Sopenharmony_ci * state. 6068c2ecf20Sopenharmony_ci * 6078c2ecf20Sopenharmony_ci * The initial ref-count of the object is 1. Use drm_dev_get() and 6088c2ecf20Sopenharmony_ci * drm_dev_put() to take and drop further ref-counts. 6098c2ecf20Sopenharmony_ci * 6108c2ecf20Sopenharmony_ci * It is recommended that drivers embed &struct drm_device into their own device 6118c2ecf20Sopenharmony_ci * structure. 6128c2ecf20Sopenharmony_ci * 6138c2ecf20Sopenharmony_ci * Note that this manages the lifetime of the resulting &drm_device 6148c2ecf20Sopenharmony_ci * automatically using devres. The DRM device initialized with this function is 6158c2ecf20Sopenharmony_ci * automatically put on driver detach using drm_dev_put(). 6168c2ecf20Sopenharmony_ci * 6178c2ecf20Sopenharmony_ci * RETURNS: 6188c2ecf20Sopenharmony_ci * Pointer to new DRM device, or ERR_PTR on failure. 6198c2ecf20Sopenharmony_ci */ 6208c2ecf20Sopenharmony_ci#define devm_drm_dev_alloc(parent, driver, type, member) \ 6218c2ecf20Sopenharmony_ci ((type *) __devm_drm_dev_alloc(parent, driver, sizeof(type), \ 6228c2ecf20Sopenharmony_ci offsetof(type, member))) 6238c2ecf20Sopenharmony_ci 6248c2ecf20Sopenharmony_cistruct drm_device *drm_dev_alloc(struct drm_driver *driver, 6258c2ecf20Sopenharmony_ci struct device *parent); 6268c2ecf20Sopenharmony_ciint drm_dev_register(struct drm_device *dev, unsigned long flags); 6278c2ecf20Sopenharmony_civoid drm_dev_unregister(struct drm_device *dev); 6288c2ecf20Sopenharmony_ci 6298c2ecf20Sopenharmony_civoid drm_dev_get(struct drm_device *dev); 6308c2ecf20Sopenharmony_civoid drm_dev_put(struct drm_device *dev); 6318c2ecf20Sopenharmony_civoid drm_put_dev(struct drm_device *dev); 6328c2ecf20Sopenharmony_cibool drm_dev_enter(struct drm_device *dev, int *idx); 6338c2ecf20Sopenharmony_civoid drm_dev_exit(int idx); 6348c2ecf20Sopenharmony_civoid drm_dev_unplug(struct drm_device *dev); 6358c2ecf20Sopenharmony_ci 6368c2ecf20Sopenharmony_ci/** 6378c2ecf20Sopenharmony_ci * drm_dev_is_unplugged - is a DRM device unplugged 6388c2ecf20Sopenharmony_ci * @dev: DRM device 6398c2ecf20Sopenharmony_ci * 6408c2ecf20Sopenharmony_ci * This function can be called to check whether a hotpluggable is unplugged. 6418c2ecf20Sopenharmony_ci * Unplugging itself is singalled through drm_dev_unplug(). If a device is 6428c2ecf20Sopenharmony_ci * unplugged, these two functions guarantee that any store before calling 6438c2ecf20Sopenharmony_ci * drm_dev_unplug() is visible to callers of this function after it completes 6448c2ecf20Sopenharmony_ci * 6458c2ecf20Sopenharmony_ci * WARNING: This function fundamentally races against drm_dev_unplug(). It is 6468c2ecf20Sopenharmony_ci * recommended that drivers instead use the underlying drm_dev_enter() and 6478c2ecf20Sopenharmony_ci * drm_dev_exit() function pairs. 6488c2ecf20Sopenharmony_ci */ 6498c2ecf20Sopenharmony_cistatic inline bool drm_dev_is_unplugged(struct drm_device *dev) 6508c2ecf20Sopenharmony_ci{ 6518c2ecf20Sopenharmony_ci int idx; 6528c2ecf20Sopenharmony_ci 6538c2ecf20Sopenharmony_ci if (drm_dev_enter(dev, &idx)) { 6548c2ecf20Sopenharmony_ci drm_dev_exit(idx); 6558c2ecf20Sopenharmony_ci return false; 6568c2ecf20Sopenharmony_ci } 6578c2ecf20Sopenharmony_ci 6588c2ecf20Sopenharmony_ci return true; 6598c2ecf20Sopenharmony_ci} 6608c2ecf20Sopenharmony_ci 6618c2ecf20Sopenharmony_ci/** 6628c2ecf20Sopenharmony_ci * drm_core_check_all_features - check driver feature flags mask 6638c2ecf20Sopenharmony_ci * @dev: DRM device to check 6648c2ecf20Sopenharmony_ci * @features: feature flag(s) mask 6658c2ecf20Sopenharmony_ci * 6668c2ecf20Sopenharmony_ci * This checks @dev for driver features, see &drm_driver.driver_features, 6678c2ecf20Sopenharmony_ci * &drm_device.driver_features, and the various &enum drm_driver_feature flags. 6688c2ecf20Sopenharmony_ci * 6698c2ecf20Sopenharmony_ci * Returns true if all features in the @features mask are supported, false 6708c2ecf20Sopenharmony_ci * otherwise. 6718c2ecf20Sopenharmony_ci */ 6728c2ecf20Sopenharmony_cistatic inline bool drm_core_check_all_features(const struct drm_device *dev, 6738c2ecf20Sopenharmony_ci u32 features) 6748c2ecf20Sopenharmony_ci{ 6758c2ecf20Sopenharmony_ci u32 supported = dev->driver->driver_features & dev->driver_features; 6768c2ecf20Sopenharmony_ci 6778c2ecf20Sopenharmony_ci return features && (supported & features) == features; 6788c2ecf20Sopenharmony_ci} 6798c2ecf20Sopenharmony_ci 6808c2ecf20Sopenharmony_ci/** 6818c2ecf20Sopenharmony_ci * drm_core_check_feature - check driver feature flags 6828c2ecf20Sopenharmony_ci * @dev: DRM device to check 6838c2ecf20Sopenharmony_ci * @feature: feature flag 6848c2ecf20Sopenharmony_ci * 6858c2ecf20Sopenharmony_ci * This checks @dev for driver features, see &drm_driver.driver_features, 6868c2ecf20Sopenharmony_ci * &drm_device.driver_features, and the various &enum drm_driver_feature flags. 6878c2ecf20Sopenharmony_ci * 6888c2ecf20Sopenharmony_ci * Returns true if the @feature is supported, false otherwise. 6898c2ecf20Sopenharmony_ci */ 6908c2ecf20Sopenharmony_cistatic inline bool drm_core_check_feature(const struct drm_device *dev, 6918c2ecf20Sopenharmony_ci enum drm_driver_feature feature) 6928c2ecf20Sopenharmony_ci{ 6938c2ecf20Sopenharmony_ci return drm_core_check_all_features(dev, feature); 6948c2ecf20Sopenharmony_ci} 6958c2ecf20Sopenharmony_ci 6968c2ecf20Sopenharmony_ci/** 6978c2ecf20Sopenharmony_ci * drm_drv_uses_atomic_modeset - check if the driver implements 6988c2ecf20Sopenharmony_ci * atomic_commit() 6998c2ecf20Sopenharmony_ci * @dev: DRM device 7008c2ecf20Sopenharmony_ci * 7018c2ecf20Sopenharmony_ci * This check is useful if drivers do not have DRIVER_ATOMIC set but 7028c2ecf20Sopenharmony_ci * have atomic modesetting internally implemented. 7038c2ecf20Sopenharmony_ci */ 7048c2ecf20Sopenharmony_cistatic inline bool drm_drv_uses_atomic_modeset(struct drm_device *dev) 7058c2ecf20Sopenharmony_ci{ 7068c2ecf20Sopenharmony_ci return drm_core_check_feature(dev, DRIVER_ATOMIC) || 7078c2ecf20Sopenharmony_ci (dev->mode_config.funcs && dev->mode_config.funcs->atomic_commit != NULL); 7088c2ecf20Sopenharmony_ci} 7098c2ecf20Sopenharmony_ci 7108c2ecf20Sopenharmony_ci 7118c2ecf20Sopenharmony_ciint drm_dev_set_unique(struct drm_device *dev, const char *name); 7128c2ecf20Sopenharmony_ci 7138c2ecf20Sopenharmony_ci 7148c2ecf20Sopenharmony_ci#endif 715