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

drm/amd/display: Implement stats logging



Stats will be used for debug purposes

Signed-off-by: default avatarAnthony Koo <Anthony.Koo@amd.com>
Reviewed-by: default avatarTony Cheng <Tony.Cheng@amd.com>
Acked-by: default avatarHarry Wentland <harry.wentland@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent e18d3086
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -60,7 +60,8 @@ static const struct dc_log_type_info log_type_info_tbl[] = {
		{LOG_EVENT_LINK_LOSS,       "LinkLoss"},
		{LOG_EVENT_UNDERFLOW,       "Underflow"},
		{LOG_IF_TRACE,              "InterfaceTrace"},
		{LOG_DTN,                   "DTN"}
		{LOG_DTN,                   "DTN"},
		{LOG_PROFILING,             "Profiling"}
};


+1 −0
Original line number Diff line number Diff line
@@ -98,6 +98,7 @@ enum dc_log_type {
	LOG_EVENT_UNDERFLOW,
	LOG_IF_TRACE,
	LOG_PERF_TRACE,
	LOG_PROFILING,

	LOG_SECTION_TOTAL_COUNT
};
+99 −30
Original line number Diff line number Diff line
@@ -33,7 +33,7 @@
/* Refresh rate ramp at a fixed rate of 65 Hz/second */
#define STATIC_SCREEN_RAMP_DELTA_REFRESH_RATE_PER_FRAME ((1000 / 60) * 65)
/* Number of elements in the render times cache array */
#define RENDER_TIMES_MAX_COUNT 20
#define RENDER_TIMES_MAX_COUNT 10
/* Threshold to exit BTR (to avoid frequent enter-exits at the lower limit) */
#define BTR_EXIT_MARGIN 2000
/* Number of consecutive frames to check before entering/exiting fixed refresh*/
@@ -52,7 +52,7 @@ struct gradual_static_ramp {
	unsigned int ramp_current_frame_duration_in_ns;
};

