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