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
  33#include <linux/fb.h>
  34
  35struct drm_device;
  36struct drm_mode_set;
  37struct drm_framebuffer;
  38
  39
  40#define DRM_MODE_OBJECT_CRTC 0xcccccccc
  41#define DRM_MODE_OBJECT_CONNECTOR 0xc0c0c0c0
  42#define DRM_MODE_OBJECT_ENCODER 0xe0e0e0e0
  43#define DRM_MODE_OBJECT_MODE 0xdededede
  44#define DRM_MODE_OBJECT_PROPERTY 0xb0b0b0b0
  45#define DRM_MODE_OBJECT_FB 0xfbfbfbfb
  46#define DRM_MODE_OBJECT_BLOB 0xbbbbbbbb
  47
  48struct drm_mode_object {
  49        uint32_t id;
  50        uint32_t type;
  51};
  52
  53/*
  54 * Note on terminology:  here, for brevity and convenience, we refer to connector
  55 * control chips as 'CRTCs'.  They can control any type of connector, VGA, LVDS,
  56 * DVI, etc.  And 'screen' refers to the whole of the visible display, which
  57 * may span multiple monitors (and therefore multiple CRTC and connector
  58 * structures).
  59 */
  60
  61enum drm_mode_status {
  62    MODE_OK     = 0,    /* Mode OK */
  63    MODE_HSYNC,         /* hsync out of range */
  64    MODE_VSYNC,         /* vsync out of range */
  65    MODE_H_ILLEGAL,     /* mode has illegal horizontal timings */
  66    MODE_V_ILLEGAL,     /* mode has illegal horizontal timings */
  67    MODE_BAD_WIDTH,     /* requires an unsupported linepitch */
  68    MODE_NOMODE,        /* no mode with a maching name */
  69    MODE_NO_INTERLACE,  /* interlaced mode not supported */
  70    MODE_NO_DBLESCAN,   /* doublescan mode not supported */
  71    MODE_NO_VSCAN,      /* multiscan mode not supported */
  72    MODE_MEM,           /* insufficient video memory */
  73    MODE_VIRTUAL_X,     /* mode width too large for specified virtual size */
  74    MODE_VIRTUAL_Y,     /* mode height too large for specified virtual size */
  75    MODE_MEM_VIRT,      /* insufficient video memory given virtual size */
  76    MODE_NOCLOCK,       /* no fixed clock available */
  77    MODE_CLOCK_HIGH,    /* clock required is too high */
  78    MODE_CLOCK_LOW,     /* clock required is too low */
  79    MODE_CLOCK_RANGE,   /* clock/mode isn't in a ClockRange */
  80    MODE_BAD_HVALUE,    /* horizontal timing was out of range */
  81    MODE_BAD_VVALUE,    /* vertical timing was out of range */
  82    MODE_BAD_VSCAN,     /* VScan value out of range */
  83    MODE_HSYNC_NARROW,  /* horizontal sync too narrow */
  84    MODE_HSYNC_WIDE,    /* horizontal sync too wide */
  85    MODE_HBLANK_NARROW, /* horizontal blanking too narrow */
  86    MODE_HBLANK_WIDE,   /* horizontal blanking too wide */
  87    MODE_VSYNC_NARROW,  /* vertical sync too narrow */
  88    MODE_VSYNC_WIDE,    /* vertical sync too wide */
  89    MODE_VBLANK_NARROW, /* vertical blanking too narrow */
  90    MODE_VBLANK_WIDE,   /* vertical blanking too wide */
  91    MODE_PANEL,         /* exceeds panel dimensions */
  92    MODE_INTERLACE_WIDTH, /* width too large for interlaced mode */
  93    MODE_ONE_WIDTH,     /* only one width is supported */
  94    MODE_ONE_HEIGHT,    /* only one height is supported */
  95    MODE_ONE_SIZE,      /* only one resolution is supported */
  96    MODE_NO_REDUCED,    /* monitor doesn't accept reduced blanking */
  97    MODE_UNVERIFIED = -3, /* mode needs to reverified */
  98    MODE_BAD = -2,      /* unspecified reason */
  99    MODE_ERROR  = -1    /* error condition */
 100};
 101
 102#define DRM_MODE_TYPE_CLOCK_CRTC_C (DRM_MODE_TYPE_CLOCK_C | \
 103                                    DRM_MODE_TYPE_CRTC_C)
 104
 105#define DRM_MODE(nm, t, c, hd, hss, hse, ht, hsk, vd, vss, vse, vt, vs, f) \
 106        .name = nm, .status = 0, .type = (t), .clock = (c), \
 107        .hdisplay = (hd), .hsync_start = (hss), .hsync_end = (hse), \
 108        .htotal = (ht), .hskew = (hsk), .vdisplay = (vd), \
 109        .vsync_start = (vss), .vsync_end = (vse), .vtotal = (vt), \
 110        .vscan = (vs), .flags = (f), .vrefresh = 0
 111
 112#define CRTC_INTERLACE_HALVE_V 0x1 /* halve V values for interlacing */
 113
 114struct drm_display_mode {
 115        /* Header */
 116        struct list_head head;
 117        struct drm_mode_object base;
 118
 119        char name[DRM_DISPLAY_MODE_LEN];
 120
 121        int connector_count;
 122        enum drm_mode_status status;
 123        int type;
 124
 125        /* Proposed mode values */
 126        int clock;
 127        int hdisplay;
 128        int hsync_start;
 129        int hsync_end;
 130        int htotal;
 131        int hskew;
 132        int vdisplay;
 133        int vsync_start;
 134        int vsync_end;
 135        int vtotal;
 136        int vscan;
 137        unsigned int flags;
 138
 139        /* Addressable image size (may be 0 for projectors, etc.) */
 140        int width_mm;
 141        int height_mm;
 142
 143        /* Actual mode we give to hw */
 144        int clock_index;
 145        int synth_clock;
 146        int crtc_hdisplay;
 147        int crtc_hblank_start;
 148        int crtc_hblank_end;
 149        int crtc_hsync_start;
 150        int crtc_hsync_end;
 151        int crtc_htotal;
 152        int crtc_hskew;
 153        int crtc_vdisplay;
 154        int crtc_vblank_start;
 155        int crtc_vblank_end;
 156        int crtc_vsync_start;
 157        int crtc_vsync_end;
 158        int crtc_vtotal;
 159        int crtc_hadjusted;
 160        int crtc_vadjusted;
 161
 162        /* Driver private mode info */
 163        int private_size;
 164        int *private;
 165        int private_flags;
 166
 167        int vrefresh;
 168        float hsync;
 169};
 170
 171enum drm_connector_status {
 172        connector_status_connected = 1,
 173        connector_status_disconnected = 2,
 174        connector_status_unknown = 3,
 175};
 176
 177enum subpixel_order {
 178        SubPixelUnknown = 0,
 179        SubPixelHorizontalRGB,
 180        SubPixelHorizontalBGR,
 181        SubPixelVerticalRGB,
 182        SubPixelVerticalBGR,
 183        SubPixelNone,
 184};
 185
 186
 187/*
 188 * Describes a given display (e.g. CRT or flat panel) and its limitations.
 189 */
 190struct drm_display_info {
 191        char name[DRM_DISPLAY_INFO_LEN];
 192        /* Input info */
 193        bool serration_vsync;
 194        bool sync_on_green;
 195        bool composite_sync;
 196        bool separate_syncs;
 197        bool blank_to_black;
 198        unsigned char video_level;
 199        bool digital;
 200        /* Physical size */
 201        unsigned int width_mm;
 202        unsigned int height_mm;
 203
 204        /* Display parameters */
 205        unsigned char gamma; /* FIXME: storage format */
 206        bool gtf_supported;
 207        bool standard_color;
 208        enum {
 209                monochrome = 0,
 210                rgb,
 211                other,
 212                unknown,
 213        } display_type;
 214        bool active_off_supported;
 215        bool suspend_supported;
 216        bool standby_supported;
 217
 218        /* Color info FIXME: storage format */
 219        unsigned short redx, redy;
 220        unsigned short greenx, greeny;
 221        unsigned short bluex, bluey;
 222        unsigned short whitex, whitey;
 223
 224        /* Clock limits FIXME: storage format */
 225        unsigned int min_vfreq, max_vfreq;
 226        unsigned int min_hfreq, max_hfreq;
 227        unsigned int pixel_clock;
 228
 229        /* White point indices FIXME: storage format */
 230        unsigned int wpx1, wpy1;
 231        unsigned int wpgamma1;
 232        unsigned int wpx2, wpy2;
 233        unsigned int wpgamma2;
 234
 235        enum subpixel_order subpixel_order;
 236
 237        char *raw_edid; /* if any */
 238};
 239
 240struct drm_framebuffer_funcs {
 241        void (*destroy)(struct drm_framebuffer *framebuffer);
 242        int (*create_handle)(struct drm_framebuffer *fb,
 243                             struct drm_file *file_priv,
 244                             unsigned int *handle);
 245};
 246
 247struct drm_framebuffer {
 248        struct drm_device *dev;
 249        struct list_head head;
 250        struct drm_mode_object base;
 251        const struct drm_framebuffer_funcs *funcs;
 252        unsigned int pitch;
 253        unsigned int width;
 254        unsigned int height;
 255        /* depth can be 15 or 16 */
 256        unsigned int depth;
 257        int bits_per_pixel;
 258        int flags;
 259        void *fbdev;
 260        u32 pseudo_palette[17];
 261        struct list_head filp_head;
 262        /* if you are using the helper */
 263        void *helper_private;
 264};
 265
 266struct drm_property_blob {
 267        struct drm_mode_object base;
 268        struct list_head head;
 269        unsigned int length;
 270        void *data;
 271};
 272
 273struct drm_property_enum {
 274        uint64_t value;
 275        struct list_head head;
 276        char name[DRM_PROP_NAME_LEN];
 277};
 278
 279struct drm_property {
 280        struct list_head head;
 281        struct drm_mode_object base;
 282        uint32_t flags;
 283        char name[DRM_PROP_NAME_LEN];
 284        uint32_t num_values;
 285        uint64_t *values;
 286
 287        struct list_head enum_blob_list;
 288};
 289
 290struct drm_crtc;
 291struct drm_connector;
 292struct drm_encoder;
 293
 294/**
 295 * drm_crtc_funcs - control CRTCs for a given device
 296 * @dpms: control display power levels
 297 * @save: save CRTC state
 298 * @resore: restore CRTC state
 299 * @lock: lock the CRTC
 300 * @unlock: unlock the CRTC
 301 * @shadow_allocate: allocate shadow pixmap
 302 * @shadow_create: create shadow pixmap for rotation support
 303 * @shadow_destroy: free shadow pixmap
 304 * @mode_fixup: fixup proposed mode
 305 * @mode_set: set the desired mode on the CRTC
 306 * @gamma_set: specify color ramp for CRTC
 307 * @destroy: deinit and free object.
 308 *
 309 * The drm_crtc_funcs structure is the central CRTC management structure
 310 * in the DRM.  Each CRTC controls one or more connectors (note that the name
 311 * CRTC is simply historical, a CRTC may control LVDS, VGA, DVI, TV out, etc.
 312 * connectors, not just CRTs).
 313 *
 314 * Each driver is responsible for filling out this structure at startup time,
 315 * in addition to providing other modesetting features, like i2c and DDC
 316 * bus accessors.
 317 */
 318struct drm_crtc_funcs {
 319        /* Save CRTC state */
 320        void (*save)(struct drm_crtc *crtc); /* suspend? */
 321        /* Restore CRTC state */
 322        void (*restore)(struct drm_crtc *crtc); /* resume? */
 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 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/**
 339 * drm_crtc - central CRTC control structure
 340 * @enabled: is this CRTC enabled?
 341 * @x: x position on screen
 342 * @y: y position on screen
 343 * @desired_mode: new desired mode
 344 * @desired_x: desired x for desired_mode
 345 * @desired_y: desired y for desired_mode
 346 * @funcs: CRTC control functions
 347 *
 348 * Each CRTC may have one or more connectors associated with it.  This structure
 349 * allows the CRTC to be controlled.
 350 */
 351struct drm_crtc {
 352        struct drm_device *dev;
 353        struct list_head head;
 354
 355        struct drm_mode_object base;
 356
 357        /* framebuffer the connector is currently bound to */
 358        struct drm_framebuffer *fb;
 359
 360        bool enabled;
 361
 362        struct drm_display_mode mode;
 363
 364        int x, y;
 365        struct drm_display_mode *desired_mode;
 366        int desired_x, desired_y;
 367        const struct drm_crtc_funcs *funcs;
 368
 369        /* CRTC gamma size for reporting to userspace */
 370        uint32_t gamma_size;
 371        uint16_t *gamma_store;
 372
 373        /* if you are using the helper */
 374        void *helper_private;
 375};
 376
 377
 378/**
 379 * drm_connector_funcs - control connectors on a given device
 380 * @dpms: set power state (see drm_crtc_funcs above)
 381 * @save: save connector state
 382 * @restore: restore connector state
 383 * @mode_valid: is this mode valid on the given connector?
 384 * @mode_fixup: try to fixup proposed mode for this connector
 385 * @mode_set: set this mode
 386 * @detect: is this connector active?
 387 * @get_modes: get mode list for this connector
 388 * @set_property: property for this connector may need update
 389 * @destroy: make object go away
 390 * @force: notify the driver the connector is forced on
 391 *
 392 * Each CRTC may have one or more connectors attached to it.  The functions
 393 * below allow the core DRM code to control connectors, enumerate available modes,
 394 * etc.
 395 */
 396struct drm_connector_funcs {
 397        void (*dpms)(struct drm_connector *connector, int mode);
 398        void (*save)(struct drm_connector *connector);
 399        void (*restore)(struct drm_connector *connector);
 400        enum drm_connector_status (*detect)(struct drm_connector *connector);
 401        int (*fill_modes)(struct drm_connector *connector, uint32_t max_width, uint32_t max_height);
 402        int (*set_property)(struct drm_connector *connector, struct drm_property *property,
 403                             uint64_t val);
 404        void (*destroy)(struct drm_connector *connector);
 405        void (*force)(struct drm_connector *connector);
 406};
 407
 408struct drm_encoder_funcs {
 409        void (*destroy)(struct drm_encoder *encoder);
 410};
 411
 412#define DRM_CONNECTOR_MAX_UMODES 16
 413#define DRM_CONNECTOR_MAX_PROPERTY 16
 414#define DRM_CONNECTOR_LEN 32
 415#define DRM_CONNECTOR_MAX_ENCODER 2
 416
 417/**
 418 * drm_encoder - central DRM encoder structure
 419 */
 420struct drm_encoder {
 421        struct drm_device *dev;
 422        struct list_head head;
 423
 424        struct drm_mode_object base;
 425        int encoder_type;
 426        uint32_t possible_crtcs;
 427        uint32_t possible_clones;
 428
 429        struct drm_crtc *crtc;
 430        const struct drm_encoder_funcs *funcs;
 431        void *helper_private;
 432};
 433
 434enum drm_connector_force {
 435        DRM_FORCE_UNSPECIFIED,
 436        DRM_FORCE_OFF,
 437        DRM_FORCE_ON,         /* force on analog part normally */
 438        DRM_FORCE_ON_DIGITAL, /* for DVI-I use digital connector */
 439};
 440
 441/**
 442 * drm_connector - central DRM connector control structure
 443 * @crtc: CRTC this connector is currently connected to, NULL if none
 444 * @interlace_allowed: can this connector handle interlaced modes?
 445 * @doublescan_allowed: can this connector handle doublescan?
 446 * @available_modes: modes available on this connector (from get_modes() + user)
 447 * @initial_x: initial x position for this connector
 448 * @initial_y: initial y position for this connector
 449 * @status: connector connected?
 450 * @funcs: connector control functions
 451 *
 452 * Each connector may be connected to one or more CRTCs, or may be clonable by
 453 * another connector if they can share a CRTC.  Each connector also has a specific
 454 * position in the broader display (referred to as a 'screen' though it could
 455 * span multiple monitors).
 456 */
 457struct drm_connector {
 458        struct drm_device *dev;
 459        struct device kdev;
 460        struct device_attribute *attr;
 461        struct list_head head;
 462
 463        struct drm_mode_object base;
 464
 465        int connector_type;
 466        int connector_type_id;
 467        bool interlace_allowed;
 468        bool doublescan_allowed;
 469        struct list_head modes; /* list of modes on this connector */
 470
 471        int initial_x, initial_y;
 472        enum drm_connector_status status;
 473
 474        /* these are modes added by probing with DDC or the BIOS */
 475        struct list_head probed_modes;
 476
 477        struct drm_display_info display_info;
 478        const struct drm_connector_funcs *funcs;
 479
 480        struct list_head user_modes;
 481        struct drm_property_blob *edid_blob_ptr;
 482        u32 property_ids[DRM_CONNECTOR_MAX_PROPERTY];
 483        uint64_t property_values[DRM_CONNECTOR_MAX_PROPERTY];
 484
 485        /* requested DPMS state */
 486        int dpms;
 487
 488        void *helper_private;
 489
 490        /* forced on connector */
 491        enum drm_connector_force force;
 492        uint32_t encoder_ids[DRM_CONNECTOR_MAX_ENCODER];
 493        uint32_t force_encoder_id;
 494        struct drm_encoder *encoder; /* currently active encoder */
 495        void *fb_helper_private;
 496};
 497
 498/**
 499 * struct drm_mode_set
 500 *
 501 * Represents a single crtc the connectors that it drives with what mode
 502 * and from which framebuffer it scans out from.
 503 *
 504 * This is used to set modes.
 505 */
 506struct drm_mode_set {
 507        struct list_head head;
 508
 509        struct drm_framebuffer *fb;
 510        struct drm_crtc *crtc;
 511        struct drm_display_mode *mode;
 512
 513        uint32_t x;
 514        uint32_t y;
 515
 516        struct drm_connector **connectors;
 517        size_t num_connectors;
 518};
 519
 520/**
 521 * struct drm_mode_config_funcs - configure CRTCs for a given screen layout
 522 * @resize: adjust CRTCs as necessary for the proposed layout
 523 *
 524 * Currently only a resize hook is available.  DRM will call back into the
 525 * driver with a new screen width and height.  If the driver can't support
 526 * the proposed size, it can return false.  Otherwise it should adjust
 527 * the CRTC<->connector mappings as needed and update its view of the screen.
 528 */
 529struct drm_mode_config_funcs {
 530        struct drm_framebuffer *(*fb_create)(struct drm_device *dev, struct drm_file *file_priv, struct drm_mode_fb_cmd *mode_cmd);
 531        int (*fb_changed)(struct drm_device *dev);
 532};
 533
 534struct drm_mode_group {
 535        uint32_t num_crtcs;
 536        uint32_t num_encoders;
 537        uint32_t num_connectors;
 538
 539        /* list of object IDs for this group */
 540        uint32_t *id_list;
 541};
 542
 543/**
 544 * drm_mode_config - Mode configuration control structure
 545 *
 546 */
 547struct drm_mode_config {
 548        struct mutex mutex; /* protects configuration (mode lists etc.) */
 549        struct mutex idr_mutex; /* for IDR management */
 550        struct idr crtc_idr; /* use this idr for all IDs, fb, crtc, connector, modes - just makes life easier */
 551        /* this is limited to one for now */
 552        int num_fb;
 553        struct list_head fb_list;
 554        int num_connector;
 555        struct list_head connector_list;
 556        int num_encoder;
 557        struct list_head encoder_list;
 558
 559        int num_crtc;
 560        struct list_head crtc_list;
 561
 562        struct list_head property_list;
 563
 564        /* in-kernel framebuffers - hung of filp_head in drm_framebuffer */
 565        struct list_head fb_kernel_list;
 566
 567        int min_width, min_height;
 568        int max_width, max_height;
 569        struct drm_mode_config_funcs *funcs;
 570        resource_size_t fb_base;
 571
 572        /* pointers to standard properties */
 573        struct list_head property_blob_list;
 574        struct drm_property *edid_property;
 575        struct drm_property *dpms_property;
 576
 577        /* DVI-I properties */
 578        struct drm_property *dvi_i_subconnector_property;
 579        struct drm_property *dvi_i_select_subconnector_property;
 580
 581        /* TV properties */
 582        struct drm_property *tv_subconnector_property;
 583        struct drm_property *tv_select_subconnector_property;
 584        struct drm_property *tv_mode_property;
 585        struct drm_property *tv_left_margin_property;
 586        struct drm_property *tv_right_margin_property;
 587        struct drm_property *tv_top_margin_property;
 588        struct drm_property *tv_bottom_margin_property;
 589        struct drm_property *tv_brightness_property;
 590        struct drm_property *tv_contrast_property;
 591        struct drm_property *tv_flicker_reduction_property;
 592        struct drm_property *tv_overscan_property;
 593        struct drm_property *tv_saturation_property;
 594        struct drm_property *tv_hue_property;
 595
 596        /* Optional properties */
 597        struct drm_property *scaling_mode_property;
 598        struct drm_property *dithering_mode_property;
 599};
 600
 601#define obj_to_crtc(x) container_of(x, struct drm_crtc, base)
 602#define obj_to_connector(x) container_of(x, struct drm_connector, base)
 603#define obj_to_encoder(x) container_of(x, struct drm_encoder, base)
 604#define obj_to_mode(x) container_of(x, struct drm_display_mode, base)
 605#define obj_to_fb(x) container_of(x, struct drm_framebuffer, base)
 606#define obj_to_property(x) container_of(x, struct drm_property, base)
 607#define obj_to_blob(x) container_of(x, struct drm_property_blob, base)
 608
 609
 610extern void drm_crtc_init(struct drm_device *dev,
 611                          struct drm_crtc *crtc,
 612                          const struct drm_crtc_funcs *funcs);
 613extern void drm_crtc_cleanup(struct drm_crtc *crtc);
 614
 615extern void drm_connector_init(struct drm_device *dev,
 616                            struct drm_connector *connector,
 617                            const struct drm_connector_funcs *funcs,
 618                            int connector_type);
 619
 620extern void drm_connector_cleanup(struct drm_connector *connector);
 621
 622extern void drm_encoder_init(struct drm_device *dev,
 623                             struct drm_encoder *encoder,
 624                             const struct drm_encoder_funcs *funcs,
 625                             int encoder_type);
 626
 627extern void drm_encoder_cleanup(struct drm_encoder *encoder);
 628
 629extern char *drm_get_connector_name(struct drm_connector *connector);
 630extern char *drm_get_dpms_name(int val);
 631extern char *drm_get_dvi_i_subconnector_name(int val);
 632extern char *drm_get_dvi_i_select_name(int val);
 633extern char *drm_get_tv_subconnector_name(int val);
 634extern char *drm_get_tv_select_name(int val);
 635extern void drm_fb_release(struct drm_file *file_priv);
 636extern int drm_mode_group_init_legacy_group(struct drm_device *dev, struct drm_mode_group *group);
 637extern struct edid *drm_get_edid(struct drm_connector *connector,
 638                                 struct i2c_adapter *adapter);
 639extern int drm_do_probe_ddc_edid(struct i2c_adapter *adapter,
 640                                 unsigned char *buf, int len);
 641extern int drm_add_edid_modes(struct drm_connector *connector, struct edid *edid);
 642extern void drm_mode_probed_add(struct drm_connector *connector, struct drm_display_mode *mode);
 643extern void drm_mode_remove(struct drm_connector *connector, struct drm_display_mode *mode);
 644extern struct drm_display_mode *drm_mode_duplicate(struct drm_device *dev,
 645                                                   struct drm_display_mode *mode);
 646extern void drm_mode_debug_printmodeline(struct drm_display_mode *mode);
 647extern void drm_mode_config_init(struct drm_device *dev);
 648extern void drm_mode_config_cleanup(struct drm_device *dev);
 649extern void drm_mode_set_name(struct drm_display_mode *mode);
 650extern bool drm_mode_equal(struct drm_display_mode *mode1, struct drm_display_mode *mode2);
 651extern int drm_mode_width(struct drm_display_mode *mode);
 652extern int drm_mode_height(struct drm_display_mode *mode);
 653
 654/* for us by fb module */
 655extern int drm_mode_attachmode_crtc(struct drm_device *dev,
 656                                    struct drm_crtc *crtc,
 657                                    struct drm_display_mode *mode);
 658extern int drm_mode_detachmode_crtc(struct drm_device *dev, struct drm_display_mode *mode);
 659
 660extern struct drm_display_mode *drm_mode_create(struct drm_device *dev);
 661extern void drm_mode_destroy(struct drm_device *dev, struct drm_display_mode *mode);
 662extern void drm_mode_list_concat(struct list_head *head,
 663                                 struct list_head *new);
 664extern void drm_mode_validate_size(struct drm_device *dev,
 665                                   struct list_head *mode_list,
 666                                   int maxX, int maxY, int maxPitch);
 667extern void drm_mode_prune_invalid(struct drm_device *dev,
 668                                   struct list_head *mode_list, bool verbose);
 669extern void drm_mode_sort(struct list_head *mode_list);
 670extern int drm_mode_vrefresh(struct drm_display_mode *mode);
 671extern void drm_mode_set_crtcinfo(struct drm_display_mode *p,
 672                                  int adjust_flags);
 673extern void drm_mode_connector_list_update(struct drm_connector *connector);
 674extern int drm_mode_connector_update_edid_property(struct drm_connector *connector,
 675                                                struct edid *edid);
 676extern int drm_connector_property_set_value(struct drm_connector *connector,
 677                                         struct drm_property *property,
 678                                         uint64_t value);
 679extern int drm_connector_property_get_value(struct drm_connector *connector,
 680                                         struct drm_property *property,
 681                                         uint64_t *value);
 682extern struct drm_display_mode *drm_crtc_mode_create(struct drm_device *dev);
 683extern void drm_framebuffer_set_object(struct drm_device *dev,
 684                                       unsigned long handle);
 685extern int drm_framebuffer_init(struct drm_device *dev,
 686                                struct drm_framebuffer *fb,
 687                                const struct drm_framebuffer_funcs *funcs);
 688extern void drm_framebuffer_cleanup(struct drm_framebuffer *fb);
 689extern int drmfb_probe(struct drm_device *dev, struct drm_crtc *crtc);
 690extern int drmfb_remove(struct drm_device *dev, struct drm_framebuffer *fb);
 691extern void drm_crtc_probe_connector_modes(struct drm_device *dev, int maxX, int maxY);
 692extern bool drm_crtc_in_use(struct drm_crtc *crtc);
 693
 694extern int drm_connector_attach_property(struct drm_connector *connector,
 695                                      struct drm_property *property, uint64_t init_val);
 696extern struct drm_property *drm_property_create(struct drm_device *dev, int flags,
 697                                                const char *name, int num_values);
 698extern void drm_property_destroy(struct drm_device *dev, struct drm_property *property);
 699extern int drm_property_add_enum(struct drm_property *property, int index,
 700                                 uint64_t value, const char *name);
 701extern int drm_mode_create_dvi_i_properties(struct drm_device *dev);
 702extern int drm_mode_create_tv_properties(struct drm_device *dev, int num_formats,
 703                                     char *formats[]);
 704extern int drm_mode_create_scaling_mode_property(struct drm_device *dev);
 705extern int drm_mode_create_dithering_property(struct drm_device *dev);
 706extern char *drm_get_encoder_name(struct drm_encoder *encoder);
 707
 708extern int drm_mode_connector_attach_encoder(struct drm_connector *connector,
 709                                             struct drm_encoder *encoder);
 710extern void drm_mode_connector_detach_encoder(struct drm_connector *connector,
 711                                           struct drm_encoder *encoder);
 712extern bool drm_mode_crtc_set_gamma_size(struct drm_crtc *crtc,
 713                                         int gamma_size);
 714extern void *drm_mode_object_find(struct drm_device *dev, uint32_t id, uint32_t type);
 715/* IOCTLs */
 716extern int drm_mode_getresources(struct drm_device *dev,
 717                                 void *data, struct drm_file *file_priv);
 718
 719extern int drm_mode_getcrtc(struct drm_device *dev,
 720                            void *data, struct drm_file *file_priv);
 721extern int drm_mode_getconnector(struct drm_device *dev,
 722                              void *data, struct drm_file *file_priv);
 723extern int drm_mode_setcrtc(struct drm_device *dev,
 724                            void *data, struct drm_file *file_priv);
 725extern int drm_mode_cursor_ioctl(struct drm_device *dev,
 726                                void *data, struct drm_file *file_priv);
 727extern int drm_mode_addfb(struct drm_device *dev,
 728                          void *data, struct drm_file *file_priv);
 729extern int drm_mode_rmfb(struct drm_device *dev,
 730                         void *data, struct drm_file *file_priv);
 731extern int drm_mode_getfb(struct drm_device *dev,
 732                          void *data, struct drm_file *file_priv);
 733extern int drm_mode_addmode_ioctl(struct drm_device *dev,
 734                                  void *data, struct drm_file *file_priv);
 735extern int drm_mode_rmmode_ioctl(struct drm_device *dev,
 736                                 void *data, struct drm_file *file_priv);
 737extern int drm_mode_attachmode_ioctl(struct drm_device *dev,
 738                                     void *data, struct drm_file *file_priv);
 739extern int drm_mode_detachmode_ioctl(struct drm_device *dev,
 740                                     void *data, struct drm_file *file_priv);
 741
 742extern int drm_mode_getproperty_ioctl(struct drm_device *dev,
 743                                      void *data, struct drm_file *file_priv);
 744extern int drm_mode_getblob_ioctl(struct drm_device *dev,
 745                                  void *data, struct drm_file *file_priv);
 746extern int drm_mode_connector_property_set_ioctl(struct drm_device *dev,
 747                                              void *data, struct drm_file *file_priv);
 748extern int drm_mode_hotplug_ioctl(struct drm_device *dev,
 749                                  void *data, struct drm_file *file_priv);
 750extern int drm_mode_replacefb(struct drm_device *dev,
 751                              void *data, struct drm_file *file_priv);
 752extern int drm_mode_getencoder(struct drm_device *dev,
 753                               void *data, struct drm_file *file_priv);
 754extern int drm_mode_gamma_get_ioctl(struct drm_device *dev,
 755                                    void *data, struct drm_file *file_priv);
 756extern int drm_mode_gamma_set_ioctl(struct drm_device *dev,
 757                                    void *data, struct drm_file *file_priv);
 758extern bool drm_detect_hdmi_monitor(struct edid *edid);
 759extern struct drm_display_mode *drm_cvt_mode(struct drm_device *dev,
 760                                int hdisplay, int vdisplay, int vrefresh,
 761                                bool reduced, bool interlaced, bool margins);
 762extern struct drm_display_mode *drm_gtf_mode(struct drm_device *dev,
 763                                int hdisplay, int vdisplay, int vrefresh,
 764                                bool interlaced, int margins);
 765extern int drm_add_modes_noedid(struct drm_connector *connector,
 766                                int hdisplay, int vdisplay);
 767#endif /* __DRM_CRTC_H__ */
 768