Blob Blame History Raw
From: Amy Zhang <Amy.Zhang@amd.com>
Date: Wed, 28 Jun 2017 18:14:09 -0400
Subject: drm/amd/display: Re-enable Vsync Interrupts for Gradual Refresh Ramp
Git-commit: 1a87fbfee0a0f96e8b482c2ac7eae113c9ca2497
Patch-mainline: v4.15-rc1
References: FATE#326289 FATE#326079 FATE#326049 FATE#322398 FATE#326166

- Make sure Vsync interrupts are disabled in static screen case
  and enabled when not to save power
- Create no_static_for_external_dp debug option

Signed-off-by: Amy Zhang <Amy.Zhang@amd.com>
Reviewed-by: Anthony Koo <Anthony.Koo@amd.com>
Acked-by: Harry Wentland <Harry.Wentland@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Acked-by: Petr Tesarik <ptesarik@suse.com>
---
 drivers/gpu/drm/amd/display/dc/dc.h                     |    1 
 drivers/gpu/drm/amd/display/modules/freesync/freesync.c |   38 +++++++++++-----
 drivers/gpu/drm/amd/display/modules/inc/mod_freesync.h  |    5 ++
 3 files changed, 34 insertions(+), 10 deletions(-)

--- a/drivers/gpu/drm/amd/display/dc/dc.h
+++ b/drivers/gpu/drm/amd/display/dc/dc.h
@@ -188,6 +188,7 @@ struct dc_debug {
 	bool disable_dmcu;
 	bool disable_psr;
 	bool force_abm_enable;
+	bool no_static_for_external_dp;
 };
 
 struct dc {
--- a/drivers/gpu/drm/amd/display/modules/freesync/freesync.c
+++ b/drivers/gpu/drm/amd/display/modules/freesync/freesync.c
@@ -440,14 +440,11 @@ static void calc_freesync_range(struct c
 	}
 
 	/* Determine whether BTR can be supported */
-	//if (max_frame_duration_in_ns >=
-	//		2 * min_frame_duration_in_ns)
-	//	core_freesync->map[index].caps->btr_supported = true;
-	//else
-	//	core_freesync->map[index].caps->btr_supported = false;
-
-	/* Temp, keep btr disabled */
-	core_freesync->map[index].caps->btr_supported = false;
+	if (max_frame_duration_in_ns >=
+			2 * min_frame_duration_in_ns)
+		core_freesync->map[index].caps->btr_supported = true;
+	else
+		core_freesync->map[index].caps->btr_supported = false;
 
 	/* Cache the time variables */
 	state->time.max_render_time_in_us =
@@ -882,8 +879,10 @@ void mod_freesync_update_state(struct mo
 			 * panels. Also change core variables only if there
 			 * is a change.
 			 */
-			if (dc_is_embedded_signal(
-				streams[stream_index]->sink->sink_signal) &&
+			if ((dc_is_embedded_signal(
+				streams[stream_index]->sink->sink_signal) ||
+				core_freesync->map[map_index].caps->
+				no_static_for_external_dp == false) &&
 				state->static_screen !=
 				freesync_params->enable) {
 
@@ -1034,6 +1033,25 @@ bool mod_freesync_get_user_enable(struct
 
 	return true;
 }
+
+bool mod_freesync_get_static_ramp_active(struct mod_freesync *mod_freesync,
+		const struct dc_stream *stream,
+		bool *is_ramp_active)
+{
+	unsigned int index = 0;
+	struct core_freesync *core_freesync = NULL;
+
+	if (mod_freesync == NULL)
+		return false;
+
+	core_freesync = MOD_FREESYNC_TO_CORE(mod_freesync);
+	index = map_index_from_stream(core_freesync, stream);
+
+	*is_ramp_active =
+		core_freesync->map[index].state.static_ramp.ramp_is_active;
+
+	return true;
+}
 
 bool mod_freesync_override_min_max(struct mod_freesync *mod_freesync,
 		const struct dc_stream *streams,
--- a/drivers/gpu/drm/amd/display/modules/inc/mod_freesync.h
+++ b/drivers/gpu/drm/amd/display/modules/inc/mod_freesync.h
@@ -88,6 +88,7 @@ struct mod_freesync_caps {
 	unsigned int max_refresh_in_micro_hz;
 
 	bool btr_supported;
+	bool no_static_for_external_dp;
 };
 
 struct mod_freesync_params {
@@ -129,6 +130,10 @@ bool mod_freesync_get_user_enable(struct
 		const struct dc_stream *stream,
 		struct mod_freesync_user_enable *user_enable);
 
+bool mod_freesync_get_static_ramp_active(struct mod_freesync *mod_freesync,
+		const struct dc_stream *stream,
+		bool *is_ramp_active);
+
 bool mod_freesync_override_min_max(struct mod_freesync *mod_freesync,
 		const struct dc_stream *streams,
 		unsigned int min_refresh,