Intel-GFX Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: Imre Deak <imre.deak@intel.com>
To: intel-gfx@lists.freedesktop.org
Subject: [PATCH] drm/i915: fix DP AUX errors due to false timeouts when using wait_event_timeout
Date: Thu,  2 May 2013 12:00:03 +0300	[thread overview]
Message-ID: <1367485203-4533-1-git-send-email-imre.deak@intel.com> (raw)

Due to possible scheduling latencies wait_event_timeout doesn't
guarantee a non-zero return value, even if the condition becomes true
before the specified timeout expires. Thus we can incorrectly signal a
timeout and abort a DP AUX transaction.

If wait_event_timeout returns 0, it's guaranteed that at least the
specified timeout (minus one jiffies, see below) had passed, so we can
fix this by checking the condition explicitly in this case.

Also the timeout that wait_event_timeout() is guaranteed to wait if the
condition doesn't become true is one less jiffies than what is passed to
it as a parameter. This is because the absolute expiration time in
schedule_timeout() may be calculated at a moment close to the next
scheduling tick, when jiffies is incremented. So make sure we pass always
a jiffies value of 2 or greater. Here this makes a difference only for
HZ=100.

This fixes DP AUX errors I saw during booting on an ILK.

This should ideally be fixed in wait_event_timeout(), but that can take
a while. Until that's done use this fix as a band-aid.

Signed-off-by: Imre Deak <imre.deak@intel.com>
---
 drivers/gpu/drm/i915/intel_dp.c |    4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index 8759fb1..7ce96c5 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -303,10 +303,10 @@ intel_dp_aux_wait_done(struct intel_dp *intel_dp, bool has_aux_irq)
 #define C (((status = I915_READ_NOTRACE(ch_ctl)) & DP_AUX_CH_CTL_SEND_BUSY) == 0)
 	if (has_aux_irq)
 		done = wait_event_timeout(dev_priv->gmbus_wait_queue, C,
-					  msecs_to_jiffies(10));
+					  msecs_to_jiffies(10) + 1);
 	else
 		done = wait_for_atomic(C, 10) == 0;
-	if (!done)
+	if (!done && !(C))
 		DRM_ERROR("dp aux hw did not signal timeout (has irq: %i)!\n",
 			  has_aux_irq);
 #undef C
-- 
1.7.10.4

             reply	other threads:[~2013-05-02  9:00 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-05-02  9:00 Imre Deak [this message]
2013-05-02  9:17 ` [PATCH] drm/i915: fix DP AUX errors due to false timeouts when using wait_event_timeout Chris Wilson
2013-05-02  9:31   ` Daniel Vetter
2013-05-02  9:33     ` Daniel Vetter
2013-05-02  9:37       ` Imre Deak
2013-05-02  9:33   ` Imre Deak

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=1367485203-4533-1-git-send-email-imre.deak@intel.com \
    --to=imre.deak@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox