diff options
| author | Dave Airlie <airlied@redhat.com> | 2019-03-25 16:32:02 -0400 |
|---|---|---|
| committer | Dave Airlie <airlied@redhat.com> | 2019-03-25 16:32:09 -0400 |
| commit | de53874a0f704a2b98c960d88b7bf91d2cf7b3ce (patch) | |
| tree | 5e4672d9d57b6be06e80844e1b6c65d175ba783d | |
| parent | a51143001d9e0683ab6f7968a516fc9243527e44 (diff) | |
| parent | 3d565a21f2ce1f37479e91914734478c39b5c6fc (diff) | |
Merge tag 'drm-misc-fixes-2019-03-25' of git://anongit.freedesktop.org/drm/drm-misc into drm-fixes
- A bunch of fixes to cleanup path in meson
- Fix the DMT TDMS clock filtering on meson
- Fix an issue with NV12 buffers on rockchip when scaling is active
- Fix a couple of use-after-free
Signed-off-by: Dave Airlie <airlied@redhat.com>
From: Maxime Ripard <maxime.ripard@bootlin.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20190325104523.obnfelgvaglyhe5e@flea
| -rw-r--r-- | drivers/gpu/drm/meson/meson_drv.c | 9 | ||||
| -rw-r--r-- | drivers/gpu/drm/meson/meson_dw_hdmi.c | 3 | ||||
| -rw-r--r-- | drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 18 | ||||
| -rw-r--r-- | drivers/gpu/drm/vgem/vgem_drv.c | 6 | ||||
| -rw-r--r-- | drivers/gpu/drm/vkms/vkms_gem.c | 5 |
5 files changed, 25 insertions, 16 deletions
diff --git a/drivers/gpu/drm/meson/meson_drv.c b/drivers/gpu/drm/meson/meson_drv.c index 2281ed3eb774..8a4ebcb6405c 100644 --- a/drivers/gpu/drm/meson/meson_drv.c +++ b/drivers/gpu/drm/meson/meson_drv.c | |||
| @@ -337,12 +337,14 @@ static int meson_drv_bind_master(struct device *dev, bool has_components) | |||
| 337 | 337 | ||
| 338 | ret = drm_dev_register(drm, 0); | 338 | ret = drm_dev_register(drm, 0); |
| 339 | if (ret) | 339 | if (ret) |
| 340 | goto free_drm; | 340 | goto uninstall_irq; |
| 341 | 341 | ||
| 342 | drm_fbdev_generic_setup(drm, 32); | 342 | drm_fbdev_generic_setup(drm, 32); |
| 343 | 343 | ||
| 344 | return 0; | 344 | return 0; |
| 345 | 345 | ||
| 346 | uninstall_irq: | ||
| 347 | drm_irq_uninstall(drm); | ||
| 346 | free_drm: | 348 | free_drm: |
| 347 | drm_dev_put(drm); | 349 | drm_dev_put(drm); |
| 348 | 350 | ||
| @@ -356,8 +358,8 @@ static int meson_drv_bind(struct device *dev) | |||
| 356 | 358 | ||
| 357 | static void meson_drv_unbind(struct device *dev) | 359 | static void meson_drv_unbind(struct device *dev) |
| 358 | { | 360 | { |
| 359 | struct drm_device *drm = dev_get_drvdata(dev); | 361 | struct meson_drm *priv = dev_get_drvdata(dev); |
| 360 | struct meson_drm *priv = drm->dev_private; | 362 | struct drm_device *drm = priv->drm; |
| 361 | 363 | ||
| 362 | if (priv->canvas) { | 364 | if (priv->canvas) { |
| 363 | meson_canvas_free(priv->canvas, priv->canvas_id_osd1); | 365 | meson_canvas_free(priv->canvas, priv->canvas_id_osd1); |
| @@ -367,6 +369,7 @@ static void meson_drv_unbind(struct device *dev) | |||
| 367 | } | 369 | } |
| 368 | 370 | ||
| 369 | drm_dev_unregister(drm); | 371 | drm_dev_unregister(drm); |
| 372 | drm_irq_uninstall(drm); | ||
| 370 | drm_kms_helper_poll_fini(drm); | 373 | drm_kms_helper_poll_fini(drm); |
| 371 | drm_mode_config_cleanup(drm); | 374 | drm_mode_config_cleanup(drm); |
| 372 | drm_dev_put(drm); | 375 | drm_dev_put(drm); |
diff --git a/drivers/gpu/drm/meson/meson_dw_hdmi.c b/drivers/gpu/drm/meson/meson_dw_hdmi.c index e28814f4ea6c..563953ec6ad0 100644 --- a/drivers/gpu/drm/meson/meson_dw_hdmi.c +++ b/drivers/gpu/drm/meson/meson_dw_hdmi.c | |||
| @@ -569,7 +569,8 @@ dw_hdmi_mode_valid(struct drm_connector *connector, | |||
| 569 | DRM_DEBUG_DRIVER("Modeline " DRM_MODE_FMT "\n", DRM_MODE_ARG(mode)); | 569 | DRM_DEBUG_DRIVER("Modeline " DRM_MODE_FMT "\n", DRM_MODE_ARG(mode)); |
| 570 | 570 | ||
| 571 | /* If sink max TMDS clock, we reject the mode */ | 571 | /* If sink max TMDS clock, we reject the mode */ |
| 572 | if (mode->clock > connector->display_info.max_tmds_clock) | 572 | if (connector->display_info.max_tmds_clock && |
| 573 | mode->clock > connector->display_info.max_tmds_clock) | ||
| 573 | return MODE_BAD; | 574 | return MODE_BAD; |
| 574 | 575 | ||
| 575 | /* Check against non-VIC supported modes */ | 576 | /* Check against non-VIC supported modes */ |
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c index c7d4c6073ea5..0d4ade9d4722 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c | |||
| @@ -541,6 +541,18 @@ static void vop_core_clks_disable(struct vop *vop) | |||
| 541 | clk_disable(vop->hclk); | 541 | clk_disable(vop->hclk); |
| 542 | } | 542 | } |
| 543 | 543 | ||
| 544 | static void vop_win_disable(struct vop *vop, const struct vop_win_data *win) | ||
| 545 | { | ||
| 546 | if (win->phy->scl && win->phy->scl->ext) { | ||
| 547 | VOP_SCL_SET_EXT(vop, win, yrgb_hor_scl_mode, SCALE_NONE); | ||
| 548 | VOP_SCL_SET_EXT(vop, win, yrgb_ver_scl_mode, SCALE_NONE); | ||
| 549 | VOP_SCL_SET_EXT(vop, win, cbcr_hor_scl_mode, SCALE_NONE); | ||
| 550 | VOP_SCL_SET_EXT(vop, win, cbcr_ver_scl_mode, SCALE_NONE); | ||
| 551 | } | ||
| 552 | |||
| 553 | VOP_WIN_SET(vop, win, enable, 0); | ||
| 554 | } | ||
| 555 | |||
| 544 | static int vop_enable(struct drm_crtc *crtc) | 556 | static int vop_enable(struct drm_crtc *crtc) |
| 545 | { | 557 | { |
| 546 | struct vop *vop = to_vop(crtc); | 558 | struct vop *vop = to_vop(crtc); |
| @@ -586,7 +598,7 @@ static int vop_enable(struct drm_crtc *crtc) | |||
| 586 | struct vop_win *vop_win = &vop->win[i]; | 598 | struct vop_win *vop_win = &vop->win[i]; |
| 587 | const struct vop_win_data *win = vop_win->data; | 599 | const struct vop_win_data *win = vop_win->data; |
| 588 | 600 | ||
| 589 | VOP_WIN_SET(vop, win, enable, 0); | 601 | vop_win_disable(vop, win); |
| 590 | } | 602 | } |
| 591 | spin_unlock(&vop->reg_lock); | 603 | spin_unlock(&vop->reg_lock); |
| 592 | 604 | ||
| @@ -735,7 +747,7 @@ static void vop_plane_atomic_disable(struct drm_plane *plane, | |||
| 735 | 747 | ||
| 736 | spin_lock(&vop->reg_lock); | 748 | spin_lock(&vop->reg_lock); |
| 737 | 749 | ||
| 738 | VOP_WIN_SET(vop, win, enable, 0); | 750 | vop_win_disable(vop, win); |
| 739 | 751 | ||
| 740 | spin_unlock(&vop->reg_lock); | 752 | spin_unlock(&vop->reg_lock); |
| 741 | } | 753 | } |
| @@ -1622,7 +1634,7 @@ static int vop_initial(struct vop *vop) | |||
| 1622 | int channel = i * 2 + 1; | 1634 | int channel = i * 2 + 1; |
| 1623 | 1635 | ||
| 1624 | VOP_WIN_SET(vop, win, channel, (channel + 1) << 4 | channel); | 1636 | VOP_WIN_SET(vop, win, channel, (channel + 1) << 4 | channel); |
| 1625 | VOP_WIN_SET(vop, win, enable, 0); | 1637 | vop_win_disable(vop, win); |
| 1626 | VOP_WIN_SET(vop, win, gate, 1); | 1638 | VOP_WIN_SET(vop, win, gate, 1); |
| 1627 | } | 1639 | } |
| 1628 | 1640 | ||
diff --git a/drivers/gpu/drm/vgem/vgem_drv.c b/drivers/gpu/drm/vgem/vgem_drv.c index 5930facd6d2d..11a8f99ba18c 100644 --- a/drivers/gpu/drm/vgem/vgem_drv.c +++ b/drivers/gpu/drm/vgem/vgem_drv.c | |||
| @@ -191,13 +191,9 @@ static struct drm_gem_object *vgem_gem_create(struct drm_device *dev, | |||
| 191 | ret = drm_gem_handle_create(file, &obj->base, handle); | 191 | ret = drm_gem_handle_create(file, &obj->base, handle); |
| 192 | drm_gem_object_put_unlocked(&obj->base); | 192 | drm_gem_object_put_unlocked(&obj->base); |
| 193 | if (ret) | 193 | if (ret) |
| 194 | goto err; | 194 | return ERR_PTR(ret); |
| 195 | 195 | ||
| 196 | return &obj->base; | 196 | return &obj->base; |
| 197 | |||
| 198 | err: | ||
| 199 | __vgem_gem_destroy(obj); | ||
| 200 | return ERR_PTR(ret); | ||
| 201 | } | 197 | } |
| 202 | 198 | ||
| 203 | static int vgem_gem_dumb_create(struct drm_file *file, struct drm_device *dev, | 199 | static int vgem_gem_dumb_create(struct drm_file *file, struct drm_device *dev, |
diff --git a/drivers/gpu/drm/vkms/vkms_gem.c b/drivers/gpu/drm/vkms/vkms_gem.c index 138b0bb325cf..69048e73377d 100644 --- a/drivers/gpu/drm/vkms/vkms_gem.c +++ b/drivers/gpu/drm/vkms/vkms_gem.c | |||
| @@ -111,11 +111,8 @@ struct drm_gem_object *vkms_gem_create(struct drm_device *dev, | |||
| 111 | 111 | ||
| 112 | ret = drm_gem_handle_create(file, &obj->gem, handle); | 112 | ret = drm_gem_handle_create(file, &obj->gem, handle); |
| 113 | drm_gem_object_put_unlocked(&obj->gem); | 113 | drm_gem_object_put_unlocked(&obj->gem); |
| 114 | if (ret) { | 114 | if (ret) |
| 115 | drm_gem_object_release(&obj->gem); | ||
| 116 | kfree(obj); | ||
| 117 | return ERR_PTR(ret); | 115 | return ERR_PTR(ret); |
| 118 | } | ||
| 119 | 116 | ||
| 120 | return &obj->gem; | 117 | return &obj->gem; |
| 121 | } | 118 | } |
