From: Wenjing Liu <[email protected]> [how] - Consolidate memory QoS measurement functions into a single interface for better maintainability and usability. - Update function naming for improved clarity. - Unify latency measurements into a single function call with update programming sequence. - Add `start_measuring_urgent_assertion_count` and `get_urgent_assertion_count` interfaces. - Add `start_measuring_prefetch_data_size` and `get_prefetch_data_size` interfaces. - Update start_measuring_unbounded_bandwidth implementation to measure 200 data returns in the middle of prefetch window.
Reviewed-by: Dillon Varone <[email protected]> Signed-off-by: Wenjing Liu <[email protected]> Signed-off-by: Matthew Stewart <[email protected]> --- drivers/gpu/drm/amd/display/dc/core/dc.c | 22 ++++++----- drivers/gpu/drm/amd/display/dc/dc.h | 1 + .../drm/amd/display/dc/hwss/hw_sequencer.h | 38 +++---------------- .../gpu/drm/amd/display/dc/inc/core_types.h | 8 ++++ .../gpu/drm/amd/display/dc/inc/hw/dchubbub.h | 28 +++++++++----- 5 files changed, 45 insertions(+), 52 deletions(-) diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c b/drivers/gpu/drm/amd/display/dc/core/dc.c index aba5ad2a7a33..ad8ce46ce310 100644 --- a/drivers/gpu/drm/amd/display/dc/core/dc.c +++ b/drivers/gpu/drm/amd/display/dc/core/dc.c @@ -7143,22 +7143,24 @@ void dc_log_preos_dmcub_info(const struct dc *dc) bool dc_get_qos_info(struct dc *dc, struct dc_qos_info *info) { const struct dc_clocks *clk = &dc->current_state->bw_ctx.bw.dcn.clk; + struct memory_qos qos; memset(info, 0, sizeof(*info)); - // Check if all measurement functions are available - if (!dc->hwss.measure_peak_bw_mbps || - !dc->hwss.measure_avg_bw_mbps || - !dc->hwss.measure_max_latency_ns || - !dc->hwss.measure_avg_latency_ns) { + // Check if measurement function is available + if (!dc->hwss.measure_memory_qos) { return false; } - // Call measurement functions to get actual values - info->actual_peak_bw_in_mbps = dc->hwss.measure_peak_bw_mbps(dc); - info->actual_avg_bw_in_mbps = dc->hwss.measure_avg_bw_mbps(dc); - info->actual_max_latency_in_ns = dc->hwss.measure_max_latency_ns(dc); - info->actual_avg_latency_in_ns = dc->hwss.measure_avg_latency_ns(dc); + // Call unified measurement function + dc->hwss.measure_memory_qos(dc, &qos); + + // Populate info from measured qos + info->actual_peak_bw_in_mbps = qos.peak_bw_mbps; + info->actual_avg_bw_in_mbps = qos.avg_bw_mbps; + info->actual_min_latency_in_ns = qos.min_latency_ns; + info->actual_max_latency_in_ns = qos.max_latency_ns; + info->actual_avg_latency_in_ns = qos.avg_latency_ns; info->dcn_bandwidth_ub_in_mbps = (uint32_t)(clk->fclk_khz / 1000 * 64); return true; diff --git a/drivers/gpu/drm/amd/display/dc/dc.h b/drivers/gpu/drm/amd/display/dc/dc.h index 4068d5baef21..6daa35cd96a8 100644 --- a/drivers/gpu/drm/amd/display/dc/dc.h +++ b/drivers/gpu/drm/amd/display/dc/dc.h @@ -962,6 +962,7 @@ struct dc_qos_info { uint32_t actual_avg_bw_in_mbps; uint32_t calculated_avg_bw_in_mbps; uint32_t actual_max_latency_in_ns; + uint32_t actual_min_latency_in_ns; uint32_t qos_max_latency_ub_in_ns; uint32_t actual_avg_latency_in_ns; uint32_t qos_avg_latency_ub_in_ns; diff --git a/drivers/gpu/drm/amd/display/dc/hwss/hw_sequencer.h b/drivers/gpu/drm/amd/display/dc/hwss/hw_sequencer.h index 490a6fccebff..51b0f0fd8fcd 100644 --- a/drivers/gpu/drm/amd/display/dc/hwss/hw_sequencer.h +++ b/drivers/gpu/drm/amd/display/dc/hwss/hw_sequencer.h @@ -52,7 +52,7 @@ struct drr_params; struct dc_underflow_debug_data; struct dsc_optc_config; struct vm_system_aperture_param; - +struct memory_qos; struct subvp_pipe_control_lock_fast_params { struct dc *dc; bool lock; @@ -1289,40 +1289,14 @@ struct hw_sequencer_funcs { struct dc_underflow_debug_data *out_data); /** - * measure_peak_bw_mbps - Measure actual peak bandwidth in Mbps - * @dc: DC structure - * - * Returns the measured peak bandwidth value in Mbps from hardware - * performance counters or registers. - */ - uint32_t (*measure_peak_bw_mbps)(struct dc *dc); - - /** - * measure_avg_bw_mbps - Measure actual average bandwidth in Mbps - * @dc: DC structure - * - * Returns the measured average bandwidth value in Mbps from hardware - * performance counters or registers. - */ - uint32_t (*measure_avg_bw_mbps)(struct dc *dc); - - /** - * measure_max_latency_ns - Measure actual maximum latency in nanoseconds - * @dc: DC structure - * - * Returns the measured maximum latency value in nanoseconds from hardware - * performance counters or registers. - */ - uint32_t (*measure_max_latency_ns)(struct dc *dc); - - /** - * measure_avg_latency_ns - Measure actual average latency in nanoseconds + * measure_memory_qos - Measure memory QoS metrics * @dc: DC structure + * @qos: Pointer to memory_qos struct to populate with measured values * - * Returns the measured average latency value in nanoseconds from hardware - * performance counters or registers. + * Populates the provided memory_qos struct with peak bandwidth, average bandwidth, + * max latency, min latency, and average latency from hardware performance counters. */ - uint32_t (*measure_avg_latency_ns)(struct dc *dc); + void (*measure_memory_qos)(struct dc *dc, struct memory_qos *qos); }; diff --git a/drivers/gpu/drm/amd/display/dc/inc/core_types.h b/drivers/gpu/drm/amd/display/dc/inc/core_types.h index 5ed2cd344804..61d8ef759aca 100644 --- a/drivers/gpu/drm/amd/display/dc/inc/core_types.h +++ b/drivers/gpu/drm/amd/display/dc/inc/core_types.h @@ -704,4 +704,12 @@ struct dc_bounding_box_max_clk { int max_phyclk_mhz; }; +struct memory_qos { + uint32_t peak_bw_mbps; + uint32_t avg_bw_mbps; + uint32_t max_latency_ns; + uint32_t min_latency_ns; + uint32_t avg_latency_ns; +}; + #endif /* _CORE_TYPES_H_ */ diff --git a/drivers/gpu/drm/amd/display/dc/inc/hw/dchubbub.h b/drivers/gpu/drm/amd/display/dc/inc/hw/dchubbub.h index 1ddfa30411c8..4307362749f0 100644 --- a/drivers/gpu/drm/amd/display/dc/inc/hw/dchubbub.h +++ b/drivers/gpu/drm/amd/display/dc/inc/hw/dchubbub.h @@ -254,30 +254,38 @@ struct hubbub_funcs { bool (*program_arbiter)(struct hubbub *hubbub, struct dml2_display_arb_regs *arb_regs, bool safe_to_lower); void (*dchvm_init)(struct hubbub *hubbub); + /* Performance monitoring related functions */ struct hubbub_perfmon_funcs { void (*reset)(struct hubbub *hubbub); - void (*start_measuring_max_memory_latency_ns)( + void (*start_measuring_memory_latencies)( struct hubbub *hubbub); - uint32_t (*get_max_memory_latency_ns)(struct hubbub *hubbub, - uint32_t refclk_mhz, uint32_t *sample_count); - void (*start_measuring_average_memory_latency_ns)( + uint32_t (*get_memory_latencies_ns)(struct hubbub *hubbub, + uint32_t refclk_mhz, uint32_t *min_latency_ns, + uint32_t *max_latency_ns, uint32_t *avg_latency_ns); + void (*start_measuring_urgent_assertion_count)( struct hubbub *hubbub); - uint32_t (*get_average_memory_latency_ns)(struct hubbub *hubbub, - uint32_t refclk_mhz, uint32_t *sample_count); - void (*start_measuring_urgent_ramp_latency_ns)( + bool (*get_urgent_assertion_count)(struct hubbub *hubbub, + uint32_t refclk_mhz, + uint32_t *assertion_count, + uint32_t *deassertion_count, + uint32_t *timestamp_us); + void (*start_measuring_urgent_ramp_latency)( struct hubbub *hubbub, const struct hubbub_urgent_latency_params *params); uint32_t (*get_urgent_ramp_latency_ns)(struct hubbub *hubbub, uint32_t refclk_mhz); - void (*start_measuring_unbounded_bandwidth_mbps)( + void (*start_measuring_unbounded_bandwidth)( struct hubbub *hubbub); uint32_t (*get_unbounded_bandwidth_mbps)(struct hubbub *hubbub, uint32_t refclk_mhz, uint32_t *duration_ns); - void (*start_measuring_average_bandwidth_mbps)( + void (*start_measuring_in_order_bandwidth)( struct hubbub *hubbub); - uint32_t (*get_average_bandwidth_mbps)(struct hubbub *hubbub, + uint32_t (*get_in_order_bandwidth_mbps)(struct hubbub *hubbub, uint32_t refclk_mhz, uint32_t min_duration_ns, uint32_t *duration_ns); + void (*start_measuring_prefetch_data_size)( + struct hubbub *hubbub); + uint32_t (*get_prefetch_data_size)(struct hubbub *hubbub); } perfmon; struct hubbub_qos_funcs { -- 2.52.0
