From nobody Mon Feb 9 16:19:45 2026 Received: from mail-lj1-f176.google.com (mail-lj1-f176.google.com [209.85.208.176]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id EA29E1F91EB for ; Fri, 17 Jan 2025 08:56:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.176 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737104207; cv=none; b=K5tzMXnILbhf8iuNfnBGTuFznnH2RxfuvvHtzFq103uj1K5BbpS/HFNBspD/rlYFr8rt+c3NayKh25RuCkjhasFKKrcCCrbs5N2CaSClIgGBprTifKXs0CcZeHv/ku8E3Z0byAz9SnN4dmUGxDPLGFhYXa0ut/dfxqwdT0+p0uA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737104207; c=relaxed/simple; bh=ozBueI3BM9vEKFl7dBLTAY6qFYKCUTl49qCghNM3Sh4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=nrrNZ6pzEQBCc4PI94rPhxEjO4zAm//JX9EOgMtzCdiyzNoZe16nghH/dmZvpXACcIdaJrzDFKiNEKFc5cuLBvhyJL6wo93V7YhJxmEwkvx3NA20uNce0aVp4lLm0x7nvEIgCyCp1yMo+x8l83cWELBY6qv/+1z/XXHsJfpgYeI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=wuHbyQQ3; arc=none smtp.client-ip=209.85.208.176 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="wuHbyQQ3" Received: by mail-lj1-f176.google.com with SMTP id 38308e7fff4ca-3003c0c43c0so18815271fa.1 for ; Fri, 17 Jan 2025 00:56:44 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1737104203; x=1737709003; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=qU8230/ZjgdwGUT6DyI0pwq3VTU/dwcpTjuzDvMxMB4=; b=wuHbyQQ3yvQo+SysDlSjIjkqHfIJBcVcrpGY7LOPxXPfvS5s4JvylGjQRg2wOeGIQo bl2gyTO5x5sgmbWrhoPsEoOHqN2KPfiFuH/ReWxBVrneZ5l77V0wUc+0JqHmFBHxpeS8 SNcAezu3IF2o2e82jxiQHKIMGqXARYU21nDsOeWS2uDa3gBKd3y9ffnCHGfvymoQdYiK C4FqCCTBjRv0wI3XofXvfhxgxVZGRq/uZUcFFAMp9hjRG/2i15YnKCP0b8Aa/Zhn5jhq HLFUHczi/QaPYkgxB3Yu1d/OMClPMwYWtRcA7DdeUJeE0fvkVAnkLZpHwoxMkQRAgSXJ O28Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1737104203; x=1737709003; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=qU8230/ZjgdwGUT6DyI0pwq3VTU/dwcpTjuzDvMxMB4=; b=wHQ9pwp60+InboA666yStxBGhxuUcBhAxRkZVZNrCYYed/CYfdMTyczm+aSzn/RJNY waGr6YHz3cP4HQ4SU2pcZyuFSFtyiAzaO9lXzFAdqQN0bOpT5kVMpBYPiLrnaLuM3PXd ejuMgH/LMzHos926zqHBDwMwTehZJqtT8lV/NhXcM/G48+7PuC4MgyRngkBoTgS9uXKd 5a+dQD79rlJkneduOxPu3mq4Pr0bCncUb2PW9rD2trKPbuTJVQaSfzzivHsfu8TJEFVV 1ShMPTngttoOioUwR0dgwfr3Z8xzAiuvg7WAaoxC8Jv1hsv71FxS1z4Eb+fHniwIuAGM eMRw== X-Forwarded-Encrypted: i=1; AJvYcCVIRrH1nyXHrGOXXnT0SM8RRrfavn/YvGK9oQqlvLpaJ2EeO5cX+VDAxks+bvlcywod4Y83L9zhw5ZVsg0=@vger.kernel.org X-Gm-Message-State: AOJu0Yydx15AHutAB95UrOd4hMvslP8TqGxb0QNomvMQRIvhiU+oTVx/ PjgARPYQz0jQ3frX8OoFdrXPAPo0Dzje+RqYGt34PzKH8EIfWsnygCqzSanH3Eo= X-Gm-Gg: ASbGncvNErjgrD919EKtvDf8j1rlpyypHY59Ft4Zkg1oKOMPMZq+ngqLjhzkP9iaz0N 6mUWOWbJJMKmgMIZLrexWUMm0eGV0Dqd6O5co3Hc0N/C8A3VTT8/wsRihRG4ErfogQPOI4bc4kv Wn6qiNYslnZo3plWCrGxxQpTdGDQFCu3VNCbl3ZfP3THA9WS+Wwy7ca48gWC3Ezkt+ZCKJU99US p8dG9CIXMVV8F/fZfh6zN4Bv1hnFrxACxQUX7YsJI5uf0cIDc38pAEnhbBhbJAU X-Google-Smtp-Source: AGHT+IHGAXJy603DxK6zThF85N9QGM4x+a7NYOEkGBzpisAMqMGB+KgwWYbrNjj3TCf2TZ7YbWkVhQ== X-Received: by 2002:a2e:a4c9:0:b0:302:1c90:58d9 with SMTP id 38308e7fff4ca-3072ca7fa0bmr4671971fa.16.1737104203024; Fri, 17 Jan 2025 00:56:43 -0800 (PST) Received: from umbar.lan ([192.130.178.90]) by smtp.gmail.com with ESMTPSA id 38308e7fff4ca-3072a330764sm3402101fa.3.2025.01.17.00.56.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 17 Jan 2025 00:56:41 -0800 (PST) From: Dmitry Baryshkov Date: Fri, 17 Jan 2025 10:56:36 +0200 Subject: [PATCH RFC 1/7] drm/display: dp: change drm_dp_dpcd_read_link_status() return Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250117-drm-rework-dpcd-access-v1-1-7fc020e04dbc@linaro.org> References: <20250117-drm-rework-dpcd-access-v1-0-7fc020e04dbc@linaro.org> In-Reply-To: <20250117-drm-rework-dpcd-access-v1-0-7fc020e04dbc@linaro.org> To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Rob Clark , Abhinav Kumar , Sean Paul , Marijn Suijten , Jani Nikula Cc: dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=6333; i=dmitry.baryshkov@linaro.org; h=from:subject:message-id; bh=ozBueI3BM9vEKFl7dBLTAY6qFYKCUTl49qCghNM3Sh4=; b=owGbwMvMwMXYbdNlx6SpcZXxtFoSQ3qXtGui6gGpb/Nm6ZuUfklesYshKnChmpBDQOjL6+5K0 wu0uG91MhqzMDByMciKKbL4FLRMjdmUHPZhx9R6mEGsTCBTGLg4BWAiimIcDJtkMp8cCuVT4heb tXaDikLoY/1DIYXSu5Q/5e1wknZdGpuYlmG7xOqVykuTx5abtv9YKjhrxYPtkQGKCYcesCfN7Hq hrfG5aR1nPQ+P31vLR0WbPBmXy5TxzF8gzOGjvnt5kf7k99wpTbr7ZE75936Y1srhL/u5QaZNtP xLeax1SfoqGd9zfBdWJsznvS+uvYvxWuiPlQ3vXY/aWE5R3acie/bkqYXczGfEK/lYpk16lGte+ 0wq8erXtJllHlyus8I8a4rZPafWRzHXT3F9/pOFc/2LBwvm7TXVz7W9US/25muayyIrobwPD/QL vLwfCle+CFzDf0U98++ppqCDYqfzz6gUbeA3vD/f01YaAA== X-Developer-Key: i=dmitry.baryshkov@linaro.org; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A drm_dp_dpcd_read_link_status() follows the "return error code or number of bytes read" protocol, with the code returning less bytes than requested in case of some errors. However most of the drivers (except the drm/msm one) interpreted that as "return error code in case of any error". Move return len check to drm_dp_dpcd_read_link_status() and make drm/msm/dp follow that protocol too. Signed-off-by: Dmitry Baryshkov --- drivers/gpu/drm/display/drm_dp_helper.c | 16 +++++++++--- drivers/gpu/drm/msm/dp/dp_ctrl.c | 45 ++++++++++++++++++-----------= ---- drivers/gpu/drm/msm/dp/dp_link.c | 17 ++++++------- 3 files changed, 44 insertions(+), 34 deletions(-) diff --git a/drivers/gpu/drm/display/drm_dp_helper.c b/drivers/gpu/drm/disp= lay/drm_dp_helper.c index da3c8521a7fa7d3c9761377363cdd4b44ab1106e..809c65dcb58983693fb335b8875= 9a66919410114 100644 --- a/drivers/gpu/drm/display/drm_dp_helper.c +++ b/drivers/gpu/drm/display/drm_dp_helper.c @@ -716,14 +716,22 @@ EXPORT_SYMBOL(drm_dp_dpcd_write); * @aux: DisplayPort AUX channel * @status: buffer to store the link status in (must be at least 6 bytes) * - * Returns the number of bytes transferred on success or a negative error - * code on failure. + * Returns the zero on success or a negative error code on failure. */ int drm_dp_dpcd_read_link_status(struct drm_dp_aux *aux, u8 status[DP_LINK_STATUS_SIZE]) { - return drm_dp_dpcd_read(aux, DP_LANE0_1_STATUS, status, - DP_LINK_STATUS_SIZE); + int ret; + + ret =3D drm_dp_dpcd_read(aux, DP_LANE0_1_STATUS, status, + DP_LINK_STATUS_SIZE); + if (ret < 0) + return ret; + + if (ret < DP_LINK_STATUS_SIZE) + return -EPROTO; + + return 0; } EXPORT_SYMBOL(drm_dp_dpcd_read_link_status); =20 diff --git a/drivers/gpu/drm/msm/dp/dp_ctrl.c b/drivers/gpu/drm/msm/dp/dp_c= trl.c index bc2ca8133b790fc049e18ab3b37a629558664dd4..8e4fdc0eae7ce218bdcb1aa03bd= ed2f2a61c4b92 100644 --- a/drivers/gpu/drm/msm/dp/dp_ctrl.c +++ b/drivers/gpu/drm/msm/dp/dp_ctrl.c @@ -1100,20 +1100,6 @@ static bool msm_dp_ctrl_train_pattern_set(struct msm= _dp_ctrl_private *ctrl, return ret =3D=3D 1; } =20 -static int msm_dp_ctrl_read_link_status(struct msm_dp_ctrl_private *ctrl, - u8 *link_status) -{ - int ret =3D 0, len; - - len =3D drm_dp_dpcd_read_link_status(ctrl->aux, link_status); - if (len !=3D DP_LINK_STATUS_SIZE) { - DRM_ERROR("DP link status read failed, err: %d\n", len); - ret =3D -EINVAL; - } - - return ret; -} - static int msm_dp_ctrl_link_train_1(struct msm_dp_ctrl_private *ctrl, int *training_step) { @@ -1140,9 +1126,11 @@ static int msm_dp_ctrl_link_train_1(struct msm_dp_ct= rl_private *ctrl, for (tries =3D 0; tries < maximum_retries; tries++) { drm_dp_link_train_clock_recovery_delay(ctrl->aux, ctrl->panel->dpcd); =20 - ret =3D msm_dp_ctrl_read_link_status(ctrl, link_status); - if (ret) + ret =3D drm_dp_dpcd_read_link_status(ctrl->aux, link_status); + if (ret < 0) { + DRM_ERROR("DP link status read failed, err: %d\n", ret); return ret; + } =20 if (drm_dp_clock_recovery_ok(link_status, ctrl->link->link_params.num_lanes)) { @@ -1252,9 +1240,11 @@ static int msm_dp_ctrl_link_train_2(struct msm_dp_ct= rl_private *ctrl, for (tries =3D 0; tries <=3D maximum_retries; tries++) { drm_dp_link_train_channel_eq_delay(ctrl->aux, ctrl->panel->dpcd); =20 - ret =3D msm_dp_ctrl_read_link_status(ctrl, link_status); - if (ret) + ret =3D drm_dp_dpcd_read_link_status(ctrl->aux, link_status); + if (ret) { + DRM_ERROR("DP link status read failed, err: %d\n", ret); return ret; + } =20 if (drm_dp_channel_eq_ok(link_status, ctrl->link->link_params.num_lanes)) { @@ -1804,8 +1794,13 @@ static bool msm_dp_ctrl_channel_eq_ok(struct msm_dp_= ctrl_private *ctrl) { u8 link_status[DP_LINK_STATUS_SIZE]; int num_lanes =3D ctrl->link->link_params.num_lanes; + int ret; =20 - msm_dp_ctrl_read_link_status(ctrl, link_status); + ret =3D drm_dp_dpcd_read_link_status(ctrl->aux, link_status); + if (ret < 0) { + DRM_ERROR("DP link status read failed, err: %d\n", ret); + return false; + } =20 return drm_dp_channel_eq_ok(link_status, num_lanes); } @@ -1863,7 +1858,11 @@ int msm_dp_ctrl_on_link(struct msm_dp_ctrl *msm_dp_c= trl) if (!msm_dp_catalog_link_is_connected(ctrl->catalog)) break; =20 - msm_dp_ctrl_read_link_status(ctrl, link_status); + rc =3D drm_dp_dpcd_read_link_status(ctrl->aux, link_status); + if (rc < 0) { + DRM_ERROR("DP link status read failed, err: %d\n", rc); + break; + } =20 rc =3D msm_dp_ctrl_link_rate_down_shift(ctrl); if (rc < 0) { /* already in RBR =3D 1.6G */ @@ -1888,7 +1887,11 @@ int msm_dp_ctrl_on_link(struct msm_dp_ctrl *msm_dp_c= trl) if (!msm_dp_catalog_link_is_connected(ctrl->catalog)) break; =20 - msm_dp_ctrl_read_link_status(ctrl, link_status); + rc =3D drm_dp_dpcd_read_link_status(ctrl->aux, link_status); + if (rc < 0) { + DRM_ERROR("DP link status read failed, err: %d\n", rc); + break; + } =20 if (!drm_dp_clock_recovery_ok(link_status, ctrl->link->link_params.num_lanes)) diff --git a/drivers/gpu/drm/msm/dp/dp_link.c b/drivers/gpu/drm/msm/dp/dp_l= ink.c index 1a1fbb2d7d4f2afcaace85d97b744d03017d37ce..431ee86a939343f9c7f2de51703= f8f76f5580934 100644 --- a/drivers/gpu/drm/msm/dp/dp_link.c +++ b/drivers/gpu/drm/msm/dp/dp_link.c @@ -714,21 +714,20 @@ static int msm_dp_link_parse_request(struct msm_dp_li= nk_private *link) =20 static int msm_dp_link_parse_sink_status_field(struct msm_dp_link_private = *link) { - int len; + int ret; =20 link->prev_sink_count =3D link->msm_dp_link.sink_count; - len =3D drm_dp_read_sink_count(link->aux); - if (len < 0) { + ret =3D drm_dp_read_sink_count(link->aux); + if (ret < 0) { DRM_ERROR("DP parse sink count failed\n"); - return len; + return ret; } - link->msm_dp_link.sink_count =3D len; + link->msm_dp_link.sink_count =3D ret; =20 - len =3D drm_dp_dpcd_read_link_status(link->aux, - link->link_status); - if (len < DP_LINK_STATUS_SIZE) { + ret =3D drm_dp_dpcd_read_link_status(link->aux, link->link_status); + if (ret < 0) { DRM_ERROR("DP link status read failed\n"); - return len; + return ret; } =20 return msm_dp_link_parse_request(link); --=20 2.39.5