Skip to content

Commit a409b78

Browse files
lumagRob Clark
authored andcommitted
drm/msm: move wq handling to KMS code
The global workqueue is only used for vblanks inside KMS code. Move allocation / flushing / deallcation of it to msm_kms.c Signed-off-by: Dmitry Baryshkov <[email protected]> Patchwork: https://patchwork.freedesktop.org/patch/662573/ Signed-off-by: Rob Clark <[email protected]>
1 parent a452510 commit a409b78

File tree

7 files changed

+22
-26
lines changed

7 files changed

+22
-26
lines changed

drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -980,7 +980,7 @@ static int dpu_encoder_resource_control(struct drm_encoder *drm_enc,
980980
return 0;
981981
}
982982

983-
queue_delayed_work(priv->wq, &dpu_enc->delayed_off_work,
983+
queue_delayed_work(priv->kms->wq, &dpu_enc->delayed_off_work,
984984
msecs_to_jiffies(dpu_enc->idle_timeout));
985985

986986
trace_dpu_enc_rc(DRMID(drm_enc), sw_event,

drivers/gpu/drm/msm/disp/mdp4/mdp4_crtc.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -511,7 +511,7 @@ static void mdp4_crtc_vblank_irq(struct mdp_irq *irq, uint32_t irqstatus)
511511

512512
if (pending & PENDING_CURSOR) {
513513
update_cursor(crtc);
514-
drm_flip_work_commit(&mdp4_crtc->unref_cursor_work, priv->wq);
514+
drm_flip_work_commit(&mdp4_crtc->unref_cursor_work, priv->kms->wq);
515515
}
516516
}
517517

drivers/gpu/drm/msm/disp/mdp5/mdp5_crtc.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1196,7 +1196,7 @@ static void mdp5_crtc_vblank_irq(struct mdp_irq *irq, uint32_t irqstatus)
11961196
}
11971197

11981198
if (pending & PENDING_CURSOR)
1199-
drm_flip_work_commit(&mdp5_crtc->unref_cursor_work, priv->wq);
1199+
drm_flip_work_commit(&mdp5_crtc->unref_cursor_work, priv->kms->wq);
12001200
}
12011201

12021202
static void mdp5_crtc_err_irq(struct mdp_irq *irq, uint32_t irqstatus)

drivers/gpu/drm/msm/msm_drv.c

Lines changed: 2 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -77,13 +77,6 @@ static int msm_drm_uninit(struct device *dev)
7777
drm_atomic_helper_shutdown(ddev);
7878
}
7979

80-
/* We must cancel and cleanup any pending vblank enable/disable
81-
* work before msm_irq_uninstall() to avoid work re-enabling an
82-
* irq after uninstall has disabled it.
83-
*/
84-
85-
flush_workqueue(priv->wq);
86-
8780
msm_gem_shrinker_cleanup(ddev);
8881

8982
msm_perf_debugfs_cleanup(priv);
@@ -97,8 +90,6 @@ static int msm_drm_uninit(struct device *dev)
9790
ddev->dev_private = NULL;
9891
drm_dev_put(ddev);
9992

100-
destroy_workqueue(priv->wq);
101-
10293
return 0;
10394
}
10495

@@ -119,12 +110,6 @@ static int msm_drm_init(struct device *dev, const struct drm_driver *drv)
119110
ddev->dev_private = priv;
120111
priv->dev = ddev;
121112

122-
priv->wq = alloc_ordered_workqueue("msm", 0);
123-
if (!priv->wq) {
124-
ret = -ENOMEM;
125-
goto err_put_dev;
126-
}
127-
128113
INIT_LIST_HEAD(&priv->objects);
129114
mutex_init(&priv->obj_lock);
130115

@@ -149,15 +134,15 @@ static int msm_drm_init(struct device *dev, const struct drm_driver *drv)
149134
if (priv->kms_init) {
150135
ret = drmm_mode_config_init(ddev);
151136
if (ret)
152-
goto err_destroy_wq;
137+
goto err_put_dev;
153138
}
154139

