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