From 985ffddc71a8a01c37ddeedb470599c0402908f6 Mon Sep 17 00:00:00 2001 From: Jayaprakash Date: Thu, 26 Sep 2019 11:55:26 +0530 Subject: [PATCH] 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: Kalyan Thota Signed-off-by: Jayaprakash --- msm/dsi/dsi_drm.c | 10 +++++++++- msm/dsi/dsi_drm.h | 4 +++- msm/sde/sde_connector.c | 22 ++++++++++++++++++++++ msm/sde/sde_connector.h | 15 ++++++++++++++- msm/sde/sde_hw_intf.c | 6 ++---- msm/sde/sde_kms.c | 11 ++++++++++- msm/sde/sde_rm.h | 3 +++ 7 files changed, 63 insertions(+), 8 deletions(-) diff --git a/msm/dsi/dsi_drm.c b/msm/dsi/dsi_drm.c index 4bcdef3866..9fc723f522 100644 --- a/msm/dsi/dsi_drm.c +++ b/msm/dsi/dsi_drm.c @@ -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; } diff --git a/msm/dsi/dsi_drm.h b/msm/dsi/dsi_drm.h index 8e3386d56d..559635e87b 100644 --- a/msm/dsi/dsi_drm.h +++ b/msm/dsi/dsi_drm.h @@ -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 diff --git a/msm/sde/sde_connector.c b/msm/sde/sde_connector.c index 1375a4eb2c..5016e42f56 100644 --- a/msm/sde/sde_connector.c +++ b/msm/sde/sde_connector.c @@ -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) { diff --git a/msm/sde/sde_connector.h b/msm/sde/sde_connector.h index 117cc236eb..23c9e8a558 100644 --- a/msm/sde/sde_connector.h +++ b/msm/sde/sde_connector.h @@ -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 diff --git a/msm/sde/sde_hw_intf.c b/msm/sde/sde_hw_intf.c index 8d23b4638b..a7a68189ac 100644 --- a/msm/sde/sde_hw_intf.c +++ b/msm/sde/sde_hw_intf.c @@ -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; } diff --git a/msm/sde/sde_kms.c b/msm/sde/sde_kms.c index 2797a0be4f..8220dda6cf 100644 --- a/msm/sde/sde_kms.c +++ b/msm/sde/sde_kms.c @@ -46,6 +46,7 @@ #include "sde_plane.h" #include "sde_crtc.h" #include "sde_reg_dma.h" +#include "sde_connector.h" #include #include "soc/qcom/secure_buffer.h" @@ -948,6 +949,7 @@ static void sde_kms_complete_commit(struct msm_kms *kms, struct drm_crtc_state *old_crtc_state; struct drm_connector *connector; struct drm_connector_state *old_conn_state; + struct msm_display_kickoff_params params; int i, rc = 0; if (!kms || !old_state) @@ -980,7 +982,14 @@ static void sde_kms_complete_commit(struct msm_kms *kms, c_conn = to_sde_connector(connector); if (!c_conn->ops.post_kickoff) continue; - rc = c_conn->ops.post_kickoff(connector); + + params.rois = NULL; + params.hdr_meta = NULL; + params.qsync_update = false; + + sde_connector_complete_qsync_commit(connector, ¶ms); + + rc = c_conn->ops.post_kickoff(connector, ¶ms); if (rc) { pr_err("Connector Post kickoff failed rc=%d\n", rc); diff --git a/msm/sde/sde_rm.h b/msm/sde/sde_rm.h index 68823b9e0d..ea5a0e6a30 100644 --- a/msm/sde/sde_rm.h +++ b/msm/sde/sde_rm.h @@ -67,10 +67,13 @@ enum sde_rm_topology_control { * disable state. * @SDE_RM_QSYNC_CONTINUOUS_MODE: If set, Qsync is enabled in continuous * mode. + * @SDE_RM_QSYNC_ONE_SHOT_MODE: If set, Qsync is enabled in one shot mode. + * */ enum sde_rm_qsync_modes { SDE_RM_QSYNC_DISABLED, SDE_RM_QSYNC_CONTINUOUS_MODE, + SDE_RM_QSYNC_ONE_SHOT_MODE }; /**