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