intel-gfx.lists.freedesktop.org archive mirror
 help / color / mirror / Atom feed
* [Intel-gfx] [PATCH] drm/i915/dp/mst : Get clock rate from sink's available PBN
@ 2020-01-06 17:41 Lee Shawn C
  2020-01-06  9:54 ` [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for " Patchwork
                   ` (11 more replies)
  0 siblings, 12 replies; 16+ messages in thread
From: Lee Shawn C @ 2020-01-06 17:41 UTC (permalink / raw)
  To: intel-gfx; +Cc: Cooper Chiou

Driver report physcial bandwidth for max dot clock rate.
It would caused compatibility issue sometimes when physical
bandwidth exceed MST hub output ability.

For example, here is a MST hub with HDMI 1.4 and DP 1.2 output.
And source have DP 1.2 output capability. Connect a HDMI 2.0
display then source will retrieve EDID from external monitor.
Driver got max resolution was 4k@60fps. DP 1.2 can support
this resolution because it did not surpass max physical bandwidth.
After modeset, source output display data but MST hub can't
output HDMI properly due to it already over HDMI 1.4 spec.

Apply this calculation, source calcualte max dot clock according
to available PBN. Driver will remove the mode that over current
clock rate. And external display can works normally.

Cc: Manasi Navare <manasi.d.navare@intel.com>
Cc: Jani Nikula <jani.nikula@linux.intel.com>
Cc: Ville Syrjala <ville.syrjala@linux.intel.com>
Cc: Cooper Chiou <cooper.chiou@intel.com>

Signed-off-by: Lee Shawn C <shawn.c.lee@intel.com>
---
 drivers/gpu/drm/i915/display/intel_dp_mst.c | 27 ++++++++++++++++++---
 1 file changed, 24 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_dp_mst.c b/drivers/gpu/drm/i915/display/intel_dp_mst.c
index 3b066c63816d..eaa440165ad2 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_mst.c
+++ b/drivers/gpu/drm/i915/display/intel_dp_mst.c
@@ -550,6 +550,27 @@ static int intel_dp_mst_get_modes(struct drm_connector *connector)
 	return intel_dp_mst_get_ddc_modes(connector);
 }
 
+static int
+intel_dp_mst_downstream_max_dotclock(struct drm_connector *connector)
+{
+	struct intel_connector *intel_connector = to_intel_connector(connector);
+	struct intel_dp *intel_dp = intel_connector->mst_port;
+	struct drm_dp_mst_port *port;
+	u64 clock_rate = 0;
+
+	if (intel_dp->mst_mgr.mst_primary)
+		list_for_each_entry(port, &intel_dp->mst_mgr.mst_primary->ports, next)
+			if (port->connector == connector) {
+				clock_rate = ((u64)port->available_pbn * (54 * 8 * 1000 * 1000)) / (64 * 1006);
+
+				// FIXME: We should used pipe bpp to do this calculation.
+				//        But can't retrieve bpp setting from drm_connector.
+				return (int)(clock_rate / 24);
+			}
+
+	return to_i915(connector->dev)->max_dotclk_freq;
+}
+
 static enum drm_mode_status
 intel_dp_mst_mode_valid(struct drm_connector *connector,
 			struct drm_display_mode *mode)
@@ -557,8 +578,7 @@ intel_dp_mst_mode_valid(struct drm_connector *connector,
 	struct drm_i915_private *dev_priv = to_i915(connector->dev);
 	struct intel_connector *intel_connector = to_intel_connector(connector);
 	struct intel_dp *intel_dp = intel_connector->mst_port;
-	int max_dotclk = to_i915(connector->dev)->max_dotclk_freq;
-	int max_rate, mode_rate, max_lanes, max_link_clock;
+	int max_rate, mode_rate, max_lanes, max_link_clock, max_dotclk;
 
 	if (drm_connector_is_unregistered(connector))
 		return MODE_ERROR;
@@ -572,7 +592,8 @@ intel_dp_mst_mode_valid(struct drm_connector *connector,
 	max_rate = intel_dp_max_data_rate(max_link_clock, max_lanes);
 	mode_rate = intel_dp_link_required(mode->clock, 18);
 
-	/* TODO - validate mode against available PBN for link */
+	max_dotclk = intel_dp_mst_downstream_max_dotclock(connector);
+
 	if (mode->clock < 10000)
 		return MODE_CLOCK_LOW;
 
-- 
2.17.1

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

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

end of thread, other threads:[~2020-03-19 17:26 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-01-06 17:41 [Intel-gfx] [PATCH] drm/i915/dp/mst : Get clock rate from sink's available PBN Lee Shawn C
2020-01-06  9:54 ` [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for " Patchwork
2020-01-06 10:22 ` [Intel-gfx] ✓ Fi.CI.BAT: success " Patchwork
2020-01-06 10:22 ` [Intel-gfx] ✗ Fi.CI.BUILD: warning " Patchwork
2020-01-06 11:54 ` [Intel-gfx] ✗ Fi.CI.IGT: failure " Patchwork
2020-01-06 14:48 ` [Intel-gfx] [PATCH] " kbuild test robot
2020-01-08 15:15 ` Ville Syrjälä
2020-01-09  3:11   ` Lee, Shawn C
2020-02-05  5:56 ` [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for drm/i915/dp/mst : Get clock rate from sink's available PBN (rev2) Patchwork
2020-02-05  6:45 ` [Intel-gfx] ✓ Fi.CI.BAT: success " Patchwork
2020-02-05  6:45 ` [Intel-gfx] ✗ Fi.CI.BUILD: warning " Patchwork
2020-02-05 13:18 ` [Intel-gfx] [PATCH v2] drm/i915/dp/mst : Get clock rate from sink's available PBN Lee Shawn C
2020-02-07 11:10 ` [Intel-gfx] ✓ Fi.CI.IGT: success for drm/i915/dp/mst : Get clock rate from sink's available PBN (rev2) Patchwork
2020-03-11 23:09 ` [Intel-gfx] [PATCH] drm/i915/dp/mst : Get clock rate from sink's available PBN Lyude Paul
2020-03-16 13:56   ` Lee, Shawn C
2020-03-19 17:26     ` Lyude Paul

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).