On Fri, Dec 04, 2015 at 09:46:07AM +0100, Daniel Vetter wrote: [...] > diff --git a/include/drm/drm_modes.h b/include/drm/drm_modes.h [...] > @@ -96,17 +141,124 @@ enum drm_mode_status { > > #define DRM_MODE_FLAG_3D_MAX DRM_MODE_FLAG_3D_SIDE_BY_SIDE_HALF > > +/** > + * struct drm_display_mode - DRM kernel-internal display mode structure [...] > + * @crtc_hdisplay: hardware modehorizontal display size > + * @crtc_hsync_start: hardware modehorizontal sync start > + * @crtc_hsync_end: hardware modehorizontal sync end > + * @crtc_htotal: hardware modehorizontal total size > + * @crtc_hskew: hardware modehorizontal skew?! > + * @crtc_vdisplay: hardware modevertical display size > + * @crtc_vsync_start: hardware modevertical sync start > + * @crtc_vsync_end: hardware modevertical sync end > + * @crtc_vtotal: hardware modevertical total size > + * @crtc_vscan: hardware modevertical scan?! These are missing a space between "mode" and the description. > + * > + * The horizontal an vertical timings are defined per the following diagram: > + * > + * > + * Active Front Sync Back > + * Region Porch Porch > + * <-----------------------><----------------><-------------><--------------> > + * > + * //////////////////////| > + * ////////////////////// | > + * ////////////////////// |.................. ................ > + * _______________ > + * > + * <----- [hv]display -----> > + * <------------- [hv]sync_start ------------> > + * <--------------------- [hv]sync_end ---------------------> > + * <-------------------------------- [hv]total ----------------------------->* > + * > + * This structure contains two copies of timings. First are the plain timings, > + * which specify the logical mode, as it would be for a progressive 1:1 scanout > + * at the refresh rate userspace can observe through vblank timestamps. Then > + * there's the hardware timings, which are corrected for interlacing, > + * double-clocking and similar things. They are provided as a convience, and can "convenience" > + * be appropriately computed using drm_mode_set_crtcinfo(). > + */ > struct drm_display_mode { > - /* Header */ > + /** > + * @head: > + * > + * struct list_head for mode lists. > + */ > struct list_head head; > + > + /** > + * @base: > + * > + * A display mode is a normal modeset object, possibly including public > + * userspace id. > + * > + * FIXME: > + * > + * This can probably be removed since the entire concept of userspace > + * managing modes explicitly hasn't ever landed in upstream kernel mode "has never" > + * setting support. > + */ > struct drm_mode_object base; > > + /** > + * @name: > + * > + * Human-readable name of the mode, filled out with drm_mode_set_name(). > + */ > char name[DRM_DISPLAY_MODE_LEN]; > > + /** > + * @status: > + * > + * Status of the mode, used to filter out modes not supported by the > + * hardware. See enum &drm_mode_status. > + */ > enum drm_mode_status status; > + > + /** > + * @type: > + * > + * A bitmask of flags, mostly about the source of a mode. Possible flags > + * are: > + * > + * - DRM_MODE_TYPE_BUILTIN: Meant for hard-coded modes, effectively > + * unused. > + * - DRM_MODE_TYPE_PREFERRED: Preferred mode, usually the native > + * resolution of an LCD panel. There should only be one preferred > + * mode per connector at any given time. > + * - DRM_MODE_TYPE_DRIVER: Mode created by the driver, which is all of > + * them really. Drivers must set this bit for all modes they create > + * and expose to userspace. > + * > + * Plus a big list of flags which shouldn't be used at all, but are > + * still around since these flags are also used in the userspace ABI: > + * > + * - DRM_MODE_TYPE_DEFAULT: Again a leftover, use > + * DRM_MODE_TYPE_PREFERRED instead. > + * - DRM_MODE_TYPE_CLOCK_C and DRM_MODE_TYPE_CRTC_C: Define leftovers > + * which are stuck around for hysterical raisins only. No one has an > + * idea what they where meant for. Don't use. "were" > + * - DRM_MODE_TYPE_USERDEF: Mode defined by userspace, again a vestige > + * from older kms designs where userspace had to first add a custom > + * mode to the kernel's mode list before it could use it. Don't use. > + */ > unsigned int type; > > - /* Proposed mode values */ > + /** > + * @clock: > + * > + * Pixel clock in kHz. > + */ > int clock; /* in kHz */ > int hdisplay; > int hsync_start; > @@ -118,14 +270,74 @@ struct drm_display_mode { > int vsync_end; > int vtotal; > int vscan; I'm thinking that these could all use "unsigned", but that's definitely something for a separate patch. > + /** > + * @flags: > + * > + * Sync and timing flags: > + * > + * - DRM_MODE_FLAG_PHSYNC: horizontal sync is active high. > + * - DRM_MODE_FLAG_NHSYNC: horizontal sync is active low. > + * - DRM_MODE_FLAG_PVSYNC: vertical sync is active high. > + * - DRM_MODE_FLAG_NVSYNC: vertical sync is active low. > + * - DRM_MODE_FLAG_INTERLACE: mode is interlaced. > + * - DRM_MODE_FLAG_DBLSCAN: mode uses doublescan. > + * - DRM_MODE_FLAG_CSYNC: mode uses composite sync. > + * - DRM_MODE_FLAG_PCSYNC: composite sync is active high. > + * - DRM_MODE_FLAG_NCSYNC: composite sync is active low. > + * - DRM_MODE_FLAG_HSKEW: hskew provided (not used?). > + * - DRM_MODE_FLAG_BCAST: not used? > + * - DRM_MODE_FLAG_PIXMUX: not used? > + * - DRM_MODE_FLAG_DBLCLK: double-clocked mode. > + * - DRM_MODE_FLAG_CLKDIV2: half-clocked mode. > + * > + * Additionally there's flags to specify how 3D modes are packed: > + * > + * - DRM_MODE_FLAG_3D_NONE: normal, non-3D mode. > + * - DRM_MODE_FLAG_3D_FRAME_PACKING: 2 full frames for left and right. > + * - DRM_MODE_FLAG_3D_FIELD_ALTERNATIVE: interleaved like fields. > + * - DRM_MODE_FLAG_3D_LINE_ALTERNATIVE: interleaved lines. > + * - DRM_MODE_FLAG_3D_SIDE_BY_SIDE_FULL: side-by-side full frames. > + * - DRM_MODE_FLAG_3D_L_DEPTH: ? ^ Stray tab. > + * Note that with digital outputs like HDMI or DP there's usually a > + * massive confusion between the dot clock and the signal clock at the > + * bit encoding level. Especially when a 8b/10b encoding is used and the > + * differences is exactly a factor of 10. "difference" > + */ > + int crtc_clock; > int crtc_hdisplay; > int crtc_hblank_start; > int crtc_hblank_end; > @@ -140,12 +352,48 @@ struct drm_display_mode { > int crtc_vsync_end; > int crtc_vtotal; > > - /* Driver private mode info */ > + /** > + * @private: > + * > + * Pointer for driver private data. This can only be used for mode > + * objects passed to drivers in modeset operations. It shouldn't be used > + * by atomic drivers since they can store any additional data by > + * subclassing state structures. > + */ > int *private; Off-topic: Any reasons why this is int * and not void *? > + > + /** > + * @private_flags: > + * > + * Similar to @private, but just an integer. > + */ > int private_flags; > > - int vrefresh; /* in Hz */ > - int hsync; /* in kHz */ > + /** > + * @vrefresh: > + * > + * Vertical refresh rate, for debug output in human readable form. Not > + * used in a functional way. > + * > + * This value is in Hz. > + */ > + int vrefresh; > + > + /** > + * @hsync: > + * > + * Horizontal refresh rate, for debug output in human readable form. Not > + * used in a functional way. > + * > + * This value is in kHz. > + */ > + int hsync; > + > + /** > + * @picture_aspect_ratio: > + * > + * Filed for setting the HDMI picture aspect ratio of a mode. "Field". Thierry
Attachment:
signature.asc
Description: PGP signature
_______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/intel-gfx