From: Abhinav Kumar <quic_abhinavk@quicinc.com>
To: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>,
Maarten Lankhorst <maarten.lankhorst@linux.intel.com>,
Maxime Ripard <mripard@kernel.org>,
Thomas Zimmermann <tzimmermann@suse.de>,
David Airlie <airlied@gmail.com>, Simona Vetter <simona@ffwll.ch>,
Rob Clark <robdclark@gmail.com>, Sean Paul <sean@poorly.run>,
Marijn Suijten <marijn.suijten@somainline.org>,
Chandan Uddaraju <chandanu@codeaurora.org>,
Jeykumar Sankaran <jsanka@codeaurora.org>,
Jordan Crouse <jordan@cosmicpenguin.net>,
Sravanthi Kollukuduru <skolluku@codeaurora.org>
Cc: <dri-devel@lists.freedesktop.org>, <linux-kernel@vger.kernel.org>,
Archit Taneja <architt@codeaurora.org>,
Rajesh Yadav <ryadav@codeaurora.org>,
<linux-arm-msm@vger.kernel.org>,
<freedreno@lists.freedesktop.org>,
Simona Vetter <simona.vetter@ffwll.ch>
Subject: Re: [PATCH 6/6] drm/msm/dpu: don't set crtc_state->mode_changed from atomic_check()
Date: Wed, 8 Jan 2025 20:11:27 -0800 [thread overview]
Message-ID: <a6fa4aa2-d90b-4b5e-92fd-db3912ed248a@quicinc.com> (raw)
In-Reply-To: <91dff265-5e13-45db-b46d-0eef4a95f5f6@quicinc.com>
On 1/8/2025 6:27 PM, Abhinav Kumar wrote:
>
>
> On 12/21/2024 9:00 PM, Dmitry Baryshkov wrote:
>> The MSM driver uses drm_atomic_helper_check() which mandates that none
>> of the atomic_check() callbacks toggles crtc_state->mode_changed.
>> Perform corresponding check before calling the drm_atomic_helper_check()
>> function.
>>
>> Fixes: 8b45a26f2ba9 ("drm/msm/dpu: reserve cdm blocks for writeback in
>> case of YUV output")
>> Reported-by: Simona Vetter <simona.vetter@ffwll.ch>
>> Closes:
>> https://lore.kernel.org/dri-devel/ZtW_S0j5AEr4g0QW@phenom.ffwll.local/
>> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
>> ---
>> drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c | 32
>> +++++++++++++++++++++++++----
>> drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.h | 4 ++++
>> drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 26
>> +++++++++++++++++++++++
>> drivers/gpu/drm/msm/msm_atomic.c | 13 +++++++++++-
>> drivers/gpu/drm/msm/msm_kms.h | 7 +++++++
>> 5 files changed, 77 insertions(+), 5 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
>> b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
>> index
>> 209e6fb605b2d8724935b62001032e7d39540366..b7c3aa8d0e2ca58091deacdeaccb0819d2bf045c 100644
>> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
>> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c
>> @@ -753,6 +753,34 @@ static void
>> dpu_encoder_assign_crtc_resources(struct dpu_kms *dpu_kms,
>> cstate->num_mixers = num_lm;
>> }
>> +/**
>> + * dpu_encoder_virt_check_mode_changed: check if full modeset is
>> required
>> + * @drm_enc: Pointer to drm encoder structure
>> + * @crtc_state: Corresponding CRTC state to be checked
>> + * @conn_state: Corresponding Connector's state to be checked
>> + *
>> + * Check if the changes in the object properties demand full mode set.
>> + */
>> +int dpu_encoder_virt_check_mode_changed(struct drm_encoder *drm_enc,
>> + struct drm_crtc_state *crtc_state,
>> + struct drm_connector_state *conn_state)
>> +{
>> + struct dpu_encoder_virt *dpu_enc = to_dpu_encoder_virt(drm_enc);
>> + struct msm_display_topology topology;
>> +
>> + DPU_DEBUG_ENC(dpu_enc, "\n");
>> +
>> + /* Using mode instead of adjusted_mode as it wasn't computed yet */
>> + topology = dpu_encoder_get_topology(dpu_enc, &crtc_state->mode,
>> crtc_state, conn_state);
>> +
>> + if (topology.needs_cdm && !dpu_enc->cur_master->hw_cdm)
>> + crtc_state->mode_changed = true;
>> + else if (!topology.needs_cdm && dpu_enc->cur_master->hw_cdm)
>> + crtc_state->mode_changed = true;
>> +
>> + return 0;
>> +}
>
> How will this work exactly?
>
> needs_cdm is set in the encoder's atomic_check which is called inside
> drm_atomic_helper_check(). But this function is called before that.
>
> So needs_cdm will never hit.
>
Sorry, my bad. after change (4) of this series needs_cdm is also
populated within dpu_encoder_get_topology().
To follow up on
https://patchwork.freedesktop.org/patch/629231/?series=137975&rev=4#comment_1148651
So is the plan for CWB to add a dpu_crtc_check_mode_changed() like
dpu_encoder's and call it?
>
>> +
>> static int dpu_encoder_virt_atomic_check(
>> struct drm_encoder *drm_enc,
>> struct drm_crtc_state *crtc_state,
>> @@ -786,10 +814,6 @@ static int dpu_encoder_virt_atomic_check(
>> topology = dpu_encoder_get_topology(dpu_enc, adj_mode,
>> crtc_state, conn_state);
>> - if (topology.needs_cdm && !dpu_enc->cur_master->hw_cdm)
>> - crtc_state->mode_changed = true;
>> - else if (!topology.needs_cdm && dpu_enc->cur_master->hw_cdm)
>> - crtc_state->mode_changed = true;
>> /*
>> * Release and Allocate resources on every modeset
>> */
>> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.h
>> b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.h
>> index
>> 92b5ee390788d16e85e195a664417896a2bf1cae..da133ee4701a329f566f6f9a7255f2f6d050f891 100644
>> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.h
>> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.h
>> @@ -88,4 +88,8 @@ void dpu_encoder_cleanup_wb_job(struct drm_encoder
>> *drm_enc,
>> bool dpu_encoder_is_valid_for_commit(struct drm_encoder *drm_enc);
>> +int dpu_encoder_virt_check_mode_changed(struct drm_encoder *drm_enc,
>> + struct drm_crtc_state *crtc_state,
>> + struct drm_connector_state *conn_state);
>> +
>> #endif /* __DPU_ENCODER_H__ */
>> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
>> b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
>> index
>> dae8a94d3366abfb8937d5f44d8968f1d0691c2d..e2d822f7d785dc0debcb28595029a3e2050b0cf4 100644
>> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
>> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
>> @@ -446,6 +446,31 @@ static void dpu_kms_disable_commit(struct msm_kms
>> *kms)
>> pm_runtime_put_sync(&dpu_kms->pdev->dev);
>> }
>> +static int dpu_kms_check_mode_changed(struct msm_kms *kms, struct
>> drm_atomic_state *state)
>> +{
>> + struct drm_crtc_state *new_crtc_state;
>> + struct drm_connector *connector;
>> + struct drm_connector_state *new_conn_state;
>> + int i;
>> +
>> + for_each_new_connector_in_state(state, connector, new_conn_state,
>> i) {
>> + struct drm_encoder *encoder;
>> +
>> + WARN_ON(!!new_conn_state->best_encoder !=
>> !!new_conn_state->crtc);
>> +
>> + if (!new_conn_state->crtc || !new_conn_state->best_encoder)
>> + continue;
>> +
>> + new_crtc_state = drm_atomic_get_new_crtc_state(state,
>> new_conn_state->crtc);
>> +
>> + encoder = new_conn_state->best_encoder;
>> +
>> + dpu_encoder_virt_check_mode_changed(encoder, new_crtc_state,
>> new_conn_state);
>> + }
>> +
>> + return 0;
>> +}
>> +
>> static void dpu_kms_flush_commit(struct msm_kms *kms, unsigned
>> crtc_mask)
>> {
>> struct dpu_kms *dpu_kms = to_dpu_kms(kms);
>> @@ -1049,6 +1074,7 @@ static const struct msm_kms_funcs kms_funcs = {
>> .irq = dpu_core_irq,
>> .enable_commit = dpu_kms_enable_commit,
>> .disable_commit = dpu_kms_disable_commit,
>> + .check_mode_changed = dpu_kms_check_mode_changed,
>> .flush_commit = dpu_kms_flush_commit,
>> .wait_flush = dpu_kms_wait_flush,
>> .complete_commit = dpu_kms_complete_commit,
>> diff --git a/drivers/gpu/drm/msm/msm_atomic.c
>> b/drivers/gpu/drm/msm/msm_atomic.c
>> index
>> a7a2384044ffdb13579cc9a10f56f8de9beca761..364df245e3a209094782ca1b47b752a729b32a5b 100644
>> --- a/drivers/gpu/drm/msm/msm_atomic.c
>> +++ b/drivers/gpu/drm/msm/msm_atomic.c
>> @@ -183,10 +183,16 @@ static unsigned get_crtc_mask(struct
>> drm_atomic_state *state)
>> int msm_atomic_check(struct drm_device *dev, struct drm_atomic_state
>> *state)
>> {
>> + struct msm_drm_private *priv = dev->dev_private;
>> + struct msm_kms *kms = priv->kms;
>> struct drm_crtc_state *old_crtc_state, *new_crtc_state;
>> struct drm_crtc *crtc;
>> - int i;
>> + int i, ret = 0;
>> + /*
>> + * FIXME: stop setting allow_modeset and move this check to the DPU
>> + * driver.
>> + */
>> for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state,
>> new_crtc_state, i) {
>> if ((old_crtc_state->ctm && !new_crtc_state->ctm) ||
>> @@ -196,6 +202,11 @@ int msm_atomic_check(struct drm_device *dev,
>> struct drm_atomic_state *state)
>> }
>> }
>> + if (kms && kms->funcs && kms->funcs->check_mode_changed)
>> + ret = kms->funcs->check_mode_changed(kms, state);
>> + if (ret)
>> + return ret;
>> +
>> return drm_atomic_helper_check(dev, state);
>> }
>> diff --git a/drivers/gpu/drm/msm/msm_kms.h
>> b/drivers/gpu/drm/msm/msm_kms.h
>> index
>> e60162744c669773b6e5aef824a173647626ab4e..ec2a75af89b09754faef1a07adc9338f7d78161e 100644
>> --- a/drivers/gpu/drm/msm/msm_kms.h
>> +++ b/drivers/gpu/drm/msm/msm_kms.h
>> @@ -59,6 +59,13 @@ struct msm_kms_funcs {
>> void (*enable_commit)(struct msm_kms *kms);
>> void (*disable_commit)(struct msm_kms *kms);
>> + /**
>> + * @check_mode_changed:
>> + *
>> + * Verify if the commit requires a full modeset on one of CRTCs.
>> + */
>> + int (*check_mode_changed)(struct msm_kms *kms, struct
>> drm_atomic_state *state);
>> +
>> /**
>> * Prepare for atomic commit. This is called after any previous
>> * (async or otherwise) commit has completed.
>>
next prev parent reply other threads:[~2025-01-09 4:12 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-12-22 5:00 [PATCH 0/6] drm: enforce rules for drm_atomic_helper_check_modeset() Dmitry Baryshkov
2024-12-22 5:00 ` [PATCH 1/6] drm/atomic-helper: document drm_atomic_helper_check() restrictions Dmitry Baryshkov
2025-01-08 17:26 ` Simona Vetter
2025-01-09 5:26 ` Abhinav Kumar
2024-12-22 5:00 ` [PATCH 2/6] drm/atomic: prepare to check that drivers follow restrictions for needs_modeset Dmitry Baryshkov
2025-01-08 17:53 ` Simona Vetter
2025-01-08 18:32 ` Dmitry Baryshkov
2024-12-22 5:00 ` [PATCH 3/6] drm/msm/dpu: don't use active in atomic_check() Dmitry Baryshkov
2025-01-08 17:56 ` Simona Vetter
2025-01-09 1:19 ` Abhinav Kumar
2025-01-09 4:22 ` Dmitry Baryshkov
2025-01-09 5:37 ` Abhinav Kumar
2024-12-22 5:00 ` [PATCH 4/6] drm/msm/dpu: move needs_cdm setting to dpu_encoder_get_topology() Dmitry Baryshkov
2025-01-09 1:26 ` Abhinav Kumar
2024-12-22 5:00 ` [PATCH 5/6] drm/msm/dpu: simplify dpu_encoder_get_topology() interface Dmitry Baryshkov
2025-01-09 1:32 ` Abhinav Kumar
2024-12-22 5:00 ` [PATCH 6/6] drm/msm/dpu: don't set crtc_state->mode_changed from atomic_check() Dmitry Baryshkov
2025-01-08 17:55 ` Simona Vetter
2025-01-08 18:55 ` Dmitry Baryshkov
2025-01-09 2:27 ` Abhinav Kumar
2025-01-09 4:11 ` Abhinav Kumar [this message]
2025-01-09 4:26 ` Dmitry Baryshkov
2025-01-09 5:22 ` Abhinav Kumar
2025-01-09 12:12 ` Dmitry Baryshkov
2025-01-09 4:24 ` Dmitry Baryshkov
2025-01-09 13:53 ` [PATCH 0/6] drm: enforce rules for drm_atomic_helper_check_modeset() Thomas Zimmermann
2025-01-09 23:57 ` Dmitry Baryshkov
2025-01-10 13:30 ` Thomas Zimmermann
2025-01-13 8:47 ` Dmitry Baryshkov
2025-01-23 12:08 ` Dmitry Baryshkov
2025-01-23 12:36 ` (subset) " Dmitry Baryshkov
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=a6fa4aa2-d90b-4b5e-92fd-db3912ed248a@quicinc.com \
--to=quic_abhinavk@quicinc.com \
--cc=airlied@gmail.com \
--cc=architt@codeaurora.org \
--cc=chandanu@codeaurora.org \
--cc=dmitry.baryshkov@linaro.org \
--cc=dri-devel@lists.freedesktop.org \
--cc=freedreno@lists.freedesktop.org \
--cc=jordan@cosmicpenguin.net \
--cc=jsanka@codeaurora.org \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=maarten.lankhorst@linux.intel.com \
--cc=marijn.suijten@somainline.org \
--cc=mripard@kernel.org \
--cc=robdclark@gmail.com \
--cc=ryadav@codeaurora.org \
--cc=sean@poorly.run \
--cc=simona.vetter@ffwll.ch \
--cc=simona@ffwll.ch \
--cc=skolluku@codeaurora.org \
--cc=tzimmermann@suse.de \
/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