struct time_cache {
struct freesync_time {
	/* video (48Hz feature) related */
	unsigned int update_duration_in_ns;

@@ -64,6 +64,9 @@ struct time_cache {

	unsigned int render_times_index;
	unsigned int render_times[RENDER_TIMES_MAX_COUNT];

	unsigned int min_window;
	unsigned int max_window;
};

struct below_the_range {
@@ -98,11 +101,14 @@ struct freesync_state {
	bool static_screen;
	bool video;

	unsigned int vmin;
	unsigned int vmax;

	struct freesync_time time;

	unsigned int nominal_refresh_rate_in_micro_hz;
	bool windowed_fullscreen;

	struct time_cache time;

	struct gradual_static_ramp static_ramp;
	struct below_the_range btr;
	struct fixed_refresh fixed_refresh;
@@ -124,9 +130,9 @@ struct freesync_registry_options {
struct core_freesync {
	struct mod_freesync public;
	struct dc *dc;
	struct freesync_registry_options opts;
	struct freesync_entity *map;
	int num_entities;
	struct freesync_registry_options opts;
};

#define MOD_FREESYNC_TO_CORE(mod_freesync)\
@@ -330,6 +336,25 @@ bool mod_freesync_remove_stream(struct mod_freesync *mod_freesync,
	return true;
}

static void adjust_vmin_vmax(struct core_freesync *core_freesync,
				struct dc_stream_state **streams,
				int num_streams,
				int map_index,
				unsigned int v_total_min,
				unsigned int v_total_max)
{
	if (num_streams == 0 || streams == NULL || num_streams > 1)
		return;

	core_freesync->map[map_index].state.vmin = v_total_min;
	core_freesync->map[map_index].state.vmax = v_total_max;

	dc_stream_adjust_vmin_vmax(core_freesync->dc, streams,
				num_streams, v_total_min,
				v_total_max);
}


static void update_stream_freesync_context(struct core_freesync *core_freesync,
		struct dc_stream_state *stream)
{
@@ -588,8 +613,9 @@ static bool set_freesync_on_streams(struct core_freesync *core_freesync,
				update_stream_freesync_context(core_freesync,
						streams[stream_idx]);

				dc_stream_adjust_vmin_vmax(core_freesync->dc, streams,
							   num_streams, v_total_min,
				adjust_vmin_vmax(core_freesync, streams,
						num_streams, map_index,
						v_total_min,
						v_total_max);

				return true;
@@ -613,9 +639,10 @@ static bool set_freesync_on_streams(struct core_freesync *core_freesync,
						core_freesync,
						streams[stream_idx]);

					dc_stream_adjust_vmin_vmax(
						core_freesync->dc, streams,
						num_streams, v_total_nominal,
					adjust_vmin_vmax(
						core_freesync, streams,
						num_streams, map_index,
						v_total_nominal,
						v_total_nominal);
				}
				return true;
@@ -632,8 +659,9 @@ static bool set_freesync_on_streams(struct core_freesync *core_freesync,
					core_freesync,
					streams[stream_idx]);

				dc_stream_adjust_vmin_vmax(core_freesync->dc, streams,
							   num_streams, v_total_nominal,
				adjust_vmin_vmax(core_freesync, streams,
						num_streams, map_index,
						v_total_nominal,
						v_total_nominal);

				/* Reset the cached variables */
@@ -650,8 +678,9 @@ static bool set_freesync_on_streams(struct core_freesync *core_freesync,
			 * not support freesync because a former stream has
			 * be programmed
			 */
			dc_stream_adjust_vmin_vmax(core_freesync->dc, streams,
						   num_streams, v_total_nominal,
			adjust_vmin_vmax(core_freesync, streams,
						num_streams, map_index,
						v_total_nominal,
						v_total_nominal);
			/* Reset the cached variables */
			reset_freesync_state_variables(state);
@@ -769,8 +798,9 @@ void mod_freesync_handle_v_update(struct mod_freesync *mod_freesync,
			vmin = inserted_frame_v_total;

			/* Program V_TOTAL */
			dc_stream_adjust_vmin_vmax(core_freesync->dc, streams,
						   num_streams, vmin, vmax);
			adjust_vmin_vmax(core_freesync, streams,
						num_streams, index,
						vmin, vmax);
		}

		if (state->btr.frame_counter > 0)
@@ -804,8 +834,9 @@ void mod_freesync_handle_v_update(struct mod_freesync *mod_freesync,
		update_stream_freesync_context(core_freesync, streams[0]);

		/* Program static screen ramp values */
		dc_stream_adjust_vmin_vmax(core_freesync->dc, streams,
					   num_streams, v_total,
		adjust_vmin_vmax(core_freesync, streams,
					num_streams, index,
					v_total,
					v_total);

		triggers.overlay_update = true;
@@ -1063,7 +1094,7 @@ bool mod_freesync_override_min_max(struct mod_freesync *mod_freesync,
				max_refresh);

		/* Program vtotal min/max */
		dc_stream_adjust_vmin_vmax(core_freesync->dc, &streams, 1,
		adjust_vmin_vmax(core_freesync, &streams, 1, index,
				state->freesync_range.vmin,
				state->freesync_range.vmax);
	}
@@ -1399,10 +1430,8 @@ static void apply_fixed_refresh(struct core_freesync *core_freesync,
	} else {

		vmin = state->freesync_range.vmin;

		vmax = vmin;

		dc_stream_adjust_vmin_vmax(core_freesync->dc, &stream,
		adjust_vmin_vmax(core_freesync, &stream, map_index,
					1, vmin, vmax);
	}
}
@@ -1457,3 +1486,43 @@ void mod_freesync_pre_update_plane_addresses(struct mod_freesync *mod_freesync,

	}
}

void mod_freesync_get_settings(struct mod_freesync *mod_freesync,
		struct dc_stream_state **streams, int num_streams,
		unsigned int *v_total_min, unsigned int *v_total_max,
		unsigned int *event_triggers,
		unsigned int *window_min, unsigned int *window_max,
		unsigned int *lfc_mid_point_in_us,
		unsigned int *inserted_frames,
		unsigned int *inserted_duration_in_us)
{
	unsigned int stream_index, map_index;
	struct core_freesync *core_freesync = NULL;

	if (mod_freesync == NULL)
		return;

	core_freesync = MOD_FREESYNC_TO_CORE(mod_freesync);

	for (stream_index = 0; stream_index < num_streams; stream_index++) {

		map_index = map_index_from_stream(core_freesync,
						streams[stream_index]);

		if (core_freesync->map[map_index].caps->supported) {
			struct freesync_state state =
					core_freesync->map[map_index].state;
			*v_total_min = state.vmin;
			*v_total_max = state.vmax;
			*event_triggers = 0;
			*window_min = state.time.min_window;
			*window_max = state.time.max_window;
			*lfc_mid_point_in_us = state.btr.mid_point_in_us;
			*inserted_frames = state.btr.frames_to_insert;
			*inserted_duration_in_us =
					state.btr.inserted_frame_duration_in_us;
		}

	}
}
+9 −0
Original line number Diff line number Diff line
@@ -164,4 +164,13 @@ void mod_freesync_pre_update_plane_addresses(struct mod_freesync *mod_freesync,
		struct dc_stream_state **streams, int num_streams,
		unsigned int curr_time_stamp);

void mod_freesync_get_settings(struct mod_freesync *mod_freesync,
		struct dc_stream_state **streams, int num_streams,
		unsigned int *v_total_min, unsigned int *v_total_max,
		unsigned int *event_triggers,
		unsigned int *window_min, unsigned int *window_max,
		unsigned int *lfc_mid_point_in_us,
		unsigned int *inserted_frames,
		unsigned int *inserted_duration_in_us);

#endif
+65 −0
Original line number Diff line number Diff line
/*
 * Copyright 2016 Advanced Micro Devices, Inc.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 * OTHER DEALINGS IN THE SOFTWARE.
 *
 * Authors: AMD
 *
 */

#ifndef MODULES_INC_MOD_STATS_H_
#define MODULES_INC_MOD_STATS_H_

#include "dm_services.h"

struct mod_stats {
	int dummy;
};

struct mod_stats_caps {
	bool dummy;
};

struct mod_stats *mod_stats_create(struct dc *dc);

void mod_stats_destroy(struct mod_stats *mod_stats);

bool mod_stats_init(struct mod_stats *mod_stats);

void mod_stats_dump(struct mod_stats *mod_stats);

void mod_stats_reset_data(struct mod_stats *mod_stats);

void mod_stats_update_flip(struct mod_stats *mod_stats,
		unsigned long timestamp_in_ns);

void mod_stats_update_vupdate(struct mod_stats *mod_stats,
		unsigned long timestamp_in_ns);

void mod_stats_update_freesync(struct mod_stats *mod_stats,
		unsigned int v_total_min,
		unsigned int v_total_max,
		unsigned int event_triggers,
		unsigned int window_min,
		unsigned int window_max,
		unsigned int lfc_mid_point_in_us,
		unsigned int inserted_frames,
		unsigned int inserted_frame_duration_in_us);

#endif /* MODULES_INC_MOD_STATS_H_ */
Loading