From: Alvin Lee <[email protected]>

- DC mode clock switch interface was previously only executed
  for DCN303. Enable it for DCN32x so that the interface is called
  correctly
- Assign function pointers for DCN32x that are used in the dc mode
  interface
- Update the dc mode interface to work generically for each ASIC
- In update_clocks, make sure to consider softmax if we're in DC mode

Reviewed-by: Jun Lei <[email protected]>
Acked-by: Hamza Mahfooz <[email protected]>
Signed-off-by: Alvin Lee <[email protected]>
---
 .../display/dc/clk_mgr/dcn32/dcn32_clk_mgr.c  | 43 ++++++++++++++++---
 drivers/gpu/drm/amd/display/dc/core/dc.c      | 10 +++--
 drivers/gpu/drm/amd/display/dc/dc.h           |  2 +-
 .../amd/display/dc/dcn303/dcn303_resource.c   |  1 +
 .../gpu/drm/amd/display/dc/dcn32/dcn32_hubp.c |  1 +
 .../gpu/drm/amd/display/dc/dcn32/dcn32_init.c |  1 +
 .../drm/amd/display/dc/dcn32/dcn32_resource.c |  1 +
 .../amd/display/dc/dcn321/dcn321_resource.c   |  1 +
 .../gpu/drm/amd/display/dc/inc/hw/clk_mgr.h   |  1 +
 9 files changed, 50 insertions(+), 11 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn32/dcn32_clk_mgr.c 
b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn32/dcn32_clk_mgr.c
index 96fa68f166e0..402340f17a3a 100644
--- a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn32/dcn32_clk_mgr.c
+++ b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn32/dcn32_clk_mgr.c
@@ -541,9 +541,18 @@ static void dcn32_update_clocks(struct clk_mgr 
*clk_mgr_base,
                        clk_mgr_base->clks.p_state_change_support = 
p_state_change_support;
 
                        /* to disable P-State switching, set UCLK min = max */
-                       if (!clk_mgr_base->clks.p_state_change_support)
-                               dcn32_smu_set_hard_min_by_freq(clk_mgr, 
PPCLK_UCLK,
-                                               
clk_mgr_base->bw_params->clk_table.entries[clk_mgr_base->bw_params->clk_table.num_entries_per_clk.num_memclk_levels
 - 1].memclk_mhz);
+                       if (!clk_mgr_base->clks.p_state_change_support) {
+                               if (dc->clk_mgr->dc_mode_softmax_enabled) {
+                                       /* On DCN32x we will never have the 
functional UCLK min above the softmax
+                                        * since we calculate mode support 
based on softmax being the max UCLK
+                                        * frequency.
+                                        */
+                                       dcn32_smu_set_hard_min_by_freq(clk_mgr, 
PPCLK_UCLK,
+                                                       
dc->clk_mgr->bw_params->dc_mode_softmax_memclk);
+                               } else {
+                                       dcn32_smu_set_hard_min_by_freq(clk_mgr, 
PPCLK_UCLK, dc->clk_mgr->bw_params->max_memclk_mhz);
+                               }
+                       }
                }
 
                /* Always update saved value, even if new value not set due to 
P-State switching unsupported. Also check safe_to_lower for FCLK */
@@ -808,8 +817,7 @@ static void dcn32_set_hard_max_memclk(struct clk_mgr 
*clk_mgr_base)
        if (!clk_mgr->smu_present)
                return;
 
-       dcn30_smu_set_hard_max_by_freq(clk_mgr, PPCLK_UCLK,
-                       
clk_mgr_base->bw_params->clk_table.entries[clk_mgr_base->bw_params->clk_table.num_entries_per_clk.num_memclk_levels
 - 1].memclk_mhz);
+       dcn30_smu_set_hard_max_by_freq(clk_mgr, PPCLK_UCLK, 
clk_mgr_base->bw_params->max_memclk_mhz);
 }
 
 /* Get current memclk states, update bounding box */
@@ -827,6 +835,7 @@ static void dcn32_get_memclk_states_from_smu(struct clk_mgr 
*clk_mgr_base)
                        
&clk_mgr_base->bw_params->clk_table.entries[0].memclk_mhz,
                        &num_entries_per_clk->num_memclk_levels);
        clk_mgr_base->bw_params->dc_mode_limit.memclk_mhz = 
dcn30_smu_get_dc_mode_max_dpm_freq(clk_mgr, PPCLK_UCLK);
+       clk_mgr_base->bw_params->dc_mode_softmax_memclk = 
clk_mgr_base->bw_params->dc_mode_limit.memclk_mhz;
 
        /* memclk must have at least one level */
        num_entries_per_clk->num_memclk_levels = 
num_entries_per_clk->num_memclk_levels ? num_entries_per_clk->num_memclk_levels 
: 1;
@@ -841,7 +850,8 @@ static void dcn32_get_memclk_states_from_smu(struct clk_mgr 
*clk_mgr_base)
        } else {
                num_levels = num_entries_per_clk->num_fclk_levels;
        }
-
+       clk_mgr_base->bw_params->max_memclk_mhz =
+                       
clk_mgr_base->bw_params->clk_table.entries[num_entries_per_clk->num_memclk_levels
 - 1].memclk_mhz;
        clk_mgr_base->bw_params->clk_table.num_entries = num_levels ? 
num_levels : 1;
 
        if (clk_mgr->dpm_present && !num_levels)
@@ -894,6 +904,25 @@ static bool dcn32_is_smu_present(struct clk_mgr 
*clk_mgr_base)
        return clk_mgr->smu_present;
 }
 
+static void dcn32_set_max_memclk(struct clk_mgr *clk_mgr_base, unsigned int 
memclk_mhz)
+{
+       struct clk_mgr_internal *clk_mgr = TO_CLK_MGR_INTERNAL(clk_mgr_base);
+
+       if (!clk_mgr->smu_present)
+               return;
+
+       dcn30_smu_set_hard_max_by_freq(clk_mgr, PPCLK_UCLK, memclk_mhz);
+}
+
+static void dcn32_set_min_memclk(struct clk_mgr *clk_mgr_base, unsigned int 
memclk_mhz)
+{
+       struct clk_mgr_internal *clk_mgr = TO_CLK_MGR_INTERNAL(clk_mgr_base);
+
+       if (!clk_mgr->smu_present)
+               return;
+
+       dcn32_smu_set_hard_min_by_freq(clk_mgr, PPCLK_UCLK, memclk_mhz);
+}
 
 static struct clk_mgr_funcs dcn32_funcs = {
                .get_dp_ref_clk_frequency = dce12_get_dp_ref_freq_khz,
@@ -904,6 +933,8 @@ static struct clk_mgr_funcs dcn32_funcs = {
                .notify_wm_ranges = dcn32_notify_wm_ranges,
                .set_hard_min_memclk = dcn32_set_hard_min_memclk,
                .set_hard_max_memclk = dcn32_set_hard_max_memclk,
+               .set_max_memclk = dcn32_set_max_memclk,
+               .set_min_memclk = dcn32_set_min_memclk,
                .get_memclk_states_from_smu = dcn32_get_memclk_states_from_smu,
                .are_clock_states_equal = dcn32_are_clock_states_equal,
                .enable_pme_wa = dcn32_enable_pme_wa,
diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c 
b/drivers/gpu/drm/amd/display/dc/core/dc.c
index d0e9ada594c5..22becb40aecd 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc.c
@@ -4767,15 +4767,17 @@ static void blank_and_force_memclk(struct dc *dc, bool 
apply, unsigned int memcl
  */
 void dc_enable_dcmode_clk_limit(struct dc *dc, bool enable)
 {
-       uint32_t hw_internal_rev = dc->ctx->asic_id.hw_internal_rev;
-       unsigned int softMax, maxDPM, funcMin;
+       unsigned int softMax = 0, maxDPM = 0, funcMin = 0, i;
        bool p_state_change_support;
 
-       if (!ASICREV_IS_BEIGE_GOBY_P(hw_internal_rev))
+       if (!dc->config.dc_mode_clk_limit_support)
                return;
 
        softMax = dc->clk_mgr->bw_params->dc_mode_softmax_memclk;
-       maxDPM = 
dc->clk_mgr->bw_params->clk_table.entries[dc->clk_mgr->bw_params->clk_table.num_entries
 - 1].memclk_mhz;
+       for (i = 0; i < dc->clk_mgr->bw_params->clk_table.num_entries; i++) {
+               if (dc->clk_mgr->bw_params->clk_table.entries[i].memclk_mhz > 
maxDPM)
+                       maxDPM = 
dc->clk_mgr->bw_params->clk_table.entries[i].memclk_mhz;
+       }
        funcMin = (dc->clk_mgr->clks.dramclk_khz + 999) / 1000;
        p_state_change_support = dc->clk_mgr->clks.p_state_change_support;
 
diff --git a/drivers/gpu/drm/amd/display/dc/dc.h 
b/drivers/gpu/drm/amd/display/dc/dc.h
index 26d05e225088..812f39223238 100644
--- a/drivers/gpu/drm/amd/display/dc/dc.h
+++ b/drivers/gpu/drm/amd/display/dc/dc.h
@@ -416,7 +416,7 @@ struct dc_config {
        uint8_t force_bios_fixed_vs;
        int sdpif_request_limit_words_per_umc;
        bool use_old_fixed_vs_sequence;
-       bool disable_subvp_drr;
+       bool dc_mode_clk_limit_support;
 };
 
 enum visual_confirm {
diff --git a/drivers/gpu/drm/amd/display/dc/dcn303/dcn303_resource.c 
b/drivers/gpu/drm/amd/display/dc/dcn303/dcn303_resource.c
index 6d9761395288..45956ef6f3f9 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn303/dcn303_resource.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn303/dcn303_resource.c
@@ -1190,6 +1190,7 @@ static bool dcn303_resource_construct(
 
        dc->caps.dp_hdmi21_pcon_support = true;
 
+       dc->config.dc_mode_clk_limit_support = true;
        /* read VBIOS LTTPR caps */
        if (ctx->dc_bios->funcs->get_lttpr_caps) {
                enum bp_result bp_query_result;
diff --git a/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_hubp.c 
b/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_hubp.c
index 2d604f7ee782..ca5b4b28a664 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_hubp.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_hubp.c
@@ -179,6 +179,7 @@ static struct hubp_funcs dcn32_hubp_funcs = {
        .hubp_setup_interdependent = hubp2_setup_interdependent,
        .hubp_set_vm_system_aperture_settings = 
hubp3_set_vm_system_aperture_settings,
        .set_blank = hubp2_set_blank,
+       .set_blank_regs = hubp2_set_blank_regs,
        .dcc_control = hubp3_dcc_control,
        .mem_program_viewport = min_set_viewport,
        .set_cursor_attributes  = hubp32_cursor_set_attributes,
diff --git a/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_init.c 
b/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_init.c
index c2490e16a66a..777b2fac20c4 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_init.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_init.c
@@ -56,6 +56,7 @@ static const struct hw_sequencer_funcs dcn32_funcs = {
        .enable_audio_stream = dce110_enable_audio_stream,
        .disable_audio_stream = dce110_disable_audio_stream,
        .disable_plane = dcn20_disable_plane,
+       .disable_pixel_data = dcn20_disable_pixel_data,
        .pipe_control_lock = dcn20_pipe_control_lock,
        .interdependent_update_lock = dcn10_lock_all_pipes,
        .cursor_lock = dcn10_cursor_lock,
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 c94dec042cc3..1cc09799f92d 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_resource.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn32/dcn32_resource.c
@@ -2215,6 +2215,7 @@ static bool dcn32_resource_construct(
        /* Use pipe context based otg sync logic */
        dc->config.use_pipe_ctx_sync_logic = true;
 
+       dc->config.dc_mode_clk_limit_support = true;
        /* read VBIOS LTTPR caps */
        {
                if (ctx->dc_bios->funcs->get_lttpr_caps) {
diff --git a/drivers/gpu/drm/amd/display/dc/dcn321/dcn321_resource.c 
b/drivers/gpu/drm/amd/display/dc/dcn321/dcn321_resource.c
index ca409a441953..a53478e15ce3 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn321/dcn321_resource.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn321/dcn321_resource.c
@@ -1756,6 +1756,7 @@ static bool dcn321_resource_construct(
        dc->caps.color.mpc.ogam_rom_caps.hlg = 0;
        dc->caps.color.mpc.ocsc = 1;
 
+       dc->config.dc_mode_clk_limit_support = true;
        /* read VBIOS LTTPR caps */
        {
                if (ctx->dc_bios->funcs->get_lttpr_caps) {
diff --git a/drivers/gpu/drm/amd/display/dc/inc/hw/clk_mgr.h 
b/drivers/gpu/drm/amd/display/dc/inc/hw/clk_mgr.h
index 6faf40fa5c69..ecb7bcc39469 100644
--- a/drivers/gpu/drm/amd/display/dc/inc/hw/clk_mgr.h
+++ b/drivers/gpu/drm/amd/display/dc/inc/hw/clk_mgr.h
@@ -230,6 +230,7 @@ struct clk_bw_params {
        unsigned int dram_channel_width_bytes;
        unsigned int dispclk_vco_khz;
        unsigned int dc_mode_softmax_memclk;
+       unsigned int max_memclk_mhz;
        struct clk_limit_table clk_table;
        struct wm_table wm_table;
        struct dummy_pstate_entry dummy_pstate_table[4];
-- 
2.40.1

Reply via email to