Back to home page

OSCL-LXR

 
 

    


0001 /*
0002  * Copyright © 2006 Keith Packard
0003  * Copyright © 2007-2008 Dave Airlie
0004  * Copyright © 2007-2008 Intel Corporation
0005  *   Jesse Barnes <jesse.barnes@intel.com>
0006  * Copyright © 2014 Intel Corporation
0007  *   Daniel Vetter <daniel.vetter@ffwll.ch>
0008  *
0009  * Permission is hereby granted, free of charge, to any person obtaining a
0010  * copy of this software and associated documentation files (the "Software"),
0011  * to deal in the Software without restriction, including without limitation
0012  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
0013  * and/or sell copies of the Software, and to permit persons to whom the
0014  * Software is furnished to do so, subject to the following conditions:
0015  *
0016  * The above copyright notice and this permission notice shall be included in
0017  * all copies or substantial portions of the Software.
0018  *
0019  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
0020  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
0021  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
0022  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
0023  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
0024  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
0025  * OTHER DEALINGS IN THE SOFTWARE.
0026  */
0027 #ifndef __DRM_MODES_H__
0028 #define __DRM_MODES_H__
0029 
0030 #include <linux/hdmi.h>
0031 
0032 #include <drm/drm_mode_object.h>
0033 #include <drm/drm_connector.h>
0034 
0035 struct videomode;
0036 
0037 /*
0038  * Note on terminology:  here, for brevity and convenience, we refer to connector
0039  * control chips as 'CRTCs'.  They can control any type of connector, VGA, LVDS,
0040  * DVI, etc.  And 'screen' refers to the whole of the visible display, which
0041  * may span multiple monitors (and therefore multiple CRTC and connector
0042  * structures).
0043  */
0044 
0045 /**
0046  * enum drm_mode_status - hardware support status of a mode
0047  * @MODE_OK: Mode OK
0048  * @MODE_HSYNC: hsync out of range
0049  * @MODE_VSYNC: vsync out of range
0050  * @MODE_H_ILLEGAL: mode has illegal horizontal timings
0051  * @MODE_V_ILLEGAL: mode has illegal vertical timings
0052  * @MODE_BAD_WIDTH: requires an unsupported linepitch
0053  * @MODE_NOMODE: no mode with a matching name
0054  * @MODE_NO_INTERLACE: interlaced mode not supported
0055  * @MODE_NO_DBLESCAN: doublescan mode not supported
0056  * @MODE_NO_VSCAN: multiscan mode not supported
0057  * @MODE_MEM: insufficient video memory
0058  * @MODE_VIRTUAL_X: mode width too large for specified virtual size
0059  * @MODE_VIRTUAL_Y: mode height too large for specified virtual size
0060  * @MODE_MEM_VIRT: insufficient video memory given virtual size
0061  * @MODE_NOCLOCK: no fixed clock available
0062  * @MODE_CLOCK_HIGH: clock required is too high
0063  * @MODE_CLOCK_LOW: clock required is too low
0064  * @MODE_CLOCK_RANGE: clock/mode isn't in a ClockRange
0065  * @MODE_BAD_HVALUE: horizontal timing was out of range
0066  * @MODE_BAD_VVALUE: vertical timing was out of range
0067  * @MODE_BAD_VSCAN: VScan value out of range
0068  * @MODE_HSYNC_NARROW: horizontal sync too narrow
0069  * @MODE_HSYNC_WIDE: horizontal sync too wide
0070  * @MODE_HBLANK_NARROW: horizontal blanking too narrow
0071  * @MODE_HBLANK_WIDE: horizontal blanking too wide
0072  * @MODE_VSYNC_NARROW: vertical sync too narrow
0073  * @MODE_VSYNC_WIDE: vertical sync too wide
0074  * @MODE_VBLANK_NARROW: vertical blanking too narrow
0075  * @MODE_VBLANK_WIDE: vertical blanking too wide
0076  * @MODE_PANEL: exceeds panel dimensions
0077  * @MODE_INTERLACE_WIDTH: width too large for interlaced mode
0078  * @MODE_ONE_WIDTH: only one width is supported
0079  * @MODE_ONE_HEIGHT: only one height is supported
0080  * @MODE_ONE_SIZE: only one resolution is supported
0081  * @MODE_NO_REDUCED: monitor doesn't accept reduced blanking
0082  * @MODE_NO_STEREO: stereo modes not supported
0083  * @MODE_NO_420: ycbcr 420 modes not supported
0084  * @MODE_STALE: mode has become stale
0085  * @MODE_BAD: unspecified reason
0086  * @MODE_ERROR: error condition
0087  *
0088  * This enum is used to filter out modes not supported by the driver/hardware
0089  * combination.
0090  */
0091 enum drm_mode_status {
0092     MODE_OK = 0,
0093     MODE_HSYNC,
0094     MODE_VSYNC,
0095     MODE_H_ILLEGAL,
0096     MODE_V_ILLEGAL,
0097     MODE_BAD_WIDTH,
0098     MODE_NOMODE,
0099     MODE_NO_INTERLACE,
0100     MODE_NO_DBLESCAN,
0101     MODE_NO_VSCAN,
0102     MODE_MEM,
0103     MODE_VIRTUAL_X,
0104     MODE_VIRTUAL_Y,
0105     MODE_MEM_VIRT,
0106     MODE_NOCLOCK,
0107     MODE_CLOCK_HIGH,
0108     MODE_CLOCK_LOW,
0109     MODE_CLOCK_RANGE,
0110     MODE_BAD_HVALUE,
0111     MODE_BAD_VVALUE,
0112     MODE_BAD_VSCAN,
0113     MODE_HSYNC_NARROW,
0114     MODE_HSYNC_WIDE,
0115     MODE_HBLANK_NARROW,
0116     MODE_HBLANK_WIDE,
0117     MODE_VSYNC_NARROW,
0118     MODE_VSYNC_WIDE,
0119     MODE_VBLANK_NARROW,
0120     MODE_VBLANK_WIDE,
0121     MODE_PANEL,
0122     MODE_INTERLACE_WIDTH,
0123     MODE_ONE_WIDTH,
0124     MODE_ONE_HEIGHT,
0125     MODE_ONE_SIZE,
0126     MODE_NO_REDUCED,
0127     MODE_NO_STEREO,
0128     MODE_NO_420,
0129     MODE_STALE = -3,
0130     MODE_BAD = -2,
0131     MODE_ERROR = -1
0132 };
0133 
0134 #define DRM_MODE(nm, t, c, hd, hss, hse, ht, hsk, vd, vss, vse, vt, vs, f) \
0135     .name = nm, .status = 0, .type = (t), .clock = (c), \
0136     .hdisplay = (hd), .hsync_start = (hss), .hsync_end = (hse), \
0137     .htotal = (ht), .hskew = (hsk), .vdisplay = (vd), \
0138     .vsync_start = (vss), .vsync_end = (vse), .vtotal = (vt), \
0139     .vscan = (vs), .flags = (f)
0140 
0141 /**
0142  * DRM_SIMPLE_MODE - Simple display mode
0143  * @hd: Horizontal resolution, width
0144  * @vd: Vertical resolution, height
0145  * @hd_mm: Display width in millimeters
0146  * @vd_mm: Display height in millimeters
0147  *
0148  * This macro initializes a &drm_display_mode that only contains info about
0149  * resolution and physical size.
0150  */
0151 #define DRM_SIMPLE_MODE(hd, vd, hd_mm, vd_mm) \
0152     .type = DRM_MODE_TYPE_DRIVER, .clock = 1 /* pass validation */, \
0153     .hdisplay = (hd), .hsync_start = (hd), .hsync_end = (hd), \
0154     .htotal = (hd), .vdisplay = (vd), .vsync_start = (vd), \
0155     .vsync_end = (vd), .vtotal = (vd), .width_mm = (hd_mm), \
0156     .height_mm = (vd_mm)
0157 
0158 #define CRTC_INTERLACE_HALVE_V  (1 << 0) /* halve V values for interlacing */
0159 #define CRTC_STEREO_DOUBLE  (1 << 1) /* adjust timings for stereo modes */
0160 #define CRTC_NO_DBLSCAN     (1 << 2) /* don't adjust doublescan */
0161 #define CRTC_NO_VSCAN       (1 << 3) /* don't adjust doublescan */
0162 #define CRTC_STEREO_DOUBLE_ONLY (CRTC_STEREO_DOUBLE | CRTC_NO_DBLSCAN | CRTC_NO_VSCAN)
0163 
0164 #define DRM_MODE_FLAG_3D_MAX    DRM_MODE_FLAG_3D_SIDE_BY_SIDE_HALF
0165 
0166 #define DRM_MODE_MATCH_TIMINGS (1 << 0)
0167 #define DRM_MODE_MATCH_CLOCK (1 << 1)
0168 #define DRM_MODE_MATCH_FLAGS (1 << 2)
0169 #define DRM_MODE_MATCH_3D_FLAGS (1 << 3)
0170 #define DRM_MODE_MATCH_ASPECT_RATIO (1 << 4)
0171 
0172 /**
0173  * struct drm_display_mode - DRM kernel-internal display mode structure
0174  * @hdisplay: horizontal display size
0175  * @hsync_start: horizontal sync start
0176  * @hsync_end: horizontal sync end
0177  * @htotal: horizontal total size
0178  * @hskew: horizontal skew?!
0179  * @vdisplay: vertical display size
0180  * @vsync_start: vertical sync start
0181  * @vsync_end: vertical sync end
0182  * @vtotal: vertical total size
0183  * @vscan: vertical scan?!
0184  * @crtc_hdisplay: hardware mode horizontal display size
0185  * @crtc_hblank_start: hardware mode horizontal blank start
0186  * @crtc_hblank_end: hardware mode horizontal blank end
0187  * @crtc_hsync_start: hardware mode horizontal sync start
0188  * @crtc_hsync_end: hardware mode horizontal sync end
0189  * @crtc_htotal: hardware mode horizontal total size
0190  * @crtc_hskew: hardware mode horizontal skew?!
0191  * @crtc_vdisplay: hardware mode vertical display size
0192  * @crtc_vblank_start: hardware mode vertical blank start
0193  * @crtc_vblank_end: hardware mode vertical blank end
0194  * @crtc_vsync_start: hardware mode vertical sync start
0195  * @crtc_vsync_end: hardware mode vertical sync end
0196  * @crtc_vtotal: hardware mode vertical total size
0197  *
0198  * This is the kernel API display mode information structure. For the
0199  * user-space version see struct drm_mode_modeinfo.
0200  *
0201  * The horizontal and vertical timings are defined per the following diagram.
0202  *
0203  * ::
0204  *
0205  *
0206  *               Active                 Front           Sync           Back
0207  *              Region                 Porch                          Porch
0208  *     <-----------------------><----------------><-------------><-------------->
0209  *       //////////////////////|
0210  *      ////////////////////// |
0211  *     //////////////////////  |..................               ................
0212  *                                                _______________
0213  *     <----- [hv]display ----->
0214  *     <------------- [hv]sync_start ------------>
0215  *     <--------------------- [hv]sync_end --------------------->
0216  *     <-------------------------------- [hv]total ----------------------------->*
0217  *
0218  * This structure contains two copies of timings. First are the plain timings,
0219  * which specify the logical mode, as it would be for a progressive 1:1 scanout
0220  * at the refresh rate userspace can observe through vblank timestamps. Then
0221  * there's the hardware timings, which are corrected for interlacing,
0222  * double-clocking and similar things. They are provided as a convenience, and
0223  * can be appropriately computed using drm_mode_set_crtcinfo().
0224  *
0225  * For printing you can use %DRM_MODE_FMT and DRM_MODE_ARG().
0226  */
0227 struct drm_display_mode {
0228     /**
0229      * @clock:
0230      *
0231      * Pixel clock in kHz.
0232      */
0233     int clock;      /* in kHz */
0234     u16 hdisplay;
0235     u16 hsync_start;
0236     u16 hsync_end;
0237     u16 htotal;
0238     u16 hskew;
0239     u16 vdisplay;
0240     u16 vsync_start;
0241     u16 vsync_end;
0242     u16 vtotal;
0243     u16 vscan;
0244     /**
0245      * @flags:
0246      *
0247      * Sync and timing flags:
0248      *
0249      *  - DRM_MODE_FLAG_PHSYNC: horizontal sync is active high.
0250      *  - DRM_MODE_FLAG_NHSYNC: horizontal sync is active low.
0251      *  - DRM_MODE_FLAG_PVSYNC: vertical sync is active high.
0252      *  - DRM_MODE_FLAG_NVSYNC: vertical sync is active low.
0253      *  - DRM_MODE_FLAG_INTERLACE: mode is interlaced.
0254      *  - DRM_MODE_FLAG_DBLSCAN: mode uses doublescan.
0255      *  - DRM_MODE_FLAG_CSYNC: mode uses composite sync.
0256      *  - DRM_MODE_FLAG_PCSYNC: composite sync is active high.
0257      *  - DRM_MODE_FLAG_NCSYNC: composite sync is active low.
0258      *  - DRM_MODE_FLAG_HSKEW: hskew provided (not used?).
0259      *  - DRM_MODE_FLAG_BCAST: <deprecated>
0260      *  - DRM_MODE_FLAG_PIXMUX: <deprecated>
0261      *  - DRM_MODE_FLAG_DBLCLK: double-clocked mode.
0262      *  - DRM_MODE_FLAG_CLKDIV2: half-clocked mode.
0263      *
0264      * Additionally there's flags to specify how 3D modes are packed:
0265      *
0266      *  - DRM_MODE_FLAG_3D_NONE: normal, non-3D mode.
0267      *  - DRM_MODE_FLAG_3D_FRAME_PACKING: 2 full frames for left and right.
0268      *  - DRM_MODE_FLAG_3D_FIELD_ALTERNATIVE: interleaved like fields.
0269      *  - DRM_MODE_FLAG_3D_LINE_ALTERNATIVE: interleaved lines.
0270      *  - DRM_MODE_FLAG_3D_SIDE_BY_SIDE_FULL: side-by-side full frames.
0271      *  - DRM_MODE_FLAG_3D_L_DEPTH: ?
0272      *  - DRM_MODE_FLAG_3D_L_DEPTH_GFX_GFX_DEPTH: ?
0273      *  - DRM_MODE_FLAG_3D_TOP_AND_BOTTOM: frame split into top and bottom
0274      *    parts.
0275      *  - DRM_MODE_FLAG_3D_SIDE_BY_SIDE_HALF: frame split into left and
0276      *    right parts.
0277      */
0278     u32 flags;
0279 
0280     /**
0281      * @crtc_clock:
0282      *
0283      * Actual pixel or dot clock in the hardware. This differs from the
0284      * logical @clock when e.g. using interlacing, double-clocking, stereo
0285      * modes or other fancy stuff that changes the timings and signals
0286      * actually sent over the wire.
0287      *
0288      * This is again in kHz.
0289      *
0290      * Note that with digital outputs like HDMI or DP there's usually a
0291      * massive confusion between the dot clock and the signal clock at the
0292      * bit encoding level. Especially when a 8b/10b encoding is used and the
0293      * difference is exactly a factor of 10.
0294      */
0295     int crtc_clock;
0296     u16 crtc_hdisplay;
0297     u16 crtc_hblank_start;
0298     u16 crtc_hblank_end;
0299     u16 crtc_hsync_start;
0300     u16 crtc_hsync_end;
0301     u16 crtc_htotal;
0302     u16 crtc_hskew;
0303     u16 crtc_vdisplay;
0304     u16 crtc_vblank_start;
0305     u16 crtc_vblank_end;
0306     u16 crtc_vsync_start;
0307     u16 crtc_vsync_end;
0308     u16 crtc_vtotal;
0309 
0310     /**
0311      * @width_mm:
0312      *
0313      * Addressable size of the output in mm, projectors should set this to
0314      * 0.
0315      */
0316     u16 width_mm;
0317 
0318     /**
0319      * @height_mm:
0320      *
0321      * Addressable size of the output in mm, projectors should set this to
0322      * 0.
0323      */
0324     u16 height_mm;
0325 
0326     /**
0327      * @type:
0328      *
0329      * A bitmask of flags, mostly about the source of a mode. Possible flags
0330      * are:
0331      *
0332      *  - DRM_MODE_TYPE_PREFERRED: Preferred mode, usually the native
0333      *    resolution of an LCD panel. There should only be one preferred
0334      *    mode per connector at any given time.
0335      *  - DRM_MODE_TYPE_DRIVER: Mode created by the driver, which is all of
0336      *    them really. Drivers must set this bit for all modes they create
0337      *    and expose to userspace.
0338      *  - DRM_MODE_TYPE_USERDEF: Mode defined or selected via the kernel
0339      *    command line.
0340      *
0341      * Plus a big list of flags which shouldn't be used at all, but are
0342      * still around since these flags are also used in the userspace ABI.
0343      * We no longer accept modes with these types though:
0344      *
0345      *  - DRM_MODE_TYPE_BUILTIN: Meant for hard-coded modes, unused.
0346      *    Use DRM_MODE_TYPE_DRIVER instead.
0347      *  - DRM_MODE_TYPE_DEFAULT: Again a leftover, use
0348      *    DRM_MODE_TYPE_PREFERRED instead.
0349      *  - DRM_MODE_TYPE_CLOCK_C and DRM_MODE_TYPE_CRTC_C: Define leftovers
0350      *    which are stuck around for hysterical raisins only. No one has an
0351      *    idea what they were meant for. Don't use.
0352      */
0353     u8 type;
0354 
0355     /**
0356      * @expose_to_userspace:
0357      *
0358      * Indicates whether the mode is to be exposed to the userspace.
0359      * This is to maintain a set of exposed modes while preparing
0360      * user-mode's list in drm_mode_getconnector ioctl. The purpose of
0361      * this only lies in the ioctl function, and is not to be used
0362      * outside the function.
0363      */
0364     bool expose_to_userspace;
0365 
0366     /**
0367      * @head:
0368      *
0369      * struct list_head for mode lists.
0370      */
0371     struct list_head head;
0372 
0373     /**
0374      * @name:
0375      *
0376      * Human-readable name of the mode, filled out with drm_mode_set_name().
0377      */
0378     char name[DRM_DISPLAY_MODE_LEN];
0379 
0380     /**
0381      * @status:
0382      *
0383      * Status of the mode, used to filter out modes not supported by the
0384      * hardware. See enum &drm_mode_status.
0385      */
0386     enum drm_mode_status status;
0387 
0388     /**
0389      * @picture_aspect_ratio:
0390      *
0391      * Field for setting the HDMI picture aspect ratio of a mode.
0392      */
0393     enum hdmi_picture_aspect picture_aspect_ratio;
0394 
0395 };
0396 
0397 /**
0398  * DRM_MODE_FMT - printf string for &struct drm_display_mode
0399  */
0400 #define DRM_MODE_FMT    "\"%s\": %d %d %d %d %d %d %d %d %d %d 0x%x 0x%x"
0401 
0402 /**
0403  * DRM_MODE_ARG - printf arguments for &struct drm_display_mode
0404  * @m: display mode
0405  */
0406 #define DRM_MODE_ARG(m) \
0407     (m)->name, drm_mode_vrefresh(m), (m)->clock, \
0408     (m)->hdisplay, (m)->hsync_start, (m)->hsync_end, (m)->htotal, \
0409     (m)->vdisplay, (m)->vsync_start, (m)->vsync_end, (m)->vtotal, \
0410     (m)->type, (m)->flags
0411 
0412 #define obj_to_mode(x) container_of(x, struct drm_display_mode, base)
0413 
0414 /**
0415  * drm_mode_is_stereo - check for stereo mode flags
0416  * @mode: drm_display_mode to check
0417  *
0418  * Returns:
0419  * True if the mode is one of the stereo modes (like side-by-side), false if
0420  * not.
0421  */
0422 static inline bool drm_mode_is_stereo(const struct drm_display_mode *mode)
0423 {
0424     return mode->flags & DRM_MODE_FLAG_3D_MASK;
0425 }
0426 
0427 struct drm_connector;
0428 struct drm_cmdline_mode;
0429 
0430 struct drm_display_mode *drm_mode_create(struct drm_device *dev);
0431 void drm_mode_destroy(struct drm_device *dev, struct drm_display_mode *mode);
0432 void drm_mode_convert_to_umode(struct drm_mode_modeinfo *out,
0433                    const struct drm_display_mode *in);
0434 int drm_mode_convert_umode(struct drm_device *dev,
0435                struct drm_display_mode *out,
0436                const struct drm_mode_modeinfo *in);
0437 void drm_mode_probed_add(struct drm_connector *connector, struct drm_display_mode *mode);
0438 void drm_mode_debug_printmodeline(const struct drm_display_mode *mode);
0439 bool drm_mode_is_420_only(const struct drm_display_info *display,
0440               const struct drm_display_mode *mode);
0441 bool drm_mode_is_420_also(const struct drm_display_info *display,
0442               const struct drm_display_mode *mode);
0443 bool drm_mode_is_420(const struct drm_display_info *display,
0444              const struct drm_display_mode *mode);
0445 
0446 struct drm_display_mode *drm_cvt_mode(struct drm_device *dev,
0447                       int hdisplay, int vdisplay, int vrefresh,
0448                       bool reduced, bool interlaced,
0449                       bool margins);
0450 struct drm_display_mode *drm_gtf_mode(struct drm_device *dev,
0451                       int hdisplay, int vdisplay, int vrefresh,
0452                       bool interlaced, int margins);
0453 struct drm_display_mode *drm_gtf_mode_complex(struct drm_device *dev,
0454                           int hdisplay, int vdisplay,
0455                           int vrefresh, bool interlaced,
0456                           int margins,
0457                           int GTF_M, int GTF_2C,
0458                           int GTF_K, int GTF_2J);
0459 void drm_display_mode_from_videomode(const struct videomode *vm,
0460                      struct drm_display_mode *dmode);
0461 void drm_display_mode_to_videomode(const struct drm_display_mode *dmode,
0462                    struct videomode *vm);
0463 void drm_bus_flags_from_videomode(const struct videomode *vm, u32 *bus_flags);
0464 
0465 #if defined(CONFIG_OF)
0466 int of_get_drm_display_mode(struct device_node *np,
0467                 struct drm_display_mode *dmode, u32 *bus_flags,
0468                 int index);
0469 int of_get_drm_panel_display_mode(struct device_node *np,
0470                   struct drm_display_mode *dmode, u32 *bus_flags);
0471 #else
0472 static inline int of_get_drm_display_mode(struct device_node *np,
0473                       struct drm_display_mode *dmode,
0474                       u32 *bus_flags, int index)
0475 {
0476     return -EINVAL;
0477 }
0478 
0479 static inline int of_get_drm_panel_display_mode(struct device_node *np,
0480                         struct drm_display_mode *dmode, u32 *bus_flags)
0481 {
0482     return -EINVAL;
0483 }
0484 #endif
0485 
0486 void drm_mode_set_name(struct drm_display_mode *mode);
0487 int drm_mode_vrefresh(const struct drm_display_mode *mode);
0488 void drm_mode_get_hv_timing(const struct drm_display_mode *mode,
0489                 int *hdisplay, int *vdisplay);
0490 
0491 void drm_mode_set_crtcinfo(struct drm_display_mode *p,
0492                int adjust_flags);
0493 void drm_mode_copy(struct drm_display_mode *dst,
0494            const struct drm_display_mode *src);
0495 void drm_mode_init(struct drm_display_mode *dst,
0496            const struct drm_display_mode *src);
0497 struct drm_display_mode *drm_mode_duplicate(struct drm_device *dev,
0498                         const struct drm_display_mode *mode);
0499 bool drm_mode_match(const struct drm_display_mode *mode1,
0500             const struct drm_display_mode *mode2,
0501             unsigned int match_flags);
0502 bool drm_mode_equal(const struct drm_display_mode *mode1,
0503             const struct drm_display_mode *mode2);
0504 bool drm_mode_equal_no_clocks(const struct drm_display_mode *mode1,
0505                   const struct drm_display_mode *mode2);
0506 bool drm_mode_equal_no_clocks_no_stereo(const struct drm_display_mode *mode1,
0507                     const struct drm_display_mode *mode2);
0508 
0509 /* for use by the crtc helper probe functions */
0510 enum drm_mode_status drm_mode_validate_driver(struct drm_device *dev,
0511                           const struct drm_display_mode *mode);
0512 enum drm_mode_status drm_mode_validate_size(const struct drm_display_mode *mode,
0513                         int maxX, int maxY);
0514 enum drm_mode_status
0515 drm_mode_validate_ycbcr420(const struct drm_display_mode *mode,
0516                struct drm_connector *connector);
0517 void drm_mode_prune_invalid(struct drm_device *dev,
0518                 struct list_head *mode_list, bool verbose);
0519 void drm_mode_sort(struct list_head *mode_list);
0520 void drm_connector_list_update(struct drm_connector *connector);
0521 
0522 /* parsing cmdline modes */
0523 bool
0524 drm_mode_parse_command_line_for_connector(const char *mode_option,
0525                       const struct drm_connector *connector,
0526                       struct drm_cmdline_mode *mode);
0527 struct drm_display_mode *
0528 drm_mode_create_from_cmdline_mode(struct drm_device *dev,
0529                   struct drm_cmdline_mode *cmd);
0530 
0531 #endif /* __DRM_MODES_H__ */