Skip to content

Commit 7c37790

Browse files
committed
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: Jani Nikula <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Luca Coelho <[email protected]>
1 parent 9807aba commit 7c37790

13 files changed

+47
-53
lines changed

drivers/gpu/drm/i915/display/intel_connector.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,10 +64,10 @@ static void intel_connector_modeset_retry_work_fn(struct work_struct *work)
6464

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

6969
drm_connector_get(&connector->base);
70-
if (!queue_work(i915->unordered_wq, &connector->modeset_retry_work))
70+
if (!queue_work(display->wq.unordered, &connector->modeset_retry_work))
7171
drm_connector_put(&connector->base);
7272
}
7373

drivers/gpu/drm/i915/display/intel_display_core.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -570,6 +570,9 @@ struct intel_display {
570570

571571
/* hipri wq for commit cleanups */
572572
struct workqueue_struct *cleanup;
573+
574+
/* unordered workqueue for all display unordered work */
575+
struct workqueue_struct *unordered;
573576
} wq;
574577

575578
/* Grouping using named structs. Keep sorted. */

drivers/gpu/drm/i915/display/intel_display_driver.c

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -236,8 +236,6 @@ int intel_display_driver_probe_noirq(struct intel_display *display)
236236
if (!HAS_DISPLAY(display))
237237
return 0;
238238

239-
intel_dmc_init(display);
240-
241239
display->hotplug.dp_wq = alloc_ordered_workqueue("intel-dp", 0);
242240
if (!display->hotplug.dp_wq) {
243241
ret = -ENOMEM;
@@ -263,34 +261,44 @@ int intel_display_driver_probe_noirq(struct intel_display *display)
263261
goto cleanup_wq_flip;
264262
}
265263

264+
display->wq.unordered = alloc_workqueue("display_unordered", 0, 0);
265+
if (!display->wq.unordered) {
266+
ret = -ENOMEM;
267+
goto cleanup_wq_cleanup;
268+
}
269+
270+
intel_dmc_init(display);
271+
266272
intel_mode_config_init(display);
267273

268274
ret = intel_cdclk_init(display);
269275
if (ret)
270-
goto cleanup_wq_cleanup;
276+
goto cleanup_wq_unordered;
271277

272278
ret = intel_color_init(display);
273279
if (ret)
274-
goto cleanup_wq_cleanup;
280+
goto cleanup_wq_unordered;
275281

276282
ret = intel_dbuf_init(display);
277283
if (ret)
278-
goto cleanup_wq_cleanup;
284+
goto cleanup_wq_unordered;
279285

280286
ret = intel_bw_init(display);
281287
if (ret)
282-
goto cleanup_wq_cleanup;
288+
goto cleanup_wq_unordered;
283289

284290
ret = intel_pmdemand_init(display);
285291
if (ret)
286-
goto cleanup_wq_cleanup;
292+
goto cleanup_wq_unordered;
287293

288294
intel_init_quirks(display);
289295

290296
intel_fbc_init(display);
291297

292298
return 0;
293299

300+
cleanup_wq_unordered:
301+
destroy_workqueue(display->wq.unordered);
294302
cleanup_wq_cleanup:
295303
destroy_workqueue(display->wq.cleanup);
296304
cleanup_wq_flip:
@@ -594,6 +602,7 @@ void intel_display_driver_remove(struct intel_display *display)
594602
flush_workqueue(display->wq.flip);
595603
flush_workqueue(display->wq.modeset);
596604
flush_workqueue(display->wq.cleanup);
605+
flush_workqueue(display->wq.unordered);
597606

598607
/*
599608
* 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)
606615
/* part #2: call after irq uninstall */
607616
void intel_display_driver_remove_noirq(struct intel_display *display)
608617
{
609-
struct drm_i915_private *i915 = to_i915(display->drm);
610-
611618
if (!HAS_DISPLAY(display))
612619
return;
613620

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

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

627634
intel_hdcp_component_fini(display);
628635

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

642650
intel_fbc_cleanup(display);
643651
}

