summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>2019-02-21 05:17:32 -0500
committerLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>2019-03-18 11:24:30 -0400
commit97eb9eaeb95ba8eb3c7a77a7ec7786d47a1bcaee (patch)
tree23475d0d548703ad3e775ef57e64a8bd48a5b666
parenta63722aeb76c65f39c98c66a1e730a2f3da123ab (diff)
drm: writeback: Cleanup job ownership handling when queuing job
The drm_writeback_queue_job() function takes ownership of the passed job and requires the caller to manually set the connector state writeback_job pointer to NULL. To simplify drivers and avoid errors (such as the missing NULL set in the vc4 driver), pass the connector state pointer to the function instead of the job pointer, and set the writeback_job pointer to NULL internally. Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com> Reviewed-by: Brian Starkey <brian.starkey@arm.com> Acked-by: Eric Anholt <eric@anholt.net> Acked-by: Liviu Dudau <liviu.dudau@arm.com> Reviewed-by: Kieran Bingham <kieran.bingham+renesas@ideasonboard.com>
-rw-r--r--drivers/gpu/drm/arm/malidp_mw.c3
-rw-r--r--drivers/gpu/drm/drm_writeback.c15
-rw-r--r--drivers/gpu/drm/vc4/vc4_txp.c2
-rw-r--r--include/drm/drm_writeback.h2
4 files changed, 13 insertions, 9 deletions
diff --git a/drivers/gpu/drm/arm/malidp_mw.c b/drivers/gpu/drm/arm/malidp_mw.c
index 041a64dc7167..87627219ce3b 100644
--- a/drivers/gpu/drm/arm/malidp_mw.c
+++ b/drivers/gpu/drm/arm/malidp_mw.c
@@ -252,8 +252,7 @@ void malidp_mw_atomic_commit(struct drm_device *drm,
252 &mw_state->addrs[0], 252 &mw_state->addrs[0],
253 mw_state->format); 253 mw_state->format);
254 254
255 drm_writeback_queue_job(mw_conn, conn_state->writeback_job); 255 drm_writeback_queue_job(mw_conn, conn_state);
256 conn_state->writeback_job = NULL;
257 hwdev->hw->enable_memwrite(hwdev, mw_state->addrs, 256 hwdev->hw->enable_memwrite(hwdev, mw_state->addrs,
258 mw_state->pitches, mw_state->n_planes, 257 mw_state->pitches, mw_state->n_planes,
259 fb->width, fb->height, mw_state->format, 258 fb->width, fb->height, mw_state->format,
diff --git a/drivers/gpu/drm/drm_writeback.c b/drivers/gpu/drm/drm_writeback.c
index c20e6fe00cb3..338b993d7c9f 100644
--- a/drivers/gpu/drm/drm_writeback.c
+++ b/drivers/gpu/drm/drm_writeback.c
@@ -242,11 +242,12 @@ EXPORT_SYMBOL(drm_writeback_connector_init);
242/** 242/**
243 * drm_writeback_queue_job - Queue a writeback job for later signalling 243 * drm_writeback_queue_job - Queue a writeback job for later signalling
244 * @wb_connector: The writeback connector to queue a job on 244 * @wb_connector: The writeback connector to queue a job on
245 * @job: The job to queue 245 * @conn_state: The connector state containing the job to queue
246 * 246 *
247 * This function adds a job to the job_queue for a writeback connector. It 247 * This function adds the job contained in @conn_state to the job_queue for a
248 * should be considered to take ownership of the writeback job, and so any other 248 * writeback connector. It takes ownership of the writeback job and sets the
249 * references to the job must be cleared after calling this function. 249 * @conn_state->writeback_job to NULL, and so no access to the job may be
250 * performed by the caller after this function returns.
250 * 251 *
251 * Drivers must ensure that for a given writeback connector, jobs are queued in 252 * Drivers must ensure that for a given writeback connector, jobs are queued in
252 * exactly the same order as they will be completed by the hardware (and 253 * exactly the same order as they will be completed by the hardware (and
@@ -258,10 +259,14 @@ EXPORT_SYMBOL(drm_writeback_connector_init);
258 * See also: drm_writeback_signal_completion() 259 * See also: drm_writeback_signal_completion()
259 */ 260 */
260void drm_writeback_queue_job(struct drm_writeback_connector *wb_connector, 261void drm_writeback_queue_job(struct drm_writeback_connector *wb_connector,
261 struct drm_writeback_job *job) 262 struct drm_connector_state *conn_state)
262{ 263{
264 struct drm_writeback_job *job;
263 unsigned long flags; 265 unsigned long flags;
264 266
267 job = conn_state->writeback_job;
268 conn_state->writeback_job = NULL;
269
265 spin_lock_irqsave(&wb_connector->job_lock, flags); 270 spin_lock_irqsave(&wb_connector->job_lock, flags);
266 list_add_tail(&job->list_entry, &wb_connector->job_queue); 271 list_add_tail(&job->list_entry, &wb_connector->job_queue);
267 spin_unlock_irqrestore(&wb_connector->job_lock, flags); 272 spin_unlock_irqrestore(&wb_connector->job_lock, flags);
diff --git a/drivers/gpu/drm/vc4/vc4_txp.c b/drivers/gpu/drm/vc4/vc4_txp.c
index aa279b5b0de7..5dabd91f2d7e 100644
--- a/drivers/gpu/drm/vc4/vc4_txp.c
+++ b/drivers/gpu/drm/vc4/vc4_txp.c
@@ -327,7 +327,7 @@ static void vc4_txp_connector_atomic_commit(struct drm_connector *conn,
327 327
328 TXP_WRITE(TXP_DST_CTRL, ctrl); 328 TXP_WRITE(TXP_DST_CTRL, ctrl);
329 329
330 drm_writeback_queue_job(&txp->connector, conn_state->writeback_job); 330 drm_writeback_queue_job(&txp->connector, conn_state);
331} 331}
332 332
333static const struct drm_connector_helper_funcs vc4_txp_connector_helper_funcs = { 333static const struct drm_connector_helper_funcs vc4_txp_connector_helper_funcs = {
diff --git a/include/drm/drm_writeback.h b/include/drm/drm_writeback.h
index 23df9d463003..47662c362743 100644
--- a/include/drm/drm_writeback.h
+++ b/include/drm/drm_writeback.h
@@ -123,7 +123,7 @@ int drm_writeback_connector_init(struct drm_device *dev,
123 const u32 *formats, int n_formats); 123 const u32 *formats, int n_formats);
124 124
125void drm_writeback_queue_job(struct drm_writeback_connector *wb_connector, 125void drm_writeback_queue_job(struct drm_writeback_connector *wb_connector,
126 struct drm_writeback_job *job); 126 struct drm_connector_state *conn_state);
127 127
128void drm_writeback_cleanup_job(struct drm_writeback_job *job); 128void drm_writeback_cleanup_job(struct drm_writeback_job *job);
129 129