Commit 5b5abe95 authored by Anthony Koo's avatar Anthony Koo Committed by Alex Deucher
Browse files

drm/amd/display: make PSR static screen entry within 30 ms



[Why]
With different refresh rate panels, the PSR entry/exit time is
different since it is dependent on 2 frame entry time today

[How]
Make static screen num frame entry time to be calculated
such that entry time is within 30 ms instead of fixed num
frames.

Signed-off-by: default avatarAnthony Koo <Anthony.Koo@amd.com>
Reviewed-by: default avatarTony Cheng <Tony.Cheng@amd.com>
Acked-by: default avatarAric Cyr <Aric.Cyr@amd.com>
Acked-by: default avatarHarry Wentland <harry.wentland@amd.com>
Acked-by: default avatarRodrigo Siqueira <Rodrigo.Siqueira@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 9a25e13b
Loading
Loading
Loading
Loading
+26 −6
Original line number Diff line number Diff line
@@ -8393,17 +8393,37 @@ static bool amdgpu_dm_link_setup_psr(struct dc_stream_state *stream)
bool amdgpu_dm_psr_enable(struct dc_stream_state *stream)
{
	struct dc_link *link = stream->link;
	struct dc_static_screen_events triggers = {0};
	unsigned int vsync_rate_hz = 0;
	struct dc_static_screen_params params = {0};
	/* Calculate number of static frames before generating interrupt to
	 * enter PSR.
	 */
	unsigned int frame_time_microsec = 1000000 / vsync_rate_hz;
	// Init fail safe of 2 frames static
	unsigned int num_frames_static = 2;

	DRM_DEBUG_DRIVER("Enabling psr...\n");

	triggers.cursor_update = true;
	triggers.overlay_update = true;
	triggers.surface_update = true;
	vsync_rate_hz = div64_u64(div64_u64((
			stream->timing.pix_clk_100hz * 100),
			stream->timing.v_total),
			stream->timing.h_total);

	/* Round up
	 * Calculate number of frames such that at least 30 ms of time has
	 * passed.
	 */
	if (vsync_rate_hz != 0)
		num_frames_static = (30000 / frame_time_microsec) + 1;

	params.triggers.cursor_update = true;
	params.triggers.overlay_update = true;
	params.triggers.surface_update = true;
	params.num_frames = num_frames_static;

	dc_stream_set_static_screen_events(link->ctx->dc,
	dc_stream_set_static_screen_params(link->ctx->dc,
					   &stream, 1,
					   &triggers);
					   &params);

	return dc_link_set_psr_allow_active(link, true, false);
}
+3 −3
Original line number Diff line number Diff line
@@ -510,10 +510,10 @@ bool dc_stream_program_csc_matrix(struct dc *dc, struct dc_stream_state *stream)
	return ret;
}

void dc_stream_set_static_screen_events(struct dc *dc,
void dc_stream_set_static_screen_params(struct dc *dc,
		struct dc_stream_state **streams,
		int num_streams,
		const struct dc_static_screen_events *events)
		const struct dc_static_screen_params *params)
{
	int i = 0;
	int j = 0;
@@ -532,7 +532,7 @@ void dc_stream_set_static_screen_events(struct dc *dc,
		}
	}

	dc->hwss.set_static_screen_control(pipes_affected, num_pipes_affected, events);
	dc->hwss.set_static_screen_control(pipes_affected, num_pipes_affected, params);
}

static void dc_destruct(struct dc *dc)
+1 −1
Original line number Diff line number Diff line
@@ -2542,7 +2542,7 @@ bool dc_link_setup_psr(struct dc_link *link,
		transmitter_to_phy_id(link->link_enc->transmitter);

	psr_context->crtcTimingVerticalTotal = stream->timing.v_total;
	psr_context->vsyncRateHz = div64_u64(div64_u64((stream->
	psr_context->vsync_rate_hz = div64_u64(div64_u64((stream->
					timing.pix_clk_100hz * 100),
					stream->timing.v_total),
					stream->timing.h_total);
+8 −5
Original line number Diff line number Diff line
@@ -157,11 +157,14 @@ struct dc_surface_dcc_cap {
	bool const_color_support;
};

struct dc_static_screen_events {
struct dc_static_screen_params {
	struct {
		bool force_trigger;
		bool cursor_update;
		bool surface_update;
		bool overlay_update;
	} triggers;
	unsigned int num_frames;
};


+2 −2
Original line number Diff line number Diff line
@@ -439,10 +439,10 @@ bool dc_stream_get_crc(struct dc *dc,
		       uint32_t *g_y,
		       uint32_t *b_cb);

void dc_stream_set_static_screen_events(struct dc *dc,
void dc_stream_set_static_screen_params(struct dc *dc,
					struct dc_stream_state **stream,
					int num_streams,
					const struct dc_static_screen_events *events);
					const struct dc_static_screen_params *params);

void dc_stream_set_dyn_expansion(struct dc *dc, struct dc_stream_state *stream,
		enum dc_dynamic_expansion option);
Loading