diff --git a/drivers/gpu/drm/armada/armada_crtc.c b/drivers/gpu/drm/armada/armada_crtc.c
index ba4a3fab7745..ce9335682bd2 100644
--- a/drivers/gpu/drm/armada/armada_crtc.c
+++ b/drivers/gpu/drm/armada/armada_crtc.c
@@ -262,6 +262,7 @@ static void armada_drm_crtc_mode_set_nofb(struct drm_crtc *crtc)
 	unsigned long flags;
 	unsigned i;
 	bool interlaced = !!(adj->flags & DRM_MODE_FLAG_INTERLACE);
+	char buf[DRM_MODE_FLAGS_BUF_LEN];
 
 	i = 0;
 	rm = adj->crtc_hsync_start - adj->crtc_hdisplay;
@@ -270,7 +271,7 @@ static void armada_drm_crtc_mode_set_nofb(struct drm_crtc *crtc)
 	tm = adj->crtc_vtotal - adj->crtc_vsync_end;
 
 	DRM_DEBUG_KMS("[CRTC:%d:%s] mode " DRM_MODE_FMT "\n",
-		      crtc->base.id, crtc->name, DRM_MODE_ARG(adj));
+		      crtc->base.id, crtc->name, DRM_MODE_ARG(adj, buf));
 	DRM_DEBUG_KMS("lm %d rm %d tm %d bm %d\n", lm, rm, tm, bm);
 
 	/* Now compute the divider for real */
diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c
index 419381abbdd1..81caf91fbd72 100644
--- a/drivers/gpu/drm/drm_atomic.c
+++ b/drivers/gpu/drm/drm_atomic.c
@@ -380,6 +380,7 @@ static void drm_atomic_crtc_print_state(struct drm_printer *p,
 		const struct drm_crtc_state *state)
 {
 	struct drm_crtc *crtc = state->crtc;
+	char buf[DRM_MODE_FLAGS_BUF_LEN];
 
 	drm_printf(p, "crtc[%u]: %s\n", crtc->base.id, crtc->name);
 	drm_printf(p, "\tenable=%d\n", state->enable);
@@ -393,7 +394,7 @@ static void drm_atomic_crtc_print_state(struct drm_printer *p,
 	drm_printf(p, "\tplane_mask=%x\n", state->plane_mask);
 	drm_printf(p, "\tconnector_mask=%x\n", state->connector_mask);
 	drm_printf(p, "\tencoder_mask=%x\n", state->encoder_mask);
-	drm_printf(p, "\tmode: " DRM_MODE_FMT "\n", DRM_MODE_ARG(&state->mode));
+	drm_printf(p, "\tmode: " DRM_MODE_FMT "\n", DRM_MODE_ARG(&state->mode, buf));
 
 	if (crtc->funcs->atomic_print_state)
 		crtc->funcs->atomic_print_state(p, state);
diff --git a/drivers/gpu/drm/drm_modes.c b/drivers/gpu/drm/drm_modes.c
index 57e6408288c8..3d15c600295a 100644
--- a/drivers/gpu/drm/drm_modes.c
+++ b/drivers/gpu/drm/drm_modes.c
@@ -45,6 +45,118 @@
 
 #include "drm_crtc_internal.h"
 
+static char *snprint_cont(char *buf, int *len,
+			  const char *str, bool last)
+{
+	int r;
+
+	r = snprintf(buf, *len, "%s%s", str, last ? "" : ",");
+	if (r >= *len)
+		return buf;
+
+	*len -= r;
+	buf += r;
+
+	return buf;
+}
+
+#define MODE_STR(x) { .name = #x, .flag = DRM_MODE_FLAG_ ## x, }
+
+static const struct {
+	const char *name;
+	u32 flag;
+} mode_flags[] = {
+	MODE_STR(PHSYNC),
+	MODE_STR(NHSYNC),
+	MODE_STR(PVSYNC),
+	MODE_STR(NVSYNC),
+	MODE_STR(INTERLACE),
+	MODE_STR(CSYNC),
+	MODE_STR(PCSYNC),
+	MODE_STR(NCSYNC),
+	MODE_STR(DBLSCAN),
+	MODE_STR(HSKEW),
+	MODE_STR(DBLCLK),
+	MODE_STR(CLKDIV2),
+};
+
+#undef MODE_STR
+#define MODE_STR(x) [DRM_MODE_FLAG_3D_ ## x >> 14] = #x
+
+static const char * const stereo_flags[] = {
+	MODE_STR(NONE),
+	MODE_STR(FRAME_PACKING),
+	MODE_STR(FIELD_ALTERNATIVE),
+	MODE_STR(LINE_ALTERNATIVE),
+	MODE_STR(SIDE_BY_SIDE_FULL),
+	MODE_STR(L_DEPTH),
+	MODE_STR(L_DEPTH_GFX_GFX_DEPTH),
+	MODE_STR(TOP_AND_BOTTOM),
+	MODE_STR(SIDE_BY_SIDE_HALF),
+};
+
+#undef MODE_STR
+#define MODE_STR(x) [DRM_MODE_FLAG_PIC_AR_ ## x >> 19] = #x
+
+static const char * const aspect_flags[] = {
+	MODE_STR(NONE),
+	MODE_STR(4_3),
+	MODE_STR(16_9),
+	MODE_STR(64_27),
+	MODE_STR(256_135),
+};
+
+#undef MODE_STR
+
+const char *drm_get_mode_flags_name(char *buf, int len, u32 flags)
+{
+	char *ptr = buf;
+	int i;
+
+	if (len == 0)
+		return buf;
+
+	buf[0] = '\0';
+
+	if (flags & DRM_MODE_FLAG_3D_MASK) {
+		int stereo = (flags & DRM_MODE_FLAG_3D_MASK) >> 14;
+
+		if (stereo < ARRAY_SIZE(stereo_flags)) {
+			flags &= ~DRM_MODE_FLAG_3D_MASK;
+			ptr = snprint_cont(ptr, &len,
+					   stereo_flags[stereo], !flags);
+		}
+	}
+
+	if (flags & DRM_MODE_FLAG_PIC_AR_MASK) {
+		int aspect = (flags & DRM_MODE_FLAG_PIC_AR_MASK) >> 19;
+
+		if (aspect < ARRAY_SIZE(aspect_flags)) {
+			flags &= ~DRM_MODE_FLAG_PIC_AR_MASK;
+			ptr = snprint_cont(ptr, &len,
+					   aspect_flags[aspect], !flags);
+		}
+	}
+
+	for (i = 0; i < ARRAY_SIZE(mode_flags); i++) {
+		u32 flag = mode_flags[i].flag;
+
+		if ((flags & flag) == 0)
+			continue;
+
+		flags &= ~flag;
+
+		ptr = snprint_cont(ptr, &len,
+				   mode_flags[i].name, !flags);
+	}
+
+	if (flags)
+		ptr = snprint_cont(ptr, &len, "?", true);
+
+	return buf;
+}
+EXPORT_SYMBOL(drm_get_mode_flags_name);
+
 /**
  * drm_mode_debug_printmodeline - print a mode to dmesg
  * @mode: mode to print
@@ -53,7 +165,9 @@
  */
 void drm_mode_debug_printmodeline(const struct drm_display_mode *mode)
 {
-	DRM_DEBUG_KMS("Modeline " DRM_MODE_FMT "\n", DRM_MODE_ARG(mode));
+	char buf[DRM_MODE_FLAGS_BUF_LEN];
+
+	DRM_DEBUG_KMS("Modeline " DRM_MODE_FMT "\n", DRM_MODE_ARG(mode, buf));
 }
 EXPORT_SYMBOL(drm_mode_debug_printmodeline);
 
diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c
index 62cf34db9280..18a3ff8e1461 100644
--- a/drivers/gpu/drm/i915/i915_debugfs.c
+++ b/drivers/gpu/drm/i915/i915_debugfs.c
@@ -2539,12 +2539,13 @@ static int i915_dmc_info(struct seq_file *m, void *unused)
 static void intel_seq_print_mode(struct seq_file *m, int tabs,
 				 struct drm_display_mode *mode)
 {
+	char buf[DRM_MODE_FLAGS_BUF_LEN];
 	int i;
 
 	for (i = 0; i < tabs; i++)
 		seq_putc(m, '\t');
 
-	seq_printf(m, DRM_MODE_FMT "\n", DRM_MODE_ARG(mode));
+	seq_printf(m, DRM_MODE_FMT "\n", DRM_MODE_ARG(mode, buf));
 }
 
 static void intel_encoder_info(struct seq_file *m,
diff --git a/drivers/gpu/drm/meson/meson_dw_hdmi.c b/drivers/gpu/drm/meson/meson_dw_hdmi.c
index df3f9ddd2234..30e53a043ba6 100644
--- a/drivers/gpu/drm/meson/meson_dw_hdmi.c
+++ b/drivers/gpu/drm/meson/meson_dw_hdmi.c
@@ -610,13 +610,14 @@ dw_hdmi_mode_valid(struct drm_connector *connector,
 		   const struct drm_display_mode *mode)
 {
 	struct meson_drm *priv = connector->dev->dev_private;
+	char buf[DRM_MODE_FLAGS_BUF_LEN];
 	unsigned int vclk_freq;
 	unsigned int venc_freq;
 	unsigned int hdmi_freq;
 	int vic = drm_match_cea_mode(mode);
 	enum drm_mode_status status;
 
-	DRM_DEBUG_DRIVER("Modeline " DRM_MODE_FMT "\n", DRM_MODE_ARG(mode));
+	DRM_DEBUG_DRIVER("Modeline " DRM_MODE_FMT "\n", DRM_MODE_ARG(mode, buf));
 
 	/* If sink max TMDS clock, we reject the mode */
 	if (connector->display_info.max_tmds_clock &&
diff --git a/drivers/gpu/drm/meson/meson_venc.c b/drivers/gpu/drm/meson/meson_venc.c
index 7b7a0d8d737c..09acbc06f9f3 100644
--- a/drivers/gpu/drm/meson/meson_venc.c
+++ b/drivers/gpu/drm/meson/meson_venc.c
@@ -987,9 +987,11 @@ void meson_venc_hdmi_mode_set(struct meson_drm *priv, int vic,
 	if (meson_venc_hdmi_supported_vic(vic)) {
 		vmode = meson_venc_hdmi_get_vic_vmode(vic);
 		if (!vmode) {
+			char buf[DRM_MODE_FLAGS_BUF_LEN];
+
 			dev_err(priv->dev, "%s: Fatal Error, unsupported mode "
 				DRM_MODE_FMT "\n", __func__,
-				DRM_MODE_ARG(mode));
+				DRM_MODE_ARG(mode, buf));
 			return;
 		}
 	} else {
diff --git a/drivers/gpu/drm/msm/disp/mdp4/mdp4_crtc.c b/drivers/gpu/drm/msm/disp/mdp4/mdp4_crtc.c
index 0cfd4c06b610..f68d9f74b0e4 100644
--- a/drivers/gpu/drm/msm/disp/mdp4/mdp4_crtc.c
+++ b/drivers/gpu/drm/msm/disp/mdp4/mdp4_crtc.c
@@ -238,6 +238,7 @@ static void mdp4_crtc_mode_set_nofb(struct drm_crtc *crtc)
 	enum mdp4_dma dma = mdp4_crtc->dma;
 	int ovlp = mdp4_crtc->ovlp;
 	struct drm_display_mode *mode;
+	char buf[DRM_MODE_FLAGS_BUF_LEN];
 
 	if (WARN_ON(!crtc->state))
 		return;
@@ -245,7 +246,7 @@ static void mdp4_crtc_mode_set_nofb(struct drm_crtc *crtc)
 	mode = &crtc->state->adjusted_mode;
 
 	DBG("%s: set mode: " DRM_MODE_FMT,
-			mdp4_crtc->name, DRM_MODE_ARG(mode));
+	    mdp4_crtc->name, DRM_MODE_ARG(mode, buf));
 
 	mdp4_write(mdp4_kms, REG_MDP4_DMA_SRC_SIZE(dma),
 			MDP4_DMA_SRC_SIZE_WIDTH(mode->hdisplay) |
diff --git a/drivers/gpu/drm/msm/disp/mdp4/mdp4_dsi_encoder.c b/drivers/gpu/drm/msm/disp/mdp4/mdp4_dsi_encoder.c
index caa39b4621e3..2e0dca4d2484 100644
--- a/drivers/gpu/drm/msm/disp/mdp4/mdp4_dsi_encoder.c
+++ b/drivers/gpu/drm/msm/disp/mdp4/mdp4_dsi_encoder.c
@@ -55,10 +55,11 @@ static void mdp4_dsi_encoder_mode_set(struct drm_encoder *encoder,
 	uint32_t dsi_hsync_skew, vsync_period, vsync_len, ctrl_pol;
 	uint32_t display_v_start, display_v_end;
 	uint32_t hsync_start_x, hsync_end_x;
+	char buf[DRM_MODE_FLAGS_BUF_LEN];
 
 	mode = adjusted_mode;
 
-	DBG("set mode: " DRM_MODE_FMT, DRM_MODE_ARG(mode));
+	DBG("set mode: " DRM_MODE_FMT, DRM_MODE_ARG(mode, buf));
 
 	ctrl_pol = 0;
 	if (mode->flags & DRM_MODE_FLAG_NHSYNC)
diff --git a/drivers/gpu/drm/msm/disp/mdp4/mdp4_dtv_encoder.c b/drivers/gpu/drm/msm/disp/mdp4/mdp4_dtv_encoder.c
index 259d51971401..e88ac070a672 100644
--- a/drivers/gpu/drm/msm/disp/mdp4/mdp4_dtv_encoder.c
+++ b/drivers/gpu/drm/msm/disp/mdp4/mdp4_dtv_encoder.c
@@ -101,10 +101,11 @@ static void mdp4_dtv_encoder_mode_set(struct drm_encoder *encoder,
 	uint32_t dtv_hsync_skew, vsync_period, vsync_len, ctrl_pol;
 	uint32_t display_v_start, display_v_end;
 	uint32_t hsync_start_x, hsync_end_x;
+	char buf[DRM_MODE_FLAGS_BUF_LEN];
 
 	mode = adjusted_mode;
 
-	DBG("set mode: " DRM_MODE_FMT, DRM_MODE_ARG(mode));
+	DBG("set mode: " DRM_MODE_FMT, DRM_MODE_ARG(mode, buf));
 
 	mdp4_dtv_encoder->pixclock = mode->clock * 1000;
 
diff --git a/drivers/gpu/drm/msm/disp/mdp4/mdp4_lcdc_encoder.c b/drivers/gpu/drm/msm/disp/mdp4/mdp4_lcdc_encoder.c
index df6f9803a1d7..99bdae9c945b 100644
--- a/drivers/gpu/drm/msm/disp/mdp4/mdp4_lcdc_encoder.c
+++ b/drivers/gpu/drm/msm/disp/mdp4/mdp4_lcdc_encoder.c
@@ -270,10 +270,11 @@ static void mdp4_lcdc_encoder_mode_set(struct drm_encoder *encoder,
 	uint32_t lcdc_hsync_skew, vsync_period, vsync_len, ctrl_pol;
 	uint32_t display_v_start, display_v_end;
 	uint32_t hsync_start_x, hsync_end_x;
+	char buf[DRM_MODE_FLAGS_BUF_LEN];
 
 	mode = adjusted_mode;
 
-	DBG("set mode: " DRM_MODE_FMT, DRM_MODE_ARG(mode));
+	DBG("set mode: " DRM_MODE_FMT, DRM_MODE_ARG(mode, buf));
 
 	mdp4_lcdc_encoder->pixclock = mode->clock * 1000;
 
diff --git a/drivers/gpu/drm/msm/disp/mdp5/mdp5_cmd_encoder.c b/drivers/gpu/drm/msm/disp/mdp5/mdp5_cmd_encoder.c
index eeef41fcd4e1..6bffbebee8bb 100644
--- a/drivers/gpu/drm/msm/disp/mdp5/mdp5_cmd_encoder.c
+++ b/drivers/gpu/drm/msm/disp/mdp5/mdp5_cmd_encoder.c
@@ -124,9 +124,11 @@ void mdp5_cmd_encoder_mode_set(struct drm_encoder *encoder,
 			       struct drm_display_mode *mode,
 			       struct drm_display_mode *adjusted_mode)
 {
+	char buf[DRM_MODE_FLAGS_BUF_LEN];
+
 	mode = adjusted_mode;
 
-	DBG("set mode: " DRM_MODE_FMT, DRM_MODE_ARG(mode));
+	DBG("set mode: " DRM_MODE_FMT, DRM_MODE_ARG(mode, buf));
 	pingpong_tearcheck_setup(encoder, mode);
 	mdp5_crtc_set_pipeline(encoder->crtc);
 }
diff --git a/drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c b/drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c
index c3751c95b452..888a25d1da8b 100644
--- a/drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c
+++ b/drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c
@@ -378,13 +378,14 @@ static void mdp5_crtc_mode_set_nofb(struct drm_crtc *crtc)
 	u32 mixer_width, val;
 	unsigned long flags;
 	struct drm_display_mode *mode;
+	char buf[DRM_MODE_FLAGS_BUF_LEN];
 
 	if (WARN_ON(!crtc->state))
 		return;
 
 	mode = &crtc->state->adjusted_mode;
 
-	DBG("%s: set mode: " DRM_MODE_FMT, crtc->name, DRM_MODE_ARG(mode));
+	DBG("%s: set mode: " DRM_MODE_FMT, crtc->name, DRM_MODE_ARG(mode, buf));
 
 	mixer_width = mode->hdisplay;
 	if (r_mixer)
diff --git a/drivers/gpu/drm/msm/disp/mdp5/mdp5_encoder.c b/drivers/gpu/drm/msm/disp/mdp5/mdp5_encoder.c
index 820a62c40063..809118bb6965 100644
--- a/drivers/gpu/drm/msm/disp/mdp5/mdp5_encoder.c
+++ b/drivers/gpu/drm/msm/disp/mdp5/mdp5_encoder.c
@@ -115,10 +115,11 @@ static void mdp5_vid_encoder_mode_set(struct drm_encoder *encoder,
 	uint32_t hsync_start_x, hsync_end_x;
 	uint32_t format = 0x2100;
 	unsigned long flags;
+	char buf[DRM_MODE_FLAGS_BUF_LEN];
 
 	mode = adjusted_mode;
 
-	DBG("set mode: " DRM_MODE_FMT, DRM_MODE_ARG(mode));
+	DBG("set mode: " DRM_MODE_FMT, DRM_MODE_ARG(mode, buf));
 
 	ctrl_pol = 0;
 
diff --git a/drivers/gpu/drm/msm/dsi/dsi_manager.c b/drivers/gpu/drm/msm/dsi/dsi_manager.c
index ec6cb0f7f206..1bf2f503b84b 100644
--- a/drivers/gpu/drm/msm/dsi/dsi_manager.c
+++ b/drivers/gpu/drm/msm/dsi/dsi_manager.c
@@ -527,8 +527,9 @@ static void dsi_mgr_bridge_mode_set(struct drm_bridge *bridge,
 	struct msm_dsi *other_dsi = dsi_mgr_get_other_dsi(id);
 	struct mipi_dsi_host *host = msm_dsi->host;
 	bool is_dual_dsi = IS_DUAL_DSI();
+	char buf[DRM_MODE_FLAGS_BUF_LEN];
 
-	DBG("set mode: " DRM_MODE_FMT, DRM_MODE_ARG(mode));
+	DBG("set mode: " DRM_MODE_FMT, DRM_MODE_ARG(mode, buf));
 
 	if (is_dual_dsi && !IS_MASTER_DSI_LINK(id))
 		return;
diff --git a/drivers/gpu/drm/msm/edp/edp_bridge.c b/drivers/gpu/drm/msm/edp/edp_bridge.c
index 2950bba4aca9..0844345862ef 100644
--- a/drivers/gpu/drm/msm/edp/edp_bridge.c
+++ b/drivers/gpu/drm/msm/edp/edp_bridge.c
@@ -51,8 +51,9 @@ static void edp_bridge_mode_set(struct drm_bridge *bridge,
 	struct drm_connector *connector;
 	struct edp_bridge *edp_bridge = to_edp_bridge(bridge);
 	struct msm_edp *edp = edp_bridge->edp;
+	char buf[DRM_MODE_FLAGS_BUF_LEN];
 
-	DBG("set mode: " DRM_MODE_FMT, DRM_MODE_ARG(mode));
+	DBG("set mode: " DRM_MODE_FMT, DRM_MODE_ARG(mode, buf));
 
 	list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
 		if ((connector->encoder != NULL) &&
diff --git a/drivers/gpu/drm/omapdrm/omap_connector.c b/drivers/gpu/drm/omapdrm/omap_connector.c
index 5967283934e1..4ce29288c70e 100644
--- a/drivers/gpu/drm/omapdrm/omap_connector.c
+++ b/drivers/gpu/drm/omapdrm/omap_connector.c
@@ -276,6 +276,7 @@ static enum drm_mode_status omap_connector_mode_valid(struct drm_connector *conn
 	struct omap_connector *omap_connector = to_omap_connector(connector);
 	struct drm_display_mode new_mode = { { 0 } };
 	enum drm_mode_status status;
+	char buf[DRM_MODE_FLAGS_BUF_LEN];
 
 	status = omap_connector_mode_fixup(omap_connector->output, mode,
 					   &new_mode);
@@ -288,8 +289,8 @@ static enum drm_mode_status omap_connector_mode_valid(struct drm_connector *conn
 
 done:
 	DBG("connector: mode %s: " DRM_MODE_FMT,
-			(status == MODE_OK) ? "valid" : "invalid",
-			DRM_MODE_ARG(mode));
+	    (status == MODE_OK) ? "valid" : "invalid",
+	    DRM_MODE_ARG(mode, buf));
 
 	return status;
 }
diff --git a/drivers/gpu/drm/omapdrm/omap_crtc.c b/drivers/gpu/drm/omapdrm/omap_crtc.c
index d61215494617..221459d6abe9 100644
--- a/drivers/gpu/drm/omapdrm/omap_crtc.c
+++ b/drivers/gpu/drm/omapdrm/omap_crtc.c
@@ -553,9 +553,10 @@ static void omap_crtc_mode_set_nofb(struct drm_crtc *crtc)
 {
 	struct omap_crtc *omap_crtc = to_omap_crtc(crtc);
 	struct drm_display_mode *mode = &crtc->state->adjusted_mode;
+	char buf[DRM_MODE_FLAGS_BUF_LEN];
 
 	DBG("%s: set mode: " DRM_MODE_FMT,
-	    omap_crtc->name, DRM_MODE_ARG(mode));
+	    omap_crtc->name, DRM_MODE_ARG(mode, buf));
 
 	drm_display_mode_to_videomode(mode, &omap_crtc->vm);
 }
diff --git a/drivers/gpu/drm/panel/panel-ronbo-rb070d30.c b/drivers/gpu/drm/panel/panel-ronbo-rb070d30.c
index 3c15764f0c03..468ebdca94f4 100644
--- a/drivers/gpu/drm/panel/panel-ronbo-rb070d30.c
+++ b/drivers/gpu/drm/panel/panel-ronbo-rb070d30.c
@@ -126,12 +126,13 @@ static int rb070d30_panel_get_modes(struct drm_panel *panel)
 	struct rb070d30_panel *ctx = panel_to_rb070d30_panel(panel);
 	struct drm_display_mode *mode;
 	static const u32 bus_format = MEDIA_BUS_FMT_RGB888_1X24;
+	char buf[DRM_MODE_FLAGS_BUF_LEN];
 
 	mode = drm_mode_duplicate(panel->drm, &default_mode);
 	if (!mode) {
 		DRM_DEV_ERROR(&ctx->dsi->dev,
 			      "Failed to add mode " DRM_MODE_FMT "\n",
-			      DRM_MODE_ARG(&default_mode));
+			      DRM_MODE_ARG(&default_mode, buf));
 		return -EINVAL;
 	}
 
diff --git a/drivers/gpu/drm/sti/sti_crtc.c b/drivers/gpu/drm/sti/sti_crtc.c
index dc64fbfc4e61..bc9602f519d7 100644
--- a/drivers/gpu/drm/sti/sti_crtc.c
+++ b/drivers/gpu/drm/sti/sti_crtc.c
@@ -54,11 +54,12 @@ sti_crtc_mode_set(struct drm_crtc *crtc, struct drm_display_mode *mode)
 	struct sti_compositor *compo = dev_get_drvdata(dev);
 	struct clk *compo_clk, *pix_clk;
 	int rate = mode->clock * 1000;
+	char buf[DRM_MODE_FLAGS_BUF_LEN];
 
 	DRM_DEBUG_KMS("CRTC:%d (%s) mode: (%s)\n",
 		      crtc->base.id, sti_mixer_to_str(mixer), mode->name);
 
-	DRM_DEBUG_KMS(DRM_MODE_FMT "\n", DRM_MODE_ARG(mode));
+	DRM_DEBUG_KMS(DRM_MODE_FMT "\n", DRM_MODE_ARG(mode, buf));
 
 	if (mixer->id == STI_MIXER_MAIN) {
 		compo_clk = compo->clk_compo_main;
diff --git a/include/drm/drm_modes.h b/include/drm/drm_modes.h
index 083f16747369..3962dbf82100 100644
--- a/include/drm/drm_modes.h
+++ b/include/drm/drm_modes.h
@@ -428,20 +428,27 @@ struct drm_display_mode {
 	struct list_head export_head;
 };
 
+/**
+ * DRM_MODE_FLAGS_BUF_LEN - reasonable size for the buffer passed to DRM_MODE_ARG()
+ */
+#define DRM_MODE_FLAGS_BUF_LEN 64
+
 /**
  * DRM_MODE_FMT - printf string for &struct drm_display_mode
  */
-#define DRM_MODE_FMT    "\"%s\": %d %d %d %d %d %d %d %d %d %d 0x%x 0x%x"
+#define DRM_MODE_FMT    "\"%s\": %d %d %d %d %d %d %d %d %d %d 0x%x 0x%x %s"
 
 /**
  * DRM_MODE_ARG - printf arguments for &struct drm_display_mode
  * @m: display mode
+ * @b: buffer for temporary string
  */
-#define DRM_MODE_ARG(m) \
+#define DRM_MODE_ARG(m, b) \
 	(m)->name, (m)->vrefresh, (m)->clock, \
 	(m)->hdisplay, (m)->hsync_start, (m)->hsync_end, (m)->htotal, \
 	(m)->vdisplay, (m)->vsync_start, (m)->vsync_end, (m)->vtotal, \
-	(m)->type, (m)->flags
+	(m)->type, (m)->flags, \
+	drm_get_mode_flags_name(b, sizeof(b), (m)->flags)
 
 #define obj_to_mode(x) container_of(x, struct drm_display_mode, base)
 
@@ -542,5 +549,6 @@ drm_mode_parse_command_line_for_connector(const char *mode_option,
 struct drm_display_mode *
 drm_mode_create_from_cmdline_mode(struct drm_device *dev,
 				  struct drm_cmdline_mode *cmd);
+const char *drm_get_mode_flags_name(char *buf, int len, u32 flags);
 
 #endif /* __DRM_MODES_H__ */
