From: Xi Zhang <[email protected]> While this is not currently the case, it may be possible that topology for cwb and dsc resource requirements change between mode set in the future.
e.g. when dsc support is added to DisplayPort, dsc may be optionally enabled and disabled between different modes due to bandwidth requirements. Set unassigned resource slots to NULL on topology update to avoid issues in the future. It's good practice to do so anyway. Signed-off-by: Xi Zhang <[email protected]> --- drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c index 0a6be69a3e83..8d2b4d2726f2 100644 --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c @@ -1205,9 +1205,13 @@ static void dpu_encoder_virt_atomic_mode_set(struct drm_encoder *drm_enc, ARRAY_SIZE(hw_pp)); } - for (i = 0; i < num_cwb; i++) { - dpu_enc->hw_cwb[i] = to_dpu_hw_cwb(hw_cwb[i]); - cwb_mask |= BIT(dpu_enc->hw_cwb[i]->idx - CWB_0); + for (i = 0; i < ARRAY_SIZE(dpu_enc->hw_cwb); i++) { + if (i < num_cwb) { + dpu_enc->hw_cwb[i] = to_dpu_hw_cwb(hw_cwb[i]); + cwb_mask |= BIT(dpu_enc->hw_cwb[i]->idx - CWB_0); + } else { + dpu_enc->hw_cwb[i] = NULL; + } } dpu_enc->cwb_mask = cwb_mask; @@ -1215,16 +1219,20 @@ static void dpu_encoder_virt_atomic_mode_set(struct drm_encoder *drm_enc, num_ctl = dpu_rm_get_assigned_resources(&dpu_kms->rm, global_state, drm_enc->crtc, DPU_HW_BLK_CTL, hw_ctl, ARRAY_SIZE(hw_ctl)); - for (i = 0; i < MAX_CHANNELS_PER_ENC; i++) + for (i = 0; i < ARRAY_SIZE(dpu_enc->hw_pp); i++) dpu_enc->hw_pp[i] = i < num_pp ? to_dpu_hw_pingpong(hw_pp[i]) : NULL; num_dsc = dpu_rm_get_assigned_resources(&dpu_kms->rm, global_state, drm_enc->crtc, DPU_HW_BLK_DSC, hw_dsc, ARRAY_SIZE(hw_dsc)); - for (i = 0; i < num_dsc; i++) { - dpu_enc->hw_dsc[i] = to_dpu_hw_dsc(hw_dsc[i]); - dsc_mask |= BIT(dpu_enc->hw_dsc[i]->idx - DSC_0); + for (i = 0; i < ARRAY_SIZE(dpu_enc->hw_dsc); i++) { + if (i < num_dsc) { + dpu_enc->hw_dsc[i] = to_dpu_hw_dsc(hw_dsc[i]); + dsc_mask |= BIT(dpu_enc->hw_dsc[i]->idx - DSC_0); + } else { + dpu_enc->hw_dsc[i] = NULL; + } } dpu_enc->dsc_mask = dsc_mask; -- 2.55.0
