Patch "drm/msm: Avoid div-by-zero in dpu_crtc_atomic_check()" has been added to the 5.9-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    drm/msm: Avoid div-by-zero in dpu_crtc_atomic_check()

to the 5.9-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     drm-msm-avoid-div-by-zero-in-dpu_crtc_atomic_check.patch
and it can be found in the queue-5.9 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 60b9576199cacb2135a39a887b8e3b4d62c874b5
Author: Stephen Boyd <swboyd@xxxxxxxxxxxx>
Date:   Tue Sep 1 14:59:41 2020 -0700

    drm/msm: Avoid div-by-zero in dpu_crtc_atomic_check()
    
    [ Upstream commit 22f760941844dbcee6ee446e1896532f6dff01ef ]
    
    The cstate->num_mixers member is only set to a non-zero value once
    dpu_encoder_virt_mode_set() is called, but the atomic check function can
    be called by userspace before that. Let's avoid the div-by-zero here and
    inside _dpu_crtc_setup_lm_bounds() by skipping this part of the atomic
    check if dpu_encoder_virt_mode_set() hasn't been called yet. This fixes
    an UBSAN warning:
    
     UBSAN: Undefined behaviour in drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c:860:31
     division by zero
     CPU: 7 PID: 409 Comm: frecon Tainted: G S                5.4.31 #128
     Hardware name: Google Trogdor (rev0) (DT)
     Call trace:
      dump_backtrace+0x0/0x14c
      show_stack+0x20/0x2c
      dump_stack+0xa0/0xd8
      __ubsan_handle_divrem_overflow+0xec/0x110
      dpu_crtc_atomic_check+0x97c/0x9d4
      drm_atomic_helper_check_planes+0x160/0x1c8
      drm_atomic_helper_check+0x54/0xbc
      drm_atomic_check_only+0x6a8/0x880
      drm_atomic_commit+0x20/0x5c
      drm_atomic_helper_set_config+0x98/0xa0
      drm_mode_setcrtc+0x308/0x5dc
      drm_ioctl_kernel+0x9c/0x114
      drm_ioctl+0x2ac/0x4b0
      drm_compat_ioctl+0xe8/0x13c
      __arm64_compat_sys_ioctl+0x184/0x324
      el0_svc_common+0xa4/0x154
      el0_svc_compat_handler+0x
    
    Cc: Abhinav Kumar <abhinavk@xxxxxxxxxxxxxx>
    Cc: Jeykumar Sankaran <jsanka@xxxxxxxxxxxxxx>
    Cc: Jordan Crouse <jcrouse@xxxxxxxxxxxxxx>
    Cc: Sean Paul <seanpaul@xxxxxxxxxxxx>
    Fixes: 25fdd5933e4c ("drm/msm: Add SDM845 DPU support")
    Signed-off-by: Stephen Boyd <swboyd@xxxxxxxxxxxx>
    Reviewed-by: Abhinav Kumar <abhinavk@xxxxxxxxxxxxxx>
    Tested-by: Sai Prakash Ranjan <saiprakash.ranjan@xxxxxxxxxxxxxx>
    Signed-off-by: Rob Clark <robdclark@xxxxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
index c2729f71e2fa7..f9cb1e0da1a59 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c
@@ -881,7 +881,7 @@ static int dpu_crtc_atomic_check(struct drm_crtc *crtc,
 	struct drm_plane *plane;
 	struct drm_display_mode *mode;
 
-	int cnt = 0, rc = 0, mixer_width, i, z_pos;
+	int cnt = 0, rc = 0, mixer_width = 0, i, z_pos;
 
 	struct dpu_multirect_plane_states multirect_plane[DPU_STAGE_MAX * 2];
 	int multirect_count = 0;
@@ -914,9 +914,11 @@ static int dpu_crtc_atomic_check(struct drm_crtc *crtc,
 
 	memset(pipe_staged, 0, sizeof(pipe_staged));
 
-	mixer_width = mode->hdisplay / cstate->num_mixers;
+	if (cstate->num_mixers) {
+		mixer_width = mode->hdisplay / cstate->num_mixers;
 
-	_dpu_crtc_setup_lm_bounds(crtc, state);
+		_dpu_crtc_setup_lm_bounds(crtc, state);
+	}
 
 	crtc_rect.x2 = mode->hdisplay;
 	crtc_rect.y2 = mode->vdisplay;



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux