diff options
Diffstat (limited to 'drivers/gpu/drm/vmwgfx/vmwgfx_drv.c')
-rw-r--r-- | drivers/gpu/drm/vmwgfx/vmwgfx_drv.c | 34 |
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 | ||
485 | out_no_irq: | 491 | out_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); | ||
496 | out_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 | } |
491 | out_no_fifo: | 502 | out_no_fifo: |
492 | vmw_overlay_close(dev_priv); | ||
493 | vmw_kms_close(dev_priv); | ||
494 | out_no_kms: | ||
495 | vmw_fence_manager_takedown(dev_priv->fman); | 503 | vmw_fence_manager_takedown(dev_priv->fman); |
496 | out_no_fman: | 504 | out_no_fman: |
497 | if (dev_priv->stealth) | 505 | if (dev_priv->stealth) |