Re: [PATCH] drm/msm/dpu: filter out too wide modes if no 3dmux is present

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Dmitry

On 12/9/2024 2:16 PM, Dmitry Baryshkov wrote:
Hi Abhinav,

On Mon, 9 Dec 2024 at 22:07, Abhinav Kumar <quic_abhinavk@xxxxxxxxxxx> wrote:



On 12/7/2024 9:29 PM, Dmitry Baryshkov wrote:
On Fri, Dec 06, 2024 at 12:00:53PM -0800, Abhinav Kumar wrote:
On chipsets such as QCS615, there is no 3dmux present. In such
a case, a layer exceeding the max_mixer_width cannot be split,
hence cannot be supported.

Filter out the modes which exceed the max_mixer_width when there
is no 3dmux present. Also, add a check in the dpu_crtc_atomic_check()
to return failure for such modes.

Signed-off-by: Abhinav Kumar <quic_abhinavk@xxxxxxxxxxx>
---
Note: this was only compile tested, so its pending validation on QCS615
---
   drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 13 +++++++++++++
   1 file changed, 13 insertions(+)

diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
index 9f6ffd344693ecfb633095772a31ada5613345dc..e6e5540aae83be7c20d8ae29115b8fdd42056e55 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
@@ -732,6 +732,13 @@ static int _dpu_crtc_check_and_setup_lm_bounds(struct drm_crtc *crtc,
      struct dpu_kms *dpu_kms = _dpu_crtc_get_kms(crtc);
      int i;

+    /* if we cannot merge 2 LMs (no 3d mux) better to fail earlier
+     * before even checking the width after the split
+     */
+    if (!dpu_kms->catalog->caps->has_3d_merge
+        && adj_mode->hdisplay > dpu_kms->catalog->caps->max_mixer_width)
+            return -E2BIG;

Is it the same as checking that there are LMs which support
DPU_MIXER_SOURCESPLIT ?


DPU_MIXER_SOURCESPLIT tells whether we can have more than one SSPP in
the same blend stage.

Do we have a feature bit that corresponds to the ability to use 2 LMs?
I mean, there are other *split topologies, not necessarily the 3DMux
ones. E.g. PPSPLIT.


A layer can always be split across LMs. There is not really any feature bit for this as it can always be done in pretty much all DPU chipsets.

Here the issue is we are not able to merge because there are no 3d mux blocks and hence we cannot split.

We need to merge because, the same display is requiring multiple LMs.

PP split will be a single LM going to two PPs and that going to two INTFs.

Hence the way to look at this patch would be we are avoiding split because we cannot merge and not that we cannot split.


494     if (test_bit(DPU_MIXER_SOURCESPLIT,
495             &ctx->mixer_hw_caps->features))
496             pipes_per_stage = PIPES_PER_STAGE;
497     else
498             pipes_per_stage = 1;

That is different from this one. Here we are checking if we can actually
blend two LM outputs using the 3dmux (so its post blend).

+
      for (i = 0; i < cstate->num_mixers; i++) {
              struct drm_rect *r = &cstate->lm_bounds[i];
              r->x1 = crtc_split_width * i;
@@ -1251,6 +1258,12 @@ static enum drm_mode_status dpu_crtc_mode_valid(struct drm_crtc *crtc,
   {
      struct dpu_kms *dpu_kms = _dpu_crtc_get_kms(crtc);

+    /* if there is no 3d_mux block we cannot merge LMs so we cannot
+     * split the large layer into 2 LMs, filter out such modes
+     */
+    if (!dpu_kms->catalog->caps->has_3d_merge
+        && mode->hdisplay > dpu_kms->catalog->caps->max_mixer_width)
+            return MODE_BAD;

This can be more specific, like MODE_BAD_HVALUE.


Yes for sure, will fix this up.

      /*
       * max crtc width is equal to the max mixer width * 2 and max height is 4K
       */

---
base-commit: af2ea8ab7a546b430726183458da0a173d331272
change-id: 20241206-no_3dmux-521a55ea0669

Best regards,
--
Abhinav Kumar <quic_abhinavk@xxxxxxxxxxx>









[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [Linux for Sparc]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]

  Powered by Linux