1 /* $NetBSD: drm_device.h,v 1.11 2022/10/15 15:19:28 riastradh Exp $ */ 2 3 #ifndef _DRM_DEVICE_H_ 4 #define _DRM_DEVICE_H_ 5 6 #include <linux/list.h> 7 #include <linux/kref.h> 8 #include <linux/mutex.h> 9 #include <linux/idr.h> 10 11 #include <drm/drm_hashtab.h> 12 #include <drm/drm_mode_config.h> 13 14 #ifdef __NetBSD__ 15 #include <drm/drm_wait_netbsd.h> 16 #include <dev/sysmon/sysmonvar.h> 17 #endif 18 19 struct drm_driver; 20 struct drm_minor; 21 struct drm_master; 22 struct drm_device_dma; 23 struct drm_vblank_crtc; 24 struct drm_sg_mem; 25 struct drm_local_map; 26 struct drm_vma_offset_manager; 27 struct drm_vram_mm; 28 struct drm_fb_helper; 29 30 struct pci_dev; 31 struct pci_controller; 32 33 /** 34 * enum drm_switch_power - power state of drm device 35 */ 36 37 enum switch_power_state { 38 /** @DRM_SWITCH_POWER_ON: Power state is ON */ 39 DRM_SWITCH_POWER_ON = 0, 40 41 /** @DRM_SWITCH_POWER_OFF: Power state is OFF */ 42 DRM_SWITCH_POWER_OFF = 1, 43 44 /** @DRM_SWITCH_POWER_CHANGING: Power state is changing */ 45 DRM_SWITCH_POWER_CHANGING = 2, 46 47 /** @DRM_SWITCH_POWER_DYNAMIC_OFF: Suspended */ 48 DRM_SWITCH_POWER_DYNAMIC_OFF = 3, 49 }; 50 51 /** 52 * struct drm_device - DRM device structure 53 * 54 * This structure represent a complete card that 55 * may contain multiple heads. 56 */ 57 struct drm_device { 58 /** 59 * @legacy_dev_list: 60 * 61 * List of devices per driver for stealth attach cleanup 62 */ 63 struct list_head legacy_dev_list; 64 65 /** @if_version: Highest interface version set */ 66 int if_version; 67 68 /** @ref: Object ref-count */ 69 struct kref ref; 70 71 /** @dev: Device structure of bus-device */ 72 struct device *dev; 73 74 /** @driver: DRM driver managing the device */ 75 struct drm_driver *driver; 76 77 /** 78 * @dev_private: 79 * 80 * DRM driver private data. Instead of using this pointer it is 81 * recommended that drivers use drm_dev_init() and embed struct 82 * &drm_device in their larger per-device structure. 83 */ 84 void *dev_private; 85 86 /** @primary: Primary node */ 87 struct drm_minor *primary; 88 89 /** @render: Render node */ 90 struct drm_minor *render; 91 92 /** 93 * @registered: 94 * 95 * Internally used by drm_dev_register() and drm_connector_register(). 96 */ 97 bool registered; 98 99 /** 100 * @master: 101 * 102 * Currently active master for this device. 103 * Protected by &master_mutex 104 */ 105 struct drm_master *master; 106 107 /** 108 * @driver_features: per-device driver features 109 * 110 * Drivers can clear specific flags here to disallow 111 * certain features on a per-device basis while still 112 * sharing a single &struct drm_driver instance across 113 * all devices. 114 */ 115 u32 driver_features; 116 117 /** 118 * @unplugged: 119 * 120 * Flag to tell if the device has been unplugged. 121 * See drm_dev_enter() and drm_dev_is_unplugged(). 122 */ 123 bool unplugged; 124 125 /** @anon_inode: inode for private address-space */ 126 void *anon_inode; 127 128 /** @unique: Unique name of the device */ 129 char *unique; 130 131 /** 132 * @struct_mutex: 133 * 134 * Lock for others (not &drm_minor.master and &drm_file.is_master) 135 */ 136 struct mutex struct_mutex; 137 138 /** 139 * @master_mutex: 140 * 141 * Lock for &drm_minor.master and &drm_file.is_master 142 */ 143 struct mutex master_mutex; 144 145 /** 146 * @open_count: 147 * 148 * Usage counter for outstanding files open, 149 * protected by drm_global_mutex 150 */ 151 int open_count; 152 153 /** @filelist_mutex: Protects @filelist. */ 154 struct mutex filelist_mutex; 155 /** 156 * @filelist: 157 * 158 * List of userspace clients, linked through &drm_file.lhead. 159 */ 160 struct list_head filelist; 161 162 /** 163 * @filelist_internal: 164 * 165 * List of open DRM files for in-kernel clients. 166 * Protected by &filelist_mutex. 167 */ 168 struct list_head filelist_internal; 169 170 /** 171 * @clientlist_mutex: 172 * 173 * Protects &clientlist access. 174 */ 175 struct mutex clientlist_mutex; 176 177 /** 178 * @clientlist: 179 * 180 * List of in-kernel clients. Protected by &clientlist_mutex. 181 */ 182 struct list_head clientlist; 183 184 /** 185 * @irq_enabled: 186 * 187 * Indicates that interrupt handling is enabled, specifically vblank 188 * handling. Drivers which don't use drm_irq_install() need to set this 189 * to true manually. 190 */ 191 bool irq_enabled; 192 193 /** 194 * @irq: Used by the drm_irq_install() and drm_irq_unistall() helpers. 195 */ 196 int irq; 197 #ifdef __NetBSD__ 198 struct drm_bus_irq_cookie *irq_cookie; 199 #endif 200 201 /** 202 * @vblank_disable_immediate: 203 * 204 * If true, vblank interrupt will be disabled immediately when the 205 * refcount drops to zero, as opposed to via the vblank disable 206 * timer. 207 * 208 * This can be set to true it the hardware has a working vblank counter 209 * with high-precision timestamping (otherwise there are races) and the 210 * driver uses drm_crtc_vblank_on() and drm_crtc_vblank_off() 211 * appropriately. See also @max_vblank_count and 212 * &drm_crtc_funcs.get_vblank_counter. 213 */ 214 bool vblank_disable_immediate; 215 216 /** 217 * @vblank: 218 * 219 * Array of vblank tracking structures, one per &struct drm_crtc. For 220 * historical reasons (vblank support predates kernel modesetting) this 221 * is free-standing and not part of &struct drm_crtc itself. It must be 222 * initialized explicitly by calling drm_vblank_init(). 223 */ 224 struct drm_vblank_crtc *vblank; 225 226 /** 227 * @vblank_time_lock: 228 * 229 * Protects vblank count and time updates during vblank enable/disable 230 */ 231 spinlock_t vblank_time_lock; 232 #ifndef __NetBSD__ /* merged into event_lock */ 233 /** 234 * @vbl_lock: Top-level vblank references lock, wraps the low-level 235 * @vblank_time_lock. 236 */ 237 spinlock_t vbl_lock; 238 #endif 239 240 /** 241 * @max_vblank_count: 242 * 243 * Maximum value of the vblank registers. This value +1 will result in a 244 * wrap-around of the vblank register. It is used by the vblank core to 245 * handle wrap-arounds. 246 * 247 * If set to zero the vblank core will try to guess the elapsed vblanks 248 * between times when the vblank interrupt is disabled through 249 * high-precision timestamps. That approach is suffering from small 250 * races and imprecision over longer time periods, hence exposing a 251 * hardware vblank counter is always recommended. 252 * 253 * This is the statically configured device wide maximum. The driver 254 * can instead choose to use a runtime configurable per-crtc value 255 * &drm_vblank_crtc.max_vblank_count, in which case @max_vblank_count 256 * must be left at zero. See drm_crtc_set_max_vblank_count() on how 257 * to use the per-crtc value. 258 * 259 * If non-zero, &drm_crtc_funcs.get_vblank_counter must be set. 260 */ 261 u32 max_vblank_count; 262 263 /** @vblank_event_list: List of vblank events */ 264 struct list_head vblank_event_list; 265 266 /** 267 * @event_lock: 268 * 269 * Protects @vblank_event_list and event delivery in 270 * general. See drm_send_event() and drm_send_event_locked(). 271 */ 272 spinlock_t event_lock; 273 274 /** @agp: AGP data */ 275 struct drm_agp_head *agp; 276 277 /** @pdev: PCI device structure */ 278 struct pci_dev *pdev; 279 280 #ifdef __alpha__ 281 /** @hose: PCI hose, only used on ALPHA platforms. */ 282 struct pci_controller *hose; 283 #endif 284 285 #ifdef __NetBSD__ 286 bus_space_tag_t bst; 287 struct drm_bus_map *bus_maps; 288 unsigned bus_nmaps; 289 bus_dma_tag_t bus_dmat; /* bus's full DMA tag, for internal use */ 290 bus_dma_tag_t bus_dmat32; /* bus's 32-bit DMA tag */ 291 bus_dma_tag_t dmat; /* DMA tag for driver, may be subregion */ 292 bool dmat_subregion_p; 293 bus_addr_t dmat_subregion_min; 294 bus_addr_t dmat_subregion_max; 295 struct vmem *cma_pool; 296 #endif 297 298 /** @num_crtcs: Number of CRTCs on this device */ 299 unsigned int num_crtcs; 300 301 /** @mode_config: Current mode config */ 302 struct drm_mode_config mode_config; 303 304 /** @object_name_lock: GEM information */ 305 struct mutex object_name_lock; 306 307 /** @object_name_idr: GEM information */ 308 struct idr object_name_idr; 309 310 /** @vma_offset_manager: GEM information */ 311 struct drm_vma_offset_manager *vma_offset_manager; 312 313 /** @vram_mm: VRAM MM memory manager */ 314 struct drm_vram_mm *vram_mm; 315 316 /** 317 * @switch_power_state: 318 * 319 * Power state of the client. 320 * Used by drivers supporting the switcheroo driver. 321 * The state is maintained in the 322 * &vga_switcheroo_client_ops.set_gpu_state callback 323 */ 324 enum switch_power_state switch_power_state; 325 326 /** 327 * @fb_helper: 328 * 329 * Pointer to the fbdev emulation structure. 330 * Set by drm_fb_helper_init() and cleared by drm_fb_helper_fini(). 331 */ 332 struct drm_fb_helper *fb_helper; 333 334 #ifdef __NetBSD__ 335 struct sysmon_pswitch sc_monitor_hotplug; 336 struct mutex suspend_lock; 337 drm_waitqueue_t suspend_cv; 338 uint64_t active_ioctls; 339 struct lwp *suspender; 340 #endif 341 342 /* Everything below here is for legacy driver, never use! */ 343 /* private: */ 344 #if IS_ENABLED(CONFIG_DRM_LEGACY) || \ 345 defined(__NetBSD__) /* XXX drm_vm.c / drm_cdevsw.c use this */ 346 /* Context handle management - linked list of context handles */ 347 struct list_head ctxlist; 348 349 /* Context handle management - mutex for &ctxlist */ 350 struct mutex ctxlist_mutex; 351 352 /* Context handle management */ 353 struct idr ctx_idr; 354 355 /* Memory management - linked list of regions */ 356 struct list_head maplist; 357 358 /* Memory management - user token hash table for maps */ 359 struct drm_open_hash map_hash; 360 361 /* Context handle management - list of vmas (for debugging) */ 362 struct list_head vmalist; 363 364 /* Optional pointer for DMA support */ 365 struct drm_device_dma *dma; 366 367 /* Context swapping flag */ 368 __volatile__ long context_flag; 369 370 /* Last current context */ 371 int last_context; 372 373 /* Lock for &buf_use and a few other things. */ 374 spinlock_t buf_lock; 375 376 /* Usage counter for buffers in use -- cannot alloc */ 377 int buf_use; 378 379 /* Buffer allocation in progress */ 380 atomic_t buf_alloc; 381 382 struct { 383 int context; 384 struct drm_hw_lock *lock; 385 } sigdata; 386 387 struct drm_local_map *agp_buffer_map; 388 unsigned int agp_buffer_token; 389 390 /* Scatter gather memory */ 391 struct drm_sg_mem *sg; 392 #endif 393 }; 394 395 #ifdef __NetBSD__ 396 extern const struct cdevsw drm_cdevsw; 397 int drm_limit_dma_space(struct drm_device *, resource_size_t, resource_size_t); 398 int drm_guarantee_initialized(void); 399 #endif 400 401 #endif 402