<html>
  <head>
    <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    Hi chris<br>
    <div class="moz-cite-prefix">On Sunday 11 January 2015 06:22 PM,
      Chris Wilson wrote:<br>
    </div>
    <blockquote
      cite="mid:20150111125208.GB27134@nuc-i3427.alporthouse.com"
      type="cite">
      <pre wrap="">On Sat, Jan 10, 2015 at 02:25:57AM +0530, Vandana Kannan wrote:
</pre>
      <blockquote type="cite">
        <pre wrap="">Add DRRS work function to trigger a switch to low refresh rate when activity
is detected on screen.
</pre>
      </blockquote>
      <pre wrap="">
Where is this function used? How can I judge that it does the right
thing?</pre>
    </blockquote>
    <small>Thanks for catching this. There is an error in the commit
      message. This DRRS work function<br>
      will trigger a switch to low refresh rate, when there is no
      activity on the screen for more than 1 sec.<br>
      And this function is set as a deferred work from
      intel_edp_drrs_flush().<br>
      Functionality of this function can be verified from the debug logs
      in dmesg (lower refresh rate set<br>
      will be printed out). Addition to that I am working to enable a
      debugfs to share the refreshrate<br>
      switch info also for the debugging/testing purpose.</small><br>
    <blockquote
      cite="mid:20150111125208.GB27134@nuc-i3427.alporthouse.com"
      type="cite">
      <pre wrap="">

</pre>
      <blockquote type="cite">
        <pre wrap="">Signed-off-by: Vandana Kannan <a class="moz-txt-link-rfc2396E" href="mailto:vandana.kannan@intel.com"><vandana.kannan@intel.com></a>
---
 drivers/gpu/drm/i915/intel_dp.c | 36 ++++++++++++++++++++++++++++--------
 1 file changed, 28 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index 778dcd0..30b3aa1 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -4814,20 +4814,38 @@ static void intel_dp_set_drrs_state(struct drm_device *dev, int refresh_rate)
                I915_WRITE(reg, val);
        }
 
+       dev_priv->drrs.refresh_rate_type = index;
+
+       DRM_DEBUG_KMS("eDP Refresh Rate set to : %dHz\n", refresh_rate);
+}
+
+static void intel_edp_drrs_work(struct work_struct *work)
</pre>
      </blockquote>
      <pre wrap="">
intel_edp_drrs_downclock_work() would be more self-descriptive</pre>
    </blockquote>
    <small>Agreed. I will rename it in next iteration</small><br>
    <blockquote
      cite="mid:20150111125208.GB27134@nuc-i3427.alporthouse.com"
      type="cite">
      <pre wrap="">

</pre>
      <blockquote type="cite">
        <pre wrap="">+{
+       struct drm_i915_private *dev_priv =
+               container_of(work, typeof(*dev_priv), drrs.work.work);
+       struct intel_dp *intel_dp = dev_priv->drrs.dp;
+
+       mutex_lock(&dev_priv->drrs.mutex);
+
+       if (!intel_dp)
+               goto unlock;
</pre>
      </blockquote>
      <pre wrap="">
Does dev_priv->drrs.mutex not also protect dev_priv->drrs.dp?
</pre>
    </blockquote>
    <small>It should have protected. Will cover drrs.dp with drrs.mutex</small>
    <small>in next patch</small><br>
    <blockquote
      cite="mid:20150111125208.GB27134@nuc-i3427.alporthouse.com"
      type="cite">
      <pre wrap="">
</pre>
      <blockquote type="cite">
        <pre wrap="">+
        /*
-        * mutex taken to ensure that there is no race between differnt
-        * drrs calls trying to update refresh rate. This scenario may occur
-        * in future when idleness detection based DRRS in kernel and
-        * possible calls from user space to set differnt RR are made.
+        * The delayed work can race with an invalidate hence we need to
+        * recheck.
         */
</pre>
      </blockquote>
      <pre wrap="">
This comment no longer applies to all the other callers of
intel_dp_set_drrs_state()? Or did you miss adding the
lockdep_assert_held(&dev_priv->drrs.mutex)?</pre>
    </blockquote>
    <small>This comment was added considering the requests from
      userspace for new refreshrates.<br>
      But a part of MIPI DRRS and media playback DRRS implementation
      (currently in development),<br>
      I am addressing the possible race condition. </small><small>So at
      this point in time this comment is irrelevant,<br>
      hence vandana removed it.</small><br>
    <blockquote
      cite="mid:20150111125208.GB27134@nuc-i3427.alporthouse.com"
      type="cite">
      <pre wrap="">

</pre>
      <blockquote type="cite">
        <pre wrap="">-  mutex_lock(&dev_priv->drrs.mutex);
+       if (dev_priv->drrs.busy_frontbuffer_bits)
+               goto unlock;
 
-       dev_priv->drrs.refresh_rate_type = index;
+       if (dev_priv->drrs.refresh_rate_type != DRRS_LOW_RR)
+               intel_dp_set_drrs_state(dev_priv->dev,
</pre>
      </blockquote>
      <pre wrap="">
Would it not be sensible for intel_dp_set_drrs_state() check for the
no-op itself?</pre>
    </blockquote>
    <small>If refresh_rate_type is already LOW_RR then we should exit
      the work function with no call to intel_dp_set_drrs_state().<br>
      Thats the reason the call is kept under the if condition.
      intel_dp_set_drrs_state() already handles if the<br>
      requested vrefresh is same as the vrefresh of the current
      refresh_rate type.</small><br>
    <blockquote
      cite="mid:20150111125208.GB27134@nuc-i3427.alporthouse.com"
      type="cite">
      <pre wrap="">

</pre>
      <blockquote type="cite">
        <pre wrap="">+                  intel_dp->attached_connector->panel.
+                       downclock_mode->vrefresh);
</pre>
      </blockquote>
      <pre wrap="">-Chris

</pre>
    </blockquote>
    -Ram<br>
  </body>
</html>