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

Commit 985ffddc authored by Jayaprakash's avatar Jayaprakash
Browse files

disp: msm: sde: add one-shot qsync mode support



Add support to enable one-shot mode during qsync
update. This feature ensures the frame drops can be
reduced due to delayed software flush for the
current commit. Also, add changes to disable the qsync
feature post commit.

Change-Id: Icb158853f52284bcf8fa641e5f62200c5460b660
Signed-off-by: default avatarKalyan Thota <kalyant@codeaurora.org>
Signed-off-by: default avatarJayaprakash <jmadiset@codeaurora.org>
parent ad40a300
Loading
Loading
Loading
Loading
+9 −1
Original line number Diff line number Diff line
@@ -915,7 +915,8 @@ void dsi_conn_enable_event(struct drm_connector *connector,
			event_idx, &event_info, enable);
}

int dsi_conn_post_kickoff(struct drm_connector *connector)
int dsi_conn_post_kickoff(struct drm_connector *connector,
	struct msm_display_kickoff_params *params)
{
	struct drm_encoder *encoder;
	struct dsi_bridge *c_bridge;
@@ -923,6 +924,7 @@ int dsi_conn_post_kickoff(struct drm_connector *connector)
	struct dsi_display *display;
	struct dsi_display_ctrl *m_ctrl, *ctrl;
	int i, rc = 0;
	bool enable;

	if (!connector || !connector->state) {
		DSI_ERR("invalid connector or connector state\n");
@@ -968,6 +970,12 @@ int dsi_conn_post_kickoff(struct drm_connector *connector)
	/* ensure dynamic clk switch flag is reset */
	c_bridge->dsi_mode.dsi_mode_flags &= ~DSI_MODE_FLAG_DYN_CLK;

	if (params->qsync_update) {
		enable = (params->qsync_mode > 0) ? true : false;
		display_for_each_ctrl(i, display)
			dsi_ctrl_setup_avr(display->ctrl[i].ctrl, enable);
	}

	return 0;
}

+3 −1
Original line number Diff line number Diff line
@@ -120,9 +120,11 @@ int dsi_conn_pre_kickoff(struct drm_connector *connector,
/**
 * dsi_display_post_kickoff - program post kickoff-time features
 * @connector: Pointer to drm connector structure
 * @params: Parameters for post kickoff programming
 * Returns: Zero on success
 */
int dsi_conn_post_kickoff(struct drm_connector *connector);
int dsi_conn_post_kickoff(struct drm_connector *connector,
		struct msm_display_kickoff_params *params);

/**
 * dsi_convert_to_drm_mode - Update drm mode with dsi mode information
+22 −0
Original line number Diff line number Diff line
@@ -58,6 +58,7 @@ static const struct drm_prop_enum_list e_power_mode[] = {
static const struct drm_prop_enum_list e_qsync_mode[] = {
	{SDE_RM_QSYNC_DISABLED,	"none"},
	{SDE_RM_QSYNC_CONTINUOUS_MODE,	"continuous"},
	{SDE_RM_QSYNC_ONE_SHOT_MODE,	"one_shot"},
};
static const struct drm_prop_enum_list e_frame_trigger_mode[] = {
	{FRAME_DONE_WAIT_DEFAULT, "default"},
@@ -646,6 +647,27 @@ void sde_connector_set_qsync_params(struct drm_connector *connector)
	}
}

void sde_connector_complete_qsync_commit(struct drm_connector *conn,
				struct msm_display_kickoff_params *params)
{
	struct sde_connector *c_conn;

	if (!conn || !params) {
		SDE_ERROR("invalid params\n");
		return;
	}

	c_conn = to_sde_connector(conn);

	if (c_conn && c_conn->qsync_updated &&
		(c_conn->qsync_mode == SDE_RM_QSYNC_ONE_SHOT_MODE)) {
		/* Reset qsync states if mode is one shot */
		params->qsync_mode = c_conn->qsync_mode = 0;
		params->qsync_update = true;
		SDE_EVT32(conn->base.id, c_conn->qsync_mode);
	}
}

static int _sde_connector_update_hdr_metadata(struct sde_connector *c_conn,
		struct sde_connector_state *c_state)
{
+14 −1
Original line number Diff line number Diff line
@@ -229,9 +229,12 @@ struct sde_connector_ops {
	/**
	 * post_kickoff - display to program post kickoff-time features
	 * @connector: Pointer to drm connector structure
	 * @params: Parameter bundle of connector-stored information for
	 *	post kickoff programming into the display
	 * Returns: Zero on success
	 */
	int (*post_kickoff)(struct drm_connector *connector);
	int (*post_kickoff)(struct drm_connector *connector,
		struct msm_display_kickoff_params *params);

	/**
	 * post_open - calls connector to process post open functionalities
@@ -732,6 +735,16 @@ int sde_connector_get_dpms(struct drm_connector *connector);
 */
void sde_connector_set_qsync_params(struct drm_connector *connector);

/**
 * sde_connector_complete_qsync_commit - callback signalling completion
 *			of qsync, if modified for the current commit
 * @conn   - Pointer to drm connector object
 * @params - Parameter bundle of connector-stored information for
 *	post kickoff programming into the display
 */
void sde_connector_complete_qsync_commit(struct drm_connector *conn,
			struct msm_display_kickoff_params *params);

/**
* sde_connector_get_dyn_hdr_meta - returns pointer to connector state's dynamic
*				   HDR metadata info
+2 −4
Original line number Diff line number Diff line
@@ -83,9 +83,6 @@
#define INTF_TEAR_AUTOREFRESH_CONFIG    0x2B4
#define INTF_TEAR_TEAR_DETECT_CTRL      0x2B8

#define AVR_CONTINUOUS_MODE   1
#define AVR_ONE_SHOT_MODE     2

static struct sde_intf_cfg *_intf_offset(enum sde_intf intf,
		struct sde_mdss_cfg *m,
		void __iomem *addr,
@@ -171,7 +168,8 @@ static void sde_hw_intf_avr_ctrl(struct sde_hw_intf *ctx,
	c = &ctx->hw;
	if (avr_params->avr_mode) {
		avr_ctrl = BIT(0);
		avr_mode = (avr_params->avr_mode == AVR_ONE_SHOT_MODE) ?
		avr_mode =
		(avr_params->avr_mode == SDE_RM_QSYNC_ONE_SHOT_MODE) ?
			(BIT(0) | BIT(8)) : 0x0;
	}

Loading