[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