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