Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6a6239e1 authored by Krishna Manikandan's avatar Krishna Manikandan
Browse files

disp: msm: sde: modify check for active datapaths



In some cases like suspend and cwb concurrencies,
the number of mixers in the sde_crtc structure
can become zero. Add support to get the number
of mixers from topology in those cases to
avoid incorrect resource allocation request.

Change-Id: Id9b82e805ff50a107ad06514b4e41c0917abdf33
Signed-off-by: default avatarKrishna Manikandan <mkrishn@codeaurora.org>
parent d8e76ae1
Loading
Loading
Loading
Loading
+37 −0
Original line number Diff line number Diff line
@@ -4746,6 +4746,43 @@ static int sde_crtc_atomic_check(struct drm_crtc *crtc,
	return rc;
}

/**
 * sde_crtc_get_num_datapath - get the number of datapath active
 *				of primary connector
 * @crtc: Pointer to DRM crtc object
 * @connector: Pointer to DRM connector object of WB in CWB case
 */
int sde_crtc_get_num_datapath(struct drm_crtc *crtc,
		struct drm_connector *connector)
{
	struct sde_crtc *sde_crtc = to_sde_crtc(crtc);
	struct sde_connector_state *sde_conn_state = NULL;
	struct drm_connector *conn;
	struct drm_connector_list_iter conn_iter;

	if (!sde_crtc || !connector) {
		SDE_DEBUG("Invalid argument\n");
		return 0;
	}

	if (sde_crtc->num_mixers)
		return sde_crtc->num_mixers;

	drm_connector_list_iter_begin(crtc->dev, &conn_iter);
	drm_for_each_connector_iter(conn, &conn_iter) {
		if (conn->state && conn->state->crtc == crtc &&
				 conn != connector)
			sde_conn_state = to_sde_connector_state(conn->state);
	}

	drm_connector_list_iter_end(&conn_iter);

	if (sde_conn_state)
		return sde_conn_state->mode_info.topology.num_lm;

	return 0;
}

int sde_crtc_vblank(struct drm_crtc *crtc, bool en)
{
	struct sde_crtc *sde_crtc;
+10 −12
Original line number Diff line number Diff line
/*
 * Copyright (c) 2015-2019 The Linux Foundation. All rights reserved.
 * Copyright (c) 2015-2020 The Linux Foundation. All rights reserved.
 * Copyright (C) 2013 Red Hat
 * Author: Rob Clark <robdclark@gmail.com>
 *
@@ -479,17 +479,6 @@ static inline int sde_crtc_get_mixer_height(struct sde_crtc *sde_crtc,
			cstate->ds_cfg[0].lm_height : mode->vdisplay);
}

/**
 * sde_crtc_get_num_datapath - get the number of datapath active
 * @crtc: Pointer to drm crtc object
 */
static inline int sde_crtc_get_num_datapath(struct drm_crtc *crtc)
{
	struct sde_crtc *sde_crtc = to_sde_crtc(crtc);

	return sde_crtc ? sde_crtc->num_mixers : 0;
}

/**
 * sde_crtc_frame_pending - retun the number of pending frames
 * @crtc: Pointer to drm crtc object
@@ -834,4 +823,13 @@ void sde_crtc_misr_setup(struct drm_crtc *crtc, bool enable, u32 frame_count);
void sde_crtc_get_misr_info(struct drm_crtc *crtc,
		struct sde_crtc_misr_info *crtc_misr_info);

/**
 * sde_crtc_get_num_datapath - get the number of datapath active
 *				of primary connector
 * @crtc: Pointer to DRM crtc object
 * @connector: Pointer to DRM connector object of WB in CWB case
 */
int sde_crtc_get_num_datapath(struct drm_crtc *crtc,
		struct drm_connector *connector);

#endif /* _SDE_CRTC_H_ */
+11 −2
Original line number Diff line number Diff line
@@ -1750,7 +1750,7 @@ static int _sde_rm_populate_requirements(
		struct sde_rm_requirements *reqs)
{
	const struct drm_display_mode *mode = &crtc_state->mode;
	int i;
	int i, num_lm;

	memset(reqs, 0, sizeof(*reqs));

@@ -1800,9 +1800,18 @@ static int _sde_rm_populate_requirements(
		 */
		reqs->topology =
			&rm->topology_tbl[SDE_RM_TOPOLOGY_DUALPIPE_3DMERGE];
		if (sde_crtc_get_num_datapath(crtc_state->crtc) == 1)

		num_lm = sde_crtc_get_num_datapath(crtc_state->crtc,
				conn_state->connector);

		if (num_lm == 1)
			reqs->topology =
				&rm->topology_tbl[SDE_RM_TOPOLOGY_SINGLEPIPE];
		else if (num_lm == 0)
			SDE_ERROR("Primary layer mixer is not set\n");

		SDE_EVT32(num_lm, reqs->topology->num_lm,
			reqs->topology->top_name, reqs->topology->num_ctl);
	}

	SDE_DEBUG("top_ctrl: 0x%llX num_h_tiles: %d\n", reqs->top_ctrl,