Skip to contentSkip to conversation

drm/i915/dp: allow configuring eDP panel fitting scaling mode

PATCH In review Yuly Novikov 4 participants 8 messages Oct 25, 2012 – Nov 3, 2012

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 drm/i915/dp: allow configuring eDP panel fitting scaling mode

LVDS allowed changing panel fitting scaling mode, while eDP didn't. Copied relevant code from LVDS to eDP.
This also changes default mode on eDP to ascpect ratio preserving scaling.

---
 drivers/gpu/drm/i915/intel_dp.c  |   33 ++++++++++++++++++++++++++++++---
 drivers/gpu/drm/i915/intel_drv.h |    1 +
 2 files changed, 31 insertions(+), 3 deletions(-)
drivers/gpu/drm/i915/intel_dp.c +30 -3
index 368ed8e..a65546e 100644
@@ -685,7 +685,7 @@ intel_dp_mode_fixup(struct drm_encoder *encoder,
 
 	if (is_edp(intel_dp) && intel_dp->panel_fixed_mode) {
 		intel_fixed_panel_mode(intel_dp->panel_fixed_mode, adjusted_mode);
-		intel_pch_panel_fitting(dev, DRM_MODE_SCALE_FULLSCREEN,
+		intel_pch_panel_fitting(dev, intel_dp->fitting_mode,
 					mode, adjusted_mode);
 	}
 
@@ -2358,6 +2358,22 @@ intel_dp_set_property(struct drm_connector *connector,
 		goto done;
 	}
 
+	if (is_edp(intel_dp) &&
+		property == connector->dev->mode_config.scaling_mode_property) {
+		if (val == DRM_MODE_SCALE_NONE) {
+			DRM_DEBUG_KMS("no scaling not supported\n");
+			return -EINVAL;
+		}
+
+		if (intel_dp->fitting_mode == val) {
+			/* the eDP scaling property is not changed */
+			return 0;
+		}
+		intel_dp->fitting_mode = val;
+
+		goto done;
+	}
+
 	return -EINVAL;
 
 done:
@@ -2469,10 +2485,21 @@ bool intel_dpd_is_edp(struct drm_device *dev)
 }
 
 static void
-intel_dp_add_properties(struct intel_dp *intel_dp, struct drm_connector *connector)
+intel_dp_add_properties(struct drm_device *dev,
+			struct intel_dp *intel_dp,
+			struct drm_connector *connector)
 {
 	intel_attach_force_audio_property(connector);
 	intel_attach_broadcast_rgb_property(connector);
+
+	if (is_edp(intel_dp)) {
+		drm_mode_create_scaling_mode_property(dev);
+		drm_connector_attach_property(
+			connector,
+			dev->mode_config.scaling_mode_property,
+			DRM_MODE_SCALE_ASPECT);
+		intel_dp->fitting_mode = DRM_MODE_SCALE_ASPECT;
+	}
 }
 
 void
@@ -2665,7 +2692,7 @@ intel_dp_init(struct drm_device *dev, int output_reg, enum port port)
 		intel_panel_setup_backlight(dev);
 	}
 
-	intel_dp_add_properties(intel_dp, connector);
+	intel_dp_add_properties(dev, intel_dp, connector);
 
 	/* For G4X desktop chip, PEG_BAND_GAP_DATA 3:0 must first be written
 	 * 0xd.  Failure to do so will result in spurious interrupts being
drivers/gpu/drm/i915/intel_drv.h +1 -0
index fe71425..da50cd4 100644
@@ -358,6 +358,7 @@ struct intel_dp {
 	int backlight_on_delay;
 	int backlight_off_delay;
 	struct drm_display_mode *panel_fixed_mode;  /* for eDP */
+	int fitting_mode;  /* for eDP */
 	struct delayed_work panel_vdd_work;
 	bool want_panel_vdd;
 	struct edid *edid; /* cached EDID for eDP */
Signature · 1 line
1.7.7.3
#1 lore raw
Quoted 5 lines · Yuly Novikov

LVDS allowed changing panel fitting scaling mode, while eDP didn't. Copied relevant code from LVDS to eDP.
This also changes default mode on eDP to ascpect ratio preserving scaling.

Jani from our team is working on unifying a bunch of things between lvds and eDP, some of them already merged into drm-intel-next-queued branch. Jani, can you please take a look?

