aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/vmwgfx/vmwgfx_drv.c')
-rw-r--r--drivers/gpu/drm/vmwgfx/vmwgfx_drv.c34
1 files changed, 21 insertions, 13 deletions
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
index d4829cbf326..d1e13258996 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
@@ -451,22 +451,28 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset)
451 dev_priv->fman = vmw_fence_manager_init(dev_priv); 451 dev_priv->fman = vmw_fence_manager_init(dev_priv);
452 if (unlikely(dev_priv->fman == NULL)) 452 if (unlikely(dev_priv->fman == NULL))
453 goto out_no_fman; 453 goto out_no_fman;
454
455 /* Need to start the fifo to check if we can do screen objects */
456 ret = vmw_3d_resource_inc(dev_priv, true);
457 if (unlikely(ret != 0))
458 goto out_no_fifo;
459 vmw_kms_save_vga(dev_priv);
460 DRM_INFO("%s", vmw_fifo_have_3d(dev_priv) ?
461 "Detected device 3D availability.\n" :
462 "Detected no device 3D availability.\n");
463
464 /* Start kms and overlay systems, needs fifo. */
454 ret = vmw_kms_init(dev_priv); 465 ret = vmw_kms_init(dev_priv);
455 if (unlikely(ret != 0)) 466 if (unlikely(ret != 0))
456 goto out_no_kms; 467 goto out_no_kms;
457 vmw_overlay_init(dev_priv); 468 vmw_overlay_init(dev_priv);
469
470 /* We might be done with the fifo now */
458 if (dev_priv->enable_fb) { 471 if (dev_priv->enable_fb) {
459 ret = vmw_3d_resource_inc(dev_priv, false);
460 if (unlikely(ret != 0))
461 goto out_no_fifo;
462 vmw_kms_save_vga(dev_priv);
463 vmw_fb_init(dev_priv); 472 vmw_fb_init(dev_priv);
464 DRM_INFO("%s", vmw_fifo_have_3d(dev_priv) ?
465 "Detected device 3D availability.\n" :
466 "Detected no device 3D availability.\n");
467 } else { 473 } else {
468 DRM_INFO("Delayed 3D detection since we're not " 474 vmw_kms_restore_vga(dev_priv);
469 "running the device in SVGA mode yet.\n"); 475 vmw_3d_resource_dec(dev_priv, true);
470 } 476 }
471 477
472 if (dev_priv->capabilities & SVGA_CAP_IRQMASK) { 478 if (dev_priv->capabilities & SVGA_CAP_IRQMASK) {
@@ -483,15 +489,17 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset)
483 return 0; 489 return 0;
484 490
485out_no_irq: 491out_no_irq:
486 if (dev_priv->enable_fb) { 492 if (dev_priv->enable_fb)
487 vmw_fb_close(dev_priv); 493 vmw_fb_close(dev_priv);
494 vmw_overlay_close(dev_priv);
495 vmw_kms_close(dev_priv);
496out_no_kms:
497 /* We still have a 3D resource reference held */
498 if (dev_priv->enable_fb) {
488 vmw_kms_restore_vga(dev_priv); 499 vmw_kms_restore_vga(dev_priv);
489 vmw_3d_resource_dec(dev_priv, false); 500 vmw_3d_resource_dec(dev_priv, false);
490 } 501 }
491out_no_fifo: 502out_no_fifo:
492 vmw_overlay_close(dev_priv);
493 vmw_kms_close(dev_priv);
494out_no_kms:
495 vmw_fence_manager_takedown(dev_priv->fman); 503 vmw_fence_manager_takedown(dev_priv->fman);
496out_no_fman: 504out_no_fman:
497 if (dev_priv->stealth) 505 if (dev_priv->stealth)