drivers/gpu/drm/i915/display/intel_dmc.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1298,7 +1298,6 @@ static void dmc_load_work_fn(struct work_struct *work)
12981298
*/
12991299
void intel_dmc_init(struct intel_display *display)
13001300
{
1301-
struct drm_i915_private *i915 = to_i915(display->drm);
13021301
struct intel_dmc *dmc;
13031302

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

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

13461345
return;
13471346

drivers/gpu/drm/i915/display/intel_dmc_wl.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -155,12 +155,11 @@ static const struct intel_dmc_wl_range xe3lpd_dc3co_dmc_ranges[] = {
155155

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

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

163-
queue_delayed_work(i915->unordered_wq, &wl->work,
162+
queue_delayed_work(display->wq.unordered, &wl->work,
164163
msecs_to_jiffies(DMC_WAKELOCK_HOLD_TIME));
165164
}
166165

drivers/gpu/drm/i915/display/intel_drrs.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -123,9 +123,9 @@ static void intel_drrs_set_state(struct intel_crtc *crtc,
123123

124124
static void intel_drrs_schedule_work(struct intel_crtc *crtc)
125125
{
126-
struct drm_i915_private *i915 = to_i915(crtc->base.dev);
126+
struct intel_display *display = to_intel_display(crtc);
127127

128-
mod_delayed_work(i915->unordered_wq, &crtc->drrs.work, msecs_to_jiffies(1000));
128+
mod_delayed_work(display->wq.unordered, &crtc->drrs.work, msecs_to_jiffies(1000));
129129
}
130130

131131
static unsigned int intel_drrs_frontbuffer_bits(const struct intel_crtc_state *crtc_state)

drivers/gpu/drm/i915/display/intel_encoder.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,9 @@ void intel_encoder_link_check_flush_work(struct intel_encoder *encoder)
3232

3333
void intel_encoder_link_check_queue_work(struct intel_encoder *encoder, int delay_ms)
3434
{
35-
struct drm_i915_private *i915 = to_i915(encoder->base.dev);
35+
struct intel_display *display = to_i915(encoder->base.dev)->display;
3636

37-
mod_delayed_work(i915->unordered_wq,
37+
mod_delayed_work(display->wq.unordered,
3838
&encoder->link_check_work, msecs_to_jiffies(delay_ms));
3939
}
4040

drivers/gpu/drm/i915/display/intel_fbc.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2011,7 +2011,7 @@ void intel_fbc_reset_underrun(struct intel_display *display)
20112011

20122012
static void __intel_fbc_handle_fifo_underrun_irq(struct intel_fbc *fbc)
20132013
{
2014-
struct drm_i915_private *i915 = to_i915(fbc->display->drm);
2014+
struct intel_display *display = fbc->display;
20152015

20162016
/*
20172017
* There's no guarantee that underrun_detected won't be set to true
@@ -2024,7 +2024,7 @@ static void __intel_fbc_handle_fifo_underrun_irq(struct intel_fbc *fbc)
20242024
if (READ_ONCE(fbc->underrun_detected))
20252025
return;
20262026

2027-
queue_work(i915->unordered_wq, &fbc->underrun_work);
2027+
queue_work(display->wq.unordered, &fbc->underrun_work);
20282028
}
20292029

20302030
/**

drivers/gpu/drm/i915/display/intel_hdcp.c

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1088,7 +1088,6 @@ static void intel_hdcp_update_value(struct intel_connector *connector,
10881088
u64 value, bool update_property)
10891089
{
10901090
struct intel_display *display = to_intel_display(connector);
1091-
struct drm_i915_private *i915 = to_i915(display->drm);
10921091
struct intel_digital_port *dig_port = intel_attached_dig_port(connector);
10931092
struct intel_hdcp *hdcp = &connector->hdcp;
10941093

@@ -1109,7 +1108,7 @@ static void intel_hdcp_update_value(struct intel_connector *connector,
11091108
hdcp->value = value;
11101109
if (update_property) {
11111110
drm_connector_get(&connector->base);
1112-
if (!queue_work(i915->unordered_wq, &hdcp->prop_work))
1111+
if (!queue_work(display->wq.unordered, &hdcp->prop_work))
11131112
drm_connector_put(&connector->base);
11141113
}
11151114
}
@@ -2236,16 +2235,15 @@ static void intel_hdcp_check_work(struct work_struct *work)
22362235
check_work);
22372236
struct intel_connector *connector = intel_hdcp_to_connector(hdcp);
22382237
struct intel_display *display = to_intel_display(connector);
2239-
struct drm_i915_private *i915 = to_i915(display->drm);
22402238

22412239
if (drm_connector_is_unregistered(&connector->base))
22422240
return;
22432241

22442242
if (!intel_hdcp2_check_link(connector))
2245-
queue_delayed_work(i915->unordered_wq, &hdcp->check_work,
2243+
queue_delayed_work(display->wq.unordered, &hdcp->check_work,
22462244
DRM_HDCP2_CHECK_PERIOD_MS);
22472245
else if (!intel_hdcp_check_link(connector))
2248-
queue_delayed_work(i915->unordered_wq, &hdcp->check_work,
2246+
queue_delayed_work(display->wq.unordered, &hdcp->check_work,
22492247
DRM_HDCP_CHECK_PERIOD_MS);
22502248
}
22512249

@@ -2436,7 +2434,6 @@ static int _intel_hdcp_enable(struct intel_atomic_state *state,
24362434
const struct drm_connector_state *conn_state)
24372435
{
24382436
struct intel_display *display = to_intel_display(encoder);
2439-
struct drm_i915_private *i915 = to_i915(display->drm);
24402437
struct intel_connector *connector =
24412438
to_intel_connector(conn_state->connector);
24422439
struct intel_digital_port *dig_port = intel_attached_dig_port(connector);
@@ -2495,7 +2492,7 @@ static int _intel_hdcp_enable(struct intel_atomic_state *state,
24952492
}
24962493

24972494
if (!ret) {
2498-
queue_delayed_work(i915->unordered_wq, &hdcp->check_work,
2495+
queue_delayed_work(display->wq.unordered, &hdcp->check_work,
24992496
check_link_interval);
25002497
intel_hdcp_update_value(connector,
25012498
DRM_MODE_CONTENT_PROTECTION_ENABLED,
@@ -2566,7 +2563,7 @@ void intel_hdcp_update_pipe(struct intel_atomic_state *state,
25662563
to_intel_connector(conn_state->connector);
25672564
struct intel_hdcp *hdcp = &connector->hdcp;
25682565
bool content_protection_type_changed, desired_and_not_enabled = false;
2569-
struct drm_i915_private *i915 = to_i915(connector->base.dev);
2566+
struct intel_display *display = to_intel_display(connector);
25702567

25712568
if (!connector->hdcp.shim)
25722569
return;
@@ -2593,7 +2590,7 @@ void intel_hdcp_update_pipe(struct intel_atomic_state *state,
25932590
mutex_lock(&hdcp->mutex);
25942591
hdcp->value = DRM_MODE_CONTENT_PROTECTION_DESIRED;
25952592
drm_connector_get(&connector->base);
2596-
if (!queue_work(i915->unordered_wq, &hdcp->prop_work))
2593+
if (!queue_work(display->wq.unordered, &hdcp->prop_work))
25972594
drm_connector_put(&connector->base);
25982595
mutex_unlock(&hdcp->mutex);
25992596
}
@@ -2611,7 +2608,7 @@ void intel_hdcp_update_pipe(struct intel_atomic_state *state,
26112608
*/
26122609
if (!desired_and_not_enabled && !content_protection_type_changed) {
26132610
drm_connector_get(&connector->base);
2614-
if (!queue_work(i915->unordered_wq, &hdcp->prop_work))
2611+
if (!queue_work(display->wq.unordered, &hdcp->prop_work))
26152612
drm_connector_put(&connector->base);
26162613

26172614
}
@@ -2735,15 +2732,14 @@ void intel_hdcp_handle_cp_irq(struct intel_connector *connector)
27352732
{
27362733
struct intel_hdcp *hdcp = &connector->hdcp;
27372734
struct intel_display *display = to_intel_display(connector);
2738-
struct drm_i915_private *i915 = to_i915(display->drm);
27392735

27402736
if (!hdcp->shim)
27412737
return;
27422738

27432739
atomic_inc(&connector->hdcp.cp_irq_count);
27442740
wake_up_all(&connector->hdcp.cp_irq_queue);
27452741

2746-
queue_delayed_work(i915->unordered_wq, &hdcp->check_work, 0);
2742+
queue_delayed_work(display->wq.unordered, &hdcp->check_work, 0);
27472743
}
27482744

27492745
static void __intel_hdcp_info(struct seq_file *m, struct intel_connector *connector,

drivers/gpu/drm/i915/display/intel_hotplug.c

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -193,40 +193,34 @@ static bool detection_work_enabled(struct intel_display *display)
193193
static bool
194194
mod_delayed_detection_work(struct intel_display *display, struct delayed_work *work, int delay)
195195
{
196-
struct drm_i915_private *i915 = to_i915(display->drm);
197-
198196
lockdep_assert_held(&display->irq.lock);
199197

200198
if (!detection_work_enabled(display))
201199
return false;
202200

203-
return mod_delayed_work(i915->unordered_wq, work, delay);
201+
return mod_delayed_work(display->wq.unordered, work, delay);
204202
}
205203

206204
static bool
207205
queue_delayed_detection_work(struct intel_display *display, struct delayed_work *work, int delay)
208206
{
209-
struct drm_i915_private *i915 = to_i915(display->drm);
210-
211207
lockdep_assert_held(&display->irq.lock);
212208

213209
if (!detection_work_enabled(display))
214210
return false;
215211

216-
return queue_delayed_work(i915->unordered_wq, work, delay);
212+
return queue_delayed_work(display->wq.unordered, work, delay);
217213
}
218214

219215
static bool
220216
queue_detection_work(struct intel_display *display, struct work_struct *work)
221217
{
222-
struct drm_i915_private *i915 = to_i915(display->drm);
223-
224218
lockdep_assert_held(&display->irq.lock);
225219

226220
if (!detection_work_enabled(display))
227221
return false;
228222

229-
return queue_work(i915->unordered_wq, work);
223+
return queue_work(display->wq.unordered, work);
230224
}
231225

232226
static void

0 commit comments

Comments
 (0)