[Freedreno] [RFC PATCH v2 1/4] drm/msm/dpu: Move TE setup to prepare_for_kickoff()
Jessica Zhang
quic_jesszhan at quicinc.com
Thu Feb 9 22:31:50 UTC 2023
On 2/9/2023 10:51 AM, Dmitry Baryshkov wrote:
> On 09/02/2023 20:44, Jessica Zhang wrote:
>> Currently, DPU will enable TE during prepare_commit(). However, this
>> will cause issues when trying to read/write to register in
>> get_autorefresh_config(), because the core clock rates aren't set at
>> that time.
>>
>> This used to work because phys_enc->hw_pp is only initialized in mode
>> set [1], so the first prepare_commit() will return before any register
>> read/write as hw_pp would be NULL.
>>
>> However, when we try to implement support for INTF TE, we will run into
>> the clock issue described above as hw_intf will *not* be NULL on the
>> first prepare_commit(). This is because the initialization of
>> dpu_enc->hw_intf has been moved to dpu_encoder_setup() [2].
>>
>> To avoid this issue, let's enable TE during prepare_for_kickoff()
>> instead as the core clock rates are guaranteed to be set then.
>>
>> Depends on: "Implement tearcheck support on INTF block" [3]
>>
>> [1]
>> https://gitlab.freedesktop.org/drm/msm/-/blob/msm-next/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c#L1109
>> [2]
>> https://gitlab.freedesktop.org/drm/msm/-/blob/msm-next/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c#L2339
>> [3] https://patchwork.freedesktop.org/series/112332/
>>
>> Signed-off-by: Jessica Zhang <quic_jesszhan at quicinc.com>
>> ---
>> .../drm/msm/disp/dpu1/dpu_encoder_phys_cmd.c | 78 ++++++++++---------
>> 1 file changed, 43 insertions(+), 35 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_cmd.c
>> b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_cmd.c
>> index cb05036f2916..561406d92a1a 100644
>> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_cmd.c
>> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_cmd.c
>> @@ -583,39 +583,6 @@ static void dpu_encoder_phys_cmd_destroy(struct
>> dpu_encoder_phys *phys_enc)
>> kfree(cmd_enc);
>> }
>> -static void dpu_encoder_phys_cmd_prepare_for_kickoff(
>> - struct dpu_encoder_phys *phys_enc)
>> -{
>> - struct dpu_encoder_phys_cmd *cmd_enc =
>> - to_dpu_encoder_phys_cmd(phys_enc);
>> - int ret;
>> -
>> - if (!phys_enc->hw_pp) {
>> - DPU_ERROR("invalid encoder\n");
>> - return;
>> - }
>> - DRM_DEBUG_KMS("id:%u pp:%d pending_cnt:%d\n",
>> DRMID(phys_enc->parent),
>> - phys_enc->hw_pp->idx - PINGPONG_0,
>> - atomic_read(&phys_enc->pending_kickoff_cnt));
>> -
>> - /*
>> - * Mark kickoff request as outstanding. If there are more than one,
>> - * outstanding, then we have to wait for the previous one to
>> complete
>> - */
>> - ret = _dpu_encoder_phys_cmd_wait_for_idle(phys_enc);
>> - if (ret) {
>> - /* force pending_kickoff_cnt 0 to discard failed kickoff */
>> - atomic_set(&phys_enc->pending_kickoff_cnt, 0);
>> - DRM_ERROR("failed wait_for_idle: id:%u ret:%d pp:%d\n",
>> - DRMID(phys_enc->parent), ret,
>> - phys_enc->hw_pp->idx - PINGPONG_0);
>> - }
>> -
>> - DPU_DEBUG_CMDENC(cmd_enc, "pp:%d pending_cnt %d\n",
>> - phys_enc->hw_pp->idx - PINGPONG_0,
>> - atomic_read(&phys_enc->pending_kickoff_cnt));
>> -}
>> -
>> static bool dpu_encoder_phys_cmd_is_ongoing_pptx(
>> struct dpu_encoder_phys *phys_enc)
>> {
>> @@ -641,8 +608,7 @@ static bool dpu_encoder_phys_cmd_is_ongoing_pptx(
>> return false;
>> }
>> -static void dpu_encoder_phys_cmd_prepare_commit(
>> - struct dpu_encoder_phys *phys_enc)
>> +static void dpu_encoder_phys_cmd_enable_te(struct dpu_encoder_phys
>> *phys_enc)
>> {
>> struct dpu_encoder_phys_cmd *cmd_enc =
>> to_dpu_encoder_phys_cmd(phys_enc);
>> @@ -700,6 +666,48 @@ static void dpu_encoder_phys_cmd_prepare_commit(
>> "disabled autorefresh\n");
>> }
>> +static void dpu_encoder_phys_cmd_prepare_for_kickoff(
>> + struct dpu_encoder_phys *phys_enc)
>> +{
>> + struct dpu_encoder_phys_cmd *cmd_enc =
>> + to_dpu_encoder_phys_cmd(phys_enc);
>> + int ret;
>> +
>> + if (!phys_enc->hw_pp) {
>> + DPU_ERROR("invalid encoder\n");
>> + return;
>> + }
>> +
>> +
>> + DRM_DEBUG_KMS("id:%u pp:%d pending_cnt:%d\n",
>> DRMID(phys_enc->parent),
>> + phys_enc->hw_pp->idx - PINGPONG_0,
>> + atomic_read(&phys_enc->pending_kickoff_cnt));
>> +
>> + /*
>> + * Mark kickoff request as outstanding. If there are more than one,
>> + * outstanding, then we have to wait for the previous one to
>> complete
>> + */
>> + ret = _dpu_encoder_phys_cmd_wait_for_idle(phys_enc);
>> + if (ret) {
>> + /* force pending_kickoff_cnt 0 to discard failed kickoff */
>> + atomic_set(&phys_enc->pending_kickoff_cnt, 0);
>> + DRM_ERROR("failed wait_for_idle: id:%u ret:%d pp:%d\n",
>> + DRMID(phys_enc->parent), ret,
>> + phys_enc->hw_pp->idx - PINGPONG_0);
>> + }
>> +
>> + dpu_encoder_phys_cmd_enable_te(phys_enc);
>> +
>> + DPU_DEBUG_CMDENC(cmd_enc, "pp:%d pending_cnt %d\n",
>> + phys_enc->hw_pp->idx - PINGPONG_0,
>> + atomic_read(&phys_enc->pending_kickoff_cnt));
>> +}
>
> Quoting v1:
>
> Could you please move the function back to the place, so that we can see
> the actual difference?
Hi Dmitry,
Sorry if I missed your reply to my reply in V1, but as stated in the V1
patch: the reason the diff looks like this is because
prepare_for_kickoff() is defined above where the prepare_commit() and
is_ongoing_pptx() were originally defined. So I had to move both
function definitions to above the prepare_for_kickoff() function for the
patch to compile.
That being said, I'm open to any suggestions for making this patch more
legible.
>
>> +
>> +static void dpu_encoder_phys_cmd_prepare_commit(
>> + struct dpu_encoder_phys *phys_enc)
>> +{
>> +}
>
> This is not necessary and can be dropped. There is a safety check in
> dpu_encoder_prepare_commit().
Acked.
Thanks,
Jessica Zhang
>
>> +
>> static int _dpu_encoder_phys_cmd_wait_for_ctl_start(
>> struct dpu_encoder_phys *phys_enc)
>> {
>
> --
> With best wishes
> Dmitry
>
More information about the Freedreno
mailing list