[PATCH 05/11] timeline

Chris Wilson chris at chris-wilson.co.uk
Wed May 18 11:08:47 UTC 2016


---
 drivers/gpu/drm/i915/i915_dma.c    | 12 ++++++++++--
 drivers/gpu/drm/i915/i915_drv.c    |  5 +++++
 drivers/gpu/drm/i915/i915_drv.h    |  4 ++++
 drivers/gpu/drm/i915/intel_fbdev.c |  7 +++++--
 4 files changed, 24 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c
index 65a593ac8148..a2c2ab83c695 100644
--- a/drivers/gpu/drm/i915/i915_dma.c
+++ b/drivers/gpu/drm/i915/i915_dma.c
@@ -1427,11 +1427,13 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags)
 	/* Must be set before calling __i915_printk */
 	dev_priv->dev = dev;
 
+	async_register_domain(&dev_priv->async_domain, false);
+
 	ret = i915_driver_init_early(dev_priv, dev,
 				     (struct intel_device_info *)flags);
 
 	if (ret < 0)
-		goto out_free_priv;
+		goto out_free_timeline;
 
 	intel_runtime_pm_get(dev_priv);
 
@@ -1476,7 +1478,9 @@ out_cleanup_mmio:
 out_runtime_pm_put:
 	intel_runtime_pm_put(dev_priv);
 	i915_driver_cleanup_early(dev_priv);
-out_free_priv:
+out_free_timeline:
+	async_synchronize_full_domain(&dev_priv->async_domain);
+	async_unregister_domain(&dev_priv->async_domain);
 	i915_load_error(dev_priv, "Device initialization failed (%d)\n", ret);
 
 	kfree(dev_priv);
@@ -1543,6 +1547,10 @@ int i915_driver_unload(struct drm_device *dev)
 	intel_display_power_put(dev_priv, POWER_DOMAIN_INIT);
 
 	i915_driver_cleanup_early(dev_priv);
+
+	async_synchronize_full_domain(&dev_priv->async_domain);
+	async_unregister_domain(&dev_priv->async_domain);
+
 	kfree(dev_priv);
 
 	return 0;
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
index 4f6de54c14fa..5955cc869cf4 100644
--- a/drivers/gpu/drm/i915/i915_drv.c
+++ b/drivers/gpu/drm/i915/i915_drv.c
@@ -586,6 +586,9 @@ static int i915_drm_suspend(struct drm_device *dev)
 	pci_power_t opregion_target_state;
 	int error;
 
+	/* Flush all pending resume tasks */
+	async_synchronize_full_domain(&dev_priv->async_domain);
+
 	/* ignore lid events during suspend */
 	mutex_lock(&dev_priv->modeset_restore_lock);
 	dev_priv->modeset_restore = MODESET_SUSPENDED;
@@ -642,6 +645,8 @@ static int i915_drm_suspend(struct drm_device *dev)
 	intel_csr_ucode_suspend(dev_priv);
 
 out:
+	/* Flush all incomplete suspend tasks */
+	async_synchronize_full_domain(&dev_priv->async_domain);
 	enable_rpm_wakeref_asserts(dev_priv);
 
 	return error;
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 72f0b02a8372..7837b7f2f650 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -33,6 +33,7 @@
 #include <uapi/drm/i915_drm.h>
 #include <uapi/drm/drm_fourcc.h>
 
+#include <linux/async.h>
 #include <linux/io-mapping.h>
 #include <linux/i2c.h>
 #include <linux/i2c-algo-bit.h>
@@ -1732,6 +1733,9 @@ struct drm_i915_private {
 	struct kmem_cache *vmas;
 	struct kmem_cache *requests;
 
+	struct async_domain async_domain;
+	void *async_context;
+
 	const struct intel_device_info info;
 
 	int relative_constants_mode;
diff --git a/drivers/gpu/drm/i915/intel_fbdev.c b/drivers/gpu/drm/i915/intel_fbdev.c
index 649ea7764bc2..f22d25e96fa3 100644
--- a/drivers/gpu/drm/i915/intel_fbdev.c
+++ b/drivers/gpu/drm/i915/intel_fbdev.c
@@ -751,7 +751,9 @@ void intel_fbdev_initial_config_async(struct drm_device *dev)
 {
 	struct intel_fbdev *ifbdev = to_i915(dev)->fbdev;
 
-	ifbdev->cookie = async_schedule(intel_fbdev_initial_config, ifbdev);
+	ifbdev->cookie = async_schedule_domain(intel_fbdev_initial_config,
+					       ifbdev,
+					       &to_i915(dev)->async_domain);
 }
 
 void intel_fbdev_fini(struct drm_device *dev)
@@ -764,7 +766,8 @@ void intel_fbdev_fini(struct drm_device *dev)
 
 	flush_work(&dev_priv->fbdev_suspend_work);
 	if (ifbdev->cookie && !current_is_async())
-		async_synchronize_cookie(ifbdev->cookie);
+		async_synchronize_cookie_domain(ifbdev->cookie,
+						&dev_priv->async_domain);
 
 	intel_fbdev_destroy(ifbdev);
 	dev_priv->fbdev = NULL;
-- 
2.8.1



More information about the Intel-gfx-trybot mailing list