intel_dmc_init(display);
+ display->hotplug.dp_wq = alloc_ordered_workqueue("intel-dp", 0);
+ if (!display->hotplug.dp_wq) {
+ ret = -ENOMEM;
+ goto cleanup_vga_client_pw_domain_dmc;
+ }
+
display->wq.modeset = alloc_ordered_workqueue("i915_modeset", 0);
if (!display->wq.modeset) {
ret = -ENOMEM;
- goto cleanup_vga_client_pw_domain_dmc;
+ goto cleanup_wq_dp;
}
display->wq.flip = alloc_workqueue("i915_flip", WQ_HIGHPRI |
destroy_workqueue(display->wq.flip);
cleanup_wq_modeset:
destroy_workqueue(display->wq.modeset);
+cleanup_wq_dp:
+ destroy_workqueue(display->hotplug.dp_wq);
cleanup_vga_client_pw_domain_dmc:
intel_dmc_fini(display);
intel_power_domains_driver_remove(display);
intel_gmbus_teardown(display);
+ destroy_workqueue(display->hotplug.dp_wq);
destroy_workqueue(display->wq.flip);
destroy_workqueue(display->wq.modeset);
destroy_workqueue(display->wq.cleanup);
static int i915_workqueues_init(struct drm_i915_private *dev_priv)
{
- struct intel_display *display = dev_priv->display;
-
/*
* The i915 workqueue is primarily used for batched retirement of
* requests (and thus managing bo) once the task has been completed
if (dev_priv->wq == NULL)
goto out_err;
- display->hotplug.dp_wq = alloc_ordered_workqueue("i915-dp", 0);
- if (!display->hotplug.dp_wq)
- goto out_free_wq;
-
/*
* The unordered i915 workqueue should be used for all work
* scheduling that do not require running in order, which used
*/
dev_priv->unordered_wq = alloc_workqueue("i915-unordered", 0, 0);
if (dev_priv->unordered_wq == NULL)
- goto out_free_dp_wq;
+ goto out_free_wq;
return 0;
-out_free_dp_wq:
- destroy_workqueue(display->hotplug.dp_wq);
out_free_wq:
destroy_workqueue(dev_priv->wq);
out_err:
static void i915_workqueues_cleanup(struct drm_i915_private *dev_priv)
{
- struct intel_display *display = dev_priv->display;
-
destroy_workqueue(dev_priv->unordered_wq);
- destroy_workqueue(display->hotplug.dp_wq);
destroy_workqueue(dev_priv->wq);
}
xe->drm.driver_features &= ~(DRIVER_MODESET | DRIVER_ATOMIC);
}
-static void display_destroy(struct drm_device *dev, void *dummy)
-{
- struct xe_device *xe = to_xe_device(dev);
- struct intel_display *display = xe->display;
-
- destroy_workqueue(display->hotplug.dp_wq);
-}
-
/**
* xe_display_create - create display struct
* @xe: XE device instance
int xe_display_create(struct xe_device *xe)
{
/* TODO: Allocate display dynamically. */
- struct intel_display *display = &xe->__display;
-
xe->display = &xe->__display;
- display->hotplug.dp_wq = alloc_ordered_workqueue("xe-dp", 0);
- if (!display->hotplug.dp_wq)
- return -ENOMEM;
-
- return drmm_add_action_or_reset(&xe->drm, display_destroy, NULL);
+ return 0;
}
static void xe_display_fini_early(void *arg)