323 lines · c
1#ifndef _DRM_DEVICE_H_2#define _DRM_DEVICE_H_3 4#include <linux/list.h>5#include <linux/kref.h>6#include <linux/mutex.h>7#include <linux/idr.h>8 9#include <drm/drm_mode_config.h>10 11struct drm_driver;12struct drm_minor;13struct drm_master;14struct drm_vblank_crtc;15struct drm_vma_offset_manager;16struct drm_vram_mm;17struct drm_fb_helper;18 19struct inode;20 21struct pci_dev;22struct pci_controller;23 24 25/**26 * enum switch_power_state - power state of drm device27 */28 29enum switch_power_state {30 /** @DRM_SWITCH_POWER_ON: Power state is ON */31 DRM_SWITCH_POWER_ON = 0,32 33 /** @DRM_SWITCH_POWER_OFF: Power state is OFF */34 DRM_SWITCH_POWER_OFF = 1,35 36 /** @DRM_SWITCH_POWER_CHANGING: Power state is changing */37 DRM_SWITCH_POWER_CHANGING = 2,38 39 /** @DRM_SWITCH_POWER_DYNAMIC_OFF: Suspended */40 DRM_SWITCH_POWER_DYNAMIC_OFF = 3,41};42 43/**44 * struct drm_device - DRM device structure45 *46 * This structure represent a complete card that47 * may contain multiple heads.48 */49struct drm_device {50 /** @if_version: Highest interface version set */51 int if_version;52 53 /** @ref: Object ref-count */54 struct kref ref;55 56 /** @dev: Device structure of bus-device */57 struct device *dev;58 59 /**60 * @managed:61 *62 * Managed resources linked to the lifetime of this &drm_device as63 * tracked by @ref.64 */65 struct {66 /** @managed.resources: managed resources list */67 struct list_head resources;68 /** @managed.final_kfree: pointer for final kfree() call */69 void *final_kfree;70 /** @managed.lock: protects @managed.resources */71 spinlock_t lock;72 } managed;73 74 /** @driver: DRM driver managing the device */75 const struct drm_driver *driver;76 77 /**78 * @dev_private:79 *80 * DRM driver private data. This is deprecated and should be left set to81 * NULL.82 *83 * Instead of using this pointer it is recommended that drivers use84 * devm_drm_dev_alloc() and embed struct &drm_device in their larger85 * per-device structure.86 */87 void *dev_private;88 89 /**90 * @primary:91 *92 * Primary node. Drivers should not interact with this93 * directly. debugfs interfaces can be registered with94 * drm_debugfs_add_file(), and sysfs should be directly added on the95 * hardware (and not character device node) struct device @dev.96 */97 struct drm_minor *primary;98 99 /**100 * @render:101 *102 * Render node. Drivers should not interact with this directly ever.103 * Drivers should not expose any additional interfaces in debugfs or104 * sysfs on this node.105 */106 struct drm_minor *render;107 108 /** @accel: Compute Acceleration node */109 struct drm_minor *accel;110 111 /**112 * @registered:113 *114 * Internally used by drm_dev_register() and drm_connector_register().115 */116 bool registered;117 118 /**119 * @master:120 *121 * Currently active master for this device.122 * Protected by &master_mutex123 */124 struct drm_master *master;125 126 /**127 * @driver_features: per-device driver features128 *129 * Drivers can clear specific flags here to disallow130 * certain features on a per-device basis while still131 * sharing a single &struct drm_driver instance across132 * all devices.133 */134 u32 driver_features;135 136 /**137 * @unplugged:138 *139 * Flag to tell if the device has been unplugged.140 * See drm_dev_enter() and drm_dev_is_unplugged().141 */142 bool unplugged;143 144 /** @anon_inode: inode for private address-space */145 struct inode *anon_inode;146 147 /** @unique: Unique name of the device */148 char *unique;149 150 /**151 * @struct_mutex:152 *153 * Lock for others (not &drm_minor.master and &drm_file.is_master)154 *155 * TODO: This lock used to be the BKL of the DRM subsystem. Move the156 * lock into i915, which is the only remaining user.157 */158 struct mutex struct_mutex;159 160 /**161 * @master_mutex:162 *163 * Lock for &drm_minor.master and &drm_file.is_master164 */165 struct mutex master_mutex;166 167 /**168 * @open_count:169 *170 * Usage counter for outstanding files open,171 * protected by drm_global_mutex172 */173 atomic_t open_count;174 175 /** @filelist_mutex: Protects @filelist. */176 struct mutex filelist_mutex;177 /**178 * @filelist:179 *180 * List of userspace clients, linked through &drm_file.lhead.181 */182 struct list_head filelist;183 184 /**185 * @filelist_internal:186 *187 * List of open DRM files for in-kernel clients.188 * Protected by &filelist_mutex.189 */190 struct list_head filelist_internal;191 192 /**193 * @clientlist_mutex:194 *195 * Protects &clientlist access.196 */197 struct mutex clientlist_mutex;198 199 /**200 * @clientlist:201 *202 * List of in-kernel clients. Protected by &clientlist_mutex.203 */204 struct list_head clientlist;205 206 /**207 * @vblank_disable_immediate:208 *209 * If true, vblank interrupt will be disabled immediately when the210 * refcount drops to zero, as opposed to via the vblank disable211 * timer.212 *213 * This can be set to true it the hardware has a working vblank counter214 * with high-precision timestamping (otherwise there are races) and the215 * driver uses drm_crtc_vblank_on() and drm_crtc_vblank_off()216 * appropriately. Also, see @max_vblank_count,217 * &drm_crtc_funcs.get_vblank_counter and218 * &drm_vblank_crtc_config.disable_immediate.219 */220 bool vblank_disable_immediate;221 222 /**223 * @vblank:224 *225 * Array of vblank tracking structures, one per &struct drm_crtc. For226 * historical reasons (vblank support predates kernel modesetting) this227 * is free-standing and not part of &struct drm_crtc itself. It must be228 * initialized explicitly by calling drm_vblank_init().229 */230 struct drm_vblank_crtc *vblank;231 232 /**233 * @vblank_time_lock:234 *235 * Protects vblank count and time updates during vblank enable/disable236 */237 spinlock_t vblank_time_lock;238 /**239 * @vbl_lock: Top-level vblank references lock, wraps the low-level240 * @vblank_time_lock.241 */242 spinlock_t vbl_lock;243 244 /**245 * @max_vblank_count:246 *247 * Maximum value of the vblank registers. This value +1 will result in a248 * wrap-around of the vblank register. It is used by the vblank core to249 * handle wrap-arounds.250 *251 * If set to zero the vblank core will try to guess the elapsed vblanks252 * between times when the vblank interrupt is disabled through253 * high-precision timestamps. That approach is suffering from small254 * races and imprecision over longer time periods, hence exposing a255 * hardware vblank counter is always recommended.256 *257 * This is the statically configured device wide maximum. The driver258 * can instead choose to use a runtime configurable per-crtc value259 * &drm_vblank_crtc.max_vblank_count, in which case @max_vblank_count260 * must be left at zero. See drm_crtc_set_max_vblank_count() on how261 * to use the per-crtc value.262 *263 * If non-zero, &drm_crtc_funcs.get_vblank_counter must be set.264 */265 u32 max_vblank_count;266 267 /** @vblank_event_list: List of vblank events */268 struct list_head vblank_event_list;269 270 /**271 * @event_lock:272 *273 * Protects @vblank_event_list and event delivery in274 * general. See drm_send_event() and drm_send_event_locked().275 */276 spinlock_t event_lock;277 278 /** @num_crtcs: Number of CRTCs on this device */279 unsigned int num_crtcs;280 281 /** @mode_config: Current mode config */282 struct drm_mode_config mode_config;283 284 /** @object_name_lock: GEM information */285 struct mutex object_name_lock;286 287 /** @object_name_idr: GEM information */288 struct idr object_name_idr;289 290 /** @vma_offset_manager: GEM information */291 struct drm_vma_offset_manager *vma_offset_manager;292 293 /** @vram_mm: VRAM MM memory manager */294 struct drm_vram_mm *vram_mm;295 296 /**297 * @switch_power_state:298 *299 * Power state of the client.300 * Used by drivers supporting the switcheroo driver.301 * The state is maintained in the302 * &vga_switcheroo_client_ops.set_gpu_state callback303 */304 enum switch_power_state switch_power_state;305 306 /**307 * @fb_helper:308 *309 * Pointer to the fbdev emulation structure.310 * Set by drm_fb_helper_init() and cleared by drm_fb_helper_fini().311 */312 struct drm_fb_helper *fb_helper;313 314 /**315 * @debugfs_root:316 *317 * Root directory for debugfs files.318 */319 struct dentry *debugfs_root;320};321 322#endif323