Commit c9742685 authored by Dmytro Laktyushkin's avatar Dmytro Laktyushkin Committed by Alex Deucher

drm/amd/display: add bw logging for dcn

Signed-off-by: default avatarDmytro Laktyushkin <Dmytro.Laktyushkin@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 11589813
...@@ -1312,6 +1312,144 @@ void dcn_bw_notify_pplib_of_wm_ranges(struct core_dc *dc) ...@@ -1312,6 +1312,144 @@ void dcn_bw_notify_pplib_of_wm_ranges(struct core_dc *dc)
void dcn_bw_sync_calcs_and_dml(struct core_dc *dc) void dcn_bw_sync_calcs_and_dml(struct core_dc *dc)
{ {
kernel_fpu_begin(); kernel_fpu_begin();
dm_logger_write(dc->ctx->logger, LOG_BANDWIDTH_CALCS,
"sr_exit_time: %d ns\n"
"sr_enter_plus_exit_time: %d ns\n"
"urgent_latency: %d ns\n"
"write_back_latency: %d ns\n"
"percent_of_ideal_drambw_received_after_urg_latency: %d %\n"
"max_request_size: %d bytes\n"
"dcfclkv_max0p9: %d kHz\n"
"dcfclkv_nom0p8: %d kHz\n"
"dcfclkv_mid0p72: %d kHz\n"
"dcfclkv_min0p65: %d kHz\n"
"max_dispclk_vmax0p9: %d kHz\n"
"max_dispclk_vnom0p8: %d kHz\n"
"max_dispclk_vmid0p72: %d kHz\n"
"max_dispclk_vmin0p65: %d kHz\n"
"max_dppclk_vmax0p9: %d kHz\n"
"max_dppclk_vnom0p8: %d kHz\n"
"max_dppclk_vmid0p72: %d kHz\n"
"max_dppclk_vmin0p65: %d kHz\n"
"socclk: %d kHz\n"
"fabric_and_dram_bandwidth_vmax0p9: %d MB/s\n"
"fabric_and_dram_bandwidth_vnom0p8: %d MB/s\n"
"fabric_and_dram_bandwidth_vmid0p72: %d MB/s\n"
"fabric_and_dram_bandwidth_vmin0p65: %d MB/s\n"
"phyclkv_max0p9: %d kHz\n"
"phyclkv_nom0p8: %d kHz\n"
"phyclkv_mid0p72: %d kHz\n"
"phyclkv_min0p65: %d kHz\n"
"downspreading: %d %\n"
"round_trip_ping_latency_cycles: %d DCFCLK Cycles\n"
"urgent_out_of_order_return_per_channel: %d Bytes\n"
"number_of_channels: %d\n"
"vmm_page_size: %d Bytes\n"
"dram_clock_change_latency: %d ns\n"
"return_bus_width: %d Bytes\n",
dc->dcn_soc.sr_exit_time * 1000,
dc->dcn_soc.sr_enter_plus_exit_time * 1000,
dc->dcn_soc.urgent_latency * 1000,
dc->dcn_soc.write_back_latency * 1000,
dc->dcn_soc.percent_of_ideal_drambw_received_after_urg_latency,
dc->dcn_soc.max_request_size,
dc->dcn_soc.dcfclkv_max0p9 * 1000,
dc->dcn_soc.dcfclkv_nom0p8 * 1000,
dc->dcn_soc.dcfclkv_mid0p72 * 1000,
dc->dcn_soc.dcfclkv_min0p65 * 1000,
dc->dcn_soc.max_dispclk_vmax0p9 * 1000,
dc->dcn_soc.max_dispclk_vnom0p8 * 1000,
dc->dcn_soc.max_dispclk_vmid0p72 * 1000,
dc->dcn_soc.max_dispclk_vmin0p65 * 1000,
dc->dcn_soc.max_dppclk_vmax0p9 * 1000,
dc->dcn_soc.max_dppclk_vnom0p8 * 1000,
dc->dcn_soc.max_dppclk_vmid0p72 * 1000,
dc->dcn_soc.max_dppclk_vmin0p65 * 1000,
dc->dcn_soc.socclk * 1000,
dc->dcn_soc.fabric_and_dram_bandwidth_vmax0p9 * 1000,
dc->dcn_soc.fabric_and_dram_bandwidth_vnom0p8 * 1000,
dc->dcn_soc.fabric_and_dram_bandwidth_vmid0p72 * 1000,
dc->dcn_soc.fabric_and_dram_bandwidth_vmin0p65 * 1000,
dc->dcn_soc.phyclkv_max0p9 * 1000,
dc->dcn_soc.phyclkv_nom0p8 * 1000,
dc->dcn_soc.phyclkv_mid0p72 * 1000,
dc->dcn_soc.phyclkv_min0p65 * 1000,
dc->dcn_soc.downspreading * 100,
dc->dcn_soc.round_trip_ping_latency_cycles,
dc->dcn_soc.urgent_out_of_order_return_per_channel,
dc->dcn_soc.number_of_channels,
dc->dcn_soc.vmm_page_size,
dc->dcn_soc.dram_clock_change_latency * 1000,
dc->dcn_soc.return_bus_width);
dm_logger_write(dc->ctx->logger, LOG_BANDWIDTH_CALCS,
"rob_buffer_size_in_kbyte: %d\n"
"det_buffer_size_in_kbyte: %d\n"
"dpp_output_buffer_pixels: %d\n"
"opp_output_buffer_lines: %d\n"
"pixel_chunk_size_in_kbyte: %d\n"
"pte_enable: %d\n"
"pte_chunk_size: %d kbytes\n"
"meta_chunk_size: %d kbytes\n"
"writeback_chunk_size: %d kbytes\n"
"odm_capability: %d\n"
"dsc_capability: %d\n"
"line_buffer_size: %d bits\n"
"max_line_buffer_lines: %d\n"
"is_line_buffer_bpp_fixed: %d\n"
"line_buffer_fixed_bpp: %d\n"
"writeback_luma_buffer_size: %d kbytes\n"
"writeback_chroma_buffer_size: %d kbytes\n"
"max_num_dpp: %d\n"
"max_num_writeback: %d\n"
"max_dchub_topscl_throughput: %d pixels/dppclk\n"
"max_pscl_tolb_throughput: %d pixels/dppclk\n"
"max_lb_tovscl_throughput: %d pixels/dppclk\n"
"max_vscl_tohscl_throughput: %d pixels/dppclk\n"
"max_hscl_ratio: %d\n"
"max_vscl_ratio: %d\n"
"max_hscl_taps: %d\n"
"max_vscl_taps: %d\n"
"pte_buffer_size_in_requests: %d\n"
"dispclk_ramping_margin: %d %\n"
"under_scan_factor: %d %\n"
"max_inter_dcn_tile_repeaters: %d\n"
"can_vstartup_lines_exceed_vsync_plus_back_porch_lines_minus_one: %d\n"
"bug_forcing_luma_and_chroma_request_to_same_size_fixed: %d\n"
"dcfclk_cstate_latency: %d\n",
dc->dcn_ip.rob_buffer_size_in_kbyte,
dc->dcn_ip.det_buffer_size_in_kbyte,
dc->dcn_ip.dpp_output_buffer_pixels,
dc->dcn_ip.opp_output_buffer_lines,
dc->dcn_ip.pixel_chunk_size_in_kbyte,
dc->dcn_ip.pte_enable,
dc->dcn_ip.pte_chunk_size,
dc->dcn_ip.meta_chunk_size,
dc->dcn_ip.writeback_chunk_size,
dc->dcn_ip.odm_capability,
dc->dcn_ip.dsc_capability,
dc->dcn_ip.line_buffer_size,
dc->dcn_ip.max_line_buffer_lines,
dc->dcn_ip.is_line_buffer_bpp_fixed,
dc->dcn_ip.line_buffer_fixed_bpp,
dc->dcn_ip.writeback_luma_buffer_size,
dc->dcn_ip.writeback_chroma_buffer_size,
dc->dcn_ip.max_num_dpp,
dc->dcn_ip.max_num_writeback,
dc->dcn_ip.max_dchub_topscl_throughput,
dc->dcn_ip.max_pscl_tolb_throughput,
dc->dcn_ip.max_lb_tovscl_throughput,
dc->dcn_ip.max_vscl_tohscl_throughput,
dc->dcn_ip.max_hscl_ratio,
dc->dcn_ip.max_vscl_ratio,
dc->dcn_ip.max_hscl_taps,
dc->dcn_ip.max_vscl_taps,
dc->dcn_ip.pte_buffer_size_in_requests,
dc->dcn_ip.dispclk_ramping_margin,
dc->dcn_ip.under_scan_factor * 100,
dc->dcn_ip.max_inter_dcn_tile_repeaters,
dc->dcn_ip.can_vstartup_lines_exceed_vsync_plus_back_porch_lines_minus_one,
dc->dcn_ip.bug_forcing_luma_and_chroma_request_to_same_size_fixed,
dc->dcn_ip.dcfclk_cstate_latency);
dc->dml.soc.vmin.socclk_mhz = dc->dcn_soc.socclk; dc->dml.soc.vmin.socclk_mhz = dc->dcn_soc.socclk;
dc->dml.soc.vmid.socclk_mhz = dc->dcn_soc.socclk; dc->dml.soc.vmid.socclk_mhz = dc->dcn_soc.socclk;
dc->dml.soc.vnom.socclk_mhz = dc->dcn_soc.socclk; dc->dml.soc.vnom.socclk_mhz = dc->dcn_soc.socclk;
......
...@@ -1379,8 +1379,10 @@ void dc_update_surfaces_and_stream(struct dc *dc, ...@@ -1379,8 +1379,10 @@ void dc_update_surfaces_and_stream(struct dc *dc,
if (!core_dc->res_pool->funcs->validate_bandwidth(core_dc, context)) { if (!core_dc->res_pool->funcs->validate_bandwidth(core_dc, context)) {
BREAK_TO_DEBUGGER(); BREAK_TO_DEBUGGER();
goto fail; goto fail;
} else } else {
core_dc->hwss.set_bandwidth(core_dc, context, false); core_dc->hwss.set_bandwidth(core_dc, context, false);
context_clock_trace(dc, context);
}
} }
if (!surface_count) /* reset */ if (!surface_count) /* reset */
......
...@@ -29,6 +29,13 @@ ...@@ -29,6 +29,13 @@
##__VA_ARGS__); \ ##__VA_ARGS__); \
} while (0) } while (0)
#define CLOCK_TRACE(...) do {\
if (dc->debug.clock_trace) \
dm_logger_write(logger, \
LOG_BANDWIDTH_CALCS, \
##__VA_ARGS__); \
} while (0)
void pre_surface_trace( void pre_surface_trace(
const struct dc *dc, const struct dc *dc,
const struct dc_surface *const *surfaces, const struct dc_surface *const *surfaces,
...@@ -314,3 +321,34 @@ void context_timing_trace( ...@@ -314,3 +321,34 @@ void context_timing_trace(
h_pos[i], v_pos[i]); h_pos[i], v_pos[i]);
} }
} }
void context_clock_trace(
const struct dc *dc,
struct validate_context *context)
{
#if defined(CONFIG_DRM_AMD_DC_DCN1_0)
struct core_dc *core_dc = DC_TO_CORE(dc);
struct dal_logger *logger = core_dc->ctx->logger;
CLOCK_TRACE("Current: dispclk_khz:%d dppclk_div:%d dcfclk_khz:%d\n"
"dcfclk_deep_sleep_khz:%d fclk_khz:%d\n"
"dram_ccm_us:%d min_active_dram_ccm_us:%d\n",
context->bw.dcn.calc_clk.dispclk_khz,
context->bw.dcn.calc_clk.dppclk_div,
context->bw.dcn.calc_clk.dcfclk_khz,
context->bw.dcn.calc_clk.dcfclk_deep_sleep_khz,
context->bw.dcn.calc_clk.fclk_khz,
context->bw.dcn.calc_clk.dram_ccm_us,
context->bw.dcn.calc_clk.min_active_dram_ccm_us);
CLOCK_TRACE("Calculated: dispclk_khz:%d dppclk_div:%d dcfclk_khz:%d\n"
"dcfclk_deep_sleep_khz:%d fclk_khz:%d\n"
"dram_ccm_us:%d min_active_dram_ccm_us:%d\n",
context->bw.dcn.calc_clk.dispclk_khz,
context->bw.dcn.calc_clk.dppclk_div,
context->bw.dcn.calc_clk.dcfclk_khz,
context->bw.dcn.calc_clk.dcfclk_deep_sleep_khz,
context->bw.dcn.calc_clk.fclk_khz,
context->bw.dcn.calc_clk.dram_ccm_us,
context->bw.dcn.calc_clk.min_active_dram_ccm_us);
#endif
}
...@@ -160,6 +160,7 @@ struct dc_debug { ...@@ -160,6 +160,7 @@ struct dc_debug {
bool max_disp_clk; bool max_disp_clk;
bool surface_trace; bool surface_trace;
bool timing_trace; bool timing_trace;
bool clock_trace;
bool validation_trace; bool validation_trace;
bool disable_stutter; bool disable_stutter;
bool disable_dcc; bool disable_dcc;
......
...@@ -429,6 +429,7 @@ static const struct dc_debug debug_defaults_drv = { ...@@ -429,6 +429,7 @@ static const struct dc_debug debug_defaults_drv = {
.disable_dmcu = true, .disable_dmcu = true,
.force_abm_enable = false, .force_abm_enable = false,
.timing_trace = false, .timing_trace = false,
.clock_trace = true,
.disable_pplib_clock_request = true, .disable_pplib_clock_request = true,
.disable_pplib_wm_range = false, .disable_pplib_wm_range = false,
#if defined(CONFIG_DRM_AMD_DC_DCN1_0) #if defined(CONFIG_DRM_AMD_DC_DCN1_0)
...@@ -441,6 +442,7 @@ static const struct dc_debug debug_defaults_diags = { ...@@ -441,6 +442,7 @@ static const struct dc_debug debug_defaults_diags = {
.disable_dmcu = true, .disable_dmcu = true,
.force_abm_enable = false, .force_abm_enable = false,
.timing_trace = true, .timing_trace = true,
.clock_trace = true,
#if defined(CONFIG_DRM_AMD_DC_DCN1_0) #if defined(CONFIG_DRM_AMD_DC_DCN1_0)
.disable_pplib_clock_request = true, .disable_pplib_clock_request = true,
.disable_pplib_wm_range = true, .disable_pplib_wm_range = true,
......
...@@ -32,6 +32,7 @@ struct dc_context; ...@@ -32,6 +32,7 @@ struct dc_context;
struct dc_link; struct dc_link;
struct dc_surface_update; struct dc_surface_update;
struct resource_context; struct resource_context;
struct validate_context;
/* /*
* *
...@@ -90,6 +91,9 @@ void context_timing_trace( ...@@ -90,6 +91,9 @@ void context_timing_trace(
const struct dc *dc, const struct dc *dc,
struct resource_context *res_ctx); struct resource_context *res_ctx);
void context_clock_trace(
const struct dc *dc,
struct validate_context *context);
/* Any function which is empty or have incomplete implementation should be /* Any function which is empty or have incomplete implementation should be
* marked by this macro. * marked by this macro.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment