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

Commit 0b01878e authored by Steve Cohen's avatar Steve Cohen Committed by Abhijith Desai
Browse files

drm/msm/sde: update all qsync params in single commit



Update qsync params so that everything is set within the same
commit. Previously some settings may not get programmed until
one frame after the feature is enabled/disabled. This patch
also cleans up the qsync interface so that encoders no longer
directly access connector properties to get the qsync mode.

Change-Id: Icceb359ba13decac1c0faa5a974ffd9b4ccc8e95
Signed-off-by: default avatarSteve Cohen <cohens@codeaurora.org>
Signed-off-by: default avatarAbhijith Desai <desaia@codeaurora.org>
parent 9073cae2
Loading
Loading
Loading
Loading
+26 −15
Original line number Diff line number Diff line
@@ -544,6 +544,26 @@ static int _sde_connector_update_bl_scale(struct sde_connector *c_conn)
	return rc;
}

void sde_connector_set_qsync_params(struct drm_connector *connector)
{
	struct sde_connector *c_conn = to_sde_connector(connector);
	u32 qsync_propval;

	if (!connector)
		return;

	c_conn->qsync_updated = false;
	qsync_propval = sde_connector_get_property(c_conn->base.state,
			CONNECTOR_PROP_QSYNC_MODE);

	if (qsync_propval != c_conn->qsync_mode) {
		SDE_DEBUG("updated qsync mode %d -> %d\n", c_conn->qsync_mode,
				qsync_propval);
		c_conn->qsync_updated = true;
		c_conn->qsync_mode = qsync_propval;
	}
}

static int _sde_connector_update_dirty_properties(
				struct drm_connector *connector)
{
@@ -558,7 +578,6 @@ static int _sde_connector_update_dirty_properties(

	c_conn = to_sde_connector(connector);
	c_state = to_sde_connector_state(connector->state);
	c_conn->qsync_updated = false;

	while ((idx = msm_property_pop_dirty(&c_conn->property_info,
					&c_state->property_state)) >= 0) {
@@ -574,11 +593,6 @@ static int _sde_connector_update_dirty_properties(
		case CONNECTOR_PROP_AD_BL_SCALE:
			_sde_connector_update_bl_scale(c_conn);
			break;
		case CONNECTOR_PROP_QSYNC_MODE:
			c_conn->qsync_updated = true;
			c_conn->qsync_mode = sde_connector_get_property(
				connector->state, CONNECTOR_PROP_QSYNC_MODE);
			break;
		default:
			/* nothing to do for most properties */
			break;
@@ -2238,15 +2252,12 @@ struct drm_connector *sde_connector_init(struct drm_device *dev,
			0x0, 0, AUTOREFRESH_MAX_FRAME_CNT, 0,
			CONNECTOR_PROP_AUTOREFRESH);

	if (connector_type == DRM_MODE_CONNECTOR_DSI) {
		if (sde_kms->catalog->has_qsync && display_info.qsync_min_fps) {

			msm_property_install_enum(&c_conn->property_info,
					"qsync_mode", 0, 0, e_qsync_mode,
					ARRAY_SIZE(e_qsync_mode),
	if (connector_type == DRM_MODE_CONNECTOR_DSI &&
			sde_kms->catalog->has_qsync &&
			display_info.qsync_min_fps)
		msm_property_install_enum(&c_conn->property_info, "qsync_mode",
				0, 0, e_qsync_mode, ARRAY_SIZE(e_qsync_mode),
				CONNECTOR_PROP_QSYNC_MODE);
		}
	}

	msm_property_install_range(&c_conn->property_info, "bl_scale",
		0x0, 0, MAX_BL_SCALE_LEVEL, MAX_BL_SCALE_LEVEL,
+24 −4
Original line number Diff line number Diff line
@@ -373,7 +373,7 @@ struct sde_connector_evt {
 * @bl_scale_dirty: Flag to indicate PP BL scale value(s) is changed
 * @bl_scale: BL scale value for ABA feature
 * @bl_scale_ad: BL scale value for AD feature
 * @qsync_mode: Qsync mode, where 0: disabled 1: continuous mode
 * @qsync_mode: Cached Qsync mode, 0=disabled, 1=continuous mode
 * @qsync_updated: Qsync settings were updated
 * last_cmd_tx_sts: status of the last command transfer
 */
@@ -459,13 +459,22 @@ struct sde_connector {
	((C) ? to_sde_connector((C))->encoder : NULL)

/**
 * sde_connector_qsync_updated - indicates if connector updated qsync
 * sde_connector_is_qsync_updated - indicates if qsync mode changed on this
 *                                  connector for the current frame update.
 * @C: Pointer to drm connector structure
 * Returns: True if qsync is updated; false otherwise
 * Returns: True if qsync mode is updated; false otherwise
 */
#define sde_connector_qsync_updated(C) \
#define sde_connector_is_qsync_updated(C) \
	((C) ? to_sde_connector((C))->qsync_updated : 0)

/**
 * sde_connector_get_qsync_mode - get sde connector's qsync_mode
 * @C: Pointer to drm connector structure
 * Returns: Current cached qsync_mode for given connector
 */
#define sde_connector_get_qsync_mode(C) \
	((C) ? to_sde_connector((C))->qsync_mode : 0)

/**
 * sde_connector_get_propinfo - get sde connector's property info pointer
 * @C: Pointer to drm connector structure
@@ -679,6 +688,17 @@ int sde_connector_clk_ctrl(struct drm_connector *connector, bool enable);
 */
int sde_connector_get_dpms(struct drm_connector *connector);

/**
 * sde_connector_set_qsync_params - set status of qsync_updated for current
 *                                  frame and update the cached qsync_mode
 * @connector: pointer to drm connector
 *
 * This must be called after the connector set_property values are applied,
 * and before sde_connector's qsync_updated or qsync_mode fields are accessed.
 * It must only be called once per frame update for the given connector.
 */
void sde_connector_set_qsync_params(struct drm_connector *connector);

/**
 * sde_connector_trigger_event - indicate that an event has occurred
 *	Any callbacks that have been registered against this event will
+11 −14
Original line number Diff line number Diff line
@@ -1773,8 +1773,7 @@ static int _sde_encoder_update_rsc_client(
	struct drm_crtc *primary_crtc;
	int pipe = -1;
	int rc = 0;
	int wait_refcount, i;
	struct sde_encoder_phys *phys;
	int wait_refcount;
	u32 qsync_mode = 0;

	if (!drm_enc || !drm_enc->dev) {
@@ -1809,16 +1808,9 @@ static int _sde_encoder_update_rsc_client(
	 * secondary command mode panel.
	 * Clone mode encoder can request CLK STATE only.
	 */
	for (i = 0; i < sde_enc->num_phys_encs; i++) {
		phys = sde_enc->phys_encs[i];

		if (phys) {
			qsync_mode = sde_connector_get_property(
					phys->connector->state,
					CONNECTOR_PROP_QSYNC_MODE);
			break;
		}
	}
	if (sde_enc->cur_master)
		qsync_mode = sde_connector_get_qsync_mode(
				sde_enc->cur_master->connector);

	if (sde_encoder_in_clone_mode(drm_enc))
		rsc_state = enable ? SDE_RSC_CLK_STATE : SDE_RSC_IDLE_STATE;
@@ -4369,6 +4361,11 @@ int sde_encoder_prepare_for_kickoff(struct drm_encoder *drm_enc,
	else
		ln_cnt1 = -EINVAL;

	/* update the qsync parameters for the current frame */
	if (sde_enc->cur_master)
		sde_connector_set_qsync_params(
				sde_enc->cur_master->connector);

	/* prepare for next kickoff, may include waiting on previous kickoff */
	SDE_ATRACE_BEGIN("sde_encoder_prepare_for_kickoff");
	for (i = 0; i < sde_enc->num_phys_encs; i++) {
@@ -4385,8 +4382,8 @@ int sde_encoder_prepare_for_kickoff(struct drm_encoder *drm_enc,
				needs_hw_reset = true;
			_sde_encoder_setup_dither(phys);

			/* flush the mixer if qsync is enabled */
			if (sde_enc->cur_master && sde_connector_qsync_updated(
			if (sde_enc->cur_master &&
					sde_connector_is_qsync_updated(
					sde_enc->cur_master->connector)) {
				_helper_flush_qsync(phys);
			}
+2 −3
Original line number Diff line number Diff line
@@ -909,8 +909,7 @@ static int _get_tearcheck_threshold(struct sde_encoder_phys *phys_enc)
		return 0;

	mode = &phys_enc->cached_mode;
	qsync_mode = sde_connector_get_property(
			conn->state, CONNECTOR_PROP_QSYNC_MODE);
	qsync_mode = sde_connector_get_qsync_mode(conn);

	if (mode && (qsync_mode == SDE_RM_QSYNC_CONTINUOUS_MODE)) {
		u32 qsync_min_fps = 0;
@@ -1360,7 +1359,7 @@ static int sde_encoder_phys_cmd_prepare_for_kickoff(
		SDE_ERROR("failed wait_for_idle: %d\n", ret);
	}

	if (sde_connector_qsync_updated(phys_enc->connector)) {
	if (sde_connector_is_qsync_updated(phys_enc->connector)) {
		tc_cfg.sync_threshold_start =
			_get_tearcheck_threshold(phys_enc);
		if (phys_enc->has_intf_te &&
+4 −7
Original line number Diff line number Diff line
@@ -410,9 +410,8 @@ static void _sde_encoder_phys_vid_avr_ctrl(struct sde_encoder_phys *phys_enc)
	struct sde_encoder_phys_vid *vid_enc =
			to_sde_encoder_phys_vid(phys_enc);

	avr_params.avr_mode = sde_connector_get_property(
			phys_enc->connector->state,
			CONNECTOR_PROP_QSYNC_MODE);
	avr_params.avr_mode = sde_connector_get_qsync_mode(
			phys_enc->connector);

	if (vid_enc->base.hw_intf->ops.avr_ctrl) {
		vid_enc->base.hw_intf->ops.avr_ctrl(
@@ -1041,7 +1040,7 @@ static int sde_encoder_phys_vid_prepare_for_kickoff(
		vid_enc->error_count = 0;
	}

	if (sde_connector_qsync_updated(phys_enc->connector))
	if (sde_connector_is_qsync_updated(phys_enc->connector))
		_sde_encoder_phys_vid_avr_ctrl(phys_enc);

	programmable_rot_fetch_config(phys_enc,
@@ -1158,9 +1157,7 @@ static void sde_encoder_phys_vid_handle_post_kickoff(
		phys_enc->enable_state = SDE_ENC_ENABLED;
	}

	avr_mode = sde_connector_get_property(
			phys_enc->connector->state,
			CONNECTOR_PROP_QSYNC_MODE);
	avr_mode = sde_connector_get_qsync_mode(phys_enc->connector);

	if (avr_mode && vid_enc->base.hw_intf->ops.avr_trigger) {
		vid_enc->base.hw_intf->ops.avr_trigger(vid_enc->base.hw_intf);