Patch "drm/dp: move hw_mutex up the call stack" has been added to the 4.5-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
drm/dp: move hw_mutex up the call stack
to the 4.5-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
drm-dp-move-hw_mutex-up-the-call-stack.patch
and it can be found in the queue-4.5 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
7779c5e23c5132c22a219f1f5554ef81dd15ee91Mon Sep 17 00:00:00 2001
From: Rob Clark <[email protected]>
Date: Thu, 25 Feb 2016 16:15:05 -0500
Subject: drm/dp: move hw_mutex up the call stack
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
From: Rob Clark <[email protected]>
commit 7779c5e23c5132c22a219f1f5554ef81dd15ee91 upstream.
1) don't let other threads trying to bang on aux channel interrupt the defer timeout/logic
2) don't let other threads interrupt the i2c over aux logic
Technically, according to people who actually have the DP spec, this should not be required. In practice, it makes some troublesome Dell monitor (and perhaps others) work, so probably a case of "It's compliant if it works with windows" on the hw vendor's part..
v2: rebased to come before DPCD/AUX logging patch for easier backport to stable branches.
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1274157
--- drivers/gpu/drm/drm_dp_helper.c | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-)
drivers/gpu/drm/drm_dp_helper.c +17 -10
@@ -178,7 +178,7 @@ static int drm_dp_dpcd_access(struct drm {struct drm_dp_aux_msg msg;unsigned int retry; -int err; +int err =0 ;memset (&msg,0 ,sizeof (msg)); msg.address = offset;
@@ -186,6 +186,8 @@ static int drm_dp_dpcd_access(struct drm msg.buffer = buffer; msg.size = size; +mutex_lock (&aux->hw_mutex); +/* * The specification doesn't give any recommendation on how often to * retry native transactions. We used to retry 7 times like for
@@ -194,25 +196,24 @@ static int drm_dp_dpcd_access(struct drm*/ for (retry =0 ; retry <32 ; retry++) { -mutex_lock (&aux->hw_mutex); err = aux->transfer (aux, &msg); -mutex_unlock (&aux->hw_mutex);if (err <0 ) {if (err == -EBUSY )continue ; -return err; + goto unlock; }switch (msg.reply &DP_AUX_NATIVE_REPLY_MASK ) {case DP_AUX_NATIVE_REPLY_ACK :if (err < size) -return -EPROTO ; -return err; + err = -EPROTO ; + goto unlock;case DP_AUX_NATIVE_REPLY_NACK : -return -EIO ; + err = -EIO ; + goto unlock;case DP_AUX_NATIVE_REPLY_DEFER :usleep_range (AUX_RETRY_INTERVAL ,AUX_RETRY_INTERVAL +100 );
@@ -221,7 +222,11 @@ static int drm_dp_dpcd_access(struct drm }DRM_DEBUG_KMS ("too many retries, giving up\n" ); -return -EIO ; + err = -EIO ; + +unlock: +mutex_unlock (&aux->hw_mutex); +return err; }/**
@@ -543,9 +548,7 @@ static int drm_dp_i2c_do_msg(struct drm_int max_retries =max (7 ,drm_dp_i2c_retry_count (msg, dp_aux_i2c_speed_khz));for (retry =0 , defer_i2c =0 ; retry < (max_retries + defer_i2c); retry++) { -mutex_lock (&aux->hw_mutex); ret = aux->transfer (aux, msg); -mutex_unlock (&aux->hw_mutex);if (ret <0 ) {if (ret == -EBUSY )continue ;
@@ -684,6 +687,8 @@ static int drm_dp_i2c_xfer(struct i2c_admemset (&msg,0 ,sizeof (msg)); +mutex_lock (&aux->hw_mutex); +for (i =0 ; i < num; i++) { msg.address = msgs[i].addr;drm_dp_i2c_msg_set_request (&msg, &msgs[i]);
@@ -738,6 +743,8 @@ static int drm_dp_i2c_xfer(struct i2c_ad msg.size =0 ; (void )drm_dp_i2c_do_msg (aux, &msg); +mutex_unlock (&aux->hw_mutex); +return err; }
Patches currently in stable-queue which might be from [email protected] are
queue-4.5/drm-dp-move-hw_mutex-up-the-call-stack.patch