intel-gfx.lists.freedesktop.org archive mirror
 help / color / mirror / Atom feed
* [Intel-gfx] [PATCH] drm/i915: Check require bandwidth did not exceed LSPCON limitation
@ 2020-01-17 13:47 Lee Shawn C
  2020-01-17  6:43 ` [Intel-gfx] ✓ Fi.CI.BAT: success for " Patchwork
                   ` (8 more replies)
  0 siblings, 9 replies; 16+ messages in thread
From: Lee Shawn C @ 2020-01-17 13:47 UTC (permalink / raw)
  To: intel-gfx; +Cc: Cooper Chiou, Sam McNally

While mode setting, driver would calculate mode rate based on
resolution and bpp. And choose the best bpp that did not exceed
DP bandwidtd.

But LSPCON had more restriction due to it convert DP to HDMI.
Driver should respect HDMI's bandwidth limitation if LSPCON
was active. This change would ignore the bpp when its required
output bandwidth already over HDMI 2.0 or 1.4 spec.

Cc: Imre Deak <imre.deak@intel.com>
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Cc: Jani Nikula <jani.nikula@linux.intel.com>
Cc: Cooper Chiou <cooper.chiou@intel.com>
Cc: Sam McNally <sammc@google.com>
Signed-off-by: Lee Shawn C <shawn.c.lee@intel.com>
---
 drivers/gpu/drm/i915/display/intel_dp.c     | 45 +++++++++++++++++++++
 drivers/gpu/drm/i915/display/intel_lspcon.c |  5 +++
 drivers/gpu/drm/i915/display/intel_lspcon.h |  1 +
 3 files changed, 51 insertions(+)

diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
index c7424e2a04a3..c27d3e7ac219 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -1976,6 +1976,47 @@ static int intel_dp_output_bpp(const struct intel_crtc_state *crtc_state, int bp
 	return bpp;
 }
 
+static bool
+intel_dp_lspcon_exceed_bandwidth_limitation(struct intel_dp *intel_dp,
+					    struct intel_crtc_state *pipe_config,
+					    int bpp)
+{
+	struct intel_lspcon *lspcon = dp_to_lspcon(intel_dp);
+	struct intel_connector *connector = intel_dp->attached_connector;
+	const struct drm_display_info *info = &connector->base.display_info;
+	enum drm_lspcon_mode lspcon_current_mode = lspcon_get_mode(lspcon);
+	const int pcon_mode_max_tmds_clock = 600000;
+	const int ls_mode_max_tmds_clock   = 340000;
+	int mode_rate, max_tmds_clock = pcon_mode_max_tmds_clock;
+
+	if (lspcon->active) {
+		switch (bpp) {
+		case 36:
+			mode_rate = pipe_config->hw.adjusted_mode.crtc_clock * 3 / 2;
+			break;
+		case 30:
+			mode_rate = pipe_config->hw.adjusted_mode.crtc_clock * 5 / 4;
+			break;
+		case 24:
+		default:
+			mode_rate = pipe_config->hw.adjusted_mode.crtc_clock;
+			break;
+		}
+
+		if (lspcon_current_mode == DRM_LSPCON_MODE_LS)
+			max_tmds_clock = ls_mode_max_tmds_clock;
+
+		if (info->max_tmds_clock)
+			max_tmds_clock = min(max_tmds_clock,
+					     info->max_tmds_clock);
+
+		if (mode_rate > max_tmds_clock)
+			return true;
+	}
+
+	return false;
+}
+
 /* Optimize link config in order: max bpp, min clock, min lanes */
 static int
 intel_dp_compute_link_config_wide(struct intel_dp *intel_dp,
@@ -1989,6 +2030,10 @@ intel_dp_compute_link_config_wide(struct intel_dp *intel_dp,
 	for (bpp = limits->max_bpp; bpp >= limits->min_bpp; bpp -= 2 * 3) {
 		int output_bpp = intel_dp_output_bpp(pipe_config, bpp);
 
+		/* Bypass th bpp if require bandwidth over HDMI spec when LSPCON active */
+		if (intel_dp_lspcon_exceed_bandwidth_limitation(intel_dp, pipe_config, output_bpp))
+			continue;
+
 		mode_rate = intel_dp_link_required(adjusted_mode->crtc_clock,
 						   output_bpp);
 
diff --git a/drivers/gpu/drm/i915/display/intel_lspcon.c b/drivers/gpu/drm/i915/display/intel_lspcon.c
index d807c5648c87..6952c5028fdf 100644
--- a/drivers/gpu/drm/i915/display/intel_lspcon.c
+++ b/drivers/gpu/drm/i915/display/intel_lspcon.c
@@ -550,6 +550,11 @@ void lspcon_wait_pcon_mode(struct intel_lspcon *lspcon)
 	lspcon_wait_mode(lspcon, DRM_LSPCON_MODE_PCON);
 }
 
+int lspcon_get_mode(struct intel_lspcon *lspcon)
+{
+	return lspcon_get_current_mode(lspcon);
+}
+
 bool lspcon_init(struct intel_digital_port *intel_dig_port)
 {
 	struct intel_dp *dp = &intel_dig_port->dp;
diff --git a/drivers/gpu/drm/i915/display/intel_lspcon.h b/drivers/gpu/drm/i915/display/intel_lspcon.h
index 37cfddf8a9c5..5ce9daef9708 100644
--- a/drivers/gpu/drm/i915/display/intel_lspcon.h
+++ b/drivers/gpu/drm/i915/display/intel_lspcon.h
@@ -18,6 +18,7 @@ struct intel_lspcon;
 bool lspcon_init(struct intel_digital_port *intel_dig_port);
 void lspcon_resume(struct intel_lspcon *lspcon);
 void lspcon_wait_pcon_mode(struct intel_lspcon *lspcon);
+int lspcon_get_mode(struct intel_lspcon *lspcon);
 void lspcon_write_infoframe(struct intel_encoder *encoder,
 			    const struct intel_crtc_state *crtc_state,
 			    unsigned int type,
-- 
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
* [Intel-gfx] [PATCH] drm/i915: Check require bandwidth did not exceed LSPCON limitation
@ 2020-02-05 14:38 Lee Shawn C
  2020-02-05  9:29 ` Lee, Shawn C
  0 siblings, 1 reply; 16+ messages in thread
From: Lee Shawn C @ 2020-02-05 14:38 UTC (permalink / raw)
  To: intel-gfx; +Cc: Cooper Chiou, Sam McNally

While mode setting, driver would calculate mode rate based on
resolution and bpp. And choose the best bpp that did not exceed
DP bandwidtd.

But LSPCON had more restriction due to it convert DP to HDMI.
Driver should respect HDMI's bandwidth limitation if LSPCON
was active. This change would ignore the bpp when its required
output bandwidth already over HDMI 2.0 or 1.4 spec.

Cc: Imre Deak <imre.deak@intel.com>
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Cc: Jani Nikula <jani.nikula@linux.intel.com>
Cc: Cooper Chiou <cooper.chiou@intel.com>
Cc: Sam McNally <sammc@google.com>
Signed-off-by: Lee Shawn C <shawn.c.lee@intel.com>
---
 drivers/gpu/drm/i915/display/intel_dp.c     | 18 ++++++++++++++++++
 drivers/gpu/drm/i915/display/intel_lspcon.c | 10 ++++++++++
 drivers/gpu/drm/i915/display/intel_lspcon.h |  1 +
 3 files changed, 29 insertions(+)

diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
index 2057f63e32f0..64969ae1c285 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -1992,6 +1992,9 @@ intel_dp_compute_link_config_wide(struct intel_dp *intel_dp,
 				  const struct link_config_limits *limits)
 {
 	struct drm_display_mode *adjusted_mode = &pipe_config->hw.adjusted_mode;
+	struct intel_connector *connector = intel_dp->attached_connector;
+	const struct drm_display_info *info = &connector->base.display_info;
+	struct intel_lspcon *lspcon = dp_to_lspcon(intel_dp);
 	int bpp, clock, lane_count;
 	int mode_rate, link_clock, link_avail;
 
@@ -2001,6 +2004,21 @@ intel_dp_compute_link_config_wide(struct intel_dp *intel_dp,
 		mode_rate = intel_dp_link_required(adjusted_mode->crtc_clock,
 						   output_bpp);
 
+		/*
+		 * Bypass this mode if require bandwidth over downstream
+		 * limitation or HDMI spec when LSPCON active.
+		 */
+		if (lspcon->active) {
+			int max_clock_rate = lspcon_max_rate(lspcon);
+
+			if (info->max_tmds_clock)
+				max_clock_rate = min(max_clock_rate,
+						     info->max_tmds_clock);
+
+			if (mode_rate > max_clock_rate)
+				continue;
+		}
+
 		for (clock = limits->min_clock; clock <= limits->max_clock; clock++) {
 			for (lane_count = limits->min_lane_count;
 			     lane_count <= limits->max_lane_count;
diff --git a/drivers/gpu/drm/i915/display/intel_lspcon.c b/drivers/gpu/drm/i915/display/intel_lspcon.c
index d807c5648c87..3b0438356a88 100644
--- a/drivers/gpu/drm/i915/display/intel_lspcon.c
+++ b/drivers/gpu/drm/i915/display/intel_lspcon.c
@@ -518,6 +518,16 @@ void lspcon_set_infoframes(struct intel_encoder *encoder,
 				  buf, ret);
 }
 
+int lspcon_max_rate(struct intel_lspcon *lspcon)
+{
+	enum drm_lspcon_mode current_mode = lspcon_get_current_mode(lspcon);
+
+	if (current_mode == DRM_LSPCON_MODE_LS)
+		return DIV_ROUND_UP(340000 * 24, 8);
+
+	return DIV_ROUND_UP(600000 * 24, 8);
+}
+
 u32 lspcon_infoframes_enabled(struct intel_encoder *encoder,
 			      const struct intel_crtc_state *pipe_config)
 {
diff --git a/drivers/gpu/drm/i915/display/intel_lspcon.h b/drivers/gpu/drm/i915/display/intel_lspcon.h
index 37cfddf8a9c5..b584c02ab33b 100644
--- a/drivers/gpu/drm/i915/display/intel_lspcon.h
+++ b/drivers/gpu/drm/i915/display/intel_lspcon.h
@@ -18,6 +18,7 @@ struct intel_lspcon;
 bool lspcon_init(struct intel_digital_port *intel_dig_port);
 void lspcon_resume(struct intel_lspcon *lspcon);
 void lspcon_wait_pcon_mode(struct intel_lspcon *lspcon);
+int lspcon_max_rate(struct intel_lspcon *lspcon);
 void lspcon_write_infoframe(struct intel_encoder *encoder,
 			    const struct intel_crtc_state *crtc_state,
 			    unsigned int type,
-- 
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-02-05  9:29 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-01-17 13:47 [Intel-gfx] [PATCH] drm/i915: Check require bandwidth did not exceed LSPCON limitation Lee Shawn C
2020-01-17  6:43 ` [Intel-gfx] ✓ Fi.CI.BAT: success for " Patchwork
2020-01-17  6:43 ` [Intel-gfx] ✗ Fi.CI.BUILD: warning " Patchwork
2020-01-17  6:56 ` [Intel-gfx] [PATCH] " Jani Nikula
2020-01-17  7:15   ` Lee, Shawn C
2020-01-17 14:04 ` Ville Syrjälä
2020-01-17 16:08   ` Lee, Shawn C
2020-01-20 10:51 ` [Intel-gfx] ✓ Fi.CI.IGT: success for " Patchwork
2020-01-21  6:30 ` [Intel-gfx] ✗ Fi.CI.BUILD: failure for drm/i915: Check require bandwidth did not exceed LSPCON limitation (rev5) Patchwork
2020-01-21  7:49 ` [Intel-gfx] ✓ Fi.CI.BAT: success for drm/i915: Check require bandwidth did not exceed LSPCON limitation (rev3) Patchwork
2020-01-21 13:26 ` [Intel-gfx] [PATCH v2] drm/i915: Check require bandwidth did not exceed LSPCON limitation Lee Shawn C
2020-01-21  6:14   ` Sharma, Shashank
2020-01-21  6:16     ` Sharma, Shashank
2020-01-21 13:33 ` [Intel-gfx] [PATCH v3] " Lee Shawn C
2020-02-05 14:38 [Intel-gfx] [PATCH] " Lee Shawn C
2020-02-05  9:29 ` Lee, Shawn C

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).