From: Jani Nikula <jani.nikula@linux.intel.com>
To: Ville Syrjala <ville.syrjala@linux.intel.com>,
intel-gfx@lists.freedesktop.org
Subject: Re: [PATCH v3 4/7] drm/i915: Clean up DP pipe select bits
Date: Wed, 23 May 2018 12:37:35 +0300 [thread overview]
Message-ID: <87in7en25c.fsf@intel.com> (raw)
In-Reply-To: <20180518152931.13104-4-ville.syrjala@linux.intel.com>
On Fri, 18 May 2018, Ville Syrjala <ville.syrjala@linux.intel.com> wrote:
> From: Ville Syrjälä <ville.syrjala@linux.intel.com>
>
> Clean up the DP pipe select bits. To make the whole situation a bit
> less ugly we'll start to share the same code between .get_hw_state(),
> the port state asserts, and the VLV power sequencer code.
>
> v2: Return PIPE_A for cpt/ppt when the port isn't selected by
> any transcoder. Returning INVALID_PIPE explodes *somewhere*
> on some machines (can't immediately see where though). This
> now matches the old behaviour.
> v3: Order the defines shift,mask,value (Jani)
>
> Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
I could've bikeshedded about some naming here, but I don't want to read
this particular patch again, so
Reviewed-by: Jani Nikula <jani.nikula@intel.com>
> ---
> drivers/gpu/drm/i915/i915_reg.h | 24 +++-----
> drivers/gpu/drm/i915/intel_display.c | 48 +++++----------
> drivers/gpu/drm/i915/intel_dp.c | 113 ++++++++++++++++++++---------------
> drivers/gpu/drm/i915/intel_drv.h | 3 +
> 4 files changed, 92 insertions(+), 96 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
> index 5a103496423c..b888da96caf7 100644
> --- a/drivers/gpu/drm/i915/i915_reg.h
> +++ b/drivers/gpu/drm/i915/i915_reg.h
> @@ -5182,10 +5182,15 @@ enum {
> #define CHV_DP_D _MMIO(VLV_DISPLAY_BASE + 0x64300)
>
> #define DP_PORT_EN (1 << 31)
> -#define DP_PIPEB_SELECT (1 << 30)
> -#define DP_PIPE_MASK (1 << 30)
> -#define DP_PIPE_SELECT_CHV(pipe) ((pipe) << 16)
> -#define DP_PIPE_MASK_CHV (3 << 16)
> +#define DP_PIPE_SEL_SHIFT 30
> +#define DP_PIPE_SEL_MASK (1 << 30)
> +#define DP_PIPE_SEL(pipe) ((pipe) << 30)
> +#define DP_PIPE_SEL_SHIFT_IVB 29
> +#define DP_PIPE_SEL_MASK_IVB (3 << 29)
> +#define DP_PIPE_SEL_IVB(pipe) ((pipe) << 29)
> +#define DP_PIPE_SEL_SHIFT_CHV 16
> +#define DP_PIPE_SEL_MASK_CHV (3 << 16)
> +#define DP_PIPE_SEL_CHV(pipe) ((pipe) << 16)
>
> /* Link training mode - select a suitable mode for each stage */
> #define DP_LINK_TRAIN_PAT_1 (0 << 28)
> @@ -7872,16 +7877,6 @@ enum {
> #define PCH_DP_AUX_CH_DATA(aux_ch, i) _MMIO(_PORT((aux_ch) - AUX_CH_B, _PCH_DPB_AUX_CH_DATA1, _PCH_DPC_AUX_CH_DATA1) + (i) * 4) /* 5 registers */
>
> /* CPT */
> -#define PORT_TRANS_A_SEL_CPT 0
> -#define PORT_TRANS_B_SEL_CPT (1<<29)
> -#define PORT_TRANS_C_SEL_CPT (2<<29)
> -#define PORT_TRANS_SEL_MASK (3<<29)
> -#define PORT_TRANS_SEL_CPT(pipe) ((pipe) << 29)
> -#define PORT_TO_PIPE(val) (((val) & (1<<30)) >> 30)
> -#define PORT_TO_PIPE_CPT(val) (((val) & PORT_TRANS_SEL_MASK) >> 29)
> -#define SDVO_PORT_TO_PIPE_CHV(val) (((val) & (3<<24)) >> 24)
> -#define DP_PORT_TO_PIPE_CHV(val) (((val) & (3<<16)) >> 16)
> -
> #define _TRANS_DP_CTL_A 0xe0300
> #define _TRANS_DP_CTL_B 0xe1300
> #define _TRANS_DP_CTL_C 0xe2300
> @@ -7890,7 +7885,6 @@ enum {
> #define TRANS_DP_PORT_SEL_MASK (3 << 29)
> #define TRANS_DP_PORT_SEL_NONE (3 << 29)
> #define TRANS_DP_PORT_SEL(port) (((port) - PORT_B) << 29)
> -#define TRANS_DP_PIPE_TO_PORT(val) ((((val) & TRANS_DP_PORT_SEL_MASK) >> 29) + PORT_B)
> #define TRANS_DP_AUDIO_ONLY (1<<26)
> #define TRANS_DP_ENH_FRAMING (1<<18)
> #define TRANS_DP_8BPC (0<<9)
> diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
> index d36dea568b82..d397febb5a7f 100644
> --- a/drivers/gpu/drm/i915/intel_display.c
> +++ b/drivers/gpu/drm/i915/intel_display.c
> @@ -1303,38 +1303,22 @@ void assert_pch_transcoder_disabled(struct drm_i915_private *dev_priv,
> pipe_name(pipe));
> }
>
> -static bool dp_pipe_enabled(struct drm_i915_private *dev_priv,
> - enum pipe pipe, u32 port_sel, u32 val)
> -{
> - if ((val & DP_PORT_EN) == 0)
> - return false;
> -
> - if (HAS_PCH_CPT(dev_priv)) {
> - u32 trans_dp_ctl = I915_READ(TRANS_DP_CTL(pipe));
> - if ((trans_dp_ctl & TRANS_DP_PORT_SEL_MASK) != port_sel)
> - return false;
> - } else if (IS_CHERRYVIEW(dev_priv)) {
> - if ((val & DP_PIPE_MASK_CHV) != DP_PIPE_SELECT_CHV(pipe))
> - return false;
> - } else {
> - if ((val & DP_PIPE_MASK) != (pipe << 30))
> - return false;
> - }
> - return true;
> -}
> -
> static void assert_pch_dp_disabled(struct drm_i915_private *dev_priv,
> - enum pipe pipe, i915_reg_t reg,
> - u32 port_sel)
> + enum pipe pipe, enum port port,
> + i915_reg_t dp_reg)
> {
> - u32 val = I915_READ(reg);
> - I915_STATE_WARN(dp_pipe_enabled(dev_priv, pipe, port_sel, val),
> - "PCH DP (0x%08x) enabled on transcoder %c, should be disabled\n",
> - i915_mmio_reg_offset(reg), pipe_name(pipe));
> + enum pipe port_pipe;
> + bool state;
>
> - I915_STATE_WARN(HAS_PCH_IBX(dev_priv) && (val & DP_PORT_EN) == 0
> - && (val & DP_PIPEB_SELECT),
> - "IBX PCH dp port still using transcoder B\n");
> + state = intel_dp_port_enabled(dev_priv, dp_reg, port, &port_pipe);
> +
> + I915_STATE_WARN(state && port_pipe == pipe,
> + "PCH DP %c enabled on transcoder %c, should be disabled\n",
> + port_name(port), pipe_name(pipe));
> +
> + I915_STATE_WARN(HAS_PCH_IBX(dev_priv) && !state && port_pipe == PIPE_B,
> + "IBX PCH DP %c still using transcoder B\n",
> + port_name(port));
> }
>
> static void assert_pch_hdmi_disabled(struct drm_i915_private *dev_priv,
> @@ -1360,9 +1344,9 @@ static void assert_pch_ports_disabled(struct drm_i915_private *dev_priv,
> {
> enum pipe port_pipe;
>
> - assert_pch_dp_disabled(dev_priv, pipe, PCH_DP_B, TRANS_DP_PORT_SEL(PORT_B));
> - assert_pch_dp_disabled(dev_priv, pipe, PCH_DP_C, TRANS_DP_PORT_SEL(PORT_C));
> - assert_pch_dp_disabled(dev_priv, pipe, PCH_DP_D, TRANS_DP_PORT_SEL(PORT_D));
> + assert_pch_dp_disabled(dev_priv, pipe, PORT_B, PCH_DP_B);
> + assert_pch_dp_disabled(dev_priv, pipe, PORT_C, PCH_DP_C);
> + assert_pch_dp_disabled(dev_priv, pipe, PORT_D, PCH_DP_D);
>
> I915_STATE_WARN(intel_crt_port_enabled(dev_priv, PCH_ADPA, &port_pipe) &&
> port_pipe == pipe,
> diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
> index 102070940095..aab48283f155 100644
> --- a/drivers/gpu/drm/i915/intel_dp.c
> +++ b/drivers/gpu/drm/i915/intel_dp.c
> @@ -529,9 +529,9 @@ vlv_power_sequencer_kick(struct intel_dp *intel_dp)
> DP |= DP_LINK_TRAIN_PAT_1;
>
> if (IS_CHERRYVIEW(dev_priv))
> - DP |= DP_PIPE_SELECT_CHV(pipe);
> - else if (pipe == PIPE_B)
> - DP |= DP_PIPEB_SELECT;
> + DP |= DP_PIPE_SEL_CHV(pipe);
> + else
> + DP |= DP_PIPE_SEL(pipe);
>
> pll_enabled = I915_READ(DPLL(pipe)) & DPLL_VCO_ENABLE;
>
> @@ -1999,7 +1999,7 @@ static void intel_dp_prepare(struct intel_encoder *encoder,
> if (drm_dp_enhanced_frame_cap(intel_dp->dpcd))
> intel_dp->DP |= DP_ENHANCED_FRAMING;
>
> - intel_dp->DP |= crtc->pipe << 29;
> + intel_dp->DP |= DP_PIPE_SEL_IVB(crtc->pipe);
> } else if (HAS_PCH_CPT(dev_priv) && port != PORT_A) {
> u32 trans_dp;
>
> @@ -2025,9 +2025,9 @@ static void intel_dp_prepare(struct intel_encoder *encoder,
> intel_dp->DP |= DP_ENHANCED_FRAMING;
>
> if (IS_CHERRYVIEW(dev_priv))
> - intel_dp->DP |= DP_PIPE_SELECT_CHV(crtc->pipe);
> - else if (crtc->pipe == PIPE_B)
> - intel_dp->DP |= DP_PIPEB_SELECT;
> + intel_dp->DP |= DP_PIPE_SEL_CHV(crtc->pipe);
> + else
> + intel_dp->DP |= DP_PIPE_SEL(crtc->pipe);
> }
> }
>
> @@ -2649,52 +2649,66 @@ void intel_dp_sink_dpms(struct intel_dp *intel_dp, int mode)
> mode == DRM_MODE_DPMS_ON ? "enable" : "disable");
> }
>
> +static bool cpt_dp_port_selected(struct drm_i915_private *dev_priv,
> + enum port port, enum pipe *pipe)
> +{
> + enum pipe p;
> +
> + for_each_pipe(dev_priv, p) {
> + u32 val = I915_READ(TRANS_DP_CTL(p));
> +
> + if ((val & TRANS_DP_PORT_SEL_MASK) == TRANS_DP_PORT_SEL(port)) {
> + *pipe = p;
> + return true;
> + }
> + }
> +
> + DRM_DEBUG_KMS("No pipe for DP port %c found\n", port_name(port));
> +
> + /* must initialize pipe to something for the asserts */
> + *pipe = PIPE_A;
> +
> + return false;
> +}
> +
> +bool intel_dp_port_enabled(struct drm_i915_private *dev_priv,
> + i915_reg_t dp_reg, enum port port,
> + enum pipe *pipe)
> +{
> + bool ret;
> + u32 val;
> +
> + val = I915_READ(dp_reg);
> +
> + ret = val & DP_PORT_EN;
> +
> + /* asserts want to know the pipe even if the port is disabled */
> + if (IS_IVYBRIDGE(dev_priv) && port == PORT_A)
> + *pipe = (val & DP_PIPE_SEL_MASK_IVB) >> DP_PIPE_SEL_SHIFT_IVB;
> + else if (HAS_PCH_CPT(dev_priv) && port != PORT_A)
> + ret &= cpt_dp_port_selected(dev_priv, port, pipe);
> + else if (IS_CHERRYVIEW(dev_priv))
> + *pipe = (val & DP_PIPE_SEL_MASK_CHV) >> DP_PIPE_SEL_SHIFT_CHV;
> + else
> + *pipe = (val & DP_PIPE_SEL_MASK) >> DP_PIPE_SEL_SHIFT;
> +
> + return ret;
> +}
> +
> static bool intel_dp_get_hw_state(struct intel_encoder *encoder,
> enum pipe *pipe)
> {
> struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
> struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
> - enum port port = encoder->port;
> - u32 tmp;
> bool ret;
>
> if (!intel_display_power_get_if_enabled(dev_priv,
> encoder->power_domain))
> return false;
>
> - ret = false;
> + ret = intel_dp_port_enabled(dev_priv, intel_dp->output_reg,
> + encoder->port, pipe);
>
> - tmp = I915_READ(intel_dp->output_reg);
> -
> - if (!(tmp & DP_PORT_EN))
> - goto out;
> -
> - if (IS_IVYBRIDGE(dev_priv) && port == PORT_A) {
> - *pipe = PORT_TO_PIPE_CPT(tmp);
> - } else if (HAS_PCH_CPT(dev_priv) && port != PORT_A) {
> - enum pipe p;
> -
> - for_each_pipe(dev_priv, p) {
> - u32 trans_dp = I915_READ(TRANS_DP_CTL(p));
> - if (TRANS_DP_PIPE_TO_PORT(trans_dp) == port) {
> - *pipe = p;
> - ret = true;
> -
> - goto out;
> - }
> - }
> -
> - DRM_DEBUG_KMS("No pipe for dp port 0x%x found\n",
> - i915_mmio_reg_offset(intel_dp->output_reg));
> - } else if (IS_CHERRYVIEW(dev_priv)) {
> - *pipe = DP_PORT_TO_PIPE_CHV(tmp);
> - } else {
> - *pipe = PORT_TO_PIPE(tmp);
> - }
> -
> - ret = true;
> -
> -out:
> intel_display_power_put(dev_priv, encoder->power_domain);
>
> return ret;
> @@ -3684,8 +3698,9 @@ intel_dp_link_down(struct intel_encoder *encoder,
> intel_set_pch_fifo_underrun_reporting(dev_priv, PIPE_A, false);
>
> /* always enable with pattern 1 (as per spec) */
> - DP &= ~(DP_PIPEB_SELECT | DP_LINK_TRAIN_MASK);
> - DP |= DP_PORT_EN | DP_LINK_TRAIN_PAT_1;
> + DP &= ~(DP_PIPE_SEL_MASK | DP_LINK_TRAIN_MASK);
> + DP |= DP_PORT_EN | DP_PIPE_SEL(PIPE_A) |
> + DP_LINK_TRAIN_PAT_1;
> I915_WRITE(intel_dp->output_reg, DP);
> POSTING_READ(intel_dp->output_reg);
>
> @@ -5320,14 +5335,14 @@ static void intel_edp_panel_vdd_sanitize(struct intel_dp *intel_dp)
> static enum pipe vlv_active_pipe(struct intel_dp *intel_dp)
> {
> struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
> + struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base;
> + enum pipe pipe;
>
> - if ((intel_dp->DP & DP_PORT_EN) == 0)
> - return INVALID_PIPE;
> + if (intel_dp_port_enabled(dev_priv, intel_dp->output_reg,
> + encoder->port, &pipe))
> + return pipe;
>
> - if (IS_CHERRYVIEW(dev_priv))
> - return DP_PORT_TO_PIPE_CHV(intel_dp->DP);
> - else
> - return PORT_TO_PIPE(intel_dp->DP);
> + return INVALID_PIPE;
> }
>
> void intel_dp_encoder_reset(struct drm_encoder *encoder)
> diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
> index a827a2245c18..dc7f81e1e20a 100644
> --- a/drivers/gpu/drm/i915/intel_drv.h
> +++ b/drivers/gpu/drm/i915/intel_drv.h
> @@ -1647,6 +1647,9 @@ void intel_csr_ucode_suspend(struct drm_i915_private *);
> void intel_csr_ucode_resume(struct drm_i915_private *);
>
> /* intel_dp.c */
> +bool intel_dp_port_enabled(struct drm_i915_private *dev_priv,
> + i915_reg_t dp_reg, enum port port,
> + enum pipe *pipe);
> bool intel_dp_init(struct drm_i915_private *dev_priv, i915_reg_t output_reg,
> enum port port);
> bool intel_dp_init_connector(struct intel_digital_port *intel_dig_port,
--
Jani Nikula, Intel Open Source Graphics Center
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
next prev parent reply other threads:[~2018-05-23 9:33 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-05-18 15:29 [PATCH 1/7] drm/i915: Move intel_ddi_get_crtc_new_encoder() out from ddi code Ville Syrjala
2018-05-18 15:29 ` [PATCH v2 2/7] drm/i915: Parametrize TRANS_DP_PORT_SEL Ville Syrjala
2018-05-23 9:14 ` Jani Nikula
2018-05-18 15:29 ` [PATCH 3/7] drm/i915: Nuke intel_trans_dp_port_sel() Ville Syrjala
2018-05-23 9:26 ` Jani Nikula
2018-05-18 15:29 ` [PATCH v3 4/7] drm/i915: Clean up DP pipe select bits Ville Syrjala
2018-05-23 9:37 ` Jani Nikula [this message]
2018-05-18 15:29 ` [PATCH 5/7] drm/i915: Allow eDP on port C in theory Ville Syrjala
2018-05-23 9:38 ` Jani Nikula
2018-05-18 15:29 ` [PATCH 6/7] drm/i915: Implement the missing bits of assert_panel_unlocked() Ville Syrjala
2018-05-23 9:42 ` Jani Nikula
2018-05-23 11:48 ` Ville Syrjälä
2018-05-18 15:29 ` [PATCH 7/7] drm/i915: WARN if power sequencer is not connected to the LVDS port on pre-ilk Ville Syrjala
2018-05-23 9:43 ` Jani Nikula
2018-05-23 14:29 ` Ville Syrjälä
2018-05-18 16:10 ` ✓ Fi.CI.BAT: success for series starting with [1/7] drm/i915: Move intel_ddi_get_crtc_new_encoder() out from ddi code Patchwork
2018-05-18 23:21 ` ✓ Fi.CI.IGT: " Patchwork
2018-05-23 9:13 ` [PATCH 1/7] " Jani Nikula
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=87in7en25c.fsf@intel.com \
--to=jani.nikula@linux.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox