diff options
-rw-r--r-- | drivers/gpu/drm/i915/i915_dma.c | 19 |
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 | ||
1687 | out_power_well: | ||
1688 | if (HAS_POWER_WELL(dev)) | ||
1689 | i915_remove_power_well(dev); | ||
1690 | drm_vblank_cleanup(dev); | ||
1687 | out_gem_unload: | 1691 | out_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: | |||
1697 | out_mtrrfree: | 1701 | out_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); |
1704 | out_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); |
1701 | out_rmmap: | 1708 | out_regs: |
1702 | pci_iounmap(dev->pdev, dev_priv->regs); | 1709 | pci_iounmap(dev->pdev, dev_priv->regs); |
1703 | put_bridge: | 1710 | put_bridge: |
1704 | pci_dev_put(dev_priv->bridge_dev); | 1711 | pci_dev_put(dev_priv->bridge_dev); |
1705 | free_priv: | 1712 | free_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 | ||