From: Manasi Navare <manasi.d.navare@intel.com>
To: "Ville Syrjälä" <ville.syrjala@linux.intel.com>
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>, intel-gfx@lists.freedesktop.org
Subject: Re: [PATCH v3 4/6] drm/i915/display/icl: Enable master-slaves in trans port sync
Date: Sun, 6 Oct 2019 20:14:21 -0700 [thread overview]
Message-ID: <20191007031421.GA20745@intel.com> (raw)
In-Reply-To: <20190930152816.GE1208@intel.com>
On Mon, Sep 30, 2019 at 06:28:16PM +0300, Ville Syrjälä wrote:
> On Sun, Sep 22, 2019 at 10:08:05AM -0700, Manasi Navare wrote:
> > As per the display enable sequence, we need to follow the enable sequence
> > for slaves first with DP_TP_CTL set to Idle and configure the transcoder
> > port sync register to select the corersponding master, then follow the
> > enable sequence for master leaving DP_TP_CTL to idle.
> > At this point the transcoder port sync mode is configured and enabled
> > and the Vblanks of both ports are synchronized so then set DP_TP_CTL
> > for the slave and master to Normal and do post crtc enable updates.
> >
> > v6:
> > * Modeset implies active_changed, remove one condition (Maarten)
> > v5:
> > * Fix checkpatch warning (Manasi)
> > v4:
> > * Reuse skl_commit_modeset_enables() hook (Maarten)
> > * Obtain slave crtc and states from master (Maarten)
> > v3:
> > * Rebase on drm-tip (Manasi)
> > v2:
> > * Create a icl_update_crtcs hook (Maarten, Danvet)
> > * This sequence only for CRTCs in trans port sync mode (Maarten)
> >
> > Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
> > Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
> > Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
> > Cc: Matt Roper <matthew.d.roper@intel.com>
> > Signed-off-by: Manasi Navare <manasi.d.navare@intel.com>
> > Reviewed-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
> > ---
> > drivers/gpu/drm/i915/display/intel_ddi.c | 3 +-
> > drivers/gpu/drm/i915/display/intel_display.c | 141 ++++++++++++++++++-
> > drivers/gpu/drm/i915/display/intel_display.h | 2 +
> > 3 files changed, 142 insertions(+), 4 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c b/drivers/gpu/drm/i915/display/intel_ddi.c
> > index 3e6394139964..62e9f5602b6b 100644
> > --- a/drivers/gpu/drm/i915/display/intel_ddi.c
> > +++ b/drivers/gpu/drm/i915/display/intel_ddi.c
> > @@ -3347,7 +3347,8 @@ static void hsw_ddi_pre_enable_dp(struct intel_encoder *encoder,
> > true);
> > intel_dp_sink_set_fec_ready(intel_dp, crtc_state);
> > intel_dp_start_link_train(intel_dp);
> > - if (port != PORT_A || INTEL_GEN(dev_priv) >= 9)
> > + if ((port != PORT_A || INTEL_GEN(dev_priv) >= 9) &&
> > + !is_trans_port_sync_mode(dev_priv, crtc_state))
> > intel_dp_stop_link_train(intel_dp);
> >
> > intel_ddi_enable_fec(encoder, crtc_state);
> > diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
> > index 711987eb4e9e..10425a789b5e 100644
> > --- a/drivers/gpu/drm/i915/display/intel_display.c
> > +++ b/drivers/gpu/drm/i915/display/intel_display.c
> > @@ -13928,6 +13928,30 @@ static void intel_update_crtc(struct intel_crtc *crtc,
> > intel_finish_crtc_commit(state, crtc);
> > }
> >
> > +static struct intel_crtc *intel_get_slave_crtc(struct drm_i915_private *dev_priv,
>
> 'dev_priv' can be derived from the crtc state.
Ok yes will just pass the crtc_state
>
> > + struct intel_crtc_state *new_crtc_state)
>
> const
>
> > +{
>
> cpu_transcoder = ffs(slaves) - 1;
Cool, thanks for pointing out this ffs function
> return get_crtc((enum pipe)cpu_transcoder);
>
> or something.
>
> Maybe toss in a WARN_ON(!is_power_of_2(slaves)).
Yes and that shd take care of ffs(slaves) == 0 as well
Manasi
>
>
>
> > + if (new_crtc_state->sync_mode_slaves_mask &
> > + BIT(TRANSCODER_A))
> > + return intel_get_crtc_for_pipe(dev_priv,
> > + PIPE_A);
> > + else if (new_crtc_state->sync_mode_slaves_mask &
> > + BIT(TRANSCODER_B))
> > + return intel_get_crtc_for_pipe(dev_priv,
> > + PIPE_B);
> > + else if (new_crtc_state->sync_mode_slaves_mask &
> > + BIT(TRANSCODER_C))
> > + return intel_get_crtc_for_pipe(dev_priv,
> > + PIPE_C);
> > + else if (new_crtc_state->sync_mode_slaves_mask &
> > + BIT(TRANSCODER_D))
> > + return intel_get_crtc_for_pipe(dev_priv,
> > + PIPE_D);
> > + /* should never happen */
> > + WARN_ON(1);
> > + return NULL;
> > +}
> > +
> > static void intel_old_crtc_state_disables(struct intel_atomic_state *state,
> > struct intel_crtc_state *old_crtc_state,
> > struct intel_crtc_state *new_crtc_state,
> > @@ -14006,6 +14030,104 @@ static void intel_commit_modeset_enables(struct intel_atomic_state *state)
> > }
> > }
> >
> > +static void intel_crtc_enable_trans_port_sync(struct intel_crtc *crtc,
> > + struct intel_atomic_state *state,
> > + struct intel_crtc_state *new_crtc_state)
> > +{
> > + struct drm_i915_private *dev_priv = to_i915(state->base.dev);
> > +
> > + update_scanline_offset(new_crtc_state);
> > + dev_priv->display.crtc_enable(new_crtc_state, state);
> > + intel_crtc_enable_pipe_crc(crtc);
> > +}
> > +
> > +static void intel_set_dp_tp_ctl_normal(struct intel_crtc *crtc,
> > + struct intel_atomic_state *state)
> > +{
> > + struct drm_connector_state *conn_state;
> > + struct drm_connector *conn;
> > + struct intel_dp *intel_dp;
> > + int i;
> > +
> > + for_each_new_connector_in_state(&state->base, conn, conn_state, i) {
> > + if (conn_state->crtc == &crtc->base)
> > + break;
> > + }
> > + intel_dp = enc_to_intel_dp(&intel_attached_encoder(conn)->base);
> > + intel_dp_stop_link_train(intel_dp);
> > +}
> > +
> > +static void intel_post_crtc_enable_updates(struct intel_crtc *crtc,
> > + struct intel_atomic_state *state,
> > + struct intel_crtc_state *old_crtc_state,
> > + struct intel_crtc_state *new_crtc_state)
> > +{
> > + struct intel_plane_state *new_plane_state =
> > + intel_atomic_get_new_plane_state(state,
> > + to_intel_plane(crtc->base.primary));
> > +
> > + if (new_crtc_state->update_pipe && !new_crtc_state->enable_fbc)
> > + intel_fbc_disable(crtc);
> > + else if (new_plane_state)
> > + intel_fbc_enable(crtc, new_crtc_state, new_plane_state);
> > +
> > + intel_begin_crtc_commit(state, crtc);
> > + skl_update_planes_on_crtc(state, crtc);
> > + intel_finish_crtc_commit(state, crtc);
> > +}
> > +
> > +static void intel_update_trans_port_sync_crtcs(struct intel_crtc *crtc,
> > + struct intel_atomic_state *state,
> > + struct intel_crtc_state *old_crtc_state,
> > + struct intel_crtc_state *new_crtc_state)
> > +{
> > + struct drm_i915_private *dev_priv = to_i915(state->base.dev);
> > + struct intel_crtc *slave_crtc = intel_get_slave_crtc(dev_priv,
> > + new_crtc_state);
> > + struct intel_crtc_state *new_slave_crtc_state =
> > + intel_atomic_get_new_crtc_state(state, slave_crtc);
> > + struct intel_crtc_state *old_slave_crtc_state =
> > + intel_atomic_get_old_crtc_state(state, slave_crtc);
> > +
> > + WARN_ON(!slave_crtc || !new_slave_crtc_state ||
> > + !old_slave_crtc_state);
> > +
> > + DRM_DEBUG_KMS("Updating Transcoder Port Sync Master CRTC = %d %s and Slave CRTC %d %s\n",
> > + crtc->base.base.id, crtc->base.name, slave_crtc->base.base.id,
> > + slave_crtc->base.name);
> > +
> > + /* Enable seq for slave with with DP_TP_CTL left Idle until the
> > + * master is ready
> > + */
> > + intel_crtc_enable_trans_port_sync(slave_crtc,
> > + state,
> > + new_slave_crtc_state);
> > +
> > + /* Enable seq for master with with DP_TP_CTL left Idle */
> > + intel_crtc_enable_trans_port_sync(crtc,
> > + state,
> > + new_crtc_state);
> > +
> > + /* Set Slave's DP_TP_CTL to Normal */
> > + intel_set_dp_tp_ctl_normal(slave_crtc,
> > + state);
> > +
> > + /* Set Master's DP_TP_CTL To Normal */
> > + usleep_range(200, 400);
> > + intel_set_dp_tp_ctl_normal(crtc,
> > + state);
> > +
> > + /* Now do the post crtc enable for all master and slaves */
> > + intel_post_crtc_enable_updates(slave_crtc,
> > + state,
> > + new_slave_crtc_state,
> > + old_slave_crtc_state);
> > + intel_post_crtc_enable_updates(crtc,
> > + state,
> > + new_crtc_state,
> > + old_crtc_state);
> > +}
> > +
> > static void skl_commit_modeset_enables(struct intel_atomic_state *state)
> > {
> > struct drm_i915_private *dev_priv = to_i915(state->base.dev);
> > @@ -14040,6 +14162,7 @@ static void skl_commit_modeset_enables(struct intel_atomic_state *state)
> > for_each_oldnew_intel_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) {
> > bool vbl_wait = false;
> > unsigned int cmask = drm_crtc_mask(&crtc->base);
> > + bool modeset = needs_modeset(new_crtc_state);
> >
> > pipe = crtc->pipe;
> >
> > @@ -14062,12 +14185,24 @@ static void skl_commit_modeset_enables(struct intel_atomic_state *state)
> > */
> > if (!skl_ddb_entry_equal(&new_crtc_state->wm.skl.ddb,
> > &old_crtc_state->wm.skl.ddb) &&
> > - !new_crtc_state->base.active_changed &&
> > + !modeset &&
> > state->wm_results.dirty_pipes != updated)
> > vbl_wait = true;
> >
> > - intel_update_crtc(crtc, state, old_crtc_state,
> > - new_crtc_state);
> > + if (modeset && is_trans_port_sync_mode(dev_priv,
> > + new_crtc_state)) {
> > + if (is_trans_port_sync_master(dev_priv,
> > + new_crtc_state))
> > + intel_update_trans_port_sync_crtcs(crtc,
> > + state,
> > + old_crtc_state,
> > + new_crtc_state);
> > + else
> > + continue;
> > + } else {
> > + intel_update_crtc(crtc, state, old_crtc_state,
> > + new_crtc_state);
> > + }
> >
> > if (vbl_wait)
> > intel_wait_for_vblank(dev_priv, pipe);
> > diff --git a/drivers/gpu/drm/i915/display/intel_display.h b/drivers/gpu/drm/i915/display/intel_display.h
> > index 1623face436b..efa4d62514ce 100644
> > --- a/drivers/gpu/drm/i915/display/intel_display.h
> > +++ b/drivers/gpu/drm/i915/display/intel_display.h
> > @@ -27,6 +27,7 @@
> >
> > #include <drm/drm_util.h>
> > #include <drm/i915_drm.h>
> > +#include "intel_dp_link_training.h"
> >
> > enum link_m_n_set;
> > struct dpll;
> > @@ -54,6 +55,7 @@ struct intel_plane;
> > struct intel_plane_state;
> > struct intel_remapped_info;
> > struct intel_rotation_info;
> > +struct intel_crtc_state;
> >
> > enum i915_gpio {
> > GPIOA,
> > --
> > 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-10-07 3:12 UTC|newest]
Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-09-22 17:08 [PATCH v3 1/6] drm/i915/display/icl: Save Master transcoder in slave's crtc_state for Transcoder Port Sync Manasi Navare
2019-09-22 17:08 ` [PATCH v3 2/6] drm/i915/display/icl: Enable TRANSCODER PORT SYNC for tiled displays across separate ports Manasi Navare
2019-09-30 14:19 ` Ville Syrjälä
2019-10-07 3:22 ` Manasi Navare
2019-09-22 17:08 ` [PATCH v3 3/6] drm/i915/display/icl: HW state readout for transcoder port sync config Manasi Navare
2019-09-23 4:43 ` Manasi Navare
2019-09-24 15:38 ` Maarten Lankhorst
2019-09-24 17:59 ` Manasi Navare
2019-09-25 10:08 ` Ville Syrjälä
2019-09-25 18:37 ` Manasi Navare
2019-09-26 12:28 ` Ville Syrjälä
2019-09-26 17:29 ` Manasi Navare
2019-09-24 19:50 ` [PATCH v4] " Manasi Navare
2019-09-24 22:59 ` kbuild test robot
2019-09-27 0:11 ` [PATCH v5 3/6] " Manasi Navare
2019-09-27 21:04 ` Manasi Navare
2019-09-30 14:21 ` Ville Syrjälä
2019-10-07 3:31 ` Manasi Navare
2019-09-30 19:45 ` Lucas De Marchi
2019-10-07 3:33 ` Manasi Navare
2019-09-22 17:08 ` [PATCH v3 4/6] drm/i915/display/icl: Enable master-slaves in trans port sync Manasi Navare
2019-09-30 15:28 ` Ville Syrjälä
2019-10-07 3:14 ` Manasi Navare [this message]
2019-09-22 17:08 ` [PATCH v3 5/6] drm/i915/display/icl: Disable transcoder port sync as part of crtc_disable() sequence Manasi Navare
2019-09-22 17:08 ` [PATCH v3 6/6] drm/i915/display/icl: In port sync mode disable slaves first then master Manasi Navare
2019-09-22 17:39 ` ✓ Fi.CI.BAT: success for series starting with [v3,1/6] drm/i915/display/icl: Save Master transcoder in slave's crtc_state for Transcoder Port Sync Patchwork
2019-09-23 8:29 ` ✓ Fi.CI.IGT: " Patchwork
2019-09-24 21:17 ` ✓ Fi.CI.BAT: success for series starting with [v3,1/6] drm/i915/display/icl: Save Master transcoder in slave's crtc_state for Transcoder Port Sync (rev2) Patchwork
2019-09-25 15:30 ` ✓ Fi.CI.IGT: " Patchwork
2019-09-27 0:41 ` ✓ Fi.CI.BAT: success for series starting with [v3,1/6] drm/i915/display/icl: Save Master transcoder in slave's crtc_state for Transcoder Port Sync (rev3) Patchwork
2019-09-27 19:07 ` ✗ Fi.CI.IGT: failure " Patchwork
2019-09-27 20:38 ` ✓ Fi.CI.BAT: success for series starting with [v3,1/6] drm/i915/display/icl: Save Master transcoder in slave's crtc_state for Transcoder Port Sync (rev4) Patchwork
2019-09-28 12:22 ` ✗ Fi.CI.IGT: failure " Patchwork
2019-09-30 14:14 ` [PATCH v3 1/6] drm/i915/display/icl: Save Master transcoder in slave's crtc_state for Transcoder Port Sync Ville Syrjälä
2019-10-07 3:43 ` Manasi Navare
2019-10-09 18:01 ` Ville Syrjälä
2019-09-30 18:37 ` Lucas De Marchi
2019-10-01 12:17 ` Ville Syrjälä
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=20191007031421.GA20745@intel.com \
--to=manasi.d.navare@intel.com \
--cc=daniel.vetter@ffwll.ch \
--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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).