aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2563-drm-amd-display-add-performance-trace-macro-to-dc.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2563-drm-amd-display-add-performance-trace-macro-to-dc.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2563-drm-amd-display-add-performance-trace-macro-to-dc.patch586
1 files changed, 586 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2563-drm-amd-display-add-performance-trace-macro-to-dc.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2563-drm-amd-display-add-performance-trace-macro-to-dc.patch
new file mode 100644
index 00000000..7dab04b3
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2563-drm-amd-display-add-performance-trace-macro-to-dc.patch
@@ -0,0 +1,586 @@
+From 4088cf9664e5395b71f1f03548fdbb2511748fa9 Mon Sep 17 00:00:00 2001
+From: Dmytro Laktyushkin <Dmytro.Laktyushkin@amd.com>
+Date: Fri, 6 Oct 2017 15:40:07 -0400
+Subject: [PATCH 2563/4131] drm/amd/display: add performance trace macro to dc
+
+Signed-off-by: Dmytro Laktyushkin <Dmytro.Laktyushkin@amd.com>
+Reviewed-by: Tony Cheng <Tony.Cheng@amd.com>
+Acked-by: Harry Wentland <Harry.Wentland@amd.com>
+---
+ .../drm/amd/display/amdgpu_dm/amdgpu_dm_services.c | 6 ++
+ drivers/gpu/drm/amd/display/dc/basics/logger.c | 78 ++++++----------------
+ drivers/gpu/drm/amd/display/dc/basics/logger.h | 37 ----------
+ drivers/gpu/drm/amd/display/dc/calcs/dcn_calcs.c | 5 +-
+ drivers/gpu/drm/amd/display/dc/dc.h | 1 +
+ .../gpu/drm/amd/display/dc/dce/dce_link_encoder.c | 5 --
+ .../drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c | 40 +++++------
+ .../gpu/drm/amd/display/dc/dcn10/dcn10_resource.c | 1 +
+ drivers/gpu/drm/amd/display/dc/dm_services.h | 2 +
+ .../gpu/drm/amd/display/include/logger_interface.h | 28 ++++++++
+ drivers/gpu/drm/amd/display/include/logger_types.h | 36 +++++++++-
+ 11 files changed, 118 insertions(+), 121 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_services.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_services.c
+index 43bf829..82269ca 100644
+--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_services.c
++++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_services.c
+@@ -35,6 +35,12 @@
+ #include "amdgpu_dm_irq.h"
+ #include "amdgpu_pm.h"
+
++unsigned long long dm_get_timestamp(struct dc_context *ctx)
++{
++ /* TODO: return actual timestamp */
++ return 0;
++}
++
+ bool dm_write_persistent_data(struct dc_context *ctx,
+ const struct dc_sink *sink,
+ const char *module_name,
+diff --git a/drivers/gpu/drm/amd/display/dc/basics/logger.c b/drivers/gpu/drm/amd/display/dc/basics/logger.c
+index afb6d2d..e04e8ec 100644
+--- a/drivers/gpu/drm/amd/display/dc/basics/logger.c
++++ b/drivers/gpu/drm/amd/display/dc/basics/logger.c
+@@ -80,8 +80,6 @@ static bool construct(struct dc_context *ctx, struct dal_logger *logger,
+ logger->buffer_read_offset = 0;
+ logger->buffer_write_offset = 0;
+
+- logger->write_wrap_count = 0;
+- logger->read_wrap_count = 0;
+ logger->open_count = 0;
+
+ logger->flags.bits.ENABLE_CONSOLE = 1;
+@@ -162,23 +160,24 @@ static void log_to_debug_console(struct log_entry *entry)
+ }
+
+ /* Print everything unread existing in log_buffer to debug console*/
+-static void flush_to_debug_console(struct dal_logger *logger)
++void dm_logger_flush_buffer(struct dal_logger *logger, bool should_warn)
+ {
+- int i = logger->buffer_read_offset;
+- char *string_start = &logger->log_buffer[i];
++ char *string_start = &logger->log_buffer[logger->buffer_read_offset];
+
+- dm_output_to_console(
+- "---------------- FLUSHING LOG BUFFER ----------------\n");
+- while (i < logger->buffer_write_offset) {
++ if (should_warn)
++ dm_output_to_console(
++ "---------------- FLUSHING LOG BUFFER ----------------\n");
++ while (logger->buffer_read_offset < logger->buffer_write_offset) {
+
+- if (logger->log_buffer[i] == '\0') {
++ if (logger->log_buffer[logger->buffer_read_offset] == '\0') {
+ dm_output_to_console("%s", string_start);
+- string_start = (char *)logger->log_buffer + i + 1;
++ string_start = logger->log_buffer + logger->buffer_read_offset + 1;
+ }
+- i++;
++ logger->buffer_read_offset++;
+ }
+- dm_output_to_console(
+- "-------------- END FLUSHING LOG BUFFER --------------\n\n");
++ if (should_warn)
++ dm_output_to_console(
++ "-------------- END FLUSHING LOG BUFFER --------------\n\n");
+ }
+
+ static void log_to_internal_buffer(struct log_entry *entry)
+@@ -195,35 +194,17 @@ static void log_to_internal_buffer(struct log_entry *entry)
+
+ if (size > 0 && size < logger->log_buffer_size) {
+
+- int total_free_space = 0;
+- int space_before_wrap = 0;
+-
+- if (logger->buffer_write_offset > logger->buffer_read_offset) {
+- total_free_space = logger->log_buffer_size -
+- logger->buffer_write_offset +
+- logger->buffer_read_offset;
+- space_before_wrap = logger->log_buffer_size -
+- logger->buffer_write_offset;
+- } else if (logger->buffer_write_offset <
+- logger->buffer_read_offset) {
+- total_free_space = logger->log_buffer_size -
+- logger->buffer_read_offset +
+- logger->buffer_write_offset;
+- space_before_wrap = total_free_space;
+- } else if (logger->write_wrap_count !=
+- logger->read_wrap_count) {
+- /* Buffer is completely full already */
+- total_free_space = 0;
+- space_before_wrap = 0;
+- } else {
++ int buffer_space = logger->log_buffer_size -
++ logger->buffer_write_offset;
++
++ if (logger->buffer_write_offset == logger->buffer_read_offset) {
+ /* Buffer is empty, start writing at beginning */
+- total_free_space = logger->log_buffer_size;
+- space_before_wrap = logger->log_buffer_size;
++ buffer_space = logger->log_buffer_size;
+ logger->buffer_write_offset = 0;
+ logger->buffer_read_offset = 0;
+ }
+
+- if (space_before_wrap > size) {
++ if (buffer_space > size) {
+ /* No wrap around, copy 'size' bytes
+ * from 'entry->buf' to 'log_buffer'
+ */
+@@ -232,28 +213,12 @@ static void log_to_internal_buffer(struct log_entry *entry)
+ entry->buf, size);
+ logger->buffer_write_offset += size;
+
+- } else if (total_free_space > size) {
+- /* We have enough room without flushing,
+- * but need to wrap around */
+-
+- int space_after_wrap = total_free_space -
+- space_before_wrap;
+-
+- memmove(logger->log_buffer +
+- logger->buffer_write_offset,
+- entry->buf, space_before_wrap);
+- memmove(logger->log_buffer, entry->buf +
+- space_before_wrap, space_after_wrap);
+-
+- logger->buffer_write_offset = space_after_wrap;
+- logger->write_wrap_count++;
+-
+ } else {
+ /* Not enough room remaining, we should flush
+ * existing logs */
+
+ /* Flush existing unread logs to console */
+- flush_to_debug_console(logger);
++ dm_logger_flush_buffer(logger, true);
+
+ /* Start writing to beginning of buffer */
+ memmove(logger->log_buffer, entry->buf, size);
+@@ -325,9 +290,10 @@ void dm_logger_write(
+ log_heading(&entry);
+
+ size = dm_log_to_buffer(
+- buffer, LOG_MAX_LINE_SIZE, msg, args);
++ buffer, LOG_MAX_LINE_SIZE - 1, msg, args);
+
+- entry.buf_offset += size;
++ buffer[entry.buf_offset + size] = '\0';
++ entry.buf_offset += size + 1;
+
+ /* --Flush log_entry buffer-- */
+ /* print to kernel console */
+diff --git a/drivers/gpu/drm/amd/display/dc/basics/logger.h b/drivers/gpu/drm/amd/display/dc/basics/logger.h
+index 2f7a5df..09722f0 100644
+--- a/drivers/gpu/drm/amd/display/dc/basics/logger.h
++++ b/drivers/gpu/drm/amd/display/dc/basics/logger.h
+@@ -26,42 +26,5 @@
+ #ifndef __DAL_LOGGER_H__
+ #define __DAL_LOGGER_H__
+
+-/* Structure for keeping track of offsets, buffer, etc */
+-
+-#define DAL_LOGGER_BUFFER_MAX_SIZE 2048
+-
+-/*Connectivity log needs to output EDID, which needs at lease 256x3 bytes,
+- * change log line size to 896 to meet the request.
+- */
+-#define LOG_MAX_LINE_SIZE 896
+-
+-#include "include/logger_types.h"
+-
+-struct dal_logger {
+-
+- /* How far into the circular buffer has been read by dsat
+- * Read offset should never cross write offset. Write \0's to
+- * read data just to be sure?
+- */
+- uint32_t buffer_read_offset;
+-
+- /* How far into the circular buffer we have written
+- * Write offset should never cross read offset
+- */
+- uint32_t buffer_write_offset;
+-
+- uint32_t write_wrap_count;
+- uint32_t read_wrap_count;
+-
+- uint32_t open_count;
+-
+- char *log_buffer; /* Pointer to malloc'ed buffer */
+- uint32_t log_buffer_size; /* Size of circular buffer */
+-
+- uint32_t mask; /*array of masks for major elements*/
+-
+- union logger_flags flags;
+- struct dc_context *ctx;
+-};
+
+ #endif /* __DAL_LOGGER_H__ */
+diff --git a/drivers/gpu/drm/amd/display/dc/calcs/dcn_calcs.c b/drivers/gpu/drm/amd/display/dc/calcs/dcn_calcs.c
+index cf0c145..e151523 100644
+--- a/drivers/gpu/drm/amd/display/dc/calcs/dcn_calcs.c
++++ b/drivers/gpu/drm/amd/display/dc/calcs/dcn_calcs.c
+@@ -682,6 +682,7 @@ bool dcn_validate_bandwidth(
+ bool bw_limit_pass;
+ float bw_limit;
+
++ PERFORMANCE_TRACE_START();
+ if (dcn_bw_apply_registry_override(dc))
+ dcn_bw_sync_calcs_and_dml(dc);
+
+@@ -1089,6 +1090,8 @@ bool dcn_validate_bandwidth(
+
+ kernel_fpu_end();
+
++ PERFORMANCE_TRACE_END();
++
+ if (bw_limit_pass && v->voltage_level != 5)
+ return true;
+ else
+@@ -1223,7 +1226,7 @@ unsigned int dcn_find_dcfclk_suits_all(
+ else
+ dcf_clk = dc->dcn_soc->dcfclkv_min0p65*1000;
+
+- dm_logger_write(dc->ctx->logger, LOG_HW_MARKS,
++ dm_logger_write(dc->ctx->logger, LOG_BANDWIDTH_CALCS,
+ "\tdcf_clk for voltage = %d\n", dcf_clk);
+ return dcf_clk;
+ }
+diff --git a/drivers/gpu/drm/amd/display/dc/dc.h b/drivers/gpu/drm/amd/display/dc/dc.h
+index c498d10..a8f7400 100644
+--- a/drivers/gpu/drm/amd/display/dc/dc.h
++++ b/drivers/gpu/drm/amd/display/dc/dc.h
+@@ -224,6 +224,7 @@ struct dc_debug {
+ bool disable_dpp_pg;
+ bool disable_stereo_support;
+ bool vsr_support;
++ bool performance_trace;
+ };
+ struct dc_state;
+ struct resource_pool;
+diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.c b/drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.c
+index 0cf0fff..fe88852 100644
+--- a/drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.c
++++ b/drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.c
+@@ -757,11 +757,6 @@ void dce110_link_encoder_construct(
+ enc110->base.preferred_engine = ENGINE_ID_UNKNOWN;
+ }
+
+- dm_logger_write(init_data->ctx->logger, LOG_I2C_AUX,
+- "Using channel: %s [%d]\n",
+- DECODE_CHANNEL_ID(init_data->channel),
+- init_data->channel);
+-
+ /* Override features with DCE-specific values */
+ if (BP_RESULT_OK == bp_funcs->get_encoder_cap_info(
+ enc110->base.ctx->dc_bios, enc110->base.id,
+diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
+index b698845..6e2cec6 100644
+--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
++++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
+@@ -468,7 +468,7 @@ static void program_watermarks(
+ refclk_mhz, 0x1fffff);
+ REG_WRITE(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_A, prog_wm_value);
+
+- dm_logger_write(hws->ctx->logger, LOG_HW_MARKS,
++ dm_logger_write(hws->ctx->logger, LOG_BANDWIDTH_CALCS,
+ "URGENCY_WATERMARK_A calculated =%d\n"
+ "HW register value = 0x%x\n",
+ watermarks->a.urgent_ns, prog_wm_value);
+@@ -476,7 +476,7 @@ static void program_watermarks(
+ prog_wm_value = convert_and_clamp(watermarks->a.pte_meta_urgent_ns,
+ refclk_mhz, 0x1fffff);
+ REG_WRITE(DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_A, prog_wm_value);
+- dm_logger_write(hws->ctx->logger, LOG_HW_MARKS,
++ dm_logger_write(hws->ctx->logger, LOG_BANDWIDTH_CALCS,
+ "PTE_META_URGENCY_WATERMARK_A calculated =%d\n"
+ "HW register value = 0x%x\n",
+ watermarks->a.pte_meta_urgent_ns, prog_wm_value);
+@@ -487,7 +487,7 @@ static void program_watermarks(
+ refclk_mhz, 0x1fffff);
+
+ REG_WRITE(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_A, prog_wm_value);
+- dm_logger_write(hws->ctx->logger, LOG_HW_MARKS,
++ dm_logger_write(hws->ctx->logger, LOG_BANDWIDTH_CALCS,
+ "SR_ENTER_EXIT_WATERMARK_A calculated =%d\n"
+ "HW register value = 0x%x\n",
+ watermarks->a.cstate_pstate.cstate_enter_plus_exit_ns, prog_wm_value);
+@@ -497,7 +497,7 @@ static void program_watermarks(
+ watermarks->a.cstate_pstate.cstate_exit_ns,
+ refclk_mhz, 0x1fffff);
+ REG_WRITE(DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_A, prog_wm_value);
+- dm_logger_write(hws->ctx->logger, LOG_HW_MARKS,
++ dm_logger_write(hws->ctx->logger, LOG_BANDWIDTH_CALCS,
+ "SR_EXIT_WATERMARK_A calculated =%d\n"
+ "HW register value = 0x%x\n",
+ watermarks->a.cstate_pstate.cstate_exit_ns, prog_wm_value);
+@@ -507,7 +507,7 @@ static void program_watermarks(
+ watermarks->a.cstate_pstate.pstate_change_ns,
+ refclk_mhz, 0x1fffff);
+ REG_WRITE(DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_A, prog_wm_value);
+- dm_logger_write(hws->ctx->logger, LOG_HW_MARKS,
++ dm_logger_write(hws->ctx->logger, LOG_BANDWIDTH_CALCS,
+ "DRAM_CLK_CHANGE_WATERMARK_A calculated =%d\n"
+ "HW register value = 0x%x\n\n",
+ watermarks->a.cstate_pstate.pstate_change_ns, prog_wm_value);
+@@ -517,7 +517,7 @@ static void program_watermarks(
+ prog_wm_value = convert_and_clamp(
+ watermarks->b.urgent_ns, refclk_mhz, 0x1fffff);
+ REG_WRITE(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_B, prog_wm_value);
+- dm_logger_write(hws->ctx->logger, LOG_HW_MARKS,
++ dm_logger_write(hws->ctx->logger, LOG_BANDWIDTH_CALCS,
+ "URGENCY_WATERMARK_B calculated =%d\n"
+ "HW register value = 0x%x\n",
+ watermarks->b.urgent_ns, prog_wm_value);
+@@ -527,7 +527,7 @@ static void program_watermarks(
+ watermarks->b.pte_meta_urgent_ns,
+ refclk_mhz, 0x1fffff);
+ REG_WRITE(DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_B, prog_wm_value);
+- dm_logger_write(hws->ctx->logger, LOG_HW_MARKS,
++ dm_logger_write(hws->ctx->logger, LOG_BANDWIDTH_CALCS,
+ "PTE_META_URGENCY_WATERMARK_B calculated =%d\n"
+ "HW register value = 0x%x\n",
+ watermarks->b.pte_meta_urgent_ns, prog_wm_value);
+@@ -537,7 +537,7 @@ static void program_watermarks(
+ watermarks->b.cstate_pstate.cstate_enter_plus_exit_ns,
+ refclk_mhz, 0x1fffff);
+ REG_WRITE(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_B, prog_wm_value);
+- dm_logger_write(hws->ctx->logger, LOG_HW_MARKS,
++ dm_logger_write(hws->ctx->logger, LOG_BANDWIDTH_CALCS,
+ "SR_ENTER_WATERMARK_B calculated =%d\n"
+ "HW register value = 0x%x\n",
+ watermarks->b.cstate_pstate.cstate_enter_plus_exit_ns, prog_wm_value);
+@@ -547,7 +547,7 @@ static void program_watermarks(
+ watermarks->b.cstate_pstate.cstate_exit_ns,
+ refclk_mhz, 0x1fffff);
+ REG_WRITE(DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_B, prog_wm_value);
+- dm_logger_write(hws->ctx->logger, LOG_HW_MARKS,
++ dm_logger_write(hws->ctx->logger, LOG_BANDWIDTH_CALCS,
+ "SR_EXIT_WATERMARK_B calculated =%d\n"
+ "HW register value = 0x%x\n",
+ watermarks->b.cstate_pstate.cstate_exit_ns, prog_wm_value);
+@@ -556,7 +556,7 @@ static void program_watermarks(
+ watermarks->b.cstate_pstate.pstate_change_ns,
+ refclk_mhz, 0x1fffff);
+ REG_WRITE(DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_B, prog_wm_value);
+- dm_logger_write(hws->ctx->logger, LOG_HW_MARKS,
++ dm_logger_write(hws->ctx->logger, LOG_BANDWIDTH_CALCS,
+ "DRAM_CLK_CHANGE_WATERMARK_B calculated =%d\n\n"
+ "HW register value = 0x%x\n",
+ watermarks->b.cstate_pstate.pstate_change_ns, prog_wm_value);
+@@ -565,7 +565,7 @@ static void program_watermarks(
+ prog_wm_value = convert_and_clamp(
+ watermarks->c.urgent_ns, refclk_mhz, 0x1fffff);
+ REG_WRITE(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_C, prog_wm_value);
+- dm_logger_write(hws->ctx->logger, LOG_HW_MARKS,
++ dm_logger_write(hws->ctx->logger, LOG_BANDWIDTH_CALCS,
+ "URGENCY_WATERMARK_C calculated =%d\n"
+ "HW register value = 0x%x\n",
+ watermarks->c.urgent_ns, prog_wm_value);
+@@ -575,7 +575,7 @@ static void program_watermarks(
+ watermarks->c.pte_meta_urgent_ns,
+ refclk_mhz, 0x1fffff);
+ REG_WRITE(DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_C, prog_wm_value);
+- dm_logger_write(hws->ctx->logger, LOG_HW_MARKS,
++ dm_logger_write(hws->ctx->logger, LOG_BANDWIDTH_CALCS,
+ "PTE_META_URGENCY_WATERMARK_C calculated =%d\n"
+ "HW register value = 0x%x\n",
+ watermarks->c.pte_meta_urgent_ns, prog_wm_value);
+@@ -585,7 +585,7 @@ static void program_watermarks(
+ watermarks->c.cstate_pstate.cstate_enter_plus_exit_ns,
+ refclk_mhz, 0x1fffff);
+ REG_WRITE(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_C, prog_wm_value);
+- dm_logger_write(hws->ctx->logger, LOG_HW_MARKS,
++ dm_logger_write(hws->ctx->logger, LOG_BANDWIDTH_CALCS,
+ "SR_ENTER_WATERMARK_C calculated =%d\n"
+ "HW register value = 0x%x\n",
+ watermarks->c.cstate_pstate.cstate_enter_plus_exit_ns, prog_wm_value);
+@@ -595,7 +595,7 @@ static void program_watermarks(
+ watermarks->c.cstate_pstate.cstate_exit_ns,
+ refclk_mhz, 0x1fffff);
+ REG_WRITE(DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_C, prog_wm_value);
+- dm_logger_write(hws->ctx->logger, LOG_HW_MARKS,
++ dm_logger_write(hws->ctx->logger, LOG_BANDWIDTH_CALCS,
+ "SR_EXIT_WATERMARK_C calculated =%d\n"
+ "HW register value = 0x%x\n",
+ watermarks->c.cstate_pstate.cstate_exit_ns, prog_wm_value);
+@@ -605,7 +605,7 @@ static void program_watermarks(
+ watermarks->c.cstate_pstate.pstate_change_ns,
+ refclk_mhz, 0x1fffff);
+ REG_WRITE(DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_C, prog_wm_value);
+- dm_logger_write(hws->ctx->logger, LOG_HW_MARKS,
++ dm_logger_write(hws->ctx->logger, LOG_BANDWIDTH_CALCS,
+ "DRAM_CLK_CHANGE_WATERMARK_C calculated =%d\n\n"
+ "HW register value = 0x%x\n",
+ watermarks->c.cstate_pstate.pstate_change_ns, prog_wm_value);
+@@ -614,7 +614,7 @@ static void program_watermarks(
+ prog_wm_value = convert_and_clamp(
+ watermarks->d.urgent_ns, refclk_mhz, 0x1fffff);
+ REG_WRITE(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_D, prog_wm_value);
+- dm_logger_write(hws->ctx->logger, LOG_HW_MARKS,
++ dm_logger_write(hws->ctx->logger, LOG_BANDWIDTH_CALCS,
+ "URGENCY_WATERMARK_D calculated =%d\n"
+ "HW register value = 0x%x\n",
+ watermarks->d.urgent_ns, prog_wm_value);
+@@ -623,7 +623,7 @@ static void program_watermarks(
+ watermarks->d.pte_meta_urgent_ns,
+ refclk_mhz, 0x1fffff);
+ REG_WRITE(DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_D, prog_wm_value);
+- dm_logger_write(hws->ctx->logger, LOG_HW_MARKS,
++ dm_logger_write(hws->ctx->logger, LOG_BANDWIDTH_CALCS,
+ "PTE_META_URGENCY_WATERMARK_D calculated =%d\n"
+ "HW register value = 0x%x\n",
+ watermarks->d.pte_meta_urgent_ns, prog_wm_value);
+@@ -633,7 +633,7 @@ static void program_watermarks(
+ watermarks->d.cstate_pstate.cstate_enter_plus_exit_ns,
+ refclk_mhz, 0x1fffff);
+ REG_WRITE(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_D, prog_wm_value);
+- dm_logger_write(hws->ctx->logger, LOG_HW_MARKS,
++ dm_logger_write(hws->ctx->logger, LOG_BANDWIDTH_CALCS,
+ "SR_ENTER_WATERMARK_D calculated =%d\n"
+ "HW register value = 0x%x\n",
+ watermarks->d.cstate_pstate.cstate_enter_plus_exit_ns, prog_wm_value);
+@@ -643,7 +643,7 @@ static void program_watermarks(
+ watermarks->d.cstate_pstate.cstate_exit_ns,
+ refclk_mhz, 0x1fffff);
+ REG_WRITE(DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_D, prog_wm_value);
+- dm_logger_write(hws->ctx->logger, LOG_HW_MARKS,
++ dm_logger_write(hws->ctx->logger, LOG_BANDWIDTH_CALCS,
+ "SR_EXIT_WATERMARK_D calculated =%d\n"
+ "HW register value = 0x%x\n",
+ watermarks->d.cstate_pstate.cstate_exit_ns, prog_wm_value);
+@@ -653,7 +653,7 @@ static void program_watermarks(
+ watermarks->d.cstate_pstate.pstate_change_ns,
+ refclk_mhz, 0x1fffff);
+ REG_WRITE(DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_D, prog_wm_value);
+- dm_logger_write(hws->ctx->logger, LOG_HW_MARKS,
++ dm_logger_write(hws->ctx->logger, LOG_BANDWIDTH_CALCS,
+ "DRAM_CLK_CHANGE_WATERMARK_D calculated =%d\n"
+ "HW register value = 0x%x\n\n",
+ watermarks->d.cstate_pstate.pstate_change_ns, prog_wm_value);
+diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.c
+index c7a1fc1..3c6aa24 100644
+--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.c
++++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.c
+@@ -434,6 +434,7 @@ static const struct dc_debug debug_defaults_drv = {
+ .voltage_align_fclk = true,
+ .disable_stereo_support = true,
+ .vsr_support = true,
++ .performance_trace = false,
+ };
+
+ static const struct dc_debug debug_defaults_diags = {
+diff --git a/drivers/gpu/drm/amd/display/dc/dm_services.h b/drivers/gpu/drm/amd/display/dc/dm_services.h
+index c8829e4..0f01ca2 100644
+--- a/drivers/gpu/drm/amd/display/dc/dm_services.h
++++ b/drivers/gpu/drm/amd/display/dc/dm_services.h
+@@ -414,6 +414,8 @@ bool dm_dmcu_set_pipe(struct dc_context *ctx, unsigned int controller_id);
+ #define dm_log_to_buffer(buffer, size, fmt, args)\
+ vsnprintf(buffer, size, fmt, args)
+
++unsigned long long dm_get_timestamp(struct dc_context *ctx);
++
+ /*
+ * Debug and verification hooks
+ */
+diff --git a/drivers/gpu/drm/amd/display/include/logger_interface.h b/drivers/gpu/drm/amd/display/include/logger_interface.h
+index 5aaf2da..8e1fe70 100644
+--- a/drivers/gpu/drm/amd/display/include/logger_interface.h
++++ b/drivers/gpu/drm/amd/display/include/logger_interface.h
+@@ -44,6 +44,8 @@ struct dal_logger *dal_logger_create(struct dc_context *ctx, uint32_t log_mask);
+
+ uint32_t dal_logger_destroy(struct dal_logger **logger);
+
++void dm_logger_flush_buffer(struct dal_logger *logger, bool should_warn);
++
+ void dm_logger_write(
+ struct dal_logger *logger,
+ enum dc_log_type log_type,
+@@ -157,4 +159,30 @@ void context_clock_trace(
+ #define DTN_INFO_END() \
+ dm_dtn_log_end(dc_ctx)
+
++#define PERFORMANCE_TRACE_START() \
++ unsigned long long perf_trc_start_stmp = dm_get_timestamp(dc->ctx); \
++ unsigned long long perf_trc_start_log_msk = dc->ctx->logger->mask; \
++ unsigned int perf_trc_start_log_flags = dc->ctx->logger->flags.value; \
++ if (dc->debug.performance_trace) {\
++ dm_logger_flush_buffer(dc->ctx->logger, false);\
++ dc->ctx->logger->mask = 1<<LOG_PERF_TRACE;\
++ dc->ctx->logger->flags.bits.ENABLE_CONSOLE = 0;\
++ dc->ctx->logger->flags.bits.ENABLE_BUFFER = 1;\
++ }
++
++#define PERFORMANCE_TRACE_END() do {\
++ unsigned long long perf_trc_end_stmp = dm_get_timestamp(dc->ctx);\
++ if (dc->debug.performance_trace) {\
++ dm_logger_write(dc->ctx->logger, \
++ LOG_PERF_TRACE, \
++ "%s duration: %d ticks\n", __func__,\
++ perf_trc_end_stmp - perf_trc_start_stmp); \
++ if (perf_trc_start_log_msk != 1<<LOG_PERF_TRACE) {\
++ dc->ctx->logger->mask = perf_trc_start_log_msk;\
++ dc->ctx->logger->flags.value = perf_trc_start_log_flags;\
++ dm_logger_flush_buffer(dc->ctx->logger, false);\
++ } \
++ } \
++} while (0)
++
+ #endif /* __DAL_LOGGER_INTERFACE_H__ */
+diff --git a/drivers/gpu/drm/amd/display/include/logger_types.h b/drivers/gpu/drm/amd/display/include/logger_types.h
+index 1f22e84..e2ff8cd 100644
+--- a/drivers/gpu/drm/amd/display/include/logger_types.h
++++ b/drivers/gpu/drm/amd/display/include/logger_types.h
+@@ -64,8 +64,7 @@ enum dc_log_type {
+ LOG_EVENT_LINK_LOSS,
+ LOG_EVENT_UNDERFLOW,
+ LOG_IF_TRACE,
+- LOG_HW_MARKS,
+- LOG_PPLIB,
++ LOG_PERF_TRACE,
+
+ LOG_SECTION_TOTAL_COUNT
+ };
+@@ -131,4 +130,37 @@ struct dc_log_type_info {
+ char name[MAX_NAME_LEN];
+ };
+
++/* Structure for keeping track of offsets, buffer, etc */
++
++#define DAL_LOGGER_BUFFER_MAX_SIZE 2048
++
++/*Connectivity log needs to output EDID, which needs at lease 256x3 bytes,
++ * change log line size to 896 to meet the request.
++ */
++#define LOG_MAX_LINE_SIZE 896
++
++struct dal_logger {
++
++ /* How far into the circular buffer has been read by dsat
++ * Read offset should never cross write offset. Write \0's to
++ * read data just to be sure?
++ */
++ uint32_t buffer_read_offset;
++
++ /* How far into the circular buffer we have written
++ * Write offset should never cross read offset
++ */
++ uint32_t buffer_write_offset;
++
++ uint32_t open_count;
++
++ char *log_buffer; /* Pointer to malloc'ed buffer */
++ uint32_t log_buffer_size; /* Size of circular buffer */
++
++ uint32_t mask; /*array of masks for major elements*/
++
++ union logger_flags flags;
++ struct dc_context *ctx;
++};
++
+ #endif /* __DAL_LOGGER_TYPES_H__ */
+--
+2.7.4
+