All of lore.kernel.org
 help / color / mirror / Atom feed
From: Rodrigo Vivi <rodrigo.vivi@gmail.com>
To: "R, Durgadoss" <durgadoss.r@intel.com>
Cc: "intel-gfx@lists.freedesktop.org"
	<intel-gfx@lists.freedesktop.org>,
	"Vivi, Rodrigo" <rodrigo.vivi@intel.com>
Subject: Re: [PATCH 11/15] drm/i915: PSR VLV/CHV: Introduce setup, enable and disable functions
Date: Wed, 19 Nov 2014 10:20:49 -0800	[thread overview]
Message-ID: <CABVU7+um5gBjrApgKxwAZ_FEZNiFrcyNELewGVvwX+zZhYYo9w@mail.gmail.com> (raw)
In-Reply-To: <4D68720C2E767A4AA6A8796D42C8EB59090715E8@BGSMSX101.gar.corp.intel.com>

On Tue, Nov 18, 2014 at 10:32 AM, R, Durgadoss <durgadoss.r@intel.com> wrote:
>>-----Original Message-----
>>From: Vivi, Rodrigo
>>Sent: Friday, November 14, 2014 10:23 PM
>>To: intel-gfx@lists.freedesktop.org
>>Cc: Vivi, Rodrigo; R, Durgadoss
>>Subject: [PATCH 11/15] drm/i915: PSR VLV/CHV: Introduce setup, enable and disable functions
>>
>>The biggest difference from HSW/BDW PSR here is that VLV enable_source
>>function enables PSR but let it in Inactive state. So it might be called
>>on early stage along with setup and enable_sink ones.
>>
>>v2: Rebase over intel_psr.c;
>>    Remove docs from static functions;
>>    Merge vlv_psr_active_on_pipe;
>>    Timeout for psr transition is 250us;
>>    Remove SRC_TRASMITTER_STATE;
>
> With SRC_TRANSMITTER_STATE not set to 1
> explicitly, if entry/exit works, I would like to know what DPCD
> register 71h is reading in your panel ?
>
> I would expect bit 0 of 71h to be 1.
> Is it the case ?

no. It is always 0.

DP_PSR_CAPS = 0xA

> Can we check once ?
>
> Thanks,
> Durga

What do you suggest? get SRC_TRANSMITTER_STATE back?

