drm/amd/display: Temporary workaround to toggle watermark setting
authorLewis Huang <Lewis.Huang@amd.com>
Sat, 6 Jul 2019 21:02:25 +0000 (16:02 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Thu, 17 Oct 2019 20:28:10 +0000 (16:28 -0400)
[Why]
Watermarks not propagated to DCHUBP after it is powered on

[How]
Add temoprary function apply_DEDCN21_147_wa to apply wm settings for Renoir

Signed-off-by: Lewis Huang <Lewis.Huang@amd.com>
Reviewed-by: Tony Cheng <Tony.Cheng@amd.com>
Acked-by: Bhawanpreet Lakha <Bhawanpreet.Lakha@amd.com>
Reviewed-by: Roman Li <Roman.Li@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c
drivers/gpu/drm/amd/display/dc/dcn21/dcn21_hubbub.c
drivers/gpu/drm/amd/display/dc/dcn21/dcn21_resource.c
drivers/gpu/drm/amd/display/dc/inc/hw/dchubbub.h

index ce2530509e1235dd6e5968213e0d12a3184ad773..6229a8ca001333bf61838fa01082ac9bef1f193d 100644 (file)
@@ -1533,6 +1533,10 @@ static void dcn20_program_front_end_for_ctx(
                                msleep(1);
                }
        }
+
+       /* WA to apply WM setting*/
+       if (dc->hwseq->wa.DEGVIDCN21)
+               dc->res_pool->hubbub->funcs->apply_DEDCN21_147_wa(dc->res_pool->hubbub);
 }
 
 
index fdfbdeb324595f91a4da585c66dc5e30c4ce51cf..2232ccf14bdd7d77bb5d690ccae5f5bd1da20f3d 100644 (file)
@@ -616,6 +616,14 @@ void hubbub21_wm_read_state(struct hubbub *hubbub,
                        DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_D, &s->dram_clk_chanage);
 }
 
+void hubbub21_apply_DEDCN21_147_wa(struct hubbub *hubbub)
+{
+       struct dcn20_hubbub *hubbub1 = TO_DCN20_HUBBUB(hubbub);
+       uint32_t prog_wm_value;
+
+       prog_wm_value = REG_READ(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_A);
+       REG_WRITE(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_A, prog_wm_value);
+}
 
 static const struct hubbub_funcs hubbub21_funcs = {
        .update_dchub = hubbub2_update_dchub,
@@ -627,6 +635,7 @@ static const struct hubbub_funcs hubbub21_funcs = {
        .wm_read_state = hubbub21_wm_read_state,
        .get_dchub_ref_freq = hubbub2_get_dchub_ref_freq,
        .program_watermarks = hubbub21_program_watermarks,
+       .apply_DEDCN21_147_wa = hubbub21_apply_DEDCN21_147_wa,
 };
 
 void hubbub21_construct(struct dcn20_hubbub *hubbub,
index e58d87b66f35b4758a76737d1be3d19b6b21dd72..e5848cac33e2c05a8716f93f4f240441a514d560 100644 (file)
@@ -1470,6 +1470,7 @@ static struct dce_hwseq *dcn21_hwseq_create(
                hws->regs = &hwseq_reg;
                hws->shifts = &hwseq_shift;
                hws->masks = &hwseq_mask;
+               hws->wa.DEGVIDCN21 = true;
        }
        return hws;
 }
index a6297219d7fcead6765fbedd2390a77bb4610cbe..c81a17aeaa25c5a7988268d1580f41b6ca06a90e 100644 (file)
@@ -147,6 +147,7 @@ struct hubbub_funcs {
        bool (*is_allow_self_refresh_enabled)(struct hubbub *hubbub);
        void (*allow_self_refresh_control)(struct hubbub *hubbub, bool allow);
 
+       void (*apply_DEDCN21_147_wa)(struct hubbub *hubbub);
 };
 
 struct hubbub {