]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
Revert "drm/msm/dpu: try reserving the DSPP-less LM first"
authorDmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
Fri, 13 Feb 2026 23:02:59 +0000 (01:02 +0200)
committerDmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
Mon, 23 Feb 2026 23:30:00 +0000 (01:30 +0200)
This reverts commit 42f62cd79578 ("drm/msm/dpu: try reserving the
DSPP-less LM first"). It seems on later DPUs using higher LMs require
some additional setup or conflicts with the hardware defaults. Val (and
other developers) reported blue screen on Hamoa (X1E80100) laptops.
Revert the offending commit until we understand, what is the issue.

Fixes: 42f62cd79578 ("drm/msm/dpu: try reserving the DSPP-less LM first")
Reported-by: Val Packett <val@packett.cool>
Closes: https://lore.kernel.org/r/33424a9d-10a6-4479-bba6-12f8ce60da1a@packett.cool
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>
Tested-by: Manivannan Sadhasivam <mani@kernel.org> # T14s
Patchwork: https://patchwork.freedesktop.org/patch/704814/
Link: https://lore.kernel.org/r/20260214-revert-dspp-less-v1-1-be0d636a2a6e@oss.qualcomm.com
drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c

index 451a4fcf3e6538cc473a517524a94f975955425f..7e77d88f895920cf2b755ba22cf2cc1f69b91452 100644 (file)
@@ -350,26 +350,28 @@ static bool _dpu_rm_check_lm_and_get_connected_blks(struct dpu_rm *rm,
        return true;
 }
 
-static bool dpu_rm_find_lms(struct dpu_rm *rm,
-                           struct dpu_global_state *global_state,
-                           uint32_t crtc_id, bool skip_dspp,
-                           struct msm_display_topology *topology,
-                           int *lm_idx, int *pp_idx, int *dspp_idx)
+static int _dpu_rm_reserve_lms(struct dpu_rm *rm,
+                              struct dpu_global_state *global_state,
+                              uint32_t crtc_id,
+                              struct msm_display_topology *topology)
 
 {
+       int lm_idx[MAX_BLOCKS];
+       int pp_idx[MAX_BLOCKS];
+       int dspp_idx[MAX_BLOCKS] = {0};
        int i, lm_count = 0;
 
+       if (!topology->num_lm) {
+               DPU_ERROR("zero LMs in topology\n");
+               return -EINVAL;
+       }
+
        /* Find a primary mixer */
        for (i = 0; i < ARRAY_SIZE(rm->mixer_blks) &&
                        lm_count < topology->num_lm; i++) {
                if (!rm->mixer_blks[i])
                        continue;
 
-               if (skip_dspp && to_dpu_hw_mixer(rm->mixer_blks[i])->cap->dspp) {
-                       DPU_DEBUG("Skipping LM_%d, skipping LMs with DSPPs\n", i);
-                       continue;
-               }
-
                /*
                 * Reset lm_count to an even index. This will drop the previous
                 * primary mixer if failed to find its peer.
@@ -408,38 +410,12 @@ static bool dpu_rm_find_lms(struct dpu_rm *rm,
                }
        }
 
-       return lm_count == topology->num_lm;
-}
-
-static int _dpu_rm_reserve_lms(struct dpu_rm *rm,
-                              struct dpu_global_state *global_state,
-                              uint32_t crtc_id,
-                              struct msm_display_topology *topology)
-
-{
-       int lm_idx[MAX_BLOCKS];
-       int pp_idx[MAX_BLOCKS];
-       int dspp_idx[MAX_BLOCKS] = {0};
-       int i;
-       bool found;
-
-       if (!topology->num_lm) {
-               DPU_ERROR("zero LMs in topology\n");
-               return -EINVAL;
-       }
-
-       /* Try using non-DSPP LM blocks first */
-       found = dpu_rm_find_lms(rm, global_state, crtc_id, !topology->num_dspp,
-                               topology, lm_idx, pp_idx, dspp_idx);
-       if (!found && !topology->num_dspp)
-               found = dpu_rm_find_lms(rm, global_state, crtc_id, false,
-                                       topology, lm_idx, pp_idx, dspp_idx);
-       if (!found) {
+       if (lm_count != topology->num_lm) {
                DPU_DEBUG("unable to find appropriate mixers\n");
                return -ENAVAIL;
        }
 
-       for (i = 0; i < topology->num_lm; i++) {
+       for (i = 0; i < lm_count; i++) {
                global_state->mixer_to_crtc_id[lm_idx[i]] = crtc_id;
                global_state->pingpong_to_crtc_id[pp_idx[i]] = crtc_id;
                global_state->dspp_to_crtc_id[dspp_idx[i]] =