From: Nikola Cornij <[email protected]>

[why]
When updating DSC config, a new config has to be validated before proceeding
with applying the update. Validation, however, modifies the current state.
This means DSC config validation would affect pipe re-assignment, causing
intermittent screen corruption issues when ODM is required for DSC.

[how]
- Use a copy of the current state for modified DSC config validation
- Set the update type to FULL_UPDATE to correctly validate and set the
  actual state used for committing the streams

Signed-off-by: Nikola Cornij <[email protected]>
Reviewed-by: Dmytro Laktyushkin <[email protected]>
Acked-by: Rodrigo Siqueira <[email protected]>
---
 drivers/gpu/drm/amd/display/dc/core/dc.c | 31 ++++++++++++++++++------
 1 file changed, 24 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c 
b/drivers/gpu/drm/amd/display/dc/core/dc.c
index 60bc4c3a518e..ed3fd41c0879 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc.c
@@ -1678,6 +1678,9 @@ static enum surface_update_type 
check_update_surfaces_for_stream(
 
                if (stream_update->output_csc_transform || 
stream_update->output_color_space)
                        su_flags->bits.out_csc = 1;
+
+               if (stream_update->dsc_config)
+                       overall_type = UPDATE_TYPE_FULL;
        }
 
        for (i = 0 ; i < surface_count; i++) {
@@ -1869,8 +1872,10 @@ static void copy_surface_update_to_plane(
 static void copy_stream_update_to_stream(struct dc *dc,
                                         struct dc_state *context,
                                         struct dc_stream_state *stream,
-                                        const struct dc_stream_update *update)
+                                        struct dc_stream_update *update)
 {
+       struct dc_context *dc_ctx = dc->ctx;
+
        if (update == NULL || stream == NULL)
                return;
 
@@ -1947,12 +1952,24 @@ static void copy_stream_update_to_stream(struct dc *dc,
                uint32_t enable_dsc = (update->dsc_config->num_slices_h != 0 &&
                                       update->dsc_config->num_slices_v != 0);
 
-               stream->timing.dsc_cfg = *update->dsc_config;
-               stream->timing.flags.DSC = enable_dsc;
-               if (!dc->res_pool->funcs->validate_bandwidth(dc, context,
-                                                            true)) {
-                       stream->timing.dsc_cfg = old_dsc_cfg;
-                       stream->timing.flags.DSC = old_dsc_enabled;
+               /* Use temporarry context for validating new DSC config */
+               struct dc_state *dsc_validate_context = dc_create_state(dc);
+
+               if (dsc_validate_context) {
+                       dc_resource_state_copy_construct(dc->current_state, 
dsc_validate_context);
+
+                       stream->timing.dsc_cfg = *update->dsc_config;
+                       stream->timing.flags.DSC = enable_dsc;
+                       if (!dc->res_pool->funcs->validate_bandwidth(dc, 
dsc_validate_context, true)) {
+                               stream->timing.dsc_cfg = old_dsc_cfg;
+                               stream->timing.flags.DSC = old_dsc_enabled;
+                               update->dsc_config = false;
+                       }
+
+                       dc_release_state(dsc_validate_context);
+               } else {
+                       DC_ERROR("Failed to allocate new validate context for 
DSC change\n");
+                       update->dsc_config = false;
                }
        }
 }
-- 
2.24.0

_______________________________________________
amd-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

Reply via email to