[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <CABymUCMnYy-L2Bd6dgYzPTB+qzpFLbU-LyCLDKxCSWy19x_A5g@mail.gmail.com>
Date: Fri, 17 Jan 2025 15:32:44 +0800
From: Jun Nie <jun.nie@...aro.org>
To: Dmitry Baryshkov <dmitry.baryshkov@...aro.org>
Cc: Rob Clark <robdclark@...il.com>, Abhinav Kumar <quic_abhinavk@...cinc.com>,
Sean Paul <sean@...rly.run>, Marijn Suijten <marijn.suijten@...ainline.org>,
David Airlie <airlied@...il.com>, Simona Vetter <simona@...ll.ch>, linux-arm-msm@...r.kernel.org,
dri-devel@...ts.freedesktop.org, freedreno@...ts.freedesktop.org,
linux-kernel@...r.kernel.org
Subject: Re: [PATCH v4 16/16] drm/msm/dpu: Enable quad-pipe for DSC and
dual-DSI case
Dmitry Baryshkov <dmitry.baryshkov@...aro.org> 于2025年1月16日周四 16:32写道:
>
> On Thu, Jan 16, 2025 at 03:26:05PM +0800, Jun Nie wrote:
> > Request 4 mixers and 4 DSC for the case that both dual-DSI and DSC are
> > enabled.
>
> Why? What is the issue that you are solving?
To support high-resolution cases that exceed the width limitation of
a pair of SSPPs, or scenarios that surpass the maximum MDP clock rate,
additional pipes are necessary to enable parallel data processing
within the SSPP width constraints and MDP clock rate.
Request 4 mixers and 4 DSCs for high-resolution cases where both DSC
and dual interfaces are enabled. More use cases can be incorporated
later if quad-pipe capabilities are required.
>
> > 4 pipes are preferred for dual DSI case for it is power optimal
> > for DSC.
> >
> > Signed-off-by: Jun Nie <jun.nie@...aro.org>
> > ---
> > drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 2 +-
> > drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.h | 6 ++---
> > drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c | 29 ++++++++++++++++++------
> > drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys.h | 2 +-
> > drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h | 2 +-
> > drivers/gpu/drm/msm/disp/dpu1/dpu_hw_mdss.h | 2 +-
> > 6 files changed, 29 insertions(+), 14 deletions(-)
> >
>
> > @@ -664,15 +664,20 @@ static struct msm_display_topology dpu_encoder_get_topology(
> >
> > /* Datapath topology selection
> > *
> > - * Dual display
> > + * Dual display without DSC
> > * 2 LM, 2 INTF ( Split display using 2 interfaces)
> > *
> > + * Dual display with DSC
> > + * 2 LM, 2 INTF ( Split display using 2 interfaces)
> > + * 4 LM, 2 INTF ( Split display using 2 interfaces)
> > + *
> > * Single display
> > * 1 LM, 1 INTF
> > * 2 LM, 1 INTF (stream merge to support high resolution interfaces)
> > *
> > * Add dspps to the reservation requirements if ctm is requested
> > */
> > +
>
> irrlevant extra line, please drop.
>
> > if (intf_count == 2)
> > topology.num_lm = 2;
> > else if (!dpu_kms->catalog->caps->has_3d_merge)
> > @@ -691,10 +696,20 @@ static struct msm_display_topology dpu_encoder_get_topology(
> > * 2 DSC encoders, 2 layer mixers and 1 interface
> > * this is power optimal and can drive up to (including) 4k
> > * screens
> > + * But for dual display case, we prefer 4 layer mixers. Because
> > + * the resolution is always high in the case and 4 DSCs are more
> > + * power optimal.
>
> I think this part is thought about in a wrong way. If it was just about
> power efficiency, we wouldn't have to add quad pipe support.
> Please correct me if I'm wrong, but I think it is about the maximum
> width supported by a particular topology being too low for a requested
> resolution. So, if there is a DSC and mode width is higher than 5120
> (8.x+) / 4096 ( <= 7.x), then we have to use quad pipe. Likewise if
> there is no DSC in play, the limitation should be 2 * max_mixer_width.
Both width limitation and clock rate contribute to pipe number decision.
To support high resolution, the MDP clock may be required to overclock
to a higher rate than the safe rate. Current implementation does not
support checking clock rate when deciding topology. We can add the
clock rate check later with a new patch.
>
> > */
> > - topology.num_dsc = 2;
> > - topology.num_lm = 2;
> > - topology.num_intf = 1;
> > +
> > + if (intf_count == 2) {
> > + topology.num_dsc = dpu_kms->catalog->dsc_count >= 4 ? 4 : 2;
>
> This assumes that the driver can support 2:2:2. Is it the case?
The code falls back to 2:2:2 case here. But I guess 2:2:2 does not work yet.
How about below code for DSC case?
if (intf_count == 2 && dpu_kms->catalog->dsc_count >= 4) {
topology.num_dsc = 4;
topology.num_lm = 4;
topology.num_intf = 2;
} else {
topology.num_dsc = 2;
topology.num_lm = 2;
topology.num_intf = 1;
}
>
> > + topology.num_lm = topology.num_dsc;
> > + topology.num_intf = 2;
> > + } else {
> > + topology.num_dsc = 2;
> > + topology.num_lm = 2;
> > + topology.num_intf = 1;
> > + }
> > }
> >
> > return topology;
>
> --
> With best wishes
> Dmitry
Powered by blists - more mailing lists