All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/2] drm: Pretty print mode flags
@ 2019-06-20 18:50 ` Ville Syrjala
  0 siblings, 0 replies; 13+ messages in thread
From: Ville Syrjala @ 2019-06-20 18:50 UTC (permalink / raw)
  To: dri-devel
  Cc: intel-gfx, Russell King, Neil Armstrong, Rob Clark,
	Tomi Valkeinen, Thierry Reding, Sam Ravnborg, Benjamin Gaignard,
	Vincent Abriou, linux-amlogic, linux-arm-msm, freedreno,
	Ilia Mirkin

From: Ville Syrjälä <ville.syrjala@linux.intel.com>

Decode the mode flags when printing the modeline so that I
no longer have to decode the hex number myself.

To do this neatly I made the caller provide a temporary
on stack buffer where we can produce the results. I choce 64
bytes as a reasonable size for this. The worst case I think
is > 100 bytes but that kind of mode would be nonsense anyway
so I figured correct decoding isn't as important in such
cases.

Cc: Russell King <linux@armlinux.org.uk>
Cc: Neil Armstrong <narmstrong@baylibre.com>
Cc: Rob Clark <robdclark@gmail.com>
Cc: Tomi Valkeinen <tomi.valkeinen@ti.com>
Cc: Thierry Reding <thierry.reding@gmail.com>
Cc: Sam Ravnborg <sam@ravnborg.org>
Cc: Benjamin Gaignard <benjamin.gaignard@linaro.org>
Cc: Vincent Abriou <vincent.abriou@st.com>
Cc: linux-amlogic@lists.infradead.org
Cc: linux-arm-msm@vger.kernel.org
Cc: freedreno@lists.freedesktop.org
Cc: Ilia Mirkin <imirkin@alum.mit.edu>
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
---
 drivers/gpu/drm/armada/armada_crtc.c          |   3 +-
 drivers/gpu/drm/drm_atomic.c                  |   3 +-
 drivers/gpu/drm/drm_modes.c                   | 116 +++++++++++++++++-
 drivers/gpu/drm/i915/i915_debugfs.c           |   3 +-
 drivers/gpu/drm/meson/meson_dw_hdmi.c         |   3 +-
 drivers/gpu/drm/meson/meson_venc.c            |   4 +-
 drivers/gpu/drm/msm/disp/mdp4/mdp4_crtc.c     |   3 +-
 .../gpu/drm/msm/disp/mdp4/mdp4_dsi_encoder.c  |   3 +-
 .../gpu/drm/msm/disp/mdp4/mdp4_dtv_encoder.c  |   3 +-
 .../gpu/drm/msm/disp/mdp4/mdp4_lcdc_encoder.c |   3 +-
 .../gpu/drm/msm/disp/mdp5/mdp5_cmd_encoder.c  |   4 +-
 drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c     |   3 +-
 drivers/gpu/drm/msm/disp/mdp5/mdp5_encoder.c  |   3 +-
 drivers/gpu/drm/msm/dsi/dsi_manager.c         |   3 +-
 drivers/gpu/drm/msm/edp/edp_bridge.c          |   3 +-
 drivers/gpu/drm/omapdrm/omap_connector.c      |   5 +-
 drivers/gpu/drm/omapdrm/omap_crtc.c           |   3 +-
 drivers/gpu/drm/panel/panel-ronbo-rb070d30.c  |   3 +-
 drivers/gpu/drm/sti/sti_crtc.c                |   3 +-
 include/drm/drm_modes.h                       |  14 ++-
 20 files changed, 165 insertions(+), 23 deletions(-)

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__ */
-- 
2.21.0


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH 1/2] drm: Pretty print mode flags
@ 2019-06-20 18:50 ` Ville Syrjala
  0 siblings, 0 replies; 13+ messages in thread
From: Ville Syrjala @ 2019-06-20 18:50 UTC (permalink / raw)
  To: dri-devel
  Cc: freedreno, Neil Armstrong, Vincent Abriou, intel-gfx,
	Russell King, Tomi Valkeinen, Benjamin Gaignard, linux-arm-msm,
	linux-amlogic, Sam Ravnborg, Ilia Mirkin

From: Ville Syrjälä <ville.syrjala@linux.intel.com>

Decode the mode flags when printing the modeline so that I
no longer have to decode the hex number myself.

To do this neatly I made the caller provide a temporary
on stack buffer where we can produce the results. I choce 64
bytes as a reasonable size for this. The worst case I think
is > 100 bytes but that kind of mode would be nonsense anyway
so I figured correct decoding isn't as important in such
cases.

Cc: Russell King <linux@armlinux.org.uk>
Cc: Neil Armstrong <narmstrong@baylibre.com>
Cc: Rob Clark <robdclark@gmail.com>
Cc: Tomi Valkeinen <tomi.valkeinen@ti.com>
Cc: Thierry Reding <thierry.reding@gmail.com>
Cc: Sam Ravnborg <sam@ravnborg.org>
Cc: Benjamin Gaignard <benjamin.gaignard@linaro.org>
Cc: Vincent Abriou <vincent.abriou@st.com>
Cc: linux-amlogic@lists.infradead.org
Cc: linux-arm-msm@vger.kernel.org
Cc: freedreno@lists.freedesktop.org
Cc: Ilia Mirkin <imirkin@alum.mit.edu>
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
---
 drivers/gpu/drm/armada/armada_crtc.c          |   3 +-
 drivers/gpu/drm/drm_atomic.c                  |   3 +-
 drivers/gpu/drm/drm_modes.c                   | 116 +++++++++++++++++-
 drivers/gpu/drm/i915/i915_debugfs.c           |   3 +-
 drivers/gpu/drm/meson/meson_dw_hdmi.c         |   3 +-
 drivers/gpu/drm/meson/meson_venc.c            |   4 +-
 drivers/gpu/drm/msm/disp/mdp4/mdp4_crtc.c     |   3 +-
 .../gpu/drm/msm/disp/mdp4/mdp4_dsi_encoder.c  |   3 +-
 .../gpu/drm/msm/disp/mdp4/mdp4_dtv_encoder.c  |   3 +-
 .../gpu/drm/msm/disp/mdp4/mdp4_lcdc_encoder.c |   3 +-
 .../gpu/drm/msm/disp/mdp5/mdp5_cmd_encoder.c  |   4 +-
 drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c     |   3 +-
 drivers/gpu/drm/msm/disp/mdp5/mdp5_encoder.c  |   3 +-
 drivers/gpu/drm/msm/dsi/dsi_manager.c         |   3 +-
 drivers/gpu/drm/msm/edp/edp_bridge.c          |   3 +-
 drivers/gpu/drm/omapdrm/omap_connector.c      |   5 +-
 drivers/gpu/drm/omapdrm/omap_crtc.c           |   3 +-
 drivers/gpu/drm/panel/panel-ronbo-rb070d30.c  |   3 +-
 drivers/gpu/drm/sti/sti_crtc.c                |   3 +-
 include/drm/drm_modes.h                       |  14 ++-
 20 files changed, 165 insertions(+), 23 deletions(-)

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__ */
-- 
2.21.0

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH 1/2] drm: Pretty print mode flags
@ 2019-06-20 18:50 ` Ville Syrjala
  0 siblings, 0 replies; 13+ messages in thread
From: Ville Syrjala @ 2019-06-20 18:50 UTC (permalink / raw)
  To: dri-devel
  Cc: freedreno, Neil Armstrong, Vincent Abriou, intel-gfx,
	Russell King, Rob Clark, Tomi Valkeinen, Thierry Reding,
	Benjamin Gaignard, linux-arm-msm, linux-amlogic, Sam Ravnborg,
	Ilia Mirkin

From: Ville Syrjälä <ville.syrjala@linux.intel.com>

Decode the mode flags when printing the modeline so that I
no longer have to decode the hex number myself.

To do this neatly I made the caller provide a temporary
on stack buffer where we can produce the results. I choce 64
bytes as a reasonable size for this. The worst case I think
is > 100 bytes but that kind of mode would be nonsense anyway
so I figured correct decoding isn't as important in such
cases.

Cc: Russell King <linux@armlinux.org.uk>
Cc: Neil Armstrong <narmstrong@baylibre.com>
Cc: Rob Clark <robdclark@gmail.com>
Cc: Tomi Valkeinen <tomi.valkeinen@ti.com>
Cc: Thierry Reding <thierry.reding@gmail.com>
Cc: Sam Ravnborg <sam@ravnborg.org>
Cc: Benjamin Gaignard <benjamin.gaignard@linaro.org>
Cc: Vincent Abriou <vincent.abriou@st.com>
Cc: linux-amlogic@lists.infradead.org
Cc: linux-arm-msm@vger.kernel.org
Cc: freedreno@lists.freedesktop.org
Cc: Ilia Mirkin <imirkin@alum.mit.edu>
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
---
 drivers/gpu/drm/armada/armada_crtc.c          |   3 +-
 drivers/gpu/drm/drm_atomic.c                  |   3 +-
 drivers/gpu/drm/drm_modes.c                   | 116 +++++++++++++++++-
 drivers/gpu/drm/i915/i915_debugfs.c           |   3 +-
 drivers/gpu/drm/meson/meson_dw_hdmi.c         |   3 +-
 drivers/gpu/drm/meson/meson_venc.c            |   4 +-
 drivers/gpu/drm/msm/disp/mdp4/mdp4_crtc.c     |   3 +-
 .../gpu/drm/msm/disp/mdp4/mdp4_dsi_encoder.c  |   3 +-
 .../gpu/drm/msm/disp/mdp4/mdp4_dtv_encoder.c  |   3 +-
 .../gpu/drm/msm/disp/mdp4/mdp4_lcdc_encoder.c |   3 +-
 .../gpu/drm/msm/disp/mdp5/mdp5_cmd_encoder.c  |   4 +-
 drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c     |   3 +-
 drivers/gpu/drm/msm/disp/mdp5/mdp5_encoder.c  |   3 +-
 drivers/gpu/drm/msm/dsi/dsi_manager.c         |   3 +-
 drivers/gpu/drm/msm/edp/edp_bridge.c          |   3 +-
 drivers/gpu/drm/omapdrm/omap_connector.c      |   5 +-
 drivers/gpu/drm/omapdrm/omap_crtc.c           |   3 +-
 drivers/gpu/drm/panel/panel-ronbo-rb070d30.c  |   3 +-
 drivers/gpu/drm/sti/sti_crtc.c                |   3 +-
 include/drm/drm_modes.h                       |  14 ++-
 20 files changed, 165 insertions(+), 23 deletions(-)

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__ */
-- 
2.21.0


_______________________________________________
linux-amlogic mailing list
linux-amlogic@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-amlogic

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH v2 2/2] drm: Dump mode picture aspect ratio
  2019-06-20 18:50 ` Ville Syrjala
  (?)
  (?)
@ 2019-06-20 18:50 ` Ville Syrjala
  -1 siblings, 0 replies; 13+ messages in thread
From: Ville Syrjala @ 2019-06-20 18:50 UTC (permalink / raw)
  To: dri-devel; +Cc: intel-gfx, Ilia Mirkin

From: Ville Syrjälä <ville.syrjala@linux.intel.com>

Currently the logs show nothing about the mode's aspect ratio.
Include that information in the normal mode dump.

v2: Don't print anything for NONE (Ilia)

Cc: Ilia Mirkin <imirkin@alum.mit.edu>
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
---
 drivers/video/hdmi.c    | 3 ++-
 include/drm/drm_modes.h | 6 ++++--
 include/linux/hdmi.h    | 3 +++
 3 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/drivers/video/hdmi.c b/drivers/video/hdmi.c
index b939bc28d886..bc593fe1c268 100644
--- a/drivers/video/hdmi.c
+++ b/drivers/video/hdmi.c
@@ -1057,7 +1057,7 @@ static const char *hdmi_colorimetry_get_name(enum hdmi_colorimetry colorimetry)
 	return "Invalid";
 }
 
-static const char *
+const char *
 hdmi_picture_aspect_get_name(enum hdmi_picture_aspect picture_aspect)
 {
 	switch (picture_aspect) {
@@ -1076,6 +1076,7 @@ hdmi_picture_aspect_get_name(enum hdmi_picture_aspect picture_aspect)
 	}
 	return "Invalid";
 }
+EXPORT_SYMBOL(hdmi_picture_aspect_get_name);
 
 static const char *
 hdmi_active_aspect_get_name(enum hdmi_active_aspect active_aspect)
diff --git a/include/drm/drm_modes.h b/include/drm/drm_modes.h
index 3962dbf82100..0a724874fd84 100644
--- a/include/drm/drm_modes.h
+++ b/include/drm/drm_modes.h
@@ -436,7 +436,7 @@ struct drm_display_mode {
 /**
  * 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 %s"
+#define DRM_MODE_FMT    "\"%s\": %d %d %d %d %d %d %d %d %d %d 0x%x 0x%x %s %s"
 
 /**
  * DRM_MODE_ARG - printf arguments for &struct drm_display_mode
@@ -448,7 +448,9 @@ struct drm_display_mode {
 	(m)->hdisplay, (m)->hsync_start, (m)->hsync_end, (m)->htotal, \
 	(m)->vdisplay, (m)->vsync_start, (m)->vsync_end, (m)->vtotal, \
 	(m)->type, (m)->flags, \
-	drm_get_mode_flags_name(b, sizeof(b), (m)->flags)
+	drm_get_mode_flags_name(b, sizeof(b), (m)->flags), \
+	(m)->picture_aspect_ratio ? \
+	hdmi_picture_aspect_get_name((m)->picture_aspect_ratio) : ""
 
 #define obj_to_mode(x) container_of(x, struct drm_display_mode, base)
 
diff --git a/include/linux/hdmi.h b/include/linux/hdmi.h
index 9918a6c910c5..de7cbe385dba 100644
--- a/include/linux/hdmi.h
+++ b/include/linux/hdmi.h
@@ -434,4 +434,7 @@ int hdmi_infoframe_unpack(union hdmi_infoframe *frame,
 void hdmi_infoframe_log(const char *level, struct device *dev,
 			const union hdmi_infoframe *frame);
 
+const char *
+hdmi_picture_aspect_get_name(enum hdmi_picture_aspect picture_aspect);
+
 #endif /* _DRM_HDMI_H */
-- 
2.21.0

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* Re: [PATCH 1/2] drm: Pretty print mode flags
  2019-06-20 18:50 ` Ville Syrjala
  (?)
@ 2019-06-20 20:25   ` Sam Ravnborg
  -1 siblings, 0 replies; 13+ messages in thread
From: Sam Ravnborg @ 2019-06-20 20:25 UTC (permalink / raw)
  To: Ville Syrjala
  Cc: dri-devel, intel-gfx, Russell King, Neil Armstrong, Rob Clark,
	Tomi Valkeinen, Thierry Reding, Benjamin Gaignard,
	Vincent Abriou, linux-amlogic, linux-arm-msm, freedreno,
	Ilia Mirkin

Hi Ville.

On Thu, Jun 20, 2019 at 09:50:48PM +0300, Ville Syrjala wrote:
> From: Ville Syrjälä <ville.syrjala@linux.intel.com>
> 
> Decode the mode flags when printing the modeline so that I
> no longer have to decode the hex number myself.
You are extending the current way to print mode flags,
but I would anyway like to point out a different approach.

When I need to print a fourcc code it is as simple as:

{
	struct drm_format_name_buf fbuf;

	printk("My format: %s\n", drm_get_format_name(format, &fbuf);
}

This way to handle this feels more straightforward
than the current approach used for modes.

Maybe bikeshedding, as your mileage may vary.

A middle ground could be to introduce a struct for the buf so we know
the callers do it right.

Most of the code would be the same, but all call sites would need to be
updated.
What do you think?

	Sam


> 
> To do this neatly I made the caller provide a temporary
> on stack buffer where we can produce the results. I choce 64
> bytes as a reasonable size for this. The worst case I think
> is > 100 bytes but that kind of mode would be nonsense anyway
> so I figured correct decoding isn't as important in such
> cases.
> 
> Cc: Russell King <linux@armlinux.org.uk>
> Cc: Neil Armstrong <narmstrong@baylibre.com>
> Cc: Rob Clark <robdclark@gmail.com>
> Cc: Tomi Valkeinen <tomi.valkeinen@ti.com>
> Cc: Thierry Reding <thierry.reding@gmail.com>
> Cc: Sam Ravnborg <sam@ravnborg.org>
> Cc: Benjamin Gaignard <benjamin.gaignard@linaro.org>
> Cc: Vincent Abriou <vincent.abriou@st.com>
> Cc: linux-amlogic@lists.infradead.org
> Cc: linux-arm-msm@vger.kernel.org
> Cc: freedreno@lists.freedesktop.org
> Cc: Ilia Mirkin <imirkin@alum.mit.edu>
> Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
> ---
>  drivers/gpu/drm/armada/armada_crtc.c          |   3 +-
>  drivers/gpu/drm/drm_atomic.c                  |   3 +-
>  drivers/gpu/drm/drm_modes.c                   | 116 +++++++++++++++++-
>  drivers/gpu/drm/i915/i915_debugfs.c           |   3 +-
>  drivers/gpu/drm/meson/meson_dw_hdmi.c         |   3 +-
>  drivers/gpu/drm/meson/meson_venc.c            |   4 +-
>  drivers/gpu/drm/msm/disp/mdp4/mdp4_crtc.c     |   3 +-
>  .../gpu/drm/msm/disp/mdp4/mdp4_dsi_encoder.c  |   3 +-
>  .../gpu/drm/msm/disp/mdp4/mdp4_dtv_encoder.c  |   3 +-
>  .../gpu/drm/msm/disp/mdp4/mdp4_lcdc_encoder.c |   3 +-
>  .../gpu/drm/msm/disp/mdp5/mdp5_cmd_encoder.c  |   4 +-
>  drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c     |   3 +-
>  drivers/gpu/drm/msm/disp/mdp5/mdp5_encoder.c  |   3 +-
>  drivers/gpu/drm/msm/dsi/dsi_manager.c         |   3 +-
>  drivers/gpu/drm/msm/edp/edp_bridge.c          |   3 +-
>  drivers/gpu/drm/omapdrm/omap_connector.c      |   5 +-
>  drivers/gpu/drm/omapdrm/omap_crtc.c           |   3 +-
>  drivers/gpu/drm/panel/panel-ronbo-rb070d30.c  |   3 +-
>  drivers/gpu/drm/sti/sti_crtc.c                |   3 +-
>  include/drm/drm_modes.h                       |  14 ++-
>  20 files changed, 165 insertions(+), 23 deletions(-)
> 
> 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__ */
> -- 
> 2.21.0

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH 1/2] drm: Pretty print mode flags
@ 2019-06-20 20:25   ` Sam Ravnborg
  0 siblings, 0 replies; 13+ messages in thread
From: Sam Ravnborg @ 2019-06-20 20:25 UTC (permalink / raw)
  To: Ville Syrjala
  Cc: freedreno, Neil Armstrong, linux-arm-msm, intel-gfx,
	Russell King, dri-devel, Tomi Valkeinen, Benjamin Gaignard,
	linux-amlogic, Vincent Abriou, Ilia Mirkin

Hi Ville.

On Thu, Jun 20, 2019 at 09:50:48PM +0300, Ville Syrjala wrote:
> From: Ville Syrjälä <ville.syrjala@linux.intel.com>
> 
> Decode the mode flags when printing the modeline so that I
> no longer have to decode the hex number myself.
You are extending the current way to print mode flags,
but I would anyway like to point out a different approach.

When I need to print a fourcc code it is as simple as:

