From df50a2009ba8fa3dd1ecb1a8b194399e2787da3d Mon Sep 17 00:00:00 2001 From: Mark Yao Date: Thu, 19 Jan 2017 15:01:03 +0800 Subject: [PATCH] drm/rockchip: fix some warning from smatch check drivers/gpu/drm/rockchip/rockchip_drm_drv.c:489 update_state() warn: variable dereferenced before check 'encoder' (see line 488) drivers/gpu/drm/rockchip/rockchip_drm_drv.c:687 rockchip_register_crtc_funcs() error: buffer overflow 'priv->crtc_funcs' 2 <= 2 drivers/gpu/drm/rockchip/rockchip_drm_drv.c:700 rockchip_unregister_crtc_funcs() error: buffer overflow 'priv->crtc_funcs' 2 <= 2 drivers/gpu/drm/rockchip/rockchip_drm_rga.c:848 rga_probe() warn: passing zero to 'PTR_ERR' drivers/gpu/drm/rockchip/rockchip_drm_vop.c:597 vop_csc_setup() warn: variable dereferenced before check 'y2r_table' (see line 578) drivers/gpu/drm/rockchip/rockchip_drm_vop.c:1059 vop_plane_atomic_update() warn: variable dereferenced before check 'crtc' (see line 1041) drivers/gpu/drm/rockchip/rockchip_lvds.c:88 lvds_name_to_format() error: strncmp() '"vesa"' too small (5 vs 6) I don't konw how to fix following error, maybe rga owner can fix it. drivers/gpu/drm/rockchip/rockchip_drm_rga.c:174 rga_alloc_dma_buf_for_cmdlist() error: buffer overflow 'cmdlist->data' 64 <= 64 Change-Id: I41cd098dbd2f311d01b4e84cf0d51598264c8e31 Signed-off-by: Mark Yao --- drivers/gpu/drm/rockchip/rockchip_drm_drv.c | 8 +++++--- drivers/gpu/drm/rockchip/rockchip_drm_rga.c | 2 +- drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 10 ++++++---- drivers/gpu/drm/rockchip/rockchip_lvds.c | 2 +- 4 files changed, 13 insertions(+), 9 deletions(-) diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c index 2da8f030fcd7..59605f9056af 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c @@ -485,8 +485,10 @@ static int update_state(struct drm_device *drm_dev, !connector_helper_funcs->best_encoder) return -ENXIO; encoder = connector_helper_funcs->best_encoder(connector); + if (!encoder) + return -ENXIO; encoder_helper_funcs = encoder->helper_private; - if (!encoder || !encoder_helper_funcs->atomic_check) + if (!encoder_helper_funcs->atomic_check) return -ENXIO; ret = encoder_helper_funcs->atomic_check(encoder, crtc->state, conn_state); @@ -681,7 +683,7 @@ int rockchip_register_crtc_funcs(struct drm_crtc *crtc, int pipe = drm_crtc_index(crtc); struct rockchip_drm_private *priv = crtc->dev->dev_private; - if (pipe > ROCKCHIP_MAX_CRTC) + if (pipe >= ROCKCHIP_MAX_CRTC) return -EINVAL; priv->crtc_funcs[pipe] = crtc_funcs; @@ -694,7 +696,7 @@ void rockchip_unregister_crtc_funcs(struct drm_crtc *crtc) int pipe = drm_crtc_index(crtc); struct rockchip_drm_private *priv = crtc->dev->dev_private; - if (pipe > ROCKCHIP_MAX_CRTC) + if (pipe >= ROCKCHIP_MAX_CRTC) return; priv->crtc_funcs[pipe] = NULL; diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_rga.c b/drivers/gpu/drm/rockchip/rockchip_drm_rga.c index 4334c220c94f..441194867fa6 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_rga.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_rga.c @@ -845,7 +845,7 @@ static int rga_probe(struct platform_device *pdev) rga->rga_workq = create_singlethread_workqueue("rga"); if (!rga->rga_workq) { dev_err(rga->dev, "failed to create workqueue\n"); - ret = PTR_ERR(rga->rga_workq); + ret = -ENOMEM; goto err_destroy_slab; } diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c index a879bb79cb48..6a12e8444ed1 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c @@ -594,14 +594,13 @@ static int vop_csc_setup(const struct vop_csc_table *csc_table, *y2r_table = csc_table->y2r_bt2020; if (input_csc == CSC_BT2020) *r2r_table = csc_table->r2r_bt2020_to_bt709; - if (!is_input_yuv || y2r_table) { + if (!is_input_yuv || *y2r_table) { if (output_csc == CSC_BT709) *r2y_table = csc_table->r2y_bt709; else *r2y_table = csc_table->r2y_bt601; } } - } else { if (!is_input_yuv) return 0; @@ -1034,8 +1033,8 @@ static void vop_plane_atomic_update(struct drm_plane *plane, struct drm_crtc *crtc = state->crtc; struct vop_win *win = to_vop_win(plane); struct vop_plane_state *vop_plane_state = to_vop_plane_state(state); - struct rockchip_crtc_state *s = to_rockchip_crtc_state(crtc->state); - struct vop *vop = to_vop(state->crtc); + struct rockchip_crtc_state *s; + struct vop *vop; struct drm_framebuffer *fb = state->fb; unsigned int actual_w, actual_h; unsigned int dsp_stx, dsp_sty; @@ -1074,6 +1073,9 @@ static void vop_plane_atomic_update(struct drm_plane *plane, ymirror = !!(state->rotation & BIT(DRM_REFLECT_Y)); xmirror = !!(state->rotation & BIT(DRM_REFLECT_X)); + vop = to_vop(state->crtc); + s = to_rockchip_crtc_state(crtc->state); + spin_lock(&vop->reg_lock); VOP_WIN_SET(vop, win, xmirror, xmirror); diff --git a/drivers/gpu/drm/rockchip/rockchip_lvds.c b/drivers/gpu/drm/rockchip/rockchip_lvds.c index e0eb524d0205..aa0c49a3b90d 100644 --- a/drivers/gpu/drm/rockchip/rockchip_lvds.c +++ b/drivers/gpu/drm/rockchip/rockchip_lvds.c @@ -85,7 +85,7 @@ static inline int lvds_name_to_format(const char *s) if (strncmp(s, "jeida", 6) == 0) return LVDS_FORMAT_JEIDA; - else if (strncmp(s, "vesa", 6) == 0) + else if (strncmp(s, "vesa", 5) == 0) return LVDS_FORMAT_VESA; return -EINVAL; -- 2.34.1