Thanks, Daniel

Quoted 88 lines
---
 drivers/gpu/drm/i915/intel_dp.c  |   33 ++++++++++++++++++++++++++++++---
 drivers/gpu/drm/i915/intel_drv.h |    1 +
 2 files changed, 31 insertions(+), 3 deletions(-)
drivers/gpu/drm/i915/intel_dp.c +30 -3
index 368ed8e..a65546e 100644
@@ -685,7 +685,7 @@ intel_dp_mode_fixup(struct drm_encoder *encoder,
 
 	if (is_edp(intel_dp) && intel_dp->panel_fixed_mode) {
 		intel_fixed_panel_mode(intel_dp->panel_fixed_mode, adjusted_mode);
-		intel_pch_panel_fitting(dev, DRM_MODE_SCALE_FULLSCREEN,
+		intel_pch_panel_fitting(dev, intel_dp->fitting_mode,
 					mode, adjusted_mode);
 	}
 
@@ -2358,6 +2358,22 @@ intel_dp_set_property(struct drm_connector *connector,
 		goto done;
 	}
 
+	if (is_edp(intel_dp) &&
+		property == connector->dev->mode_config.scaling_mode_property) {
+		if (val == DRM_MODE_SCALE_NONE) {
+			DRM_DEBUG_KMS("no scaling not supported\n");
+			return -EINVAL;
+		}
+
+		if (intel_dp->fitting_mode == val) {
+			/* the eDP scaling property is not changed */
+			return 0;
+		}
+		intel_dp->fitting_mode = val;
+
+		goto done;
+	}
+
 	return -EINVAL;
 
 done:
@@ -2469,10 +2485,21 @@ bool intel_dpd_is_edp(struct drm_device *dev)
 }
 
 static void
-intel_dp_add_properties(struct intel_dp *intel_dp, struct drm_connector *connector)
+intel_dp_add_properties(struct drm_device *dev,
+			struct intel_dp *intel_dp,
+			struct drm_connector *connector)
 {
 	intel_attach_force_audio_property(connector);
 	intel_attach_broadcast_rgb_property(connector);
+
+	if (is_edp(intel_dp)) {
+		drm_mode_create_scaling_mode_property(dev);
+		drm_connector_attach_property(
+			connector,
+			dev->mode_config.scaling_mode_property,
+			DRM_MODE_SCALE_ASPECT);
+		intel_dp->fitting_mode = DRM_MODE_SCALE_ASPECT;
+	}
 }
 
 void
@@ -2665,7 +2692,7 @@ intel_dp_init(struct drm_device *dev, int output_reg, enum port port)
 		intel_panel_setup_backlight(dev);
 	}
 
-	intel_dp_add_properties(intel_dp, connector);
+	intel_dp_add_properties(dev, intel_dp, connector);
 
 	/* For G4X desktop chip, PEG_BAND_GAP_DATA 3:0 must first be written
 	 * 0xd.  Failure to do so will result in spurious interrupts being
drivers/gpu/drm/i915/intel_drv.h +1 -0
index fe71425..da50cd4 100644
@@ -358,6 +358,7 @@ struct intel_dp {
 	int backlight_on_delay;
 	int backlight_off_delay;
 	struct drm_display_mode *panel_fixed_mode;  /* for eDP */
+	int fitting_mode;  /* for eDP */
 	struct delayed_work panel_vdd_work;
 	bool want_panel_vdd;
 	struct edid *edid; /* cached EDID for eDP */
Signature · 1 line
1.7.7.3
Signature · 3 lines
Daniel Vetter
Software Engineer, Intel Corporation
+41 (0) 79 365 57 48 - http://blog.ffwll.ch
#2 lore raw

cover drm/i915: eDP scaling mode change support

[Dropped lkml, added intel-gfx]

Hi Yuly, here's a slightly modified version of your patch, rebased on drm-intel-next-queued. I kept your authorship, but any new errors are totally mine...

These are compile tested only; I'd appreciate if you could check it still does what it says on the box!

BR,
Jani.

Jani Nikula (1):
drm/i915/lvds: move fitting mode from intel_lvds_connector to
intel_panel

