STRUCT DRM_DISPLAY_MODE(9)
π struct drm_display_mode(9) π
okay bestie, welcome to the Kernel API Manual entry for struct drm_display_mode(9) β this is literally the DRM kernel-internal display mode structure, and she has a lot of fields. π
πΈ NAME πΈ
struct drm_display_mode β the DRM kernel-internal display mode structure. That's the name, that's the vibe, no notes. π
β¨ SYNOPSIS β¨
okay here's the whole struct, character for character, no edits from me:
struct drm_display_mode {
int clock;
u16 hdisplay;
u16 hsync_start;
u16 hsync_end;
u16 htotal;
u16 hskew;
u16 vdisplay;
u16 vsync_start;
u16 vsync_end;
u16 vtotal;
u16 vscan;
u32 flags;
int crtc_clock;
u16 crtc_hdisplay;
u16 crtc_hblank_start;
u16 crtc_hblank_end;
u16 crtc_hsync_start;
u16 crtc_hsync_end;
u16 crtc_htotal;
u16 crtc_hskew;
u16 crtc_vdisplay;
u16 crtc_vblank_start;
u16 crtc_vblank_end;
u16 crtc_vsync_start;
u16 crtc_vsync_end;
u16 crtc_vtotal;
u16 width_mm;
u16 height_mm;
u8 type;
bool expose_to_userspace;
struct list_head head;
char name[DRM_DISPLAY_MODE_LEN];
enum drm_mode_status status;
enum hdmi_picture_aspect picture_aspect_ratio;
};
π Members π
okay, member-by-member tour, because literally every single one is invited to the group chat:
clockβ pixel clock in kHz. β°hdisplayβ horizontal display size.hsync_startβ horizontal sync start.hsync_endβ horizontal sync end.htotalβ horizontal total size.hskewβ horizontal skew?! πvdisplayβ vertical display size.vsync_startβ vertical sync start.vsync_endβ vertical sync end.vtotalβ vertical total size.vscanβ vertical scan?! πflagsβ sync and timing flags, bestie: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: <deprecated>DRM_MODE_FLAG_PIXMUX: <deprecated>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: ?DRM_MODE_FLAG_3D_L_DEPTH_GFX_GFX_DEPTH: ?DRM_MODE_FLAG_3D_TOP_AND_BOTTOM: frame split into top and bottom parts.DRM_MODE_FLAG_3D_SIDE_BY_SIDE_HALF: frame split into left and right parts.
crtc_clockβ actual pixel or dot clock in the hardware. This differs from the logical clock when e.g. using interlacing, double-clocking, stereo modes or other fancy stuff that changes the timings and signals actually sent over the wire.
This is again in kHz.
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 difference is exactly a factor of 10. π
crtc_hdisplayβ hardware mode horizontal display size.crtc_hblank_startβ hardware mode horizontal blank start.crtc_hblank_endβ hardware mode horizontal blank end.crtc_hsync_startβ hardware mode horizontal sync start.crtc_hsync_endβ hardware mode horizontal sync end.crtc_htotalβ hardware mode horizontal total size.crtc_hskewβ hardware mode horizontal skew?! π«crtc_vdisplayβ hardware mode vertical display size.crtc_vblank_startβ hardware mode vertical blank start.crtc_vblank_endβ hardware mode vertical blank end.crtc_vsync_startβ hardware mode vertical sync start.crtc_vsync_endβ hardware mode vertical sync end.crtc_vtotalβ hardware mode vertical total size.width_mmβ addressable size of the output in mm, projectors should set this to 0.height_mmβ addressable size of the output in mm, projectors should set this to 0.typeβ a bitmask of flags, mostly about the source of a mode. Possible flags are: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.DRM_MODE_TYPE_USERDEF: mode defined or selected via the kernel command line.
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. We no longer accept modes with these types though:
DRM_MODE_TYPE_BUILTIN: meant for hard-coded modes, unused. UseDRM_MODE_TYPE_DRIVERinstead.DRM_MODE_TYPE_DEFAULT: again a leftover, useDRM_MODE_TYPE_PREFERREDinstead.DRM_MODE_TYPE_CLOCK_CandDRM_MODE_TYPE_CRTC_C: define leftovers which are stuck around for hysterical raisins only. No one has an idea what they were meant for. Don't use. π
expose_to_userspaceβ indicates whether the mode is to be exposed to the userspace. This is to maintain a set of exposed modes while preparing user-mode's list indrm_mode_getconnectorioctl. The purpose of this only lies in the ioctl function, and is not to be used outside the function. πheadβstruct list_headfor mode lists.nameβ human-readable name of the mode, filled out withdrm_mode_set_name.statusβ status of the mode, used to filter out modes not supported by the hardware. Seeenum drm_mode_status.picture_aspect_ratioβ field for setting the HDMI picture aspect ratio of a mode.
π¦ Description π¦
This is the kernel API display mode information structure. For the user-space version see struct drm_mode_modeinfo. β¨
The horizontal and 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 convenience, and can be appropriately computed using drm_mode_set_crtcinfo. π§
For printing you can use DRM_MODE_FMT and DRM_MODE_ARG.
π SEE ALSO π
- Kernel file
./include/drm/drm_modes.h enum drm_mode_status(9)DRM_MODE_RES_MM(9)DRM_MODE_INIT(9)DRM_SIMPLE_MODE(9)DRM_MODE_FMT(9)DRM_MODE_ARG(9)drm_mode_is_stereo(9)
okay that's a wrap, bestie β this page lives under ./include/drm, it's dated October 2026, and it's the struct drm_display_mode(9) manual entry. mwah ππ«Ά
π¦ where this page comes from
- nixpkgs unstable: linux-manual 7.3.1
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms