aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/i915/i915_dma.c19
1 files changed, 15 insertions, 4 deletions
diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c
index d35de1b9a2dd..2b9725f7bf2c 100644
--- a/drivers/gpu/drm/i915/i915_dma.c
+++ b/drivers/gpu/drm/i915/i915_dma.c
@@ -1561,7 +1561,7 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags)
1561 1561
1562 ret = i915_gem_gtt_init(dev); 1562 ret = i915_gem_gtt_init(dev);
1563 if (ret) 1563 if (ret)
1564 goto put_bridge; 1564 goto out_regs;
1565 1565
1566 if (drm_core_check_feature(dev, DRIVER_MODESET)) 1566 if (drm_core_check_feature(dev, DRIVER_MODESET))
1567 i915_kick_out_firmware_fb(dev_priv); 1567 i915_kick_out_firmware_fb(dev_priv);
@@ -1590,7 +1590,7 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags)
1590 aperture_size); 1590 aperture_size);
1591 if (dev_priv->gtt.mappable == NULL) { 1591 if (dev_priv->gtt.mappable == NULL) {
1592 ret = -EIO; 1592 ret = -EIO;
1593 goto out_rmmap; 1593 goto out_gtt;
1594 } 1594 }
1595 1595
1596 dev_priv->gtt.mtrr = arch_phys_wc_add(dev_priv->gtt.mappable_base, 1596 dev_priv->gtt.mtrr = arch_phys_wc_add(dev_priv->gtt.mappable_base,
@@ -1664,7 +1664,7 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags)
1664 ret = i915_load_modeset_init(dev); 1664 ret = i915_load_modeset_init(dev);
1665 if (ret < 0) { 1665 if (ret < 0) {
1666 DRM_ERROR("failed to init modeset\n"); 1666 DRM_ERROR("failed to init modeset\n");
1667 goto out_gem_unload; 1667 goto out_power_well;
1668 } 1668 }
1669 } else { 1669 } else {
1670 /* Start out suspended in ums mode. */ 1670 /* Start out suspended in ums mode. */
@@ -1684,6 +1684,10 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags)
1684 1684
1685 return 0; 1685 return 0;
1686 1686
1687out_power_well:
1688 if (HAS_POWER_WELL(dev))
1689 i915_remove_power_well(dev);
1690 drm_vblank_cleanup(dev);
1687out_gem_unload: 1691out_gem_unload:
1688 if (dev_priv->mm.inactive_shrinker.scan_objects) 1692 if (dev_priv->mm.inactive_shrinker.scan_objects)
1689 unregister_shrinker(&dev_priv->mm.inactive_shrinker); 1693 unregister_shrinker(&dev_priv->mm.inactive_shrinker);
@@ -1697,12 +1701,17 @@ out_gem_unload:
1697out_mtrrfree: 1701out_mtrrfree:
1698 arch_phys_wc_del(dev_priv->gtt.mtrr); 1702 arch_phys_wc_del(dev_priv->gtt.mtrr);
1699 io_mapping_free(dev_priv->gtt.mappable); 1703 io_mapping_free(dev_priv->gtt.mappable);
1704out_gtt:
1705 list_del(&dev_priv->gtt.base.global_link);
1706 drm_mm_takedown(&dev_priv->gtt.base.mm);
1700 dev_priv->gtt.base.cleanup(&dev_priv->gtt.base); 1707 dev_priv->gtt.base.cleanup(&dev_priv->gtt.base);
1701out_rmmap: 1708out_regs:
1702 pci_iounmap(dev->pdev, dev_priv->regs); 1709 pci_iounmap(dev->pdev, dev_priv->regs);
1703put_bridge: 1710put_bridge:
1704 pci_dev_put(dev_priv->bridge_dev); 1711 pci_dev_put(dev_priv->bridge_dev);
1705free_priv: 1712free_priv:
1713 if (dev_priv->slab)
1714 kmem_cache_destroy(dev_priv->slab);
1706 kfree(dev_priv); 1715 kfree(dev_priv);
1707 return ret; 1716 return ret;
1708} 1717}
@@ -1793,6 +1802,8 @@ int i915_driver_unload(struct drm_device *dev)
1793 WARN_ON(!list_empty(&dev_priv->vm_list)); 1802 WARN_ON(!list_empty(&dev_priv->vm_list));
1794 drm_mm_takedown(&dev_priv->gtt.base.mm); 1803 drm_mm_takedown(&dev_priv->gtt.base.mm);
1795 1804
1805 drm_vblank_cleanup(dev);
1806
1796 intel_teardown_gmbus(dev); 1807 intel_teardown_gmbus(dev);
1797 intel_teardown_mchbar(dev); 1808 intel_teardown_mchbar(dev);
1798 1809