From: Manasi Navare <manasi.d.navare@intel.com>
To: "Ville Syrjälä" <ville.syrjala@linux.intel.com>
Cc: intel-gfx@lists.freedesktop.org
Subject: Re: [Intel-gfx] [PATCH v2 1/3] drm/i915/dp: Make sure all tiled connectors get added to the state with full modeset
Date: Fri, 20 Dec 2019 11:05:31 -0800 [thread overview]
Message-ID: <20191220190531.GA1329@intel.com> (raw)
In-Reply-To: <20191220184112.GZ1208@intel.com>
On Fri, Dec 20, 2019 at 08:41:12PM +0200, Ville Syrjälä wrote:
> On Thu, Dec 19, 2019 at 01:51:15PM -0800, Manasi Navare wrote:
> > In case of tiled displays, all the tiles are linke dto each other
> > for transcoder port sync. So in intel_atomic_check() we need to make
> > sure that we add all the tiles to the modeset and if one of the
> > tiles needs a full modeset then mark all other tiles for a full modeset.
> >
> > v2:
> > * Change crtc_state scope, remove tile_grp_id (Ville)
> > * Use intel_connector_needs_modeset() (Ville)
> > * Add modeset_synced_crtcs (Ville)
> > * Make sure synced crtcs are forced full modeset
> > after fastset check (Ville)
> >
> > Suggested-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
> > Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
> > Cc: José Roberto de Souza <jose.souza@intel.com>
> > Cc: Matt Roper <matthew.d.roper@intel.com>
> > Bugzilla: https://gitlab.freedesktop.org/drm/intel/issues/5
> > Signed-off-by: Manasi Navare <manasi.d.navare@intel.com>
> > ---
> > drivers/gpu/drm/i915/display/intel_display.c | 143 +++++++++++++++++--
> > 1 file changed, 131 insertions(+), 12 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
> > index a3f9430493ae..00608d8cef50 100644
> > --- a/drivers/gpu/drm/i915/display/intel_display.c
> > +++ b/drivers/gpu/drm/i915/display/intel_display.c
> > @@ -13910,18 +13910,6 @@ static void intel_crtc_check_fastset(const struct intel_crtc_state *old_crtc_sta
> > new_crtc_state->uapi.mode_changed = false;
> > new_crtc_state->update_pipe = true;
> >
> > - /*
> > - * If we're not doing the full modeset we want to
> > - * keep the current M/N values as they may be
> > - * sufficiently different to the computed values
> > - * to cause problems.
> > - *
> > - * FIXME: should really copy more fuzzy state here
> > - */
> > - new_crtc_state->fdi_m_n = old_crtc_state->fdi_m_n;
> > - new_crtc_state->dp_m_n = old_crtc_state->dp_m_n;
> > - new_crtc_state->dp_m2_n2 = old_crtc_state->dp_m2_n2;
> > - new_crtc_state->has_drrs = old_crtc_state->has_drrs;
> > }
> >
> > static int intel_crtc_add_planes_to_state(struct intel_atomic_state *state,
> > @@ -14032,6 +14020,105 @@ static int intel_atomic_check_crtcs(struct intel_atomic_state *state)
> > return 0;
> > }
> >
> > +static void
> > +intel_dp_modeset_synced_crtcs(struct intel_atomic_state *state)
> > +{
> > + struct intel_crtc_state *new_crtc_state;
> > + struct intel_crtc *crtc;
> > + int i;
> > +
> > + for_each_new_intel_crtc_in_state(state, crtc,
> > + new_crtc_state, i) {
> > + if (is_trans_port_sync_mode(new_crtc_state)) {
> > + new_crtc_state->uapi.mode_changed = true;
> > + new_crtc_state->update_pipe = false;
> > + }
>
> Upon further thinking this is not quite right even for the post fastset
> check part. You're not checking at all whether these crtcs here are
> actually synced to the crtc that still had its needs_modeset() flagged.
> So this can end up forcing a modeset on an entirely unrelated crtc. We
> don't want that.
>
> You could fix that by passing in a transcoder bitmask, and then only
> flagging a modeset on crtcs whose cpu_transcoder matches the bitmask.
> (see intel_modeset_transcoders() in my branch).
>
> > + }
> > +}
> > +
> > +static void
> > +intel_dp_atomic_check_synced_crtcs(struct intel_atomic_state *state)
> > +{
> > + struct intel_crtc_state *new_crtc_state;
> > + struct intel_crtc *crtc;
> > + int i;
> > +
> > + for_each_new_intel_crtc_in_state(state, crtc,
> > + new_crtc_state, i) {
> > + if (!is_trans_port_sync_mode(new_crtc_state) ||
> > + !needs_modeset(new_crtc_state))
> > + continue;
> > +
> > + intel_dp_modeset_synced_crtcs(state);
I guess in this call I can add master trans and sync_mode_slaves_bitmask
And then if the crtcs in state are in sync mode and their cpu_trans matches the master trans
or transcoders in the slave mask, add them to the modeset?
> > + }
> > +}
> > +
> > +static int
> > +intel_dp_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_list_iter;
> > +
> > + drm_connector_list_iter_begin(&dev_priv->drm, &conn_list_iter);
> > + drm_for_each_connector_iter(connector, &conn_list_iter) {
> > + struct drm_connector_state *conn_iter_state;
> > + struct drm_crtc_state *crtc_state;
> > +
> > + if (!(connector->has_tile &&
> > + connector->tile_group->id == tile_grp_id))
> > + continue;
> > + conn_iter_state = drm_atomic_get_connector_state(&state->base,
> > + connector);
> > + if (IS_ERR(conn_iter_state)) {
> > + drm_connector_list_iter_end(&conn_list_iter);
> > + return PTR_ERR(conn_iter_state);
> > + }
> > +
> > + if (!conn_iter_state->crtc)
> > + continue;
> > +
> > + crtc_state = drm_atomic_get_crtc_state(&state->base,
> > + conn_iter_state->crtc);
> > + if (IS_ERR(crtc_state)) {
> > + drm_connector_list_iter_end(&conn_list_iter);
> > + return PTR_ERR(conn_iter_state);
> > + }
> > + crtc_state->mode_changed = true;
> > + }
> > + drm_connector_list_iter_end(&conn_list_iter);
> > +
> > + return 0;
> > +}
> > +
> > +static int
> > +intel_dp_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, old_conn_state,
> > + new_conn_state))
> > + continue;
> > +
> > + ret = intel_dp_modeset_all_tiles(state, connector->tile_group->id);
> > + if (ret)
> > + return ret;
> > + }
> > +
> > + return 0;
> > +}
> > +
> > /**
> > * intel_atomic_check - validate state object
> > * @dev: drm device
> > @@ -14059,6 +14146,12 @@ static int intel_atomic_check(struct drm_device *dev,
> > if (ret)
> > goto fail;
> >
> > + ret = intel_dp_atomic_check_tiled_conns(state);
> > + if (ret)
> > + goto fail;
>
> Since this is not sufficient for the pre-compute_config() check I think
> we should drop this part for now. It's a somewhat unlikely scenario
> after all so we can do it as a followup.
>
Well we do need this for handling the hotplug cases correctly so that the connector disconnected
are added to the modeset which is working well with this function.
Manasi
> > +
> > + intel_dp_atomic_check_synced_crtcs(state);
> > +
> > for_each_oldnew_intel_crtc_in_state(state, crtc, old_crtc_state,
> > new_crtc_state, i) {
> > if (!needs_modeset(new_crtc_state)) {
> > @@ -14089,6 +14182,32 @@ static int intel_atomic_check(struct drm_device *dev,
> > any_ms = true;
> > }
> >
> > + /*
> > + * In case of port synced crtcs, if one of the synced crtcs
> > + * needs a full modeset, all other synced crtcs should be
> > + * forced a full modeset.
> > + */
> > + intel_dp_atomic_check_synced_crtcs(state);
> > +
> > + for_each_oldnew_intel_crtc_in_state(state, crtc, old_crtc_state,
> > + new_crtc_state, i) {
> > + if (needs_modeset(new_crtc_state))
> > + continue;
> > +
> > + /*
> > + * If we're not doing the full modeset we want to
> > + * keep the current M/N values as they may be
> > + * sufficiently different to the computed values
> > + * to cause problems.
> > + *
> > + * FIXME: should really copy more fuzzy state here
> > + */
> > + new_crtc_state->fdi_m_n = old_crtc_state->fdi_m_n;
> > + new_crtc_state->dp_m_n = old_crtc_state->dp_m_n;
> > + new_crtc_state->dp_m2_n2 = old_crtc_state->dp_m2_n2;
> > + new_crtc_state->has_drrs = old_crtc_state->has_drrs;
> > + }
> > +
> > if (any_ms && !check_digital_port_conflicts(state)) {
> > DRM_DEBUG_KMS("rejecting conflicting digital port configuration\n");
> > ret = EINVAL;
> > --
> > 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:[~2019-12-20 19:03 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-12-19 21:51 [Intel-gfx] [PATCH v2 1/3] drm/i915/dp: Make sure all tiled connectors get added to the state with full modeset Manasi Navare
2019-12-19 21:51 ` [Intel-gfx] [PATCH v2 2/3] drm/i915/dp: Make port sync mode assignments only if all tiles present Manasi Navare
2019-12-20 13:59 ` Ville Syrjälä
2019-12-20 17:00 ` Manasi Navare
2019-12-20 17:37 ` Ville Syrjälä
2019-12-20 18:13 ` Ville Syrjälä
2019-12-19 21:51 ` [Intel-gfx] [PATCH v2 3/3] drm/i915/dp: Disable Port sync mode correctly on teardown Manasi Navare
2019-12-20 13:19 ` Ville Syrjälä
2019-12-19 21:56 ` [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for series starting with [v2,1/3] drm/i915/dp: Make sure all tiled connectors get added to the state with full modeset Patchwork
2019-12-19 22:26 ` [Intel-gfx] ✗ Fi.CI.BAT: failure " Patchwork
2019-12-20 13:17 ` [Intel-gfx] [PATCH v2 1/3] " Ville Syrjälä
2019-12-20 16:35 ` Manasi Navare
2019-12-20 16:47 ` Ville Syrjälä
2019-12-20 17:04 ` Manasi Navare
2019-12-20 17:40 ` Ville Syrjälä
2019-12-20 18:41 ` Ville Syrjälä
2019-12-20 19:05 ` Manasi Navare [this message]
2019-12-20 19:35 ` Ville Syrjälä
2019-12-20 20:13 ` 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=20191220190531.GA1329@intel.com \
--to=manasi.d.navare@intel.com \
--cc=intel-gfx@lists.freedesktop.org \
--cc=ville.syrjala@linux.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.