All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/6] imx-drm: ipuv3-crtc: Implement mode_fixup
@ 2014-12-16  0:29 slongerbeam
  2014-12-16  0:29 ` [PATCH 1/6] gpu: ipu-di: Add ipu_di_adjust_videomode() slongerbeam
                   ` (6 more replies)
  0 siblings, 7 replies; 14+ messages in thread
From: slongerbeam @ 2014-12-16  0:29 UTC (permalink / raw)
  To: dri-devel; +Cc: Steve Longerbeam

From: Steve Longerbeam <steve_longerbeam@mentor.com>

This patchset implements ->mode_fixup() in the imx ipuv3-crtc driver,
using a new support function ipu_di_adjust_videomode(). This new
function needs to be subsystem independent, so it accepts a video
mode as a 'struct videomode'. Hence ipu-crtc ->mode_fixup() needs
another support function to convert a drm_display_mode to a videomode
before passing the mode to ipu_di_adjust_videomode() for fixup.

Also some related code cleanup: 'struct ipu_di_signal_cfg' should
use 'struct videomode' for mode timings.

Jiada Wang (1):
  gpu: ipu-di: Add ipu_di_adjust_videomode()

Steve Longerbeam (5):
  gpu: ipu-di: remove some non-functional code
  drm_modes: add videomode_from_drm_display_mode
  imx-drm: ipuv3-crtc: Implement mode_fixup
  imx-drm: encoder mode_set must use adjusted mode
  gpu: ipu-v3: Use videomode in struct ipu_di_signal_cfg

 drivers/gpu/drm/drm_modes.c            |   40 +++++++++++
 drivers/gpu/drm/imx/imx-hdmi.c         |    4 +-
 drivers/gpu/drm/imx/imx-ldb.c          |    4 +-
 drivers/gpu/drm/imx/imx-tve.c          |    4 +-
 drivers/gpu/drm/imx/ipuv3-crtc.c       |   39 +++++-----
 drivers/gpu/drm/imx/parallel-display.c |    4 +-
 drivers/gpu/ipu-v3/ipu-di.c            |  124 ++++++++++++++++++++------------
 include/drm/drm_modes.h                |    2 +
 include/video/imx-ipu-v3.h             |   21 ++----
 9 files changed, 150 insertions(+), 92 deletions(-)

-- 
1.7.9.5

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel

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

* [PATCH 1/6] gpu: ipu-di: Add ipu_di_adjust_videomode()
  2014-12-16  0:29 [PATCH 0/6] imx-drm: ipuv3-crtc: Implement mode_fixup slongerbeam
@ 2014-12-16  0:29 ` slongerbeam
  2014-12-17 12:27   ` Fabio Estevam
  2014-12-16  0:29 ` [PATCH 2/6] gpu: ipu-di: remove some non-functional code slongerbeam
                   ` (5 subsequent siblings)
  6 siblings, 1 reply; 14+ messages in thread
From: slongerbeam @ 2014-12-16  0:29 UTC (permalink / raw)
  To: dri-devel; +Cc: Deepak Das, Steve Longerbeam

From: Jiada Wang <jiada_wang@mentor.com>

On some monitors, high resolution modes are not working, exhibiting
pixel column truncation problems (for example, 1280x1024 displays as
1280x1022).

The function ipu_di_adjust_videomode() aims to fix these issues by
adjusting a passed videomode to IPU restrictions. The function can
be called from the drm_crtc_helper_funcs->mode_fixup() methods.

Signed-off-by: Jiada Wang <jiada_wang@mentor.com>
Signed-off-by: Deepak Das <deepak_das@mentor.com>
Signed-off-by: Steve Longerbeam <steve_longerbeam@mentor.com>
---
 drivers/gpu/ipu-v3/ipu-di.c |   29 +++++++++++++++++++++++++++++
 include/video/imx-ipu-v3.h  |    2 ++
 2 files changed, 31 insertions(+)

diff --git a/drivers/gpu/ipu-v3/ipu-di.c b/drivers/gpu/ipu-v3/ipu-di.c
index c490ba4..46f9570 100644
--- a/drivers/gpu/ipu-v3/ipu-di.c
+++ b/drivers/gpu/ipu-v3/ipu-di.c
@@ -511,6 +511,35 @@ static void ipu_di_config_clock(struct ipu_di *di,
 		clk_get_rate(di->clk_di_pixel) / (clkgen0 >> 4));
 }
 
+/*
+ * This function is called to adjust a video mode to IPU restrictions.
+ * It is meant to be called from drm crtc mode_fixup() methods.
+ */
+int ipu_di_adjust_videomode(struct ipu_di *di, struct videomode *mode)
+{
+	u32 diff;
+
+	if (mode->vfront_porch >= 2)
+		return 0;
+
+	diff = 2 - mode->vfront_porch;
+
+	if (mode->vback_porch >= diff) {
+		mode->vfront_porch = 2;
+		mode->vback_porch -= diff;
+	} else if (mode->vsync_len > diff) {
+		mode->vfront_porch = 2;
+		mode->vsync_len = mode->vsync_len - diff;
+	} else {
+		dev_warn(di->ipu->dev, "failed to adjust videomode\n");
+		return -EINVAL;
+	}
+
+	dev_warn(di->ipu->dev, "videomode adapted for IPU restrictions\n");
+	return 0;
+}
+EXPORT_SYMBOL_GPL(ipu_di_adjust_videomode);
+
 int ipu_di_init_sync_panel(struct ipu_di *di, struct ipu_di_signal_cfg *sig)
 {
 	u32 reg;
diff --git a/include/video/imx-ipu-v3.h b/include/video/imx-ipu-v3.h
index c74bf4a..d333d54 100644
--- a/include/video/imx-ipu-v3.h
+++ b/include/video/imx-ipu-v3.h
@@ -17,6 +17,7 @@
 #include <linux/bitmap.h>
 #include <linux/fb.h>
 #include <media/v4l2-mediabus.h>
+#include <video/videomode.h>
 
 struct ipu_soc;
 
@@ -236,6 +237,7 @@ void ipu_di_put(struct ipu_di *);
 int ipu_di_disable(struct ipu_di *);
 int ipu_di_enable(struct ipu_di *);
 int ipu_di_get_num(struct ipu_di *);
+int ipu_di_adjust_videomode(struct ipu_di *di, struct videomode *mode);
 int ipu_di_init_sync_panel(struct ipu_di *, struct ipu_di_signal_cfg *sig);
 
 /*
-- 
1.7.9.5

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel

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

* [PATCH 2/6] gpu: ipu-di: remove some non-functional code
  2014-12-16  0:29 [PATCH 0/6] imx-drm: ipuv3-crtc: Implement mode_fixup slongerbeam
  2014-12-16  0:29 ` [PATCH 1/6] gpu: ipu-di: Add ipu_di_adjust_videomode() slongerbeam
@ 2014-12-16  0:29 ` slongerbeam
  2014-12-16  0:29 ` [PATCH 3/6] drm_modes: add videomode_from_drm_display_mode slongerbeam
                   ` (4 subsequent siblings)
  6 siblings, 0 replies; 14+ messages in thread
From: slongerbeam @ 2014-12-16  0:29 UTC (permalink / raw)
  To: dri-devel; +Cc: Steve Longerbeam

From: Steve Longerbeam <steve_longerbeam@mentor.com>

h_total and v_total were calculated in ipu_di_init_sync_panel()
but never actually used. Remove.

Signed-off-by: Steve Longerbeam <steve_longerbeam@mentor.com>
---
 drivers/gpu/ipu-v3/ipu-di.c |    6 ------
 1 file changed, 6 deletions(-)

diff --git a/drivers/gpu/ipu-v3/ipu-di.c b/drivers/gpu/ipu-v3/ipu-di.c
index 46f9570..41df8d7 100644
--- a/drivers/gpu/ipu-v3/ipu-di.c
+++ b/drivers/gpu/ipu-v3/ipu-di.c
@@ -545,7 +545,6 @@ int ipu_di_init_sync_panel(struct ipu_di *di, struct ipu_di_signal_cfg *sig)
 	u32 reg;
 	u32 di_gen, vsync_cnt;
 	u32 div;
-	u32 h_total, v_total;
 
 	dev_dbg(di->ipu->dev, "disp %d: panel size = %d x %d\n",
 		di->id, sig->width, sig->height);
@@ -553,11 +552,6 @@ int ipu_di_init_sync_panel(struct ipu_di *di, struct ipu_di_signal_cfg *sig)
 	if ((sig->v_sync_width == 0) || (sig->h_sync_width == 0))
 		return -EINVAL;
 
-	h_total = sig->width + sig->h_sync_width + sig->h_start_width +
-		sig->h_end_width;
-	v_total = sig->height + sig->v_sync_width + sig->v_start_width +
-		sig->v_end_width;
-
 	dev_dbg(di->ipu->dev, "Clocks: IPU %luHz DI %luHz Needed %luHz\n",
 		clk_get_rate(di->clk_ipu),
 		clk_get_rate(di->clk_di),
-- 
1.7.9.5

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel

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

* [PATCH 3/6] drm_modes: add videomode_from_drm_display_mode
  2014-12-16  0:29 [PATCH 0/6] imx-drm: ipuv3-crtc: Implement mode_fixup slongerbeam
  2014-12-16  0:29 ` [PATCH 1/6] gpu: ipu-di: Add ipu_di_adjust_videomode() slongerbeam
  2014-12-16  0:29 ` [PATCH 2/6] gpu: ipu-di: remove some non-functional code slongerbeam
@ 2014-12-16  0:29 ` slongerbeam
  2014-12-16  0:29 ` [PATCH 4/6] imx-drm: ipuv3-crtc: Implement mode_fixup slongerbeam
                   ` (3 subsequent siblings)
  6 siblings, 0 replies; 14+ messages in thread
From: slongerbeam @ 2014-12-16  0:29 UTC (permalink / raw)
  To: dri-devel; +Cc: Steve Longerbeam

From: Steve Longerbeam <steve_longerbeam@mentor.com>

Add conversion from drm_display_mode to videomode.

Signed-off-by: Steve Longerbeam <steve_longerbeam@mentor.com>
---
 drivers/gpu/drm/drm_modes.c |   40 ++++++++++++++++++++++++++++++++++++++++
 include/drm/drm_modes.h     |    2 ++
 2 files changed, 42 insertions(+)

diff --git a/drivers/gpu/drm/drm_modes.c b/drivers/gpu/drm/drm_modes.c
index 6d8b941..583a391 100644
--- a/drivers/gpu/drm/drm_modes.c
+++ b/drivers/gpu/drm/drm_modes.c
@@ -615,6 +615,46 @@ void drm_display_mode_from_videomode(const struct videomode *vm,
 }
 EXPORT_SYMBOL_GPL(drm_display_mode_from_videomode);
 
+/**
+ * videomode_from_drm_display_mode - fill in @vm using @dmode,
+ * @dmode: drm_display_mode structure to use as source
+ * @vm: videomode structure to use as destination
+ *
+ * Fills out @vm using the display mode specified in @dmode.
+ */
+void videomode_from_drm_display_mode(const struct drm_display_mode *dmode,
+				     struct videomode *vm)
+{
+	vm->hactive = dmode->hdisplay;
+	vm->hfront_porch = dmode->hsync_start - dmode->hdisplay;
+	vm->hsync_len = dmode->hsync_end - dmode->hsync_start;
+	vm->hback_porch = dmode->htotal - dmode->hsync_end;
+
+	vm->vactive = dmode->vdisplay;
+	vm->vfront_porch = dmode->vsync_start - dmode->vdisplay;
+	vm->vsync_len = dmode->vsync_end - dmode->vsync_start;
+	vm->vback_porch = dmode->vtotal - dmode->vsync_end;
+
+	vm->pixelclock = dmode->clock * 1000;
+
+	vm->flags = 0;
+	if (dmode->flags & DRM_MODE_FLAG_PHSYNC)
+		vm->flags |= DISPLAY_FLAGS_HSYNC_HIGH;
+	else if (dmode->flags & DRM_MODE_FLAG_NHSYNC)
+		vm->flags |= DISPLAY_FLAGS_HSYNC_LOW;
+	if (dmode->flags & DRM_MODE_FLAG_PVSYNC)
+		vm->flags |= DISPLAY_FLAGS_VSYNC_HIGH;
+	else if (dmode->flags & DRM_MODE_FLAG_NVSYNC)
+		vm->flags |= DISPLAY_FLAGS_VSYNC_LOW;
+	if (dmode->flags & DRM_MODE_FLAG_INTERLACE)
+		vm->flags |= DISPLAY_FLAGS_INTERLACED;
+	if (dmode->flags & DRM_MODE_FLAG_DBLSCAN)
+		vm->flags |= DISPLAY_FLAGS_DOUBLESCAN;
+	if (dmode->flags & DRM_MODE_FLAG_DBLCLK)
+		vm->flags |= DISPLAY_FLAGS_DOUBLECLK;
+}
+EXPORT_SYMBOL_GPL(videomode_from_drm_display_mode);
+
 #ifdef CONFIG_OF
 /**
  * of_get_drm_display_mode - get a drm_display_mode from devicetree
diff --git a/include/drm/drm_modes.h b/include/drm/drm_modes.h
index 91d0582..60c0144 100644
--- a/include/drm/drm_modes.h
+++ b/include/drm/drm_modes.h
@@ -197,6 +197,8 @@ struct drm_display_mode *drm_gtf_mode_complex(struct drm_device *dev,
 					      int GTF_K, int GTF_2J);
 void drm_display_mode_from_videomode(const struct videomode *vm,
 				     struct drm_display_mode *dmode);
+void videomode_from_drm_display_mode(const struct drm_display_mode *dmode,
+				     struct videomode *vm);
 int of_get_drm_display_mode(struct device_node *np,
 			    struct drm_display_mode *dmode,
 			    int index);
-- 
1.7.9.5

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel

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

* [PATCH 4/6] imx-drm: ipuv3-crtc: Implement mode_fixup
  2014-12-16  0:29 [PATCH 0/6] imx-drm: ipuv3-crtc: Implement mode_fixup slongerbeam
                   ` (2 preceding siblings ...)
  2014-12-16  0:29 ` [PATCH 3/6] drm_modes: add videomode_from_drm_display_mode slongerbeam
@ 2014-12-16  0:29 ` slongerbeam
  2014-12-16  0:29 ` [PATCH 5/6] imx-drm: encoder mode_set must use adjusted mode slongerbeam
                   ` (2 subsequent siblings)
  6 siblings, 0 replies; 14+ messages in thread
From: slongerbeam @ 2014-12-16  0:29 UTC (permalink / raw)
  To: dri-devel; +Cc: Steve Longerbeam

From: Steve Longerbeam <steve_longerbeam@mentor.com>

Ask the IPU display interface, via ipu_di_adjust_videomode(), to
adjust a video mode to meet any DI restrictions. The function takes
a subsystem independent videomode, so the drm_display_mode must be
converted to videomode first, and then the adjusted mode converted
back to a drm_display_mode.

Signed-off-by: Steve Longerbeam <steve_longerbeam@mentor.com>
---
 drivers/gpu/drm/imx/ipuv3-crtc.c |   12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/drivers/gpu/drm/imx/ipuv3-crtc.c b/drivers/gpu/drm/imx/ipuv3-crtc.c
index 11e84a2..fb16026 100644
--- a/drivers/gpu/drm/imx/ipuv3-crtc.c
+++ b/drivers/gpu/drm/imx/ipuv3-crtc.c
@@ -242,6 +242,18 @@ static bool ipu_crtc_mode_fixup(struct drm_crtc *crtc,
 				  const struct drm_display_mode *mode,
 				  struct drm_display_mode *adjusted_mode)
 {
+	struct ipu_crtc *ipu_crtc = to_ipu_crtc(crtc);
+	struct videomode vm;
+	int ret;
+
+	videomode_from_drm_display_mode(adjusted_mode, &vm);
+
+	ret = ipu_di_adjust_videomode(ipu_crtc->di, &vm);
+	if (ret)
+		return false;
+
+	drm_display_mode_from_videomode(&vm, adjusted_mode);
+
 	return true;
 }
 
-- 
1.7.9.5

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel

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

* [PATCH 5/6] imx-drm: encoder mode_set must use adjusted mode
  2014-12-16  0:29 [PATCH 0/6] imx-drm: ipuv3-crtc: Implement mode_fixup slongerbeam
                   ` (3 preceding siblings ...)
  2014-12-16  0:29 ` [PATCH 4/6] imx-drm: ipuv3-crtc: Implement mode_fixup slongerbeam
@ 2014-12-16  0:29 ` slongerbeam
  2014-12-17 14:03   ` Philipp Zabel
  2014-12-16  0:29 ` [PATCH 6/6] gpu: ipu-v3: Use videomode in struct ipu_di_signal_cfg slongerbeam
  2014-12-17 14:18 ` [PATCH 0/6] imx-drm: ipuv3-crtc: Implement mode_fixup Philipp Zabel
  6 siblings, 1 reply; 14+ messages in thread
From: slongerbeam @ 2014-12-16  0:29 UTC (permalink / raw)
  To: dri-devel; +Cc: Steve Longerbeam

From: Steve Longerbeam <steve_longerbeam@mentor.com>

The encoder ->mode_set() methods need to use the hw adjusted mode,
not the original mode.

Signed-off-by: Steve Longerbeam <steve_longerbeam@mentor.com>
---
 drivers/gpu/drm/imx/imx-hdmi.c         |    4 ++--
 drivers/gpu/drm/imx/imx-ldb.c          |    4 ++--
 drivers/gpu/drm/imx/imx-tve.c          |    4 ++--
 drivers/gpu/drm/imx/parallel-display.c |    4 ++--
 4 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/imx/imx-hdmi.c b/drivers/gpu/drm/imx/imx-hdmi.c
index aaec6b2..32116cc 100644
--- a/drivers/gpu/drm/imx/imx-hdmi.c
+++ b/drivers/gpu/drm/imx/imx-hdmi.c
@@ -1417,8 +1417,8 @@ static struct drm_encoder *imx_hdmi_connector_best_encoder(struct drm_connector
 }
 
 static void imx_hdmi_encoder_mode_set(struct drm_encoder *encoder,
-			struct drm_display_mode *mode,
-			struct drm_display_mode *adjusted_mode)
+			struct drm_display_mode *orig_mode,
+			struct drm_display_mode *mode)
 {
 	struct imx_hdmi *hdmi = container_of(encoder, struct imx_hdmi, encoder);
 
diff --git a/drivers/gpu/drm/imx/imx-ldb.c b/drivers/gpu/drm/imx/imx-ldb.c
index 4662e00..a88c0e1 100644
--- a/drivers/gpu/drm/imx/imx-ldb.c
+++ b/drivers/gpu/drm/imx/imx-ldb.c
@@ -246,8 +246,8 @@ static void imx_ldb_encoder_commit(struct drm_encoder *encoder)
 }
 
 static void imx_ldb_encoder_mode_set(struct drm_encoder *encoder,
-			 struct drm_display_mode *mode,
-			 struct drm_display_mode *adjusted_mode)
+			 struct drm_display_mode *orig_mode,
+			 struct drm_display_mode *mode)
 {
 	struct imx_ldb_channel *imx_ldb_ch = enc_to_imx_ldb_ch(encoder);
 	struct imx_ldb *ldb = imx_ldb_ch->ldb;
diff --git a/drivers/gpu/drm/imx/imx-tve.c b/drivers/gpu/drm/imx/imx-tve.c
index 42c651b..9709bf9a 100644
--- a/drivers/gpu/drm/imx/imx-tve.c
+++ b/drivers/gpu/drm/imx/imx-tve.c
@@ -312,8 +312,8 @@ static void imx_tve_encoder_prepare(struct drm_encoder *encoder)
 }
 
 static void imx_tve_encoder_mode_set(struct drm_encoder *encoder,
-				     struct drm_display_mode *mode,
-				     struct drm_display_mode *adjusted_mode)
+				     struct drm_display_mode *orig_mode,
+				     struct drm_display_mode *mode)
 {
 	struct imx_tve *tve = enc_to_tve(encoder);
 	unsigned long rounded_rate;
diff --git a/drivers/gpu/drm/imx/parallel-display.c b/drivers/gpu/drm/imx/parallel-display.c
index 015a454..d0842a4 100644
--- a/drivers/gpu/drm/imx/parallel-display.c
+++ b/drivers/gpu/drm/imx/parallel-display.c
@@ -131,8 +131,8 @@ static void imx_pd_encoder_commit(struct drm_encoder *encoder)
 }
 
 static void imx_pd_encoder_mode_set(struct drm_encoder *encoder,
-			 struct drm_display_mode *mode,
-			 struct drm_display_mode *adjusted_mode)
+			 struct drm_display_mode *orig_mode,
+			 struct drm_display_mode *mode)
 {
 }
 
-- 
1.7.9.5

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel

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

* [PATCH 6/6] gpu: ipu-v3: Use videomode in struct ipu_di_signal_cfg
  2014-12-16  0:29 [PATCH 0/6] imx-drm: ipuv3-crtc: Implement mode_fixup slongerbeam
                   ` (4 preceding siblings ...)
  2014-12-16  0:29 ` [PATCH 5/6] imx-drm: encoder mode_set must use adjusted mode slongerbeam
@ 2014-12-16  0:29 ` slongerbeam
  2014-12-17 14:02   ` Philipp Zabel
  2014-12-17 14:18 ` [PATCH 0/6] imx-drm: ipuv3-crtc: Implement mode_fixup Philipp Zabel
  6 siblings, 1 reply; 14+ messages in thread
From: slongerbeam @ 2014-12-16  0:29 UTC (permalink / raw)
  To: dri-devel; +Cc: Steve Longerbeam

From: Steve Longerbeam <steve_longerbeam@mentor.com>

This patch changes struct ipu_di_signal_cfg to use struct videomode
to define video timings and flags.

Signed-off-by: Steve Longerbeam <steve_longerbeam@mentor.com>
---
 drivers/gpu/drm/imx/ipuv3-crtc.c |   27 +++---------
 drivers/gpu/ipu-v3/ipu-di.c      |   89 ++++++++++++++++++++------------------
 include/video/imx-ipu-v3.h       |   19 ++------
 3 files changed, 57 insertions(+), 78 deletions(-)

diff --git a/drivers/gpu/drm/imx/ipuv3-crtc.c b/drivers/gpu/drm/imx/ipuv3-crtc.c
index fb16026..0a50129 100644
--- a/drivers/gpu/drm/imx/ipuv3-crtc.c
+++ b/drivers/gpu/drm/imx/ipuv3-crtc.c
@@ -158,35 +158,20 @@ static int ipu_crtc_mode_set(struct drm_crtc *crtc,
 
 	out_pixel_fmt = ipu_crtc->interface_pix_fmt;
 
-	if (mode->flags & DRM_MODE_FLAG_INTERLACE)
-		sig_cfg.interlaced = 1;
-	if (mode->flags & DRM_MODE_FLAG_PHSYNC)
-		sig_cfg.Hsync_pol = 1;
-	if (mode->flags & DRM_MODE_FLAG_PVSYNC)
-		sig_cfg.Vsync_pol = 1;
-
 	sig_cfg.enable_pol = 1;
 	sig_cfg.clk_pol = 0;
-	sig_cfg.width = mode->hdisplay;
-	sig_cfg.height = mode->vdisplay;
 	sig_cfg.pixel_fmt = out_pixel_fmt;
-	sig_cfg.h_start_width = mode->htotal - mode->hsync_end;
-	sig_cfg.h_sync_width = mode->hsync_end - mode->hsync_start;
-	sig_cfg.h_end_width = mode->hsync_start - mode->hdisplay;
-
-	sig_cfg.v_start_width = mode->vtotal - mode->vsync_end;
-	sig_cfg.v_sync_width = mode->vsync_end - mode->vsync_start;
-	sig_cfg.v_end_width = mode->vsync_start - mode->vdisplay;
-	sig_cfg.pixelclock = mode->clock * 1000;
 	sig_cfg.clkflags = ipu_crtc->di_clkflags;
-
 	sig_cfg.v_to_h_sync = 0;
-
 	sig_cfg.hsync_pin = ipu_crtc->di_hsync_pin;
 	sig_cfg.vsync_pin = ipu_crtc->di_vsync_pin;
 
-	ret = ipu_dc_init_sync(ipu_crtc->dc, ipu_crtc->di, sig_cfg.interlaced,
-			out_pixel_fmt, mode->hdisplay);
+	videomode_from_drm_display_mode(mode, &sig_cfg.mode);
+
+	ret = ipu_dc_init_sync(ipu_crtc->dc, ipu_crtc->di,
+			       (mode->flags & DRM_MODE_FLAG_INTERLACE) ?
+			       true : false,
+			       out_pixel_fmt, mode->hdisplay);
 	if (ret) {
 		dev_err(ipu_crtc->dev,
 				"initializing display controller failed with %d\n",
diff --git a/drivers/gpu/ipu-v3/ipu-di.c b/drivers/gpu/ipu-v3/ipu-di.c
index 41df8d7..d95fbd0 100644
--- a/drivers/gpu/ipu-v3/ipu-di.c
+++ b/drivers/gpu/ipu-v3/ipu-di.c
@@ -207,10 +207,10 @@ static void ipu_di_sync_config(struct ipu_di *di, struct di_sync_config *config,
 static void ipu_di_sync_config_interlaced(struct ipu_di *di,
 		struct ipu_di_signal_cfg *sig)
 {
-	u32 h_total = sig->width + sig->h_sync_width +
-		sig->h_start_width + sig->h_end_width;
-	u32 v_total = sig->height + sig->v_sync_width +
-		sig->v_start_width + sig->v_end_width;
+	u32 h_total = sig->mode.hactive + sig->mode.hsync_len +
+		sig->mode.hback_porch + sig->mode.hfront_porch;
+	u32 v_total = sig->mode.vactive + sig->mode.vsync_len +
+		sig->mode.vback_porch + sig->mode.vfront_porch;
 	u32 reg;
 	struct di_sync_config cfg[] = {
 		{
@@ -229,13 +229,13 @@ static void ipu_di_sync_config_interlaced(struct ipu_di *di,
 		}, {
 			.run_count = v_total / 2 - 1,
 			.run_src = DI_SYNC_HSYNC,
-			.offset_count = sig->v_start_width,
+			.offset_count = sig->mode.vback_porch,
 			.offset_src = DI_SYNC_HSYNC,
 			.repeat_count = 2,
 			.cnt_clr_src = DI_SYNC_VSYNC,
 		}, {
 			.run_src = DI_SYNC_HSYNC,
-			.repeat_count = sig->height / 2,
+			.repeat_count = sig->mode.vactive / 2,
 			.cnt_clr_src = 4,
 		}, {
 			.run_count = v_total - 1,
@@ -249,9 +249,9 @@ static void ipu_di_sync_config_interlaced(struct ipu_di *di,
 			.cnt_clr_src = DI_SYNC_VSYNC,
 		}, {
 			.run_src = DI_SYNC_CLK,
-			.offset_count = sig->h_start_width,
+			.offset_count = sig->mode.hback_porch,
 			.offset_src = DI_SYNC_CLK,
-			.repeat_count = sig->width,
+			.repeat_count = sig->mode.hactive,
 			.cnt_clr_src = 5,
 		}, {
 			.run_count = v_total - 1,
@@ -277,10 +277,10 @@ static void ipu_di_sync_config_interlaced(struct ipu_di *di,
 static void ipu_di_sync_config_noninterlaced(struct ipu_di *di,
 		struct ipu_di_signal_cfg *sig, int div)
 {
-	u32 h_total = sig->width + sig->h_sync_width + sig->h_start_width +
-		sig->h_end_width;
-	u32 v_total = sig->height + sig->v_sync_width + sig->v_start_width +
-		sig->v_end_width;
+	u32 h_total = sig->mode.hactive + sig->mode.hsync_len +
+		sig->mode.hback_porch + sig->mode.hfront_porch;
+	u32 v_total = sig->mode.vactive + sig->mode.vsync_len +
+		sig->mode.vback_porch + sig->mode.vfront_porch;
 	struct di_sync_config cfg[] = {
 		{
 			/* 1: INT_HSYNC */
@@ -294,27 +294,29 @@ static void ipu_di_sync_config_noninterlaced(struct ipu_di *di,
 			.offset_src = DI_SYNC_CLK,
 			.cnt_polarity_gen_en = 1,
 			.cnt_polarity_trigger_src = DI_SYNC_CLK,
-			.cnt_down = sig->h_sync_width * 2,
+			.cnt_down = sig->mode.hsync_len * 2,
 		} , {
 			/* PIN3: VSYNC */
 			.run_count = v_total - 1,
 			.run_src = DI_SYNC_INT_HSYNC,
 			.cnt_polarity_gen_en = 1,
 			.cnt_polarity_trigger_src = DI_SYNC_INT_HSYNC,
-			.cnt_down = sig->v_sync_width * 2,
+			.cnt_down = sig->mode.vsync_len * 2,
 		} , {
 			/* 4: Line Active */
 			.run_src = DI_SYNC_HSYNC,
-			.offset_count = sig->v_sync_width + sig->v_start_width,
+			.offset_count = sig->mode.vsync_len +
+					sig->mode.vback_porch,
 			.offset_src = DI_SYNC_HSYNC,
-			.repeat_count = sig->height,
+			.repeat_count = sig->mode.vactive,
 			.cnt_clr_src = DI_SYNC_VSYNC,
 		} , {
 			/* 5: Pixel Active, referenced by DC */
 			.run_src = DI_SYNC_CLK,
-			.offset_count = sig->h_sync_width + sig->h_start_width,
+			.offset_count = sig->mode.hsync_len +
+					sig->mode.hback_porch,
 			.offset_src = DI_SYNC_CLK,
-			.repeat_count = sig->width,
+			.repeat_count = sig->mode.hactive,
 			.cnt_clr_src = 5, /* Line Active */
 		} , {
 			/* unused */
@@ -339,9 +341,10 @@ static void ipu_di_sync_config_noninterlaced(struct ipu_di *di,
 		} , {
 			/* 3: Line Active */
 			.run_src = DI_SYNC_INT_HSYNC,
-			.offset_count = sig->v_sync_width + sig->v_start_width,
+			.offset_count = sig->mode.vsync_len +
+					sig->mode.vback_porch,
 			.offset_src = DI_SYNC_INT_HSYNC,
-			.repeat_count = sig->height,
+			.repeat_count = sig->mode.vactive,
 			.cnt_clr_src = 3 /* VSYNC */,
 		} , {
 			/* PIN4: HSYNC for VGA via TVEv2 on TQ MBa53 */
@@ -351,13 +354,14 @@ static void ipu_di_sync_config_noninterlaced(struct ipu_di *di,
 			.offset_src = DI_SYNC_CLK,
 			.cnt_polarity_gen_en = 1,
 			.cnt_polarity_trigger_src = DI_SYNC_CLK,
-			.cnt_down = sig->h_sync_width * 2,
+			.cnt_down = sig->mode.hsync_len * 2,
 		} , {
 			/* 5: Pixel Active signal to DC */
 			.run_src = DI_SYNC_CLK,
-			.offset_count = sig->h_sync_width + sig->h_start_width,
+			.offset_count = sig->mode.hsync_len +
+					sig->mode.hback_porch,
 			.offset_src = DI_SYNC_CLK,
-			.repeat_count = sig->width,
+			.repeat_count = sig->mode.hactive,
 			.cnt_clr_src = 4, /* Line Active */
 		} , {
 			/* PIN6: VSYNC for VGA via TVEv2 on TQ MBa53 */
@@ -367,7 +371,7 @@ static void ipu_di_sync_config_noninterlaced(struct ipu_di *di,
 			.offset_src = DI_SYNC_INT_HSYNC,
 			.cnt_polarity_gen_en = 1,
 			.cnt_polarity_trigger_src = DI_SYNC_INT_HSYNC,
-			.cnt_down = sig->v_sync_width * 2,
+			.cnt_down = sig->mode.vsync_len * 2,
 		} , {
 			/* PIN4: HSYNC for VGA via TVEv2 on i.MX53-QSB */
 			.run_count = h_total - 1,
@@ -376,7 +380,7 @@ static void ipu_di_sync_config_noninterlaced(struct ipu_di *di,
 			.offset_src = DI_SYNC_CLK,
 			.cnt_polarity_gen_en = 1,
 			.cnt_polarity_trigger_src = DI_SYNC_CLK,
-			.cnt_down = sig->h_sync_width * 2,
+			.cnt_down = sig->mode.hsync_len * 2,
 		} , {
 			/* PIN6: VSYNC for VGA via TVEv2 on i.MX53-QSB */
 			.run_count = v_total - 1,
@@ -385,7 +389,7 @@ static void ipu_di_sync_config_noninterlaced(struct ipu_di *di,
 			.offset_src = DI_SYNC_INT_HSYNC,
 			.cnt_polarity_gen_en = 1,
 			.cnt_polarity_trigger_src = DI_SYNC_INT_HSYNC,
-			.cnt_down = sig->v_sync_width * 2,
+			.cnt_down = sig->mode.vsync_len * 2,
 		} , {
 			/* unused */
 		},
@@ -433,10 +437,11 @@ static void ipu_di_config_clock(struct ipu_di *di,
 			unsigned long in_rate;
 			unsigned div;
 
-			clk_set_rate(clk, sig->pixelclock);
+			clk_set_rate(clk, sig->mode.pixelclock);
 
 			in_rate = clk_get_rate(clk);
-			div = (in_rate + sig->pixelclock / 2) / sig->pixelclock;
+			div = (in_rate + sig->mode.pixelclock / 2) /
+				sig->mode.pixelclock;
 			if (div == 0)
 				div = 1;
 
@@ -454,10 +459,11 @@ static void ipu_di_config_clock(struct ipu_di *di,
 		unsigned div, error;
 
 		clkrate = clk_get_rate(di->clk_ipu);
-		div = (clkrate + sig->pixelclock / 2) / sig->pixelclock;
+		div = (clkrate + sig->mode.pixelclock / 2) /
+			sig->mode.pixelclock;
 		rate = clkrate / div;
 
-		error = rate / (sig->pixelclock / 1000);
+		error = rate / (sig->mode.pixelclock / 1000);
 
 		dev_dbg(di->ipu->dev, "  IPU clock can give %lu with divider %u, error %d.%u%%\n",
 			rate, div, (signed)(error - 1000) / 10, error % 10);
@@ -473,10 +479,11 @@ static void ipu_di_config_clock(struct ipu_di *di,
 
 			clk = di->clk_di;
 
-			clk_set_rate(clk, sig->pixelclock);
+			clk_set_rate(clk, sig->mode.pixelclock);
 
 			in_rate = clk_get_rate(clk);
-			div = (in_rate + sig->pixelclock / 2) / sig->pixelclock;
+			div = (in_rate + sig->mode.pixelclock / 2) /
+				sig->mode.pixelclock;
 			if (div == 0)
 				div = 1;
 
@@ -504,7 +511,7 @@ static void ipu_di_config_clock(struct ipu_di *di,
 	ipu_di_write(di, val, DI_GENERAL);
 
 	dev_dbg(di->ipu->dev, "Want %luHz IPU %luHz DI %luHz using %s, %luHz\n",
-		sig->pixelclock,
+		sig->mode.pixelclock,
 		clk_get_rate(di->clk_ipu),
 		clk_get_rate(di->clk_di),
 		clk == di->clk_di ? "DI" : "IPU",
@@ -547,15 +554,15 @@ int ipu_di_init_sync_panel(struct ipu_di *di, struct ipu_di_signal_cfg *sig)
 	u32 div;
 
 	dev_dbg(di->ipu->dev, "disp %d: panel size = %d x %d\n",
-		di->id, sig->width, sig->height);
+		di->id, sig->mode.hactive, sig->mode.vactive);
 
-	if ((sig->v_sync_width == 0) || (sig->h_sync_width == 0))
+	if ((sig->mode.vsync_len == 0) || (sig->mode.hsync_len == 0))
 		return -EINVAL;
 
 	dev_dbg(di->ipu->dev, "Clocks: IPU %luHz DI %luHz Needed %luHz\n",
 		clk_get_rate(di->clk_ipu),
 		clk_get_rate(di->clk_di),
-		sig->pixelclock);
+		sig->mode.pixelclock);
 
 	mutex_lock(&di_mutex);
 
@@ -574,7 +581,7 @@ int ipu_di_init_sync_panel(struct ipu_di *di, struct ipu_di_signal_cfg *sig)
 	di_gen = ipu_di_read(di, DI_GENERAL) & DI_GEN_DI_CLK_EXT;
 	di_gen |= DI_GEN_DI_VSYNC_EXT;
 
-	if (sig->interlaced) {
+	if (sig->mode.flags & DISPLAY_FLAGS_INTERLACED) {
 		ipu_di_sync_config_interlaced(di, sig);
 
 		/* set y_sel = 1 */
@@ -584,9 +591,9 @@ int ipu_di_init_sync_panel(struct ipu_di *di, struct ipu_di_signal_cfg *sig)
 
 		vsync_cnt = 7;
 
-		if (sig->Hsync_pol)
+		if (sig->mode.flags & DISPLAY_FLAGS_HSYNC_HIGH)
 			di_gen |= DI_GEN_POLARITY_3;
-		if (sig->Vsync_pol)
+		if (sig->mode.flags & DISPLAY_FLAGS_VSYNC_HIGH)
 			di_gen |= DI_GEN_POLARITY_2;
 	} else {
 		ipu_di_sync_config_noninterlaced(di, sig, div);
@@ -600,7 +607,7 @@ int ipu_di_init_sync_panel(struct ipu_di *di, struct ipu_di_signal_cfg *sig)
 			if (!(sig->hsync_pin == 2 && sig->vsync_pin == 3))
 				vsync_cnt = 6;
 
-		if (sig->Hsync_pol) {
+		if (sig->mode.flags & DISPLAY_FLAGS_HSYNC_HIGH) {
 			if (sig->hsync_pin == 2)
 				di_gen |= DI_GEN_POLARITY_2;
 			else if (sig->hsync_pin == 4)
@@ -608,7 +615,7 @@ int ipu_di_init_sync_panel(struct ipu_di *di, struct ipu_di_signal_cfg *sig)
 			else if (sig->hsync_pin == 7)
 				di_gen |= DI_GEN_POLARITY_7;
 		}
-		if (sig->Vsync_pol) {
+		if (sig->mode.flags & DISPLAY_FLAGS_VSYNC_HIGH) {
 			if (sig->vsync_pin == 3)
 				di_gen |= DI_GEN_POLARITY_3;
 			else if (sig->vsync_pin == 6)
diff --git a/include/video/imx-ipu-v3.h b/include/video/imx-ipu-v3.h
index d333d54..73390c1 100644
--- a/include/video/imx-ipu-v3.h
+++ b/include/video/imx-ipu-v3.h
@@ -33,28 +33,15 @@ enum ipuv3_type {
  * Bitfield of Display Interface signal polarities.
  */
 struct ipu_di_signal_cfg {
-	unsigned datamask_en:1;
-	unsigned interlaced:1;
-	unsigned odd_field_first:1;
-	unsigned clksel_en:1;
-	unsigned clkidle_en:1;
 	unsigned data_pol:1;	/* true = inverted */
 	unsigned clk_pol:1;	/* true = rising edge */
 	unsigned enable_pol:1;
-	unsigned Hsync_pol:1;	/* true = active high */
-	unsigned Vsync_pol:1;
 
-	u16 width;
-	u16 height;
+	struct videomode mode;
+
 	u32 pixel_fmt;
-	u16 h_start_width;
-	u16 h_sync_width;
-	u16 h_end_width;
-	u16 v_start_width;
-	u16 v_sync_width;
-	u16 v_end_width;
 	u32 v_to_h_sync;
-	unsigned long pixelclock;
+
 #define IPU_DI_CLKMODE_SYNC	(1 << 0)
 #define IPU_DI_CLKMODE_EXT	(1 << 1)
 	unsigned long clkflags;
-- 
1.7.9.5

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel

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

* Re: [PATCH 1/6] gpu: ipu-di: Add ipu_di_adjust_videomode()
  2014-12-16  0:29 ` [PATCH 1/6] gpu: ipu-di: Add ipu_di_adjust_videomode() slongerbeam
@ 2014-12-17 12:27   ` Fabio Estevam
  2014-12-18 19:05     ` Steve Longerbeam
  0 siblings, 1 reply; 14+ messages in thread
From: Fabio Estevam @ 2014-12-17 12:27 UTC (permalink / raw)
  To: Steve Longerbeam; +Cc: Deepak Das, Steve Longerbeam, DRI mailing list

Steve,

On Mon, Dec 15, 2014 at 10:29 PM,  <slongerbeam@gmail.com> wrote:
> From: Jiada Wang <jiada_wang@mentor.com>
>
> On some monitors, high resolution modes are not working, exhibiting
> pixel column truncation problems (for example, 1280x1024 displays as
> 1280x1022).
>
> The function ipu_di_adjust_videomode() aims to fix these issues by
> adjusting a passed videomode to IPU restrictions. The function can
> be called from the drm_crtc_helper_funcs->mode_fixup() methods.
>
> Signed-off-by: Jiada Wang <jiada_wang@mentor.com>
> Signed-off-by: Deepak Das <deepak_das@mentor.com>
> Signed-off-by: Steve Longerbeam <steve_longerbeam@mentor.com>

Looks like you missed to add Philipp on Cc.
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel

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

* Re: [PATCH 6/6] gpu: ipu-v3: Use videomode in struct ipu_di_signal_cfg
  2014-12-16  0:29 ` [PATCH 6/6] gpu: ipu-v3: Use videomode in struct ipu_di_signal_cfg slongerbeam
@ 2014-12-17 14:02   ` Philipp Zabel
  2014-12-19  0:34     ` Steve Longerbeam
  0 siblings, 1 reply; 14+ messages in thread
From: Philipp Zabel @ 2014-12-17 14:02 UTC (permalink / raw)
  To: slongerbeam; +Cc: Steve Longerbeam, dri-devel

Hi Steve,

I think this is a good idea. Two small comments below.

Am Montag, den 15.12.2014, 16:29 -0800 schrieb slongerbeam@gmail.com:
> From: Steve Longerbeam <steve_longerbeam@mentor.com>
> 
> This patch changes struct ipu_di_signal_cfg to use struct videomode
> to define video timings and flags.
> 
> Signed-off-by: Steve Longerbeam <steve_longerbeam@mentor.com>
> ---
>  drivers/gpu/drm/imx/ipuv3-crtc.c |   27 +++---------
>  drivers/gpu/ipu-v3/ipu-di.c      |   89 ++++++++++++++++++++------------------
>  include/video/imx-ipu-v3.h       |   19 ++------
>  3 files changed, 57 insertions(+), 78 deletions(-)
> 
> diff --git a/drivers/gpu/drm/imx/ipuv3-crtc.c b/drivers/gpu/drm/imx/ipuv3-crtc.c
> index fb16026..0a50129 100644
> --- a/drivers/gpu/drm/imx/ipuv3-crtc.c
> +++ b/drivers/gpu/drm/imx/ipuv3-crtc.c
> @@ -158,35 +158,20 @@ static int ipu_crtc_mode_set(struct drm_crtc *crtc,
>  
>  	out_pixel_fmt = ipu_crtc->interface_pix_fmt;
>  
> -	if (mode->flags & DRM_MODE_FLAG_INTERLACE)
> -		sig_cfg.interlaced = 1;
> -	if (mode->flags & DRM_MODE_FLAG_PHSYNC)
> -		sig_cfg.Hsync_pol = 1;
> -	if (mode->flags & DRM_MODE_FLAG_PVSYNC)
> -		sig_cfg.Vsync_pol = 1;
> -
>  	sig_cfg.enable_pol = 1;
>  	sig_cfg.clk_pol = 0;
> -	sig_cfg.width = mode->hdisplay;
> -	sig_cfg.height = mode->vdisplay;
>  	sig_cfg.pixel_fmt = out_pixel_fmt;
> -	sig_cfg.h_start_width = mode->htotal - mode->hsync_end;
> -	sig_cfg.h_sync_width = mode->hsync_end - mode->hsync_start;
> -	sig_cfg.h_end_width = mode->hsync_start - mode->hdisplay;
> -
> -	sig_cfg.v_start_width = mode->vtotal - mode->vsync_end;
> -	sig_cfg.v_sync_width = mode->vsync_end - mode->vsync_start;
> -	sig_cfg.v_end_width = mode->vsync_start - mode->vdisplay;
> -	sig_cfg.pixelclock = mode->clock * 1000;
>  	sig_cfg.clkflags = ipu_crtc->di_clkflags;
> -
>  	sig_cfg.v_to_h_sync = 0;
> -
>  	sig_cfg.hsync_pin = ipu_crtc->di_hsync_pin;
>  	sig_cfg.vsync_pin = ipu_crtc->di_vsync_pin;
>  
> -	ret = ipu_dc_init_sync(ipu_crtc->dc, ipu_crtc->di, sig_cfg.interlaced,
> -			out_pixel_fmt, mode->hdisplay);
> +	videomode_from_drm_display_mode(mode, &sig_cfg.mode);
> +
> +	ret = ipu_dc_init_sync(ipu_crtc->dc, ipu_crtc->di,
> +			       (mode->flags & DRM_MODE_FLAG_INTERLACE) ?
> +			       true : false,

The interlaced parameter to ipu_dc_init_sync is of type bool, so the
()?true:false is superfluous.

[...]
> @@ -433,10 +437,11 @@ static void ipu_di_config_clock(struct ipu_di *di,
>  			unsigned long in_rate;
>  			unsigned div;
>  
> -			clk_set_rate(clk, sig->pixelclock);
> +			clk_set_rate(clk, sig->mode.pixelclock);
>  
>  			in_rate = clk_get_rate(clk);
> -			div = (in_rate + sig->pixelclock / 2) / sig->pixelclock;
> +			div = (in_rate + sig->mode.pixelclock / 2) /
> +				sig->mode.pixelclock;

Let's use this opportunity to switch to DIV_ROUND_CLOSEST here ...

> @@ -473,10 +479,11 @@ static void ipu_di_config_clock(struct ipu_di *di,
>  
>  			clk = di->clk_di;
>  
> -			clk_set_rate(clk, sig->pixelclock);
> +			clk_set_rate(clk, sig->mode.pixelclock);
>  
>  			in_rate = clk_get_rate(clk);
> -			div = (in_rate + sig->pixelclock / 2) / sig->pixelclock;
> +			div = (in_rate + sig->mode.pixelclock / 2) /
> +				sig->mode.pixelclock;

... and here.

regards
Philipp

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel

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

* Re: [PATCH 5/6] imx-drm: encoder mode_set must use adjusted mode
  2014-12-16  0:29 ` [PATCH 5/6] imx-drm: encoder mode_set must use adjusted mode slongerbeam
@ 2014-12-17 14:03   ` Philipp Zabel
  2014-12-19  0:31     ` Steve Longerbeam
  0 siblings, 1 reply; 14+ messages in thread
From: Philipp Zabel @ 2014-12-17 14:03 UTC (permalink / raw)
  To: slongerbeam; +Cc: Steve Longerbeam, dri-devel

Am Montag, den 15.12.2014, 16:29 -0800 schrieb slongerbeam@gmail.com:
> From: Steve Longerbeam <steve_longerbeam@mentor.com>
> 
> The encoder ->mode_set() methods need to use the hw adjusted mode,
> not the original mode.
> 
> Signed-off-by: Steve Longerbeam <steve_longerbeam@mentor.com>
> ---
>  drivers/gpu/drm/imx/imx-hdmi.c         |    4 ++--
>  drivers/gpu/drm/imx/imx-ldb.c          |    4 ++--
>  drivers/gpu/drm/imx/imx-tve.c          |    4 ++--
>  drivers/gpu/drm/imx/parallel-display.c |    4 ++--
>  4 files changed, 8 insertions(+), 8 deletions(-)
> 
> diff --git a/drivers/gpu/drm/imx/imx-hdmi.c b/drivers/gpu/drm/imx/imx-hdmi.c
> index aaec6b2..32116cc 100644
> --- a/drivers/gpu/drm/imx/imx-hdmi.c
> +++ b/drivers/gpu/drm/imx/imx-hdmi.c
> @@ -1417,8 +1417,8 @@ static struct drm_encoder *imx_hdmi_connector_best_encoder(struct drm_connector
>  }
>  
>  static void imx_hdmi_encoder_mode_set(struct drm_encoder *encoder,
> -			struct drm_display_mode *mode,
> -			struct drm_display_mode *adjusted_mode)
> +			struct drm_display_mode *orig_mode,
> +			struct drm_display_mode *mode)
>  {
>  	struct imx_hdmi *hdmi = container_of(encoder, struct imx_hdmi, encoder);
>  
> diff --git a/drivers/gpu/drm/imx/imx-ldb.c b/drivers/gpu/drm/imx/imx-ldb.c
> index 4662e00..a88c0e1 100644
> --- a/drivers/gpu/drm/imx/imx-ldb.c
> +++ b/drivers/gpu/drm/imx/imx-ldb.c

There's another line that should be changed

-       struct drm_display_mode *mode = &encoder->crtc->mode;
+       struct drm_display_mode *mode = &encoder->crtc->hwmode;

in imx_ldb_encoder_prepare.

> @@ -246,8 +246,8 @@ static void imx_ldb_encoder_commit(struct drm_encoder *encoder)
>  }
>  
>  static void imx_ldb_encoder_mode_set(struct drm_encoder *encoder,
> -			 struct drm_display_mode *mode,
> -			 struct drm_display_mode *adjusted_mode)
> +			 struct drm_display_mode *orig_mode,
> +			 struct drm_display_mode *mode)
>  {
>  	struct imx_ldb_channel *imx_ldb_ch = enc_to_imx_ldb_ch(encoder);
>  	struct imx_ldb *ldb = imx_ldb_ch->ldb;

regards
Philipp

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel

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

* Re: [PATCH 0/6] imx-drm: ipuv3-crtc: Implement mode_fixup
  2014-12-16  0:29 [PATCH 0/6] imx-drm: ipuv3-crtc: Implement mode_fixup slongerbeam
                   ` (5 preceding siblings ...)
  2014-12-16  0:29 ` [PATCH 6/6] gpu: ipu-v3: Use videomode in struct ipu_di_signal_cfg slongerbeam
@ 2014-12-17 14:18 ` Philipp Zabel
  6 siblings, 0 replies; 14+ messages in thread
From: Philipp Zabel @ 2014-12-17 14:18 UTC (permalink / raw)
  To: slongerbeam; +Cc: Steve Longerbeam, dri-devel

Hi Steve,

Please put me on Cc: for IPU and imx-drm related patches.

Am Montag, den 15.12.2014, 16:29 -0800 schrieb slongerbeam@gmail.com:
> From: Steve Longerbeam <steve_longerbeam@mentor.com>
> 
> This patchset implements ->mode_fixup() in the imx ipuv3-crtc driver,
> using a new support function ipu_di_adjust_videomode(). This new
> function needs to be subsystem independent, so it accepts a video
> mode as a 'struct videomode'. Hence ipu-crtc ->mode_fixup() needs
> another support function to convert a drm_display_mode to a videomode
> before passing the mode to ipu_di_adjust_videomode() for fixup.
> 
> Also some related code cleanup: 'struct ipu_di_signal_cfg' should
> use 'struct videomode' for mode timings.

I have tested the video mode adjustment on an LVDS panel (that doesn't
care about the actual front/back porches and allows a wide range of
timings) and verified it fixes the problem of the display randomly
turning off with some timings.

regards
Philipp

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel

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

* Re: [PATCH 1/6] gpu: ipu-di: Add ipu_di_adjust_videomode()
  2014-12-17 12:27   ` Fabio Estevam
@ 2014-12-18 19:05     ` Steve Longerbeam
  0 siblings, 0 replies; 14+ messages in thread
From: Steve Longerbeam @ 2014-12-18 19:05 UTC (permalink / raw)
  To: Fabio Estevam; +Cc: Deepak Das, Steve Longerbeam, DRI mailing list

On 12/17/2014 04:27 AM, Fabio Estevam wrote:
> Steve,
>
> On Mon, Dec 15, 2014 at 10:29 PM,  <slongerbeam@gmail.com> wrote:
>> From: Jiada Wang <jiada_wang@mentor.com>
>>
>> On some monitors, high resolution modes are not working, exhibiting
>> pixel column truncation problems (for example, 1280x1024 displays as
>> 1280x1022).
>>
>> The function ipu_di_adjust_videomode() aims to fix these issues by
>> adjusting a passed videomode to IPU restrictions. The function can
>> be called from the drm_crtc_helper_funcs->mode_fixup() methods.
>>
>> Signed-off-by: Jiada Wang <jiada_wang@mentor.com>
>> Signed-off-by: Deepak Das <deepak_das@mentor.com>
>> Signed-off-by: Steve Longerbeam <steve_longerbeam@mentor.com>
> Looks like you missed to add Philipp on Cc.

Hi Fabio, yes I forgot to add him as a cc:, but I discussed these
patches with him before submitting. I will add him to cc in next
revision.

Steve

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel

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

* Re: [PATCH 5/6] imx-drm: encoder mode_set must use adjusted mode
  2014-12-17 14:03   ` Philipp Zabel
@ 2014-12-19  0:31     ` Steve Longerbeam
  0 siblings, 0 replies; 14+ messages in thread
From: Steve Longerbeam @ 2014-12-19  0:31 UTC (permalink / raw)
  To: Philipp Zabel; +Cc: Steve Longerbeam, dri-devel

On 12/17/2014 06:03 AM, Philipp Zabel wrote:
>
> There's another line that should be changed
>
> -       struct drm_display_mode *mode = &encoder->crtc->mode;
> +       struct drm_display_mode *mode = &encoder->crtc->hwmode;
>
> in imx_ldb_encoder_prepare.

done.

Steve

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel

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

* Re: [PATCH 6/6] gpu: ipu-v3: Use videomode in struct ipu_di_signal_cfg
  2014-12-17 14:02   ` Philipp Zabel
@ 2014-12-19  0:34     ` Steve Longerbeam
  0 siblings, 0 replies; 14+ messages in thread
From: Steve Longerbeam @ 2014-12-19  0:34 UTC (permalink / raw)
  To: Philipp Zabel; +Cc: Steve Longerbeam, dri-devel

On 12/17/2014 06:02 AM, Philipp Zabel wrote:
>
> The interlaced parameter to ipu_dc_init_sync is of type bool, so the
> ()?true:false is superfluous.

fixed.

>
> [...]
>> @@ -433,10 +437,11 @@ static void ipu_di_config_clock(struct ipu_di *di,
>>  			unsigned long in_rate;
>>  			unsigned div;
>>  
>> -			clk_set_rate(clk, sig->pixelclock);
>> +			clk_set_rate(clk, sig->mode.pixelclock);
>>  
>>  			in_rate = clk_get_rate(clk);
>> -			div = (in_rate + sig->pixelclock / 2) / sig->pixelclock;
>> +			div = (in_rate + sig->mode.pixelclock / 2) /
>> +				sig->mode.pixelclock;
> Let's use this opportunity to switch to DIV_ROUND_CLOSEST here ...

I'll add a separate patch for that.

Steve

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel

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

end of thread, other threads:[~2014-12-19  0:34 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-12-16  0:29 [PATCH 0/6] imx-drm: ipuv3-crtc: Implement mode_fixup slongerbeam
2014-12-16  0:29 ` [PATCH 1/6] gpu: ipu-di: Add ipu_di_adjust_videomode() slongerbeam
2014-12-17 12:27   ` Fabio Estevam
2014-12-18 19:05     ` Steve Longerbeam
2014-12-16  0:29 ` [PATCH 2/6] gpu: ipu-di: remove some non-functional code slongerbeam
2014-12-16  0:29 ` [PATCH 3/6] drm_modes: add videomode_from_drm_display_mode slongerbeam
2014-12-16  0:29 ` [PATCH 4/6] imx-drm: ipuv3-crtc: Implement mode_fixup slongerbeam
2014-12-16  0:29 ` [PATCH 5/6] imx-drm: encoder mode_set must use adjusted mode slongerbeam
2014-12-17 14:03   ` Philipp Zabel
2014-12-19  0:31     ` Steve Longerbeam
2014-12-16  0:29 ` [PATCH 6/6] gpu: ipu-v3: Use videomode in struct ipu_di_signal_cfg slongerbeam
2014-12-17 14:02   ` Philipp Zabel
2014-12-19  0:34     ` Steve Longerbeam
2014-12-17 14:18 ` [PATCH 0/6] imx-drm: ipuv3-crtc: Implement mode_fixup Philipp Zabel

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.