| 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 | #include <linux/sched.h> | 
|---|
| 9 |  | 
|---|
| 10 | #include <drm/drm_mode_config.h> | 
|---|
| 11 |  | 
|---|
| 12 | struct drm_driver; | 
|---|
| 13 | struct drm_minor; | 
|---|
| 14 | struct drm_master; | 
|---|
| 15 | struct drm_vblank_crtc; | 
|---|
| 16 | struct drm_vma_offset_manager; | 
|---|
| 17 | struct drm_vram_mm; | 
|---|
| 18 | struct drm_fb_helper; | 
|---|
| 19 |  | 
|---|
| 20 | struct inode; | 
|---|
| 21 |  | 
|---|
| 22 | struct pci_dev; | 
|---|
| 23 | struct pci_controller; | 
|---|
| 24 |  | 
|---|
| 25 | /* | 
|---|
| 26 | * Recovery methods for wedged device in order of less to more side-effects. | 
|---|
| 27 | * To be used with drm_dev_wedged_event() as recovery @method. Callers can | 
|---|
| 28 | * use any one, multiple (or'd) or none depending on their needs. | 
|---|
| 29 | * | 
|---|
| 30 | * Refer to "Device Wedging" chapter in Documentation/gpu/drm-uapi.rst for more | 
|---|
| 31 | * details. | 
|---|
| 32 | */ | 
|---|
| 33 | #define DRM_WEDGE_RECOVERY_NONE		BIT(0)	/* optional telemetry collection */ | 
|---|
| 34 | #define DRM_WEDGE_RECOVERY_REBIND	BIT(1)	/* unbind + bind driver */ | 
|---|
| 35 | #define DRM_WEDGE_RECOVERY_BUS_RESET	BIT(2)	/* unbind + reset bus device + bind */ | 
|---|
| 36 | #define DRM_WEDGE_RECOVERY_VENDOR	BIT(3)	/* vendor specific recovery method */ | 
|---|
| 37 |  | 
|---|
| 38 | /** | 
|---|
| 39 | * struct drm_wedge_task_info - information about the guilty task of a wedge dev | 
|---|
| 40 | */ | 
|---|
| 41 | struct drm_wedge_task_info { | 
|---|
| 42 | /** @pid: pid of the task */ | 
|---|
| 43 | pid_t pid; | 
|---|
| 44 | /** @comm: command name of the task */ | 
|---|
| 45 | char comm[TASK_COMM_LEN]; | 
|---|
| 46 | }; | 
|---|
| 47 |  | 
|---|
| 48 | /** | 
|---|
| 49 | * enum switch_power_state - power state of drm device | 
|---|
| 50 | */ | 
|---|
| 51 |  | 
|---|
| 52 | enum switch_power_state { | 
|---|
| 53 | /** @DRM_SWITCH_POWER_ON: Power state is ON */ | 
|---|
| 54 | DRM_SWITCH_POWER_ON = 0, | 
|---|
| 55 |  | 
|---|
| 56 | /** @DRM_SWITCH_POWER_OFF: Power state is OFF */ | 
|---|
| 57 | DRM_SWITCH_POWER_OFF = 1, | 
|---|
| 58 |  | 
|---|
| 59 | /** @DRM_SWITCH_POWER_CHANGING: Power state is changing */ | 
|---|
| 60 | DRM_SWITCH_POWER_CHANGING = 2, | 
|---|
| 61 |  | 
|---|
| 62 | /** @DRM_SWITCH_POWER_DYNAMIC_OFF: Suspended */ | 
|---|
| 63 | DRM_SWITCH_POWER_DYNAMIC_OFF = 3, | 
|---|
| 64 | }; | 
|---|
| 65 |  | 
|---|
| 66 | /** | 
|---|
| 67 | * struct drm_device - DRM device structure | 
|---|
| 68 | * | 
|---|
| 69 | * This structure represent a complete card that | 
|---|
| 70 | * may contain multiple heads. | 
|---|
| 71 | */ | 
|---|
| 72 | struct drm_device { | 
|---|
| 73 | /** @if_version: Highest interface version set */ | 
|---|
| 74 | int if_version; | 
|---|
| 75 |  | 
|---|
| 76 | /** @ref: Object ref-count */ | 
|---|
| 77 | struct kref ref; | 
|---|
| 78 |  | 
|---|
| 79 | /** @dev: Device structure of bus-device */ | 
|---|
| 80 | struct device *dev; | 
|---|
| 81 |  | 
|---|
| 82 | /** | 
|---|
| 83 | * @dma_dev: | 
|---|
| 84 | * | 
|---|
| 85 | * Device for DMA operations. Only required if the device @dev | 
|---|
| 86 | * cannot perform DMA by itself. Should be NULL otherwise. Call | 
|---|
| 87 | * drm_dev_dma_dev() to get the DMA device instead of using this | 
|---|
| 88 | * field directly. Call drm_dev_set_dma_dev() to set this field. | 
|---|
| 89 | * | 
|---|
| 90 | * DRM devices are sometimes bound to virtual devices that cannot | 
|---|
| 91 | * perform DMA by themselves. Drivers should set this field to the | 
|---|
| 92 | * respective DMA controller. | 
|---|
| 93 | * | 
|---|
| 94 | * Devices on USB and other peripheral busses also cannot perform | 
|---|
| 95 | * DMA by themselves. The @dma_dev field should point the bus | 
|---|
| 96 | * controller that does DMA on behalve of such a device. Required | 
|---|
| 97 | * for importing buffers via dma-buf. | 
|---|
| 98 | * | 
|---|
| 99 | * If set, the DRM core automatically releases the reference on the | 
|---|
| 100 | * device. | 
|---|
| 101 | */ | 
|---|
| 102 | struct device *dma_dev; | 
|---|
| 103 |  | 
|---|
| 104 | /** | 
|---|
| 105 | * @managed: | 
|---|
| 106 | * | 
|---|
| 107 | * Managed resources linked to the lifetime of this &drm_device as | 
|---|
| 108 | * tracked by @ref. | 
|---|
| 109 | */ | 
|---|
| 110 | struct { | 
|---|
| 111 | /** @managed.resources: managed resources list */ | 
|---|
| 112 | struct list_head resources; | 
|---|
| 113 | /** @managed.final_kfree: pointer for final kfree() call */ | 
|---|
| 114 | void *final_kfree; | 
|---|
| 115 | /** @managed.lock: protects @managed.resources */ | 
|---|
| 116 | spinlock_t lock; | 
|---|
| 117 | } managed; | 
|---|
| 118 |  | 
|---|
| 119 | /** @driver: DRM driver managing the device */ | 
|---|
| 120 | const struct drm_driver *driver; | 
|---|
| 121 |  | 
|---|
| 122 | /** | 
|---|
| 123 | * @dev_private: | 
|---|
| 124 | * | 
|---|
| 125 | * DRM driver private data. This is deprecated and should be left set to | 
|---|
| 126 | * NULL. | 
|---|
| 127 | * | 
|---|
| 128 | * Instead of using this pointer it is recommended that drivers use | 
|---|
| 129 | * devm_drm_dev_alloc() and embed struct &drm_device in their larger | 
|---|
| 130 | * per-device structure. | 
|---|
| 131 | */ | 
|---|
| 132 | void *dev_private; | 
|---|
| 133 |  | 
|---|
| 134 | /** | 
|---|
| 135 | * @primary: | 
|---|
| 136 | * | 
|---|
| 137 | * Primary node. Drivers should not interact with this | 
|---|
| 138 | * directly. debugfs interfaces can be registered with | 
|---|
| 139 | * drm_debugfs_add_file(), and sysfs should be directly added on the | 
|---|
| 140 | * hardware (and not character device node) struct device @dev. | 
|---|
| 141 | */ | 
|---|
| 142 | struct drm_minor *primary; | 
|---|
| 143 |  | 
|---|
| 144 | /** | 
|---|
| 145 | * @render: | 
|---|
| 146 | * | 
|---|
| 147 | * Render node. Drivers should not interact with this directly ever. | 
|---|
| 148 | * Drivers should not expose any additional interfaces in debugfs or | 
|---|
| 149 | * sysfs on this node. | 
|---|
| 150 | */ | 
|---|
| 151 | struct drm_minor *render; | 
|---|
| 152 |  | 
|---|
| 153 | /** @accel: Compute Acceleration node */ | 
|---|
| 154 | struct drm_minor *accel; | 
|---|
| 155 |  | 
|---|
| 156 | /** | 
|---|
| 157 | * @registered: | 
|---|
| 158 | * | 
|---|
| 159 | * Internally used by drm_dev_register() and drm_connector_register(). | 
|---|
| 160 | */ | 
|---|
| 161 | bool registered; | 
|---|
| 162 |  | 
|---|
| 163 | /** | 
|---|
| 164 | * @master: | 
|---|
| 165 | * | 
|---|
| 166 | * Currently active master for this device. | 
|---|
| 167 | * Protected by &master_mutex | 
|---|
| 168 | */ | 
|---|
| 169 | struct drm_master *master; | 
|---|
| 170 |  | 
|---|
| 171 | /** | 
|---|
| 172 | * @driver_features: per-device driver features | 
|---|
| 173 | * | 
|---|
| 174 | * Drivers can clear specific flags here to disallow | 
|---|
| 175 | * certain features on a per-device basis while still | 
|---|
| 176 | * sharing a single &struct drm_driver instance across | 
|---|
| 177 | * all devices. | 
|---|
| 178 | */ | 
|---|
| 179 | u32 driver_features; | 
|---|
| 180 |  | 
|---|
| 181 | /** | 
|---|
| 182 | * @unplugged: | 
|---|
| 183 | * | 
|---|
| 184 | * Flag to tell if the device has been unplugged. | 
|---|
| 185 | * See drm_dev_enter() and drm_dev_is_unplugged(). | 
|---|
| 186 | */ | 
|---|
| 187 | bool unplugged; | 
|---|
| 188 |  | 
|---|
| 189 | /** @anon_inode: inode for private address-space */ | 
|---|
| 190 | struct inode *anon_inode; | 
|---|
| 191 |  | 
|---|
| 192 | /** @unique: Unique name of the device */ | 
|---|
| 193 | char *unique; | 
|---|
| 194 |  | 
|---|
| 195 | /** | 
|---|
| 196 | * @master_mutex: | 
|---|
| 197 | * | 
|---|
| 198 | * Lock for &drm_minor.master and &drm_file.is_master | 
|---|
| 199 | */ | 
|---|
| 200 | struct mutex master_mutex; | 
|---|
| 201 |  | 
|---|
| 202 | /** | 
|---|
| 203 | * @open_count: | 
|---|
| 204 | * | 
|---|
| 205 | * Usage counter for outstanding files open, | 
|---|
| 206 | * protected by drm_global_mutex | 
|---|
| 207 | */ | 
|---|
| 208 | atomic_t open_count; | 
|---|
| 209 |  | 
|---|
| 210 | /** @filelist_mutex: Protects @filelist. */ | 
|---|
| 211 | struct mutex filelist_mutex; | 
|---|
| 212 | /** | 
|---|
| 213 | * @filelist: | 
|---|
| 214 | * | 
|---|
| 215 | * List of userspace clients, linked through &drm_file.lhead. | 
|---|
| 216 | */ | 
|---|
| 217 | struct list_head filelist; | 
|---|
| 218 |  | 
|---|
| 219 | /** | 
|---|
| 220 | * @filelist_internal: | 
|---|
| 221 | * | 
|---|
| 222 | * List of open DRM files for in-kernel clients. | 
|---|
| 223 | * Protected by &filelist_mutex. | 
|---|
| 224 | */ | 
|---|
| 225 | struct list_head filelist_internal; | 
|---|
| 226 |  | 
|---|
| 227 | /** | 
|---|
| 228 | * @clientlist_mutex: | 
|---|
| 229 | * | 
|---|
| 230 | * Protects &clientlist access. | 
|---|
| 231 | */ | 
|---|
| 232 | struct mutex clientlist_mutex; | 
|---|
| 233 |  | 
|---|
| 234 | /** | 
|---|
| 235 | * @clientlist: | 
|---|
| 236 | * | 
|---|
| 237 | * List of in-kernel clients. Protected by &clientlist_mutex. | 
|---|
| 238 | */ | 
|---|
| 239 | struct list_head clientlist; | 
|---|
| 240 |  | 
|---|
| 241 | /** | 
|---|
| 242 | * @vblank_disable_immediate: | 
|---|
| 243 | * | 
|---|
| 244 | * If true, vblank interrupt will be disabled immediately when the | 
|---|
| 245 | * refcount drops to zero, as opposed to via the vblank disable | 
|---|
| 246 | * timer. | 
|---|
| 247 | * | 
|---|
| 248 | * This can be set to true it the hardware has a working vblank counter | 
|---|
| 249 | * with high-precision timestamping (otherwise there are races) and the | 
|---|
| 250 | * driver uses drm_crtc_vblank_on() and drm_crtc_vblank_off() | 
|---|
| 251 | * appropriately. Also, see @max_vblank_count, | 
|---|
| 252 | * &drm_crtc_funcs.get_vblank_counter and | 
|---|
| 253 | * &drm_vblank_crtc_config.disable_immediate. | 
|---|
| 254 | */ | 
|---|
| 255 | bool vblank_disable_immediate; | 
|---|
| 256 |  | 
|---|
| 257 | /** | 
|---|
| 258 | * @vblank: | 
|---|
| 259 | * | 
|---|
| 260 | * Array of vblank tracking structures, one per &struct drm_crtc. For | 
|---|
| 261 | * historical reasons (vblank support predates kernel modesetting) this | 
|---|
| 262 | * is free-standing and not part of &struct drm_crtc itself. It must be | 
|---|
| 263 | * initialized explicitly by calling drm_vblank_init(). | 
|---|
| 264 | */ | 
|---|
| 265 | struct drm_vblank_crtc *vblank; | 
|---|
| 266 |  | 
|---|
| 267 | /** | 
|---|
| 268 | * @vblank_time_lock: | 
|---|
| 269 | * | 
|---|
| 270 | *  Protects vblank count and time updates during vblank enable/disable | 
|---|
| 271 | */ | 
|---|
| 272 | spinlock_t vblank_time_lock; | 
|---|
| 273 | /** | 
|---|
| 274 | * @vbl_lock: Top-level vblank references lock, wraps the low-level | 
|---|
| 275 | * @vblank_time_lock. | 
|---|
| 276 | */ | 
|---|
| 277 | spinlock_t vbl_lock; | 
|---|
| 278 |  | 
|---|
| 279 | /** | 
|---|
| 280 | * @max_vblank_count: | 
|---|
| 281 | * | 
|---|
| 282 | * Maximum value of the vblank registers. This value +1 will result in a | 
|---|
| 283 | * wrap-around of the vblank register. It is used by the vblank core to | 
|---|
| 284 | * handle wrap-arounds. | 
|---|
| 285 | * | 
|---|
| 286 | * If set to zero the vblank core will try to guess the elapsed vblanks | 
|---|
| 287 | * between times when the vblank interrupt is disabled through | 
|---|
| 288 | * high-precision timestamps. That approach is suffering from small | 
|---|
| 289 | * races and imprecision over longer time periods, hence exposing a | 
|---|
| 290 | * hardware vblank counter is always recommended. | 
|---|
| 291 | * | 
|---|
| 292 | * This is the statically configured device wide maximum. The driver | 
|---|
| 293 | * can instead choose to use a runtime configurable per-crtc value | 
|---|
| 294 | * &drm_vblank_crtc.max_vblank_count, in which case @max_vblank_count | 
|---|
| 295 | * must be left at zero. See drm_crtc_set_max_vblank_count() on how | 
|---|
| 296 | * to use the per-crtc value. | 
|---|
| 297 | * | 
|---|
| 298 | * If non-zero, &drm_crtc_funcs.get_vblank_counter must be set. | 
|---|
| 299 | */ | 
|---|
| 300 | u32 max_vblank_count; | 
|---|
| 301 |  | 
|---|
| 302 | /** @vblank_event_list: List of vblank events */ | 
|---|
| 303 | struct list_head vblank_event_list; | 
|---|
| 304 |  | 
|---|
| 305 | /** | 
|---|
| 306 | * @event_lock: | 
|---|
| 307 | * | 
|---|
| 308 | * Protects @vblank_event_list and event delivery in | 
|---|
| 309 | * general. See drm_send_event() and drm_send_event_locked(). | 
|---|
| 310 | */ | 
|---|
| 311 | spinlock_t event_lock; | 
|---|
| 312 |  | 
|---|
| 313 | /** @num_crtcs: Number of CRTCs on this device */ | 
|---|
| 314 | unsigned int num_crtcs; | 
|---|
| 315 |  | 
|---|
| 316 | /** @mode_config: Current mode config */ | 
|---|
| 317 | struct drm_mode_config mode_config; | 
|---|
| 318 |  | 
|---|
| 319 | /** @object_name_lock: GEM information */ | 
|---|
| 320 | struct mutex object_name_lock; | 
|---|
| 321 |  | 
|---|
| 322 | /** @object_name_idr: GEM information */ | 
|---|
| 323 | struct idr object_name_idr; | 
|---|
| 324 |  | 
|---|
| 325 | /** @vma_offset_manager: GEM information */ | 
|---|
| 326 | struct drm_vma_offset_manager *vma_offset_manager; | 
|---|
| 327 |  | 
|---|
| 328 | /** @vram_mm: VRAM MM memory manager */ | 
|---|
| 329 | struct drm_vram_mm *vram_mm; | 
|---|
| 330 |  | 
|---|
| 331 | /** | 
|---|
| 332 | * @switch_power_state: | 
|---|
| 333 | * | 
|---|
| 334 | * Power state of the client. | 
|---|
| 335 | * Used by drivers supporting the switcheroo driver. | 
|---|
| 336 | * The state is maintained in the | 
|---|
| 337 | * &vga_switcheroo_client_ops.set_gpu_state callback | 
|---|
| 338 | */ | 
|---|
| 339 | enum switch_power_state switch_power_state; | 
|---|
| 340 |  | 
|---|
| 341 | /** | 
|---|
| 342 | * @fb_helper: | 
|---|
| 343 | * | 
|---|
| 344 | * Pointer to the fbdev emulation structure. | 
|---|
| 345 | * Set by drm_fb_helper_init() and cleared by drm_fb_helper_fini(). | 
|---|
| 346 | */ | 
|---|
| 347 | struct drm_fb_helper *fb_helper; | 
|---|
| 348 |  | 
|---|
| 349 | /** | 
|---|
| 350 | * @debugfs_root: | 
|---|
| 351 | * | 
|---|
| 352 | * Root directory for debugfs files. | 
|---|
| 353 | */ | 
|---|
| 354 | struct dentry *debugfs_root; | 
|---|
| 355 | }; | 
|---|
| 356 |  | 
|---|
| 357 | void drm_dev_set_dma_dev(struct drm_device *dev, struct device *dma_dev); | 
|---|
| 358 |  | 
|---|
| 359 | /** | 
|---|
| 360 | * drm_dev_dma_dev - returns the DMA device for a DRM device | 
|---|
| 361 | * @dev: DRM device | 
|---|
| 362 | * | 
|---|
| 363 | * Returns the DMA device of the given DRM device. By default, this | 
|---|
| 364 | * the DRM device's parent. See drm_dev_set_dma_dev(). | 
|---|
| 365 | * | 
|---|
| 366 | * Returns: | 
|---|
| 367 | * A DMA-capable device for the DRM device. | 
|---|
| 368 | */ | 
|---|
| 369 | static inline struct device *drm_dev_dma_dev(struct drm_device *dev) | 
|---|
| 370 | { | 
|---|
| 371 | if (dev->dma_dev) | 
|---|
| 372 | return dev->dma_dev; | 
|---|
| 373 | return dev->dev; | 
|---|
| 374 | } | 
|---|
| 375 |  | 
|---|
| 376 | #endif | 
|---|
| 377 |  | 
|---|