>
>>
>>Cc: Durgadoss R <durgadoss.r@intel.com>
>>Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
>>---
>> drivers/gpu/drm/i915/intel_psr.c | 154 ++++++++++++++++++++++++++++++++-------
>> 1 file changed, 129 insertions(+), 25 deletions(-)
>>
>>diff --git a/drivers/gpu/drm/i915/intel_psr.c b/drivers/gpu/drm/i915/intel_psr.c
>>index c296a89..bdb28f2 100644
>>--- a/drivers/gpu/drm/i915/intel_psr.c
>>+++ b/drivers/gpu/drm/i915/intel_psr.c
>>@@ -81,6 +81,17 @@ bool intel_psr_is_enabled(struct drm_device *dev)
>>       return (bool)dev_priv->psr.enabled;
>> }
>>
>>+static bool vlv_is_psr_active_on_pipe(struct drm_device *dev, int pipe)
>>+{
>>+      struct drm_i915_private *dev_priv = dev->dev_private;
>>+      uint32_t val;
>>+
>>+      val = I915_READ(VLV_PSRSTAT(pipe)) &
>>+            VLV_EDP_PSR_CURR_STATE_MASK;
>>+      return (val == VLV_EDP_PSR_ACTIVE_NORFB_UP) ||
>>+             (val == VLV_EDP_PSR_ACTIVE_SF_UPDATE);
>>+}
>>+
>> static void intel_psr_write_vsc(struct intel_dp *intel_dp,
>>                                   struct edp_vsc_psr *vsc_psr)
>> {
>>@@ -110,7 +121,23 @@ static void intel_psr_write_vsc(struct intel_dp *intel_dp,
>>       POSTING_READ(ctl_reg);
>> }
>>
>>-static void intel_psr_setup_vsc(struct intel_dp *intel_dp)
>>+static void vlv_psr_setup_vsc(struct intel_dp *intel_dp)
>>+{
>>+      struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
>>+      struct drm_device *dev = intel_dig_port->base.base.dev;
>>+      struct drm_i915_private *dev_priv = dev->dev_private;
>>+      struct drm_crtc *crtc = intel_dig_port->base.base.crtc;
>>+      enum pipe pipe = to_intel_crtc(crtc)->pipe;
>>+      uint32_t val;
>>+
>>+      /* VLV auto-generate VSC package as per EDP 1.3 spec, Table 3.10 */
>>+      val  = I915_READ(VLV_VSCSDP(pipe));
>>+      val &= ~VLV_EDP_PSR_SDP_FREQ_MASK;
>>+      val |= VLV_EDP_PSR_SDP_FREQ_EVFRAME;
>>+      I915_WRITE(VLV_VSCSDP(pipe), val);
>>+}
>>+
>>+static void hsw_psr_setup_vsc(struct intel_dp *intel_dp)
>> {
>>       struct edp_vsc_psr psr_vsc;
>>
>>@@ -123,7 +150,13 @@ static void intel_psr_setup_vsc(struct intel_dp *intel_dp)
>>       intel_psr_write_vsc(intel_dp, &psr_vsc);
>> }
>>
>>-static void intel_psr_enable_sink(struct intel_dp *intel_dp)
>>+static void vlv_psr_enable_sink(struct intel_dp *intel_dp)
>>+{
>>+      drm_dp_dpcd_writeb(&intel_dp->aux, DP_PSR_EN_CFG,
>>+                         DP_PSR_ENABLE);
>>+}
>>+
>>+static void hsw_psr_enable_sink(struct intel_dp *intel_dp)
>> {
>>       struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
>>       struct drm_device *dev = dig_port->base.base.dev;
>>@@ -167,7 +200,21 @@ static void intel_psr_enable_sink(struct intel_dp *intel_dp)
>>                  (aux_clock_divider << DP_AUX_CH_CTL_BIT_CLOCK_2X_SHIFT));
>> }
>>
>>-static void intel_psr_enable_source(struct intel_dp *intel_dp)
>>+static void vlv_psr_enable_source(struct intel_dp *intel_dp)
>>+{
>>+      struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
>>+      struct drm_device *dev = dig_port->base.base.dev;
>>+      struct drm_i915_private *dev_priv = dev->dev_private;
>>+      struct drm_crtc *crtc = dig_port->base.base.crtc;
>>+      enum pipe pipe = to_intel_crtc(crtc)->pipe;
>>+
>>+      /* Transition from PSR_state 0 to PSR_state 1, i.e. PSR Inactive */
>>+      I915_WRITE(VLV_PSRCTL(pipe),
>>+                 VLV_EDP_PSR_MODE_SW_TIMER |
>>+                 VLV_EDP_PSR_ENABLE);
>>+}
>>+
>>+static void hsw_psr_enable_source(struct intel_dp *intel_dp)
>> {
>>       struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
>>       struct drm_device *dev = dig_port->base.base.dev;
>>@@ -247,7 +294,7 @@ static bool intel_psr_match_conditions(struct intel_dp *intel_dp)
>>       return true;
>> }
>>
>>-static void intel_psr_do_enable(struct intel_dp *intel_dp)
>>+static void intel_psr_activate(struct intel_dp *intel_dp)
>> {
>>       struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
>>       struct drm_device *dev = intel_dig_port->base.base.dev;
>>@@ -257,9 +304,12 @@ static void intel_psr_do_enable(struct intel_dp *intel_dp)
>>       WARN_ON(dev_priv->psr.active);
>>       lockdep_assert_held(&dev_priv->psr.lock);
>>
>>-      /* Enable/Re-enable PSR on the host */
>>-      intel_psr_enable_source(intel_dp);
>>-
>>+      /* Enable/Re-enable PSR on the host
>>+       * On HSW+ after we enable PSR on source it will activate it
>>+       * as soon as it match configure idle_frame count. So
>>+       * we just actually enable it here on activation time.
>>+       */
>>+      hsw_psr_enable_source(intel_dp);
>>       dev_priv->psr.active = true;
>> }
>>
>>@@ -296,37 +346,67 @@ void intel_psr_enable(struct intel_dp *intel_dp)
>>
>>       dev_priv->psr.busy_frontbuffer_bits = 0;
>>
>>-      intel_psr_setup_vsc(intel_dp);
>>+      if (HAS_DDI(dev)) {
>>+              hsw_psr_setup_vsc(intel_dp);
>>
>>-      /* Avoid continuous PSR exit by masking memup and hpd */
>>-      I915_WRITE(EDP_PSR_DEBUG_CTL(dev), EDP_PSR_DEBUG_MASK_MEMUP |
>>-                 EDP_PSR_DEBUG_MASK_HPD | EDP_PSR_DEBUG_MASK_LPSP);
>>+              /* Avoid continuous PSR exit by masking memup and hpd */
>>+              I915_WRITE(EDP_PSR_DEBUG_CTL(dev), EDP_PSR_DEBUG_MASK_MEMUP |
>>+                         EDP_PSR_DEBUG_MASK_HPD | EDP_PSR_DEBUG_MASK_LPSP);
>>
>>-      /* Enable PSR on the panel */
>>-      intel_psr_enable_sink(intel_dp);
>>+              /* Enable PSR on the panel */
>>+              hsw_psr_enable_sink(intel_dp);
>>+      } else {
>>+              vlv_psr_setup_vsc(intel_dp);
>>+
>>+              /* Enable PSR on the panel */
>>+              vlv_psr_enable_sink(intel_dp);
>>+
>>+              /* On HSW+ enable_source also means go to PSR entry/active
>>+               * state as soon as idle_frame achieved and here would be
>>+               * to soon. However on VLV enable_source just enable PSR
>>+               * but let it on inactive state. So we might do this prior
>>+               * to active transition, i.e. here.
>>+               */
>>+              vlv_psr_enable_source(intel_dp);
>>+      }
>>
>>       dev_priv->psr.enabled = intel_dp;
>> unlock:
>>       mutex_unlock(&dev_priv->psr.lock);
>> }
>>
>>-/**
>>- * intel_psr_disable - Disable PSR
>>- * @intel_dp: Intel DP
>>- *
>>- * This function needs to be called before disabling pipe.
>>- */
>>-void intel_psr_disable(struct intel_dp *intel_dp)
>>+static void vlv_psr_disable(struct intel_dp *intel_dp)
>> {
>>       struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
>>       struct drm_device *dev = intel_dig_port->base.base.dev;
>>       struct drm_i915_private *dev_priv = dev->dev_private;
>>+      struct intel_crtc *intel_crtc =
>>+              to_intel_crtc(intel_dig_port->base.base.crtc);
>>+      uint32_t val;
>>
>>-      mutex_lock(&dev_priv->psr.lock);
>>-      if (!dev_priv->psr.enabled) {
>>-              mutex_unlock(&dev_priv->psr.lock);
>>-              return;
>>+      if (dev_priv->psr.active) {
>>+              /* Put VLV PSR back to PSR_state 0 that is PSR Disabled. */
>>+              if (wait_for((I915_READ(VLV_PSRSTAT(intel_crtc->pipe)) &
>>+                            VLV_EDP_PSR_IN_TRANS) == 0, 0.250))
>>+                      WARN(1, "PSR transition took longer than expected\n");
>>+
>>+              val = I915_READ(VLV_PSRCTL(intel_crtc->pipe));
>>+              val &= ~VLV_EDP_PSR_ACTIVE_ENTRY;
>>+              val &= ~VLV_EDP_PSR_ENABLE;
>>+              val &= ~VLV_EDP_PSR_MODE_MASK;
>>+              I915_WRITE(VLV_PSRCTL(intel_crtc->pipe), val);
>>+
>>+              dev_priv->psr.active = false;
>>+      } else {
>>+              WARN_ON(vlv_is_psr_active_on_pipe(dev, intel_crtc->pipe));
>>       }
>>+}
>>+
>>+static void hsw_psr_disable(struct intel_dp *intel_dp)
>>+{
>>+      struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
>>+      struct drm_device *dev = intel_dig_port->base.base.dev;
>>+      struct drm_i915_private *dev_priv = dev->dev_private;
>>
>>       if (dev_priv->psr.active) {
>>               I915_WRITE(EDP_PSR_CTL(dev),
>>@@ -341,6 +421,30 @@ void intel_psr_disable(struct intel_dp *intel_dp)
>>       } else {
>>               WARN_ON(I915_READ(EDP_PSR_CTL(dev)) & EDP_PSR_ENABLE);
>>       }
>>+}
>>+
>>+/**
>>+ * intel_psr_disable - Disable PSR
>>+ * @intel_dp: Intel DP
>>+ *
>>+ * This function needs to be called before disabling pipe.
>>+ */
>>+void intel_psr_disable(struct intel_dp *intel_dp)
>>+{
>>+      struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
>>+      struct drm_device *dev = intel_dig_port->base.base.dev;
>>+      struct drm_i915_private *dev_priv = dev->dev_private;
>>+
>>+      mutex_lock(&dev_priv->psr.lock);
>>+      if (!dev_priv->psr.enabled) {
>>+              mutex_unlock(&dev_priv->psr.lock);
>>+              return;
>>+      }
>>+
>>+      if (HAS_DDI(dev))
>>+              hsw_psr_disable(intel_dp);
>>+      else
>>+              vlv_psr_disable(intel_dp);
>>
>>       dev_priv->psr.enabled = NULL;
>>       mutex_unlock(&dev_priv->psr.lock);
>>@@ -379,7 +483,7 @@ static void intel_psr_work(struct work_struct *work)
>>       if (dev_priv->psr.busy_frontbuffer_bits)
>>               goto unlock;
>>
>>-      intel_psr_do_enable(intel_dp);
>>+      intel_psr_activate(intel_dp);
>> unlock:
>>       mutex_unlock(&dev_priv->psr.lock);
>> }
>>--
>>1.9.3
>
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx



-- 
Rodrigo Vivi
Blog: http://blog.vivi.eng.br
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

  reply	other threads:[~2014-11-19 18:20 UTC|newest]

Thread overview: 62+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-11-14 16:52 [PATCH 01/15] drm/i915: Make dp aux pack/unpack public outside intel_dp.c Rodrigo Vivi
2014-11-14 16:52 ` [PATCH 02/15] drm/i915: Introduce intel_psr.c Rodrigo Vivi
2014-11-18 18:16   ` R, Durgadoss
2014-11-14 16:52 ` [PATCH 03/15] drm/i915: Add PSR docbook Rodrigo Vivi
2014-11-18 18:18   ` R, Durgadoss
2014-11-14 16:52 ` [PATCH 04/15] drm/i915: Parse VBT PSR block Rodrigo Vivi
2015-02-10 19:26   ` Damien Lespiau
2014-11-14 16:52 ` [PATCH 05/15] drm/i915: HSW/BDW PSR Set idle_frames = VBT + 1 Rodrigo Vivi
2014-11-14 16:52 ` [PATCH 06/15] drm/i915: PSR get full link off x standby from VBT Rodrigo Vivi
2014-11-18 18:21   ` R, Durgadoss
2014-11-21 18:46     ` Daniel Vetter
2014-11-14 16:52 ` [PATCH 07/15] drm/i915: PSR skip aux on wake up as defined by VBT Rodrigo Vivi
2014-11-17 18:48   ` Rodrigo Vivi
2014-11-14 16:52 ` [PATCH 08/15] drm/i915: remove PSR BDW single frame update Rodrigo Vivi
2014-11-18 18:23   ` R, Durgadoss
2014-11-19 15:34     ` [PATCH] " Rodrigo Vivi
2014-11-21 14:55       ` shuang.he
2014-11-14 16:52 ` [PATCH 09/15] drm/i915: Fix intel_psr_is_enabled function and document it Rodrigo Vivi
2014-11-18 18:24   ` R, Durgadoss
2014-11-19 13:51     ` Daniel Vetter
2014-11-19 15:34       ` [PATCH] drm/i915: Remove intel_psr_is_enabled function Rodrigo Vivi
2014-11-20  5:56         ` R, Durgadoss
2014-11-20 10:22           ` Rodrigo Vivi
2014-11-21 13:12             ` shuang.he
2014-11-21 18:29             ` Daniel Vetter
2014-11-21 11:35               ` Rodrigo Vivi
2014-11-21 18:28                 ` shuang.he
2014-11-21 13:14         ` shuang.he
2014-11-14 16:52 ` [PATCH 10/15] drm/i915: Add PSR registers for PSR VLV/CHV Rodrigo Vivi
2014-11-18 18:27   ` R, Durgadoss
2014-11-14 16:52 ` [PATCH 11/15] drm/i915: PSR VLV/CHV: Introduce setup, enable and disable functions Rodrigo Vivi
2014-11-18 18:32   ` R, Durgadoss
2014-11-19 18:20     ` Rodrigo Vivi [this message]
2014-11-19 19:22       ` R, Durgadoss
2014-11-19 15:37         ` [PATCH] " Rodrigo Vivi
2014-11-20  5:54           ` R, Durgadoss
2014-11-19 22:30         ` [PATCH 11/15] " Rodrigo Vivi
2014-11-14 16:52 ` [PATCH 12/15] drm/i915: VLV/CHV PSR Software timer mode Rodrigo Vivi
2014-11-18 18:36   ` R, Durgadoss
2014-11-19 15:37     ` [PATCH] " Rodrigo Vivi
2014-11-20  5:52       ` R, Durgadoss
2014-11-14 16:52 ` [PATCH 13/15] drm/i915: VLV/CHV PSR: Increase wait delay time before active PSR Rodrigo Vivi
2014-11-18 18:37   ` R, Durgadoss
2014-11-19 15:38     ` [PATCH] " Rodrigo Vivi
2014-11-21 18:45       ` Daniel Vetter
2014-11-21 22:00         ` Vivi, Rodrigo
2014-11-24  9:22           ` Daniel Vetter
2014-11-22  9:28       ` [PATCH] drm/i915: VLV/CHV PSR: Increase wait delay time shuang.he
2014-11-14 16:52 ` [PATCH 14/15] drm/i915: VLV/CHV PSR debugfs Rodrigo Vivi
2014-11-18 18:40   ` R, Durgadoss
2014-11-14 16:52 ` [PATCH 15/15] drm/i915: Enable PSR for Baytrail and Braswell Rodrigo Vivi
2014-11-15  9:47   ` [PATCH 15/15] drm/i915: Enable PSR for Baytrail and shuang.he
2014-11-17 18:18   ` [PATCH 15/15] drm/i915: Enable PSR for Baytrail and Braswell Daniel Vetter
2014-11-17 18:30     ` Rodrigo Vivi
2014-11-17 18:51       ` Daniel Vetter
2014-11-17 19:12         ` Rodrigo Vivi
2014-11-17 20:18           ` Daniel Vetter
2014-11-20 17:25   ` Rodrigo Vivi
2014-11-20 17:58     ` R, Durgadoss
2014-11-20 11:44       ` [PATCH] " Rodrigo Vivi
2014-11-22 17:08         ` shuang.he
2014-11-17 18:14 ` [PATCH 01/15] drm/i915: Make dp aux pack/unpack public outside intel_dp.c Daniel Vetter

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=CABVU7+um5gBjrApgKxwAZ_FEZNiFrcyNELewGVvwX+zZhYYo9w@mail.gmail.com \
    --to=rodrigo.vivi@gmail.com \
    --cc=durgadoss.r@intel.com \
    --cc=intel-gfx@lists.freedesktop.org \
    --cc=rodrigo.vivi@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.