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

Commit 1616269d authored by Ping Li's avatar Ping Li
Browse files

drm/msm/sde: Update dither programming for dual-pipe merge modes



For DUALPIPE_DSCMERGE, DUALPIPE_3DMERGE and DUALPIPE_3DMERGE_DSC
topologies, dither needs to be programmed on all ping-pong
buffers used in dual pipe case.

Change-Id: I9894a722a52e1b3182cc402db3796a173a07a3c2
Signed-off-by: default avatarPing Li <pingli@codeaurora.org>
parent 45e3b69a
Loading
Loading
Loading
Loading
+24 −6
Original line number Diff line number Diff line
@@ -80,6 +80,11 @@
/* Maximum number of VSYNC wait attempts for RSC state transition */
#define MAX_RSC_WAIT	5

#define TOPOLOGY_DUALPIPE_MERGE_MODE(x) \
		(((x) == SDE_RM_TOPOLOGY_DUALPIPE_DSCMERGE) || \
		((x) == SDE_RM_TOPOLOGY_DUALPIPE_3DMERGE) || \
		((x) == SDE_RM_TOPOLOGY_DUALPIPE_3DMERGE_DSC))

/**
 * enum sde_enc_rc_events - events for resource control state machine
 * @SDE_ENC_RC_EVENT_KICKOFF:
@@ -3402,13 +3407,14 @@ void sde_encoder_trigger_kickoff_pending(struct drm_encoder *drm_enc)
static void _sde_encoder_setup_dither(struct sde_encoder_phys *phys)
{
	void *dither_cfg;
	int ret = 0, rc;
	int ret = 0, rc, i = 0;
	size_t len = 0;
	enum sde_rm_topology_name topology;
	struct drm_encoder *drm_enc;
	struct msm_mode_info mode_info;
	struct msm_display_dsc_info *dsc = NULL;
	struct sde_encoder_virt *sde_enc;
	struct sde_hw_pingpong *hw_pp;

	if (!phys || !phys->connector || !phys->hw_pp ||
			!phys->hw_pp->ops.setup_dither || !phys->parent)
@@ -3431,12 +3437,24 @@ static void _sde_encoder_setup_dither(struct sde_encoder_phys *phys)
	/* disable dither for 10 bpp or 10bpc dsc config */
	if (dsc->bpp == 10 || dsc->bpc == 10) {
		phys->hw_pp->ops.setup_dither(phys->hw_pp, NULL, 0);
	} else {
		return;
	}

	ret = sde_connector_get_dither_cfg(phys->connector,
			phys->connector->state, &dither_cfg, &len);
		if (!ret)
			phys->hw_pp->ops.setup_dither(phys->hw_pp,
				dither_cfg, len);
	if (ret)
		return;

	if (TOPOLOGY_DUALPIPE_MERGE_MODE(topology)) {
		for (i = 0; i < MAX_CHANNELS_PER_ENC; i++) {
			hw_pp = sde_enc->hw_pp[i];
			if (hw_pp) {
				phys->hw_pp->ops.setup_dither(hw_pp, dither_cfg,
								len);
			}
		}
	} else {
		phys->hw_pp->ops.setup_dither(phys->hw_pp, dither_cfg, len);
	}
}