Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 56e2ea34 authored by Chris Wilson's avatar Chris Wilson
Browse files

drm/i915: Fix unload after failed initialisation



If modeset init failed we attempted to unload the module, before we
finished setting it up and so triggered various oopses.

Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
parent 374c479b
Loading
Loading
Loading
Loading
+12 −9
Original line number Original line Diff line number Diff line
@@ -1993,7 +1993,7 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags)
	    drm_core_check_feature(dev, DRIVER_MODESET)) {
	    drm_core_check_feature(dev, DRIVER_MODESET)) {
		DRM_ERROR("kernel modesetting requires GEM, disabling driver.\n");
		DRM_ERROR("kernel modesetting requires GEM, disabling driver.\n");
		ret = -ENODEV;
		ret = -ENODEV;
		goto out_iomapfree;
		goto out_workqueue_free;
	}
	}


	dev->driver->get_vblank_counter = i915_get_vblank_counter;
	dev->driver->get_vblank_counter = i915_get_vblank_counter;
@@ -2016,8 +2016,8 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags)
	/* Init HWS */
	/* Init HWS */
	if (!I915_NEED_GFX_HWS(dev)) {
	if (!I915_NEED_GFX_HWS(dev)) {
		ret = i915_init_phys_hws(dev);
		ret = i915_init_phys_hws(dev);
		if (ret != 0)
		if (ret)
			goto out_workqueue_free;
			goto out_gem_unload;
	}
	}


	if (IS_PINEVIEW(dev))
	if (IS_PINEVIEW(dev))
@@ -2044,11 +2044,8 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags)
	dev_priv->trace_irq_seqno = 0;
	dev_priv->trace_irq_seqno = 0;


	ret = drm_vblank_init(dev, I915_NUM_PIPE);
	ret = drm_vblank_init(dev, I915_NUM_PIPE);

	if (ret)
	if (ret) {
		goto out_gem_unload;
		(void) i915_driver_unload(dev);
		return ret;
	}


	/* Start out suspended */
	/* Start out suspended */
	dev_priv->mm.suspended = 1;
	dev_priv->mm.suspended = 1;
@@ -2059,7 +2056,7 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags)
		ret = i915_load_modeset_init(dev);
		ret = i915_load_modeset_init(dev);
		if (ret < 0) {
		if (ret < 0) {
			DRM_ERROR("failed to init modeset\n");
			DRM_ERROR("failed to init modeset\n");
			goto out_workqueue_free;
			goto out_gem_unload;
		}
		}
	}
	}


@@ -2077,6 +2074,12 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags)


	return 0;
	return 0;


out_gem_unload:
	if (dev->pdev->msi_enabled)
		pci_disable_msi(dev->pdev);

	intel_teardown_gmbus(dev);
	intel_teardown_mchbar(dev);
out_workqueue_free:
out_workqueue_free:
	destroy_workqueue(dev_priv->wq);
	destroy_workqueue(dev_priv->wq);
out_iomapfree:
out_iomapfree: