drm/amd/display: Amend coasting vtotal for replay low hz
authorChunTao Tso <chuntao.tso@amd.com>
Tue, 20 Feb 2024 09:08:39 +0000 (17:08 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 20 Mar 2024 17:12:58 +0000 (13:12 -0400)
[WHY]
The original coasting vtotal is 2 bytes, and it need to
be amended to 4 bytes because low hz case.

[HOW]
Amend coasting vtotal from 2 bytes to 4 bytes.

Cc: Mario Limonciello <mario.limonciello@amd.com>
Cc: Alex Deucher <alexander.deucher@amd.com>
Cc: stable@vger.kernel.org
Reviewed-by: Alvin Lee <alvin.lee2@amd.com>
Acked-by: Alex Hung <alex.hung@amd.com>
Signed-off-by: ChunTao Tso <chuntao.tso@amd.com>
Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/dc_types.h
drivers/gpu/drm/amd/display/dc/inc/link.h
drivers/gpu/drm/amd/display/dc/link/protocols/link_edp_panel_control.c
drivers/gpu/drm/amd/display/dc/link/protocols/link_edp_panel_control.h
drivers/gpu/drm/amd/display/dmub/inc/dmub_cmd.h
drivers/gpu/drm/amd/display/modules/power/power_helpers.c
drivers/gpu/drm/amd/display/modules/power/power_helpers.h

index 9900dda..be2ac5c 100644 (file)
@@ -1085,9 +1085,9 @@ struct replay_settings {
        /* SMU optimization is enabled */
        bool replay_smu_opt_enable;
        /* Current Coasting vtotal */
-       uint16_t coasting_vtotal;
+       uint32_t coasting_vtotal;
        /* Coasting vtotal table */
-       uint16_t coasting_vtotal_table[PR_COASTING_TYPE_NUM];
+       uint32_t coasting_vtotal_table[PR_COASTING_TYPE_NUM];
        /* Maximum link off frame count */
        enum replay_link_off_frame_count_level link_off_frame_count_level;
        /* Replay pseudo vtotal for abm + ips on full screen video which can improve ips residency */
index 26fe81f..bf29fc5 100644 (file)
@@ -285,12 +285,12 @@ struct link_service {
                        enum replay_FW_Message_type msg,
                        union dmub_replay_cmd_set *cmd_data);
        bool (*edp_set_coasting_vtotal)(
-                       struct dc_link *link, uint16_t coasting_vtotal);
+                       struct dc_link *link, uint32_t coasting_vtotal);
        bool (*edp_replay_residency)(const struct dc_link *link,
                        unsigned int *residency, const bool is_start,
                        const bool is_alpm);
        bool (*edp_set_replay_power_opt_and_coasting_vtotal)(struct dc_link *link,
-                       const unsigned int *power_opts, uint16_t coasting_vtotal);
+                       const unsigned int *power_opts, uint32_t coasting_vtotal);
 
        bool (*edp_wait_for_t12)(struct dc_link *link);
        bool (*edp_is_ilr_optimization_required)(struct dc_link *link,
index acfbbc6..3baa2bd 100644 (file)
@@ -1034,7 +1034,7 @@ bool edp_send_replay_cmd(struct dc_link *link,
        return true;
 }
 
-bool edp_set_coasting_vtotal(struct dc_link *link, uint16_t coasting_vtotal)
+bool edp_set_coasting_vtotal(struct dc_link *link, uint32_t coasting_vtotal)
 {
        struct dc *dc = link->ctx->dc;
        struct dmub_replay *replay = dc->res_pool->replay;
@@ -1073,7 +1073,7 @@ bool edp_replay_residency(const struct dc_link *link,
 }
 
 bool edp_set_replay_power_opt_and_coasting_vtotal(struct dc_link *link,
-       const unsigned int *power_opts, uint16_t coasting_vtotal)
+       const unsigned int *power_opts, uint32_t coasting_vtotal)
 {
        struct dc  *dc = link->ctx->dc;
        struct dmub_replay *replay = dc->res_pool->replay;
index 34e521a..a158c62 100644 (file)
@@ -59,12 +59,12 @@ bool edp_setup_replay(struct dc_link *link,
 bool edp_send_replay_cmd(struct dc_link *link,
                        enum replay_FW_Message_type msg,
                        union dmub_replay_cmd_set *cmd_data);
-bool edp_set_coasting_vtotal(struct dc_link *link, uint16_t coasting_vtotal);
+bool edp_set_coasting_vtotal(struct dc_link *link, uint32_t coasting_vtotal);
 bool edp_replay_residency(const struct dc_link *link,
        unsigned int *residency, const bool is_start, const bool is_alpm);
 bool edp_get_replay_state(const struct dc_link *link, uint64_t *state);
 bool edp_set_replay_power_opt_and_coasting_vtotal(struct dc_link *link,
-       const unsigned int *power_opts, uint16_t coasting_vtotal);
+       const unsigned int *power_opts, uint32_t coasting_vtotal);
 bool edp_wait_for_t12(struct dc_link *link);
 bool edp_is_ilr_optimization_required(struct dc_link *link,
        struct dc_crtc_timing *crtc_timing);
index a529e36..af3fe8b 100644 (file)
@@ -3238,6 +3238,14 @@ struct dmub_cmd_replay_set_coasting_vtotal_data {
         * Currently the support is only for 0 or 1
         */
        uint8_t panel_inst;
+       /**
+        * 16-bit value dicated by driver that indicates the coasting vtotal high byte part.
+        */
+       uint16_t coasting_vtotal_high;
+       /**
+        * Explicit padding to 4 byte boundary.
+        */
+       uint8_t pad[2];
 };
 
 /**
index e304e84..2a3698f 100644 (file)
@@ -975,7 +975,7 @@ bool psr_su_set_dsc_slice_height(struct dc *dc, struct dc_link *link,
 
 void set_replay_coasting_vtotal(struct dc_link *link,
        enum replay_coasting_vtotal_type type,
-       uint16_t vtotal)
+       uint32_t vtotal)
 {
        link->replay_settings.coasting_vtotal_table[type] = vtotal;
 }
index bef4815..ff7e6f3 100644 (file)
@@ -56,7 +56,7 @@ bool dmub_init_abm_config(struct resource_pool *res_pool,
 void init_replay_config(struct dc_link *link, struct replay_config *pr_config);
 void set_replay_coasting_vtotal(struct dc_link *link,
        enum replay_coasting_vtotal_type type,
-       uint16_t vtotal);
+       uint32_t vtotal);
 void set_replay_ips_full_screen_video_src_vtotal(struct dc_link *link, uint16_t vtotal);
 void calculate_replay_link_off_frame_count(struct dc_link *link,
        uint16_t vtotal, uint16_t htotal);