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/idr.h> 32 #include <linux/fb.h> 33 #include <linux/hdmi.h> 34 #include <linux/kref.h> 35 #include <linux/mutex.h> 36 #include <linux/workqueue.h> 37 #include <drm/drm_mode.h> 38 #include <drm/drm_fourcc.h> 39 40 struct drm_device; 41 struct drm_mode_set; 42 struct drm_framebuffer; 43 struct drm_object_properties; 44 struct drm_file; 45 struct drm_clip_rect; 46 47 #define DRM_MODE_OBJECT_CRTC 0xcccccccc 48 #define DRM_MODE_OBJECT_CONNECTOR 0xc0c0c0c0 49 #define DRM_MODE_OBJECT_ENCODER 0xe0e0e0e0 50 #define DRM_MODE_OBJECT_MODE 0xdededede 51 #define DRM_MODE_OBJECT_PROPERTY 0xb0b0b0b0 52 #define DRM_MODE_OBJECT_FB 0xfbfbfbfb 53 #define DRM_MODE_OBJECT_BLOB 0xbbbbbbbb 54 #define DRM_MODE_OBJECT_PLANE 0xeeeeeeee 55 #define DRM_MODE_OBJECT_BRIDGE 0xbdbdbdbd 56 57 struct drm_mode_object { 58 uint32_t id; 59 uint32_t type; 60 struct drm_object_properties *properties; 61 }; 62 63 #define DRM_OBJECT_MAX_PROPERTY 24 64 struct drm_object_properties { 65 int count; 66 uint32_t ids[DRM_OBJECT_MAX_PROPERTY]; 67 uint64_t values[DRM_OBJECT_MAX_PROPERTY]; 68 }; 69 70 enum drm_connector_force { 71 DRM_FORCE_UNSPECIFIED, 72 DRM_FORCE_OFF, 73 DRM_FORCE_ON, /* force on analog part normally */ 74 DRM_FORCE_ON_DIGITAL, /* for DVI-I use digital connector */ 75 }; 76 77 #include <drm/drm_modes.h> 78 79 enum drm_connector_status { 80 connector_status_connected = 1, 81 connector_status_disconnected = 2, 82 connector_status_unknown = 3, 83 }; 84 85 enum subpixel_order { 86 SubPixelUnknown = 0, 87 SubPixelHorizontalRGB, 88 SubPixelHorizontalBGR, 89 SubPixelVerticalRGB, 90 SubPixelVerticalBGR, 91 SubPixelNone, 92 }; 93 94 #define DRM_COLOR_FORMAT_RGB444 (1<<0) 95 #define DRM_COLOR_FORMAT_YCRCB444 (1<<1) 96 #define DRM_COLOR_FORMAT_YCRCB422 (1<<2) 97 /* 98 * Describes a given display (e.g. CRT or flat panel) and its limitations. 99 */ 100 struct drm_display_info { 101 char name[DRM_DISPLAY_INFO_LEN]; 102 103 /* Physical size */ 104 unsigned int width_mm; 105 unsigned int height_mm; 106 107 /* Clock limits FIXME: storage format */ 108 unsigned int min_vfreq, max_vfreq; 109 unsigned int min_hfreq, max_hfreq; 110 unsigned int pixel_clock; 111 unsigned int bpc; 112 113 enum subpixel_order subpixel_order; 114 u32 color_formats; 115 116 u8 cea_rev; 117 }; 118 119 struct drm_framebuffer_funcs { 120 /* note: use drm_framebuffer_remove() */ 121 void (*destroy)(struct drm_framebuffer *framebuffer); 122 int (*create_handle)(struct drm_framebuffer *fb, 123 struct drm_file *file_priv, 124 unsigned int *handle); 125 /** 126 * Optinal callback for the dirty fb ioctl. 127 * 128 * Userspace can notify the driver via this callback 129 * that a area of the framebuffer has changed and should 130 * be flushed to the display hardware. 131 * 132 * See documentation in drm_mode.h for the struct 133 * drm_mode_fb_dirty_cmd for more information as all 134 * the semantics and arguments have a one to one mapping 135 * on this function. 136 */ 137 int (*dirty)(struct drm_framebuffer *framebuffer, 138 struct drm_file *file_priv, unsigned flags, 139 unsigned color, struct drm_clip_rect *clips, 140 unsigned num_clips); 141 }; 142 143 struct drm_framebuffer { 144 struct drm_device *dev; 145 /* 146 * Note that the fb is refcounted for the benefit of driver internals, 147 * for example some hw, disabling a CRTC/plane is asynchronous, and 148 * scanout does not actually complete until the next vblank. So some 149 * cleanup (like releasing the reference(s) on the backing GEM bo(s)) 150 * should be deferred. In cases like this, the driver would like to 151 * hold a ref to the fb even though it has already been removed from 152 * userspace perspective. 153 */ 154 struct kref refcount; 155 /* 156 * Place on the dev->mode_config.fb_list, access protected by 157 * dev->mode_config.fb_lock. 158 */ 159 struct list_head head; 160 struct drm_mode_object base; 161 const struct drm_framebuffer_funcs *funcs; 162 unsigned int pitches[4]; 163 unsigned int offsets[4]; 164 unsigned int width; 165 unsigned int height; 166 /* depth can be 15 or 16 */ 167 unsigned int depth; 168 int bits_per_pixel; 169 int flags; 170 uint32_t pixel_format; /* fourcc format */ 171 struct list_head filp_head; 172 /* if you are using the helper */ 173 void *helper_private; 174 }; 175 176 struct drm_property_blob { 177 struct drm_mode_object base; 178 struct list_head head; 179 unsigned int length; 180 unsigned char data[]; 181 }; 182 183 struct drm_property_enum { 184 uint64_t value; 185 struct list_head head; 186 char name[DRM_PROP_NAME_LEN]; 187 }; 188 189 struct drm_property { 190 struct list_head head; 191 struct drm_mode_object base; 192 uint32_t flags; 193 char name[DRM_PROP_NAME_LEN]; 194 uint32_t num_values; 195 uint64_t *values; 196 197 struct list_head enum_blob_list; 198 }; 199 200 struct drm_crtc; 201 struct drm_connector; 202 struct drm_encoder; 203 struct drm_pending_vblank_event; 204 struct drm_plane; 205 struct drm_bridge; 206 207 /** 208 * drm_crtc_funcs - control CRTCs for a given device 209 * @save: save CRTC state 210 * @restore: restore CRTC state 211 * @reset: reset CRTC after state has been invalidated (e.g. resume) 212 * @cursor_set: setup the cursor 213 * @cursor_move: move the cursor 214 * @gamma_set: specify color ramp for CRTC 215 * @destroy: deinit and free object 216 * @set_property: called when a property is changed 217 * @set_config: apply a new CRTC configuration 218 * @page_flip: initiate a page flip 219 * 220 * The drm_crtc_funcs structure is the central CRTC management structure 221 * in the DRM. Each CRTC controls one or more connectors (note that the name 222 * CRTC is simply historical, a CRTC may control LVDS, VGA, DVI, TV out, etc. 223 * connectors, not just CRTs). 224 * 225 * Each driver is responsible for filling out this structure at startup time, 226 * in addition to providing other modesetting features, like i2c and DDC 227 * bus accessors. 228 */ 229 struct drm_crtc_funcs { 230 /* Save CRTC state */ 231 void (*save)(struct drm_crtc *crtc); /* suspend? */ 232 /* Restore CRTC state */ 233 void (*restore)(struct drm_crtc *crtc); /* resume? */ 234 /* Reset CRTC state */ 235 void (*reset)(struct drm_crtc *crtc); 236 237 /* cursor controls */ 238 int (*cursor_set)(struct drm_crtc *crtc, struct drm_file *file_priv, 239 uint32_t handle, uint32_t width, uint32_t height); 240 int (*cursor_set2)(struct drm_crtc *crtc, struct drm_file *file_priv, 241 uint32_t handle, uint32_t width, uint32_t height, 242 int32_t hot_x, int32_t hot_y); 243 int (*cursor_move)(struct drm_crtc *crtc, int x, int y); 244 245 /* Set gamma on the CRTC */ 246 void (*gamma_set)(struct drm_crtc *crtc, u16 *r, u16 *g, u16 *b, 247 uint32_t start, uint32_t size); 248 /* Object destroy routine */ 249 void (*destroy)(struct drm_crtc *crtc); 250 251 int (*set_config)(struct drm_mode_set *set); 252 253 /* 254 * Flip to the given framebuffer. This implements the page 255 * flip ioctl described in drm_mode.h, specifically, the 256 * implementation must return immediately and block all 257 * rendering to the current fb until the flip has completed. 258 * If userspace set the event flag in the ioctl, the event 259 * argument will point to an event to send back when the flip 260 * completes, otherwise it will be NULL. 261 */ 262 int (*page_flip)(struct drm_crtc *crtc, 263 struct drm_framebuffer *fb, 264 struct drm_pending_vblank_event *event, 265 uint32_t flags); 266 267 int (*set_property)(struct drm_crtc *crtc, 268 struct drm_property *property, uint64_t val); 269 }; 270 271 /** 272 * drm_crtc - central CRTC control structure 273 * @dev: parent DRM device 274 * @head: list management 275 * @base: base KMS object for ID tracking etc. 276 * @primary: primary plane for this CRTC 277 * @cursor: cursor plane for this CRTC 278 * @enabled: is this CRTC enabled? 279 * @mode: current mode timings 280 * @hwmode: mode timings as programmed to hw regs 281 * @invert_dimensions: for purposes of error checking crtc vs fb sizes, 282 * invert the width/height of the crtc. This is used if the driver 283 * is performing 90 or 270 degree rotated scanout 284 * @x: x position on screen 285 * @y: y position on screen 286 * @funcs: CRTC control functions 287 * @gamma_size: size of gamma ramp 288 * @gamma_store: gamma ramp values 289 * @framedur_ns: precise frame timing 290 * @framedur_ns: precise line timing 291 * @pixeldur_ns: precise pixel timing 292 * @helper_private: mid-layer private data 293 * @properties: property tracking for this CRTC 294 * 295 * Each CRTC may have one or more connectors associated with it. This structure 296 * allows the CRTC to be controlled. 297 */ 298 struct drm_crtc { 299 struct drm_device *dev; 300 struct list_head head; 301 302 /** 303 * crtc mutex 304 * 305 * This provides a read lock for the overall crtc state (mode, dpms 306 * state, ...) and a write lock for everything which can be update 307 * without a full modeset (fb, cursor data, ...) 308 */ 309 struct mutex mutex; 310 311 struct drm_mode_object base; 312 313 /* primary and cursor planes for CRTC */ 314 struct drm_plane *primary; 315 struct drm_plane *cursor; 316 317 /* Temporary tracking of the old fb while a modeset is ongoing. Used 318 * by drm_mode_set_config_internal to implement correct refcounting. */ 319 struct drm_framebuffer *old_fb; 320 321 bool enabled; 322 323 /* Requested mode from modesetting. */ 324 struct drm_display_mode mode; 325 326 /* Programmed mode in hw, after adjustments for encoders, 327 * crtc, panel scaling etc. Needed for timestamping etc. 328 */ 329 struct drm_display_mode hwmode; 330 331 bool invert_dimensions; 332 333 int x, y; 334 const struct drm_crtc_funcs *funcs; 335 336 /* CRTC gamma size for reporting to userspace */ 337 uint32_t gamma_size; 338 uint16_t *gamma_store; 339 340 /* Constants needed for precise vblank and swap timestamping. */ 341 int framedur_ns, linedur_ns, pixeldur_ns; 342 343 /* if you are using the helper */ 344 void *helper_private; 345 346 struct drm_object_properties properties; 347 }; 348 349 350 /** 351 * drm_connector_funcs - control connectors on a given device 352 * @dpms: set power state (see drm_crtc_funcs above) 353 * @save: save connector state 354 * @restore: restore connector state 355 * @reset: reset connector after state has been invalidated (e.g. resume) 356 * @detect: is this connector active? 357 * @fill_modes: fill mode list for this connector 358 * @set_property: property for this connector may need an update 359 * @destroy: make object go away 360 * @force: notify the driver that the connector is forced on 361 * 362 * Each CRTC may have one or more connectors attached to it. The functions 363 * below allow the core DRM code to control connectors, enumerate available modes, 364 * etc. 365 */ 366 struct drm_connector_funcs { 367 void (*dpms)(struct drm_connector *connector, int mode); 368 void (*save)(struct drm_connector *connector); 369 void (*restore)(struct drm_connector *connector); 370 void (*reset)(struct drm_connector *connector); 371 372 /* Check to see if anything is attached to the connector. 373 * @force is set to false whilst polling, true when checking the 374 * connector due to user request. @force can be used by the driver 375 * to avoid expensive, destructive operations during automated 376 * probing. 377 */ 378 enum drm_connector_status (*detect)(struct drm_connector *connector, 379 bool force); 380 int (*fill_modes)(struct drm_connector *connector, uint32_t max_width, uint32_t max_height); 381 int (*set_property)(struct drm_connector *connector, struct drm_property *property, 382 uint64_t val); 383 void (*destroy)(struct drm_connector *connector); 384 void (*force)(struct drm_connector *connector); 385 }; 386 387 /** 388 * drm_encoder_funcs - encoder controls 389 * @reset: reset state (e.g. at init or resume time) 390 * @destroy: cleanup and free associated data 391 * 392 * Encoders sit between CRTCs and connectors. 393 */ 394 struct drm_encoder_funcs { 395 void (*reset)(struct drm_encoder *encoder); 396 void (*destroy)(struct drm_encoder *encoder); 397 }; 398 399 #define DRM_CONNECTOR_MAX_ENCODER 3 400 401 /** 402 * drm_encoder - central DRM encoder structure 403 * @dev: parent DRM device 404 * @head: list management 405 * @base: base KMS object 406 * @encoder_type: one of the %DRM_MODE_ENCODER_<foo> types in drm_mode.h 407 * @possible_crtcs: bitmask of potential CRTC bindings 408 * @possible_clones: bitmask of potential sibling encoders for cloning 409 * @crtc: currently bound CRTC 410 * @bridge: bridge associated to the encoder 411 * @funcs: control functions 412 * @helper_private: mid-layer private data 413 * 414 * CRTCs drive pixels to encoders, which convert them into signals 415 * appropriate for a given connector or set of connectors. 416 */ 417 struct drm_encoder { 418 struct drm_device *dev; 419 struct list_head head; 420 421 struct drm_mode_object base; 422 int encoder_type; 423 uint32_t possible_crtcs; 424 uint32_t possible_clones; 425 426 struct drm_crtc *crtc; 427 struct drm_bridge *bridge; 428 const struct drm_encoder_funcs *funcs; 429 void *helper_private; 430 }; 431 432 /* should we poll this connector for connects and disconnects */ 433 /* hot plug detectable */ 434 #define DRM_CONNECTOR_POLL_HPD (1 << 0) 435 /* poll for connections */ 436 #define DRM_CONNECTOR_POLL_CONNECT (1 << 1) 437 /* can cleanly poll for disconnections without flickering the screen */ 438 /* DACs should rarely do this without a lot of testing */ 439 #define DRM_CONNECTOR_POLL_DISCONNECT (1 << 2) 440 441 #define MAX_ELD_BYTES 128 442 443 /** 444 * drm_connector - central DRM connector control structure 445 * @dev: parent DRM device 446 * @kdev: kernel device for sysfs attributes 447 * @attr: sysfs attributes 448 * @head: list management 449 * @base: base KMS object 450 * @connector_type: one of the %DRM_MODE_CONNECTOR_<foo> types from drm_mode.h 451 * @connector_type_id: index into connector type enum 452 * @interlace_allowed: can this connector handle interlaced modes? 453 * @doublescan_allowed: can this connector handle doublescan? 454 * @modes: modes available on this connector (from fill_modes() + user) 455 * @status: one of the drm_connector_status enums (connected, not, or unknown) 456 * @probed_modes: list of modes derived directly from the display 457 * @display_info: information about attached display (e.g. from EDID) 458 * @funcs: connector control functions 459 * @edid_blob_ptr: DRM property containing EDID if present 460 * @properties: property tracking for this connector 461 * @polled: a %DRM_CONNECTOR_POLL_<foo> value for core driven polling 462 * @dpms: current dpms state 463 * @helper_private: mid-layer private data 464 * @force: a %DRM_FORCE_<foo> state for forced mode sets 465 * @encoder_ids: valid encoders for this connector 466 * @encoder: encoder driving this connector, if any 467 * @physical_address: HDMI physical address 468 * @eld: EDID-like data, if present 469 * @dvi_dual: dual link DVI, if found 470 * @max_tmds_clock: max clock rate, if found 471 * @latency_present: AV delay info from ELD, if found 472 * @video_latency: video latency info from ELD, if found 473 * @audio_latency: audio latency info from ELD, if found 474 * @null_edid_counter: track sinks that give us all zeros for the EDID 475 * 476 * Each connector may be connected to one or more CRTCs, or may be clonable by 477 * another connector if they can share a CRTC. Each connector also has a specific 478 * position in the broader display (referred to as a 'screen' though it could 479 * span multiple monitors). 480 */ 481 struct drm_connector { 482 struct drm_device *dev; 483 struct device *kdev; 484 struct device_attribute *attr; 485 struct list_head head; 486 487 struct drm_mode_object base; 488 489 int connector_type; 490 int connector_type_id; 491 bool interlace_allowed; 492 bool doublescan_allowed; 493 bool stereo_allowed; 494 struct list_head modes; /* list of modes on this connector */ 495 496 enum drm_connector_status status; 497 498 /* these are modes added by probing with DDC or the BIOS */ 499 struct list_head probed_modes; 500 501 struct drm_display_info display_info; 502 const struct drm_connector_funcs *funcs; 503 504 struct drm_property_blob *edid_blob_ptr; 505 struct drm_object_properties properties; 506 507 uint8_t polled; /* DRM_CONNECTOR_POLL_* */ 508 509 /* requested DPMS state */ 510 int dpms; 511 512 void *helper_private; 513 514 /* forced on connector */ 515 enum drm_connector_force force; 516 uint32_t encoder_ids[DRM_CONNECTOR_MAX_ENCODER]; 517 struct drm_encoder *encoder; /* currently active encoder */ 518 519 /* EDID bits */ 520 uint16_t physical_address; 521 uint8_t eld[MAX_ELD_BYTES]; 522 bool dvi_dual; 523 int max_tmds_clock; /* in MHz */ 524 bool latency_present[2]; 525 int video_latency[2]; /* [0]: progressive, [1]: interlaced */ 526 int audio_latency[2]; 527 int null_edid_counter; /* needed to workaround some HW bugs where we get all 0s */ 528 unsigned bad_edid_counter; 529 }; 530 531 /** 532 * drm_plane_funcs - driver plane control functions 533 * @update_plane: update the plane configuration 534 * @disable_plane: shut down the plane 535 * @destroy: clean up plane resources 536 * @set_property: called when a property is changed 537 */ 538 struct drm_plane_funcs { 539 int (*update_plane)(struct drm_plane *plane, 540 struct drm_crtc *crtc, struct drm_framebuffer *fb, 541 int crtc_x, int crtc_y, 542 unsigned int crtc_w, unsigned int crtc_h, 543 uint32_t src_x, uint32_t src_y, 544 uint32_t src_w, uint32_t src_h); 545 int (*disable_plane)(struct drm_plane *plane); 546 void (*destroy)(struct drm_plane *plane); 547 548 int (*set_property)(struct drm_plane *plane, 549 struct drm_property *property, uint64_t val); 550 }; 551 552 enum drm_plane_type { 553 DRM_PLANE_TYPE_OVERLAY, 554 DRM_PLANE_TYPE_PRIMARY, 555 DRM_PLANE_TYPE_CURSOR, 556 }; 557 558 /** 559 * drm_plane - central DRM plane control structure 560 * @dev: DRM device this plane belongs to 561 * @head: for list management 562 * @base: base mode object 563 * @possible_crtcs: pipes this plane can be bound to 564 * @format_types: array of formats supported by this plane 565 * @format_count: number of formats supported 566 * @crtc: currently bound CRTC 567 * @fb: currently bound fb 568 * @funcs: helper functions 569 * @properties: property tracking for this plane 570 * @type: type of plane (overlay, primary, cursor) 571 */ 572 struct drm_plane { 573 struct drm_device *dev; 574 struct list_head head; 575 576 struct drm_mode_object base; 577 578 uint32_t possible_crtcs; 579 uint32_t *format_types; 580 uint32_t format_count; 581 582 struct drm_crtc *crtc; 583 struct drm_framebuffer *fb; 584 585 const struct drm_plane_funcs *funcs; 586 587 struct drm_object_properties properties; 588 589 enum drm_plane_type type; 590 }; 591 592 /** 593 * drm_bridge_funcs - drm_bridge control functions 594 * @mode_fixup: Try to fixup (or reject entirely) proposed mode for this bridge 595 * @disable: Called right before encoder prepare, disables the bridge 596 * @post_disable: Called right after encoder prepare, for lockstepped disable 597 * @mode_set: Set this mode to the bridge 598 * @pre_enable: Called right before encoder commit, for lockstepped commit 599 * @enable: Called right after encoder commit, enables the bridge 600 * @destroy: make object go away 601 */ 602 struct drm_bridge_funcs { 603 bool (*mode_fixup)(struct drm_bridge *bridge, 604 const struct drm_display_mode *mode, 605 struct drm_display_mode *adjusted_mode); 606 void (*disable)(struct drm_bridge *bridge); 607 void (*post_disable)(struct drm_bridge *bridge); 608 void (*mode_set)(struct drm_bridge *bridge, 609 struct drm_display_mode *mode, 610 struct drm_display_mode *adjusted_mode); 611 void (*pre_enable)(struct drm_bridge *bridge); 612 void (*enable)(struct drm_bridge *bridge); 613 void (*destroy)(struct drm_bridge *bridge); 614 }; 615 616 /** 617 * drm_bridge - central DRM bridge control structure 618 * @dev: DRM device this bridge belongs to 619 * @head: list management 620 * @base: base mode object 621 * @funcs: control functions 622 * @driver_private: pointer to the bridge driver's internal context 623 */ 624 struct drm_bridge { 625 struct drm_device *dev; 626 struct list_head head; 627 628 struct drm_mode_object base; 629 630 const struct drm_bridge_funcs *funcs; 631 void *driver_private; 632 }; 633 634 /** 635 * drm_mode_set - new values for a CRTC config change 636 * @head: list management 637 * @fb: framebuffer to use for new config 638 * @crtc: CRTC whose configuration we're about to change 639 * @mode: mode timings to use 640 * @x: position of this CRTC relative to @fb 641 * @y: position of this CRTC relative to @fb 642 * @connectors: array of connectors to drive with this CRTC if possible 643 * @num_connectors: size of @connectors array 644 * 645 * Represents a single crtc the connectors that it drives with what mode 646 * and from which framebuffer it scans out from. 647 * 648 * This is used to set modes. 649 */ 650 struct drm_mode_set { 651 struct drm_framebuffer *fb; 652 struct drm_crtc *crtc; 653 struct drm_display_mode *mode; 654 655 uint32_t x; 656 uint32_t y; 657 658 struct drm_connector **connectors; 659 size_t num_connectors; 660 }; 661 662 /** 663 * struct drm_mode_config_funcs - basic driver provided mode setting functions 664 * @fb_create: create a new framebuffer object 665 * @output_poll_changed: function to handle output configuration changes 666 * 667 * Some global (i.e. not per-CRTC, connector, etc) mode setting functions that 668 * involve drivers. 669 */ 670 struct drm_mode_config_funcs { 671 struct drm_framebuffer *(*fb_create)(struct drm_device *dev, 672 struct drm_file *file_priv, 673 struct drm_mode_fb_cmd2 *mode_cmd); 674 void (*output_poll_changed)(struct drm_device *dev); 675 }; 676 677 /** 678 * drm_mode_group - group of mode setting resources for potential sub-grouping 679 * @num_crtcs: CRTC count 680 * @num_encoders: encoder count 681 * @num_connectors: connector count 682 * @id_list: list of KMS object IDs in this group 683 * 684 * Currently this simply tracks the global mode setting state. But in the 685 * future it could allow groups of objects to be set aside into independent 686 * control groups for use by different user level processes (e.g. two X servers 687 * running simultaneously on different heads, each with their own mode 688 * configuration and freedom of mode setting). 689 */ 690 struct drm_mode_group { 691 uint32_t num_crtcs; 692 uint32_t num_encoders; 693 uint32_t num_connectors; 694 uint32_t num_bridges; 695 696 /* list of object IDs for this group */ 697 uint32_t *id_list; 698 }; 699 700 /** 701 * drm_mode_config - Mode configuration control structure 702 * @mutex: mutex protecting KMS related lists and structures 703 * @idr_mutex: mutex for KMS ID allocation and management 704 * @crtc_idr: main KMS ID tracking object 705 * @num_fb: number of fbs available 706 * @fb_list: list of framebuffers available 707 * @num_connector: number of connectors on this device 708 * @connector_list: list of connector objects 709 * @num_bridge: number of bridges on this device 710 * @bridge_list: list of bridge objects 711 * @num_encoder: number of encoders on this device 712 * @encoder_list: list of encoder objects 713 * @num_crtc: number of CRTCs on this device 714 * @crtc_list: list of CRTC objects 715 * @min_width: minimum pixel width on this device 716 * @min_height: minimum pixel height on this device 717 * @max_width: maximum pixel width on this device 718 * @max_height: maximum pixel height on this device 719 * @funcs: core driver provided mode setting functions 720 * @fb_base: base address of the framebuffer 721 * @poll_enabled: track polling status for this device 722 * @output_poll_work: delayed work for polling in process context 723 * @*_property: core property tracking 724 * 725 * Core mode resource tracking structure. All CRTC, encoders, and connectors 726 * enumerated by the driver are added here, as are global properties. Some 727 * global restrictions are also here, e.g. dimension restrictions. 728 */ 729 struct drm_mode_config { 730 struct mutex mutex; /* protects configuration (mode lists etc.) */ 731 struct mutex idr_mutex; /* for IDR management */ 732 struct idr crtc_idr; /* use this idr for all IDs, fb, crtc, connector, modes - just makes life easier */ 733 /* this is limited to one for now */ 734 735 736 /** 737 * fb_lock - mutex to protect fb state 738 * 739 * Besides the global fb list his also protects the fbs list in the 740 * file_priv 741 */ 742 struct mutex fb_lock; 743 int num_fb; 744 struct list_head fb_list; 745 746 int num_connector; 747 struct list_head connector_list; 748 int num_bridge; 749 struct list_head bridge_list; 750 int num_encoder; 751 struct list_head encoder_list; 752 753 /* 754 * Track # of overlay planes separately from # of total planes. By 755 * default we only advertise overlay planes to userspace; if userspace 756 * sets the "universal plane" capability bit, we'll go ahead and 757 * expose all planes. 758 */ 759 int num_overlay_plane; 760 int num_total_plane; 761 struct list_head plane_list; 762 763 int num_crtc; 764 struct list_head crtc_list; 765 766 struct list_head property_list; 767 768 int min_width, min_height; 769 int max_width, max_height; 770 const struct drm_mode_config_funcs *funcs; 771 resource_size_t fb_base; 772 773 /* output poll support */ 774 bool poll_enabled; 775 bool poll_running; 776 struct delayed_work output_poll_work; 777 778 /* pointers to standard properties */ 779 struct list_head property_blob_list; 780 struct drm_property *edid_property; 781 struct drm_property *dpms_property; 782 struct drm_property *plane_type_property; 783 784 /* DVI-I properties */ 785 struct drm_property *dvi_i_subconnector_property; 786 struct drm_property *dvi_i_select_subconnector_property; 787 788 /* TV properties */ 789 struct drm_property *tv_subconnector_property; 790 struct drm_property *tv_select_subconnector_property; 791 struct drm_property *tv_mode_property; 792 struct drm_property *tv_left_margin_property; 793 struct drm_property *tv_right_margin_property; 794 struct drm_property *tv_top_margin_property; 795 struct drm_property *tv_bottom_margin_property; 796 struct drm_property *tv_brightness_property; 797 struct drm_property *tv_contrast_property; 798 struct drm_property *tv_flicker_reduction_property; 799 struct drm_property *tv_overscan_property; 800 struct drm_property *tv_saturation_property; 801 struct drm_property *tv_hue_property; 802 803 /* Optional properties */ 804 struct drm_property *scaling_mode_property; 805 struct drm_property *dirty_info_property; 806 807 /* dumb ioctl parameters */ 808 uint32_t preferred_depth, prefer_shadow; 809 810 /* whether async page flip is supported or not */ 811 bool async_page_flip; 812 813 /* cursor size */ 814 uint32_t cursor_width, cursor_height; 815 }; 816 817 #define obj_to_crtc(x) container_of(x, struct drm_crtc, base) 818 #define obj_to_connector(x) container_of(x, struct drm_connector, base) 819 #define obj_to_encoder(x) container_of(x, struct drm_encoder, base) 820 #define obj_to_mode(x) container_of(x, struct drm_display_mode, base) 821 #define obj_to_fb(x) container_of(x, struct drm_framebuffer, base) 822 #define obj_to_property(x) container_of(x, struct drm_property, base) 823 #define obj_to_blob(x) container_of(x, struct drm_property_blob, base) 824 #define obj_to_plane(x) container_of(x, struct drm_plane, base) 825 826 struct drm_prop_enum_list { 827 int type; 828 const char *name; 829 }; 830 831 extern void drm_modeset_lock_all(struct drm_device *dev); 832 extern void drm_modeset_unlock_all(struct drm_device *dev); 833 extern void drm_warn_on_modeset_not_all_locked(struct drm_device *dev); 834 835 extern int drm_crtc_init_with_planes(struct drm_device *dev, 836 struct drm_crtc *crtc, 837 struct drm_plane *primary, 838 void *cursor, 839 const struct drm_crtc_funcs *funcs); 840 extern int drm_crtc_init(struct drm_device *dev, 841 struct drm_crtc *crtc, 842 const struct drm_crtc_funcs *funcs); 843 extern void drm_crtc_cleanup(struct drm_crtc *crtc); 844 extern unsigned int drm_crtc_index(struct drm_crtc *crtc); 845 846 /** 847 * drm_crtc_mask - find the mask of a registered CRTC 848 * @crtc: CRTC to find mask for 849 * 850 * Given a registered CRTC, return the mask bit of that CRTC for an 851 * encoder's possible_crtcs field. 852 */ 853 static inline uint32_t drm_crtc_mask(struct drm_crtc *crtc) 854 { 855 return 1 << drm_crtc_index(crtc); 856 } 857 858 extern void drm_connector_ida_init(void); 859 extern void drm_connector_ida_destroy(void); 860 extern int drm_connector_init(struct drm_device *dev, 861 struct drm_connector *connector, 862 const struct drm_connector_funcs *funcs, 863 int connector_type); 864 865 extern void drm_connector_cleanup(struct drm_connector *connector); 866 /* helper to unplug all connectors from sysfs for device */ 867 extern void drm_connector_unplug_all(struct drm_device *dev); 868 869 extern int drm_bridge_init(struct drm_device *dev, struct drm_bridge *bridge, 870 const struct drm_bridge_funcs *funcs); 871 extern void drm_bridge_cleanup(struct drm_bridge *bridge); 872 873 extern int drm_encoder_init(struct drm_device *dev, 874 struct drm_encoder *encoder, 875 const struct drm_encoder_funcs *funcs, 876 int encoder_type); 877 878 /** 879 * drm_encoder_crtc_ok - can a given crtc drive a given encoder? 880 * @encoder: encoder to test 881 * @crtc: crtc to test 882 * 883 * Return false if @encoder can't be driven by @crtc, true otherwise. 884 */ 885 static inline bool drm_encoder_crtc_ok(struct drm_encoder *encoder, 886 struct drm_crtc *crtc) 887 { 888 return !!(encoder->possible_crtcs & drm_crtc_mask(crtc)); 889 } 890 891 extern int drm_universal_plane_init(struct drm_device *dev, 892 struct drm_plane *plane, 893 unsigned long possible_crtcs, 894 const struct drm_plane_funcs *funcs, 895 const uint32_t *formats, 896 uint32_t format_count, 897 enum drm_plane_type type); 898 extern int drm_plane_init(struct drm_device *dev, 899 struct drm_plane *plane, 900 unsigned long possible_crtcs, 901 const struct drm_plane_funcs *funcs, 902 const uint32_t *formats, uint32_t format_count, 903 bool is_primary); 904 extern void drm_plane_cleanup(struct drm_plane *plane); 905 extern void drm_plane_force_disable(struct drm_plane *plane); 906 extern int drm_crtc_check_viewport(const struct drm_crtc *crtc, 907 int x, int y, 908 const struct drm_display_mode *mode, 909 const struct drm_framebuffer *fb); 910 911 extern void drm_encoder_cleanup(struct drm_encoder *encoder); 912 913 extern const char *drm_get_connector_name(const struct drm_connector *connector); 914 extern const char *drm_get_connector_status_name(enum drm_connector_status status); 915 extern const char *drm_get_subpixel_order_name(enum subpixel_order order); 916 extern const char *drm_get_dpms_name(int val); 917 extern const char *drm_get_dvi_i_subconnector_name(int val); 918 extern const char *drm_get_dvi_i_select_name(int val); 919 extern const char *drm_get_tv_subconnector_name(int val); 920 extern const char *drm_get_tv_select_name(int val); 921 extern void drm_fb_release(struct drm_file *file_priv); 922 extern int drm_mode_group_init_legacy_group(struct drm_device *dev, struct drm_mode_group *group); 923 extern bool drm_probe_ddc(struct i2c_adapter *adapter); 924 extern struct edid *drm_get_edid(struct drm_connector *connector, 925 struct i2c_adapter *adapter); 926 extern struct edid *drm_edid_duplicate(const struct edid *edid); 927 extern int drm_add_edid_modes(struct drm_connector *connector, struct edid *edid); 928 extern void drm_mode_config_init(struct drm_device *dev); 929 extern void drm_mode_config_reset(struct drm_device *dev); 930 extern void drm_mode_config_cleanup(struct drm_device *dev); 931 932 extern int drm_mode_connector_update_edid_property(struct drm_connector *connector, 933 struct edid *edid); 934 extern int drm_object_property_set_value(struct drm_mode_object *obj, 935 struct drm_property *property, 936 uint64_t val); 937 extern int drm_object_property_get_value(struct drm_mode_object *obj, 938 struct drm_property *property, 939 uint64_t *value); 940 extern int drm_framebuffer_init(struct drm_device *dev, 941 struct drm_framebuffer *fb, 942 const struct drm_framebuffer_funcs *funcs); 943 extern struct drm_framebuffer *drm_framebuffer_lookup(struct drm_device *dev, 944 uint32_t id); 945 extern void drm_framebuffer_unreference(struct drm_framebuffer *fb); 946 extern void drm_framebuffer_reference(struct drm_framebuffer *fb); 947 extern void drm_framebuffer_remove(struct drm_framebuffer *fb); 948 extern void drm_framebuffer_cleanup(struct drm_framebuffer *fb); 949 extern void drm_framebuffer_unregister_private(struct drm_framebuffer *fb); 950 951 extern void drm_object_attach_property(struct drm_mode_object *obj, 952 struct drm_property *property, 953 uint64_t init_val); 954 extern struct drm_property *drm_property_create(struct drm_device *dev, int flags, 955 const char *name, int num_values); 956 extern struct drm_property *drm_property_create_enum(struct drm_device *dev, int flags, 957 const char *name, 958 const struct drm_prop_enum_list *props, 959 int num_values); 960 struct drm_property *drm_property_create_bitmask(struct drm_device *dev, 961 int flags, const char *name, 962 const struct drm_prop_enum_list *props, 963 int num_values); 964 struct drm_property *drm_property_create_range(struct drm_device *dev, int flags, 965 const char *name, 966 uint64_t min, uint64_t max); 967 extern void drm_property_destroy(struct drm_device *dev, struct drm_property *property); 968 extern int drm_property_add_enum(struct drm_property *property, int index, 969 uint64_t value, const char *name); 970 extern int drm_mode_create_dvi_i_properties(struct drm_device *dev); 971 extern int drm_mode_create_tv_properties(struct drm_device *dev, int num_formats, 972 const char *formats[]); 973 extern int drm_mode_create_scaling_mode_property(struct drm_device *dev); 974 extern int drm_mode_create_dirty_info_property(struct drm_device *dev); 975 extern const char *drm_get_encoder_name(const struct drm_encoder *encoder); 976 977 extern int drm_mode_connector_attach_encoder(struct drm_connector *connector, 978 struct drm_encoder *encoder); 979 extern int drm_mode_crtc_set_gamma_size(struct drm_crtc *crtc, 980 int gamma_size); 981 extern struct drm_mode_object *drm_mode_object_find(struct drm_device *dev, 982 uint32_t id, uint32_t type); 983 /* IOCTLs */ 984 extern int drm_mode_getresources(struct drm_device *dev, 985 void *data, struct drm_file *file_priv); 986 extern int drm_mode_getplane_res(struct drm_device *dev, void *data, 987 struct drm_file *file_priv); 988 extern int drm_mode_getcrtc(struct drm_device *dev, 989 void *data, struct drm_file *file_priv); 990 extern int drm_mode_getconnector(struct drm_device *dev, 991 void *data, struct drm_file *file_priv); 992 extern int drm_mode_set_config_internal(struct drm_mode_set *set); 993 extern int drm_mode_setcrtc(struct drm_device *dev, 994 void *data, struct drm_file *file_priv); 995 extern int drm_mode_getplane(struct drm_device *dev, 996 void *data, struct drm_file *file_priv); 997 extern int drm_mode_setplane(struct drm_device *dev, 998 void *data, struct drm_file *file_priv); 999 extern int drm_mode_cursor_ioctl(struct drm_device *dev, 1000 void *data, struct drm_file *file_priv); 1001 extern int drm_mode_cursor2_ioctl(struct drm_device *dev, 1002 void *data, struct drm_file *file_priv); 1003 extern int drm_mode_addfb(struct drm_device *dev, 1004 void *data, struct drm_file *file_priv); 1005 extern int drm_mode_addfb2(struct drm_device *dev, 1006 void *data, struct drm_file *file_priv); 1007 extern uint32_t drm_mode_legacy_fb_format(uint32_t bpp, uint32_t depth); 1008 extern int drm_mode_rmfb(struct drm_device *dev, 1009 void *data, struct drm_file *file_priv); 1010 extern int drm_mode_getfb(struct drm_device *dev, 1011 void *data, struct drm_file *file_priv); 1012 extern int drm_mode_dirtyfb_ioctl(struct drm_device *dev, 1013 void *data, struct drm_file *file_priv); 1014 1015 extern int drm_mode_getproperty_ioctl(struct drm_device *dev, 1016 void *data, struct drm_file *file_priv); 1017 extern int drm_mode_getblob_ioctl(struct drm_device *dev, 1018 void *data, struct drm_file *file_priv); 1019 extern int drm_mode_connector_property_set_ioctl(struct drm_device *dev, 1020 void *data, struct drm_file *file_priv); 1021 extern int drm_mode_getencoder(struct drm_device *dev, 1022 void *data, struct drm_file *file_priv); 1023 extern int drm_mode_gamma_get_ioctl(struct drm_device *dev, 1024 void *data, struct drm_file *file_priv); 1025 extern int drm_mode_gamma_set_ioctl(struct drm_device *dev, 1026 void *data, struct drm_file *file_priv); 1027 extern u8 drm_match_cea_mode(const struct drm_display_mode *to_match); 1028 extern bool drm_detect_hdmi_monitor(struct edid *edid); 1029 extern bool drm_detect_monitor_audio(struct edid *edid); 1030 extern bool drm_rgb_quant_range_selectable(struct edid *edid); 1031 extern int drm_mode_page_flip_ioctl(struct drm_device *dev, 1032 void *data, struct drm_file *file_priv); 1033 extern int drm_add_modes_noedid(struct drm_connector *connector, 1034 int hdisplay, int vdisplay); 1035 extern void drm_set_preferred_mode(struct drm_connector *connector, 1036 int hpref, int vpref); 1037 1038 extern int drm_edid_header_is_valid(const u8 *raw_edid); 1039 extern bool drm_edid_block_valid(u8 *raw_edid, int block, bool print_bad_edid); 1040 extern bool drm_edid_is_valid(struct edid *edid); 1041 struct drm_display_mode *drm_mode_find_dmt(struct drm_device *dev, 1042 int hsize, int vsize, int fresh, 1043 bool rb); 1044 1045 extern int drm_mode_create_dumb_ioctl(struct drm_device *dev, 1046 void *data, struct drm_file *file_priv); 1047 extern int drm_mode_mmap_dumb_ioctl(struct drm_device *dev, 1048 void *data, struct drm_file *file_priv); 1049 extern int drm_mode_destroy_dumb_ioctl(struct drm_device *dev, 1050 void *data, struct drm_file *file_priv); 1051 extern int drm_mode_obj_get_properties_ioctl(struct drm_device *dev, void *data, 1052 struct drm_file *file_priv); 1053 extern int drm_mode_obj_set_property_ioctl(struct drm_device *dev, void *data, 1054 struct drm_file *file_priv); 1055 1056 extern void drm_fb_get_bpp_depth(uint32_t format, unsigned int *depth, 1057 int *bpp); 1058 extern int drm_format_num_planes(uint32_t format); 1059 extern int drm_format_plane_cpp(uint32_t format, int plane); 1060 extern int drm_format_horz_chroma_subsampling(uint32_t format); 1061 extern int drm_format_vert_chroma_subsampling(uint32_t format); 1062 extern const char *drm_get_format_name(uint32_t format); 1063 1064 /* Helpers */ 1065 static inline struct drm_crtc *drm_crtc_find(struct drm_device *dev, 1066 uint32_t id) 1067 { 1068 struct drm_mode_object *mo; 1069 mo = drm_mode_object_find(dev, id, DRM_MODE_OBJECT_CRTC); 1070 return mo ? obj_to_crtc(mo) : NULL; 1071 } 1072 1073 static inline struct drm_encoder *drm_encoder_find(struct drm_device *dev, 1074 uint32_t id) 1075 { 1076 struct drm_mode_object *mo; 1077 mo = drm_mode_object_find(dev, id, DRM_MODE_OBJECT_ENCODER); 1078 return mo ? obj_to_encoder(mo) : NULL; 1079 } 1080 1081 /* Plane list iterator for legacy (overlay only) planes. */ 1082 #define drm_for_each_legacy_plane(plane, planelist) \ 1083 list_for_each_entry(plane, planelist, head) \ 1084 if (plane->type == DRM_PLANE_TYPE_OVERLAY) 1085 1086 #endif /* __DRM_CRTC_H__ */ 1087