From patchwork Thu Oct 17 08:09:35 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [1/6] drm/i915/display: Disable joiner and pch From: Nemesa Garg X-Patchwork-Id: 620129 Message-Id: <20241017080940.365383-2-nemesa.garg@intel.com> To: intel-gfx-trybot@lists.freedesktop.org Cc: Nemesa Garg Date: Thu, 17 Oct 2024 13:39:35 +0530 Signed-off-by: Nemesa Garg --- drivers/gpu/drm/i915/display/intel_panel.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/gpu/drm/i915/display/intel_panel.c b/drivers/gpu/drm/i915/display/intel_panel.c index 71454ddef20f..271d29455cc6 100644 --- a/drivers/gpu/drm/i915/display/intel_panel.c +++ b/drivers/gpu/drm/i915/display/intel_panel.c @@ -393,6 +393,9 @@ static int pch_panel_fitting(struct intel_crtc_state *crtc_state, int pipe_src_h = drm_rect_height(&crtc_state->pipe_src); int x, y, width, height; + if (crtc_state->joiner_pipes) + return 0; + /* Native modes don't need fitting */ if (adjusted_mode->crtc_hdisplay == pipe_src_w && adjusted_mode->crtc_vdisplay == pipe_src_h && From patchwork Thu Oct 17 08:09:36 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [2/6] drm/i915/display: Call panel_fitting from pipe_config From: Nemesa Garg X-Patchwork-Id: 620130 Message-Id: <20241017080940.365383-3-nemesa.garg@intel.com> To: intel-gfx-trybot@lists.freedesktop.org Cc: Nemesa Garg Date: Thu, 17 Oct 2024 13:39:36 +0530 Signed-off-by: Nemesa Garg --- drivers/gpu/drm/i915/display/intel_display.c | 22 ++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c index b4ef4d59da1a..9dd140719349 100644 --- a/drivers/gpu/drm/i915/display/intel_display.c +++ b/drivers/gpu/drm/i915/display/intel_display.c @@ -2520,6 +2520,26 @@ static int intel_crtc_compute_pipe_mode(struct intel_crtc_state *crtc_state) return 0; } +static void intel_crtc_compute_pfit(struct intel_atomic_state *state, + struct intel_crtc_state *crtc_state) +{ + struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); + struct drm_i915_private *i915 = to_i915(crtc->base.dev); + struct drm_connector *connector; + struct drm_connector_state *connector_state; + int i; + + for_each_new_connector_in_state(&state->base, connector, + connector_state, i) { + + if (connector_state->crtc != &crtc->base) + continue; + + if (!HAS_GMCH(i915)) + intel_pch_panel_fitting(crtc_state, connector_state); + } +} + static int intel_crtc_compute_config(struct intel_atomic_state *state, struct intel_crtc *crtc) { @@ -2539,6 +2559,8 @@ static int intel_crtc_compute_config(struct intel_atomic_state *state, if (ret) return ret; + intel_crtc_compute_pfit(state, crtc_state); + intel_crtc_compute_pixel_rate(crtc_state); if (crtc_state->has_pch_encoder) From patchwork Thu Oct 17 08:09:37 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [3/6] drm/i915/display: Replace adjusted mode with pipe mode From: Nemesa Garg X-Patchwork-Id: 620132 Message-Id: <20241017080940.365383-4-nemesa.garg@intel.com> To: intel-gfx-trybot@lists.freedesktop.org Cc: Nemesa Garg Date: Thu, 17 Oct 2024 13:39:37 +0530 Signed-off-by: Nemesa Garg --- drivers/gpu/drm/i915/display/intel_panel.c | 52 +++++++++++----------- drivers/gpu/drm/i915/display/intel_panel.h | 6 ++- 2 files changed, 30 insertions(+), 28 deletions(-) diff --git a/drivers/gpu/drm/i915/display/intel_panel.c b/drivers/gpu/drm/i915/display/intel_panel.c index 271d29455cc6..98224623246f 100644 --- a/drivers/gpu/drm/i915/display/intel_panel.c +++ b/drivers/gpu/drm/i915/display/intel_panel.c @@ -387,8 +387,8 @@ void intel_panel_add_encoder_fixed_mode(struct intel_connector *connector, static int pch_panel_fitting(struct intel_crtc_state *crtc_state, const struct drm_connector_state *conn_state) { - const struct drm_display_mode *adjusted_mode = - &crtc_state->hw.adjusted_mode; + const struct drm_display_mode *pipe_mode = + &crtc_state->hw.pipe_mode; int pipe_src_w = drm_rect_width(&crtc_state->pipe_src); int pipe_src_h = drm_rect_height(&crtc_state->pipe_src); int x, y, width, height; @@ -397,8 +397,8 @@ static int pch_panel_fitting(struct intel_crtc_state *crtc_state, return 0; /* Native modes don't need fitting */ - if (adjusted_mode->crtc_hdisplay == pipe_src_w && - adjusted_mode->crtc_vdisplay == pipe_src_h && + if (pipe_mode->crtc_hdisplay == pipe_src_w && + pipe_mode->crtc_vdisplay == pipe_src_h && crtc_state->output_format != INTEL_OUTPUT_FORMAT_YCBCR420) return 0; @@ -406,45 +406,45 @@ static int pch_panel_fitting(struct intel_crtc_state *crtc_state, case DRM_MODE_SCALE_CENTER: width = pipe_src_w; height = pipe_src_h; - x = (adjusted_mode->crtc_hdisplay - width + 1)/2; - y = (adjusted_mode->crtc_vdisplay - height + 1)/2; + x = (pipe_mode->crtc_hdisplay - width + 1)/2; + y = (pipe_mode->crtc_vdisplay - height + 1)/2; break; case DRM_MODE_SCALE_ASPECT: /* Scale but preserve the aspect ratio */ { - u32 scaled_width = adjusted_mode->crtc_hdisplay * pipe_src_h; - u32 scaled_height = pipe_src_w * adjusted_mode->crtc_vdisplay; + u32 scaled_width = pipe_mode->crtc_hdisplay * pipe_src_h; + u32 scaled_height = pipe_src_w * pipe_mode->crtc_vdisplay; if (scaled_width > scaled_height) { /* pillar */ width = scaled_height / pipe_src_h; if (width & 1) width++; - x = (adjusted_mode->crtc_hdisplay - width + 1) / 2; + x = (pipe_mode->crtc_hdisplay - width + 1) / 2; y = 0; - height = adjusted_mode->crtc_vdisplay; + height = pipe_mode->crtc_vdisplay; } else if (scaled_width < scaled_height) { /* letter */ height = scaled_width / pipe_src_w; if (height & 1) height++; - y = (adjusted_mode->crtc_vdisplay - height + 1) / 2; + y = (pipe_mode->crtc_vdisplay - height + 1) / 2; x = 0; - width = adjusted_mode->crtc_hdisplay; + width = pipe_mode->crtc_hdisplay; } else { x = y = 0; - width = adjusted_mode->crtc_hdisplay; - height = adjusted_mode->crtc_vdisplay; + width = pipe_mode->crtc_hdisplay; + height = pipe_mode->crtc_vdisplay; } } break; case DRM_MODE_SCALE_NONE: - WARN_ON(adjusted_mode->crtc_hdisplay != pipe_src_w); - WARN_ON(adjusted_mode->crtc_vdisplay != pipe_src_h); + WARN_ON(pipe_mode->crtc_hdisplay != pipe_src_w); + WARN_ON(pipe_mode->crtc_vdisplay != pipe_src_h); fallthrough; case DRM_MODE_SCALE_FULLSCREEN: x = y = 0; - width = adjusted_mode->crtc_hdisplay; - height = adjusted_mode->crtc_vdisplay; + width = pipe_mode->crtc_hdisplay; + height = pipe_mode->crtc_vdisplay; break; default: @@ -669,16 +669,16 @@ static int gmch_panel_fitting(struct intel_crtc_state *crtc_state, return 0; } -int intel_panel_fitting(struct intel_crtc_state *crtc_state, - const struct drm_connector_state *conn_state) +int intel_gmch_panel_fitting(struct intel_crtc_state *crtc_state, + const struct drm_connector_state *conn_state) { - struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); - struct drm_i915_private *i915 = to_i915(crtc->base.dev); + return gmch_panel_fitting(crtc_state, conn_state); +} - if (HAS_GMCH(i915)) - return gmch_panel_fitting(crtc_state, conn_state); - else - return pch_panel_fitting(crtc_state, conn_state); +int intel_pch_panel_fitting(struct intel_crtc_state *crtc_state, + const struct drm_connector_state *conn_state) +{ + return pch_panel_fitting(crtc_state, conn_state); } enum drm_connector_status diff --git a/drivers/gpu/drm/i915/display/intel_panel.h b/drivers/gpu/drm/i915/display/intel_panel.h index 15a8c897b33f..05f99a5bd1c5 100644 --- a/drivers/gpu/drm/i915/display/intel_panel.h +++ b/drivers/gpu/drm/i915/display/intel_panel.h @@ -42,8 +42,10 @@ enum drrs_type intel_panel_drrs_type(struct intel_connector *connector); enum drm_mode_status intel_panel_mode_valid(struct intel_connector *connector, const struct drm_display_mode *mode); -int intel_panel_fitting(struct intel_crtc_state *crtc_state, - const struct drm_connector_state *conn_state); +int intel_gmch_panel_fitting(struct intel_crtc_state *crtc_state, + const struct drm_connector_state *conn_state); +int intel_pch_panel_fitting(struct intel_crtc_state *crtc_state, + const struct drm_connector_state *conn_state); int intel_panel_compute_config(struct intel_connector *connector, struct drm_display_mode *adjusted_mode); void intel_panel_add_edid_fixed_modes(struct intel_connector *connector, From patchwork Thu Oct 17 08:09:38 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [4/6] drm/i915/dispaly: Allow joiner and pfit From: Nemesa Garg X-Patchwork-Id: 620131 Message-Id: <20241017080940.365383-5-nemesa.garg@intel.com> To: intel-gfx-trybot@lists.freedesktop.org Cc: Nemesa Garg Date: Thu, 17 Oct 2024 13:39:38 +0530 Signed-off-by: Nemesa Garg --- drivers/gpu/drm/i915/display/intel_panel.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/drivers/gpu/drm/i915/display/intel_panel.c b/drivers/gpu/drm/i915/display/intel_panel.c index 98224623246f..c59994a3600a 100644 --- a/drivers/gpu/drm/i915/display/intel_panel.c +++ b/drivers/gpu/drm/i915/display/intel_panel.c @@ -393,9 +393,6 @@ static int pch_panel_fitting(struct intel_crtc_state *crtc_state, int pipe_src_h = drm_rect_height(&crtc_state->pipe_src); int x, y, width, height; - if (crtc_state->joiner_pipes) - return 0; - /* Native modes don't need fitting */ if (pipe_mode->crtc_hdisplay == pipe_src_w && pipe_mode->crtc_vdisplay == pipe_src_h && From patchwork Thu Oct 17 08:09:39 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [5/6] drm/i915/display: Add gmch_panel_fitting in all encoders From: Nemesa Garg X-Patchwork-Id: 620134 Message-Id: <20241017080940.365383-6-nemesa.garg@intel.com> To: intel-gfx-trybot@lists.freedesktop.org Cc: Nemesa Garg Date: Thu, 17 Oct 2024 13:39:39 +0530 Signed-off-by: Nemesa Garg --- drivers/gpu/drm/i915/display/icl_dsi.c | 4 ---- drivers/gpu/drm/i915/display/intel_dp.c | 5 ++--- drivers/gpu/drm/i915/display/intel_hdmi.c | 6 ------ drivers/gpu/drm/i915/display/intel_lvds.c | 9 +++++---- drivers/gpu/drm/i915/display/vlv_dsi.c | 8 +++++--- 5 files changed, 12 insertions(+), 20 deletions(-) diff --git a/drivers/gpu/drm/i915/display/icl_dsi.c b/drivers/gpu/drm/i915/display/icl_dsi.c index 293efc1f841d..1ccc52337777 100644 --- a/drivers/gpu/drm/i915/display/icl_dsi.c +++ b/drivers/gpu/drm/i915/display/icl_dsi.c @@ -1641,10 +1641,6 @@ static int gen11_dsi_compute_config(struct intel_encoder *encoder, if (ret) return ret; - ret = intel_panel_fitting(pipe_config, conn_state); - if (ret) - return ret; - adjusted_mode->flags = 0; /* Dual link goes to trancoder DSI'0' */ diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c index 90fa73575feb..b941f6ed8c4b 100644 --- a/drivers/gpu/drm/i915/display/intel_dp.c +++ b/drivers/gpu/drm/i915/display/intel_dp.c @@ -3058,9 +3058,8 @@ intel_dp_compute_config(struct intel_encoder *encoder, if (ret) return ret; - if ((intel_dp_is_edp(intel_dp) && fixed_mode) || - pipe_config->output_format == INTEL_OUTPUT_FORMAT_YCBCR420) { - ret = intel_panel_fitting(pipe_config, conn_state); + if (HAS_GMCH(dev_priv)) { + ret = intel_gmch_panel_fitting(pipe_config, conn_state); if (ret) return ret; } diff --git a/drivers/gpu/drm/i915/display/intel_hdmi.c b/drivers/gpu/drm/i915/display/intel_hdmi.c index cd9ee171e0df..1759e91d6789 100644 --- a/drivers/gpu/drm/i915/display/intel_hdmi.c +++ b/drivers/gpu/drm/i915/display/intel_hdmi.c @@ -2345,12 +2345,6 @@ int intel_hdmi_compute_config(struct intel_encoder *encoder, return ret; } - if (intel_hdmi_is_ycbcr420(pipe_config)) { - ret = intel_panel_fitting(pipe_config, conn_state); - if (ret) - return ret; - } - pipe_config->limited_color_range = intel_hdmi_limited_color_range(pipe_config, conn_state); diff --git a/drivers/gpu/drm/i915/display/intel_lvds.c b/drivers/gpu/drm/i915/display/intel_lvds.c index fb4ed9f7855b..b532ad1bc2d8 100644 --- a/drivers/gpu/drm/i915/display/intel_lvds.c +++ b/drivers/gpu/drm/i915/display/intel_lvds.c @@ -463,10 +463,11 @@ static int intel_lvds_compute_config(struct intel_encoder *encoder, if (adjusted_mode->flags & DRM_MODE_FLAG_DBLSCAN) return -EINVAL; - ret = intel_panel_fitting(crtc_state, conn_state); - if (ret) - return ret; - + if (HAS_GMCH(i915)) { + ret = intel_gmch_panel_fitting(crtc_state, conn_state); + if (ret) + return ret; + } /* * XXX: It would be nice to support lower refresh rates on the * panels to reduce power consumption, and perhaps match the diff --git a/drivers/gpu/drm/i915/display/vlv_dsi.c b/drivers/gpu/drm/i915/display/vlv_dsi.c index d21f3fb39706..be1681a1a4e4 100644 --- a/drivers/gpu/drm/i915/display/vlv_dsi.c +++ b/drivers/gpu/drm/i915/display/vlv_dsi.c @@ -282,9 +282,11 @@ static int intel_dsi_compute_config(struct intel_encoder *encoder, if (ret) return ret; - ret = intel_panel_fitting(pipe_config, conn_state); - if (ret) - return ret; + if (HAS_GMCH(dev_priv)) { + ret = intel_gmch_panel_fitting(pipe_config, conn_state); + if (ret) + return ret; + } if (adjusted_mode->flags & DRM_MODE_FLAG_DBLSCAN) return -EINVAL; From patchwork Thu Oct 17 08:09:40 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [6/6] drm/i915/display: Add early pipe_src initialisation for gmch From: Nemesa Garg X-Patchwork-Id: 620133 Message-Id: <20241017080940.365383-7-nemesa.garg@intel.com> To: intel-gfx-trybot@lists.freedesktop.org Cc: Nemesa Garg Date: Thu, 17 Oct 2024 13:39:40 +0530 Signed-off-by: Nemesa Garg --- drivers/gpu/drm/i915/display/intel_display.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c index 9dd140719349..6643b39bce13 100644 --- a/drivers/gpu/drm/i915/display/intel_display.c +++ b/drivers/gpu/drm/i915/display/intel_display.c @@ -4722,7 +4722,9 @@ intel_modeset_pipe_config(struct intel_atomic_state *state, */ drm_mode_get_hv_timing(&crtc_state->hw.mode, &pipe_src_w, &pipe_src_h); - drm_rect_init(&crtc_state->pipe_src, 0, 0, + + if (HAS_GMCH(i915)) + drm_rect_init(&crtc_state->pipe_src, 0, 0, pipe_src_w, pipe_src_h); for_each_new_connector_in_state(&state->base, connector, connector_state, i) {