Commit 7c377900 authored by Luca Coelho's avatar Luca Coelho
Browse files

drm/i915/display: move unordered works to new private workqueue



Create a new unordered workqueue to be used by the display code
instead of relying on the i915 one.  Then move all the unordered works
used in the display code to use this new queue.

Since this is an unordered workqueue, by definition there can't be any
order dependency with non-display works, so no extra care is needed
in regard to that.

This is part of the effort to isolate the display code from i915.

Reviewed-by: default avatarJani Nikula <jani.nikula@intel.com>
Link: https://lore.kernel.org/r/20250620091632.1256135-1-luciano.coelho@intel.com


Signed-off-by: default avatarLuca Coelho <luciano.coelho@intel.com>
parent 9807aba1
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -64,10 +64,10 @@ static void intel_connector_modeset_retry_work_fn(struct work_struct *work)

void intel_connector_queue_modeset_retry_work(struct intel_connector *connector)
{
	struct drm_i915_private *i915 = to_i915(connector->base.dev);
	struct intel_display *display = to_intel_display(connector);

	drm_connector_get(&connector->base);
	if (!queue_work(i915->unordered_wq, &connector->modeset_retry_work))
	if (!queue_work(display->wq.unordered, &connector->modeset_retry_work))
		drm_connector_put(&connector->base);
}

+3 −0
Original line number Diff line number Diff line
@@ -570,6 +570,9 @@ struct intel_display {

		/* hipri wq for commit cleanups */
		struct workqueue_struct *cleanup;

		/* unordered workqueue for all display unordered work */
		struct workqueue_struct *unordered;
	} wq;

	/* Grouping using named structs. Keep sorted. */
+18 −10
Original line number Diff line number Diff line
@@ -236,8 +236,6 @@ int intel_display_driver_probe_noirq(struct intel_display *display)
	if (!HAS_DISPLAY(display))
		return 0;

	intel_dmc_init(display);

	display->hotplug.dp_wq = alloc_ordered_workqueue("intel-dp", 0);
	if (!display->hotplug.dp_wq) {
		ret = -ENOMEM;
@@ -263,27 +261,35 @@ int intel_display_driver_probe_noirq(struct intel_display *display)
		goto cleanup_wq_flip;
	}

	display->wq.unordered = alloc_workqueue("display_unordered", 0, 0);
	if (!display->wq.unordered) {
		ret = -ENOMEM;
		goto cleanup_wq_cleanup;
	}

	intel_dmc_init(display);

	intel_mode_config_init(display);

	ret = intel_cdclk_init(display);
	if (ret)
		goto cleanup_wq_cleanup;
		goto cleanup_wq_unordered;

	ret = intel_color_init(display);
	if (ret)
		goto cleanup_wq_cleanup;
		goto cleanup_wq_unordered;

	ret = intel_dbuf_init(display);
	if (ret)
		goto cleanup_wq_cleanup;
		goto cleanup_wq_unordered;

	ret = intel_bw_init(display);
	if (ret)
		goto cleanup_wq_cleanup;
		goto cleanup_wq_unordered;

	ret = intel_pmdemand_init(display);
	if (ret)
		goto cleanup_wq_cleanup;
		goto cleanup_wq_unordered;

	intel_init_quirks(display);

@@ -291,6 +297,8 @@ int intel_display_driver_probe_noirq(struct intel_display *display)

	return 0;

cleanup_wq_unordered:
	destroy_workqueue(display->wq.unordered);
cleanup_wq_cleanup:
	destroy_workqueue(display->wq.cleanup);
cleanup_wq_flip:
@@ -594,6 +602,7 @@ void intel_display_driver_remove(struct intel_display *display)
	flush_workqueue(display->wq.flip);
	flush_workqueue(display->wq.modeset);
	flush_workqueue(display->wq.cleanup);
	flush_workqueue(display->wq.unordered);

	/*
	 * MST topology needs to be suspended so we don't have any calls to
@@ -606,8 +615,6 @@ void intel_display_driver_remove(struct intel_display *display)
/* part #2: call after irq uninstall */
void intel_display_driver_remove_noirq(struct intel_display *display)
{
	struct drm_i915_private *i915 = to_i915(display->drm);

	if (!HAS_DISPLAY(display))
		return;

@@ -622,7 +629,7 @@ void intel_display_driver_remove_noirq(struct intel_display *display)
	intel_unregister_dsm_handler();

	/* flush any delayed tasks or pending work */
	flush_workqueue(i915->unordered_wq);
	flush_workqueue(display->wq.unordered);

	intel_hdcp_component_fini(display);

@@ -638,6 +645,7 @@ void intel_display_driver_remove_noirq(struct intel_display *display)
	destroy_workqueue(display->wq.flip);
	destroy_workqueue(display->wq.modeset);
	destroy_workqueue(display->wq.cleanup);
	destroy_workqueue(display->wq.unordered);

	intel_fbc_cleanup(display);
}
+1 −2
Original line number Diff line number Diff line
@@ -1298,7 +1298,6 @@ static void dmc_load_work_fn(struct work_struct *work)
 */
void intel_dmc_init(struct intel_display *display)
{
	struct drm_i915_private *i915 = to_i915(display->drm);
	struct intel_dmc *dmc;

	if (!HAS_DMC(display))
@@ -1341,7 +1340,7 @@ void intel_dmc_init(struct intel_display *display)
	display->dmc.dmc = dmc;

	drm_dbg_kms(display->drm, "Loading %s\n", dmc->fw_path);
	queue_work(i915->unordered_wq, &dmc->work);
	queue_work(display->wq.unordered, &dmc->work);

	return;

+1 −2
Original line number Diff line number Diff line
@@ -155,12 +155,11 @@ static const struct intel_dmc_wl_range xe3lpd_dc3co_dmc_ranges[] = {

static void __intel_dmc_wl_release(struct intel_display *display)
{
	struct drm_i915_private *i915 = to_i915(display->drm);
	struct intel_dmc_wl *wl = &display->wl;

	WARN_ON(refcount_read(&wl->refcount));

	queue_delayed_work(i915->unordered_wq, &wl->work,
	queue_delayed_work(display->wq.unordered, &wl->work,
			   msecs_to_jiffies(DMC_WAKELOCK_HOLD_TIME));
}

Loading