diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3759-drm-amd-display-Implement-stats-logging.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3759-drm-amd-display-Implement-stats-logging.patch | 727 |
1 files changed, 727 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3759-drm-amd-display-Implement-stats-logging.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3759-drm-amd-display-Implement-stats-logging.patch new file mode 100644 index 00000000..a4a6b75f --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3759-drm-amd-display-Implement-stats-logging.patch @@ -0,0 +1,727 @@ +From 477ec60c0fa08e1f2ceac993bb899b6ed6edb75a Mon Sep 17 00:00:00 2001 +From: Anthony Koo <Anthony.Koo@amd.com> +Date: Thu, 22 Feb 2018 09:50:25 -0500 +Subject: [PATCH 3759/4131] drm/amd/display: Implement stats logging + +Stats will be used for debug purposes + +Signed-off-by: Anthony Koo <Anthony.Koo@amd.com> +Reviewed-by: Tony Cheng <Tony.Cheng@amd.com> +Acked-by: Harry Wentland <harry.wentland@amd.com> +--- + drivers/gpu/drm/amd/display/dc/basics/logger.c | 3 +- + drivers/gpu/drm/amd/display/include/logger_types.h | 1 + + .../drm/amd/display/modules/freesync/freesync.c | 129 ++++++-- + .../gpu/drm/amd/display/modules/inc/mod_freesync.h | 9 + + .../gpu/drm/amd/display/modules/inc/mod_stats.h | 65 ++++ + drivers/gpu/drm/amd/display/modules/stats/stats.c | 334 +++++++++++++++++++++ + 6 files changed, 510 insertions(+), 31 deletions(-) + create mode 100644 drivers/gpu/drm/amd/display/modules/inc/mod_stats.h + create mode 100644 drivers/gpu/drm/amd/display/modules/stats/stats.c + +diff --git a/drivers/gpu/drm/amd/display/dc/basics/logger.c b/drivers/gpu/drm/amd/display/dc/basics/logger.c +index 180a9d6..31bee05 100644 +--- a/drivers/gpu/drm/amd/display/dc/basics/logger.c ++++ b/drivers/gpu/drm/amd/display/dc/basics/logger.c +@@ -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"} + }; + + +diff --git a/drivers/gpu/drm/amd/display/include/logger_types.h b/drivers/gpu/drm/amd/display/include/logger_types.h +index b727f5e..427796b 100644 +--- a/drivers/gpu/drm/amd/display/include/logger_types.h ++++ b/drivers/gpu/drm/amd/display/include/logger_types.h +@@ -98,6 +98,7 @@ enum dc_log_type { + LOG_EVENT_UNDERFLOW, + LOG_IF_TRACE, + LOG_PERF_TRACE, ++ LOG_PROFILING, + + LOG_SECTION_TOTAL_COUNT + }; +diff --git a/drivers/gpu/drm/amd/display/modules/freesync/freesync.c b/drivers/gpu/drm/amd/display/modules/freesync/freesync.c +index b4723af..e849b70 100644 +--- a/drivers/gpu/drm/amd/display/modules/freesync/freesync.c ++++ b/drivers/gpu/drm/amd/display/modules/freesync/freesync.c +@@ -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)\ +@@ -146,7 +152,7 @@ struct mod_freesync *mod_freesync_create(struct dc *dc) + goto fail_alloc_context; + + core_freesync->map = kzalloc(sizeof(struct freesync_entity) * MOD_FREESYNC_MAX_CONCURRENT_STREAMS, +- GFP_KERNEL); ++ GFP_KERNEL); + + if (core_freesync->map == NULL) + goto fail_alloc_map; +@@ -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,9 +613,10 @@ 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, +- v_total_max); ++ 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,9 +659,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, +- 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); +@@ -650,9 +678,10 @@ 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, +- 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,9 +834,10 @@ 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, +- v_total); ++ adjust_vmin_vmax(core_freesync, streams, ++ num_streams, index, ++ v_total, ++ v_total); + + triggers.overlay_update = true; + triggers.surface_update = true; +@@ -1063,9 +1094,9 @@ 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, +- state->freesync_range.vmin, +- state->freesync_range.vmax); ++ adjust_vmin_vmax(core_freesync, &streams, 1, index, ++ state->freesync_range.vmin, ++ state->freesync_range.vmax); + } + + if (min_refresh != 0 && +@@ -1399,11 +1430,9 @@ 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, +- 1, vmin, vmax); ++ 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; ++ } ++ ++ } ++} ++ +diff --git a/drivers/gpu/drm/amd/display/modules/inc/mod_freesync.h b/drivers/gpu/drm/amd/display/modules/inc/mod_freesync.h +index 84b5342..f083e16 100644 +--- a/drivers/gpu/drm/amd/display/modules/inc/mod_freesync.h ++++ b/drivers/gpu/drm/amd/display/modules/inc/mod_freesync.h +@@ -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 +diff --git a/drivers/gpu/drm/amd/display/modules/inc/mod_stats.h b/drivers/gpu/drm/amd/display/modules/inc/mod_stats.h +new file mode 100644 +index 0000000..3230e2a +--- /dev/null ++++ b/drivers/gpu/drm/amd/display/modules/inc/mod_stats.h +@@ -0,0 +1,65 @@ ++/* ++ * 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_ */ +diff --git a/drivers/gpu/drm/amd/display/modules/stats/stats.c b/drivers/gpu/drm/amd/display/modules/stats/stats.c +new file mode 100644 +index 0000000..041f87b +--- /dev/null ++++ b/drivers/gpu/drm/amd/display/modules/stats/stats.c +@@ -0,0 +1,334 @@ ++/* ++ * 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 ++ * ++ */ ++ ++#include "mod_stats.h" ++#include "dm_services.h" ++#include "dc.h" ++#include "core_types.h" ++ ++#define DAL_STATS_ENABLE_REGKEY "DalStatsEnable" ++#define DAL_STATS_ENABLE_REGKEY_DEFAULT 0x00000001 ++#define DAL_STATS_ENABLE_REGKEY_ENABLED 0x00000001 ++ ++#define DAL_STATS_ENTRIES_REGKEY "DalStatsEntries" ++#define DAL_STATS_ENTRIES_REGKEY_DEFAULT 0x00350000 ++#define DAL_STATS_ENTRIES_REGKEY_MAX 0x01000000 ++ ++#define MOD_STATS_NUM_VSYNCS 5 ++ ++struct stats_time_cache { ++ unsigned long flip_timestamp_in_ns; ++ unsigned long vupdate_timestamp_in_ns; ++ ++ unsigned int render_time_in_us; ++ unsigned int avg_render_time_in_us_last_ten; ++ unsigned int v_sync_time_in_us[MOD_STATS_NUM_VSYNCS]; ++ unsigned int num_vsync_between_flips; ++ ++ unsigned int flip_to_vsync_time_in_us; ++ unsigned int vsync_to_flip_time_in_us; ++ ++ unsigned int min_window; ++ unsigned int max_window; ++ unsigned int v_total_min; ++ unsigned int v_total_max; ++ unsigned int event_triggers; ++ ++ unsigned int lfc_mid_point_in_us; ++ unsigned int num_frames_inserted; ++ unsigned int inserted_duration_in_us; ++ ++ unsigned int flags; ++}; ++ ++struct core_stats { ++ struct mod_stats public; ++ struct dc *dc; ++ ++ struct stats_time_cache *time; ++ unsigned int index; ++ ++ bool enabled; ++ unsigned int entries; ++}; ++ ++#define MOD_STATS_TO_CORE(mod_stats)\ ++ container_of(mod_stats, struct core_stats, public) ++ ++bool mod_stats_init(struct mod_stats *mod_stats) ++{ ++ bool result = false; ++ struct core_stats *core_stats = NULL; ++ struct dc *dc = NULL; ++ ++ if (mod_stats == NULL) ++ return false; ++ ++ core_stats = MOD_STATS_TO_CORE(mod_stats); ++ dc = core_stats->dc; ++ ++ return result; ++} ++ ++struct mod_stats *mod_stats_create(struct dc *dc) ++{ ++ struct core_stats *core_stats = NULL; ++ struct persistent_data_flag flag; ++ unsigned int reg_data; ++ int i = 0; ++ ++ core_stats = kzalloc(sizeof(struct core_stats), GFP_KERNEL); ++ ++ if (core_stats == NULL) ++ goto fail_alloc_context; ++ ++ if (dc == NULL) ++ goto fail_construct; ++ ++ core_stats->dc = dc; ++ ++ core_stats->enabled = DAL_STATS_ENABLE_REGKEY_DEFAULT; ++ if (dm_read_persistent_data(dc->ctx, NULL, NULL, ++ DAL_STATS_ENABLE_REGKEY, ++ ®_data, sizeof(unsigned int), &flag)) ++ core_stats->enabled = reg_data; ++ ++ core_stats->entries = DAL_STATS_ENTRIES_REGKEY_DEFAULT; ++ if (dm_read_persistent_data(dc->ctx, NULL, NULL, ++ DAL_STATS_ENTRIES_REGKEY, ++ ®_data, sizeof(unsigned int), &flag)) { ++ if (reg_data > DAL_STATS_ENTRIES_REGKEY_MAX) ++ core_stats->entries = DAL_STATS_ENTRIES_REGKEY_MAX; ++ else ++ core_stats->entries = reg_data; ++ } ++ ++ core_stats->time = kzalloc(sizeof(struct stats_time_cache) * core_stats->entries, ++ GFP_KERNEL); ++ ++ if (core_stats->time == NULL) ++ goto fail_construct; ++ ++ /* Purposely leave index 0 unused so we don't need special logic to ++ * handle calculation cases that depend on previous flip data. ++ */ ++ core_stats->index = 1; ++ ++ return &core_stats->public; ++ ++fail_construct: ++ kfree(core_stats); ++ ++fail_alloc_context: ++ return NULL; ++} ++ ++void mod_stats_destroy(struct mod_stats *mod_stats) ++{ ++ if (mod_stats != NULL) { ++ struct core_stats *core_stats = MOD_STATS_TO_CORE(mod_stats); ++ ++ if (core_stats->time != NULL) ++ kfree(core_stats->time); ++ ++ kfree(core_stats); ++ } ++} ++ ++void mod_stats_dump(struct mod_stats *mod_stats) ++{ ++ struct dc *dc = NULL; ++ struct dal_logger *logger = NULL; ++ struct core_stats *core_stats = NULL; ++ struct stats_time_cache *time = NULL; ++ unsigned int index = 0; ++ ++ if (mod_stats == NULL) ++ return; ++ ++ core_stats = MOD_STATS_TO_CORE(mod_stats); ++ dc = core_stats->dc; ++ logger = dc->ctx->logger; ++ time = core_stats->time; ++ ++ //LogEntry* pLog = GetLog()->Open(LogMajor_ISR, LogMinor_ISR_FreeSyncSW); ++ ++ //if (!pLog->IsDummyEntry()) ++ { ++ dm_logger_write(logger, LOG_PROFILING, "==Display Caps==\n"); ++ dm_logger_write(logger, LOG_PROFILING, "\n"); ++ dm_logger_write(logger, LOG_PROFILING, "\n"); ++ ++ dm_logger_write(logger, LOG_PROFILING, "==Stats==\n"); ++ dm_logger_write(logger, LOG_PROFILING, ++ "render avgRender minWindow midPoint maxWindow vsyncToFlip flipToVsync #vsyncBetweenFlip #frame insertDuration vTotalMin vTotalMax eventTrigs vSyncTime1 vSyncTime2 vSyncTime3 vSyncTime4 vSyncTime5 flags\n"); ++ ++ for (int i = 0; i < core_stats->index && i < core_stats->entries; i++) { ++ dm_logger_write(logger, LOG_PROFILING, ++ "%u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u %u\n", ++ time[i].render_time_in_us, ++ time[i].avg_render_time_in_us_last_ten, ++ time[i].min_window, ++ time[i].lfc_mid_point_in_us, ++ time[i].max_window, ++ time[i].vsync_to_flip_time_in_us, ++ time[i].flip_to_vsync_time_in_us, ++ time[i].num_vsync_between_flips, ++ time[i].num_frames_inserted, ++ time[i].inserted_duration_in_us, ++ time[i].v_total_min, ++ time[i].v_total_max, ++ time[i].event_triggers, ++ time[i].v_sync_time_in_us[0], ++ time[i].v_sync_time_in_us[1], ++ time[i].v_sync_time_in_us[2], ++ time[i].v_sync_time_in_us[3], ++ time[i].v_sync_time_in_us[4], ++ time[i].flags); ++ } ++ } ++ //GetLog()->Close(pLog); ++ //GetLog()->UnSetLogMask(LogMajor_ISR, LogMinor_ISR_FreeSyncSW); ++} ++ ++void mod_stats_reset_data(struct mod_stats *mod_stats) ++{ ++ struct core_stats *core_stats = NULL; ++ struct stats_time_cache *time = NULL; ++ unsigned int index = 0; ++ ++ if (mod_stats == NULL) ++ return; ++ ++ core_stats = MOD_STATS_TO_CORE(mod_stats); ++ ++ memset(core_stats->time, 0, ++ sizeof(struct stats_time_cache) * core_stats->entries); ++ ++ core_stats->index = 0; ++} ++ ++void mod_stats_update_flip(struct mod_stats *mod_stats, ++ unsigned long timestamp_in_ns) ++{ ++ struct core_stats *core_stats = NULL; ++ struct stats_time_cache *time = NULL; ++ unsigned int index = 0; ++ ++ if (mod_stats == NULL) ++ return; ++ ++ core_stats = MOD_STATS_TO_CORE(mod_stats); ++ ++ if (core_stats->index >= core_stats->entries) ++ return; ++ ++ time = core_stats->time; ++ index = core_stats->index; ++ ++ time[index].flip_timestamp_in_ns = timestamp_in_ns; ++ time[index].render_time_in_us = ++ timestamp_in_ns - time[index - 1].flip_timestamp_in_ns; ++ ++ if (index >= 10) { ++ for (unsigned int i = 0; i < 10; i++) ++ time[index].avg_render_time_in_us_last_ten += ++ time[index - i].render_time_in_us; ++ time[index].avg_render_time_in_us_last_ten /= 10; ++ } ++ ++ if (time[index].num_vsync_between_flips > 0) ++ time[index].vsync_to_flip_time_in_us = ++ timestamp_in_ns - time[index].vupdate_timestamp_in_ns; ++ else ++ time[index].vsync_to_flip_time_in_us = ++ timestamp_in_ns - time[index - 1].vupdate_timestamp_in_ns; ++ ++ core_stats->index++; ++} ++ ++void mod_stats_update_vupdate(struct mod_stats *mod_stats, ++ unsigned long timestamp_in_ns) ++{ ++ struct core_stats *core_stats = NULL; ++ struct stats_time_cache *time = NULL; ++ unsigned int index = 0; ++ ++ if (mod_stats == NULL) ++ return; ++ ++ core_stats = MOD_STATS_TO_CORE(mod_stats); ++ ++ if (core_stats->index >= core_stats->entries) ++ return; ++ ++ time = core_stats->time; ++ index = core_stats->index; ++ ++ time[index].vupdate_timestamp_in_ns = timestamp_in_ns; ++ if (time[index].num_vsync_between_flips < MOD_STATS_NUM_VSYNCS) ++ time[index].v_sync_time_in_us[time[index].num_vsync_between_flips] = ++ timestamp_in_ns - time[index - 1].vupdate_timestamp_in_ns; ++ time[index].flip_to_vsync_time_in_us = ++ timestamp_in_ns - time[index - 1].flip_timestamp_in_ns; ++ ++ time[index].num_vsync_between_flips++; ++} ++ ++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_duration_in_us) ++{ ++ struct core_stats *core_stats = NULL; ++ struct stats_time_cache *time = NULL; ++ unsigned int index = 0; ++ ++ if (mod_stats == NULL) ++ return; ++ ++ core_stats = MOD_STATS_TO_CORE(mod_stats); ++ ++ if (core_stats->index >= core_stats->entries) ++ return; ++ ++ time = core_stats->time; ++ index = core_stats->index; ++ ++ time[index].v_total_min = v_total_min; ++ time[index].v_total_max = v_total_max; ++ time[index].event_triggers = event_triggers; ++ time[index].min_window = window_min; ++ time[index].max_window = window_max; ++ time[index].lfc_mid_point_in_us = lfc_mid_point_in_us; ++ time[index].num_frames_inserted = inserted_frames; ++ time[index].inserted_duration_in_us = inserted_duration_in_us; ++} ++ +-- +2.7.4 + |