From: Abel Vesa <abel.vesa@linaro.org>
To: Aleksandrs Vinarskis <alex.vinarskis@gmail.com>
Cc: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>,
linux-arm-msm@vger.kernel.org, dri-devel@lists.freedesktop.org,
freedreno@lists.freedesktop.org, linux-kernel@vger.kernel.org,
Rob Clark <robdclark@gmail.com>,
Abhinav Kumar <quic_abhinavk@quicinc.com>,
Sean Paul <sean@poorly.run>,
Marijn Suijten <marijn.suijten@somainline.org>,
David Airlie <airlied@gmail.com>, Simona Vetter <simona@ffwll.ch>,
laurentiu.tudor1@dell.com, johan@kernel.org
Subject: Re: [PATCH v1 1/2] drm/msm/dp: Fix support of LTTPR handling
Date: Tue, 11 Mar 2025 09:22:11 +0200 [thread overview]
Message-ID: <Z8/ko76QAGPE46R/@linaro.org> (raw)
In-Reply-To: <20250310211039.29843-2-alex.vinarskis@gmail.com>
On 25-03-10 22:05:51, Aleksandrs Vinarskis wrote:
> Take into account LTTPR capabilities when selecting maximum allowed
> link rate, number of data lines. Initialize LTTPR before
> msm_dp_panel_read_sink_caps, as
> a) Link params computation need to take into account LTTPR's caps
> b) It appears DPTX shall (re)read DPRX caps after LTTPR detection
>
> Return lttpr_count to prepare for per-segment link training.
>
> Signed-off-by: Aleksandrs Vinarskis <alex.vinarskis@gmail.com>
> ---
> drivers/gpu/drm/msm/dp/dp_display.c | 31 +++++++++++++++++++----------
> drivers/gpu/drm/msm/dp/dp_panel.c | 30 +++++++++++++++++++---------
> drivers/gpu/drm/msm/dp/dp_panel.h | 2 ++
> 3 files changed, 44 insertions(+), 19 deletions(-)
>
> diff --git a/drivers/gpu/drm/msm/dp/dp_display.c b/drivers/gpu/drm/msm/dp/dp_display.c
> index bbc47d86ae9e..2edbc6adfde5 100644
> --- a/drivers/gpu/drm/msm/dp/dp_display.c
> +++ b/drivers/gpu/drm/msm/dp/dp_display.c
> @@ -108,6 +108,8 @@ struct msm_dp_display_private {
> struct msm_dp_event event_list[DP_EVENT_Q_MAX];
> spinlock_t event_lock;
>
> + u8 lttpr_common_caps[DP_LTTPR_COMMON_CAP_SIZE];
> +
> bool wide_bus_supported;
>
> struct msm_dp_audio *audio;
> @@ -367,17 +369,21 @@ static int msm_dp_display_send_hpd_notification(struct msm_dp_display_private *d
> return 0;
> }
>
> -static void msm_dp_display_lttpr_init(struct msm_dp_display_private *dp)
> +static int msm_dp_display_lttpr_init(struct msm_dp_display_private *dp, u8 *dpcd)
> {
> - u8 lttpr_caps[DP_LTTPR_COMMON_CAP_SIZE];
> - int rc;
> + int rc, lttpr_count;
>
> - if (drm_dp_read_lttpr_common_caps(dp->aux, dp->panel->dpcd, lttpr_caps))
> - return;
> + if (drm_dp_read_lttpr_common_caps(dp->aux, dpcd, dp->lttpr_common_caps))
> + return 0;
>
> - rc = drm_dp_lttpr_init(dp->aux, drm_dp_lttpr_count(lttpr_caps));
> - if (rc)
> - DRM_ERROR("failed to set LTTPRs transparency mode, rc=%d\n", rc);
> + lttpr_count = drm_dp_lttpr_count(dp->lttpr_common_caps);
> + rc = drm_dp_lttpr_init(dp->aux, lttpr_count);
> + if (rc) {
> + DRM_ERROR("fialed to set LTTPRs transparency mode, rc=%d\n", rc);
Nitpick: failed
With that fixed, LGTM:
Reviewed-by: Abel Vesa <abel.vesa@linaro.org>
> + return 0;
> + }
> +
> + return lttpr_count;
> }
>
> static int msm_dp_display_process_hpd_high(struct msm_dp_display_private *dp)
> @@ -385,12 +391,17 @@ static int msm_dp_display_process_hpd_high(struct msm_dp_display_private *dp)
> struct drm_connector *connector = dp->msm_dp_display.connector;
> const struct drm_display_info *info = &connector->display_info;
> int rc = 0;
> + u8 dpcd[DP_RECEIVER_CAP_SIZE];
>
> - rc = msm_dp_panel_read_sink_caps(dp->panel, connector);
> + rc = drm_dp_read_dpcd_caps(dp->aux, dpcd);
> if (rc)
> goto end;
>
> - msm_dp_display_lttpr_init(dp);
> + msm_dp_display_lttpr_init(dp, dpcd);
> +
> + rc = msm_dp_panel_read_sink_caps(dp->panel, dp->lttpr_common_caps, connector);
> + if (rc)
> + goto end;
>
> msm_dp_link_process_request(dp->link);
>
> diff --git a/drivers/gpu/drm/msm/dp/dp_panel.c b/drivers/gpu/drm/msm/dp/dp_panel.c
> index 92415bf8aa16..f41b4cf7002e 100644
> --- a/drivers/gpu/drm/msm/dp/dp_panel.c
> +++ b/drivers/gpu/drm/msm/dp/dp_panel.c
> @@ -45,9 +45,12 @@ static void msm_dp_panel_read_psr_cap(struct msm_dp_panel_private *panel)
> }
> }
>
> -static int msm_dp_panel_read_dpcd(struct msm_dp_panel *msm_dp_panel)
> +static int msm_dp_panel_read_dpcd(struct msm_dp_panel *msm_dp_panel,
> + const u8 lttpr_common_caps[DP_LTTPR_COMMON_CAP_SIZE])
> {
> int rc;
> + int max_sink_lanes, max_source_lanes, max_lttpr_lanes;
> + int max_sink_rate, max_source_rate, max_lttpr_rate;
> struct msm_dp_panel_private *panel;
> struct msm_dp_link_info *link_info;
> u8 *dpcd, major, minor;
> @@ -64,16 +67,24 @@ static int msm_dp_panel_read_dpcd(struct msm_dp_panel *msm_dp_panel)
> major = (link_info->revision >> 4) & 0x0f;
> minor = link_info->revision & 0x0f;
>
> - link_info->rate = drm_dp_max_link_rate(dpcd);
> - link_info->num_lanes = drm_dp_max_lane_count(dpcd);
> + max_source_lanes = msm_dp_panel->max_dp_lanes;
> + max_source_rate = msm_dp_panel->max_dp_link_rate;
>
> - /* Limit data lanes from data-lanes of endpoint property of dtsi */
> - if (link_info->num_lanes > msm_dp_panel->max_dp_lanes)
> - link_info->num_lanes = msm_dp_panel->max_dp_lanes;
> + max_sink_lanes = drm_dp_max_lane_count(dpcd);
> + max_sink_rate = drm_dp_max_link_rate(dpcd);
> +
> + max_lttpr_lanes = drm_dp_lttpr_max_lane_count(lttpr_common_caps);
> + max_lttpr_rate = drm_dp_lttpr_max_link_rate(lttpr_common_caps);
>
> + if (max_lttpr_lanes)
> + max_sink_lanes = min(max_sink_lanes, max_lttpr_lanes);
> + if (max_lttpr_rate)
> + max_sink_rate = min(max_sink_rate, max_lttpr_rate);
> +
> + /* Limit data lanes from data-lanes of endpoint property of dtsi */
> + link_info->num_lanes = min(max_sink_lanes, max_source_lanes);
> /* Limit link rate from link-frequencies of endpoint property of dtsi */
> - if (link_info->rate > msm_dp_panel->max_dp_link_rate)
> - link_info->rate = msm_dp_panel->max_dp_link_rate;
> + link_info->rate = min(max_sink_rate, max_source_rate);
>
> drm_dbg_dp(panel->drm_dev, "version: %d.%d\n", major, minor);
> drm_dbg_dp(panel->drm_dev, "link_rate=%d\n", link_info->rate);
> @@ -109,6 +120,7 @@ static u32 msm_dp_panel_get_supported_bpp(struct msm_dp_panel *msm_dp_panel,
> }
>
> int msm_dp_panel_read_sink_caps(struct msm_dp_panel *msm_dp_panel,
> + const u8 lttpr_common_caps[DP_LTTPR_COMMON_CAP_SIZE],
> struct drm_connector *connector)
> {
> int rc, bw_code;
> @@ -125,7 +137,7 @@ int msm_dp_panel_read_sink_caps(struct msm_dp_panel *msm_dp_panel,
> drm_dbg_dp(panel->drm_dev, "max_lanes=%d max_link_rate=%d\n",
> msm_dp_panel->max_dp_lanes, msm_dp_panel->max_dp_link_rate);
>
> - rc = msm_dp_panel_read_dpcd(msm_dp_panel);
> + rc = msm_dp_panel_read_dpcd(msm_dp_panel, lttpr_common_caps);
> if (rc) {
> DRM_ERROR("read dpcd failed %d\n", rc);
> return rc;
> diff --git a/drivers/gpu/drm/msm/dp/dp_panel.h b/drivers/gpu/drm/msm/dp/dp_panel.h
> index 4906f4f09f24..d89e17a9add5 100644
> --- a/drivers/gpu/drm/msm/dp/dp_panel.h
> +++ b/drivers/gpu/drm/msm/dp/dp_panel.h
> @@ -7,6 +7,7 @@
> #define _DP_PANEL_H_
>
> #include <drm/msm_drm.h>
> +#include <drm/display/drm_dp_helper.h>
>
> #include "dp_aux.h"
> #include "dp_link.h"
> @@ -49,6 +50,7 @@ int msm_dp_panel_init_panel_info(struct msm_dp_panel *msm_dp_panel);
> int msm_dp_panel_deinit(struct msm_dp_panel *msm_dp_panel);
> int msm_dp_panel_timing_cfg(struct msm_dp_panel *msm_dp_panel);
> int msm_dp_panel_read_sink_caps(struct msm_dp_panel *msm_dp_panel,
> + const u8 lttpr_common_caps[DP_LTTPR_COMMON_CAP_SIZE],
> struct drm_connector *connector);
> u32 msm_dp_panel_get_mode_bpp(struct msm_dp_panel *msm_dp_panel, u32 mode_max_bpp,
> u32 mode_pclk_khz);
> --
> 2.45.2
>
next prev parent reply other threads:[~2025-03-11 7:22 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-03-10 21:05 [PATCH v1 0/2] drm/msm/dp: Introduce link training per-segment for LTTPRs Aleksandrs Vinarskis
2025-03-10 21:05 ` [PATCH v1 1/2] drm/msm/dp: Fix support of LTTPR handling Aleksandrs Vinarskis
2025-03-11 7:22 ` Abel Vesa [this message]
2025-03-10 21:05 ` [PATCH v1 2/2] drm/msm/dp: Introduce link training per-segment for LTTPRs Aleksandrs Vinarskis
2025-03-11 8:20 ` Abel Vesa
2025-03-11 8:28 ` Johan Hovold
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=Z8/ko76QAGPE46R/@linaro.org \
--to=abel.vesa@linaro.org \
--cc=airlied@gmail.com \
--cc=alex.vinarskis@gmail.com \
--cc=dmitry.baryshkov@linaro.org \
--cc=dri-devel@lists.freedesktop.org \
--cc=freedreno@lists.freedesktop.org \
--cc=johan@kernel.org \
--cc=laurentiu.tudor1@dell.com \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=marijn.suijten@somainline.org \
--cc=quic_abhinavk@quicinc.com \
--cc=robdclark@gmail.com \
--cc=sean@poorly.run \
--cc=simona@ffwll.ch \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.