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;
+ struct dc_measured_memory_qos measured = {};
+ struct dc_requested_memory_qos requested = {};
memset(info, 0, sizeof(*info));
return false;
}
- // Call unified measurement function
- dc->hwss.measure_memory_qos(dc, &qos);
+ dc->hwss.measure_memory_qos(dc, &measured);
- // 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);
+ info->actual_peak_bw_in_mbps = measured.peak_bw_mbps;
+ info->actual_avg_bw_in_mbps = measured.avg_bw_mbps;
+ info->actual_min_latency_in_ns = measured.min_latency_ns;
+ info->actual_max_latency_in_ns = measured.max_latency_ns;
+ info->actual_avg_latency_in_ns = measured.avg_latency_ns;
+ info->dcn_bandwidth_ub_in_mbps = (uint32_t)(clk->fclk_khz / 1000 * 64);
+
+ if (dc->clk_mgr && dc->clk_mgr->funcs->get_requested_memory_qos) {
+ dc->clk_mgr->funcs->get_requested_memory_qos(dc->clk_mgr, &requested);
+ info->qos_bandwidth_lb_in_mbps = requested.bandwidth_lb_in_mbps;
+ info->calculated_avg_bw_in_mbps = requested.calculated_avg_bw_in_mbps;
+ info->qos_max_latency_ub_in_ns = requested.max_latency_ub_in_ns;
+ info->qos_avg_latency_ub_in_ns = requested.avg_latency_ub_in_ns;
+ info->qos_max_bw_budget_in_mbps = requested.max_bw_budget_in_mbps;
+ }
return true;
}
uint32_t actual_avg_latency_in_ns;
uint32_t qos_avg_latency_ub_in_ns;
uint32_t dcn_bandwidth_ub_in_mbps;
+ uint32_t qos_max_bw_budget_in_mbps;
};
struct dc_state;
struct dc_underflow_debug_data;
struct dsc_optc_config;
struct vm_system_aperture_param;
-struct memory_qos;
+struct dc_measured_memory_qos;
struct stream_encoder;
struct hpo_dp_stream_encoder;
struct hpo_frl_stream_encoder;
/**
* measure_memory_qos - Measure memory QoS metrics
* @dc: DC structure
- * @qos: Pointer to memory_qos struct to populate with measured values
+ * @qos: Pointer to dc_measured_memory_qos struct to populate with measured values
*
- * Populates the provided memory_qos struct with peak bandwidth, average bandwidth,
+ * Populates the provided dc_measured_memory_qos struct with peak bandwidth, average bandwidth,
* max latency, min latency, and average latency from hardware performance counters.
*/
- void (*measure_memory_qos)(struct dc *dc, struct memory_qos *qos);
+ void (*measure_memory_qos)(struct dc *dc, struct dc_measured_memory_qos *qos);
};
int max_phyclk_mhz;
};
-struct memory_qos {
+struct dc_measured_memory_qos {
uint32_t peak_bw_mbps;
uint32_t avg_bw_mbps;
uint32_t max_latency_ns;
uint32_t avg_latency_ns;
};
+struct dc_requested_memory_qos {
+ uint32_t bandwidth_lb_in_mbps;
+ uint32_t calculated_avg_bw_in_mbps;
+ uint32_t max_latency_ub_in_ns;
+ uint32_t avg_latency_ub_in_ns;
+ uint32_t max_bw_budget_in_mbps;
+};
+
#endif /* _CORE_TYPES_H_ */
#define __DAL_CLK_MGR_H__
#include "dc.h"
+#include "core_types.h"
#include "dm_pp_smu.h"
/* Constants */
unsigned int (*override_memory_bandwidth_request)(
struct clk_mgr *clk_mgr,
unsigned int bw_kbps);
+ /**
+ * get_requested_memory_qos - Retrieve current QoS request from the clock manager's
+ * current clock state, reflecting any active bandwidth overrides.
+ * @clk_mgr: clock manager instance
+ * @qos: pointer to dc_requested_memory_qos structure to populate
+ */
+ void (*get_requested_memory_qos)(
+ struct clk_mgr *clk_mgr,
+ struct dc_requested_memory_qos *qos);
};
struct clk_mgr {