{
	struct drm_format_name_buf fbuf;

	printk("My format: %s\n", drm_get_format_name(format, &fbuf);
}

This way to handle this feels more straightforward
than the current approach used for modes.

Maybe bikeshedding, as your mileage may vary.

A middle ground could be to introduce a struct for the buf so we know
the callers do it right.

Most of the code would be the same, but all call sites would need to be
updated.
What do you think?

	Sam


> 
> To do this neatly I made the caller provide a temporary
> on stack buffer where we can produce the results. I choce 64
> bytes as a reasonable size for this. The worst case I think
> is > 100 bytes but that kind of mode would be nonsense anyway
> so I figured correct decoding isn't as important in such
> cases.
> 
> Cc: Russell King <linux@armlinux.org.uk>
> Cc: Neil Armstrong <narmstrong@baylibre.com>
> Cc: Rob Clark <robdclark@gmail.com>
> Cc: Tomi Valkeinen <tomi.valkeinen@ti.com>
> Cc: Thierry Reding <thierry.reding@gmail.com>
> Cc: Sam Ravnborg <sam@ravnborg.org>
> Cc: Benjamin Gaignard <benjamin.gaignard@linaro.org>
> Cc: Vincent Abriou <vincent.abriou@st.com>
> Cc: linux-amlogic@lists.infradead.org
> Cc: linux-arm-msm@vger.kernel.org
> Cc: freedreno@lists.freedesktop.org
> Cc: Ilia Mirkin <imirkin@alum.mit.edu>
> Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
> ---
>  drivers/gpu/drm/armada/armada_crtc.c          |   3 +-
>  drivers/gpu/drm/drm_atomic.c                  |   3 +-
>  drivers/gpu/drm/drm_modes.c                   | 116 +++++++++++++++++-
>  drivers/gpu/drm/i915/i915_debugfs.c           |   3 +-
>  drivers/gpu/drm/meson/meson_dw_hdmi.c         |   3 +-
>  drivers/gpu/drm/meson/meson_venc.c            |   4 +-
>  drivers/gpu/drm/msm/disp/mdp4/mdp4_crtc.c     |   3 +-
>  .../gpu/drm/msm/disp/mdp4/mdp4_dsi_encoder.c  |   3 +-
>  .../gpu/drm/msm/disp/mdp4/mdp4_dtv_encoder.c  |   3 +-
>  .../gpu/drm/msm/disp/mdp4/mdp4_lcdc_encoder.c |   3 +-
>  .../gpu/drm/msm/disp/mdp5/mdp5_cmd_encoder.c  |   4 +-
>  drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c     |   3 +-
>  drivers/gpu/drm/msm/disp/mdp5/mdp5_encoder.c  |   3 +-
>  drivers/gpu/drm/msm/dsi/dsi_manager.c         |   3 +-
>  drivers/gpu/drm/msm/edp/edp_bridge.c          |   3 +-
>  drivers/gpu/drm/omapdrm/omap_connector.c      |   5 +-
>  drivers/gpu/drm/omapdrm/omap_crtc.c           |   3 +-
>  drivers/gpu/drm/panel/panel-ronbo-rb070d30.c  |   3 +-
>  drivers/gpu/drm/sti/sti_crtc.c                |   3 +-
>  include/drm/drm_modes.h                       |  14 ++-
>  20 files changed, 165 insertions(+), 23 deletions(-)
> 
> 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__ */
> -- 
> 2.21.0
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH 1/2] drm: Pretty print mode flags
@ 2019-06-20 20:25   ` Sam Ravnborg
  0 siblings, 0 replies; 13+ messages in thread
From: Sam Ravnborg @ 2019-06-20 20:25 UTC (permalink / raw)
  To: Ville Syrjala
  Cc: freedreno, Neil Armstrong, linux-arm-msm, intel-gfx,
	Russell King, dri-devel, Rob Clark, Tomi Valkeinen,
	Thierry Reding, Benjamin Gaignard, linux-amlogic, Vincent Abriou,
	Ilia Mirkin

Hi Ville.

On Thu, Jun 20, 2019 at 09:50:48PM +0300, Ville Syrjala wrote:
> From: Ville Syrjälä <ville.syrjala@linux.intel.com>
> 
> Decode the mode flags when printing the modeline so that I
> no longer have to decode the hex number myself.
You are extending the current way to print mode flags,
but I would anyway like to point out a different approach.

When I need to print a fourcc code it is as simple as:

{
	struct drm_format_name_buf fbuf;

	printk("My format: %s\n", drm_get_format_name(format, &fbuf);
}

This way to handle this feels more straightforward
than the current approach used for modes.

Maybe bikeshedding, as your mileage may vary.

A middle ground could be to introduce a struct for the buf so we know
the callers do it right.

Most of the code would be the same, but all call sites would need to be
updated.
What do you think?

	Sam


> 
> To do this neatly I made the caller provide a temporary
> on stack buffer where we can produce the results. I choce 64
> bytes as a reasonable size for this. The worst case I think
> is > 100 bytes but that kind of mode would be nonsense anyway
> so I figured correct decoding isn't as important in such
> cases.
> 
> Cc: Russell King <linux@armlinux.org.uk>
> Cc: Neil Armstrong <narmstrong@baylibre.com>
> Cc: Rob Clark <robdclark@gmail.com>
> Cc: Tomi Valkeinen <tomi.valkeinen@ti.com>
> Cc: Thierry Reding <thierry.reding@gmail.com>
> Cc: Sam Ravnborg <sam@ravnborg.org>
> Cc: Benjamin Gaignard <benjamin.gaignard@linaro.org>
> Cc: Vincent Abriou <vincent.abriou@st.com>
> Cc: linux-amlogic@lists.infradead.org
> Cc: linux-arm-msm@vger.kernel.org
> Cc: freedreno@lists.freedesktop.org
> Cc: Ilia Mirkin <imirkin@alum.mit.edu>
> Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
> ---
>  drivers/gpu/drm/armada/armada_crtc.c          |   3 +-
>  drivers/gpu/drm/drm_atomic.c                  |   3 +-
>  drivers/gpu/drm/drm_modes.c                   | 116 +++++++++++++++++-
>  drivers/gpu/drm/i915/i915_debugfs.c           |   3 +-
>  drivers/gpu/drm/meson/meson_dw_hdmi.c         |   3 +-
>  drivers/gpu/drm/meson/meson_venc.c            |   4 +-
>  drivers/gpu/drm/msm/disp/mdp4/mdp4_crtc.c     |   3 +-
>  .../gpu/drm/msm/disp/mdp4/mdp4_dsi_encoder.c  |   3 +-
>  .../gpu/drm/msm/disp/mdp4/mdp4_dtv_encoder.c  |   3 +-
>  .../gpu/drm/msm/disp/mdp4/mdp4_lcdc_encoder.c |   3 +-
>  .../gpu/drm/msm/disp/mdp5/mdp5_cmd_encoder.c  |   4 +-
>  drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c     |   3 +-
>  drivers/gpu/drm/msm/disp/mdp5/mdp5_encoder.c  |   3 +-
>  drivers/gpu/drm/msm/dsi/dsi_manager.c         |   3 +-
>  drivers/gpu/drm/msm/edp/edp_bridge.c          |   3 +-
>  drivers/gpu/drm/omapdrm/omap_connector.c      |   5 +-
>  drivers/gpu/drm/omapdrm/omap_crtc.c           |   3 +-
>  drivers/gpu/drm/panel/panel-ronbo-rb070d30.c  |   3 +-
>  drivers/gpu/drm/sti/sti_crtc.c                |   3 +-
>  include/drm/drm_modes.h                       |  14 ++-
>  20 files changed, 165 insertions(+), 23 deletions(-)
> 
> 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__ */
> -- 
> 2.21.0

_______________________________________________
linux-amlogic mailing list
linux-amlogic@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-amlogic

^ permalink raw reply	[flat|nested] 13+ messages in thread

* ✗ Fi.CI.CHECKPATCH: warning for series starting with [1/2] drm: Pretty print mode flags
  2019-06-20 18:50 ` Ville Syrjala
                   ` (3 preceding siblings ...)
  (?)
@ 2019-06-20 22:04 ` Patchwork
  -1 siblings, 0 replies; 13+ messages in thread
