Skip to content

Commit

Permalink
drm/i915: Split device release from unload
Browse files Browse the repository at this point in the history
We may need to keep our memory management alive after we have unloaded
the physical pci device. For example, if we have exported an object via
dmabuf, that will keep the device around but the pci device may be
removed before the dmabuf itself is released, use of the pci hardware
will be revoked, but the memory and object management needs to persist
for the dmabuf.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/20170210163523.17533-1-chris@chris-wilson.co.uk
  • Loading branch information
Chris Wilson committed Feb 10, 2017
1 parent 317eaa9 commit cad3688
Showing 1 changed file with 15 additions and 5 deletions.
20 changes: 15 additions & 5 deletions drivers/gpu/drm/i915/i915_drv.c
Original file line number Diff line number Diff line change
Expand Up @@ -1231,16 +1231,15 @@ int i915_driver_load(struct pci_dev *pdev, const struct pci_device_id *ent)
ret = drm_dev_init(&dev_priv->drm, &driver, &pdev->dev);
if (ret) {
DRM_DEV_ERROR(&pdev->dev, "allocation failed\n");
kfree(dev_priv);
return ret;
goto out_free;
}

dev_priv->drm.pdev = pdev;
dev_priv->drm.dev_private = dev_priv;

ret = pci_enable_device(pdev);
if (ret)
goto out_free_priv;
goto out_fini;

pci_set_drvdata(pdev, &dev_priv->drm);

Expand Down Expand Up @@ -1304,9 +1303,11 @@ int i915_driver_load(struct pci_dev *pdev, const struct pci_device_id *ent)
i915_driver_cleanup_early(dev_priv);
out_pci_disable:
pci_disable_device(pdev);
out_free_priv:
out_fini:
i915_load_error(dev_priv, "Device initialization failed (%d)\n", ret);
drm_dev_unref(&dev_priv->drm);
drm_dev_fini(&dev_priv->drm);
out_free:
kfree(dev_priv);
return ret;
}

Expand Down Expand Up @@ -1385,8 +1386,16 @@ void i915_driver_unload(struct drm_device *dev)
i915_driver_cleanup_mmio(dev_priv);

intel_display_power_put(dev_priv, POWER_DOMAIN_INIT);
}

static void i915_driver_release(struct drm_device *dev)
{
struct drm_i915_private *dev_priv = to_i915(dev);

i915_driver_cleanup_early(dev_priv);
drm_dev_fini(&dev_priv->drm);

kfree(dev_priv);
}

static int i915_driver_open(struct drm_device *dev, struct drm_file *file)
Expand Down Expand Up @@ -2630,6 +2639,7 @@ static struct drm_driver driver = {
.driver_features =
DRIVER_HAVE_IRQ | DRIVER_IRQ_SHARED | DRIVER_GEM | DRIVER_PRIME |
DRIVER_RENDER | DRIVER_MODESET | DRIVER_ATOMIC,
.release = i915_driver_release,
.open = i915_driver_open,
.lastclose = i915_driver_lastclose,
.preclose = i915_driver_preclose,
Expand Down

0 comments on commit cad3688

Please sign in to comment.