linux/include/drm/drm_modes.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 * Copyright © 2014 Intel Corporation
   7 *   Daniel Vetter <daniel.vetter@ffwll.ch>
   8 *
   9 * Permission is hereby granted, free of charge, to any person obtaining a
  10 * copy of this software and associated documentation files (the "Software"),
  11 * to deal in the Software without restriction, including without limitation
  12 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  13 * and/or sell copies of the Software, and to permit persons to whom the
  14 * Software is furnished to do so, subject to the following conditions:
  15 *
  16 * The above copyright notice and this permission notice shall be included in
  17 * all copies or substantial portions of the Software.
  18 *
  19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  20 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  22 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
  23 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  24 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  25 * OTHER DEALINGS IN THE SOFTWARE.
  26 */
  27#ifndef __DRM_MODES_H__
  28#define __DRM_MODES_H__
  29
  30/*
  31 * Note on terminology:  here, for brevity and convenience, we refer to connector
  32 * control chips as 'CRTCs'.  They can control any type of connector, VGA, LVDS,
  33 * DVI, etc.  And 'screen' refers to the whole of the visible display, which
  34 * may span multiple monitors (and therefore multiple CRTC and connector
  35 * structures).
  36 */
  37
  38enum drm_mode_status {
  39    MODE_OK     = 0,    /* Mode OK */
  40    MODE_HSYNC,         /* hsync out of range */
  41    MODE_VSYNC,         /* vsync out of range */
  42    MODE_H_ILLEGAL,     /* mode has illegal horizontal timings */
  43    MODE_V_ILLEGAL,     /* mode has illegal horizontal timings */
  44    MODE_BAD_WIDTH,     /* requires an unsupported linepitch */
  45    MODE_NOMODE,        /* no mode with a matching name */
  46    MODE_NO_INTERLACE,  /* interlaced mode not supported */
  47    MODE_NO_DBLESCAN,   /* doublescan mode not supported */
  48    MODE_NO_VSCAN,      /* multiscan mode not supported */
  49    MODE_MEM,           /* insufficient video memory */
  50    MODE_VIRTUAL_X,     /* mode width too large for specified virtual size */
  51    MODE_VIRTUAL_Y,     /* mode height too large for specified virtual size */
  52    MODE_MEM_VIRT,      /* insufficient video memory given virtual size */
  53    MODE_NOCLOCK,       /* no fixed clock available */
  54    MODE_CLOCK_HIGH,    /* clock required is too high */
  55    MODE_CLOCK_LOW,     /* clock required is too low */
  56    MODE_CLOCK_RANGE,   /* clock/mode isn't in a ClockRange */
  57    MODE_BAD_HVALUE,    /* horizontal timing was out of range */
  58    MODE_BAD_VVALUE,    /* vertical timing was out of range */
  59    MODE_BAD_VSCAN,     /* VScan value out of range */
  60    MODE_HSYNC_NARROW,  /* horizontal sync too narrow */
  61    MODE_HSYNC_WIDE,    /* horizontal sync too wide */
  62    MODE_HBLANK_NARROW, /* horizontal blanking too narrow */
  63    MODE_HBLANK_WIDE,   /* horizontal blanking too wide */
  64    MODE_VSYNC_NARROW,  /* vertical sync too narrow */
  65    MODE_VSYNC_WIDE,    /* vertical sync too wide */
  66    MODE_VBLANK_NARROW, /* vertical blanking too narrow */
  67    MODE_VBLANK_WIDE,   /* vertical blanking too wide */
  68    MODE_PANEL,         /* exceeds panel dimensions */
  69    MODE_INTERLACE_WIDTH, /* width too large for interlaced mode */
  70    MODE_ONE_WIDTH,     /* only one width is supported */
  71    MODE_ONE_HEIGHT,    /* only one height is supported */
  72    MODE_ONE_SIZE,      /* only one resolution is supported */
  73    MODE_NO_REDUCED,    /* monitor doesn't accept reduced blanking */
  74    MODE_NO_STEREO,     /* stereo modes not supported */
  75    MODE_UNVERIFIED = -3, /* mode needs to reverified */
  76    MODE_BAD = -2,      /* unspecified reason */
  77    MODE_ERROR  = -1    /* error condition */
  78};
  79
  80#define DRM_MODE_TYPE_CLOCK_CRTC_C (DRM_MODE_TYPE_CLOCK_C | \
  81                                    DRM_MODE_TYPE_CRTC_C)
  82
  83#define DRM_MODE(nm, t, c, hd, hss, hse, ht, hsk, vd, vss, vse, vt, vs, f) \
  84        .name = nm, .status = 0, .type = (t), .clock = (c), \
  85        .hdisplay = (hd), .hsync_start = (hss), .hsync_end = (hse), \
  86        .htotal = (ht), .hskew = (hsk), .vdisplay = (vd), \
  87        .vsync_start = (vss), .vsync_end = (vse), .vtotal = (vt), \
  88        .vscan = (vs), .flags = (f), \
  89        .base.type = DRM_MODE_OBJECT_MODE
  90
  91#define CRTC_INTERLACE_HALVE_V  (1 << 0) /* halve V values for interlacing */
  92#define CRTC_STEREO_DOUBLE      (1 << 1) /* adjust timings for stereo modes */
  93
  94#define DRM_MODE_FLAG_3D_MAX    DRM_MODE_FLAG_3D_SIDE_BY_SIDE_HALF
  95
  96struct drm_display_mode {
  97        /* Header */
  98        struct list_head head;
  99        struct drm_mode_object base;
 100
 101        char name[DRM_DISPLAY_MODE_LEN];
 102
 103        enum drm_mode_status status;
 104        unsigned int type;
 105
 106        /* Proposed mode values */
 107        int clock;              /* in kHz */
 108        int hdisplay;
 109        int hsync_start;
 110        int hsync_end;
 111        int htotal;
 112        int hskew;
 113        int vdisplay;
 114        int vsync_start;
 115        int vsync_end;
 116        int vtotal;
 117        int vscan;
 118        unsigned int flags;
 119
 120        /* Addressable image size (may be 0 for projectors, etc.) */
 121        int width_mm;
 122        int height_mm;
 123
 124        /* Actual mode we give to hw */
 125        int crtc_clock;         /* in KHz */
 126        int crtc_hdisplay;
 127        int crtc_hblank_start;
 128        int crtc_hblank_end;
 129        int crtc_hsync_start;
 130        int crtc_hsync_end;
 131        int crtc_htotal;
 132        int crtc_hskew;
 133        int crtc_vdisplay;
 134        int crtc_vblank_start;
 135        int crtc_vblank_end;
 136        int crtc_vsync_start;
 137        int crtc_vsync_end;
 138        int crtc_vtotal;
 139
 140        /* Driver private mode info */
 141        int *private;
 142        int private_flags;
 143
 144        int vrefresh;           /* in Hz */
 145        int hsync;              /* in kHz */
 146        enum hdmi_picture_aspect picture_aspect_ratio;
 147};
 148
 149/* mode specified on the command line */
 150struct drm_cmdline_mode {
 151        bool specified;
 152        bool refresh_specified;
 153        bool bpp_specified;
 154        int xres, yres;
 155        int bpp;
 156        int refresh;
 157        bool rb;
 158        bool interlace;
 159        bool cvt;
 160        bool margins;
 161        enum drm_connector_force force;
 162};
 163
 164/**
 165 * drm_mode_is_stereo - check for stereo mode flags
 166 * @mode: drm_display_mode to check
 167 *
 168 * Returns:
 169 * True if the mode is one of the stereo modes (like side-by-side), false if
 170 * not.
 171 */
 172static inline bool drm_mode_is_stereo(const struct drm_display_mode *mode)
 173{
 174        return mode->flags & DRM_MODE_FLAG_3D_MASK;
 175}
 176
 177struct drm_connector;
 178struct drm_cmdline_mode;
 179
 180struct drm_display_mode *drm_mode_create(struct drm_device *dev);
 181void drm_mode_destroy(struct drm_device *dev, struct drm_display_mode *mode);
 182void drm_mode_probed_add(struct drm_connector *connector, struct drm_display_mode *mode);
 183void drm_mode_debug_printmodeline(const struct drm_display_mode *mode);
 184
 185struct drm_display_mode *drm_cvt_mode(struct drm_device *dev,
 186                                      int hdisplay, int vdisplay, int vrefresh,
 187                                      bool reduced, bool interlaced,
 188                                      bool margins);
 189struct drm_display_mode *drm_gtf_mode(struct drm_device *dev,
 190                                      int hdisplay, int vdisplay, int vrefresh,
 191                                      bool interlaced, int margins);
 192struct drm_display_mode *drm_gtf_mode_complex(struct drm_device *dev,
 193                                              int hdisplay, int vdisplay,
 194                                              int vrefresh, bool interlaced,
 195                                              int margins,
 196                                              int GTF_M, int GTF_2C,
 197                                              int GTF_K, int GTF_2J);
 198void drm_display_mode_from_videomode(const struct videomode *vm,
 199                                     struct drm_display_mode *dmode);
 200int of_get_drm_display_mode(struct device_node *np,
 201                            struct drm_display_mode *dmode,
 202                            int index);
 203
 204void drm_mode_set_name(struct drm_display_mode *mode);
 205int drm_mode_hsync(const struct drm_display_mode *mode);
 206int drm_mode_vrefresh(const struct drm_display_mode *mode);
 207
 208void drm_mode_set_crtcinfo(struct drm_display_mode *p,
 209                           int adjust_flags);
 210void drm_mode_copy(struct drm_display_mode *dst,
 211                   const struct drm_display_mode *src);
 212struct drm_display_mode *drm_mode_duplicate(struct drm_device *dev,
 213                                            const struct drm_display_mode *mode);
 214bool drm_mode_equal(const struct drm_display_mode *mode1,
 215                    const struct drm_display_mode *mode2);
 216bool drm_mode_equal_no_clocks_no_stereo(const struct drm_display_mode *mode1,
 217                                        const struct drm_display_mode *mode2);
 218
 219/* for use by the crtc helper probe functions */
 220void drm_mode_validate_size(struct drm_device *dev,
 221                            struct list_head *mode_list,
 222                            int maxX, int maxY);
 223void drm_mode_prune_invalid(struct drm_device *dev,
 224                            struct list_head *mode_list, bool verbose);
 225void drm_mode_sort(struct list_head *mode_list);
 226void drm_mode_connector_list_update(struct drm_connector *connector, bool merge_type_bits);
 227
 228/* parsing cmdline modes */
 229bool
 230drm_mode_parse_command_line_for_connector(const char *mode_option,
 231                                          struct drm_connector *connector,
 232                                          struct drm_cmdline_mode *mode);
 233struct drm_display_mode *
 234drm_mode_create_from_cmdline_mode(struct drm_device *dev,
 235                                  struct drm_cmdline_mode *cmd);
 236
 237#endif /* __DRM_MODES_H__ */
 238