From: Patchwork @ 2019-06-20 22:04 UTC (permalink / raw)
  To: Ville Syrjala; +Cc: intel-gfx

== Series Details ==

Series: series starting with [1/2] drm: Pretty print mode flags
URL   : https://patchwork.freedesktop.org/series/62475/
State : warning

== Summary ==

$ dim checkpatch origin/drm-tip
fb5a6b111c59 drm: Pretty print mode flags
-:119: ERROR:BRACKET_SPACE: space prohibited before open square bracket '['
#119: FILE: drivers/gpu/drm/drm_modes.c:84:
+#define MODE_STR(x) [DRM_MODE_FLAG_3D_ ## x >> 14] = #x

-:134: ERROR:BRACKET_SPACE: space prohibited before open square bracket '['
#134: FILE: drivers/gpu/drm/drm_modes.c:99:
+#define MODE_STR(x) [DRM_MODE_FLAG_PIC_AR_ ## x >> 19] = #x

-:522: ERROR:COMPLEX_MACRO: Macros with complex values should be enclosed in parentheses
#522: FILE: include/drm/drm_modes.h:446:
+#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, \
+	drm_get_mode_flags_name(b, sizeof(b), (m)->flags)

-:522: CHECK:MACRO_ARG_REUSE: Macro argument reuse 'm' - possible side-effects?
#522: FILE: include/drm/drm_modes.h:446:
+#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, \
+	drm_get_mode_flags_name(b, sizeof(b), (m)->flags)

-:522: CHECK:MACRO_ARG_REUSE: Macro argument reuse 'b' - possible side-effects?
#522: FILE: include/drm/drm_modes.h:446:
+#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, \
+	drm_get_mode_flags_name(b, sizeof(b), (m)->flags)

total: 3 errors, 0 warnings, 2 checks, 400 lines checked
14d66c8448d1 drm: Dump mode picture aspect ratio

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply	[flat|nested] 13+ messages in thread

* ✗ Fi.CI.SPARSE: warning for series starting with [1/2] drm: Pretty print mode flags
  2019-06-20 18:50 ` Ville Syrjala
                   ` (4 preceding siblings ...)
  (?)
@ 2019-06-20 22:06 ` Patchwork
  -1 siblings, 0 replies; 13+ messages in thread
From: Patchwork @ 2019-06-20 22:06 UTC (permalink / raw)
  To: Ville Syrjala; +Cc: intel-gfx

== Series Details ==

Series: series starting with [1/2] drm: Pretty print mode flags
URL   : https://patchwork.freedesktop.org/series/62475/
State : warning

== Summary ==

$ dim sparse origin/drm-tip
Sparse version: v0.5.2
Commit: drm: Pretty print mode flags
-drivers/gpu/drm/drm_modes.c:1910:29: warning: expression using sizeof(void)
-drivers/gpu/drm/drm_modes.c:1910:29: warning: expression using sizeof(void)
+drivers/gpu/drm/drm_modes.c:1910:29: warning: expression using sizeof(void)
+drivers/gpu/drm/drm_modes.c:1910:29: warning: expression using sizeof(void)

Commit: drm: Dump mode picture aspect ratio
Okay!

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply	[flat|nested] 13+ messages in thread

* ✓ Fi.CI.BAT: success for series starting with [1/2] drm: Pretty print mode flags
  2019-06-20 18:50 ` Ville Syrjala
                   ` (5 preceding siblings ...)
  (?)
@ 2019-06-20 22:29 ` Patchwork
  -1 siblings, 0 replies; 13+ messages in thread
From: Patchwork @ 2019-06-20 22:29 UTC (permalink / raw)
  To: Ville Syrjala; +Cc: intel-gfx

== Series Details ==

Series: series starting with [1/2] drm: Pretty print mode flags
URL   : https://patchwork.freedesktop.org/series/62475/
State : success

== Summary ==

CI Bug Log - changes from CI_DRM_6318 -> Patchwork_13374
====================================================

Summary
-------

  **SUCCESS**

  No regressions found.

  External URL: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_13374/

Known issues
------------

  Here are the changes found in Patchwork_13374 that come from known issues:

### IGT changes ###

