Commit 9f593419 authored by Dmitry Baryshkov's avatar Dmitry Baryshkov
Browse files

Revert "drm/msm/dpu: try reserving the DSPP-less LM first"



This reverts commit 42f62cd7 ("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: 42f62cd7 ("drm/msm/dpu: try reserving the DSPP-less LM first")
Reported-by: default avatarVal Packett <val@packett.cool>
Closes: https://lore.kernel.org/r/33424a9d-10a6-4479-bba6-12f8ce60da1a@packett.cool


Signed-off-by: default avatarDmitry 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
parent b1dcc804
Loading
Loading
Loading
Loading
+14 −38
Original line number Diff line number Diff line
@@ -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,
static int _dpu_rm_reserve_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)
			       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]] =