Skip to content

Commit

Permalink
vmwgfx: Fix display system init & close functions
Browse files Browse the repository at this point in the history
Make sure we null the display private, make sure we catch and
handle vblank failing to init and don't call vblank_cleanup if
we haven't initialized the display system.

Signed-off-by: Jakob Bornecrantz <jakob@vmware.com>
Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
  • Loading branch information
Jakob Bornecrantz authored and Dave Airlie committed Oct 18, 2011
1 parent b07759b commit 60a16a3
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 9 deletions.
30 changes: 22 additions & 8 deletions drivers/gpu/drm/vmwgfx/vmwgfx_ldu.c
Original file line number Diff line number Diff line change
Expand Up @@ -380,29 +380,43 @@ int vmw_kms_init_legacy_display_system(struct vmw_private *dev_priv)
dev_priv->ldu_priv->last_num_active = 0;
dev_priv->ldu_priv->fb = NULL;

drm_mode_create_dirty_info_property(dev_priv->dev);
/* for old hardware without multimon only enable one display */
if (dev_priv->capabilities & SVGA_CAP_MULTIMON)
ret = drm_vblank_init(dev, VMWGFX_NUM_DISPLAY_UNITS);
else
ret = drm_vblank_init(dev, 1);
if (ret != 0)
goto err_free;

if (dev_priv->capabilities & SVGA_CAP_MULTIMON) {
ret = drm_mode_create_dirty_info_property(dev);
if (ret != 0)
goto err_vblank_cleanup;

if (dev_priv->capabilities & SVGA_CAP_MULTIMON)
for (i = 0; i < VMWGFX_NUM_DISPLAY_UNITS; ++i)
vmw_ldu_init(dev_priv, i);
ret = drm_vblank_init(dev, VMWGFX_NUM_DISPLAY_UNITS);
} else {
/* for old hardware without multimon only enable one display */
else
vmw_ldu_init(dev_priv, 0);
ret = drm_vblank_init(dev, 1);
}

return 0;

err_vblank_cleanup:
drm_vblank_cleanup(dev);
err_free:
kfree(dev_priv->ldu_priv);
dev_priv->ldu_priv = NULL;
return ret;
}

int vmw_kms_close_legacy_display_system(struct vmw_private *dev_priv)
{
struct drm_device *dev = dev_priv->dev;

drm_vblank_cleanup(dev);
if (!dev_priv->ldu_priv)
return -ENOSYS;

drm_vblank_cleanup(dev);

BUG_ON(!list_empty(&dev_priv->ldu_priv->active));

kfree(dev_priv->ldu_priv);
Expand Down
4 changes: 3 additions & 1 deletion drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c
Original file line number Diff line number Diff line change
Expand Up @@ -545,6 +545,7 @@ int vmw_kms_init_screen_object_display(struct vmw_private *dev_priv)
drm_vblank_cleanup(dev);
err_free:
kfree(dev_priv->sou_priv);
dev_priv->sou_priv = NULL;
err_no_mem:
return ret;
}
Expand All @@ -553,10 +554,11 @@ int vmw_kms_close_screen_object_display(struct vmw_private *dev_priv)
{
struct drm_device *dev = dev_priv->dev;

drm_vblank_cleanup(dev);
if (!dev_priv->sou_priv)
return -ENOSYS;

drm_vblank_cleanup(dev);

if (!list_empty(&dev_priv->sou_priv->active))
DRM_ERROR("Still have active outputs when unloading driver");

Expand Down

0 comments on commit 60a16a3

Please sign in to comment.