155140
dma_set_max_seg_size(dev, UINT_MAX);
156141

157142
/* Bind all our sub-components: */
158143
ret = component_bind_all(dev, ddev);
159144
if (ret)
160-
goto err_destroy_wq;
145+
goto err_put_dev;
161146

162147
ret = msm_gem_shrinker_init(ddev);
163148
if (ret)
@@ -194,8 +179,6 @@ static int msm_drm_init(struct device *dev, const struct drm_driver *drv)
194179

195180
return ret;
196181

197-
err_destroy_wq:
198-
destroy_workqueue(priv->wq);
199182
err_put_dev:
200183
drm_dev_put(ddev);
201184

drivers/gpu/drm/msm/msm_drv.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -175,8 +175,6 @@ struct msm_drm_private {
175175
struct mutex lock;
176176
} lru;
177177

178-
struct workqueue_struct *wq;
179-
180178
unsigned int num_crtcs;
181179

182180
struct msm_drm_thread event_thread[MAX_CRTCS];

drivers/gpu/drm/msm/msm_kms.c

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ static int vblank_ctrl_queue_work(struct msm_drm_private *priv,
137137
vbl_work->enable = enable;
138138
vbl_work->priv = priv;
139139

140-
queue_work(priv->wq, &vbl_work->work);
140+
queue_work(priv->kms->wq, &vbl_work->work);
141141

142142
return 0;
143143
}
@@ -227,6 +227,13 @@ void msm_drm_kms_uninit(struct device *dev)
227227

228228
BUG_ON(!kms);
229229

230+
/* We must cancel and cleanup any pending vblank enable/disable
231+
* work before msm_irq_uninstall() to avoid work re-enabling an
232+
* irq after uninstall has disabled it.
233+
*/
234+
235+
flush_workqueue(kms->wq);
236+
230237
/* clean up event worker threads */
231238
for (i = 0; i < priv->num_crtcs; i++) {
232239
if (priv->event_thread[i].worker)
@@ -261,7 +268,7 @@ int msm_drm_kms_init(struct device *dev, const struct drm_driver *drv)
261268
ret = priv->kms_init(ddev);
262269
if (ret) {
263270
DRM_DEV_ERROR(dev, "failed to load kms\n");
264-
return ret;
271+
goto err_msm_uninit;
265272
}
266273

267274
/* Enable normalization of plane zpos */

drivers/gpu/drm/msm/msm_kms.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,8 @@ struct msm_kms {
153153
struct mutex commit_lock[MAX_CRTCS];
154154
unsigned pending_crtc_mask;
155155
struct msm_pending_timer pending_timers[MAX_CRTCS];
156+
157+
struct workqueue_struct *wq;
156158
};
157159

158160
static inline int msm_kms_init(struct msm_kms *kms,
@@ -165,6 +167,10 @@ static inline int msm_kms_init(struct msm_kms *kms,
165167

166168
kms->funcs = funcs;
167169

170+
kms->wq = alloc_ordered_workqueue("msm", 0);
171+
if (!kms->wq)
172+
return -ENOMEM;
173+
168174
for (i = 0; i < ARRAY_SIZE(kms->pending_timers); i++) {
169175
ret = msm_atomic_init_pending_timer(&kms->pending_timers[i], kms, i);
170176
if (ret) {
@@ -181,6 +187,8 @@ static inline void msm_kms_destroy(struct msm_kms *kms)
181187

182188
for (i = 0; i < ARRAY_SIZE(kms->pending_timers); i++)
183189
msm_atomic_destroy_pending_timer(&kms->pending_timers[i]);
190+
191+
destroy_workqueue(kms->wq);
184192
}
185193

186194
#define for_each_crtc_mask(dev, crtc, crtc_mask) \

0 commit comments

Comments
 (0)