185e634bcSDaniel Vetter /* 285e634bcSDaniel Vetter * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas. 385e634bcSDaniel Vetter * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California. 485e634bcSDaniel Vetter * Copyright (c) 2009-2010, Code Aurora Forum. 585e634bcSDaniel Vetter * Copyright 2016 Intel Corp. 685e634bcSDaniel Vetter * 785e634bcSDaniel Vetter * Permission is hereby granted, free of charge, to any person obtaining a 885e634bcSDaniel Vetter * copy of this software and associated documentation files (the "Software"), 985e634bcSDaniel Vetter * to deal in the Software without restriction, including without limitation 1085e634bcSDaniel Vetter * the rights to use, copy, modify, merge, publish, distribute, sublicense, 1185e634bcSDaniel Vetter * and/or sell copies of the Software, and to permit persons to whom the 1285e634bcSDaniel Vetter * Software is furnished to do so, subject to the following conditions: 1385e634bcSDaniel Vetter * 1485e634bcSDaniel Vetter * The above copyright notice and this permission notice (including the next 1585e634bcSDaniel Vetter * paragraph) shall be included in all copies or substantial portions of the 1685e634bcSDaniel Vetter * Software. 1785e634bcSDaniel Vetter * 1885e634bcSDaniel Vetter * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1985e634bcSDaniel Vetter * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 2085e634bcSDaniel Vetter * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 2185e634bcSDaniel Vetter * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 2285e634bcSDaniel Vetter * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 2385e634bcSDaniel Vetter * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 2485e634bcSDaniel Vetter * OTHER DEALINGS IN THE SOFTWARE. 2585e634bcSDaniel Vetter */ 2685e634bcSDaniel Vetter 2785e634bcSDaniel Vetter #ifndef _DRM_DRV_H_ 2885e634bcSDaniel Vetter #define _DRM_DRV_H_ 2985e634bcSDaniel Vetter 3085e634bcSDaniel Vetter #include <linux/list.h> 3185e634bcSDaniel Vetter #include <linux/irqreturn.h> 3285e634bcSDaniel Vetter 33c07dcd61SDaniel Vetter #include <drm/drm_device.h> 34c07dcd61SDaniel Vetter 3585e634bcSDaniel Vetter struct drm_file; 3685e634bcSDaniel Vetter struct drm_gem_object; 3785e634bcSDaniel Vetter struct drm_master; 3885e634bcSDaniel Vetter struct drm_minor; 3985e634bcSDaniel Vetter struct dma_buf_attachment; 4085e634bcSDaniel Vetter struct drm_display_mode; 4185e634bcSDaniel Vetter struct drm_mode_create_dumb; 4245d58b40SNoralf Trønnes struct drm_printer; 4385e634bcSDaniel Vetter 4485e634bcSDaniel Vetter /* driver capabilities and requirements mask */ 4585e634bcSDaniel Vetter #define DRIVER_USE_AGP 0x1 4685e634bcSDaniel Vetter #define DRIVER_LEGACY 0x2 4785e634bcSDaniel Vetter #define DRIVER_PCI_DMA 0x8 4885e634bcSDaniel Vetter #define DRIVER_SG 0x10 4985e634bcSDaniel Vetter #define DRIVER_HAVE_DMA 0x20 5085e634bcSDaniel Vetter #define DRIVER_HAVE_IRQ 0x40 5185e634bcSDaniel Vetter #define DRIVER_IRQ_SHARED 0x80 5285e634bcSDaniel Vetter #define DRIVER_GEM 0x1000 5385e634bcSDaniel Vetter #define DRIVER_MODESET 0x2000 5485e634bcSDaniel Vetter #define DRIVER_PRIME 0x4000 5585e634bcSDaniel Vetter #define DRIVER_RENDER 0x8000 5685e634bcSDaniel Vetter #define DRIVER_ATOMIC 0x10000 5785e634bcSDaniel Vetter #define DRIVER_KMS_LEGACY_CONTEXT 0x20000 58e9083420SDave Airlie #define DRIVER_SYNCOBJ 0x40000 5985e634bcSDaniel Vetter 6085e634bcSDaniel Vetter /** 6185e634bcSDaniel Vetter * struct drm_driver - DRM driver structure 6285e634bcSDaniel Vetter * 6385e634bcSDaniel Vetter * This structure represent the common code for a family of cards. There will 6485e634bcSDaniel Vetter * one drm_device for each card present in this family. It contains lots of 6585e634bcSDaniel Vetter * vfunc entries, and a pile of those probably should be moved to more 6685e634bcSDaniel Vetter * appropriate places like &drm_mode_config_funcs or into a new operations 6785e634bcSDaniel Vetter * structure for GEM drivers. 6885e634bcSDaniel Vetter */ 6985e634bcSDaniel Vetter struct drm_driver { 7056926500SGabriel Krisman Bertazi /** 7156926500SGabriel Krisman Bertazi * @load: 7256926500SGabriel Krisman Bertazi * 7356926500SGabriel Krisman Bertazi * Backward-compatible driver callback to complete 7456926500SGabriel Krisman Bertazi * initialization steps after the driver is registered. For 7556926500SGabriel Krisman Bertazi * this reason, may suffer from race conditions and its use is 7656926500SGabriel Krisman Bertazi * deprecated for new drivers. It is therefore only supported 7756926500SGabriel Krisman Bertazi * for existing drivers not yet converted to the new scheme. 7856926500SGabriel Krisman Bertazi * See drm_dev_init() and drm_dev_register() for proper and 7956926500SGabriel Krisman Bertazi * race-free way to set up a &struct drm_device. 8056926500SGabriel Krisman Bertazi * 81b93658f8SDaniel Vetter * This is deprecated, do not use! 82b93658f8SDaniel Vetter * 8356926500SGabriel Krisman Bertazi * Returns: 8456926500SGabriel Krisman Bertazi * 8556926500SGabriel Krisman Bertazi * Zero on success, non-zero value on failure. 8656926500SGabriel Krisman Bertazi */ 8785e634bcSDaniel Vetter int (*load) (struct drm_device *, unsigned long flags); 88b93658f8SDaniel Vetter 89b93658f8SDaniel Vetter /** 90b93658f8SDaniel Vetter * @open: 91b93658f8SDaniel Vetter * 92b93658f8SDaniel Vetter * Driver callback when a new &struct drm_file is opened. Useful for 93b93658f8SDaniel Vetter * setting up driver-private data structures like buffer allocators, 94b93658f8SDaniel Vetter * execution contexts or similar things. Such driver-private resources 95b93658f8SDaniel Vetter * must be released again in @postclose. 96b93658f8SDaniel Vetter * 97b93658f8SDaniel Vetter * Since the display/modeset side of DRM can only be owned by exactly 98b93658f8SDaniel Vetter * one &struct drm_file (see &drm_file.is_master and &drm_device.master) 99b93658f8SDaniel Vetter * there should never be a need to set up any modeset related resources 100b93658f8SDaniel Vetter * in this callback. Doing so would be a driver design bug. 101b93658f8SDaniel Vetter * 102b93658f8SDaniel Vetter * Returns: 103b93658f8SDaniel Vetter * 104b93658f8SDaniel Vetter * 0 on success, a negative error code on failure, which will be 105b93658f8SDaniel Vetter * promoted to userspace as the result of the open() system call. 106b93658f8SDaniel Vetter */ 10785e634bcSDaniel Vetter int (*open) (struct drm_device *, struct drm_file *); 108b93658f8SDaniel Vetter 109b93658f8SDaniel Vetter /** 110b93658f8SDaniel Vetter * @postclose: 111b93658f8SDaniel Vetter * 112b93658f8SDaniel Vetter * One of the driver callbacks when a new &struct drm_file is closed. 113b93658f8SDaniel Vetter * Useful for tearing down driver-private data structures allocated in 114b93658f8SDaniel Vetter * @open like buffer allocators, execution contexts or similar things. 115b93658f8SDaniel Vetter * 116b93658f8SDaniel Vetter * Since the display/modeset side of DRM can only be owned by exactly 117b93658f8SDaniel Vetter * one &struct drm_file (see &drm_file.is_master and &drm_device.master) 118b93658f8SDaniel Vetter * there should never be a need to tear down any modeset related 119b93658f8SDaniel Vetter * resources in this callback. Doing so would be a driver design bug. 120b93658f8SDaniel Vetter */ 12185e634bcSDaniel Vetter void (*postclose) (struct drm_device *, struct drm_file *); 122b93658f8SDaniel Vetter 123b93658f8SDaniel Vetter /** 124b93658f8SDaniel Vetter * @lastclose: 125b93658f8SDaniel Vetter * 126b93658f8SDaniel Vetter * Called when the last &struct drm_file has been closed and there's 127b93658f8SDaniel Vetter * currently no userspace client for the &struct drm_device. 128b93658f8SDaniel Vetter * 129b93658f8SDaniel Vetter * Modern drivers should only use this to force-restore the fbdev 130b93658f8SDaniel Vetter * framebuffer using drm_fb_helper_restore_fbdev_mode_unlocked(). 131b93658f8SDaniel Vetter * Anything else would indicate there's something seriously wrong. 132b93658f8SDaniel Vetter * Modern drivers can also use this to execute delayed power switching 133b93658f8SDaniel Vetter * state changes, e.g. in conjunction with the :ref:`vga_switcheroo` 134b93658f8SDaniel Vetter * infrastructure. 135b93658f8SDaniel Vetter * 13645c3d213SDaniel Vetter * This is called after @postclose hook has been called. 137b93658f8SDaniel Vetter * 138b93658f8SDaniel Vetter * NOTE: 139b93658f8SDaniel Vetter * 140b93658f8SDaniel Vetter * All legacy drivers use this callback to de-initialize the hardware. 141b93658f8SDaniel Vetter * This is purely because of the shadow-attach model, where the DRM 142b93658f8SDaniel Vetter * kernel driver does not really own the hardware. Instead ownershipe is 143b93658f8SDaniel Vetter * handled with the help of userspace through an inheritedly racy dance 144b93658f8SDaniel Vetter * to set/unset the VT into raw mode. 145b93658f8SDaniel Vetter * 146b93658f8SDaniel Vetter * Legacy drivers initialize the hardware in the @firstopen callback, 147b93658f8SDaniel Vetter * which isn't even called for modern drivers. 148b93658f8SDaniel Vetter */ 14985e634bcSDaniel Vetter void (*lastclose) (struct drm_device *); 15056926500SGabriel Krisman Bertazi 15156926500SGabriel Krisman Bertazi /** 15256926500SGabriel Krisman Bertazi * @unload: 15356926500SGabriel Krisman Bertazi * 15456926500SGabriel Krisman Bertazi * Reverse the effects of the driver load callback. Ideally, 15556926500SGabriel Krisman Bertazi * the clean up performed by the driver should happen in the 15656926500SGabriel Krisman Bertazi * reverse order of the initialization. Similarly to the load 15756926500SGabriel Krisman Bertazi * hook, this handler is deprecated and its usage should be 15856926500SGabriel Krisman Bertazi * dropped in favor of an open-coded teardown function at the 1599a96f550SAishwarya Pant * driver layer. See drm_dev_unregister() and drm_dev_put() 16056926500SGabriel Krisman Bertazi * for the proper way to remove a &struct drm_device. 16156926500SGabriel Krisman Bertazi * 16256926500SGabriel Krisman Bertazi * The unload() hook is called right after unregistering 16356926500SGabriel Krisman Bertazi * the device. 16456926500SGabriel Krisman Bertazi * 16556926500SGabriel Krisman Bertazi */ 16611b3c20bSGabriel Krisman Bertazi void (*unload) (struct drm_device *); 167f30c9257SChris Wilson 168f30c9257SChris Wilson /** 169f30c9257SChris Wilson * @release: 170f30c9257SChris Wilson * 171f30c9257SChris Wilson * Optional callback for destroying device data after the final 172f30c9257SChris Wilson * reference is released, i.e. the device is being destroyed. Drivers 173f30c9257SChris Wilson * using this callback are responsible for calling drm_dev_fini() 174f30c9257SChris Wilson * to finalize the device and then freeing the struct themselves. 175f30c9257SChris Wilson */ 176f30c9257SChris Wilson void (*release) (struct drm_device *); 177f30c9257SChris Wilson 17885e634bcSDaniel Vetter /** 1796c4789edSDaniel Vetter * @get_vblank_counter: 18085e634bcSDaniel Vetter * 1816c4789edSDaniel Vetter * Driver callback for fetching a raw hardware vblank counter for the 1826c4789edSDaniel Vetter * CRTC specified with the pipe argument. If a device doesn't have a 1835ac74757SShawn Guo * hardware counter, the driver can simply leave the hook as NULL. 1845ac74757SShawn Guo * The DRM core will account for missed vblank events while interrupts 1855ac74757SShawn Guo * where disabled based on system timestamps. 18685e634bcSDaniel Vetter * 18785e634bcSDaniel Vetter * Wraparound handling and loss of events due to modesetting is dealt 1886c4789edSDaniel Vetter * with in the DRM core code, as long as drivers call 1896c4789edSDaniel Vetter * drm_crtc_vblank_off() and drm_crtc_vblank_on() when disabling or 1906c4789edSDaniel Vetter * enabling a CRTC. 19185e634bcSDaniel Vetter * 19284e35483SShawn Guo * This is deprecated and should not be used by new drivers. 19384e35483SShawn Guo * Use &drm_crtc_funcs.get_vblank_counter instead. 19484e35483SShawn Guo * 1956c4789edSDaniel Vetter * Returns: 1966c4789edSDaniel Vetter * 19785e634bcSDaniel Vetter * Raw vblank counter value. 19885e634bcSDaniel Vetter */ 19985e634bcSDaniel Vetter u32 (*get_vblank_counter) (struct drm_device *dev, unsigned int pipe); 20085e634bcSDaniel Vetter 20185e634bcSDaniel Vetter /** 2026c4789edSDaniel Vetter * @enable_vblank: 20385e634bcSDaniel Vetter * 2046c4789edSDaniel Vetter * Enable vblank interrupts for the CRTC specified with the pipe 2056c4789edSDaniel Vetter * argument. 20685e634bcSDaniel Vetter * 20784e35483SShawn Guo * This is deprecated and should not be used by new drivers. 20884e35483SShawn Guo * Use &drm_crtc_funcs.enable_vblank instead. 20984e35483SShawn Guo * 2106c4789edSDaniel Vetter * Returns: 2116c4789edSDaniel Vetter * 21285e634bcSDaniel Vetter * Zero on success, appropriate errno if the given @crtc's vblank 21385e634bcSDaniel Vetter * interrupt cannot be enabled. 21485e634bcSDaniel Vetter */ 21585e634bcSDaniel Vetter int (*enable_vblank) (struct drm_device *dev, unsigned int pipe); 21685e634bcSDaniel Vetter 21785e634bcSDaniel Vetter /** 2186c4789edSDaniel Vetter * @disable_vblank: 21985e634bcSDaniel Vetter * 2206c4789edSDaniel Vetter * Disable vblank interrupts for the CRTC specified with the pipe 2216c4789edSDaniel Vetter * argument. 22284e35483SShawn Guo * 22384e35483SShawn Guo * This is deprecated and should not be used by new drivers. 22484e35483SShawn Guo * Use &drm_crtc_funcs.disable_vblank instead. 22585e634bcSDaniel Vetter */ 22685e634bcSDaniel Vetter void (*disable_vblank) (struct drm_device *dev, unsigned int pipe); 22785e634bcSDaniel Vetter 22885e634bcSDaniel Vetter /** 2296c4789edSDaniel Vetter * @get_scanout_position: 2306c4789edSDaniel Vetter * 23185e634bcSDaniel Vetter * Called by vblank timestamping code. 23285e634bcSDaniel Vetter * 2336c4789edSDaniel Vetter * Returns the current display scanout position from a crtc, and an 2346c4789edSDaniel Vetter * optional accurate ktime_get() timestamp of when position was 2356c4789edSDaniel Vetter * measured. Note that this is a helper callback which is only used if a 2366c4789edSDaniel Vetter * driver uses drm_calc_vbltimestamp_from_scanoutpos() for the 2376c4789edSDaniel Vetter * @get_vblank_timestamp callback. 23885e634bcSDaniel Vetter * 2396c4789edSDaniel Vetter * Parameters: 2406c4789edSDaniel Vetter * 2416c4789edSDaniel Vetter * dev: 2426c4789edSDaniel Vetter * DRM device. 2436c4789edSDaniel Vetter * pipe: 2446c4789edSDaniel Vetter * Id of the crtc to query. 2453fcdcb27SDaniel Vetter * in_vblank_irq: 2463fcdcb27SDaniel Vetter * True when called from drm_crtc_handle_vblank(). Some drivers 2473fcdcb27SDaniel Vetter * need to apply some workarounds for gpu-specific vblank irq quirks 2483fcdcb27SDaniel Vetter * if flag is set. 2496c4789edSDaniel Vetter * vpos: 2506c4789edSDaniel Vetter * Target location for current vertical scanout position. 2516c4789edSDaniel Vetter * hpos: 2526c4789edSDaniel Vetter * Target location for current horizontal scanout position. 2536c4789edSDaniel Vetter * stime: 2546c4789edSDaniel Vetter * Target location for timestamp taken immediately before 25585e634bcSDaniel Vetter * scanout position query. Can be NULL to skip timestamp. 2566c4789edSDaniel Vetter * etime: 2576c4789edSDaniel Vetter * Target location for timestamp taken immediately after 25885e634bcSDaniel Vetter * scanout position query. Can be NULL to skip timestamp. 2596c4789edSDaniel Vetter * mode: 2606c4789edSDaniel Vetter * Current display timings. 26185e634bcSDaniel Vetter * 26285e634bcSDaniel Vetter * Returns vpos as a positive number while in active scanout area. 26385e634bcSDaniel Vetter * Returns vpos as a negative number inside vblank, counting the number 26485e634bcSDaniel Vetter * of scanlines to go until end of vblank, e.g., -1 means "one scanline 26585e634bcSDaniel Vetter * until start of active scanout / end of vblank." 26685e634bcSDaniel Vetter * 2676c4789edSDaniel Vetter * Returns: 26885e634bcSDaniel Vetter * 2691bf6ad62SDaniel Vetter * True on success, false if a reliable scanout position counter could 2701bf6ad62SDaniel Vetter * not be read out. 27185e634bcSDaniel Vetter * 2722a39b88bSDaniel Vetter * FIXME: 2732a39b88bSDaniel Vetter * 2742a39b88bSDaniel Vetter * Since this is a helper to implement @get_vblank_timestamp, we should 2752a39b88bSDaniel Vetter * move it to &struct drm_crtc_helper_funcs, like all the other 2762a39b88bSDaniel Vetter * helper-internal hooks. 27785e634bcSDaniel Vetter */ 2781bf6ad62SDaniel Vetter bool (*get_scanout_position) (struct drm_device *dev, unsigned int pipe, 2791bf6ad62SDaniel Vetter bool in_vblank_irq, int *vpos, int *hpos, 28085e634bcSDaniel Vetter ktime_t *stime, ktime_t *etime, 28185e634bcSDaniel Vetter const struct drm_display_mode *mode); 28285e634bcSDaniel Vetter 28385e634bcSDaniel Vetter /** 2846c4789edSDaniel Vetter * @get_vblank_timestamp: 2856c4789edSDaniel Vetter * 2866c4789edSDaniel Vetter * Called by drm_get_last_vbltimestamp(). Should return a precise 28785e634bcSDaniel Vetter * timestamp when the most recent VBLANK interval ended or will end. 28885e634bcSDaniel Vetter * 28985e634bcSDaniel Vetter * Specifically, the timestamp in @vblank_time should correspond as 29085e634bcSDaniel Vetter * closely as possible to the time when the first video scanline of 29185e634bcSDaniel Vetter * the video frame after the end of VBLANK will start scanning out, 29285e634bcSDaniel Vetter * the time immediately after end of the VBLANK interval. If the 29385e634bcSDaniel Vetter * @crtc is currently inside VBLANK, this will be a time in the future. 29485e634bcSDaniel Vetter * If the @crtc is currently scanning out a frame, this will be the 29585e634bcSDaniel Vetter * past start time of the current scanout. This is meant to adhere 29685e634bcSDaniel Vetter * to the OpenML OML_sync_control extension specification. 29785e634bcSDaniel Vetter * 2986c4789edSDaniel Vetter * Paramters: 2996c4789edSDaniel Vetter * 3006c4789edSDaniel Vetter * dev: 3016c4789edSDaniel Vetter * dev DRM device handle. 3026c4789edSDaniel Vetter * pipe: 3036c4789edSDaniel Vetter * crtc for which timestamp should be returned. 3046c4789edSDaniel Vetter * max_error: 3056c4789edSDaniel Vetter * Maximum allowable timestamp error in nanoseconds. 30685e634bcSDaniel Vetter * Implementation should strive to provide timestamp 3076c4789edSDaniel Vetter * with an error of at most max_error nanoseconds. 30885e634bcSDaniel Vetter * Returns true upper bound on error for timestamp. 3096c4789edSDaniel Vetter * vblank_time: 3106c4789edSDaniel Vetter * Target location for returned vblank timestamp. 3113fcdcb27SDaniel Vetter * in_vblank_irq: 3123fcdcb27SDaniel Vetter * True when called from drm_crtc_handle_vblank(). Some drivers 3133fcdcb27SDaniel Vetter * need to apply some workarounds for gpu-specific vblank irq quirks 3143fcdcb27SDaniel Vetter * if flag is set. 31585e634bcSDaniel Vetter * 3166c4789edSDaniel Vetter * Returns: 3176c4789edSDaniel Vetter * 318d673c02cSDaniel Vetter * True on success, false on failure, which means the core should 319d673c02cSDaniel Vetter * fallback to a simple timestamp taken in drm_crtc_handle_vblank(). 3202a39b88bSDaniel Vetter * 3212a39b88bSDaniel Vetter * FIXME: 3222a39b88bSDaniel Vetter * 3232a39b88bSDaniel Vetter * We should move this hook to &struct drm_crtc_funcs like all the other 3242a39b88bSDaniel Vetter * vblank hooks. 32585e634bcSDaniel Vetter */ 326d673c02cSDaniel Vetter bool (*get_vblank_timestamp) (struct drm_device *dev, unsigned int pipe, 32785e634bcSDaniel Vetter int *max_error, 32867680d3cSArnd Bergmann ktime_t *vblank_time, 3293fcdcb27SDaniel Vetter bool in_vblank_irq); 33085e634bcSDaniel Vetter 33116584b20SDaniel Vetter /** 33216584b20SDaniel Vetter * @irq_handler: 33316584b20SDaniel Vetter * 33416584b20SDaniel Vetter * Interrupt handler called when using drm_irq_install(). Not used by 33516584b20SDaniel Vetter * drivers which implement their own interrupt handling. 33616584b20SDaniel Vetter */ 33785e634bcSDaniel Vetter irqreturn_t(*irq_handler) (int irq, void *arg); 33816584b20SDaniel Vetter 33916584b20SDaniel Vetter /** 34016584b20SDaniel Vetter * @irq_preinstall: 34116584b20SDaniel Vetter * 34216584b20SDaniel Vetter * Optional callback used by drm_irq_install() which is called before 34316584b20SDaniel Vetter * the interrupt handler is registered. This should be used to clear out 34416584b20SDaniel Vetter * any pending interrupts (from e.g. firmware based drives) and reset 34516584b20SDaniel Vetter * the interrupt handling registers. 34616584b20SDaniel Vetter */ 34785e634bcSDaniel Vetter void (*irq_preinstall) (struct drm_device *dev); 34816584b20SDaniel Vetter 34916584b20SDaniel Vetter /** 35016584b20SDaniel Vetter * @irq_postinstall: 35116584b20SDaniel Vetter * 35216584b20SDaniel Vetter * Optional callback used by drm_irq_install() which is called after 35316584b20SDaniel Vetter * the interrupt handler is registered. This should be used to enable 35416584b20SDaniel Vetter * interrupt generation in the hardware. 35516584b20SDaniel Vetter */ 35685e634bcSDaniel Vetter int (*irq_postinstall) (struct drm_device *dev); 35716584b20SDaniel Vetter 35816584b20SDaniel Vetter /** 35916584b20SDaniel Vetter * @irq_uninstall: 36016584b20SDaniel Vetter * 36116584b20SDaniel Vetter * Optional callback used by drm_irq_uninstall() which is called before 36216584b20SDaniel Vetter * the interrupt handler is unregistered. This should be used to disable 36316584b20SDaniel Vetter * interrupt generation in the hardware. 36416584b20SDaniel Vetter */ 36585e634bcSDaniel Vetter void (*irq_uninstall) (struct drm_device *dev); 36685e634bcSDaniel Vetter 36785e634bcSDaniel Vetter /** 3686c4789edSDaniel Vetter * @master_create: 3696c4789edSDaniel Vetter * 3706c4789edSDaniel Vetter * Called whenever a new master is created. Only used by vmwgfx. 37185e634bcSDaniel Vetter */ 3726c4789edSDaniel Vetter int (*master_create)(struct drm_device *dev, struct drm_master *master); 37385e634bcSDaniel Vetter 3746c4789edSDaniel Vetter /** 3756c4789edSDaniel Vetter * @master_destroy: 3766c4789edSDaniel Vetter * 3776c4789edSDaniel Vetter * Called whenever a master is destroyed. Only used by vmwgfx. 3786c4789edSDaniel Vetter */ 3796c4789edSDaniel Vetter void (*master_destroy)(struct drm_device *dev, struct drm_master *master); 3806c4789edSDaniel Vetter 3816c4789edSDaniel Vetter /** 3826c4789edSDaniel Vetter * @master_set: 3836c4789edSDaniel Vetter * 3846c4789edSDaniel Vetter * Called whenever the minor master is set. Only used by vmwgfx. 3856c4789edSDaniel Vetter */ 38685e634bcSDaniel Vetter int (*master_set)(struct drm_device *dev, struct drm_file *file_priv, 38785e634bcSDaniel Vetter bool from_open); 3886c4789edSDaniel Vetter /** 3896c4789edSDaniel Vetter * @master_drop: 3906c4789edSDaniel Vetter * 3916c4789edSDaniel Vetter * Called whenever the minor master is dropped. Only used by vmwgfx. 3926c4789edSDaniel Vetter */ 39385e634bcSDaniel Vetter void (*master_drop)(struct drm_device *dev, struct drm_file *file_priv); 39485e634bcSDaniel Vetter 395d1b6c62fSSean Paul /** 396d1b6c62fSSean Paul * @debugfs_init: 397d1b6c62fSSean Paul * 398d1b6c62fSSean Paul * Allows drivers to create driver-specific debugfs files. 399d1b6c62fSSean Paul */ 40085e634bcSDaniel Vetter int (*debugfs_init)(struct drm_minor *minor); 40185e634bcSDaniel Vetter 40285e634bcSDaniel Vetter /** 40385e634bcSDaniel Vetter * @gem_free_object: deconstructor for drm_gem_objects 40485e634bcSDaniel Vetter * 40585e634bcSDaniel Vetter * This is deprecated and should not be used by new drivers. Use 40685e634bcSDaniel Vetter * @gem_free_object_unlocked instead. 40785e634bcSDaniel Vetter */ 40885e634bcSDaniel Vetter void (*gem_free_object) (struct drm_gem_object *obj); 40985e634bcSDaniel Vetter 41085e634bcSDaniel Vetter /** 41185e634bcSDaniel Vetter * @gem_free_object_unlocked: deconstructor for drm_gem_objects 41285e634bcSDaniel Vetter * 413ef40cbf9SDaniel Vetter * This is for drivers which are not encumbered with &drm_device.struct_mutex 41485e634bcSDaniel Vetter * legacy locking schemes. Use this hook instead of @gem_free_object. 41585e634bcSDaniel Vetter */ 41685e634bcSDaniel Vetter void (*gem_free_object_unlocked) (struct drm_gem_object *obj); 41785e634bcSDaniel Vetter 418d1b6c62fSSean Paul /** 419d1b6c62fSSean Paul * @gem_open_object: 420d1b6c62fSSean Paul * 421d1b6c62fSSean Paul * Driver hook called upon gem handle creation 422d1b6c62fSSean Paul */ 42385e634bcSDaniel Vetter int (*gem_open_object) (struct drm_gem_object *, struct drm_file *); 424d1b6c62fSSean Paul 425d1b6c62fSSean Paul /** 426d1b6c62fSSean Paul * @gem_close_object: 427d1b6c62fSSean Paul * 428d1b6c62fSSean Paul * Driver hook called upon gem handle release 429d1b6c62fSSean Paul */ 43085e634bcSDaniel Vetter void (*gem_close_object) (struct drm_gem_object *, struct drm_file *); 43185e634bcSDaniel Vetter 43285e634bcSDaniel Vetter /** 43345d58b40SNoralf Trønnes * @gem_print_info: 43445d58b40SNoralf Trønnes * 43545d58b40SNoralf Trønnes * If driver subclasses struct &drm_gem_object, it can implement this 43645d58b40SNoralf Trønnes * optional hook for printing additional driver specific info. 43745d58b40SNoralf Trønnes * 43845d58b40SNoralf Trønnes * drm_printf_indent() should be used in the callback passing it the 43945d58b40SNoralf Trønnes * indent argument. 44045d58b40SNoralf Trønnes * 44145d58b40SNoralf Trønnes * This callback is called from drm_gem_print_info(). 44245d58b40SNoralf Trønnes */ 44345d58b40SNoralf Trønnes void (*gem_print_info)(struct drm_printer *p, unsigned int indent, 44445d58b40SNoralf Trønnes const struct drm_gem_object *obj); 44545d58b40SNoralf Trønnes 44645d58b40SNoralf Trønnes /** 447218adc17SChris Wilson * @gem_create_object: constructor for gem objects 448218adc17SChris Wilson * 44985e634bcSDaniel Vetter * Hook for allocating the GEM object struct, for use by core 45085e634bcSDaniel Vetter * helpers. 45185e634bcSDaniel Vetter */ 45285e634bcSDaniel Vetter struct drm_gem_object *(*gem_create_object)(struct drm_device *dev, 45385e634bcSDaniel Vetter size_t size); 45485e634bcSDaniel Vetter 45585e634bcSDaniel Vetter /* prime: */ 456d1b6c62fSSean Paul /** 457d1b6c62fSSean Paul * @prime_handle_to_fd: 458d1b6c62fSSean Paul * 459d1b6c62fSSean Paul * export handle -> fd (see drm_gem_prime_handle_to_fd() helper) 460d1b6c62fSSean Paul */ 46185e634bcSDaniel Vetter int (*prime_handle_to_fd)(struct drm_device *dev, struct drm_file *file_priv, 46285e634bcSDaniel Vetter uint32_t handle, uint32_t flags, int *prime_fd); 463d1b6c62fSSean Paul /** 464d1b6c62fSSean Paul * @prime_fd_to_handle: 465d1b6c62fSSean Paul * 466d1b6c62fSSean Paul * import fd -> handle (see drm_gem_prime_fd_to_handle() helper) 467d1b6c62fSSean Paul */ 46885e634bcSDaniel Vetter int (*prime_fd_to_handle)(struct drm_device *dev, struct drm_file *file_priv, 46985e634bcSDaniel Vetter int prime_fd, uint32_t *handle); 470d1b6c62fSSean Paul /** 471d1b6c62fSSean Paul * @gem_prime_export: 472d1b6c62fSSean Paul * 473d1b6c62fSSean Paul * export GEM -> dmabuf 474d1b6c62fSSean Paul */ 47585e634bcSDaniel Vetter struct dma_buf * (*gem_prime_export)(struct drm_device *dev, 47685e634bcSDaniel Vetter struct drm_gem_object *obj, int flags); 477d1b6c62fSSean Paul /** 478d1b6c62fSSean Paul * @gem_prime_import: 479d1b6c62fSSean Paul * 480d1b6c62fSSean Paul * import dmabuf -> GEM 481d1b6c62fSSean Paul */ 48285e634bcSDaniel Vetter struct drm_gem_object * (*gem_prime_import)(struct drm_device *dev, 48385e634bcSDaniel Vetter struct dma_buf *dma_buf); 48485e634bcSDaniel Vetter int (*gem_prime_pin)(struct drm_gem_object *obj); 48585e634bcSDaniel Vetter void (*gem_prime_unpin)(struct drm_gem_object *obj); 48685e634bcSDaniel Vetter struct reservation_object * (*gem_prime_res_obj)( 48785e634bcSDaniel Vetter struct drm_gem_object *obj); 48885e634bcSDaniel Vetter struct sg_table *(*gem_prime_get_sg_table)(struct drm_gem_object *obj); 48985e634bcSDaniel Vetter struct drm_gem_object *(*gem_prime_import_sg_table)( 49085e634bcSDaniel Vetter struct drm_device *dev, 49185e634bcSDaniel Vetter struct dma_buf_attachment *attach, 49285e634bcSDaniel Vetter struct sg_table *sgt); 49385e634bcSDaniel Vetter void *(*gem_prime_vmap)(struct drm_gem_object *obj); 49485e634bcSDaniel Vetter void (*gem_prime_vunmap)(struct drm_gem_object *obj, void *vaddr); 49585e634bcSDaniel Vetter int (*gem_prime_mmap)(struct drm_gem_object *obj, 49685e634bcSDaniel Vetter struct vm_area_struct *vma); 49785e634bcSDaniel Vetter 4984f93624eSDaniel Vetter /** 4994f93624eSDaniel Vetter * @dumb_create: 5004f93624eSDaniel Vetter * 5014f93624eSDaniel Vetter * This creates a new dumb buffer in the driver's backing storage manager (GEM, 5024f93624eSDaniel Vetter * TTM or something else entirely) and returns the resulting buffer handle. This 5034f93624eSDaniel Vetter * handle can then be wrapped up into a framebuffer modeset object. 5044f93624eSDaniel Vetter * 5054f93624eSDaniel Vetter * Note that userspace is not allowed to use such objects for render 5064f93624eSDaniel Vetter * acceleration - drivers must create their own private ioctls for such a use 5074f93624eSDaniel Vetter * case. 5084f93624eSDaniel Vetter * 5094f93624eSDaniel Vetter * Width, height and depth are specified in the &drm_mode_create_dumb 5104f93624eSDaniel Vetter * argument. The callback needs to fill the handle, pitch and size for 5114f93624eSDaniel Vetter * the created buffer. 5124f93624eSDaniel Vetter * 5134f93624eSDaniel Vetter * Called by the user via ioctl. 5144f93624eSDaniel Vetter * 5154f93624eSDaniel Vetter * Returns: 5164f93624eSDaniel Vetter * 5174f93624eSDaniel Vetter * Zero on success, negative errno on failure. 5184f93624eSDaniel Vetter */ 51985e634bcSDaniel Vetter int (*dumb_create)(struct drm_file *file_priv, 52085e634bcSDaniel Vetter struct drm_device *dev, 52185e634bcSDaniel Vetter struct drm_mode_create_dumb *args); 5224f93624eSDaniel Vetter /** 5234f93624eSDaniel Vetter * @dumb_map_offset: 5244f93624eSDaniel Vetter * 5254f93624eSDaniel Vetter * Allocate an offset in the drm device node's address space to be able to 5264f93624eSDaniel Vetter * memory map a dumb buffer. GEM-based drivers must use 5274f93624eSDaniel Vetter * drm_gem_create_mmap_offset() to implement this. 5284f93624eSDaniel Vetter * 5294f93624eSDaniel Vetter * Called by the user via ioctl. 5304f93624eSDaniel Vetter * 5314f93624eSDaniel Vetter * Returns: 5324f93624eSDaniel Vetter * 5334f93624eSDaniel Vetter * Zero on success, negative errno on failure. 5344f93624eSDaniel Vetter */ 53585e634bcSDaniel Vetter int (*dumb_map_offset)(struct drm_file *file_priv, 53685e634bcSDaniel Vetter struct drm_device *dev, uint32_t handle, 53785e634bcSDaniel Vetter uint64_t *offset); 5384f93624eSDaniel Vetter /** 5394f93624eSDaniel Vetter * @dumb_destroy: 5404f93624eSDaniel Vetter * 5414f93624eSDaniel Vetter * This destroys the userspace handle for the given dumb backing storage buffer. 5424f93624eSDaniel Vetter * Since buffer objects must be reference counted in the kernel a buffer object 5434f93624eSDaniel Vetter * won't be immediately freed if a framebuffer modeset object still uses it. 5444f93624eSDaniel Vetter * 5454f93624eSDaniel Vetter * Called by the user via ioctl. 5464f93624eSDaniel Vetter * 5474f93624eSDaniel Vetter * Returns: 5484f93624eSDaniel Vetter * 5494f93624eSDaniel Vetter * Zero on success, negative errno on failure. 5504f93624eSDaniel Vetter */ 55185e634bcSDaniel Vetter int (*dumb_destroy)(struct drm_file *file_priv, 55285e634bcSDaniel Vetter struct drm_device *dev, 55385e634bcSDaniel Vetter uint32_t handle); 55485e634bcSDaniel Vetter 555d1b6c62fSSean Paul /** 556d1b6c62fSSean Paul * @gem_vm_ops: Driver private ops for this object 557d1b6c62fSSean Paul */ 55885e634bcSDaniel Vetter const struct vm_operations_struct *gem_vm_ops; 55985e634bcSDaniel Vetter 560d1b6c62fSSean Paul /** @major: driver major number */ 56185e634bcSDaniel Vetter int major; 562d1b6c62fSSean Paul /** @minor: driver minor number */ 56385e634bcSDaniel Vetter int minor; 564d1b6c62fSSean Paul /** @patchlevel: driver patch level */ 56585e634bcSDaniel Vetter int patchlevel; 566d1b6c62fSSean Paul /** @name: driver name */ 56785e634bcSDaniel Vetter char *name; 568d1b6c62fSSean Paul /** @desc: driver description */ 56985e634bcSDaniel Vetter char *desc; 570d1b6c62fSSean Paul /** @date: driver date */ 57185e634bcSDaniel Vetter char *date; 57285e634bcSDaniel Vetter 573d1b6c62fSSean Paul /** @driver_features: driver features */ 57485e634bcSDaniel Vetter u32 driver_features; 575bb2eaba6SDaniel Vetter 576bb2eaba6SDaniel Vetter /** 577bb2eaba6SDaniel Vetter * @ioctls: 578bb2eaba6SDaniel Vetter * 579bb2eaba6SDaniel Vetter * Array of driver-private IOCTL description entries. See the chapter on 580bb2eaba6SDaniel Vetter * :ref:`IOCTL support in the userland interfaces 581bb2eaba6SDaniel Vetter * chapter<drm_driver_ioctl>` for the full details. 582bb2eaba6SDaniel Vetter */ 583bb2eaba6SDaniel Vetter 58485e634bcSDaniel Vetter const struct drm_ioctl_desc *ioctls; 585bb2eaba6SDaniel Vetter /** @num_ioctls: Number of entries in @ioctls. */ 58685e634bcSDaniel Vetter int num_ioctls; 587bb2eaba6SDaniel Vetter 588bb2eaba6SDaniel Vetter /** 589bb2eaba6SDaniel Vetter * @fops: 590bb2eaba6SDaniel Vetter * 591bb2eaba6SDaniel Vetter * File operations for the DRM device node. See the discussion in 592bb2eaba6SDaniel Vetter * :ref:`file operations<drm_driver_fops>` for in-depth coverage and 593bb2eaba6SDaniel Vetter * some examples. 594bb2eaba6SDaniel Vetter */ 59585e634bcSDaniel Vetter const struct file_operations *fops; 59685e634bcSDaniel Vetter 5970683c0abSDaniel Vetter /* Everything below here is for legacy driver, never use! */ 5980683c0abSDaniel Vetter /* private: */ 5990683c0abSDaniel Vetter 60085e634bcSDaniel Vetter /* List of devices hanging off this driver with stealth attach. */ 60185e634bcSDaniel Vetter struct list_head legacy_dev_list; 6020683c0abSDaniel Vetter int (*firstopen) (struct drm_device *); 60345c3d213SDaniel Vetter void (*preclose) (struct drm_device *, struct drm_file *file_priv); 6040683c0abSDaniel Vetter int (*dma_ioctl) (struct drm_device *dev, void *data, struct drm_file *file_priv); 6050683c0abSDaniel Vetter int (*dma_quiescent) (struct drm_device *); 6060683c0abSDaniel Vetter int (*context_dtor) (struct drm_device *dev, int context); 6070683c0abSDaniel Vetter int dev_priv_size; 60885e634bcSDaniel Vetter }; 60985e634bcSDaniel Vetter 61085e634bcSDaniel Vetter extern unsigned int drm_debug; 61185e634bcSDaniel Vetter 61285e634bcSDaniel Vetter int drm_dev_init(struct drm_device *dev, 61385e634bcSDaniel Vetter struct drm_driver *driver, 61485e634bcSDaniel Vetter struct device *parent); 615f30c9257SChris Wilson void drm_dev_fini(struct drm_device *dev); 616f30c9257SChris Wilson 61785e634bcSDaniel Vetter struct drm_device *drm_dev_alloc(struct drm_driver *driver, 61885e634bcSDaniel Vetter struct device *parent); 61985e634bcSDaniel Vetter int drm_dev_register(struct drm_device *dev, unsigned long flags); 62085e634bcSDaniel Vetter void drm_dev_unregister(struct drm_device *dev); 62185e634bcSDaniel Vetter 6229a96f550SAishwarya Pant void drm_dev_get(struct drm_device *dev); 6239a96f550SAishwarya Pant void drm_dev_put(struct drm_device *dev); 62485e634bcSDaniel Vetter void drm_dev_unref(struct drm_device *dev); 62585e634bcSDaniel Vetter void drm_put_dev(struct drm_device *dev); 626bee330f3SNoralf Trønnes bool drm_dev_enter(struct drm_device *dev, int *idx); 627bee330f3SNoralf Trønnes void drm_dev_exit(int idx); 628c07dcd61SDaniel Vetter void drm_dev_unplug(struct drm_device *dev); 629c07dcd61SDaniel Vetter 630c07dcd61SDaniel Vetter /** 631c07dcd61SDaniel Vetter * drm_dev_is_unplugged - is a DRM device unplugged 632c07dcd61SDaniel Vetter * @dev: DRM device 633c07dcd61SDaniel Vetter * 634c07dcd61SDaniel Vetter * This function can be called to check whether a hotpluggable is unplugged. 635c07dcd61SDaniel Vetter * Unplugging itself is singalled through drm_dev_unplug(). If a device is 636c07dcd61SDaniel Vetter * unplugged, these two functions guarantee that any store before calling 637c07dcd61SDaniel Vetter * drm_dev_unplug() is visible to callers of this function after it completes 638c07dcd61SDaniel Vetter */ 639bee330f3SNoralf Trønnes static inline bool drm_dev_is_unplugged(struct drm_device *dev) 640c07dcd61SDaniel Vetter { 641bee330f3SNoralf Trønnes int idx; 642bee330f3SNoralf Trønnes 643bee330f3SNoralf Trønnes if (drm_dev_enter(dev, &idx)) { 644bee330f3SNoralf Trønnes drm_dev_exit(idx); 645bee330f3SNoralf Trønnes return false; 646bee330f3SNoralf Trønnes } 647bee330f3SNoralf Trønnes 648bee330f3SNoralf Trønnes return true; 649c07dcd61SDaniel Vetter } 650c07dcd61SDaniel Vetter 6513479fc24SDaniel Vetter /** 6523479fc24SDaniel Vetter * drm_core_check_feature - check driver feature flags 6533479fc24SDaniel Vetter * @dev: DRM device to check 6543479fc24SDaniel Vetter * @feature: feature flag 6553479fc24SDaniel Vetter * 65618ace11fSVille Syrjälä * This checks @dev for driver features, see &drm_driver.driver_features, 65718ace11fSVille Syrjälä * &drm_device.driver_features, and the various DRIVER_\* flags. 6583479fc24SDaniel Vetter * 6593479fc24SDaniel Vetter * Returns true if the @feature is supported, false otherwise. 6603479fc24SDaniel Vetter */ 66118ace11fSVille Syrjälä static inline bool drm_core_check_feature(struct drm_device *dev, u32 feature) 6623479fc24SDaniel Vetter { 66318ace11fSVille Syrjälä return dev->driver->driver_features & dev->driver_features & feature; 6643479fc24SDaniel Vetter } 6653479fc24SDaniel Vetter 6663479fc24SDaniel Vetter /** 6673479fc24SDaniel Vetter * drm_drv_uses_atomic_modeset - check if the driver implements 6683479fc24SDaniel Vetter * atomic_commit() 6693479fc24SDaniel Vetter * @dev: DRM device 6703479fc24SDaniel Vetter * 6713479fc24SDaniel Vetter * This check is useful if drivers do not have DRIVER_ATOMIC set but 6723479fc24SDaniel Vetter * have atomic modesetting internally implemented. 6733479fc24SDaniel Vetter */ 6743479fc24SDaniel Vetter static inline bool drm_drv_uses_atomic_modeset(struct drm_device *dev) 6753479fc24SDaniel Vetter { 6763479fc24SDaniel Vetter return drm_core_check_feature(dev, DRIVER_ATOMIC) || 6773479fc24SDaniel Vetter dev->mode_config.funcs->atomic_commit != NULL; 6783479fc24SDaniel Vetter } 6793479fc24SDaniel Vetter 68085e634bcSDaniel Vetter 68163207455SDave Airlie int drm_dev_set_unique(struct drm_device *dev, const char *name); 68263207455SDave Airlie 68363207455SDave Airlie 68485e634bcSDaniel Vetter #endif 685