Commit 47327fdd authored by Stephen Boyd's avatar Stephen Boyd Committed by Rob Clark

drm/msm/dp: Shrink locking area of dp_aux_transfer()

We don't need to hold the lock to inspect the message we're going to
transfer, and we don't need to clear the busy flag either. Take the lock
later and bail out earlier if conditions aren't met.

Cc: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Cc: Abhinav Kumar <abhinavk@codeaurora.org>
Cc: Kuogee Hsieh <khsieh@codeaurora.org>
Cc: aravindh@codeaurora.org
Cc: Sean Paul <sean@poorly.run>
Signed-off-by: default avatarStephen Boyd <swboyd@chromium.org>
Reviewed-by: default avatarKuogee Hsieh <khsieh@codeaurora.org>
Link: https://lore.kernel.org/r/20210507212505.1224111-3-swboyd@chromium.orgSigned-off-by: default avatarRob Clark <robdclark@chromium.org>
parent 24c7861b
...@@ -329,30 +329,29 @@ static ssize_t dp_aux_transfer(struct drm_dp_aux *dp_aux, ...@@ -329,30 +329,29 @@ static ssize_t dp_aux_transfer(struct drm_dp_aux *dp_aux,
ssize_t ret; ssize_t ret;
int const aux_cmd_native_max = 16; int const aux_cmd_native_max = 16;
int const aux_cmd_i2c_max = 128; int const aux_cmd_i2c_max = 128;
struct dp_aux_private *aux = container_of(dp_aux, struct dp_aux_private *aux;
struct dp_aux_private, dp_aux);
mutex_lock(&aux->mutex); aux = container_of(dp_aux, struct dp_aux_private, dp_aux);
aux->native = msg->request & (DP_AUX_NATIVE_WRITE & DP_AUX_NATIVE_READ); aux->native = msg->request & (DP_AUX_NATIVE_WRITE & DP_AUX_NATIVE_READ);
/* Ignore address only message */ /* Ignore address only message */
if ((msg->size == 0) || (msg->buffer == NULL)) { if (msg->size == 0 || !msg->buffer) {
msg->reply = aux->native ? msg->reply = aux->native ?
DP_AUX_NATIVE_REPLY_ACK : DP_AUX_I2C_REPLY_ACK; DP_AUX_NATIVE_REPLY_ACK : DP_AUX_I2C_REPLY_ACK;
ret = msg->size; return msg->size;
goto unlock_exit;
} }
/* msg sanity check */ /* msg sanity check */
if ((aux->native && (msg->size > aux_cmd_native_max)) || if ((aux->native && msg->size > aux_cmd_native_max) ||
(msg->size > aux_cmd_i2c_max)) { msg->size > aux_cmd_i2c_max) {
DRM_ERROR("%s: invalid msg: size(%zu), request(%x)\n", DRM_ERROR("%s: invalid msg: size(%zu), request(%x)\n",
__func__, msg->size, msg->request); __func__, msg->size, msg->request);
ret = -EINVAL; return -EINVAL;
goto unlock_exit;
} }
mutex_lock(&aux->mutex);
dp_aux_update_offset_and_segment(aux, msg); dp_aux_update_offset_and_segment(aux, msg);
dp_aux_transfer_helper(aux, msg, true); dp_aux_transfer_helper(aux, msg, true);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment