From: Alvin Lee <alvin.l...@amd.com>

- Due to hardware related QoS issues, we need to limit certain
  SKUs with less memory channels to DPM1 and above.
- At DPM0 + workload running, the urgent return latency can
  exceed 15us (the expected maximum is 4us) which results in underflow

Cc: sta...@vger.kernel.org
Reviewed-by: Saaem Rizvi <syedsaaem.ri...@amd.com>
Acked-by: Rodrigo Siqueira <rodrigo.sique...@amd.com>
Signed-off-by: Alvin Lee <alvin.l...@amd.com>
---
 .../gpu/drm/amd/display/dc/dcn32/dcn32_resource.c |  2 ++
 .../gpu/drm/amd/display/dc/dml/dcn32/dcn32_fpu.c  | 15 +++++++++++++++
 .../gpu/drm/amd/display/dc/dml/dcn32/dcn32_fpu.h  |  2 ++
 3 files changed, 19 insertions(+)

diff --git a/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_resource.c 
b/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_resource.c
index 4f8286ae699b..0085ea78ea31 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_resource.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_resource.c
@@ -1888,6 +1888,8 @@ bool dcn32_validate_bandwidth(struct dc *dc,
 
        dc->res_pool->funcs->calculate_wm_and_dlg(dc, context, pipes, pipe_cnt, 
vlevel);
 
+       dcn32_override_min_req_memclk(dc, context);
+
        BW_VAL_TRACE_END_WATERMARKS();
 
        goto validate_out;
diff --git a/drivers/gpu/drm/amd/display/dc/dml/dcn32/dcn32_fpu.c 
b/drivers/gpu/drm/amd/display/dc/dml/dcn32/dcn32_fpu.c
index b8a2518faecc..ed7ea4c42412 100644
--- a/drivers/gpu/drm/amd/display/dc/dml/dcn32/dcn32_fpu.c
+++ b/drivers/gpu/drm/amd/display/dc/dml/dcn32/dcn32_fpu.c
@@ -2887,3 +2887,18 @@ void dcn32_set_clock_limits(const struct 
_vcs_dpi_soc_bounding_box_st *soc_bb)
        dc_assert_fp_enabled();
        dcn3_2_soc.clock_limits[0].dcfclk_mhz = 1200.0;
 }
+
+void dcn32_override_min_req_memclk(struct dc *dc, struct dc_state *context)
+{
+       // WA: restrict FPO and SubVP to use first non-strobe mode (DCN32 BW 
issue)
+       if ((context->bw_ctx.bw.dcn.clk.fw_based_mclk_switching || 
dcn32_subvp_in_use(dc, context)) &&
+                       dc->dml.soc.num_chans <= 8) {
+               int num_mclk_levels = 
dc->clk_mgr->bw_params->clk_table.num_entries_per_clk.num_memclk_levels;
+
+               if (context->bw_ctx.dml.vba.DRAMSpeed <= 
dc->clk_mgr->bw_params->clk_table.entries[0].memclk_mhz * 16 &&
+                               num_mclk_levels > 1) {
+                       context->bw_ctx.dml.vba.DRAMSpeed = 
dc->clk_mgr->bw_params->clk_table.entries[1].memclk_mhz * 16;
+                       context->bw_ctx.bw.dcn.clk.dramclk_khz = 
context->bw_ctx.dml.vba.DRAMSpeed * 1000 / 16;
+               }
+       }
+}
diff --git a/drivers/gpu/drm/amd/display/dc/dml/dcn32/dcn32_fpu.h 
b/drivers/gpu/drm/amd/display/dc/dml/dcn32/dcn32_fpu.h
index dcf512cd3072..a4206b71d650 100644
--- a/drivers/gpu/drm/amd/display/dc/dml/dcn32/dcn32_fpu.h
+++ b/drivers/gpu/drm/amd/display/dc/dml/dcn32/dcn32_fpu.h
@@ -80,6 +80,8 @@ void dcn32_assign_fpo_vactive_candidate(struct dc *dc, const 
struct dc_state *co
 
 bool dcn32_find_vactive_pipe(struct dc *dc, const struct dc_state *context, 
uint32_t vactive_margin_req);
 
+void dcn32_override_min_req_memclk(struct dc *dc, struct dc_state *context);
+
 void dcn32_set_clock_limits(const struct _vcs_dpi_soc_bounding_box_st *soc_bb);
 
 #endif
-- 
2.39.2

Reply via email to