[PATCH 17/36] drm/i915: Handle TV marigins in pfit setup

Ville Syrjala ville.syrjala at linux.intel.com
Wed Dec 18 16:10:34 UTC 2019


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

Deal with the TV margin properties when setting up the pfit.
For now we'll take a shortcut and make the TV margins mutually
exclusive with the LVDS/eDP/DSI scaling mode property.

v2: Split from the HDMI changes
    Fix the pfit vs. not check to actually work

Signed-off-by: Ville Syrjälä <ville.syrjala at linux.intel.com>
---
 drivers/gpu/drm/i915/display/intel_atomic.c |  4 +++
 drivers/gpu/drm/i915/display/intel_panel.c  | 30 ++++++++++++++++-----
 2 files changed, 28 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/i915/display/intel_atomic.c b/drivers/gpu/drm/i915/display/intel_atomic.c
index fd0026fc3618..e1ad9f18bb49 100644
--- a/drivers/gpu/drm/i915/display/intel_atomic.c
+++ b/drivers/gpu/drm/i915/display/intel_atomic.c
@@ -145,6 +145,10 @@ int intel_digital_connector_atomic_check(struct drm_connector *conn,
 	    new_conn_state->base.picture_aspect_ratio != old_conn_state->base.picture_aspect_ratio ||
 	    new_conn_state->base.content_type != old_conn_state->base.content_type ||
 	    new_conn_state->base.scaling_mode != old_conn_state->base.scaling_mode ||
+	    new_conn_state->base.tv.margins.left != old_conn_state->base.tv.margins.left ||
+	    new_conn_state->base.tv.margins.right != old_conn_state->base.tv.margins.right ||
+	    new_conn_state->base.tv.margins.top != old_conn_state->base.tv.margins.top ||
+	    new_conn_state->base.tv.margins.bottom != old_conn_state->base.tv.margins.bottom ||
 	    !blob_equal(new_conn_state->base.hdr_output_metadata,
 			old_conn_state->base.hdr_output_metadata))
 		crtc_state->mode_changed = true;
diff --git a/drivers/gpu/drm/i915/display/intel_panel.c b/drivers/gpu/drm/i915/display/intel_panel.c
index 0bd3e8626fec..2892ee6169ac 100644
--- a/drivers/gpu/drm/i915/display/intel_panel.c
+++ b/drivers/gpu/drm/i915/display/intel_panel.c
@@ -336,12 +336,31 @@ int intel_pch_panel_fitting(struct intel_crtc_state *crtc_state,
 		&crtc_state->hw.adjusted_mode;
 	int ret, x, y, width, height;
 
+	x = conn_state->tv.margins.left;
+	y = conn_state->tv.margins.top;
+
+	width = adjusted_mode->crtc_hdisplay -
+		conn_state->tv.margins.left -
+		conn_state->tv.margins.right;
+	height = adjusted_mode->crtc_vdisplay -
+		conn_state->tv.margins.top -
+		conn_state->tv.margins.bottom;
+
+	if (width <= 0 || height <= 0)
+		return -EINVAL;
+
 	/* Native modes don't need fitting */
-	if (adjusted_mode->crtc_hdisplay == crtc_state->pipe_src_w &&
-	    adjusted_mode->crtc_vdisplay == crtc_state->pipe_src_h &&
+	if (width == crtc_state->pipe_src_w &&
+	    height == crtc_state->pipe_src_h &&
+	    width == adjusted_mode->crtc_hdisplay &&
+	    height == adjusted_mode->crtc_vdisplay &&
 	    crtc_state->output_format != INTEL_OUTPUT_FORMAT_YCBCR420)
 		return 0;
 
+	/*
+	 * FIXME: margins and scaling_mode are implemented
+	 * in a mutually exclusive way for the time being.
+	 */
 	switch (conn_state->scaling_mode) {
 	case DRM_MODE_SCALE_CENTER:
 		width = crtc_state->pipe_src_w;
@@ -379,16 +398,15 @@ int intel_pch_panel_fitting(struct intel_crtc_state *crtc_state,
 		}
 		break;
 
-	case DRM_MODE_SCALE_NONE:
-		WARN_ON(adjusted_mode->crtc_hdisplay != crtc_state->pipe_src_w);
-		WARN_ON(adjusted_mode->crtc_vdisplay != crtc_state->pipe_src_h);
-		/* fall through */
 	case DRM_MODE_SCALE_FULLSCREEN:
 		x = y = 0;
 		width = adjusted_mode->crtc_hdisplay;
 		height = adjusted_mode->crtc_vdisplay;
 		break;
 
+	case DRM_MODE_SCALE_NONE:
+		break;
+
 	default:
 		MISSING_CASE(conn_state->scaling_mode);
 		return -EINVAL;
-- 
2.23.0



More information about the Intel-gfx-trybot mailing list