Yuly Novikov (2):
drm/i915/dp: allow configuring eDP panel fitting scaling mode drm/i915/dp: change eDP default scaling mode to respect aspect ratio

 drivers/gpu/drm/i915/intel_dp.c   |   31 ++++++++++++++++++++++++++++++-
 drivers/gpu/drm/i915/intel_drv.h  |    1 +
 drivers/gpu/drm/i915/intel_lvds.c |   24 ++++++++++--------------
 3 files changed, 41 insertions(+), 15 deletions(-)
Signature · 1 line
1.7.9.5
#3 lore raw

PATCH 1/3 drm/i915/lvds: move fitting mode from intel_lvds_connector to intel_panel

Prepare for supporting scaling mode configuration also in eDP.

Includes a drive-by-removal of an outdated comment about fitting mode.

---
 drivers/gpu/drm/i915/intel_drv.h  |    1 +
 drivers/gpu/drm/i915/intel_lvds.c |   24 ++++++++++--------------
 2 files changed, 11 insertions(+), 14 deletions(-)
drivers/gpu/drm/i915/intel_drv.h +1 -0
index 81d2020..8839ed5 100644
@@ -165,6 +165,7 @@ struct intel_encoder {
 
 struct intel_panel {
 	struct drm_display_mode *fixed_mode;
+	int fitting_mode;
 };
 
 struct intel_connector {
drivers/gpu/drm/i915/intel_lvds.c +10 -14
index 587ed0f..ffa0051 100644
@@ -44,7 +44,6 @@ struct intel_lvds_connector {
 	struct intel_connector base;
 
 	struct notifier_block lid_notifier;
-	int fitting_mode;
 };
 
 struct intel_lvds_encoder {
@@ -253,8 +252,8 @@ static bool intel_lvds_mode_fixup(struct drm_encoder *encoder,
 	struct drm_device *dev = encoder->dev;
 	struct drm_i915_private *dev_priv = dev->dev_private;
 	struct intel_lvds_encoder *lvds_encoder = to_lvds_encoder(encoder);
-	struct intel_lvds_connector *lvds_connector =
-		lvds_encoder->attached_connector;
+	struct intel_connector *intel_connector =
+		&lvds_encoder->attached_connector->base;
 	struct intel_crtc *intel_crtc = lvds_encoder->base.new_crtc;
 	u32 pfit_control = 0, pfit_pgm_ratios = 0, border = 0;
 	int pipe;
@@ -274,11 +273,12 @@ static bool intel_lvds_mode_fixup(struct drm_encoder *encoder,
 	 * with the panel scaling set up to source from the H/VDisplay
 	 * of the original mode.
 	 */
-	intel_fixed_panel_mode(lvds_connector->base.panel.fixed_mode,
+	intel_fixed_panel_mode(intel_connector->panel.fixed_mode,
 			       adjusted_mode);
 
 	if (HAS_PCH_SPLIT(dev)) {
-		intel_pch_panel_fitting(dev, lvds_connector->fitting_mode,
+		intel_pch_panel_fitting(dev,
+					intel_connector->panel.fitting_mode,
 					mode, adjusted_mode);
 		return true;
 	}
@@ -304,7 +304,7 @@ static bool intel_lvds_mode_fixup(struct drm_encoder *encoder,
 
 	drm_mode_set_crtcinfo(adjusted_mode, 0);
 
-	switch (lvds_connector->fitting_mode) {
+	switch (intel_connector->panel.fitting_mode) {
 	case DRM_MODE_SCALE_CENTER:
 		/*
 		 * For centered modes, we have to calculate border widths &
@@ -573,7 +573,7 @@ static int intel_lvds_set_property(struct drm_connector *connector,
 				   struct drm_property *property,
 				   uint64_t value)
 {
-	struct intel_lvds_connector *lvds_connector = to_lvds_connector(connector);
+	struct intel_connector *intel_connector = to_intel_connector(connector);
 	struct drm_device *dev = connector->dev;
 
 	if (property == dev->mode_config.scaling_mode_property) {
@@ -584,11 +584,11 @@ static int intel_lvds_set_property(struct drm_connector *connector,
 			return -EINVAL;
 		}
 
-		if (lvds_connector->fitting_mode == value) {
+		if (intel_connector->panel.fitting_mode == value) {
 			/* the LVDS scaling property is not changed */
 			return 0;
 		}
-		lvds_connector->fitting_mode = value;
+		intel_connector->panel.fitting_mode = value;
 
 		crtc = intel_attached_encoder(connector)->base.crtc;
 		if (crtc && crtc->enabled) {
@@ -1008,14 +1008,10 @@ bool intel_lvds_init(struct drm_device *dev)
 
 	/* create the scaling mode property */
 	drm_mode_create_scaling_mode_property(dev);
-	/*
-	 * the initial panel fitting mode will be FULL_SCREEN.
-	 */
-
 	drm_connector_attach_property(&intel_connector->base,
 				      dev->mode_config.scaling_mode_property,
 				      DRM_MODE_SCALE_ASPECT);
-	lvds_connector->fitting_mode = DRM_MODE_SCALE_ASPECT;
+	intel_connector->panel.fitting_mode = DRM_MODE_SCALE_ASPECT;
 	/*
 	 * LVDS discovery:
 	 * 1) check for EDID on DDC
Signature · 1 line
1.7.9.5
#4 lore raw

PATCH 2/3 drm/i915/dp: allow configuring eDP panel fitting scaling mode

In reply to Jani Nikula

From: Yuly Novikov <[email protected]>

LVDS allowed changing panel fitting scaling mode, while eDP didn't. Copied relevant code from LVDS to eDP.

[Jani: use fitting mode in intel_panel, remove default mode change]
---
 drivers/gpu/drm/i915/intel_dp.c |   31 ++++++++++++++++++++++++++++++-
 1 file changed, 30 insertions(+), 1 deletion(-)
drivers/gpu/drm/i915/intel_dp.c +30 -1
index 2a9998a..30314c0 100644
@@ -693,7 +693,8 @@ intel_dp_mode_fixup(struct drm_encoder *encoder,
 	if (is_edp(intel_dp) && intel_connector->panel.fixed_mode) {
 		intel_fixed_panel_mode(intel_connector->panel.fixed_mode,
 				       adjusted_mode);
-		intel_pch_panel_fitting(dev, DRM_MODE_SCALE_FULLSCREEN,
+		intel_pch_panel_fitting(dev,
+					intel_connector->panel.fitting_mode,
 					mode, adjusted_mode);
 	}
 
@@ -2359,6 +2360,7 @@ intel_dp_set_property(struct drm_connector *connector,
 		      uint64_t val)
 {
 	struct drm_i915_private *dev_priv = connector->dev->dev_private;
+	struct intel_connector *intel_connector = to_intel_connector(connector);
 	struct intel_dp *intel_dp = intel_attached_dp(connector);
 	int ret;
 
@@ -2395,6 +2397,22 @@ intel_dp_set_property(struct drm_connector *connector,
 		goto done;
 	}
 
+	if (is_edp(intel_dp) &&
+	    property == connector->dev->mode_config.scaling_mode_property) {
+		if (val == DRM_MODE_SCALE_NONE) {
+			DRM_DEBUG_KMS("no scaling not supported\n");
+			return -EINVAL;
+		}
+
+		if (intel_connector->panel.fitting_mode == val) {
+			/* the eDP scaling property is not changed */
+			return 0;
+		}
+		intel_connector->panel.fitting_mode = val;
+
+		goto done;
+	}
+
 	return -EINVAL;
 
 done:
@@ -2519,8 +2537,19 @@ bool intel_dpd_is_edp(struct drm_device *dev)
 static void
 intel_dp_add_properties(struct intel_dp *intel_dp, struct drm_connector *connector)
 {
+	struct intel_connector *intel_connector = to_intel_connector(connector);
+
 	intel_attach_force_audio_property(connector);
 	intel_attach_broadcast_rgb_property(connector);
+
+	if (is_edp(intel_dp)) {
+		drm_mode_create_scaling_mode_property(connector->dev);
+		drm_connector_attach_property(
+			connector,
+			connector->dev->mode_config.scaling_mode_property,
+			DRM_MODE_SCALE_FULLSCREEN);
+		intel_connector->panel.fitting_mode = DRM_MODE_SCALE_FULLSCREEN;
+	}
 }
 
 static void
Signature · 1 line
1.7.9.5
#5 lore raw

PATCH 3/3 drm/i915/dp: change eDP default scaling mode to respect aspect ratio

In reply to Jani Nikula

From: Yuly Novikov <[email protected]>

[Jani: ripped this change separate from the scaling mode change support]
---
 drivers/gpu/drm/i915/intel_dp.c |    4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/gpu/drm/i915/intel_dp.c +2 -2
index 30314c0..a1b9fc13 100644
@@ -2547,8 +2547,8 @@ intel_dp_add_properties(struct intel_dp *intel_dp, struct drm_connector *connect
 		drm_connector_attach_property(
 			connector,
 			connector->dev->mode_config.scaling_mode_property,
-			DRM_MODE_SCALE_FULLSCREEN);
-		intel_connector->panel.fitting_mode = DRM_MODE_SCALE_FULLSCREEN;
+			DRM_MODE_SCALE_ASPECT);
+		intel_connector->panel.fitting_mode = DRM_MODE_SCALE_ASPECT;
 	}
 }
 
Signature · 1 line
1.7.9.5
Reviewed-by Tested-by on the v1 series
#6 lore raw

Re: [Intel-gfx] [PATCH 0/3] drm/i915: eDP scaling mode change support

In reply to Jani Nikula

Hi

2012/10/26 Jani Nikula <[email protected]>:

Quoted 8 lines

[Dropped lkml, added intel-gfx]

Hi Yuly, here's a slightly modified version of your patch, rebased on drm-intel-next-queued. I kept your authorship, but any new errors are totally mine...

These are compile tested only; I'd appreciate if you could check it still does what it says on the box!

I have nothing to add or remove. Tested on HSW eDP, used "xrandr" to alternate the property values. Works fine.

Being consistent on the default value between LVDS and eDP is certainly a nice thing.

For the 3 patches:

Quoted 25 lines

BR,
Jani.

Jani Nikula (1):
drm/i915/lvds: move fitting mode from intel_lvds_connector to
intel_panel

Yuly Novikov (2):
drm/i915/dp: allow configuring eDP panel fitting scaling mode drm/i915/dp: change eDP default scaling mode to respect aspect ratio

 drivers/gpu/drm/i915/intel_dp.c   |   31 ++++++++++++++++++++++++++++++-
 drivers/gpu/drm/i915/intel_drv.h  |    1 +
 drivers/gpu/drm/i915/intel_lvds.c |   24 ++++++++++--------------
 3 files changed, 41 insertions(+), 15 deletions(-)

--
1.7.9.5

_______________________________________________
Intel-gfx mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

Signature · 1 line
Paulo Zanoni
#7 lore raw

Re: [Intel-gfx] [PATCH 0/3] drm/i915: eDP scaling mode change support

Hi Jani,

Sorry for the delay, our branches have diverged significantly, and it took me quite a while to merge your changes.
On the bright sight, I've tested the patch on SandyBridge LDVS and IvyBridge eDP, and it works fine.

Regards,
Yuly.

Quoted 50 lines · Paulo Zanoni

Hi

2012/10/26 Jani Nikula <[email protected]>:

Quoted 8 lines

[Dropped lkml, added intel-gfx]

Hi Yuly, here's a slightly modified version of your patch, rebased on drm-intel-next-queued. I kept your authorship, but any new errors are totally mine...

These are compile tested only; I'd appreciate if you could check it still does what it says on the box!

I have nothing to add or remove. Tested on HSW eDP, used "xrandr" to alternate the property values. Works fine.

Being consistent on the default value between LVDS and eDP is certainly a nice thing.

For the 3 patches:

Quoted 18 lines

BR,
Jani.

Jani Nikula (1):
drm/i915/lvds: move fitting mode from intel_lvds_connector to
intel_panel

Yuly Novikov (2):
drm/i915/dp: allow configuring eDP panel fitting scaling mode drm/i915/dp: change eDP default scaling mode to respect aspect ratio

 drivers/gpu/drm/i915/intel_dp.c   |   31 ++++++++++++++++++++++++++++++-
 drivers/gpu/drm/i915/intel_drv.h  |    1 +
 drivers/gpu/drm/i915/intel_lvds.c |   24 ++++++++++--------------
 3 files changed, 41 insertions(+), 15 deletions(-)
Quoted 7 lines

--
1.7.9.5

_______________________________________________
Intel-gfx mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

Quoted 3 lines

--
Paulo Zanoni

_______________________________________________
dri-devel mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/dri-devel