From: "Ville Syrjälä" <ville.syrjala@linux.intel.com>
To: Manasi Navare <manasi.d.navare@intel.com>
Cc: intel-gfx@lists.freedesktop.org
Subject: Re: [Intel-gfx] [PATCH v2 3/3] drm/i915/dp: Add all tiled and port sync conns to modeset
Date: Wed, 5 Feb 2020 16:32:48 +0200 [thread overview]
Message-ID: <20200205143248.GI13686@intel.com> (raw)
In-Reply-To: <20200203074756.10549-3-manasi.d.navare@intel.com>
On Sun, Feb 02, 2020 at 11:47:56PM -0800, Manasi Navare wrote:
> If one of the synced crtcs needs a full modeset, we need
> to make sure all the synced crtcs are forced a full
> modeset.
>
> v2:
> * Add tiles based on cpu_trans check (Ville)
>
> Suggested-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
> Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
> Signed-off-by: Manasi Navare <manasi.d.navare@intel.com>
> ---
> drivers/gpu/drm/i915/display/intel_display.c | 85 -----------
> drivers/gpu/drm/i915/display/intel_dp.c | 142 ++++++++++++++++++-
> 2 files changed, 141 insertions(+), 86 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
> index a943787167de..6383d1287472 100644
> --- a/drivers/gpu/drm/i915/display/intel_display.c
> +++ b/drivers/gpu/drm/i915/display/intel_display.c
> @@ -14669,76 +14669,6 @@ static bool intel_cpu_transcoders_need_modeset(struct intel_atomic_state *state,
> return false;
> }
>
> -static int
> -intel_modeset_all_tiles(struct intel_atomic_state *state, int tile_grp_id)
> -{
> - struct drm_i915_private *dev_priv = to_i915(state->base.dev);
> - struct drm_connector *connector;
> - struct drm_connector_list_iter conn_iter;
> - int ret = 0;
> -
> - drm_connector_list_iter_begin(&dev_priv->drm, &conn_iter);
> - drm_for_each_connector_iter(connector, &conn_iter) {
> - struct drm_connector_state *conn_state;
> - struct drm_crtc_state *crtc_state;
> -
> - if (!connector->has_tile ||
> - connector->tile_group->id != tile_grp_id)
> - continue;
> - conn_state = drm_atomic_get_connector_state(&state->base,
> - connector);
> - if (IS_ERR(conn_state)) {
> - ret = PTR_ERR(conn_state);
> - break;
> - }
> -
> - if (!conn_state->crtc)
> - continue;
> -
> - crtc_state = drm_atomic_get_crtc_state(&state->base,
> - conn_state->crtc);
> - if (IS_ERR(crtc_state)) {
> - ret = PTR_ERR(crtc_state);
> - break;
> - }
> - crtc_state->mode_changed = true;
> - ret = drm_atomic_add_affected_connectors(&state->base,
> - conn_state->crtc);
> - if (ret)
> - break;
> - }
> - drm_connector_list_iter_end(&conn_iter);
> -
> - return ret;
> -}
> -
> -static int
> -intel_atomic_check_tiled_conns(struct intel_atomic_state *state)
> -{
> - struct drm_i915_private *dev_priv = to_i915(state->base.dev);
> - struct drm_connector *connector;
> - struct drm_connector_state *old_conn_state, *new_conn_state;
> - int i, ret;
> -
> - if (INTEL_GEN(dev_priv) < 11)
> - return 0;
> -
> - /* Is tiled, mark all other tiled CRTCs as needing a modeset */
> - for_each_oldnew_connector_in_state(&state->base, connector,
> - old_conn_state, new_conn_state, i) {
> - if (!connector->has_tile)
> - continue;
> - if (!intel_connector_needs_modeset(state, connector))
> - continue;
> -
> - ret = intel_modeset_all_tiles(state, connector->tile_group->id);
> - if (ret)
> - return ret;
> - }
> -
> - return 0;
> -}
> -
> /**
> * intel_atomic_check - validate state object
> * @dev: drm device
> @@ -14767,21 +14697,6 @@ static int intel_atomic_check(struct drm_device *dev,
> if (ret)
> goto fail;
>
> - /**
> - * This check adds all the connectors in current state that belong to
> - * the same tile group to a full modeset.
> - * This function directly sets the mode_changed to true and we also call
> - * drm_atomic_add_affected_connectors(). Hence we are not explicitly
> - * calling drm_atomic_helper_check_modeset() after this.
> - *
> - * Fixme: Handle some corner cases where one of the
> - * tiled connectors gets disconnected and tile info is lost but since it
> - * was previously synced to other conn, we need to add that to the modeset.
> - */
> - ret = intel_atomic_check_tiled_conns(state);
> - if (ret)
> - goto fail;
> -
> for_each_oldnew_intel_crtc_in_state(state, crtc, old_crtc_state,
> new_crtc_state, i) {
> if (!needs_modeset(new_crtc_state)) {
> diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
> index f4dede6253f8..07f0374d4409 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp.c
> @@ -6582,6 +6582,146 @@ void intel_dp_encoder_reset(struct drm_encoder *encoder)
> }
> }
>
> +static int intel_modeset_tile_group(struct intel_atomic_state *state,
> + int tile_group_id)
> +{
> + struct drm_i915_private *dev_priv = to_i915(state->base.dev);
> + struct drm_connector_list_iter conn_iter;
> + struct drm_connector *connector;
> + int ret = 0;
> +
> + drm_connector_list_iter_begin(&dev_priv->drm, &conn_iter);
> + drm_for_each_connector_iter(connector, &conn_iter) {
> + struct drm_connector_state *conn_state;
> + struct intel_crtc_state *crtc_state;
> + struct intel_crtc *crtc;
> +
> + if (!connector->has_tile ||
> + connector->tile_group->id != tile_group_id)
> + continue;
> +
> + conn_state = drm_atomic_get_connector_state(&state->base,
> + connector);
> + if (IS_ERR(conn_state)) {
> + ret = PTR_ERR(conn_state);
> + break;
> + }
> +
> + crtc = to_intel_crtc(conn_state->crtc);
> +
> + if (!crtc)
> + continue;
> +
> + crtc_state = intel_atomic_get_crtc_state(&state->base, crtc);
I think this could just be get_new_crtc_state() since
drm_atomic_get_connector_state() should have added the
connector's crtc already to the state. Which would let us
get rid of the error handling here.
> + if (IS_ERR(crtc_state)) {
> + ret = PTR_ERR(crtc_state);
> + break;
> + }
> +
> + crtc_state->uapi.mode_changed = true;
> +
> + ret = drm_atomic_add_affected_planes(&state->base, &crtc->base);
> + if (ret)
> + break;
> + }
> + drm_connector_list_iter_begin(&dev_priv->drm, &conn_iter);
> +
> + return ret;
> +}
> +
> +static int intel_modeset_affected_transcoders(struct intel_atomic_state *state, u8 transcoders)
> +{
> + struct drm_i915_private *dev_priv = to_i915(state->base.dev);
> + struct intel_crtc *crtc;
> +
> + if (transcoders == 0)
> + return 0;
> +
> + for_each_intel_crtc(&dev_priv->drm, crtc) {
> + struct intel_crtc_state *crtc_state;
> + int ret;
> +
> + crtc_state = intel_atomic_get_crtc_state(&state->base, crtc);
> + if (IS_ERR(crtc_state))
> + return PTR_ERR(crtc_state);
> +
> + if (!crtc_state->hw.enable)
> + continue;
> +
> + if (!(transcoders & BIT(crtc_state->cpu_transcoder)))
> + continue;
> +
> + crtc_state->uapi.mode_changed = true;
> +
> + ret = drm_atomic_add_affected_connectors(&state->base, &crtc->base);
> + if (ret)
> + return ret;
> +
> + ret = drm_atomic_add_affected_planes(&state->base, &crtc->base);
> + if (ret)
> + return ret;
> +
> + transcoders &= ~BIT(crtc_state->cpu_transcoder);
> + }
> +
> + WARN_ON(transcoders != 0);
> +
> + return 0;
> +}
> +
> +static int intel_modeset_synced_crtcs(struct intel_atomic_state *state,
> + struct drm_connector *connector)
> +{
> + const struct drm_connector_state *old_conn_state =
> + drm_atomic_get_old_connector_state(&state->base, connector);
> + const struct intel_crtc_state *old_crtc_state;
> + struct intel_crtc *crtc;
> + u8 transcoders;
> +
> + crtc = to_intel_crtc(old_conn_state->crtc);
> + if (!crtc)
> + return 0;
> +
> + old_crtc_state = intel_atomic_get_old_crtc_state(state, crtc);
> +
> + if (!old_crtc_state->hw.active)
> + return 0;
> +
> + transcoders = old_crtc_state->sync_mode_slaves_mask;
> + if (old_crtc_state->master_transcoder != INVALID_TRANSCODER)
> + transcoders |= BIT(old_crtc_state->master_transcoder);
> +
> + return intel_modeset_affected_transcoders(state,
> + transcoders &
> + ~BIT(old_crtc_state->cpu_transcoder));
As I said in the previous review cycle the '&~BIT(cpu_trans)' should
be a nop. So can just drop it.
Otherwise
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
> +}
> +
> +static int intel_dp_connector_atomic_check(struct drm_connector *conn,
> + struct drm_atomic_state *_state)
> +{
> + struct drm_i915_private *dev_priv = to_i915(conn->dev);
> + struct intel_atomic_state *state = to_intel_atomic_state(_state);
> + int ret;
> +
> + ret = intel_digital_connector_atomic_check(conn, &state->base);
> + if (ret)
> + return ret;
> +
> + if (INTEL_GEN(dev_priv) < 11)
> + return 0;
> +
> + if (!intel_connector_needs_modeset(state, conn))
> + return 0;
> +
> + if (conn->has_tile) {
> + ret = intel_modeset_tile_group(state, conn->tile_group->id);
> + if (ret)
> + return ret;
> + }
> +
> + return intel_modeset_synced_crtcs(state, conn);
> +}
> +
> static const struct drm_connector_funcs intel_dp_connector_funcs = {
> .force = intel_dp_force,
> .fill_modes = drm_helper_probe_single_connector_modes,
> @@ -6598,7 +6738,7 @@ static const struct drm_connector_helper_funcs intel_dp_connector_helper_funcs =
> .detect_ctx = intel_dp_detect,
> .get_modes = intel_dp_get_modes,
> .mode_valid = intel_dp_mode_valid,
> - .atomic_check = intel_digital_connector_atomic_check,
> + .atomic_check = intel_dp_connector_atomic_check,
> };
>
> static const struct drm_encoder_funcs intel_dp_enc_funcs = {
> --
> 2.19.1
--
Ville Syrjälä
Intel
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
next prev parent reply other threads:[~2020-02-05 14:32 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-02-03 7:47 [Intel-gfx] [PATCH v2 1/3] drm/i915: Introduce encoder->compute_config_late() Manasi Navare
2020-02-03 7:47 ` [Intel-gfx] [PATCH v2 2/3] drm/i915/dp: Compute port sync crtc states post compute_config() Manasi Navare
2020-02-05 14:25 ` Ville Syrjälä
2020-02-10 11:05 ` Manasi Navare
2020-02-03 7:47 ` [Intel-gfx] [PATCH v2 3/3] drm/i915/dp: Add all tiled and port sync conns to modeset Manasi Navare
2020-02-05 14:32 ` Ville Syrjälä [this message]
2020-02-10 11:03 ` Manasi Navare
2020-02-03 9:05 ` [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for series starting with [v2,1/3] drm/i915: Introduce encoder->compute_config_late() Patchwork
2020-02-03 9:37 ` [Intel-gfx] ✓ Fi.CI.BAT: success " Patchwork
2020-02-05 15:19 ` [Intel-gfx] ✗ Fi.CI.IGT: failure " Patchwork
2020-02-10 11:00 ` Manasi Navare
2020-02-14 11:18 ` [Intel-gfx] [PATCH v2 1/3] " Manasi Navare
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200205143248.GI13686@intel.com \
--to=ville.syrjala@linux.intel.com \
--cc=intel-gfx@lists.freedesktop.org \
--cc=manasi.d.navare@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.