disp: msm: sde: add support to handle qsync-min-fps list property
Qsync min fps is same for all the fps in the dfps list in
the current implementation. Added support to parse
qcom,dsi-supported-qsync-min-fps-list where each value
is the qsync min fps corresponding to the mode in the
dfps list with same index.
Change-Id: I68b179f6eacbf9cc14c1bd90d71d5661c2255750
Signed-off-by: Krishna Manikandan <mkrishn@codeaurora.org>
diff --git a/msm/sde/sde_connector.h b/msm/sde/sde_connector.h
index 9389f13..cbc6bfa 100644
--- a/msm/sde/sde_connector.h
+++ b/msm/sde/sde_connector.h
@@ -1,6 +1,6 @@
/* SPDX-License-Identifier: GPL-2.0-only */
/*
- * Copyright (c) 2016-2019, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2016-2020, The Linux Foundation. All rights reserved.
*/
#ifndef _SDE_CONNECTOR_H_
@@ -338,6 +338,14 @@
*/
int (*prepare_commit)(void *display,
struct msm_display_conn_params *params);
+
+ /**
+ * get_qsync_min_fps - Get qsync min fps from qsync-min-fps-list
+ * @display: Pointer to private display structure
+ * @mode_fps: Fps value in dfps list
+ * Returns: Qsync min fps value on success
+ */
+ int (*get_qsync_min_fps)(void *display, u32 mode_fps);
};
/**
diff --git a/msm/sde/sde_encoder.c b/msm/sde/sde_encoder.c
index 32c983b..17243a5 100644
--- a/msm/sde/sde_encoder.c
+++ b/msm/sde/sde_encoder.c
@@ -3865,10 +3865,12 @@
static void sde_encoder_get_qsync_fps_callback(
struct drm_encoder *drm_enc,
- u32 *qsync_fps)
+ u32 *qsync_fps, u32 vrr_fps)
{
struct msm_display_info *disp_info;
struct sde_encoder_virt *sde_enc;
+ int rc = 0;
+ struct sde_connector *sde_conn;
if (!qsync_fps)
return;
@@ -3882,6 +3884,31 @@
sde_enc = to_sde_encoder_virt(drm_enc);
disp_info = &sde_enc->disp_info;
*qsync_fps = disp_info->qsync_min_fps;
+
+ /**
+ * If "dsi-supported-qsync-min-fps-list" is defined, get
+ * the qsync min fps corresponding to the fps in dfps list
+ */
+ if (disp_info->has_qsync_min_fps_list) {
+
+ if (!sde_enc->cur_master ||
+ !(sde_enc->disp_info.capabilities &
+ MSM_DISPLAY_CAP_VID_MODE)) {
+ SDE_ERROR("invalid qsync settings %b\n",
+ !sde_enc->cur_master);
+ return;
+ }
+ sde_conn = to_sde_connector(sde_enc->cur_master->connector);
+
+ if (sde_conn->ops.get_qsync_min_fps)
+ rc = sde_conn->ops.get_qsync_min_fps(sde_conn->display,
+ vrr_fps);
+ if (rc <= 0) {
+ SDE_ERROR("invalid qsync min fps %d\n", rc);
+ return;
+ }
+ *qsync_fps = rc;
+ }
}
int sde_encoder_idle_request(struct drm_encoder *drm_enc)
diff --git a/msm/sde/sde_encoder_phys.h b/msm/sde/sde_encoder_phys.h
index a7fa9bd..22355dc 100644
--- a/msm/sde/sde_encoder_phys.h
+++ b/msm/sde/sde_encoder_phys.h
@@ -82,7 +82,7 @@
void (*handle_frame_done)(struct drm_encoder *parent,
struct sde_encoder_phys *phys, u32 event);
void (*get_qsync_fps)(struct drm_encoder *parent,
- u32 *qsync_fps);
+ u32 *qsync_fps, u32 vrr_fps);
};
/**
diff --git a/msm/sde/sde_encoder_phys_cmd.c b/msm/sde/sde_encoder_phys_cmd.c
index 4f99a49..f9f3873 100644
--- a/msm/sde/sde_encoder_phys_cmd.c
+++ b/msm/sde/sde_encoder_phys_cmd.c
@@ -949,7 +949,7 @@
if (phys_enc->parent_ops.get_qsync_fps)
phys_enc->parent_ops.get_qsync_fps(
- phys_enc->parent, &qsync_min_fps);
+ phys_enc->parent, &qsync_min_fps, 0);
if (!qsync_min_fps || !default_fps || !yres) {
SDE_ERROR_CMDENC(cmd_enc,
diff --git a/msm/sde/sde_encoder_phys_vid.c b/msm/sde/sde_encoder_phys_vid.c
index 54faa7c..0744553 100644
--- a/msm/sde/sde_encoder_phys_vid.c
+++ b/msm/sde/sde_encoder_phys_vid.c
@@ -461,7 +461,7 @@
exit:
if (phys_enc->parent_ops.get_qsync_fps)
phys_enc->parent_ops.get_qsync_fps(
- phys_enc->parent, &qsync_min_fps);
+ phys_enc->parent, &qsync_min_fps, mode.vrefresh);
/* only panels which support qsync will have a non-zero min fps */
if (qsync_min_fps) {
diff --git a/msm/sde/sde_kms.c b/msm/sde/sde_kms.c
index 050ba34..25a869f 100644
--- a/msm/sde/sde_kms.c
+++ b/msm/sde/sde_kms.c
@@ -1430,6 +1430,7 @@
.cont_splash_config = dsi_display_cont_splash_config,
.get_panel_vfp = dsi_display_get_panel_vfp,
.get_default_lms = dsi_display_get_default_lms,
+ .get_qsync_min_fps = dsi_display_get_qsync_min_fps,
};
static const struct sde_connector_ops wb_ops = {
.post_init = sde_wb_connector_post_init,