aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorBhuvanachandra Pinninti <BhuvanaChandra.Pinninti@amd.com>2026-06-22 16:12:07 +0530
committerAlex Deucher <alexander.deucher@amd.com>2026-07-14 19:12:35 -0400
commit5a22cc7c724dc4ced818b2eae1db7433f467a761 (patch)
tree2d7c673c7b1ceaa9f3d03b890b10a942d81717d6
parentdrm/amd/display: update memclk clock table read for dcn42 (diff)
drm/amd/display: Fix dc_stream_remove_writeback dropping wrong writeback entries.
[why] The matching entry was disabled but still copied during compaction, so a removed pipe could survive and overwrite a valid entry, leaving num_wb_info wrong. [how] Skip every entry matching dwb_pipe_inst and compact only survivors. Covered by test_dc_stream_writeback_drc_and_remove.And added new test cases for coverage. Reviewed-by: Ilya Bakoulin <ilya.bakoulin@amd.com> Signed-off-by: Bhuvanachandra Pinninti <BhuvanaChandra.Pinninti@amd.com> Signed-off-by: George Zhang <george.zhang@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r--drivers/gpu/drm/amd/display/dc/core/dc_stream.c21
1 files changed, 9 insertions, 12 deletions
diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_stream.c b/drivers/gpu/drm/amd/display/dc/core/dc_stream.c
index 7666cdc78f4e..dbc12640b01c 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc_stream.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc_stream.c
@@ -720,20 +720,17 @@ bool dc_stream_remove_writeback(struct dc *dc,
return false;
}
- /* remove writeback info for disabled writeback pipes from stream */
+ /* remove writeback info for the requested writeback pipe from stream */
for (i = 0, j = 0; i < stream->num_wb_info; i++) {
- if (stream->writeback_info[i].wb_enabled) {
-
- if (stream->writeback_info[i].dwb_pipe_inst == dwb_pipe_inst)
- stream->writeback_info[i].wb_enabled = false;
+ /* drop every entry that targets the pipe being removed */
+ if (stream->writeback_info[i].dwb_pipe_inst == dwb_pipe_inst)
+ continue;
- /* trim the array */
- if (j < i) {
- memcpy(&stream->writeback_info[j], &stream->writeback_info[i],
- sizeof(struct dc_writeback_info));
- j++;
- }
- }
+ /* keep this entry, compacting it down when earlier entries were removed */
+ if (j != i)
+ memcpy(&stream->writeback_info[j], &stream->writeback_info[i],
+ sizeof(struct dc_writeback_info));
+ j++;
}
stream->num_wb_info = j;