#### Issues hit ####

  * igt@gem_busy@busy-all:
    - fi-icl-u3:          [PASS][1] -> [DMESG-WARN][2] ([fdo#107724])
   [1]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6318/fi-icl-u3/igt@gem_busy@busy-all.html
   [2]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_13374/fi-icl-u3/igt@gem_busy@busy-all.html

  * igt@i915_pm_rpm@module-reload:
    - fi-skl-6770hq:      [PASS][3] -> [FAIL][4] ([fdo#108511])
   [3]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6318/fi-skl-6770hq/igt@i915_pm_rpm@module-reload.html
   [4]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_13374/fi-skl-6770hq/igt@i915_pm_rpm@module-reload.html

  * igt@kms_frontbuffer_tracking@basic:
    - fi-hsw-peppy:       [PASS][5] -> [DMESG-WARN][6] ([fdo#102614])
   [5]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6318/fi-hsw-peppy/igt@kms_frontbuffer_tracking@basic.html
   [6]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_13374/fi-hsw-peppy/igt@kms_frontbuffer_tracking@basic.html

  
#### Possible fixes ####

  * igt@gem_exec_reloc@basic-cpu-read-noreloc:
    - fi-icl-u3:          [DMESG-WARN][7] ([fdo#107724]) -> [PASS][8] +1 similar issue
   [7]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6318/fi-icl-u3/igt@gem_exec_reloc@basic-cpu-read-noreloc.html
   [8]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_13374/fi-icl-u3/igt@gem_exec_reloc@basic-cpu-read-noreloc.html

  * igt@kms_frontbuffer_tracking@basic:
    - fi-icl-u3:          [FAIL][9] ([fdo#103167]) -> [PASS][10]
   [9]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6318/fi-icl-u3/igt@kms_frontbuffer_tracking@basic.html
   [10]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_13374/fi-icl-u3/igt@kms_frontbuffer_tracking@basic.html
    - fi-icl-u2:          [FAIL][11] ([fdo#103167]) -> [PASS][12]
   [11]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6318/fi-icl-u2/igt@kms_frontbuffer_tracking@basic.html
   [12]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_13374/fi-icl-u2/igt@kms_frontbuffer_tracking@basic.html

  
#### Warnings ####

  * igt@i915_pm_rpm@basic-pci-d3-state:
    - fi-kbl-guc:         [SKIP][13] ([fdo#109271]) -> [FAIL][14] ([fdo#107707])
   [13]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_6318/fi-kbl-guc/igt@i915_pm_rpm@basic-pci-d3-state.html
   [14]: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_13374/fi-kbl-guc/igt@i915_pm_rpm@basic-pci-d3-state.html

  
  [fdo#102614]: https://bugs.freedesktop.org/show_bug.cgi?id=102614
  [fdo#103167]: https://bugs.freedesktop.org/show_bug.cgi?id=103167
  [fdo#107707]: https://bugs.freedesktop.org/show_bug.cgi?id=107707
  [fdo#107724]: https://bugs.freedesktop.org/show_bug.cgi?id=107724
  [fdo#108511]: https://bugs.freedesktop.org/show_bug.cgi?id=108511
  [fdo#109271]: https://bugs.freedesktop.org/show_bug.cgi?id=109271


Participating hosts (52 -> 44)
------------------------------

  Missing    (8): fi-ilk-m540 fi-hsw-4200u fi-byt-j1900 fi-byt-squawks fi-bsw-cyan fi-icl-y fi-byt-clapper fi-bdw-samus 


Build changes
-------------

  * Linux: CI_DRM_6318 -> Patchwork_13374

  CI_DRM_6318: 56b793e31c67ac9e0aa1dd72c013202f38cb5174 @ git://anongit.freedesktop.org/gfx-ci/linux
  IGT_5064: 22850c1906550fb97b405c019275dcfb34be8cf7 @ git://anongit.freedesktop.org/xorg/app/intel-gpu-tools
  Patchwork_13374: 14d66c8448d1324ac890eb408e5593dad0721a28 @ git://anongit.freedesktop.org/gfx-ci/linux


== Linux commits ==

14d66c8448d1 drm: Dump mode picture aspect ratio
fb5a6b111c59 drm: Pretty print mode flags

== Logs ==

For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_13374/
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH 1/2] drm: Pretty print mode flags
@ 2019-06-24 12:37     ` Ville Syrjälä
  0 siblings, 0 replies; 13+ messages in thread
From: Ville Syrjälä @ 2019-06-24 12:37 UTC (permalink / raw)
  To: Sam Ravnborg
  Cc: dri-devel, intel-gfx, Russell King, Neil Armstrong, Rob Clark,
	Tomi Valkeinen, Thierry Reding, Benjamin Gaignard,
	Vincent Abriou, linux-amlogic, linux-arm-msm, freedreno,
	Ilia Mirkin

On Thu, Jun 20, 2019 at 10:25:42PM +0200, Sam Ravnborg wrote:
> Hi Ville.
> 
> On Thu, Jun 20, 2019 at 09:50:48PM +0300, Ville Syrjala wrote:
> > From: Ville Syrjälä <ville.syrjala@linux.intel.com>
> > 
> > Decode the mode flags when printing the modeline so that I
> > no longer have to decode the hex number myself.
> You are extending the current way to print mode flags,
> but I would anyway like to point out a different approach.
> 
> When I need to print a fourcc code it is as simple as:
> 
> {
> 	struct drm_format_name_buf fbuf;
> 
> 	printk("My format: %s\n", drm_get_format_name(format, &fbuf);
> }
> 
> This way to handle this feels more straightforward
> than the current approach used for modes.
> 
> Maybe bikeshedding, as your mileage may vary.

You're suggesting to print the whole mode to a temp buffer, and then
print that with just %s? I thought about that, but it would waste
even more stack so didn't think it was all that great.

> 
> A middle ground could be to introduce a struct for the buf so we know
> the callers do it right.

I'm not a fan of that struct approach because it forces you to use
a dedicated buffer for the thing. With just a raw char[] you can
print to anything, so it could be used more like strcat() as well.
Also I think it makes it more clear how much stack space you're
blowing away. And it looks a bit like snprintf() so it's more
clear what's happening on. Although in this case that last point
is kinda lost due to the macro thing.

> 
> Most of the code would be the same, but all call sites would need to be
> updated.
> What do you think?
> 
> 	Sam
> 
> 
> > 
> > To do this neatly I made the caller provide a temporary
> > on stack buffer where we can produce the results. I choce 64
> > bytes as a reasonable size for this. The worst case I think
> > is > 100 bytes but that kind of mode would be nonsense anyway
> > so I figured correct decoding isn't as important in such
> > cases.
> > 
> > Cc: Russell King <linux@armlinux.org.uk>
> > Cc: Neil Armstrong <narmstrong@baylibre.com>
> > Cc: Rob Clark <robdclark@gmail.com>
> > Cc: Tomi Valkeinen <tomi.valkeinen@ti.com>
> > Cc: Thierry Reding <thierry.reding@gmail.com>
> > Cc: Sam Ravnborg <sam@ravnborg.org>
> > Cc: Benjamin Gaignard <benjamin.gaignard@linaro.org>
> > Cc: Vincent Abriou <vincent.abriou@st.com>
> > Cc: linux-amlogic@lists.infradead.org
> > Cc: linux-arm-msm@vger.kernel.org
> > Cc: freedreno@lists.freedesktop.org
> > Cc: Ilia Mirkin <imirkin@alum.mit.edu>
> > Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
> > ---
> >  drivers/gpu/drm/armada/armada_crtc.c          |   3 +-
> >  drivers/gpu/drm/drm_atomic.c                  |   3 +-
> >  drivers/gpu/drm/drm_modes.c                   | 116 +++++++++++++++++-
> >  drivers/gpu/drm/i915/i915_debugfs.c           |   3 +-
> >  drivers/gpu/drm/meson/meson_dw_hdmi.c         |   3 +-
> >  drivers/gpu/drm/meson/meson_venc.c            |   4 +-
> >  drivers/gpu/drm/msm/disp/mdp4/mdp4_crtc.c     |   3 +-
> >  .../gpu/drm/msm/disp/mdp4/mdp4_dsi_encoder.c  |   3 +-
> >  .../gpu/drm/msm/disp/mdp4/mdp4_dtv_encoder.c  |   3 +-
> >  .../gpu/drm/msm/disp/mdp4/mdp4_lcdc_encoder.c |   3 +-
> >  .../gpu/drm/msm/disp/mdp5/mdp5_cmd_encoder.c  |   4 +-
> >  drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c     |   3 +-
> >  drivers/gpu/drm/msm/disp/mdp5/mdp5_encoder.c  |   3 +-
> >  drivers/gpu/drm/msm/dsi/dsi_manager.c         |   3 +-
> >  drivers/gpu/drm/msm/edp/edp_bridge.c          |   3 +-
> >  drivers/gpu/drm/omapdrm/omap_connector.c      |   5 +-
> >  drivers/gpu/drm/omapdrm/omap_crtc.c           |   3 +-
> >  drivers/gpu/drm/panel/panel-ronbo-rb070d30.c  |   3 +-
> >  drivers/gpu/drm/sti/sti_crtc.c                |   3 +-
> >  include/drm/drm_modes.h                       |  14 ++-
> >  20 files changed, 165 insertions(+), 23 deletions(-)
> > 
> > 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__ */
> > -- 
> > 2.21.0

-- 
Ville Syrjälä
Intel

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH 1/2] drm: Pretty print mode flags
@ 2019-06-24 12:37     ` Ville Syrjälä
  0 siblings, 0 replies; 13+ messages in thread
From: Ville Syrjälä @ 2019-06-24 12:37 UTC (permalink / raw)
  To: Sam Ravnborg
  Cc: freedreno-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW, Neil Armstrong,
	linux-arm-msm-u79uwXL29TY76Z2rM5mHXA,
	intel-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW, Russell King,
	dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW, Rob Clark,
	Tomi Valkeinen, Thierry Reding, Benjamin Gaignard,
	linux-amlogic-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, Vincent Abriou,
	Ilia Mirkin

On Thu, Jun 20, 2019 at 10:25:42PM +0200, Sam Ravnborg wrote:
> Hi Ville.
> 
> On Thu, Jun 20, 2019 at 09:50:48PM +0300, Ville Syrjala wrote:
> > From: Ville Syrjälä <ville.syrjala@linux.intel.com>
> > 
> > Decode the mode flags when printing the modeline so that I
> > no longer have to decode the hex number myself.
> You are extending the current way to print mode flags,
> but I would anyway like to point out a different approach.
> 
> When I need to print a fourcc code it is as simple as:
> 
> {
> 	struct drm_format_name_buf fbuf;
> 
> 	printk("My format: %s\n", drm_get_format_name(format, &fbuf);
> }
> 
> This way to handle this feels more straightforward
> than the current approach used for modes.
> 
> Maybe bikeshedding, as your mileage may vary.

You're suggesting to print the whole mode to a temp buffer, and then
print that with just %s? I thought about that, but it would waste
even more stack so didn't think it was all that great.

> 
> A middle ground could be to introduce a struct for the buf so we know
> the callers do it right.

I'm not a fan of that struct approach because it forces you to use
a dedicated buffer for the thing. With just a raw char[] you can
print to anything, so it could be used more like strcat() as well.
Also I think it makes it more clear how much stack space you're
blowing away. And it looks a bit like snprintf() so it's more
clear what's happening on. Although in this case that last point
is kinda lost due to the macro thing.

> 
> Most of the code would be the same, but all call sites would need to be
> updated.
> What do you think?
> 
> 	Sam
> 
> 
> > 
> > To do this neatly I made the caller provide a temporary
> > on stack buffer where we can produce the results. I choce 64
> > bytes as a reasonable size for this. The worst case I think
> > is > 100 bytes but that kind of mode would be nonsense anyway
> > so I figured correct decoding isn't as important in such
> > cases.
> > 
> > Cc: Russell King <linux@armlinux.org.uk>
> > Cc: Neil Armstrong <narmstrong@baylibre.com>
> > Cc: Rob Clark <robdclark@gmail.com>
> > Cc: Tomi Valkeinen <tomi.valkeinen@ti.com>
> > Cc: Thierry Reding <thierry.reding@gmail.com>
> > Cc: Sam Ravnborg <sam@ravnborg.org>
> > Cc: Benjamin Gaignard <benjamin.gaignard@linaro.org>
> > Cc: Vincent Abriou <vincent.abriou@st.com>
> > Cc: linux-amlogic@lists.infradead.org
> > Cc: linux-arm-msm@vger.kernel.org
> > Cc: freedreno@lists.freedesktop.org
> > Cc: Ilia Mirkin <imirkin@alum.mit.edu>
> > Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
> > ---
> >  drivers/gpu/drm/armada/armada_crtc.c          |   3 +-
> >  drivers/gpu/drm/drm_atomic.c                  |   3 +-
> >  drivers/gpu/drm/drm_modes.c                   | 116 +++++++++++++++++-
> >  drivers/gpu/drm/i915/i915_debugfs.c           |   3 +-
> >  drivers/gpu/drm/meson/meson_dw_hdmi.c         |   3 +-
> >  drivers/gpu/drm/meson/meson_venc.c            |   4 +-
> >  drivers/gpu/drm/msm/disp/mdp4/mdp4_crtc.c     |   3 +-
> >  .../gpu/drm/msm/disp/mdp4/mdp4_dsi_encoder.c  |   3 +-
> >  .../gpu/drm/msm/disp/mdp4/mdp4_dtv_encoder.c  |   3 +-
> >  .../gpu/drm/msm/disp/mdp4/mdp4_lcdc_encoder.c |   3 +-
> >  .../gpu/drm/msm/disp/mdp5/mdp5_cmd_encoder.c  |   4 +-
> >  drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c     |   3 +-
> >  drivers/gpu/drm/msm/disp/mdp5/mdp5_encoder.c  |   3 +-
> >  drivers/gpu/drm/msm/dsi/dsi_manager.c         |   3 +-
> >  drivers/gpu/drm/msm/edp/edp_bridge.c          |   3 +-
> >  drivers/gpu/drm/omapdrm/omap_connector.c      |   5 +-
> >  drivers/gpu/drm/omapdrm/omap_crtc.c           |   3 +-
> >  drivers/gpu/drm/panel/panel-ronbo-rb070d30.c  |   3 +-
> >  drivers/gpu/drm/sti/sti_crtc.c                |   3 +-
> >  include/drm/drm_modes.h                       |  14 ++-
> >  20 files changed, 165 insertions(+), 23 deletions(-)
> > 
> > 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__ */
> > -- 
> > 2.21.0

-- 
Ville Syrjälä
Intel
_______________________________________________
Freedreno mailing list
Freedreno@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/freedreno

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH 1/2] drm: Pretty print mode flags
@ 2019-06-24 12:37     ` Ville Syrjälä
  0 siblings, 0 replies; 13+ messages in thread
From: Ville Syrjälä @ 2019-06-24 12:37 UTC (permalink / raw)
  To: Sam Ravnborg
  Cc: freedreno, Neil Armstrong, linux-arm-msm, intel-gfx,
	Russell King, dri-devel, Rob Clark, Tomi Valkeinen,
	Thierry Reding, Benjamin Gaignard, linux-amlogic, Vincent Abriou,
	Ilia Mirkin

On Thu, Jun 20, 2019 at 10:25:42PM +0200, Sam Ravnborg wrote:
> Hi Ville.
> 
> On Thu, Jun 20, 2019 at 09:50:48PM +0300, Ville Syrjala wrote:
> > From: Ville Syrjälä <ville.syrjala@linux.intel.com>
> > 
> > Decode the mode flags when printing the modeline so that I
> > no longer have to decode the hex number myself.
> You are extending the current way to print mode flags,
> but I would anyway like to point out a different approach.
> 
> When I need to print a fourcc code it is as simple as:
> 
> {
> 	struct drm_format_name_buf fbuf;
> 
> 	printk("My format: %s\n", drm_get_format_name(format, &fbuf);
> }
> 
> This way to handle this feels more straightforward
> than the current approach used for modes.
> 
> Maybe bikeshedding, as your mileage may vary.

You're suggesting to print the whole mode to a temp buffer, and then
print that with just %s? I thought about that, but it would waste
even more stack so didn't think it was all that great.

> 
> A middle ground could be to introduce a struct for the buf so we know
> the callers do it right.

I'm not a fan of that struct approach because it forces you to use
a dedicated buffer for the thing. With just a raw char[] you can
print to anything, so it could be used more like strcat() as well.
Also I think it makes it more clear how much stack space you're
blowing away. And it looks a bit like snprintf() so it's more
clear what's happening on. Although in this case that last point
is kinda lost due to the macro thing.

> 
> Most of the code would be the same, but all call sites would need to be
> updated.
> What do you think?
> 
> 	Sam
> 
> 
> > 
> > To do this neatly I made the caller provide a temporary
> > on stack buffer where we can produce the results. I choce 64
> > bytes as a reasonable size for this. The worst case I think
> > is > 100 bytes but that kind of mode would be nonsense anyway
> > so I figured correct decoding isn't as important in such
> > cases.
> > 
> > Cc: Russell King <linux@armlinux.org.uk>
> > Cc: Neil Armstrong <narmstrong@baylibre.com>
> > Cc: Rob Clark <robdclark@gmail.com>
> > Cc: Tomi Valkeinen <tomi.valkeinen@ti.com>
> > Cc: Thierry Reding <thierry.reding@gmail.com>
> > Cc: Sam Ravnborg <sam@ravnborg.org>
> > Cc: Benjamin Gaignard <benjamin.gaignard@linaro.org>
> > Cc: Vincent Abriou <vincent.abriou@st.com>
> > Cc: linux-amlogic@lists.infradead.org
> > Cc: linux-arm-msm@vger.kernel.org
> > Cc: freedreno@lists.freedesktop.org
> > Cc: Ilia Mirkin <imirkin@alum.mit.edu>
> > Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
> > ---
> >  drivers/gpu/drm/armada/armada_crtc.c          |   3 +-
> >  drivers/gpu/drm/drm_atomic.c                  |   3 +-
> >  drivers/gpu/drm/drm_modes.c                   | 116 +++++++++++++++++-
> >  drivers/gpu/drm/i915/i915_debugfs.c           |   3 +-
> >  drivers/gpu/drm/meson/meson_dw_hdmi.c         |   3 +-
> >  drivers/gpu/drm/meson/meson_venc.c            |   4 +-
> >  drivers/gpu/drm/msm/disp/mdp4/mdp4_crtc.c     |   3 +-
> >  .../gpu/drm/msm/disp/mdp4/mdp4_dsi_encoder.c  |   3 +-
> >  .../gpu/drm/msm/disp/mdp4/mdp4_dtv_encoder.c  |   3 +-
> >  .../gpu/drm/msm/disp/mdp4/mdp4_lcdc_encoder.c |   3 +-
> >  .../gpu/drm/msm/disp/mdp5/mdp5_cmd_encoder.c  |   4 +-
> >  drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c     |   3 +-
> >  drivers/gpu/drm/msm/disp/mdp5/mdp5_encoder.c  |   3 +-
> >  drivers/gpu/drm/msm/dsi/dsi_manager.c         |   3 +-
> >  drivers/gpu/drm/msm/edp/edp_bridge.c          |   3 +-
> >  drivers/gpu/drm/omapdrm/omap_connector.c      |   5 +-
> >  drivers/gpu/drm/omapdrm/omap_crtc.c           |   3 +-
> >  drivers/gpu/drm/panel/panel-ronbo-rb070d30.c  |   3 +-
> >  drivers/gpu/drm/sti/sti_crtc.c                |   3 +-
> >  include/drm/drm_modes.h                       |  14 ++-
> >  20 files changed, 165 insertions(+), 23 deletions(-)
> > 
> > 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__ */
> > -- 
> > 2.21.0

-- 
Ville Syrjälä
Intel

_______________________________________________
linux-amlogic mailing list
linux-amlogic@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-amlogic

^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2019-06-24 12:38 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-06-20 18:50 [PATCH 1/2] drm: Pretty print mode flags Ville Syrjala
2019-06-20 18:50 ` Ville Syrjala
2019-06-20 18:50 ` Ville Syrjala
2019-06-20 18:50 ` [PATCH v2 2/2] drm: Dump mode picture aspect ratio Ville Syrjala
2019-06-20 20:25 ` [PATCH 1/2] drm: Pretty print mode flags Sam Ravnborg
2019-06-20 20:25   ` Sam Ravnborg
2019-06-20 20:25   ` Sam Ravnborg
2019-06-24 12:37   ` Ville Syrjälä
2019-06-24 12:37     ` Ville Syrjälä
2019-06-24 12:37     ` Ville Syrjälä
2019-06-20 22:04 ` ✗ Fi.CI.CHECKPATCH: warning for series starting with [1/2] " Patchwork
2019-06-20 22:06 ` ✗ Fi.CI.SPARSE: " Patchwork
2019-06-20 22:29 ` ✓ Fi.CI.BAT: success " Patchwork

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.