From: Deepak <deepak.s@linux.intel.com>
To: intel-gfx@lists.freedesktop.org
Subject: Re: [PATCH 14/15] drm/i915: Add some CHV DPIO lane power state asserts
Date: Thu, 27 Aug 2015 10:06:09 +0530 [thread overview]
Message-ID: <55DE93B9.7010600@linux.intel.com> (raw)
In-Reply-To: <1436388361-11130-15-git-send-email-ville.syrjala@linux.intel.com>
On 07/09/2015 02:16 AM, ville.syrjala@linux.intel.com wrote:
> From: Ville Syrjälä <ville.syrjala@linux.intel.com>
>
> Add some checks that the state of the DPIO lanes is more or less what we
> expect based on the overrides.
>
> The hardware only provides two bits per channel indicating whether all
> or some of the lanes are powered down, so we can't do an exact check.
>
> Additionally, CL2 powering down before we can check it adds another
> twist. To work around this we simply check for the 0 value of the
> CL2 register (which is what we get when it's powered down) and
> adjust our expectations.
>
> Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
> ---
> drivers/gpu/drm/i915/i915_reg.h | 8 +++++
> drivers/gpu/drm/i915/intel_runtime_pm.c | 54 +++++++++++++++++++++++++++++++++
> 2 files changed, 62 insertions(+)
>
> diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
> index 395f556..586a0f7 100644
> --- a/drivers/gpu/drm/i915/i915_reg.h
> +++ b/drivers/gpu/drm/i915/i915_reg.h
> @@ -1089,6 +1089,12 @@ enum skl_disp_power_wells {
> #define DPIO_CHV_INT_LOCK_THRESHOLD_SEL_COARSE 1 /* 1: coarse & 0 : fine */
> #define CHV_PLL_DW9(ch) _PIPE(ch, _CHV_PLL_DW9_CH0, _CHV_PLL_DW9_CH1)
>
> +#define _CHV_CMN_DW0_CH0 0x8100
> +#define DPIO_ALLDL_POWERDOWN_SHIFT_CH0 19
> +#define DPIO_ANYDL_POWERDOWN_SHIFT_CH0 18
> +#define DPIO_ALLDL_POWERDOWN (1 << 1)
> +#define DPIO_ANYDL_POWERDOWN (1 << 0)
> +
> #define _CHV_CMN_DW5_CH0 0x8114
> #define CHV_BUFRIGHTENA1_DISABLE (0 << 20)
> #define CHV_BUFRIGHTENA1_NORMAL (1 << 20)
> @@ -1125,6 +1131,8 @@ enum skl_disp_power_wells {
>
> #define _CHV_CMN_DW19_CH0 0x814c
> #define _CHV_CMN_DW6_CH1 0x8098
> +#define DPIO_ALLDL_POWERDOWN_SHIFT_CH1 30 /* CL2 DW6 only */
> +#define DPIO_ANYDL_POWERDOWN_SHIFT_CH1 29 /* CL2 DW6 only */
> #define DPIO_DYNPWRDOWNEN_CH1 (1 << 28) /* CL2 DW6 only */
> #define CHV_CMN_USEDCLKCHANNEL (1 << 13)
>
> diff --git a/drivers/gpu/drm/i915/intel_runtime_pm.c b/drivers/gpu/drm/i915/intel_runtime_pm.c
> index 002b78f..a1d9676 100644
> --- a/drivers/gpu/drm/i915/intel_runtime_pm.c
> +++ b/drivers/gpu/drm/i915/intel_runtime_pm.c
> @@ -1026,6 +1026,58 @@ static void chv_dpio_cmn_power_well_disable(struct drm_i915_private *dev_priv,
> phy, dev_priv->chv_phy_control);
> }
>
> +static void assert_chv_phy_powergate(struct drm_i915_private *dev_priv, enum dpio_phy phy,
> + enum dpio_channel ch, bool override, unsigned int mask)
> +{
> + enum pipe pipe = phy == DPIO_PHY0 ? PIPE_A : PIPE_C;
Why not PIPE B? I think PIPE B can also be used to drive using PHY0?
> + u32 reg, val, expected, actual;
> +
> + if (ch == DPIO_CH0)
> + reg = _CHV_CMN_DW0_CH0;
> + else
> + reg = _CHV_CMN_DW6_CH1;
> +
> + mutex_lock(&dev_priv->sb_lock);
> + val = vlv_dpio_read(dev_priv, pipe, reg);
> + mutex_unlock(&dev_priv->sb_lock);
> +
> + /*
> + * This assumes !override is only used when the port is disabled.
> + * All lanes should power down even without the override when
> + * the port is disabled.
> + */
> + if (!override || mask == 0xf) {
> + expected = DPIO_ALLDL_POWERDOWN | DPIO_ANYDL_POWERDOWN;
> + /*
> + * If CH1 common lane is not active anymore
> + * (eg. for pipe B DPLL) the entire channel will
> + * shut down, which causes the common lane registers
> + * to read as 0. That means we can't actually check
> + * the lane power down status bits, but as the entire
> + * register reads as 0 it's a good indication that the
> + * channel is indeed entirely powered down.
> + */
> + if (ch == DPIO_CH1 && val == 0)
> + expected = 0;
> + } else if (mask != 0x0) {
> + expected = DPIO_ANYDL_POWERDOWN;
> + } else {
> + expected = 0;
> + }
> +
> + if (ch == DPIO_CH0)
> + actual = val >> DPIO_ANYDL_POWERDOWN_SHIFT_CH0;
> + else
> + actual = val >> DPIO_ANYDL_POWERDOWN_SHIFT_CH1;
> + actual &= DPIO_ALLDL_POWERDOWN | DPIO_ANYDL_POWERDOWN;
> +
> + WARN(actual != expected,
> + "Unexpected DPIO lane power down: all %d, any %d. Expected: all %d, any %d. (0x%x = 0x%08x)\n",
> + !!(actual & DPIO_ALLDL_POWERDOWN), !!(actual & DPIO_ANYDL_POWERDOWN),
> + !!(expected & DPIO_ALLDL_POWERDOWN), !!(expected & DPIO_ANYDL_POWERDOWN),
> + reg, val);
> +}
> +
> bool chv_phy_powergate_ch(struct drm_i915_private *dev_priv, enum dpio_phy phy,
> enum dpio_channel ch, bool override)
> {
> @@ -1078,6 +1130,8 @@ void chv_phy_powergate_lanes(struct intel_encoder *encoder,
> DRM_DEBUG_KMS("Power gating DPIO PHY%d CH%d lanes 0x%x (PHY_CONTROL=0x%08x)\n",
> phy, ch, mask, dev_priv->chv_phy_control);
>
> + assert_chv_phy_powergate(dev_priv, phy, ch, override, mask);
> +
> mutex_unlock(&power_domains->lock);
> }
>
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx
next prev parent reply other threads:[~2015-08-27 4:38 UTC|newest]
Thread overview: 50+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-07-08 20:45 [PATCH 00/15] drm/i915: CHV DPIO power gating, take two ville.syrjala
2015-07-08 20:45 ` [PATCH 01/15] drm/i915: Always program m2 fractional value on CHV ville.syrjala
2015-08-17 2:19 ` Deepak
2015-08-17 11:45 ` Ville Syrjälä
2015-08-26 8:11 ` Deepak
2015-07-08 20:45 ` [PATCH 02/15] drm/i915: Always program unique transition scale for CHV ville.syrjala
2015-08-17 2:31 ` Deepak
2015-07-08 20:45 ` [PATCH 03/15] drm/i915: Add encoder->post_pll_disable() hooks and move CHV clock buffer disables there ville.syrjala
2015-08-17 4:16 ` Deepak
2015-08-17 11:53 ` Ville Syrjälä
2015-08-26 8:14 ` Deepak
2015-07-08 20:45 ` [PATCH 04/15] drm/i915: Move DPIO port init earlier ville.syrjala
2015-08-17 4:18 ` Deepak
2015-07-08 20:45 ` [PATCH 05/15] drm/i915: Add locking around chv_phy_control_init() ville.syrjala
2015-08-17 4:23 ` Deepak
2015-07-08 20:45 ` [PATCH 06/15] drm/i915: Move VLV/CHV prepare_pll later ville.syrjala
2015-08-17 4:36 ` Deepak
2015-08-17 4:39 ` Deepak
2015-07-08 20:45 ` [PATCH 07/15] drm/i915: Add vlv_dport_to_phy() ville.syrjala
2015-08-17 4:56 ` Deepak
2015-08-26 8:24 ` Daniel Vetter
2015-07-08 20:45 ` [PATCH 08/15] drm/i915: Implement PHY lane power gating for CHV ville.syrjala
2015-08-19 1:48 ` Deepak
2015-08-26 8:27 ` Daniel Vetter
2015-07-08 20:45 ` [PATCH 09/15] drm/i915: Trick CL2 into life on CHV when using pipe B with port B ville.syrjala
2015-08-19 2:17 ` Deepak
2015-08-19 11:29 ` Ville Syrjälä
2015-08-26 12:36 ` Daniel Vetter
2015-07-08 20:45 ` [PATCH 10/15] drm/i915: Force common lane on for the PPS kick on CHV ville.syrjala
2015-07-10 7:56 ` [PATCH v2 " ville.syrjala
2015-08-19 2:21 ` [PATCH " Deepak
2015-08-19 11:32 ` Ville Syrjälä
2015-07-08 20:45 ` [PATCH 11/15] drm/i915: Enable DPIO SUS clock gating " ville.syrjala
2015-08-19 13:09 ` Deepak
2015-07-08 20:45 ` [PATCH 12/15] drm/i915: Force CL2 off in CHV x1 PHY ville.syrjala
2015-08-19 13:22 ` Deepak
2015-08-19 13:39 ` Ville Syrjälä
2015-08-26 12:38 ` Daniel Vetter
2015-07-08 20:45 ` [PATCH 13/15] drm/i915: Clean up CHV lane soft reset programming ville.syrjala
2015-07-09 16:27 ` Daniel Vetter
2015-07-09 17:14 ` [PATCH v2 " ville.syrjala
2015-08-27 4:25 ` [PATCH " Deepak
2015-07-08 20:46 ` [PATCH 14/15] drm/i915: Add some CHV DPIO lane power state asserts ville.syrjala
2015-08-27 4:36 ` Deepak [this message]
2015-08-27 11:02 ` Ville Syrjälä
2015-08-31 10:47 ` Deepak
2015-07-08 20:46 ` [PATCH 15/15] drm/i915: Add CHV PHY LDO power sanity checks ville.syrjala
2015-08-27 4:39 ` Deepak
2015-09-01 9:45 ` Daniel Vetter
2015-07-09 13:24 ` [PATCH 00/15] drm/i915: CHV DPIO power gating, take two Deepak
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=55DE93B9.7010600@linux.intel.com \
--to=deepak.s@linux.intel.com \
--cc=intel-gfx@lists.freedesktop.org \
/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.