Skip to content

Commit 3a0851b

Browse files
lumagAbhinav Kumar
authored andcommitted
drm/msm/dpu: check for overflow in _dpu_crtc_setup_lm_bounds()
Make _dpu_crtc_setup_lm_bounds() check that CRTC width is not overflowing LM requirements. Rename the function accordingly. Fixes: 25fdd59 ("drm/msm: Add SDM845 DPU support") Reviewed-by: Abhinav Kumar <[email protected]> Tested-by: Abhinav Kumar <[email protected]> # sc7280 Signed-off-by: Dmitry Baryshkov <[email protected]> Patchwork: https://patchwork.freedesktop.org/patch/612237/ Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Abhinav Kumar <[email protected]>
1 parent 3ae133b commit 3a0851b

File tree

1 file changed

+13
-4
lines changed

1 file changed

+13
-4
lines changed

drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -711,12 +711,13 @@ void dpu_crtc_complete_commit(struct drm_crtc *crtc)
711711
_dpu_crtc_complete_flip(crtc);
712712
}
713713

714-
static void _dpu_crtc_setup_lm_bounds(struct drm_crtc *crtc,
714+
static int _dpu_crtc_check_and_setup_lm_bounds(struct drm_crtc *crtc,
715715
struct drm_crtc_state *state)
716716
{
717717
struct dpu_crtc_state *cstate = to_dpu_crtc_state(state);
718718
struct drm_display_mode *adj_mode = &state->adjusted_mode;
719719
u32 crtc_split_width = adj_mode->hdisplay / cstate->num_mixers;
720+
struct dpu_kms *dpu_kms = _dpu_crtc_get_kms(crtc);
720721
int i;
721722

722723
for (i = 0; i < cstate->num_mixers; i++) {
@@ -727,7 +728,12 @@ static void _dpu_crtc_setup_lm_bounds(struct drm_crtc *crtc,
727728
r->y2 = adj_mode->vdisplay;
728729

729730
trace_dpu_crtc_setup_lm_bounds(DRMID(crtc), i, r);
731+
732+
if (drm_rect_width(r) > dpu_kms->catalog->caps->max_mixer_width)
733+
return -E2BIG;
730734
}
735+
736+
return 0;
731737
}
732738

733739
static void _dpu_crtc_get_pcc_coeff(struct drm_crtc_state *state,
@@ -803,7 +809,7 @@ static void dpu_crtc_atomic_begin(struct drm_crtc *crtc,
803809

804810
DRM_DEBUG_ATOMIC("crtc%d\n", crtc->base.id);
805811

806-
_dpu_crtc_setup_lm_bounds(crtc, crtc->state);
812+
_dpu_crtc_check_and_setup_lm_bounds(crtc, crtc->state);
807813

808814
/* encoder will trigger pending mask now */
809815
drm_for_each_encoder_mask(encoder, crtc->dev, crtc->state->encoder_mask)
@@ -1189,8 +1195,11 @@ static int dpu_crtc_atomic_check(struct drm_crtc *crtc,
11891195
if (crtc_state->active_changed)
11901196
crtc_state->mode_changed = true;
11911197

1192-
if (cstate->num_mixers)
1193-
_dpu_crtc_setup_lm_bounds(crtc, crtc_state);
1198+
if (cstate->num_mixers) {
1199+
rc = _dpu_crtc_check_and_setup_lm_bounds(crtc, crtc_state);
1200+
if (rc)
1201+
return rc;
1202+
}
11941203

11951204
/* FIXME: move this to dpu_plane_atomic_check? */
11961205
drm_atomic_crtc_state_for_each_plane_state(plane, pstate, crtc_state) {

0 commit comments

Comments
 (0)