1 /* 2 * Copyright © 2006 Keith Packard 3 * Copyright © 2007-2008 Dave Airlie 4 * Copyright © 2007-2008 Intel Corporation 5 * Jesse Barnes <jesse.barnes@intel.com> 6 * 7 * Permission is hereby granted, free of charge, to any person obtaining a 8 * copy of this software and associated documentation files (the "Software"), 9 * to deal in the Software without restriction, including without limitation 10 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 11 * and/or sell copies of the Software, and to permit persons to whom the 12 * Software is furnished to do so, subject to the following conditions: 13 * 14 * The above copyright notice and this permission notice shall be included in 15 * all copies or substantial portions of the Software. 16 * 17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 21 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 22 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 23 * OTHER DEALINGS IN THE SOFTWARE. 24 */ 25 #ifndef __DRM_CRTC_H__ 26 #define __DRM_CRTC_H__ 27 28 #include <linux/i2c.h> 29 #include <linux/spinlock.h> 30 #include <linux/types.h> 31 #include <linux/fb.h> 32 #include <linux/hdmi.h> 33 #include <linux/media-bus-format.h> 34 #include <uapi/drm/drm_mode.h> 35 #include <uapi/drm/drm_fourcc.h> 36 #include <drm/drm_modeset_lock.h> 37 #include <drm/drm_rect.h> 38 #include <drm/drm_mode_object.h> 39 #include <drm/drm_framebuffer.h> 40 #include <drm/drm_modes.h> 41 #include <drm/drm_connector.h> 42 #include <drm/drm_property.h> 43 #include <drm/drm_bridge.h> 44 #include <drm/drm_edid.h> 45 #include <drm/drm_plane.h> 46 #include <drm/drm_blend.h> 47 #include <drm/drm_color_mgmt.h> 48 #include <drm/drm_debugfs_crc.h> 49 #include <drm/drm_mode_config.h> 50 51 struct drm_device; 52 struct drm_mode_set; 53 struct drm_file; 54 struct drm_clip_rect; 55 struct drm_printer; 56 struct device_node; 57 struct dma_fence; 58 struct edid; 59 60 static inline int64_t U642I64(uint64_t val) 61 { 62 return (int64_t)*((int64_t *)&val); 63 } 64 static inline uint64_t I642U64(int64_t val) 65 { 66 return (uint64_t)*((uint64_t *)&val); 67 } 68 69 struct drm_crtc; 70 struct drm_pending_vblank_event; 71 struct drm_plane; 72 struct drm_bridge; 73 struct drm_atomic_state; 74 75 struct drm_crtc_helper_funcs; 76 struct drm_plane_helper_funcs; 77 78 /** 79 * struct drm_crtc_state - mutable CRTC state 80 * @crtc: backpointer to the CRTC 81 * @enable: whether the CRTC should be enabled, gates all other state 82 * @active: whether the CRTC is actively displaying (used for DPMS) 83 * @planes_changed: planes on this crtc are updated 84 * @mode_changed: @mode or @enable has been changed 85 * @active_changed: @active has been toggled. 86 * @connectors_changed: connectors to this crtc have been updated 87 * @zpos_changed: zpos values of planes on this crtc have been updated 88 * @color_mgmt_changed: color management properties have changed (degamma or 89 * gamma LUT or CSC matrix) 90 * @plane_mask: bitmask of (1 << drm_plane_index(plane)) of attached planes 91 * @connector_mask: bitmask of (1 << drm_connector_index(connector)) of attached connectors 92 * @encoder_mask: bitmask of (1 << drm_encoder_index(encoder)) of attached encoders 93 * @adjusted_mode: for use by helpers and drivers to compute adjusted mode timings 94 * @mode: current mode timings 95 * @mode_blob: &drm_property_blob for @mode 96 * @degamma_lut: Lookup table for converting framebuffer pixel data 97 * before apply the conversion matrix 98 * @ctm: Transformation matrix 99 * @gamma_lut: Lookup table for converting pixel data after the 100 * conversion matrix 101 * @state: backpointer to global drm_atomic_state 102 * 103 * Note that the distinction between @enable and @active is rather subtile: 104 * Flipping @active while @enable is set without changing anything else may 105 * never return in a failure from the &drm_mode_config_funcs.atomic_check 106 * callback. Userspace assumes that a DPMS On will always succeed. In other 107 * words: @enable controls resource assignment, @active controls the actual 108 * hardware state. 109 * 110 * The three booleans active_changed, connectors_changed and mode_changed are 111 * intended to indicate whether a full modeset is needed, rather than strictly 112 * describing what has changed in a commit. 113 * See also: drm_atomic_crtc_needs_modeset() 114 */ 115 struct drm_crtc_state { 116 struct drm_crtc *crtc; 117 118 bool enable; 119 bool active; 120 121 /* computed state bits used by helpers and drivers */ 122 bool planes_changed : 1; 123 bool mode_changed : 1; 124 bool active_changed : 1; 125 bool connectors_changed : 1; 126 bool zpos_changed : 1; 127 bool color_mgmt_changed : 1; 128 129 /* attached planes bitmask: 130 * WARNING: transitional helpers do not maintain plane_mask so 131 * drivers not converted over to atomic helpers should not rely 132 * on plane_mask being accurate! 133 */ 134 u32 plane_mask; 135 136 u32 connector_mask; 137 u32 encoder_mask; 138 139 /* adjusted_mode: for use by helpers and drivers */ 140 struct drm_display_mode adjusted_mode; 141 142 struct drm_display_mode mode; 143 144 /* blob property to expose current mode to atomic userspace */ 145 struct drm_property_blob *mode_blob; 146 147 /* blob property to expose color management to userspace */ 148 struct drm_property_blob *degamma_lut; 149 struct drm_property_blob *ctm; 150 struct drm_property_blob *gamma_lut; 151 152 /** 153 * @target_vblank: 154 * 155 * Target vertical blank period when a page flip 156 * should take effect. 157 */ 158 159 u32 target_vblank; 160 161 /** 162 * @event: 163 * 164 * Optional pointer to a DRM event to signal upon completion of the 165 * state update. The driver must send out the event when the atomic 166 * commit operation completes. There are two cases: 167 * 168 * - The event is for a CRTC which is being disabled through this 169 * atomic commit. In that case the event can be send out any time 170 * after the hardware has stopped scanning out the current 171 * framebuffers. It should contain the timestamp and counter for the 172 * last vblank before the display pipeline was shut off. 173 * 174 * - For a CRTC which is enabled at the end of the commit (even when it 175 * undergoes an full modeset) the vblank timestamp and counter must 176 * be for the vblank right before the first frame that scans out the 177 * new set of buffers. Again the event can only be sent out after the 178 * hardware has stopped scanning out the old buffers. 179 * 180 * - Events for disabled CRTCs are not allowed, and drivers can ignore 181 * that case. 182 * 183 * This can be handled by the drm_crtc_send_vblank_event() function, 184 * which the driver should call on the provided event upon completion of 185 * the atomic commit. Note that if the driver supports vblank signalling 186 * and timestamping the vblank counters and timestamps must agree with 187 * the ones returned from page flip events. With the current vblank 188 * helper infrastructure this can be achieved by holding a vblank 189 * reference while the page flip is pending, acquired through 190 * drm_crtc_vblank_get() and released with drm_crtc_vblank_put(). 191 * Drivers are free to implement their own vblank counter and timestamp 192 * tracking though, e.g. if they have accurate timestamp registers in 193 * hardware. 194 * 195 * For hardware which supports some means to synchronize vblank 196 * interrupt delivery with committing display state there's also 197 * drm_crtc_arm_vblank_event(). See the documentation of that function 198 * for a detailed discussion of the constraints it needs to be used 199 * safely. 200 */ 201 struct drm_pending_vblank_event *event; 202 203 struct drm_atomic_state *state; 204 }; 205 206 /** 207 * struct drm_crtc_funcs - control CRTCs for a given device 208 * 209 * The drm_crtc_funcs structure is the central CRTC management structure 210 * in the DRM. Each CRTC controls one or more connectors (note that the name 211 * CRTC is simply historical, a CRTC may control LVDS, VGA, DVI, TV out, etc. 212 * connectors, not just CRTs). 213 * 214 * Each driver is responsible for filling out this structure at startup time, 215 * in addition to providing other modesetting features, like i2c and DDC 216 * bus accessors. 217 */ 218 struct drm_crtc_funcs { 219 /** 220 * @reset: 221 * 222 * Reset CRTC hardware and software state to off. This function isn't 223 * called by the core directly, only through drm_mode_config_reset(). 224 * It's not a helper hook only for historical reasons. 225 * 226 * Atomic drivers can use drm_atomic_helper_crtc_reset() to reset 227 * atomic state using this hook. 228 */ 229 void (*reset)(struct drm_crtc *crtc); 230 231 /** 232 * @cursor_set: 233 * 234 * Update the cursor image. The cursor position is relative to the CRTC 235 * and can be partially or fully outside of the visible area. 236 * 237 * Note that contrary to all other KMS functions the legacy cursor entry 238 * points don't take a framebuffer object, but instead take directly a 239 * raw buffer object id from the driver's buffer manager (which is 240 * either GEM or TTM for current drivers). 241 * 242 * This entry point is deprecated, drivers should instead implement 243 * universal plane support and register a proper cursor plane using 244 * drm_crtc_init_with_planes(). 245 * 246 * This callback is optional 247 * 248 * RETURNS: 249 * 250 * 0 on success or a negative error code on failure. 251 */ 252 int (*cursor_set)(struct drm_crtc *crtc, struct drm_file *file_priv, 253 uint32_t handle, uint32_t width, uint32_t height); 254 255 /** 256 * @cursor_set2: 257 * 258 * Update the cursor image, including hotspot information. The hotspot 259 * must not affect the cursor position in CRTC coordinates, but is only 260 * meant as a hint for virtualized display hardware to coordinate the 261 * guests and hosts cursor position. The cursor hotspot is relative to 262 * the cursor image. Otherwise this works exactly like @cursor_set. 263 * 264 * This entry point is deprecated, drivers should instead implement 265 * universal plane support and register a proper cursor plane using 266 * drm_crtc_init_with_planes(). 267 * 268 * This callback is optional. 269 * 270 * RETURNS: 271 * 272 * 0 on success or a negative error code on failure. 273 */ 274 int (*cursor_set2)(struct drm_crtc *crtc, struct drm_file *file_priv, 275 uint32_t handle, uint32_t width, uint32_t height, 276 int32_t hot_x, int32_t hot_y); 277 278 /** 279 * @cursor_move: 280 * 281 * Update the cursor position. The cursor does not need to be visible 282 * when this hook is called. 283 * 284 * This entry point is deprecated, drivers should instead implement 285 * universal plane support and register a proper cursor plane using 286 * drm_crtc_init_with_planes(). 287 * 288 * This callback is optional. 289 * 290 * RETURNS: 291 * 292 * 0 on success or a negative error code on failure. 293 */ 294 int (*cursor_move)(struct drm_crtc *crtc, int x, int y); 295 296 /** 297 * @gamma_set: 298 * 299 * Set gamma on the CRTC. 300 * 301 * This callback is optional. 302 * 303 * NOTE: 304 * 305 * Drivers that support gamma tables and also fbdev emulation through 306 * the provided helper library need to take care to fill out the gamma 307 * hooks for both. Currently there's a bit an unfortunate duplication 308 * going on, which should eventually be unified to just one set of 309 * hooks. 310 */ 311 int (*gamma_set)(struct drm_crtc *crtc, u16 *r, u16 *g, u16 *b, 312 uint32_t size); 313 314 /** 315 * @destroy: 316 * 317 * Clean up plane resources. This is only called at driver unload time 318 * through drm_mode_config_cleanup() since a CRTC cannot be hotplugged 319 * in DRM. 320 */ 321 void (*destroy)(struct drm_crtc *crtc); 322 323 /** 324 * @set_config: 325 * 326 * This is the main legacy entry point to change the modeset state on a 327 * CRTC. All the details of the desired configuration are passed in a 328 * &struct drm_mode_set - see there for details. 329 * 330 * Drivers implementing atomic modeset should use 331 * drm_atomic_helper_set_config() to implement this hook. 332 * 333 * RETURNS: 334 * 335 * 0 on success or a negative error code on failure. 336 */ 337 int (*set_config)(struct drm_mode_set *set); 338 339 /** 340 * @page_flip: 341 * 342 * Legacy entry point to schedule a flip to the given framebuffer. 343 * 344 * Page flipping is a synchronization mechanism that replaces the frame 345 * buffer being scanned out by the CRTC with a new frame buffer during 346 * vertical blanking, avoiding tearing (except when requested otherwise 347 * through the DRM_MODE_PAGE_FLIP_ASYNC flag). When an application 348 * requests a page flip the DRM core verifies that the new frame buffer 349 * is large enough to be scanned out by the CRTC in the currently 350 * configured mode and then calls this hook with a pointer to the new 351 * frame buffer. 352 * 353 * The driver must wait for any pending rendering to the new framebuffer 354 * to complete before executing the flip. It should also wait for any 355 * pending rendering from other drivers if the underlying buffer is a 356 * shared dma-buf. 357 * 358 * An application can request to be notified when the page flip has 359 * completed. The drm core will supply a &struct drm_event in the event 360 * parameter in this case. This can be handled by the 361 * drm_crtc_send_vblank_event() function, which the driver should call on 362 * the provided event upon completion of the flip. Note that if 363 * the driver supports vblank signalling and timestamping the vblank 364 * counters and timestamps must agree with the ones returned from page 365 * flip events. With the current vblank helper infrastructure this can 366 * be achieved by holding a vblank reference while the page flip is 367 * pending, acquired through drm_crtc_vblank_get() and released with 368 * drm_crtc_vblank_put(). Drivers are free to implement their own vblank 369 * counter and timestamp tracking though, e.g. if they have accurate 370 * timestamp registers in hardware. 371 * 372 * This callback is optional. 373 * 374 * NOTE: 375 * 376 * Very early versions of the KMS ABI mandated that the driver must 377 * block (but not reject) any rendering to the old framebuffer until the 378 * flip operation has completed and the old framebuffer is no longer 379 * visible. This requirement has been lifted, and userspace is instead 380 * expected to request delivery of an event and wait with recycling old 381 * buffers until such has been received. 382 * 383 * RETURNS: 384 * 385 * 0 on success or a negative error code on failure. Note that if a 386 * page flip operation is already pending the callback should return 387 * -EBUSY. Pageflips on a disabled CRTC (either by setting a NULL mode 388 * or just runtime disabled through DPMS respectively the new atomic 389 * "ACTIVE" state) should result in an -EINVAL error code. Note that 390 * drm_atomic_helper_page_flip() checks this already for atomic drivers. 391 */ 392 int (*page_flip)(struct drm_crtc *crtc, 393 struct drm_framebuffer *fb, 394 struct drm_pending_vblank_event *event, 395 uint32_t flags); 396 397 /** 398 * @page_flip_target: 399 * 400 * Same as @page_flip but with an additional parameter specifying the 401 * absolute target vertical blank period (as reported by 402 * drm_crtc_vblank_count()) when the flip should take effect. 403 * 404 * Note that the core code calls drm_crtc_vblank_get before this entry 405 * point, and will call drm_crtc_vblank_put if this entry point returns 406 * any non-0 error code. It's the driver's responsibility to call 407 * drm_crtc_vblank_put after this entry point returns 0, typically when 408 * the flip completes. 409 */ 410 int (*page_flip_target)(struct drm_crtc *crtc, 411 struct drm_framebuffer *fb, 412 struct drm_pending_vblank_event *event, 413 uint32_t flags, uint32_t target); 414 415 /** 416 * @set_property: 417 * 418 * This is the legacy entry point to update a property attached to the 419 * CRTC. 420 * 421 * Drivers implementing atomic modeset should use 422 * drm_atomic_helper_crtc_set_property() to implement this hook. 423 * 424 * This callback is optional if the driver does not support any legacy 425 * driver-private properties. 426 * 427 * RETURNS: 428 * 429 * 0 on success or a negative error code on failure. 430 */ 431 int (*set_property)(struct drm_crtc *crtc, 432 struct drm_property *property, uint64_t val); 433 434 /** 435 * @atomic_duplicate_state: 436 * 437 * Duplicate the current atomic state for this CRTC and return it. 438 * The core and helpers guarantee that any atomic state duplicated with 439 * this hook and still owned by the caller (i.e. not transferred to the 440 * driver by calling &drm_mode_config_funcs.atomic_commit) will be 441 * cleaned up by calling the @atomic_destroy_state hook in this 442 * structure. 443 * 444 * Atomic drivers which don't subclass &struct drm_crtc_state should use 445 * drm_atomic_helper_crtc_duplicate_state(). Drivers that subclass the 446 * state structure to extend it with driver-private state should use 447 * __drm_atomic_helper_crtc_duplicate_state() to make sure shared state is 448 * duplicated in a consistent fashion across drivers. 449 * 450 * It is an error to call this hook before &drm_crtc.state has been 451 * initialized correctly. 452 * 453 * NOTE: 454 * 455 * If the duplicate state references refcounted resources this hook must 456 * acquire a reference for each of them. The driver must release these 457 * references again in @atomic_destroy_state. 458 * 459 * RETURNS: 460 * 461 * Duplicated atomic state or NULL when the allocation failed. 462 */ 463 struct drm_crtc_state *(*atomic_duplicate_state)(struct drm_crtc *crtc); 464 465 /** 466 * @atomic_destroy_state: 467 * 468 * Destroy a state duplicated with @atomic_duplicate_state and release 469 * or unreference all resources it references 470 */ 471 void (*atomic_destroy_state)(struct drm_crtc *crtc, 472 struct drm_crtc_state *state); 473 474 /** 475 * @atomic_set_property: 476 * 477 * Decode a driver-private property value and store the decoded value 478 * into the passed-in state structure. Since the atomic core decodes all 479 * standardized properties (even for extensions beyond the core set of 480 * properties which might not be implemented by all drivers) this 481 * requires drivers to subclass the state structure. 482 * 483 * Such driver-private properties should really only be implemented for 484 * truly hardware/vendor specific state. Instead it is preferred to 485 * standardize atomic extension and decode the properties used to expose 486 * such an extension in the core. 487 * 488 * Do not call this function directly, use 489 * drm_atomic_crtc_set_property() instead. 490 * 491 * This callback is optional if the driver does not support any 492 * driver-private atomic properties. 493 * 494 * NOTE: 495 * 496 * This function is called in the state assembly phase of atomic 497 * modesets, which can be aborted for any reason (including on 498 * userspace's request to just check whether a configuration would be 499 * possible). Drivers MUST NOT touch any persistent state (hardware or 500 * software) or data structures except the passed in @state parameter. 501 * 502 * Also since userspace controls in which order properties are set this 503 * function must not do any input validation (since the state update is 504 * incomplete and hence likely inconsistent). Instead any such input 505 * validation must be done in the various atomic_check callbacks. 506 * 507 * RETURNS: 508 * 509 * 0 if the property has been found, -EINVAL if the property isn't 510 * implemented by the driver (which should never happen, the core only 511 * asks for properties attached to this CRTC). No other validation is 512 * allowed by the driver. The core already checks that the property 513 * value is within the range (integer, valid enum value, ...) the driver 514 * set when registering the property. 515 */ 516 int (*atomic_set_property)(struct drm_crtc *crtc, 517 struct drm_crtc_state *state, 518 struct drm_property *property, 519 uint64_t val); 520 /** 521 * @atomic_get_property: 522 * 523 * Reads out the decoded driver-private property. This is used to 524 * implement the GETCRTC IOCTL. 525 * 526 * Do not call this function directly, use 527 * drm_atomic_crtc_get_property() instead. 528 * 529 * This callback is optional if the driver does not support any 530 * driver-private atomic properties. 531 * 532 * RETURNS: 533 * 534 * 0 on success, -EINVAL if the property isn't implemented by the 535 * driver (which should never happen, the core only asks for 536 * properties attached to this CRTC). 537 */ 538 int (*atomic_get_property)(struct drm_crtc *crtc, 539 const struct drm_crtc_state *state, 540 struct drm_property *property, 541 uint64_t *val); 542 543 /** 544 * @late_register: 545 * 546 * This optional hook can be used to register additional userspace 547 * interfaces attached to the crtc like debugfs interfaces. 548 * It is called late in the driver load sequence from drm_dev_register(). 549 * Everything added from this callback should be unregistered in 550 * the early_unregister callback. 551 * 552 * Returns: 553 * 554 * 0 on success, or a negative error code on failure. 555 */ 556 int (*late_register)(struct drm_crtc *crtc); 557 558 /** 559 * @early_unregister: 560 * 561 * This optional hook should be used to unregister the additional 562 * userspace interfaces attached to the crtc from 563 * @late_register. It is called from drm_dev_unregister(), 564 * early in the driver unload sequence to disable userspace access 565 * before data structures are torndown. 566 */ 567 void (*early_unregister)(struct drm_crtc *crtc); 568 569 /** 570 * @set_crc_source: 571 * 572 * Changes the source of CRC checksums of frames at the request of 573 * userspace, typically for testing purposes. The sources available are 574 * specific of each driver and a %NULL value indicates that CRC 575 * generation is to be switched off. 576 * 577 * When CRC generation is enabled, the driver should call 578 * drm_crtc_add_crc_entry() at each frame, providing any information 579 * that characterizes the frame contents in the crcN arguments, as 580 * provided from the configured source. Drivers must accept a "auto" 581 * source name that will select a default source for this CRTC. 582 * 583 * This callback is optional if the driver does not support any CRC 584 * generation functionality. 585 * 586 * RETURNS: 587 * 588 * 0 on success or a negative error code on failure. 589 */ 590 int (*set_crc_source)(struct drm_crtc *crtc, const char *source, 591 size_t *values_cnt); 592 593 /** 594 * @atomic_print_state: 595 * 596 * If driver subclasses &struct drm_crtc_state, it should implement 597 * this optional hook for printing additional driver specific state. 598 * 599 * Do not call this directly, use drm_atomic_crtc_print_state() 600 * instead. 601 */ 602 void (*atomic_print_state)(struct drm_printer *p, 603 const struct drm_crtc_state *state); 604 }; 605 606 /** 607 * struct drm_crtc - central CRTC control structure 608 * @dev: parent DRM device 609 * @port: OF node used by drm_of_find_possible_crtcs() 610 * @head: list management 611 * @name: human readable name, can be overwritten by the driver 612 * @mutex: per-CRTC locking 613 * @base: base KMS object for ID tracking etc. 614 * @primary: primary plane for this CRTC 615 * @cursor: cursor plane for this CRTC 616 * @cursor_x: current x position of the cursor, used for universal cursor planes 617 * @cursor_y: current y position of the cursor, used for universal cursor planes 618 * @enabled: is this CRTC enabled? 619 * @mode: current mode timings 620 * @hwmode: mode timings as programmed to hw regs 621 * @x: x position on screen 622 * @y: y position on screen 623 * @funcs: CRTC control functions 624 * @gamma_size: size of gamma ramp 625 * @gamma_store: gamma ramp values 626 * @helper_private: mid-layer private data 627 * @properties: property tracking for this CRTC 628 * 629 * Each CRTC may have one or more connectors associated with it. This structure 630 * allows the CRTC to be controlled. 631 */ 632 struct drm_crtc { 633 struct drm_device *dev; 634 struct device_node *port; 635 struct list_head head; 636 637 char *name; 638 639 /** 640 * @mutex: 641 * 642 * This provides a read lock for the overall crtc state (mode, dpms 643 * state, ...) and a write lock for everything which can be update 644 * without a full modeset (fb, cursor data, crtc properties ...). A full 645 * modeset also need to grab &drm_mode_config.connection_mutex. 646 */ 647 struct drm_modeset_lock mutex; 648 649 struct drm_mode_object base; 650 651 /* primary and cursor planes for CRTC */ 652 struct drm_plane *primary; 653 struct drm_plane *cursor; 654 655 /** 656 * @index: Position inside the mode_config.list, can be used as an array 657 * index. It is invariant over the lifetime of the CRTC. 658 */ 659 unsigned index; 660 661 /* position of cursor plane on crtc */ 662 int cursor_x; 663 int cursor_y; 664 665 bool enabled; 666 667 /* Requested mode from modesetting. */ 668 struct drm_display_mode mode; 669 670 /* Programmed mode in hw, after adjustments for encoders, 671 * crtc, panel scaling etc. Needed for timestamping etc. 672 */ 673 struct drm_display_mode hwmode; 674 675 int x, y; 676 const struct drm_crtc_funcs *funcs; 677 678 /* Legacy FB CRTC gamma size for reporting to userspace */ 679 uint32_t gamma_size; 680 uint16_t *gamma_store; 681 682 /* if you are using the helper */ 683 const struct drm_crtc_helper_funcs *helper_private; 684 685 struct drm_object_properties properties; 686 687 /** 688 * @state: 689 * 690 * Current atomic state for this CRTC. 691 */ 692 struct drm_crtc_state *state; 693 694 /** 695 * @commit_list: 696 * 697 * List of &drm_crtc_commit structures tracking pending commits. 698 * Protected by @commit_lock. This list doesn't hold its own full 699 * reference, but burrows it from the ongoing commit. Commit entries 700 * must be removed from this list once the commit is fully completed, 701 * but before it's correspoding &drm_atomic_state gets destroyed. 702 */ 703 struct list_head commit_list; 704 705 /** 706 * @commit_lock: 707 * 708 * Spinlock to protect @commit_list. 709 */ 710 spinlock_t commit_lock; 711 712 /** 713 * @acquire_ctx: 714 * 715 * Per-CRTC implicit acquire context used by atomic drivers for legacy 716 * IOCTLs, so that atomic drivers can get at the locking acquire 717 * context. 718 */ 719 struct drm_modeset_acquire_ctx *acquire_ctx; 720 721 #ifdef CONFIG_DEBUG_FS 722 /** 723 * @debugfs_entry: 724 * 725 * Debugfs directory for this CRTC. 726 */ 727 struct dentry *debugfs_entry; 728 729 /** 730 * @crc: 731 * 732 * Configuration settings of CRC capture. 733 */ 734 struct drm_crtc_crc crc; 735 #endif 736 737 /** 738 * @fence_context: 739 * 740 * timeline context used for fence operations. 741 */ 742 unsigned int fence_context; 743 744 /** 745 * @fence_lock: 746 * 747 * spinlock to protect the fences in the fence_context. 748 */ 749 750 spinlock_t fence_lock; 751 /** 752 * @fence_seqno: 753 * 754 * Seqno variable used as monotonic counter for the fences 755 * created on the CRTC's timeline. 756 */ 757 unsigned long fence_seqno; 758 759 /** 760 * @timeline_name: 761 * 762 * The name of the CRTC's fence timeline. 763 */ 764 char timeline_name[32]; 765 }; 766 767 /** 768 * struct drm_mode_set - new values for a CRTC config change 769 * @fb: framebuffer to use for new config 770 * @crtc: CRTC whose configuration we're about to change 771 * @mode: mode timings to use 772 * @x: position of this CRTC relative to @fb 773 * @y: position of this CRTC relative to @fb 774 * @connectors: array of connectors to drive with this CRTC if possible 775 * @num_connectors: size of @connectors array 776 * 777 * This represents a modeset configuration for the legacy SETCRTC ioctl and is 778 * also used internally. Atomic drivers instead use &drm_atomic_state. 779 */ 780 struct drm_mode_set { 781 struct drm_framebuffer *fb; 782 struct drm_crtc *crtc; 783 struct drm_display_mode *mode; 784 785 uint32_t x; 786 uint32_t y; 787 788 struct drm_connector **connectors; 789 size_t num_connectors; 790 }; 791 792 #define obj_to_crtc(x) container_of(x, struct drm_crtc, base) 793 794 __printf(6, 7) 795 int drm_crtc_init_with_planes(struct drm_device *dev, 796 struct drm_crtc *crtc, 797 struct drm_plane *primary, 798 struct drm_plane *cursor, 799 const struct drm_crtc_funcs *funcs, 800 const char *name, ...); 801 void drm_crtc_cleanup(struct drm_crtc *crtc); 802 803 /** 804 * drm_crtc_index - find the index of a registered CRTC 805 * @crtc: CRTC to find index for 806 * 807 * Given a registered CRTC, return the index of that CRTC within a DRM 808 * device's list of CRTCs. 809 */ 810 static inline unsigned int drm_crtc_index(const struct drm_crtc *crtc) 811 { 812 return crtc->index; 813 } 814 815 /** 816 * drm_crtc_mask - find the mask of a registered CRTC 817 * @crtc: CRTC to find mask for 818 * 819 * Given a registered CRTC, return the mask bit of that CRTC for an 820 * encoder's possible_crtcs field. 821 */ 822 static inline uint32_t drm_crtc_mask(const struct drm_crtc *crtc) 823 { 824 return 1 << drm_crtc_index(crtc); 825 } 826 827 int drm_crtc_force_disable(struct drm_crtc *crtc); 828 int drm_crtc_force_disable_all(struct drm_device *dev); 829 830 int drm_mode_set_config_internal(struct drm_mode_set *set); 831 struct drm_crtc *drm_crtc_from_index(struct drm_device *dev, int idx); 832 833 /** 834 * drm_crtc_find - look up a CRTC object from its ID 835 * @dev: DRM device 836 * @id: &drm_mode_object ID 837 * 838 * This can be used to look up a CRTC from its userspace ID. Only used by 839 * drivers for legacy IOCTLs and interface, nowadays extensions to the KMS 840 * userspace interface should be done using &drm_property. 841 */ 842 static inline struct drm_crtc *drm_crtc_find(struct drm_device *dev, 843 uint32_t id) 844 { 845 struct drm_mode_object *mo; 846 mo = drm_mode_object_find(dev, id, DRM_MODE_OBJECT_CRTC); 847 return mo ? obj_to_crtc(mo) : NULL; 848 } 849 850 /** 851 * drm_for_each_crtc - iterate over all CRTCs 852 * @crtc: a &struct drm_crtc as the loop cursor 853 * @dev: the &struct drm_device 854 * 855 * Iterate over all CRTCs of @dev. 856 */ 857 #define drm_for_each_crtc(crtc, dev) \ 858 list_for_each_entry(crtc, &(dev)->mode_config.crtc_list, head) 859 860 #endif /* __DRM_CRTC_H__ */ 861